Linux的PAM安全认证机制

2017-03-09 04:17
网络安全和信息化 2017年1期
关键词:配置文件命令账户

引言:对于Linux来说,如果提高安全性,防止非法用户登录系统,是不可忽视的安全问题。因此,如何鉴别用户的身份,成了问题的关键。使用PAM认证机制,可以简单轻松的在系统或者程序中插入不同的认证模块,来灵活高效的的鉴别用户的身份。

使 用PAM(Plugable Authentication Modules,即可插入的认证模块)认证机制,可以简单轻松的在系统或者程序中插入不同的认证模块,来灵活高效的的鉴别用户的身份。因为PAM模块和程序是相互独立的,可以根据需要自由的插入各种认证模块,在程序或服务中集成多种身份认证机制,大大来提高系统和程序的安全性。

使用NSS管理用户信息

一般来说,系统对登录者的信息进行验证,依靠的是“/etc/passwd”或者“/etc/shadow”密码文件。在默认情况下针对的是本地登录。如果系统中启动了FTP服务,访问者也可以利用本地账户来通过FTP服务的验证。诸如 Samba,MySQL,Apache等服务,是无法利用本地账户进行验证的,必须依靠其本身的认证设置。

按照传统的Unix认证方式,当用户访问邮件服务器等应用程序时,需要提交账户名和密码,该应用程序会利用C Library库中的函数得到对应的密码哈希值,并将其和存储在本地的系统密码文件中的哈希值进行比对。随着系统中安装的服务和程序的增多,为了便于账户信息集中管控,可以借助于LDAP目录来实现。这样,服务或者应用为了实现认证,就必须重写C Library库中的函数,使其支持LDAP账户信息认证。这种方法实现起来很繁琐,为了解决该问题,最好办法涉及到了NSS(Name Service Switch)。

NSS其实是一些特定的模块,和一系列的库文件对应。应用程序只需添加所需的模块,让其负责上述重写C Library库中的函数的功能,而无需应用程序自身的参与。在登录时系统会将账户名转换为唯一的UID,这其实就涉及到了名称解析机制,这是由NSS负责。

在Linux中,账户名可能存储在不同的位置,这就必然需要多种名称解析方法与之对应。在NSS的配置文件中,可以管理和配置这些解析方法。执行“vim /etc/nsswitch.conf”命令,在其中可以添加所需的NSS模块。例如“hosts:”一行中可以添加“dns”,表示在执行名称解析时可以调用NSS中的DNS模块来实现。在“password:”行中默认存在“files”项,表示从本地密码文件中提取账户信息,在其后可以添加“LDAP”,表示允许通过NSS的LDAP模块来定位目录服务器位置,进而查找相关账户名等。

在“shadow:files”一行中就说明了NSS和PAM存在的一定的联系,即当NSS完成账户名称的定位以及将其转换为UID之后,还会告诉 PAM 到“/etc/shadow”文件中查找该账户对应的密码信息,即将用户的输入的密码通过MD5(Salt)的方式转换为哈希值,然后与“/etc/shadow”文件中对应的账户的密码哈希进行比对,如果一致则表示密码正确。当然这种关联并非绝对,实际上PAM认证机制也可以不用借助于NSS的名称解析服务来查找用户密码存储位置。对于很多服务或者程序来说,对应的PAM认证也可以自行查找相关密码的存储位置。执行“getent password”命令,就可以从“nsswitch.conf”文件中名为的“password”数据库名中查询其内容,还可以执行“getent shadow”,“getent group”,“getent hosts” 等命令,来查询对应的内容。

查看PAM模块和配置文件

执行“cd/lib”命令,根据不同的系统版本,进入对应的文件夹,例如对于64位系统来说,可以进入其中的“lib64”目录,执行“ls”命令,可以显示大量的模块信息。要想支持一个新的New Service名称服务,就必须在上述目录中安装名称格式为“libnss_具体的服务名.so”的模块文件。

