首页/网络基础
用PAM认证加强Linux服务器的安全(2009-11-9 10:46)

PAM(Pluggable Authentication Modules)即可插拔式认证模块,它是一种高效而且灵活便利的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。当然,在不同版本的Linux统中部署PAM认证是有所不同的,本文将以RHEL4版本为例进行解析。

1.部署PAM认证的必要性

我们知道一台Linux服务器会开许多不同的服务,这些服务中很多服务本身并没有认证功能,只是把认证交给用户名及密码。如果这样的话,那么所有服务都用Linux系统的用户名及密码来认证,对于服务器来说是很危险的。比如一台服务器开着FTP、SMTP、SSH等服务,那么新建一个用户默认就享有对以上的服务的操作权限,那么如果一个用户的帐号密码泄露会涉及到多个服务。因此,不管是PC还是服务器在类Linux系统中部署PAM认证是非常必要的。通过新型的认证模块——PAM就能解决认证方面的不足,加强Linux系统安全。

2.PAM认证的方式

PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so。PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证。通常情况下,在Linux系统安装完成后会在/etc/pam.d路径下为我们提供了一些默认的配置文件。另外,大家要知道/lib/security目录是认证文件的默认存放位置。/etc/pam.d路径下的默认配置文件是我们进行PAM配置的模板,通常情况下我们根据安全需要对于进行修改或者添加相应的项即可。

3.PAM认证的构成

客观地说PAM认证还是比较复杂的,简单地讲它包括四种常见认证类型(module type):即auth认证管理、account用户管理、password密码认证管理、session会话管理。以/etc/pam.d/login为例,我们可以看到它的配置文件,区域1中的auth、account、password、session等都是认证类型。区域2中的required、 requisite 、sufficient 、optional是认证的流程控制。最后面的区域3就是认证的PAM文件了。

4.PAM认证的流程

为了便于大家深入了解PAM认证的流程,我们以验证用户登录的PAM-login为例进行说明。PAM认证流程是从行首验证到行尾,逐条认证。比如用户登录服务器,共有十条auth类型认证,假设第一条认证失败,一般情况后九条也必须要认证。为什么就一般情况呢?其实还有非一般情况。那么这个用户动作成功与否是要看auth认证后面的区域2是怎么处理的。在图2中看到处理字段有required和optional,其中required代表认证必须通过,也就是说,无论成功多少条语句,只要失败一条,那么认证就失败。在图2中看到的区域3就是认证的模块了,第二行中的“pam_securetty.so”就是这个文件。在RHEL中,认证多是用相对路径。

5.PAM认证测试

pam_securetty.so是一个认证模块文件,该认证模块只对root用户有效,当root登录系统时,会查看有没有安全终端,安全终端就是/etc/securetty文件里的东西,比如你运行“W”命令看到TTY下面的东西就是安全终端。如果有安全终端就通过认证,否则失败。有些管理员为了安全,不让root用户直接登录,他会把/etc/securetty文件清代空,这就保证了在有root密码时,也不能够在本地登录。

