QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1802|回复: 1

标题: RHEL5 插入认证模块(PAM)详解

[复制链接]
发表于 2009-2-13 15:17:17 | 显示全部楼层 |阅读模式
基于Pluggable Authentication Modules(可插入验证模块,简称PAM)的验证机制,可将系统特定应用程序使用权限制于root账户。不同的Module可以实现系统管理员按照用户、密码或者登入位置设置访问控制策略。

PAM所有的认证函数库存放于/lib/security/pam_*.so,并由/etc/pam.d/目录下对应的文件进行调用。在验证请求时,应用程序通过libpam函数库来提供服务。具体使用哪些PAM函数库进行验证,则由/etc/pam.d/目录下对应的设置文件决定。libpam提供函数共享服务,而且可以动态载入。

1 PAM工作机制

/lib/security目录下的每一个认证模块都会返回pass或者fail结果,部分程序使用/etc/security目录下的设置文件决定认证方式。应用程序调用PAM模块认证的配置,存放于/etc/pam.d,文件名与应用程序名对应,文件中的每一行都会返回一个成验证功还是失败的控制标志,以决定用户是否拥有访问权限。

2 PAM验证类型

    * auth 验证使用者身份,提示输入账号和密码
    * account 基于用户表、时间或者密码有效期来决定是否允许访问
    * password 禁止用户反复尝试登录,在变更密码时进行密码复杂性控制
    * session 进行日志记录,或者限制用户登录的次数

libpam函数库会可以调用以上一种服务或者全部。

3 PAM验证控制类型(Control Values)

验证控制类型也可以称做Control Flags,用于PAM验证类型的返回结果。

    * required 验证失败时仍然继续,但返回Fail(用户不会知道哪里失败)
    * requisite 验证失败则立即结束整个验证过程,返回Fail
    * sufficient 验证成功则立即返回,不再继续,否则忽略结果并继续
    * optional 无论验证结果如何,均不会影响(通常用于session类型)

        代码:
       
验证结果对照表
┌──────────┬──────┬─────────────┬────────────────┐
│          │Result│Keep testing?│       Affect   │
├──────────┼──────┼─────────────┼────────────────┤
│          │Pass  │     Y       │Define by system│
│Required  │Fail  │     Y       │Fail            │
├──────────┼──────┼─────────────┼────────────────┤
│Requisite │Pass  │     Y       │Define by system│
│          │Fail  │     N       │Fail            │
├──────────┼──────┼─────────────┼────────────────┤
│Sufficient│Pass  │     N       │Define by system│
│          │Fail  │     Y       │Ignore          │
└──────────┴──────┴─────────────┴────────────────┘

验证示例1
┌─────┬────────┬───────┬─────┬─────┬─────┐
│     │        │       │user1│user2│user3│
├─────┼────────┼───────┼─────┼─────┼─────┤
│Auth │Required│Module1│Pass │Fail │Pass │
├─────┼────────┼───────┼─────┼─────┼─────┤
│Auth │Required│Module2│Pass │Pass │Fail │
├─────┼────────┼───────┼─────┼─────┼─────┤
│Auth │Required│Module3│Pass │Pass │Fail │
├─────┴────────┴───────┼─────┼─────┼─────┤
│       Result         │Pass │Fail │Fail │
└──────────────────────┴─────┴─────┴─────┘

验证示例2
┌─────┬──────────┬───────┬─────┬─────┬─────┐
│     │          │       │user1│user2│user3│
├─────┼──────────┼───────┼─────┼─────┼─────┤
│Auth │Required  │Module1│Pass │Fail │Pass │
├─────┼──────────┼───────┼─────┼─────┼─────┤
│Auth │Sufficient│Module2│Pass │Pass │Fail │
├─────┼──────────┼───────┼─────┼─────┼─────┤
│Auth │Required  │Module3│ N/A │ N/A │Pass │
├─────┴──────────┴───────┼─────┼─────┼─────┤
│       Result           │  T  │  F  │  T  │
└────────────────────────┴─────┴─────┴─────┘


