首页> 系统技术> 利用Linux-PAM实现安全验证与管理

[文章]利用Linux-PAM实现安全验证与管理

收藏
0 1013 0

Linux-PAM验证技术简介

1.1 PAM简介

 PAM最初是由Sun公司发明的一种灵活的验证用户身份的方法,集成在Solaris中,由于其灵活性、安全可靠性等,得到推广,现在已经广泛移植到LinuxSunOSHP-UX 9.0等系统中并被标准化为X/Open UNIX标准化流程的一部分。

PAM采用模块化设计,将验证功能从应用程序中独立出来,实现了应用程序和验证机制的分离;同时PAM建立了一个存储各种验证功能的PAM模块的API共享库,API共享库作为连接应用程序和验证模块,及保障了应用程序身份验证的需求,又方便了管理员根据应用程序的具体验证需要灵活调用各种PAM验证模块进行验证。应用程序使用的验证功能由PAM配置文件中指定的PAM功能模块完成,同时验证过程对程序透明(也就是说PAM只对程序返回验证成功或失败的结果,程序不知道到底经过了什么验证,不知道那些信息验证成功或失败,也更有效地防止非法用户根据具体的验证错误信息进行新的攻击)。管理员可以根据应用程序的不同通过PAM API灵活地调用PAM提供的各种鉴别功能模块。

1.2 PAM的体系结构以及验证原理

PAM为了实现其插件功能和灵活易用性,采用了分层的设计,把验证模块从应用程序中独立出来实现了应用程序和身份验证机制的分离,并又通过PAM API把应用程序和提供身份验证功能的验证模块联系起来,保障了取得的应用程序服务的安全性。PAM体系结构如图1.1

                                                  

                                          1.1PAM体系结构

 当用户请求应用程序服务时,应用程序就会调用PAM认证,PAM API按照应用程序的PAM配置文件/etc/pam.d/service name 的规定加载相应的验证模块,然后把从应用程序那里得到的请求服务的用户信息传递给底层的验证模块,验证模块根据得到的信息进行其功能验证操作并把验证结果返回给PAM API,再由PAM API根据配置的具体情况将来自验证模块的验证结果返回给应用程序,应用程序将根据验证结果来确定是否为请求服务的用户提供服务。这就是PAM验证的一个流程和原理,由此看此可以看到,PAM认证尽管分离了具体应用程序的身份验证机制,却可以针对不同的服务提供不同的认证方法,保障了应用程序身份验证的同时使得应用程序安全验证的灵活性大大提高;并且整个验证过程由PAM模块完成,验证对应用程序透明,有效提高了系统的安全性能。PAM认证还在系统中加入了日志管理模块,管理员可以灵活查看服务验证的进行情况和PAM模块功能的实现情况,根据需要管理员可以随时配置不同的验证方法。

1.3 PAM配置文件

使用PAM验证的应用程序服务的PAM配置文件在/etc/pam.d(旧版的PAM机制,配置文件在/etc/pam.conf)目录下,通常配置文件以相应的应用程序的名称命名。当应用程序找不到与其对应的配置文件时会调用other配置文件中的设定进行用户验证。配置文件中每一行代表一条验证规则,当应用程序使用PAM时,PAM调用相应的配置文件,并按照文件入口顺序逐条验证。验证规则的格式如下:

  modules_type         control_flags         modules_path       options

  模块类型             控制标志           模块路径          传递参数

PAM验证模块按照模块的功能类型可以划分为四类,任何给定的模块至少可以实现四种模块类型功能之一(也可以多种)。四种类型分别为:

u  auth      主要对用户身份的合法性进行识别验证。例如:检查账号密码,识别是否是root用户等

u  account   对账号的各项属性进行检查,执行与访问、账号及凭证的有效期、密码限制/规则等。例如:是否允许登录,是否允许用户从这个终端登录,密码修改是否符合规则等。

u  password   执行用户信息更新。例如:密码更改等。

u  session    用于初始化和终止会话。例如:登录连接信息,记录挂载目录的资讯,限制用户资源的使用等。

每一条验证规则中都有一个控制标志,控制标志主要是对验证流程进行控制,也就是当一条验证规则成功或失败后PAM接下来做什么。一个PAM配置文件可以堆砌多条验证规则,利用指控标志可以决定模块的重要程度,控制标志有五个:

u  required    表示该模块的认证结束后不管成功或失败都接着进行下一条验证,但是这个模块的验证成功是整个验证最终结果成功的必要条件。如果该模块验证失败,则无论后面的验证结果如何,整个验证最终结果都会返回失败。

u   requisite    required类似,表示该模块验证成功是整个验证最终成功的必要条件,但有一点与required不同,就是只有当该模块验证成功才继续下一条验证,如果验证失败则终止验证并返回验证失败的结果。

u  sufficient   表示如果该模块认证成功,则马上返回验证成功的信息而不再继续后面的模块验证,如果验证失败则继续后面的验证并且该模块的验证失败不影响最终的验证结果,即PAM将忽略这个模块的验证失败,整个验证的成功与否取决于后面的验证。

