PAM(pluggable authentication module)用户认证
linux大多的认证服务都是由PAM来完成的,对于服务器的程序如sendmail也是如此,当用户向服务器发起登陆请求时,sendmail服务器会将该请求转发给PAM模块(libpam.so),但真正处理这些请求的也不是这个PAM,而是它将调用一系列更多的别的PAM模块来处理。而具体调用哪些模块是由该请求类型的服务配置文件决定的,服务配置文件都在/etc/pam.d/下面,一个认证服务对应一个文件,服务文件格式如下:
module-type control-flag module-path arguments
其中上面几项都有几个选项,
module-type: auth account session password
control-flag: required requisite sufficient optional
具体一个模块需要使用那种模块类型是由模块本身决定的,不同的模块使用不同的类型。
对于control-flag,required表示这个模块必须通过,如无法通过,将强行退出;requisite表示也是必须通过,但允许失败,系统允许还可等后面的服务通过,如果后面有一个sufficient模块通过,那也可算是认证通过;而sufficient 是只要这个通过,以后都不对用户进行任何认证了;optional则是这个模块认证通不通的过无所谓,总算成通过的。例子如下:
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
常用的PAM认证模块:
pam_access.so 控制访问者地址与帐号名称
pam_listfile.so 控制访问者的帐号名称和登陆位置
pam_limits.so 控制为用户分配的资源
pam_rootok.so 对管理员(uid=0)无条件允许通过
pam_userdb.so 设定独立用户帐号数据库认证
模块对应在系统中有说明文件,放在/usr/share/doc/pam-版本号/txt/下面,我机上的是
[root@server root]# cd /usr/share/doc/pam-0.75/txts/
[root@server txts]# ls
pam_appl.txt README.pam_ftp README.pam_shells
pam_modules.txt README.pam_limits README.pam_stack
pam.txt README.pam_listfile README.pam_stress
README README.pam_localuser README.pam_tally
README.pam_access README.pam_mail README.pam_time
README.pam_chroot README.pam_nologin README.pam_timestamp
README.pam_console README.pam_permit README.pam_unix
README.pam_cracklib README.pam_pwdb README.pam_userdb
README.pam_deny README.pam_rhosts README.pam_warn
README.pam_env README.pam_rootok README.pam_wheel
README.pam_filter README.pam_securetty README.pam_xauth
一个模块说明对应一个README。
看一下一些常用的认证应用程序,如login,就看/etc/pam.d/login,
#%PAM-1.0
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
session optional pam_console.so
前面三行是认证,其中第一个是使用pam_securetty.so来查看终端是否安全,可以查看上面的readme来看一下这个模块里面在干些什么,
pam_securetty:
Allows root logins only if the user is logging in on a
"secure" tty, as defined by the listing in /etc/securetty
Also checks to make sure that /etc/securetty is a plain
file and not world writable.
它说如果登陆安全终端只能让root登陆,安全终端在/etc/securetty中定义,还要检查这个文件是个普通文件,并且是全局不可写。这个模块通过了,然后是pam_stack.so,这个模块又调用子模块system-auth,同样看一下其中写了些什么,
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth required /lib/security/$ISA/pam_deny.so
account required /lib/security/$ISA/pam_unix.so
password required /lib/security/$ISA/pam_cracklib.so retry=3 type=
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5
shadow
password required /lib/security/$ISA/pam_deny.so
session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
这里涉及认证堆栈的概念,当系统在验证每个模块是否通过认证时,会将认证结果按顺序丢进堆栈里,而这里当pam_stack.so模块调用子模块systm-auth时,子模块又启用它自己的堆栈,认证后将结果返回父模块。这里system-auth先认证环境设置,然后是用pam_unix.so对用户名和密码进行认证,假若通过就足够了,不继续认证了,因为它是suffcient的认证方式,而如若未通过,则遇到pam_deny.so模块,这个模块是遇到任何用户都拒绝登陆的模块。再
回到login,下一个模块是pam_nologin.so,再看一下帮助文档,
# $Id: README,v 1.1.1.1 2000/06/20 22:11:46 agmorgan Exp $
#
This module always lets root in; it lets other users in only if the file
/etc/nologin doesn't exist. In any case, if /etc/nologin exists, it's
contents are displayed to the user.
它说这个模块只让root登陆,在/etc/nologin文件不存在的情况下才允许别的用户登陆,如果文件存在,该文件内容还会显示给用户看。
linux大多的认证服务都是由PAM来完成的,对于服务器的程序如sendmail也是如此,当用户向服务器发起登陆请求时,sendmail服务器会将该请求转发给PAM模块(libpam.so),但真正处理这些请求的也不是这个PAM,而是它将调用一系列更多的别的PAM模块来处理。而具体调用哪些模块是由该请求类型的服务配置文件决定的,服务配置文件都在/etc/pam.d/下面,一个认证服务对应一个文件,服务文件格式如下:
module-type control-flag module-path arguments
其中上面几项都有几个选项,
module-type: auth account session password
control-flag: required requisite sufficient optional
具体一个模块需要使用那种模块类型是由模块本身决定的,不同的模块使用不同的类型。
对于control-flag,required表示这个模块必须通过,如无法通过,将强行退出;requisite表示也是必须通过,但允许失败,系统允许还可等后面的服务通过,如果后面有一个sufficient模块通过,那也可算是认证通过;而sufficient 是只要这个通过,以后都不对用户进行任何认证了;optional则是这个模块认证通不通的过无所谓,总算成通过的。例子如下:
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
常用的PAM认证模块:
pam_access.so 控制访问者地址与帐号名称
pam_listfile.so 控制访问者的帐号名称和登陆位置
pam_limits.so 控制为用户分配的资源
pam_rootok.so 对管理员(uid=0)无条件允许通过
pam_userdb.so 设定独立用户帐号数据库认证
模块对应在系统中有说明文件,放在/usr/share/doc/pam-版本号/txt/下面,我机上的是
[root@server root]# cd /usr/share/doc/pam-0.75/txts/
[root@server txts]# ls
pam_appl.txt README.pam_ftp README.pam_shells
pam_modules.txt README.pam_limits README.pam_stack
pam.txt README.pam_listfile README.pam_stress
README README.pam_localuser README.pam_tally
README.pam_access README.pam_mail README.pam_time
README.pam_chroot README.pam_nologin README.pam_timestamp
README.pam_console README.pam_permit README.pam_unix
README.pam_cracklib README.pam_pwdb README.pam_userdb
README.pam_deny README.pam_rhosts README.pam_warn
README.pam_env README.pam_rootok README.pam_wheel
README.pam_filter README.pam_securetty README.pam_xauth
一个模块说明对应一个README。
看一下一些常用的认证应用程序,如login,就看/etc/pam.d/login,
#%PAM-1.0
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
session optional pam_console.so
前面三行是认证,其中第一个是使用pam_securetty.so来查看终端是否安全,可以查看上面的readme来看一下这个模块里面在干些什么,
pam_securetty:
Allows root logins only if the user is logging in on a
"secure" tty, as defined by the listing in /etc/securetty
Also checks to make sure that /etc/securetty is a plain
file and not world writable.
它说如果登陆安全终端只能让root登陆,安全终端在/etc/securetty中定义,还要检查这个文件是个普通文件,并且是全局不可写。这个模块通过了,然后是pam_stack.so,这个模块又调用子模块system-auth,同样看一下其中写了些什么,
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth required /lib/security/$ISA/pam_deny.so
account required /lib/security/$ISA/pam_unix.so
password required /lib/security/$ISA/pam_cracklib.so retry=3 type=
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5
shadow
password required /lib/security/$ISA/pam_deny.so
session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
这里涉及认证堆栈的概念,当系统在验证每个模块是否通过认证时,会将认证结果按顺序丢进堆栈里,而这里当pam_stack.so模块调用子模块systm-auth时,子模块又启用它自己的堆栈,认证后将结果返回父模块。这里system-auth先认证环境设置,然后是用pam_unix.so对用户名和密码进行认证,假若通过就足够了,不继续认证了,因为它是suffcient的认证方式,而如若未通过,则遇到pam_deny.so模块,这个模块是遇到任何用户都拒绝登陆的模块。再
回到login,下一个模块是pam_nologin.so,再看一下帮助文档,
# $Id: README,v 1.1.1.1 2000/06/20 22:11:46 agmorgan Exp $
#
This module always lets root in; it lets other users in only if the file
/etc/nologin doesn't exist. In any case, if /etc/nologin exists, it's
contents are displayed to the user.
它说这个模块只让root登陆,在/etc/nologin文件不存在的情况下才允许别的用户登陆,如果文件存在,该文件内容还会显示给用户看。