PAM的学习

可装载式身份验证模块。
查看rpm包和包含的库:
[root@HADR01 ~]# rpm -qa | grep pam
pam-0.99.6.2-6.el5_5.2
pam_krb5-2.2.14-22.el5
pam_krb5-2.2.14-22.el5
pam_smb-1.1.7-7.2.1
pam_smb-1.1.7-7.2.1
pam_pkcs11-0.5.3-26.el5
pam-0.99.6.2-6.el5_5.2
pam_ccreds-3-5
pam_pkcs11-0.5.3-26.el5
pam_passwdqc-1.0.2-1.2.2
pam_ccreds-3-5
pam_passwdqc-1.0.2-1.2.2
[root@HADR01 ~]# ldconfig -v | grep pam
libpam_misc.so.0 -> libpam_misc.so.0.81.2
libpamc.so.0 -> libpamc.so.0.81.0
libpam.so.0 -> libpam.so.0.81.5
libpam_misc.so.0 -> libpam_misc.so.0.81.2
libpamc.so.0 -> libpamc.so.0.81.0
libpam.so.0 -> libpam.so.0.81.5

应用都会去调用libpamXXX.so,然后进行安全方面的工作。
比如我们的login程序,看一下其调用了哪些库:
[root@HADR01 ~]# ldd /bin/login
linux-vdso.so.1 => (0x00007fff83fa2000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003a85e00000)
libpam.so.0 => /lib64/libpam.so.0 (0x0000003a7fe00000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x0000003a76000000)
libaudit.so.0 => /lib64/libaudit.so.0 (0x0000003a7ee00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a72000000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a72400000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a71c00000)
我们会发现其调用了pam的库。

pam有很多认证的方式,认证方式的库在/lib/security下:
比如ladp认证:
[root@HADR01 ~]# ls /lib/security/ | grep ldap
pam_ldap.so

由于pam有这么多的认证方式,每个应用程序都能用pam来进行认证,那么需要有一个地方为每个应用程序提供pam的配置,这个配置在/etc/pam.d下。如login程序的pam配置文件:
[root@HADR01 pam.d]# head /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session optional pam_keyinit.so force revoke
session required pam_loginuid.so

每个so文件也能有相应的配置文件,如/etc/passwd就是一个配置文件。

也就是说:应用程序调用libpam.so来进行认证,libpam.so根据应用的配置文件(/etc/pam.d/XXX),调用实际的模块,如pam_unix.so来完成具体的认证。pam_unix.so这个模块可以拥有自己的配置文件,如/etc/passwd文件。配置文件会的说明通过认证需要调用哪几个模块,只有每个模块都通过了,才算验证通过。

比如login程序:
[root@HADR01 security]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session optional pam_keyinit.so force revoke
session required pam_loginuid.so
session include system-auth
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
当使用pam的auth功能的时候,会得去调用pam_securetty.so模块,同时需要system-auth配置文件(/etc/pam.d/system-auth),但使用account功能的时候,会的去调用pam_nologin.so模块,password和session功能也是类似的。
那auth来分析:
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
只有每一行都通过,才能通过验证。对于include来说,需要通过include的那个配置文件里的对应方法的每一行才行。
第一行,从pam_securetty.so可以推断出其配置文件为/etc/securetty,这个文件指明了一些允许被登录的控制台。也就是说,使用login的控制台必须写在这个文件中才行。
第二行,表明还需要通过system-auth文件里的auth的每一行,内容为:
[root@HADR01 ~]# cat /etc/pam.d/system-auth | grep auth
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
第一行,required表示必须要用到pam_env.so这个模块验证一下。
第二行,sufficient表示如果通过了,那么就通过了。如果不行,那么看下面几行的表现,如果通过了,那么ok~
第三行,requisite表示必须通过,和required的区别在于required如果没通过,会的往下执行,如果为requisite,如果没通过就直接返回验证失败。
第四行,pam_deny.so只要一执行,必然是失败。

可以看到,其最重要的一条是pam_unix.so模块的认证(当然啦,如果你的tty不符合securetty的配置,那么这一步也是进行不到的啦)。这个模块会的用到/etc/passwd这些配置文件。

总结一下:
应用程序把验证交给pam库提供的函数来进行。这些函数会的更具配置文件,一次调用各种验证模块来进行验证。验证通过就ok,验证失败就不ok。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*