u  optional     表示该行验证模即使失败也不影响最终验证结果,如果验证失败,PAM会忽略这个模块验的验证失败信息,继续下面的验证。

u  include      表示对验证规则的扩展, 验证过程将执行包含文件中的模块验证。

模块的默认路径是在/lib/security,通常缺省,如果验证模块在其他地方,只要把具体路径写出来即可。至于options传递参数,不同模块的传递参数不同,传递参数主要提供给验证模块一些控制信息。

1.4 PAM验证举例:vsftpd

CentOS-6.5Linux操作系统中,vsftpd服务支持PAM验证。进入/etc/pam.d目录下可以看到vsftpd配置文件存在,vsftpd文件对用户请求使用vsftpd应用配置了验证机制,具体如图1.2

 

1.2 vsftpdPAM配置文件

 

配置文件第一行为请求vsftpd服务的用户初始化了一个密匙环回话,配置文件第二行对请求用户进行pam_listfile.so模块身份验证,拒绝文件ftpusers中的用户登录vsftpd服务。接下来接着进行pam_shells.so模块以及包含在文件password-auth文件中的验证规则对用户进行身份验证。最后PAM将认证结果返回应用程序vsftpdvsftpd根据返回结果决定是否允许用户访问。

场景设计与验证

2.1 具体需求

Linux服务器利用PAM验证机制实现的具体的安全验证框架如图2.1

 

                     

  2.1 PAM验证框架

 

具体的验证控制需求如下:

        1.        控制root用户只能从本地登录系统,并且只有root用户能从终端tty1进行登录;Jack用户能从本地登录,而John用户只能从主机IP192.168.23.129(也可以实现网段)的PC端登录。Test1用户可以从任何地方登录。

        2.        制定密码策略,提高系统安全,实现普通用户修改密码的控制验证,只有新密码字符长度大于或等于8个,并且包含1个大写字母、3个数字、5个小写字母时新密码才能通过验证并修改成功,每次修改密码只能尝试3次,并且不能使用最近用过的五个密码。

        3.        实现用户访问login应用程序登录服务器的时间控制。非root用户只能在星期一至星期五每天的早上十点到晚上十点获得login应用程序登录服务器,而root用户则不设置时间段控制,任何时候都可以获得login应用程序登录访问服务器。

        4.        制定登录尝试验证规则对包括root用户在内的密码错误自动锁定。普通用户输入密码错误达到3次系统就自动锁定用户,锁定30秒,30秒后用户可以再次尝试输入密码登录。对root用户锁定时间为300秒,300秒后可以再次尝试输入密码进行系统登录

2.2登录地点控制实现

根据上述具体的用户登录要求,可以选择增加pam_access.so验证模块。pam_access.so模块能根据登录用户名、客户IP/主机名、网络号以及登录终端号进行访问控制。pam_access.so模块的控制文件为/etc/security/access.conf进入loginsshd程序服务的PAM验证配置文件,增加验证规则以实现对用户登录地点以及登录终端的控制,增加pam_access.so模块验证,如图2.2.1

account      required     pam_access.so        


 2.2.1 增加pam_access.so模块验证

 