4 /etc/pam.d目录中的配置文件

每一个配置文件均有四栏:第一栏验证类型,第二栏验证控制标准,第三栏调用的PAM模块,第四栏为使用的参数。

module_type control_flag module_location arguments

每一行记录均是一个阶段性的测试。
        代码:
       
[root@wardking ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# 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

account     required      pam_unix.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so


auth与account调用的模块直接影响到用户是否可以执行程序。

password是在用户更改密码时使用。

session用于记录用户验证成功以后的操作记录。

5 pam_stack特殊模块

当有多个应用程序需要使用相同的验证模块时,可以编辑一个pam设置文件,定义共同调用的模块,存储于/etc/pam.d目录中,供应用程序调用。例如system-auth设置文件,可以供不同的应用程序调用,如果对其进行修改,可以变更系统验证策略。

6 pam_unix模块

可以调用传统的NSS系统,即libnss函数库。可以用于PAM的四种验证方式,使用auth方式可以取得用户的密码,使用accont方式检查用户的密码是否已经过期,,使用password方式可以检查用户在修改密码时进行控制,使用session方式记录用户登录登出日志。

7 网络验证

可以通过网络登录方式来验证用户

    * pam_krb5(Kerberos V tickets)
    * pam_ldap(LDAP binds)
    * pam_smb_auth(old SMB authentication)
    * pam_winbind(SMB throuth winbind)

某些名称服务也可以通过pam_unix调用libnss函数库中的模块进行验证(NIS, Some LDAP configurations),而不一定使用以上的四个模块

8 认证模块

pam_security模块只会对root有影响。当root账户登录时,pam_security会参考/etc/securetty目录中的console列表,以决定root是否可以登录,避免用户从不安全的终端登录。

pam_nologin模块会确认/etc/nologin文件是否存在,如果存在,普通用户则会验证失败,只允许root用户登录。

pam_listfile模块会确认要求登录的用户账号与允许的账号名单是否冲突,必须建立一个允许登录或者拒绝登录的名单。

auth required pam_listfile item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

9 增强用户密码安全性

pam_unix有两个参数,可以增强用户密码安全性

    * pam_unix MD5 passwords 使用MD5编码进行加密
    * pam_unix shadow passwords 将加密后的密码存放于/etc/shadow文件中,并且限制普通用户访问,而且限制用户密码有效期

还有其它的模块可以起到类似作用,比如pam_krb5

10 密码安全性原则


可以定义普通用户设置密码时必须遵行一定的策略。

    * password history记录用户曾经使用过的密码
      pam_unix with remember=N (记录用户使用过的前N个密码,并且禁止再次使用这些密码)

    * pasword length 密码长度及复杂性
      pam_cracklib模块规定用户必须使用大小写字母、数字、特殊符号做为密码,而且不能是字典中的单词
      pam_passwdqc模块与cracklib类似,只是不检查字典中的单词

    * failed login monitoring 监控用户登录失败的次数
      pam_taily登录失败次数过多,则锁定账号

11 pam_limit

pam_limit 限制用户可以使用的系统资源,调用 /etc/security/limits.conf文件,限制用户使用的内存、可以启用多少线程
        代码:
       
#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4


可以使用ulimit覆盖soft设置项,但是仍然受限于hard

12 pam_console

pam_console模块:当用户登录到console后,将拥有部分特别权限。这些权限在/etc/security/console.apps目录中定义。

例如:用户登录后拥有重新启动计算机的权限

        代码:
       
[root@wardking ~]# cat /etc/security/console.apps/reboot
FALLBACK=true


也可以用在auth验证类型中,用户在本地成功登录后,就会拒绝其它远程登录请求。

13 其它程序调用PAM

除用户登录验证以外,在普通用户使用系统管理工具时,也需要提供验证,例如su, reboot, system-*工具等。

pam_rootok模块用来确认用户是否是root身份

pam_timestamp模块用于记录用户执行sudo的时间间隔,如果在5分钟之内验证成功,则直接通过验证,而不再需要输入密码

pam_xauth模块用于将验证的临时文件转发给其它程序

14 实例分析

        代码:
       
[root@wardking ~]# cd /etc/pam.d
[root@wardking pam.d]# cat config-util
#%PAM-1.0
auth            sufficient      pam_rootok.so
auth            sufficient      pam_timestamp.so
auth            include         system-auth
account         required        pam_permit.so
session         required        pam_permit.so
session         optional        pam_xauth.so
session         optional        pam_timestamp.so


/etc/pam.d/config-util是一个pam_stack类型的特殊模块,提供给system-config-*等多个应用程序共同调用。

auth sufficient pam_rootok.so

这一条命令将检查用户的身份,调用pam_rootok.so模块,如果被验证的用户是root,则返回Pass。如果不是root用户,则返回Fail。由于此条命令使用sufficient控制标志,即使验证失败也将执行后续命令。

auth sufficient pam_timestamp.so

如果第一条命令验证失败,则可以断定当前被验证用户是普通用户。因此在第二条命令中使用pam_timestamp.so模块,检查该用户是否在5分钟之内成功运行了sudo命令,如果是返回Pass,否则返回Fail。这条命令同样使用了sufficient控制标志,因此在验证失败时仍将执行后续命令。

auth include system-auth

第三条命令使用pam_stack.so模块,调用当前目录下的system-auth配置文件。system-auth定义了较多的PAM命令语句,其主要作用是提示普通用户输入root账号的密码。

account required pam_permit.so

第四条命令以account类型调用pam_permit.so模块,基于当前账户的有效性(账户是否禁用或者过期)来允许或者拒绝访问。由于该条命令以required控制标志执行,如果验证结果仍然Fail,则整个过程验证失败。

最后三条session命令,将对整个验证过程进行日志记录,写入到/var/log/secure中。

15 故障检测

当系统验证出现问题时,首先应当检查/var/log/messages或者/var/log/secure中的输出信息,根据这些信息判断用户账号的有效性。如果是因为PAM验证故障,而引起root也无法登录,只能使用single user或者rescue模式进行排错。
 楼主| 发表于 2009-2-13 15:17:40 | 显示全部楼层
再增加一个例子。

引用:
[root@server1 ~]# 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 include system-auth
session required pam_loginuid.so
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
session optional pam_keyinit.so force revoke
这是一个用户登录验证文件。当普通用户从终端或者网络登录的时候,第2, 3行将要求输入用户名和密码。第三行调用pam_nologin.so模块,将检测/etc/目录下是否存在nologin文件,如果/etc /nologin文件存在,不论其内容,则普通用户将无法登录。

由于使用required验证类型,即使用户无法登录,系统仍会执行后继验证代码,使用session验证类型记录用户尝试登录信息。可以查看/var/log/secure日志中的内容,将有pam_unix相关的记录行。

实验
1. 使用root账户登录,在/etc/目录下创建nologin文件
引用:
[root@server1 ~]# touch /etc/nologin
按下Alt+F3切换到另一终端,使用系统内任一普通账户进行登录(如果没有普通账户,请自行添加)。在输入账户名后,系统仍然要求密码验证,但是输入正确的密码后立即返回登录界面,并不给出任何提示信息。

2. 按下Alt+F1,返回root账号登录终端,注释/etc/pam.d/login文件中pam_nologin.so一行。
引用:
#account required pam_nologin.so
再次按下Alt+F3,使用普通账户即可以登录。

实验完毕后,请恢复/etc/pam.d/login文件至原始,然后删除 /etc/nologin文件。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-29 08:31 , Processed in 0.140731 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表