这样,当用户访问某个程序或者服务时,由特定的NSS模块负责处理用户名信息,而密码的验证和管控则交给相应的PAM模块来处理,程序和服务本身并不参与这些过程。其最大优势是实现了账户的集中管理,大大提高了安全管理的灵活性。例如,执行“authconfig-tui”命令,在认证配置界面左侧的“User Information”栏中可以选择账户名称查找和解析方式,包括“Cache Information”,“User LDAP”,“Use NIS”,“Use IPAv2”,“Use Winbind”等。

这样,对于用户名称信息就交由LDAP模块负责,对其的认证则交由Kerberos模块负责。和Kerberos模块对应的是“/lib64/security/pam_krb5.so”文件,该文件负责调用Kerberos认证,而无需应用程序参与。在上述“lib64”目录中进入“security”目录,执行“ls”命令,可以查看所有的PAM模块文件,这些库文件都是以“PAM_”开头的。例如,按照上述方法在本地“/etc/shadow”文件中实现密码认证,就需要使用到其中的“PAM_unix.so”模块。PAM认证模块同样工作于中间层,在应用程序和系统之间提供认证功能。程序或服务只需调用对应的PAM模块,就可简单快捷的来验证用户的身份。

除了系统自带的PAM模块外,用户也可以手工安装所需的PAM模块,例如当执行Kerberos认证的“kerberos5.so”库文件并不存在时,可以执行“yum provide "/lib64/security/pam_krb5.so"”命令来查找该文件来自何处。执行“yum–y install pam_krb5”命令,来安装该库文件。当安装了一个新的PAM模块,就相当于提供了一种新的认证方式。只要修改程序的PAM配置信息,就可以立即让该认证方式生效。

PAM配置文件中的控制参数

使 用“required”,“requisite”,“sufficient”,“optional”等参数,可以对上述管理组进行有效控制。对于“required”来说,执行的认证必须成功,否则继续保持之后的测试,但是最后的结果是失败的。例如当登录Linux时,先输入用户名,即使输入错误的用户名,系统也不会提示错误,而是允许继续输入密码,但是最终的结果是无法登录系统。例如对于“session required pam_limits.so” 来说,会执行限制访问方面的检测。如在上述“limits.conf”文件中添加“yonghu1-maxlogins 2”一行,表示只允许“yonghu1”用户最多登录2个控制台。这样,当其登录的控制台数量大于预设值后就拒绝其继续登录。

对于“requisite”来说,如果执行的验证失败,则立即返回失败信息。例如,在登录时,如果密码错误,则立即结束测试并退出。对于“sufficient”来说,不管之前的认证是否通过,只要该次认证通过,就表示测试成功。对于“optional”参数来说,通常和“session”管理组配合使用。“session optional pa m_kb r5”,“se ssion optional pam_ldap.so”来说,表示不管认证成功与否,都需要在日志中记录相关信息,例如何时认证成功/失败等。但这对于最终的认证结果没有什么影响。

解析简单的PAM配置文件

以一个简单的PAM配置文件为例来分析其功能。例如打开某个PAM配置文件,其第一行为“auth required pam_env.so”,其功能是通过“pem_env.so”文件,根据“/etc/security/pam_env.conf”文件给出的变量设置一个环境。“auth sufficient pam_unix.so likeauth nullok”一行的作用是调用“pam_unix.so”模块来检测用户的密码,其中的“likeauth”参数表示允许用户在输入密码时打错字或者更换密码字符,只要最终输入的是正确的密码即可,“nullok”参数允许用户使用空白的密码,出于安全考虑,最好不要使用该参数。如果用户输入的密码正确,就不必执行以下检测了。

“auth required pam_deny.so”行的作用是拒绝访问,表示密码出错将拒绝用户登录。“account required pam_unix.so”行的作用是检查该用户是不是一个合法的账户以及其是否失效,注意这里使用了“required”管理组,说明只要是无效账户,即使其余的检测通过也将拒绝登录。“password required pam_cracklib.so retry=3”行的作用是检查用户输入的密码是不是常见的单词,如果是的话将不允许其作为密码使用,“retry=3”参数表示拥有三次输入机会,这里使用“required”管理组,如果出错将无法登录。

