PAM的原理与应用
一、PAM简介
PAM(Pluggable Authentication Modules,可插拔认证模块)是一种高效而且灵活便利的用户级别的认证方式。起初它是由美国Sun公司为Solaris操作系统开发的,后来,很多操作系统都实现了对它的支持,它是当前Linux服务器普遍使用的认证方式。
1.1 PAM的必要性
我们知道,Linux系统中的身份认证方式是多种多样的。一般来说,可以分为服务程序身份认证和专门系统身份认证。其中,服务程序身份认证包括:login服务程序、ftp服务程序,telnet服务程序、ssh服务程序等;专门系统身份认证包括:传统UNIX认证、NIS认证、NIS+认证、Kerberos认证等。
如此众多的身份认证方式存在于同一个系统当中,将难免带来众多的问题,我们可以将其划分为管理问题和安全问题。管理问题是指:我们需要能够保证众多的身份认证方式不能冲突,并且可以很好的协同工作。此外,由于不同的系统认证方式采用不同的算法和机制,并且每个系统认证方式还可能包含多个版本(如Kerberos4.5,Kerberos5等)。假如由于某种原因我们需要更换系统认证方式,那么我们需要如何做呢?传统方式当然是,卸载然后重新安装,甚至需要修改源程序代码重新编译。安全问题是指:比如一台服务器开着FTP、SMTP、SSH等服务,那么新建一个用户默认就享有对以上的服务的操作权限,那么如果一个用户的帐号密码泄露会涉及到多个服务。这将是我们不希望看到的。
如何对上述问题进行改进,将是势在必行的。在这种背景下,PAM认证方式应运而生并很好地解决了上述的问题。
1.2 揭开PAM的神秘面纱
PAM最大的特点是实现了服务程序和认证机制的分离,它采用模块化设计和插件功能,使得我们可以轻易地在应用程序中插入新的鉴别模块或替换原先的组件,而不必对应用程序做任何修改,从而使软件的定制、维持和升级更加轻松--因为鉴别机制与应用程序之间相对独立。
应用程序可以通过 PAM API 方便的使用 PAM 提供的各种鉴别功能,而不必了解太多的底层细节;PAM服务模块的开发者还可以通过PAM提供的SPI来编写认证模块。此外,PAM的易用性也较强,主要表现在它对上层屏蔽了认证的具体细节,所以用户不必被迫学习各种各样的认证方式,也不必记住多个口令;又由于它实现了多鉴别机制的集成管理,所以单个程序可以非常容易地使用多种鉴别机制如Kerberos认证和NIS认证机制等,但用户仍可以用同一个口令登录。在这个过程中用户根本感觉不到系统采取了何种认证方法。
其基本思想如下图所示:
图1-1:PAM基本思想
PAM系统正像上图所描述的那样,将不同的认证方式统一地管理起来。并且各种认证方式可以方便地“插拔”到PAM系统中。
注意:如无特殊说明,本文所介绍的PAM均为基于Ubuntu10.04环境下的PAM机制介绍。
二、PAM工作原理
2.1 PAM工作原理
PAM系统在文件上,主要包括PAM核心库文件、PAM配置文件和PAM服务模块。其中,PAM核心库文件位于“/usr/lib/libpam.so”;PAM配置文件包括“/etc/pam.conf”和“/etc/pam.d/*”;PAM服务模块(PAM Service Module)包括“/usr/lib/security/pam_*.so”。
那么PAM系统的组成文档与图1-1所描述的PAM基本思想有什么样的关系呢?其核心机制如下图2-1所示:
图2-1:PAM运行机制
从图中可以看出, PAM系统主要提供四种主要的工作方式。它们分别为:
1)系统管理员通过PAM配置文件来指定认证策略,即指定什么服务该采用何种认证方法;
2)应用程序开发者通过在服务程序中使用PAM API来实现对认证方式的调用;
3)PAM服务模块开发者利用PAM SPI来编写认证模块,将不同的认证机制加入到系统当中。实际上,NIS、Kerberos等系统所提供的认证方式就是这种情况;
4)PAM核心库(libpam)读取配置文件,以此为根据江服务程序和相应的认证方法联系起来。
概括地说,PAM认证一般遵循这样的顺序:服务→PAM配置文件→PAM服务模块。PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(/etc/pam.conf或/etc/pam.d/[service]),最后调用PAM服务模块(/lib/security/pam_*.so)进行安全认证。这期间,可能需要用户来参与其中的某一个或某些过程,例如输入密码、配置信息等。
2.2 PAM的配置
对PAM的配置,需要借助于PAM的配置文档。PAM的配置指的是,用户通过对PAM配置文档的修改使得PAM实现某种认证机制。PAM的配置文档包括“/etc/pam.conf”和“/etc/pam.d/”下的一组文件。PAM的配置包括两种方式,一种是对“pam.conf”文件的修改,另一种是对“/etc/pam.d/”目录下对应文件的修改。下面将分别对其配置方式进行分别介绍。
q “pam.conf”配置详解
这种配置方式的语法如下所示:
service-name module-type control-flag module-path arguments
pam.conf文件中每一行的格式如上所示,一条这样的行规定的是某一个或一类的认证方式。pam.conf正是由此种格式的行所组成的认证方式的集合。
1)service-name(服务名称)指的是所要设定的认证方式所对应的服务名称,例如telnet、ftp、login等。其中服务名称“OTHER”代表所有没有在该配置文件中明确设置的其它服务。
2)module-type(模块类型)所提供的模块类型有四种:auth、account、session和password,即对应PAM所支持的四种管理方式,认证管理、账户管理、会话管理和密码管理。同一个服务(service-name)可以调用多个PAM模块进行认证,这些模块构成一个堆栈。
3)control-flag(控制标记)可以支持四种控制标记,分别为:requisite、required、sufficient和optional。控制标记用来告诉PAM库该如何处理与该服务相关的认证成功或失败情况。
required 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败结果也不会立即通知用户,而是要等到同一堆栈中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必要条件。
requisite 与required类似,该模块必须返回成功才能通过认证。二者不同之处在于,一旦该模块返回失败,将不再执行同一stack内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件。
sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一堆栈内的其它模块,但是如果本模块返回失败的话可以忽略。可以认为是一个充分条件。
optional表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用。它的执行结果不影响其他命令的执行,也不影响PAM报告的结果,其返回值一般被忽略。
4)module-path(模块路径)代表PAM验证模块的路径。如果以“/”开头,就表示是完整的路径;如果不是以“/”打头,就表示是相对于“/usr/lib/security”的相对路径。
5)arguments(参数)表示传递给模块的参数,此部分为可选项,如果不需要传递任何参数则可以忽略此项。其中参数的可选格式如下表2-1所示:
表2-1:arguments可选参数
可选参数值 | 说明 |
debug | 通过syslog系统调用记录调试信息 |
no_warn | 表明该模块不把警告信息发送给应用程序。 |
use_first_pass | 使模块不提示用户输入密码,而是使用为前一个验证模块输入的密码。如果无效,则验证失败。这个参数只能用于auth和password类型模块。 |
try_first_pass | 首先使用用户为上一个模块输入的密码进行验证,如果不行,就提示用户输入密码,这个参数只能用于auth类型的模块。 |
use_mapped_pass | 该模块不能提示用户输入密码,而是使用映射过的密码。这个参数目前还不能被任何Linux-PAM模块支持,主要因为美国加密算法的出口限制。 |
expose_account | 通常,对于模块来说泄露用户的某些信息并非一个安全的策略。有时候用户名、起始目录或者用户使用的shell等信息都可以被攻击者用来攻击一个用户帐户。这个参数是一个适用于每个模块的标准参数,它可以使模块尽量少地泄露用户信息。 |
了解完语法之后,下面我们来看一个例子。假如我们想要对ssh的进行认证管理,那么我们需要对服务对应的“module-type”设置为“auth”。如下代码清单2-1所示:
代码清单2-1:ssh认证配置
sshd auth required /lib/security/pam_env.so
sshd auth sufficient /lib/security/pam_unix.so likeauth nullok
sshd auth required /lib/security/pam_deny.so
从第一列和第二列可以看出此配置针对的是ssh的认证服务。第一行表示,设置环境变量,此项是必须的,也就是说必须设置成功才表明此认证成功。第二行表示提供标准的UNIX认证,如果认证失败,则忽略此项,继续执行堆栈内的下一条认证;如果成功,则认证结束。第三行表示,加入上述认证失败,则拒绝进入系统,返回认证失败标识。
q “pam.d/*”配置详解
首先我们先来看一下pam.d目录下包含哪些文件,如图2-2所示:
图2-2:“pam.d”目录下文件
此种配置方法与上一中基本类似,其语法为:
module-type control-flag module-path arguments
与上一中配置方法的语法相比,此种配置方法语法缺少了“service-name”部分,那么如何为某种服务指定其配置方法呢?从图2-2中可以看出,此种配置方法的服务名称即为每个文件的名称,加入需要为“login”服务设置认证方式,那么只需要在此目录下创建“login”文件,并对其进行设置即可。词语法中的各个字段配置方法与“pam.conf”完全相同。需要注意的是,此种配置方法的优先级要比上一中配置方法的优先级要高。比如,在“pam.d”目录下配置了“login”服务,那么它将覆盖掉“pam.conf”中对“login”服务的设置。
2.3 PAM服务模块详解
我们已经知道,PAM认证的最后一步需要调用PAM服务模块(PAM service module)进行实际的认证。首先,我们来看一下PAM中包含哪些常用的模块,以及他们的作用是如何的,见表2-2所示:
表2-2:PAM服务模块
模块名称 | 所属类型 | 模块功能描述 | 相关配置文件 |
pam_access | Account | 提供logdaemon风格的登录控制 | /etc/security/access.conf |
pam_chroot | account,session,auth | 提供类似chroot命令的功能 |
|
pam_cracklib | Password | 对密码的强度进行一定的检查 | 库文件libcrack和字典文件/usr/lib/cracklib_dict |
pam_deny | account,session,auth | 总是无条件地使认证失败 |
|
pam_env | Auth | 设置或取消环境变量 | /etc/security/pam_env.conf |
pam_filter | account,session,auth,password | 对输入输出流进行过滤filters |
|
pam_ftp | Auth | 对匿名ftp用户进行认证 |
|
pam_group | Auth | 当用户在指定的终端上请求指定的服务时赋予该用户相应的组权限 | /etc/security/group.conf |
pam_issue | Auth | 在提示用户输入用户名之前显示/etc/issue | /etc/issue文件的内容 |
pam_krb4 | Auth | 对用户密码进行Kerberos认证 | 相应的Kerberos库文件 |
pam_lastlog | Auth | 在用户登录成功后显示关于用户上次登录的信息,并维护/var/log/lastlog文件。 | /var/log/lastlog |
pam_limits | Session | 限制用户会话所能使用的系统资源 | /etc/security/limits.conf |
pam_listfile | Auth | 根据指定的某个文件决定是否允许或禁止提供服务 | 例如/etc/ftpusers |
pam_mail | Auth,session | 检查用户的邮箱中是否有新邮件 | /var/spool/mail/xxxx |
pam_mkhomedir | Session | 为用户建立主目录 | /etc/skel/ |
pam_moud | Session | 显示/etc/motd文件的内容 | /etc/motd |
pam_nologin | Auth | 根据/etc/nologin文件的存在与否来决定用户认证是否成功 | /etc/nologin |
pam_permit | Account,auth,password,session | 总是无条件地使认证成功 |
|
pam_pwdb | Account,auth,password,session | 作为pam_unix_xxxx模块的一个替代使用Password Database通用接口进行认证。 | /etc/pwdb.conf |
pam_rhosts_auth | Auth | 利用文件~/.rhosts和 /etc/hosts.equiv和~/.rhosts/etc/hosts.equiv对用户进行认证。 |
|
pam_rootok | Auth | 检查用户是否为超级用户,如果是超级用户则无条件地通过认证。 |
|
pam_securetty | Auth | 提供标准的Unix securetty检查 /etc/securetty |
|
pam_time | Account | 提供基于时间的控制,比如限制用户只能在某个时间段内才能登录 | /etc/security/time.conf |
pam_unix | Auth | 提供标准的Unix认证 | /etc/passwd和 /etc/shadow |
pam_userdb | Auth | 利用Berkeley DB数据库来检查Berkeley DB用户/密码 |
|
pam_warn | Auth,password | 利用syslog( )记录一条告警信息 |
|
pam_wheel | Auth | 只允许wheel组的用户有超级用户的存取权限 |
|
2.4.1 PAM分层体系结构
从图2-1中可以看出,PAM可以为上层应用程序提供相应的API函数供应用程序使用。这种机制就使得PAM API的作用如同桥梁一样把PAM底层与上层应用程序隔离开来。并且屏蔽了PAM的低层实现细节,让上层用户使用起来感觉是透明的。这种方式大大方便了用户的使用。其作用如下图2-3所示:
图2-3:PAM分层体系结构
当应用程序调用PAM API时,PAM按照配置文档的设置,加载相应的服务模块;然后把请求(从应用程序传递过来的参数)传递给相应的服务模块,这时服务模块根据相应的参数执行对应的操作;当认证过程完成之后,服务模块将结果返回给PAM,然后PAM根据具体的配置判断返回的结果,并进一步将最终结果返回给应用程序。
在这种情况下,PAM的具体认证过程如下图2-4所示:
图2-4:PAM工作流程
如上图所示为PAM的工作流程,其中:
1)调用某个应用程序,以得到该程序的服务;
2)PAM应用程序调用后台的PAM库进行认证工作;
3)PAM库在配置文档中查找有关应用程序细节的配置文件,该文件告诉PAM应用程序使用何种认证机制;
4)PAM库装载所需的认证模块;
5)这些模块可以让PAM与应用程序中的会话函数进行通信;
6)会话函数向用户要求有关信息;
7)用户对这些要求做出回应,提供所需信息;
8)PAM认证模块通过PAM库将认证信息提供给应用程序;
9)认证完成后,应用程序做出两种选择:将所需权限赋予用户,并通知用户;认证失败,并通知用户。
PAM支持四种管理方式,据此我们将PAM的API分为下述几类:框架API、认证管理API、账户管理API、密码管理API、会话管理API、其它。下面我们将分别对其进行介绍:
1、框架API:
任何一个支持PAM的服务程序在进行认证时必须以pam_start( )开始进行初始化,最后以pam_end( )结束以便进行清理工作。
2、认证管理API:
通过pam_authenticate( )对用户名/密码进行认证;
通过pam_setcred( )用来修改用户的秘密信息。
3、帐户管理API:
通过pam_acct_mgmt( )来检查帐户本身是否有权限登录系统、帐户是否过期、帐户是否有登录时间限制等。
4、密码管理API:
通过pam_chauthtok( )来修改用户的密码。
5、会话管理API:
一个会话以pam_open_session( )开始,最后以pam_close_session( )结束。
6、其它:
通过pam_get_item( )、pam_set_item( )来读写PAM事务(transaction)的状态信息;
通过pam_get_data( )、pam_set_data( )来取得和设置PAM模块及会话的相关信息;
通过pam_putenv( )、pam_getenv( )、pam_getenvlist()来读写环境变量;
通过pam_strerror( )返回相关的错误信息。
当服务程序调用PAM API函数pam_xxx( )时,由PAM框架根据该服务在配置文档中的配置调用指定的PAM服务模块中对应的SPI函数pam_sm_xxx()。
例如,若API函数的名字为pam_xxx( ),那么对应的SPI函数的名字为pam_sm_xxx( ),即每个服务模块需要引出相应的函数以供libpam调用。下面为常用SPI与API的对照:
帐号管理:pam_acct_mgmt( ) ;pam_sm_acct_mgmt( )
认证管理:pam_authenticate( ) ;pam_ sm_authenticate( )
密码管理:pam_chauthtok( ) ;pam_ sm_chauthtok( )
会话管理:pam_open_session( ); pam_ sm_open_session( )
会话管理 pam_close_session( ); pam_ sm_close_session( )
认证管理 pam_setcred( ) ;pam_ sm_setcred( )
2.4.4 密码映射(password-mapping)
密码映射允许用户在不同的认证机制下使用不同的密码,其中有一个主密码(primary password),其它密码为次密码(secondary passwords,可能有多个)。主密码用来对次密码进行加密。在主密码认证通过后,认证模块利用主密码将加密过的次密码(也称为 mapped password)解密,并对次密码进行认证。
注:如果使用了一次性密码的机制,就不使用密码映射。
所有服务模块必须支持如下4个映射选项:use_first_pass、try_first_pass、use_mapped_pass、try_mapped_pass。下面为密码映射的一个例子:
login auth required pam_kerb_auth.so debug
login auth required pam_unix_auth.so use_mapped_pass
login auth optional pam_rsa_auth.so try_first_pass
这里login共有3种认证机制:Kerberos、UNIX和RSA认证,两个required控制标志表明用户必须通过Kerberos认证和UNIX认证才能使用login服务,optional选项则说明RSA认证是可选的。
首先用户输入主密码进行Kerberos认证;“use_mapped_pass”选项指示UNIX认证模块利用主密码把用于UNIX认证的次密码解密出来并对该次密码进行认证;try_first_pass选项指示RSA认证模块先使用第一个模块(即Kerberos模块)的密码作为进行认证的密码,当对该密码认证失败时才提示用户输入用于RSA认证的次密码。
3.1 实验环境
在本实验中,我们使用两台主机,其中主机1用作PAM服务器,主机2用于做认证测试。下面是两台机器的硬件及软件配置,见表3-1:
表3-1:实验硬件环境
| 主机1 | 主机2 |
CPU | Pentium(R) Dual-Core CPU E5500 @ 2.80GHz | Pentium(R) Dual-Core CPU E5500 @ 2.80GHz |
RAM | 2GB | 2GB |
OS | Ubuntu10.04 | Ubuntu10.04 |
IP | 10.77.20.239 | 10.77.20.238 |
Hostname | master | zhanglinlin |
备注 | 用作PAM认证服务器 | 用作PAM认证客户端 |
3.2 PAM软件环境
在Ubuntu10.04中已经集成安装了PAM,故此不需要再对PAM进行安装。下面我们来浏览一下Ubuntu10.04中所包含的PAM文件。
q PAM核心库文件
下图为PAM的核心库文件:
图3-1:PAM核心库文件
q PAM配置文档
下图为PAM配置文档:
图3-2:PAM配置文档
q PAM服务模块
下图为PAM服务模块:
图3-3:PAM服务模块
3.3 实验策略
在本实验中我们将通过PAM测试:1)控制用户安全登录;2)控制ftp用户登录。
1)假设系统的安全需求为:控制可以登录系统的用户,只允许root用户可以从本地登录,并且只允许zhanglinlin用户可以从10.77.20.1网段远程登录Linux系统,其他用户均不可以登录系统。
2)假设Linux系统提供FTP服务,但是不希望任何用户都可以轻易地访问该服务,只允许在一个事先定义好的文件中所规定的用户使用该FTP服务。那么,用户就可以使用PAM机制来实现该控制。当然,值得注意的是该FTP服务需要支持PAM。在下面的例子中,将以vsftpd为例来进行举例说明。
3.4 实验
3.4.1 控制用户安全登录
首先我们需要在“/etc/pam.d/login”文件中加入新的规则,如下代码清单3-1所示:
代码清单3-1:login服务认证规则
auth optional pam_faildelay.so delay=3000000
auth required pam_securetty.so
auth requisite pam_nologin.so
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
@include common-auth
auth optional pam_group.so
account required pam_access.so
session required pam_limits.so
session optional pam_lastlog.so
session optional pam_motd.so
session optional pam_mail.so standard
@include common-account
@include common-session
@include common-password
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
这里需要注意的是代码清单中黑体部分,这条规则的具体含义是使用pam_access.so服务模块,在默认情况下,此认证模块将调用“/etc/security/access.conf”配置文件中的认证参数。当然,如果想要使用其它文件来对其进行配置,也可以在模块后面加上accessfile参数来进行设置,比如:
account required pam_access.so accessfile=/etc/login.conf
那么,根据需要,access.conf文件中的内容需要按如下方式进行设置,见代码清单3-2:
代码清单3-2:access.conf文件配置
+:root:LOCAL
+:zhanglinlin:10.77.20.238
-:ALL:ALL
首先,我们解释下access.conf文件的书写语法:
permission : users : origins
可以看出,与PAM配置文档类似的是,此文件也是由上述语法组成的行来构成的。每一行代表一个或一类认证策略。其中permission位表示访问拒绝或允许,允许用“+”来表示,拒绝用“-”来表示。users位表示想要控制的用户。origins代表登录的地点,可以是名称(本地登录时)、主机名、域名(以“.”开始),主机IP地址或网络号(以“.”结束)。ALL表示任何主机,LOCAL表示本地登录。
注意:ALL字段在access.conf文件中出现的顺序非常重要。如果它出现在文件头部,那么后续的其他字段所表示的访问权限将随之失效;如果它出现在其他字段之后,那么其他的字段将生效。所以一般建议将ALL字段表示的访问权限置于文件末尾,以保证其它访问权限的正常解析和使用。
那么代码清单3-2中的配置代表什么意思呢?第一行表示允许root用户从本地进行登录,第二行表示,允许zhanglinlin用户从“10.77.20.238”IP地址进行登录,第三行表示除了上述允许条件之外其它任何登录均拒绝。
配置完成之后,下面我们进行具体的登录测试。结果如图3-4所示:
图3-4:zhanglinlin远程登录master
下面,我们修改zhanglinlin机的ip地址为10.77.20.123,然后从新进行登录验证,结果如下图3-5所示:
图3-5:修改IP地址后的登录结果
至此,此部分的测试已经完成,实验表明,我们可以使用PAM的“/etc/pam.d/login”和“/etc/security/access.conf”文件进行登录认证。
3.4.2 控制ftp用户登录
这里我们以vsftpd为例来进行说明如何进行配置。在进行配置之前,首先需要确保vsftpd已经安装。由于这部分不是我们实验的重点,故此不做详细介绍,按照下述命令进行操作即可。
1)使用下述命令,安装vsftpd:
sudo apt-get install vsftpd
2)使用下述命令,启动vsftpd服务:
sudo /etc/init.d/vsftpd start
3)使用下述命令,关闭vsftpd服务:
sudo /etc/init.d/vsfptd stop
4)通过“/etc/vsftpd.conf”文件进行详细的配置
如图3-6表明vsftpd安装成功
图3-6:vsftpd安装
详细的设置这里不再赘述。这里我们把vsftpd的本地用户开启,配置如下,见代码清单3-3所示:
代码清单3-3:配置vsftpd开启本地用户
listen=YES
#anonymous_enable=YES
local_enable=YES
write_enable=YES
dirmessage_enable=YES
ftpd_banner=Welcome to [张林林,NO.2010103276] HOME!
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
下面我们首先查看PAM中关于vsftpd的配置,其默认值如下代码清单3-4所示:
代码清单3-4:PAM中vsftpd默认配置
# Standard behaviour for ftpd(8).
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.
# Standard pam includes
@include common-account
@include common-session
@include common-auth
auth required pam_shells.so
其中第二行中,pam_listfile.so模块用来实现基于用户的FTP控制;item=user就表明是通过用户名进行控制;sense=deny表示拒绝出现在/etc/ftpusers文件中的用户名;file=/etc/ftpusers指定了拒绝的用户名单(以行为单位);onerr=succeed表示如果出现某些错误(比如无法打开配置文件等)时返回的结果,这里是成功信息。
现在我们来测试,是否能够登录成功。
我们事先已经建立了用户,账户为“ubuntu”,密码为“211314”。下面进行登录测试,如图3-5所示:
图3-7:PAM默认值登录
下面,我们对PAM的vsftpd文件进行配置,从而对vsftpd登录进行认证。这里我们只需要修改“/etc/ftpusers”文件即可,向里面加入需要拒绝的用户“ubuntu”,如下所示:
# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).
ubuntu
root
daemon
bin
sys
sync
games
man
lp
news
uucp
nobody
如上所示,黑体部分为加入的内容。下面再次进行登录测试,如图3-8所示:
图3-8:使用PAM认证的登录测试
可以看到,我们成功地使用PAM对vsftpd登录进行认证。
3.5 实验总结
在上述试验中,我们分别使用PAM进行了用户安全登录认证以及控制ftp用户登录认证的配置与测试。可以看出,只要服务支持PAM认证,我们就可以方便地通过对PAM配置文档的设置达到对其进行认证管理的目的。
1 对用户进行功能范围的划分
一种最直观的应用方式是我们可以通过PAM将不同用户的不同认证进行详细的划分。这种操作使得某些用户仅仅具有我们赋予他的权限,使其不能再规定的权限之外进行操作。
2 PAM+Vsftpd的实现
略,详见第3节。
3 PAM+OpenSSH的实现
在Linux中有许多以r开头的公用程序(如rsh,rlogin等)可以让用户无需密码即可远程执行。因此,使用OpenSSH来替代那些安全性较低的命令,可以提高系统的安全性,消除隐患。
OpenSSH是SSH(Secure SHell)协议的免费开源程序,所有使用OpenSSH的通讯都会被加密。
缺省情况下,SSH使用传统的口令验证方式,无需任何配置,就可使用账号和口令登录到远程主机,所有传输的数据都会被加密。但是,可能会遭到“中间人”攻击。
OpenSSH采用RSA/DSA密钥认证系统,需要依靠密匙,即用户必须为自己创建一对密匙,并把公用密钥放在需要访问的服务器上。如果要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用密钥进行安全验证。服务器收到请求之后,先在该服务器的home目录下寻找公用密匙,然后把它和发送过来的公用密钥进行比较。如果两个密钥一致,服务器就用公用密钥加密“质询”(Challenge),并把它发送给客户端软件。客户端软件收到“质询”后,就可以用私人密钥解密再把它发送给服务器。使用这种方式,用户必须知道自己密钥的口令。与基于传统口令认证相比,这种方式不需要在网络上传送口令,不仅加密所有传送的数据,而且阻止了“中间人”攻击方式。
将PAM与OpenSSH结合起来使用将综合了二者的优点,不仅使提供的服务更加安全,而且更加易于管理。
4 基于PAM的USB-KEY的实现
USB Key这个概念最早是由加密锁厂商提出的,加密锁是用来防止软件盗版的硬件产品,加密锁的概念是使安装在计算机内的应用程序加密锁硬件无法运行来达到软件不被盗版的目的。此后,随着电子商务和PKI应用的兴起,数字证书作为确认用户身份和保护用户数据的有效手段越来越被人们接受。然而数字证书实质上表现为带有用户信息和密钥的一个数据文件,如何保护数字证书本身成为PKI体系中最薄弱的环节。
数字证书可以保存在各种存储介质上,如软盘、硬盘等。但是如果简单地将其存储于这些存储介质当中,不但不是理想的选择,更重要的是很可能造成证书的丢失,这样的损失将是无法估量的。于是,专门用于存储秘密信息的USB KEY就很自然低成为数字证书的最佳载体。
USB KEY本身作为存储证书(密钥)的容器,其自身的结构决定了用户只能通过厂商编程结构访问数据,因此其中的证书无法被复制。另外,每个USB KEY都带有PIN码保护,这样就更加保证了其安全性。
Linux下USB Key的工作原理是通过USB接口的U盘和pam_usb软件共同构建的一种验证方法,利用存储在USB接口的U盘中的私钥,结合Linux服务器的系统登录口令认证来实现Linux下多用户登录系统的身份验证问题,可以解决登录口令的遗失,口令被破解等安全隐患。
下面,对其做简单介绍:
1)从PAM USB官方网站上下载安装包:http://www.pamusb.org
当前最新版本为0.50.0,下载完成后将其解压并安装或者使用下面命令直接安装:
apt-get install libpam-usb pamusb-tools
安装过程如图4-1所示:
图4-1:PAM-USB的安装
PAM-USB支持三种不同的登录方法,均为通过对pam.d/login配置文档的配置来实现:
(1)插入正确的带有USB Key的唯一登录方法;
配置方法:
删除:auth required pam_unix.so
增加:auth required pam_usb.so
(2)插入正确的带有USB Key或者输入正确登录密码均可以登录;
配置方法:
在auth required pam_unix.so前加入
auth sufficient pam_usb.so
(3)插入正确USB Key且需要输入正确的登录密码才可以登录。
配置方法:
在auth required pam_unix.so前加入
auth required pam_usb.so
上述配置不难理解,具体原因请查看第二节中对控制标记部分关于required、sufficient的介绍。
2)U盘USB-KEY的制作
(1)制作USB-KEY
首先,按照如下命令进行操作:
mkdir /mnt/usb
mount /dev/sda1 /mnt/usb
以上命令建立挂载USB闪盘。下面命令可以产生一堆DSA算法的公私钥,其格式为:
usbadm keygen <mntpoint> <user> <bits>
其中,mntpoint代表挂载点,user代表用户名称,bits为产生的密钥长度。
(2)具体示例:
usbadm keygen /mnt/usb root 1024
这样将为root用户建立一对长2048位长度的公私密钥(各长1024位)。并且产生的私钥会自动地复制到USB当中。
总之,PAM是一组可插拔式认证模块,我们可以将基于PAM为用户提供灵活的认证方式。这能够使得我们方便有效地对单个系统中存在的多种认证服务进行有效便捷的管理。同时也能够根据不同的特点实现某些具有特色的认证机制。
PAM将系统的认证服务继承于一身将不可避免地带来的一个问题是:PAM“管的这么宽”,那他自己“丢了”怎么办?
这也就是说,假如有某一用户获得了对PAM操作的权限之后,它完全可以通过对PAM的配置文档或服务模块的修改,使得它自身能够具有本不应该具有的权限,从而将会给系统带来灾难性的破坏。因为,这个用户将可能获得系统的所有权限,从而进行肆意的破坏。
另一个想当然需要考虑的问题是,当众多的服务认证依赖于PAM之后,假如PAM由于某种原因崩溃之后,需要如何处理?此时,我们甚至连系统都不能登录。
针对第一个问题,我们将其归之为“PAM自身安全性问题”,针对第二个问题,我们将其归之为“PAM系统健壮性问题”。下面分别对其进行分析。
q PAM自身安全性问题
比较直观的想法是:在使用PAM进行配置之前,首先对用户进行身份认证。只有合法的用户才可以对其进行操作;在使用PAM进行配置时,采用某种加密方法,防止信息的丢失和泄露。
另一种可行的操作时将PAM与SETE模型结合起来。将某些用户限制在特定的域之内,使其与PAM所在的域隔离开来,防止这一类用户对PAM的修改。
另外一个需要提到的安全隐患为“pam.conf”文件。PAM最早使用的配置文件时“etc/pam.conf”。但是,现在较新版本的PAM中均加入了对“pam.d/*”配置方式的支持。彻底删除pam.conf的好处是:即使系统配置不当,也不会发生非法授权访问。
q PAM系统健壮性问题
对于非自然灾害的故障,有多种解决办法,最简单的操作时经常为PAM建立备份,并且将备份存储在不同的磁盘上。当PAM发展到足够强大的时候,可以采用数据库中关于日志的思想。众所周知,日志的思想已经在很多种方面发挥了很好的作用,例如:数据库、文件系统、SSD设备等等。
[1] Linux-PAM系统管理指南[OL] .
[2] ChinaUnix博客.Linux-PAM系统管理指南. [DB/OL].http://linux.chinaunix.net/techdoc/system/2004/11/25/920935.shtml.2004.11 .
[3] NETGUY.PAM入门介绍[DB/OL].http://doc.linuxpk.com/5209.html.2002.09 .
[4] 韩波.深入Linux-PAM体系结构[DB/OL].http://linux.chinaitlab.com/tool/530218_2.html.2006.11.
[5] 中国IT实验室.用PAM认证加强Liunx服务器的安全[DB/OL].http://www.enet.com.cn/article/2009/0922/A20090922540807.shtml.2009.02 .
[6] 张林林.Linux-PAM运行原理[DB/OL].http://blog.csdn.net/shenlan211314/archive/2011/06/19/6554542.aspx.2011.06.
[7] 石文昌,梁朝辉.信息安全系统概论[M].北京:电子工业出版社,2009.03.
[8] 曹江华.Linux服务器安全策略详解[M].北京:电子工业出版社,2007.07.
[9] 李洋.Linux安全策略与实例[M].北京:机械工业出版社,2009.11.
[10] A. G. Morgan,T. Kukuk.The Linux-PAM System Administrators' Guide[C].2007.02.
[11] A. G. Morgan,T. Kukuk.The Linux-PAM Application Developers' Guide[C].2008.04.
[12] A. G. Morgan,T. Kukuk.The Linux-PAM Module Writers' Guide[C].2006.08.
更多推荐
所有评论(0)