增加了PAM验证模块后,还需要对模块相应的控制文件写入自己需要的验证控制,模块才能根据控制文件的内容对用户登录请求服务进行验证,pam_access.so模块的控制文件/etc/security/access.conf,使用vi编辑器编辑access.conf文件(文件自带说明,行首带有“#”号表注释)在文件末尾添加以下控制,如图2.2.2

- root ALL EXCEPT LOCAL 

- ALL EXCEPT root tty1                                     

- jack ALL EXCEPT LOCAL                                   

- John ALL EXCEPT 192.168.23.129


2.2.2 编辑access.conf文件

上述四条规则分别实现了以下控制:控制root用户只能从本地登录系统;限制root用户以外的用户从终端tty1进行登录;限制Jack用户只能能从本地登录,限制John用户只能从主机IP192.168.23.129处进行登录。

测试:用用户rootJack分别在tty1终端登录服务器,Jack用户被拒绝登录,root用户登录成功,Jack能在其他终端登录成功,John用户在本机登录不能成功,而在192.168.23.129处才能登录成功。远程上使用putty对用户进行登录测试,三个用户都不能登录成功。Test1用户登录没有进行设置控制,在本地在远程都能登录成功。利用putty软件远程登录服务器的结果如图2.2.3

                                      

                                          图2.2.3 putty软件远程登录

查看系统安全日志可以看到:Jack用户没有通过pam_access.so模块认证被拒绝在tty1终端登录可以再其他终端如tty3登录。John用户在本地登录亦被pam_access.so模块拒绝,只能通过IP192.168.23.129的主机登录服务器,在192.168.23.130处登录则失败。系统安全日志内容如图2.2.4、图2.2.5

                

2.2.4 系统安全日志

                            

2.2.5 系统安全日志

2.3 制定密码控制策略

根据上述密码的设置要求,可以通过添加pam_cracklib.so验证进行密码修改控制。pam_cracklib.so验证模块可以制定密码策略,在用户修改密码时只有符合要求的新密码才能通过PAM模块验证,新密码才会被系统接受密码修改才可以完成。限制使用最近用过的5个历史密码可以通过给pam_unix.so模块添加控制参数remember进行控制。

 密码控制验证的PAM配置文件为passwdpasswd配置文件中的验证规则主要是包含了system-auth配置文件,所以只要在system-auth配置文件中增加pam_cracklib.so验证模块并提供相应的控制传递参数即可。在/etc/pam.d/system-auth配置文件中增加pam_cracklib.so模块验证并控制规则如下,如图2.3.1                                                                    

password    requistie     pam_cracklib.so     debug  minlen=8    ucredit=-1  dcredit=-3  lcredit=-5 retry=3

password      sufficient    pam_unix.so   sha512  shadow  nullok  try_first_pass  use_authtok   remember=5

             

             2.3.1 增加pam_cracklib.so模块验证

 

上述两条规则实现了:普通用户修改密码的控制验证,只有新密码字符长度大于或等于8个,并且包含1个大写字母、3个数字、5个小写字母时新密码才能通过验证并修改成功,每次修改密码只能尝试3次,并且不能使用最近用过的5个密码。

在本机上进行Jack用户密码修改测试,当输入新密码为“huang”时,系统提示“it is too short”。当输入新密码为“huangxiaojian”时,系统提示“it is based on a dictionary word”。当输入新密码为“huang123456789”时,系统提示“it is too simple”。三次修改失败后,系统退出密码修改。测试显示如图2.3.2所示。当修改成最近用过的密码时,页面提示“Password has been already used. Choose another”,并且拒绝修改,测试显示如图2.3.3所示。测试过程系统安全日志如图2.3.4所示:



2.3.2 密码修改


2.3.3 历史密码修改


2.3.4 日志显示

 

2.4 用户访问应用程序时间段控制

利用pam_time.so可以对用户访问应用程序服务设计时间控制,例如对sshdvsftpd等。根据控制要求,进入login应用程序服务的PAM配置文件/etc/pam.d/login增加pam_time.so验证模块,如图2.4.1

        account      required      pam_time.so  

                        

                        2.4.1  增加pam_time.so验证模块

然后进入pam_time.so模块的控制文件/etc/security/time.conf,编辑增加以下用户时间控制,如图2.4.2                   

                        login* ;!rootMoTuWeThFr0900-2200                                                     

                        login* rootAl0000-2400   

                                        

                     2.4.2 time.conf文件编写

上述添加规则分别实现了:限制非root用户只能在星期一至星期五每天的早上十点到晚上十点获得login应用程序登录服务器;root用户则不设置时间段控制,每天的全天24小时都可以访问login应用程序登录服务器。

测试:在本进行用户访问login应用程序登录服务器测试,rootJack用户都能获得login应用并登录服务器,因为此时系统时间为:May 14  2150 59  在允许登录时间段内;在22点以后再进行用户访问login应用程序登录服务器测试,只有root用户登录服务器成功,而其他用户如JackJohn因为权限否定而得不到login应用程序服务。查看安全日志可以看到相关内容,如图2.4.32.4.4所示:

                          

                图2.4.3 日志显示

                         

                            2.4.4 日志显示

 

2.5 建立登陆错误自动用户安全机制

根据控制需要,可以在登陆应用程序loginPAM配置文件中添加pam_tally2.sopam_tally2.so模块可以监控用户的不成功登录的次数,当失败登录次数达到控制的上限时会自动锁定用户一段时间。pam_tally2.so模块通过传递参数即可实现对模块验证的要求控制。进入system-authPAM配置文件,增加如下pam_tally2.so模块验证规则,如图2.5.1       

auth   required  pam_tally2.so even_deny_root deny=3 unlock_time=30 root_unlock_time=300

              

2.5.1 增加pam_tally2.so模块验证规则

上述添加PAM模块以及具体参数实现了:控制系统针对输入密码错误达到3次的用户进行自动锁定,普通用户锁定30秒,30秒后用户可以再次尝试输入密码登录。对root用户锁定时间为300秒,300秒后可以再次尝试输入密码进行系统登录。

测试:在本机上进行登录测试,用Jack用户连续3次密码错误登录后用正确密码登录被拒绝,时间间隔30秒后重新进行登录操作,Jack用户登录成功。查看系统安全日志可以看到系统对Jack用户密码错误登录的次数进行计数,错误达到3次后即便密码正确登录访问请求也会被模块pam_tally2.so拒绝。间隔30秒后才能重新登录。日志显示如图2.5.2所示:


2.5.2 日志显示

 

系统技术
最近热帖
{{item.Title}} {{item.ViewCount}}
近期热议
{{item.Title}} {{item.PostCount}}