“password sufficient pam_unix.so use_authtok md5 shadow”行的作用是如果用户已经拥有了身份验证令牌,就不需提示用户输入密码。因为用户已经输入了密码,而且经过了验证,就将该密码经过MD5加密后存放到“/etc/shadow”文件 中。“password required pam_deny.so”行的作用是以上验证失败,将拒绝用户登录。“session required pam_limits.so”行的作用是根据“/etc/security/limits.conf”文件的内容限制用户的对系统资源使用情况,包括文件打开的数量,内存使用量,允许访问进程数量,最大登录次数等。“session required pam_unix.so”行的作用是将本次登录时间信息写入到“lastlog”文件中的“最后一次登录时间”,将原来的最后一次登录时间信息提交给“/bin/login”程序。

PAM认证的常见实例

使 用“vim /etc/pam.d/system-auth”命令,将其中的“auth required pam_deny.so”行修改为“auth required pam_permit.so”,将“password required pam_deny.so”行修改为“password required pam_permit.so”就会产生一个奇特的效果,不管用户输入什么密码,都可以顺利登录。当然,在实际中是需要严格控制访问权限的。例如只允许root用户可以从本地登录,只允许“yonghu1”用户从网址192.168.1.100登 录,可以执行“vim /etc/pam.d/login”命令,在“login”配置文件中第二行之后添加“auth required pam_access.so accessfile=/etc/login.conf”行,使 用了“pam_access”模 块,通过配置文件“/etc/login.conf”来进行登录控制。使 用“vim /etc/login.conf”命令,在该文件中添加“+:root:LOCAL”,“:yonghu1:192.168.1.100”,“-:ALL:ALL”等语句,就实现了上述功能,其中的“+”参数表示允许访问,“-”参数表示拒绝访问。

如果想更改登录时系统显示的内容,可以执行“vim/etc/issue”命令来设置需要显示的内容。之后执行“vim/etc/pam.d/login”命 令,在其中添加“auth pam_issue.so issue=/etc/issue”行即可。如果不希望有些用户使用SSH安全连接,可以在“/etc/allowsshd”文 件中添加所需的账户,之后在“/etc/pam.d/sshd”配 置文件中添加“auth required pam_listfile.so onerr=fail item=user sense=allow file=/etc/allowsshd”一行,就可禁止其使用SSH。

在“/etc/security/time.conf”文件中添加“login;tty*&;!ttyp*;!root;!Al0000-2400” 和“xxx;*;!yonghu1;Wd 0000-2400|wk1800-0800”两行语句,表示禁止非Root账户在任意时间段从控制台登录,同时允许非“yongh1”的账户在非工作时间段访问名为“xxx”的服务。为了防止DoS类型的攻击,可以对系统中所有的用户资源使用情况进行限制,例如编辑“/etc/security/limits.conf”文件,在其中添 加“* hard core 0”,“*hard rss 50000”,“* hard nproc 20”,表示禁止所有用户调试文件,限制其最多可以访问50个进程,限制其内容使用量为50MB。在“/etc/pam.d/login”文件中添 加“session required /etc/security/limits.conf”,这样当用户登录之后,就会受到上述限制。为了防止用户随意使用“su”命令,切换到root环境,可以执行“vim/etc/pam.d/su”命 令,在其中添加“auth sufficient pam_rootok.so debug”,“auth required pam_wheel.so group=aut”。 这样,只有“aut”组中的账户才可以使用“su”命令,切换到root环境。

猜你喜欢
配置文件命令账户
只听主人的命令
如何切换Windows 10本地账户与微软账户
互不干涉混用Chromium Edge
探索自由贸易账户体系创新应用
外汇账户相关业务
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
父亲的股票账户
移防命令下达后
为View桌面准备父虚拟机