为了以下的实验方便,能看出效果来,我们把“auth required pam_securetty.so”这条认证加入SSH服务的PAM模块谁文件里(/etc/pam.d/sshd)的第一行,目的就是让SSH服务应用这条认证。大家可在控制台窗口中执行“vi etc/pam.d/sshd”然后添加这条认证语句。同样的道理,如果把这条语句加到login文件(默认这条认证是被注销掉的,我们取消前面的#就可以了),控制的是从本地控制台登录,同样的话如果把这条语句加入到sshd文件内,那么它将控制的是从远程登录服务器22端口的过程。

下面我们试着SSH登录系统看看效果,在控制台中执行命令“ssh -l root localhost”,可以看到无论我们的root用户的密码正确与否都无法通过SSH远程登录到系统,可见上面的认证已经生效。在一般情况下,为了服务器的安全,大家通过PAM认证拒绝root远程登录系统。

6.PAM认证的处理方式

了解了认证类型的工作方式,我们还应该深入的理解认证的处理方式,在图2中看到,它的认证处理方式是required,表示这一模块的认证是必须成功的,但如果失败,认证过程不会即刻终止,PAM将继续下一个同类型认证。上面“pam_securetty.so”认证失败了,但认证并没有结束,认证的“指针”还在向下走。如图4中所示,在root用户SSH登录认证失败的前提下还提示用户输入密码,虽然认证不可能成功。

处理过程中除了required,还有requisite、sufficient和optional,我们再来看看requisite的效果。还用SSH服务为例,把/etc/pam.d/sshd文件第一行中的“auth required pam_securetty.so”改成“auth requisite pam_securetty.so”。再次尝试登录,发现和图4没有什么差别,也是输入3次密码后被拒绝了。但是细心的读者如果一边看文章一边尝试着实验的话,你会发现当你在输入密码时,用required反应的速度要慢一些,并且在系统日志中是没有记录的,认证同样是失败的。这说明required和requisite类似的地方是认证必须通过,而不同的是如果失败,认证过程将立即终止,不会去认证下面的条目。

7.限制root登录控制台

我们修改用/etc/pam.d/login来限制root登录控制台,打开login文件删除第二行中的#,取消对“auth required pam_securetty.so”的注销。然后我们本地登录服务器,通过测试我们发现当用required时,你在输入root及密码后,你得到了一个拒绝信息,用requisite时,当你输入root回车时同样会得到拒绝信息登录失败,这是由刚才的认证方式触发的。

8.PAM认证可选模块

在PAM认证中,sufficient表示如果认证成功,那么对这一类型的模块认证是充足的了,其他的同类模块将不会再检验,当认证失败,它会进行下一条认证,如果下面同类型的认证成功,结果依然成功。optional表示这一模块认证是可选的,也不会对认证成功或失败产生影响,这个就比较危险了。比如我们在/etc/pam.d/sshd文件内加入“auth required/lib/security/pam_listfile.so item=user sense=allow file=/etc/sshusers onerr=succeed”其含义是只允许出现在/etc/sshuser文件内的用户远程登录。然后我们执行命令“ssh -l root localhost”,当sshusers文件没有root用户时候,登录失败,很明显他被PAM模块拒绝了。那么我们改一下认证文件,将required改成sufficient,尝试再次登录,结果成功登录。

总结:PAM认证是Linux服务器系统最主要的安全认证模式,掌握PAM认证对于加强系统安全非常重要。本文结合理论与实践对PAM认证做了一定的分析,实际上关于PAM认证是一个大课题,希望以后有机会和大家进一步分享基于PAM认证的Linux系统安全技巧和经验。
八、常用的PAM服务模块

  下面是Linux提供的PAM模块列表(只是其中一部分):
  
  模块文件    模块功能描述                    相关配置文件
  
  pam_access   提供logdaemon风格的登录控制             /etc/security/access.conf
  
  pam_chroot   提供类似chroot命令的功能
  
  pam_cracklib  对密码的强度进行一定的检查库文件libcrack和字典文件 /usr/lib/cracklib_dict
  
  pam_deny    总是无条件地使认证失败
  
  pam_env     设置或取消环境变量                 /etc/security/pam_env.conf
  
  pam_filter   对输入输出流进行过滤 filters
  
  pam_ftp.so   对匿名ftp用户进行认证
  
  pam_group    当用户在指定的终端上请求指定的服务时赋予该用户相应的组权限 /etc/security/group.conf
 
  pam_issue    在提示用户输入用户名之前显示/etc/issue文件的内容  /etc/issue
 
  pam_krb4    对用户密码进行Kerberos认证             相应的Kerberos库文件
  
  pam_lastlog   在用户登录成功后显示关于用户上次登录的信息,并维护/var/log/lastlog文件     /var/log/lastlog

  pam_limits   限制用户会话所能使用的系统资源           /etc/security/limits.conf
  
  pam_listfile  根据指定的某个文件决定是否允许或禁止提供服务    例如/etc/ftpusers
  
  pam_mail    检查用户的邮箱中是否有新邮件            /var/spool/mail/xxxx
  
  pam_mkhomedir  为用户建立主目录 /etc/skel/
  
  pam_motd    显示/etc/motd文件的内容 /etc/motd
  
  pam_nologin   根据/etc/nologin文件的存在与否来决定用户认证是否成功  /etc/nologin
  
  pam_permit   总是无条件地使认证成功
  
  pam_pwdb    作为pam_unix_xxxx模块的一个替代使用Password Database通用接口进行认证  /etc/pwdb.conf
 
  pam_radius   提供远程身份验证拨入用户服务(RADIUS)的认证

  pam_rhosts_auth 利用文件~/.rhosts和 /etc/hosts.equiv对用户进行认证。

  pam_rootok 检查用户是否为超级用户,如果是超级用户则无条件地通过认证。

  pam_securetty  提供标准的Unix securetty检查            /etc/securetty

  pam_time    提供基于时间的控制,比如限制用户只能在某个时间段内才能登录 /etc/security/time.conf
  
  pam_unix    提供标准的Unix认证pam_userdb 利用Berkeley DB数据库来检查Berkeley DB用户/密码 /etc/passwd和 /etc/shadow 

  pam_warn    利用syslog( )记录一条告警信息

  pam_wheel    只允许wheel组的用户有超级用户的存取权限
Pluggable Authentication Modules for Linux 可插拨认证模块
当用户访问服务器,服务程序将请求发送到PAM模块,PAM模块根据服务名称在/etc/pam.d目录下选择一个对应的服务文件,最后根据服务文件的内容选择具体的PAM模块进行处理。

通过ldd查看服务程序在编译时是否使用了libpam.so,决定服务程序是否支持PAM认证。
具体的pam文件放在/lib/security目录下,服务文件放在/etc/pam.d目录下

PAM服务文件格式
eg:
auth        required   pam_security.so
auth        required   pam_stack.so service=system-auth
service表示调用子服务文件

Module-type:
       auth              检查用户和密码,分配权限
       account           检查账号是否过期,是否有权登录
       session           从用户登录成功到退出的会话控制
       password          控制用户改密码的过程
control-flag:
       required          要求矣须通过,否则结束退出
       requisite         如果不通过还可继续向下认证,后面有一通过即可。
       sufficient        通过则不需要向下认证
       optional          可选项

常用PAM服务文件
login       -------/etc/pam.d/login
ipop3d      -------/etc/pam.d/pop
vsftpd      -------/etc/pam.d/ftp(编译安装)或/etc/pam.d/vsftpd(rpm安装)
sshd        -------/etc/pam.d/sshd
su          -------/etc/pam.d/su
imap        -------/etc/pam.d/imap

/lib/security目录下,各个pam模块的作用,可参考/usr/share/doc/pam-0.99.3.0下的帮助文件。
相同类型Module-type组成一个堆栈。

常用PAM模块
pam_access.so            控制访问者地址与账号名称
pam_listfile.so          控制访问者的账号名称或登录位置
pam_limits.so            控制为用户分配的资源
pam_rootok.so            对管理员(uid=0)无条件允许通过
pam_userdb.so            设定独立用户账号数据库认证

pam_access.so模块的使用―――控制访问sshd服务的主机和用户
1.修改需使用这个模块的服务文件,如sshd:   /etc/pam.d/sshd添加
account   required   pam_access.so
2.修改模块的配置文件
/etc/security/access.conf
- : redhat : ALL EXCEPT 192.168.0.            (格式)
3.测试
ssh  redhat@192.168.0.22
ssh  redhat@127.0.0.1
pam_access.so根据主机、IP、用户、拒绝或允许访问。

pam_listfile.so的应用 (比pam_access.so更加详细控制)
1.首先查看它的帮助文件,看它的具体格式,参数如何
#less /usr/share/doc/pam-0.99.3.0/txts/README.pam_listfile
item        user,tty,group         说明列表文件中的内容
sense       allow,deny             拒绝或允许文件中的用户
file                               指定一个文件,内容根据item项来添加
onerr       succeed,fail           当模块本身产生错误时,返回的值,如无法打开file指定的文件,一般设为succeed
2.将模块应用到sshd服务
将上面添加的pam_access.so清掉,然后在/etc/pam.d/sshd中添加(第一行)
auth  required   pam_listfile.so   item=user   sense=deny     file=/etc/denyuser onerr=succeed
注意添加的位置顺序,否则看不到效果
3.创建编缉列表文件
#echo “redhat” >/etc/denyuser
4.测试
#ssh -l redhat 192.168.0.22   失败
#ssh -l chinaitlab 192.168.0.22 成功

#w   显示已登录的用户及最近的一次操作

pam_limits.so的应用
1.查看帮助文件,确认它的配置文件位置,参数模式
#less /usr/share/doc/pam-0.99.3.0/txt/README.pam_limits
<domain>       <type>    <item>    <value>
<domain>         用户名或组名
<type>           soft软限制
                 hard硬限制(不能达到的)
<item>           限制的内容,fsize文件大小,nproc最大进程数,maxlogins用户登录次数
2.将模块应用到sshd服务,修改服务文件
#vi /etc/pam.d/sshd 添加:
session required pam_limits.so
session          控制用户进程的登录次数,文件大小,通过控制用户的会话进程来限制用户使用的资源
3.编缉pam_limits.so的配置文件/etc/security/limits.conf
redhat  hard     maxlogins    2
限制redhat登录到sshd服务的次数,不能达到2。
4.测试
#ssh -l redhat 192.168.0.22   第1个
#ssh -l redhat 192.168.0.22   第2个
表示同时最多可以有1个redhat用户登录

pam_rootok.so的应用
#chfn            改变用户的finger信息
普通用户使用这个命令修改信息时,需要输入密码才能使用,而root用户则不需要。
分析:
#more /etc/pam.d/chfn
第一行为auth sufficient pam_rootok.so
因为chfn的pam服务文件的第一行应用了pam_rootok.so模块,所以当root用户使用chfn时不需验证,不需要再往下,直接通过。