Linux 基于PAM的用户认证

任何要授予用户特权的程序都要能够进行用户认证。当您登入系统时,您需要提供用户名和口令,而后登入进程据此以检验登入的合法性---确认您就是该用户。还有除口令认证之外的其他认证形式,而且口令的存储方式也是各不相同的。

PAM(可 插拔认证模块)方式允许系统管理员设置多种认证措施而无须重新编译要进行认证的程序。使用PAM,您通过编辑一个配置文件来决定认证模块如何插入到程序之 中。大多数红帽子LINUX用户无须改动这个配置文件。因为如果使用RPM来安装程序的话,系统会自动做有关改动。但是,如果您想定制认证模块的话,就需 要理解配置文件内容。

PAM 模块

PAM定义了四种类型的模块。auth模块提供实际的认证过程, 可能是提示口令输入并检查输入的口令,设置保密字如用户组或KERBEROS通行证。account模块负责检查并确认是否可以进行认证(比如,帐户是否 到期,用户此时此刻是否可以登入,等等)。 password模块被用来设置口令。一旦用户认证通过,session模块将被用来做使用户使用其帐户前的初始化工作,如安装用户的HOME目录啦,使 能用户的电子邮箱啦,等等。这些模块可以堆叠,多次使用。比如:rlogin通常使用至少两种认证方法,如果“rhosts” 认证成功了,就允许建立连接,否则还要进行标准的口令认证。随时可以加入新的模块,而PAM感知的程序可以被配置来使用它。举个例子,如果您有一个一次性 口令计算系统,可以写出一个模块来(系统中包含有如何书写模块的文档资料),PAM感知的程序无须重新编译就可以使用这个新的一次性口令计算器。

服务

每个使用PAM的程序定义它自己的服务名称。login程序定义其服务类型为login,ftpd程序定义其服务类型为ftp,等等。一般来说,服务类型就是存取该服务的程序的名字,而不是提供服务的程序。

配置文件

目 录/etc/pam.d被用来配置所有的PAM应用程序。(在早期的PAM版本中用的是 /etc/pam.conf;但是若/etc/pam.d不存在的话,仍旧会找/etc/pam.conf,不过记住,这是一个过时的文件。)。每一个应 用程序(确切的说是服务)都有它自己的配置文件。

一个真实的文件可能如下:

#%PAM-1.0
auth      required  /lib/security/pam_securetty.so
auth      required  /lib/security/pam_pwdb.so shadow nullok
auth      required  /lib/security/pam_nologin.so
account  required  /lib/security/pam_pwdb.so
password  required  /lib/security/pam_cracklib.so
password  required  /lib/security/pam_pwdb.so shadow
nullok use_authtok
session  required  /lib/security/pam_pwdb.so

第一行是注释。任何以#开头的行都是注释。以下的三行排列着用于login认证的三个模块其中第一行用以确认用户是否以root登入,允许登 入的tty被列在文件/etc/securetty 中(如果文件存在的话)第二行将会使用户被提示输入口令并校验口令。第三行表示查文件/etc/nologin是否存在,如果存在就显示其内容,而且如果 用户不是root,则禁止其登入。即便第一个模块失败了,也要完成三个模块的校验。这是一种安全上的考虑 ---这种设计永远不要让用户知道他或她们为什么会被拒绝,否则会让其更容易突破认证。您可以将“required”改成“requisite”来修改这 种认证方式。也就是说,如果有任何“requisite”模块以失败返回,整个PAM认证将终止再调用其它模块也以失败返回。第五行表示任何必要的记帐信 息要被记载。例如,如果设置使用影子口令,pam_db.so 模块将被执行以检查该帐户是否失效或者用户口令是否超期而需要修改。第六行(该行需要折行来写)用以指定如果login程序改变用户的口令,它应当使用 pam_pwdb.so来完成。(这仅在auth模块检测到口令需要被改变时,例如一个影子口令已经过期时才使用)最后一行表示pam_pwdb.so模 块将被用来管理当前的会话过程。而目前该模块什么也不做;它可以被替换为别的所需的模块。要注意配置文件中每一行的顺序不是任意的。尽管required 模块以什么顺序被调用并没有多大关系,但是还有其它一些控制符,其中optional很少在红帽子LINUX中使用,而 sufficient 和requisite就要求行的顺序不能颠倒。

让我们来看一下rlogin的认证配置:

auth  required    /lib/security/pam_securetty.so
auth  sufficient  /lib/security/pam_rhosts_auth.so
auth  required    /lib/security/pam_pwdb.so shadow nullok
auth  required    /lib/security/pam_nologin.so

这和login的描述极为相似,但是其中比 login的多一行模块描述,而且模块的顺序也不同。首先,pam_securetty.so模块将禁止以root从不安全的终端登入。这将有效的阻止任 何root方式的远程登入。如果您不想禁止的话(在这种情况下,我们建议您的机器要么没和Internet 相连,要么呆在一个配置良好的防火墙后面),把这一行删掉就是了。其次,pam_nologin.so 模块将检查/etc/nologin,如上所述。第三点,如果pam_rhosts_auth.so模块认证通过,PAM就立即以成功返回而不再做任何口 令校验。如果pam_rhosts_auth.so认证失败,该失败将被忽略,继续调用pam_pwdb.so模块进行正常的口令认证。如果您在 securetty认证失败后不想让系统继续以口令询问的话,您可以把pam_securetty.so模块的required 改为 requisite。

相关推荐