Pam模块

linux系统中的Pam模块为可热插拔的认证模块(*.so)

1、配置文件

# ls /etc/pam.d/
atd                  other              subscription-manager
authconfig           passwd             subscription-manager-gui
authconfig-gtk       password-auth      sudo
authconfig-tui       password-auth-ac   sudo-i
chfn                 polkit-1           su-l
chsh                 poweroff           system-auth
config-util          ppp                system-auth-ac
crond                reboot             system-config-authentication
cups                 remote             system-config-date
cvs                  rhn_register       system-config-kdump
dovecot              run_init           system-config-keyboard
eject                runuser            system-config-language
fingerprint-auth     runuser-l          system-config-network
fingerprint-auth-ac  selinux-polgengui  system-config-network-cmd
gdm                  setup              system-config-selinux
gdm-autologin        sfcb               system-config-users
gdm-fingerprint      smartcard-auth     vmware-authd
gdm-password         smartcard-auth-ac  vsftpd
gnome-screensaver    smtp               vsftpd_user
halt                 smtp.postfix       wireshark
ksu                  squid              xlock
liveinst             sshd               xserver
login                ssh-keycat
newrole              su

其中system-auth和password-auth配置文件是RHEL6实现用户名验证机制配置文件,大多数服务的配置将都会调用它们。


2、模块,如果是32为系统则路径是/lib/security/,如果是64为系统则在/lib64/security/目录下

# ls /lib64/security/
pam_access.so        pam_gnome_keyring.so  pam_namespace.so         pam_succeed_if.so
pam_cap.so           pam_group.so          pam_nologin.so           pam_tally2.so
pam_chroot.so        pam_issue.so          pam_oddjob_mkhomedir.so  pam_time.so
pam_ck_connector.so  pam_keyinit.so        pam_passwdqc.so          pam_timestamp.so
pam_console.so       pam_krb5              pam_permit.so            pam_tty_audit.so
pam_cracklib.so      pam_krb5afs.so        pam_postgresok.so        pam_umask.so
pam_debug.so         pam_krb5.so           pam_pwhistory.so         pam_unix_acct.so
pam_deny.so          pam_lastlog.so        pam_rhosts.so            pam_unix_auth.so
pam_echo.so          pam_limits.so         pam_rootok.so            pam_unix_passwd.so
pam_env.so           pam_listfile.so       pam_securetty.so         pam_unix_session.so
pam_exec.so          pam_localuser.so      pam_selinux_permit.so    pam_unix.so
pam_faildelay.so     pam_loginuid.so       pam_selinux.so           pam_userdb.so
pam_faillock.so      pam_mail.so           pam_sepermit.so          pam_warn.so
pam_filter           pam_mkhomedir.so      pam_shells.so            pam_wheel.so
pam_filter.so        pam_motd.so           pam_smbpass.so           pam_winbind.so
pam_fprintd.so       pam_mysql.la          pam_sss.so               pam_xauth.so
pam_ftp.so           pam_mysql.so          pam_stress.so


3、验证阶段

分四个验证管理阶段:不同的阶段完成整个用户登录到登录成功再到退出登录之前整个过程的管理,同一个阶段可以有多个模块来共同完成管理,但是这些模块都是依次从上往下的顺序进行,四个阶段必须是从auth-->account-->password--->session的顺序进行。每个阶段代表的意思如下:

(1)auth 验证授权阶段,验证用户是否存在,对应的密码是否正确
(2)account 验证帐号阶段,验证用户是否有效,是否被禁止登录或者是否被允许登录,帐号是否过期
(3)password 密码阶段,用户约束密码修改的时候策略以及和密码相关的任何操作
(4)session 会话阶段,用来约束用户成功登录系统之后的一切操作。

控制标记:
(1)required 必要条件,该模块必须通过验证,如果验证失败不会马上返回失败的结果,而是等同一个阶段后续的模块判断完成之后才返回失败的结果。


(2)requisite 必要条件,该模块必须通过验证,如果验证失败马上返回失败的结果,不会继续验证同一个阶段后续的模块。


(3)sufficient 充要条件,只要该条件成立,而且该条件前面的必要条件模块也成立了,那么马上返回成功结果,无需再继续验证同一个阶段后续的模块,如果该条件的模块验证失败,它就会变成可选条件,不影响整个阶段的验证,会继续完成后续的判断。


(4)optional 可选条件,不影响判断结果的条件


(5)include 包含指定的配置文件(相当于把对应的配置文件的同一个阶段的所有选项加载该行)


4、示例

例子1、禁止所有普通用户登录本地系统

(1)首先判断一下登录系统的过程涉及到的配置文件

/bin/login  ---> /etc/pam.d/login

(2)搜索需要用到的模块

# find /usr/share/man -iname "pam_*" | grep login
/usr/share/man/man8/pam_loginuid.8.gz
/usr/share/man/man8/pam_nologin.8.gz

此时我们可以看到禁用应该是使用pam_nologin模块,所以通过man文件查看此模块的用法

# man pma_nologin

(3)查看到man文件是需要在login文件中添加一行pam_nologin.so并且需要自己创建nologin文件

#%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

然后再创建nologin

# touch /etc/nologin

(4)认证,测试发现除了root可以登录之外,其他普通账户无法登录系统。


例子2、限制普通账户只能在上班时间通过ssh登录系统。

同样的利用上面的步骤方法进行配置

(1)涉及到的配置文件

/etc/pam.d/sshd

(2)涉及到的模块

[root@*** ~]# find /usr/share/man -iname "*pam_*" |grep time
/usr/share/man/man8/pam_timestamp_check.8.gz
/usr/share/man/man8/pam_time.8.gz
/usr/share/man/man8/pam_timestamp.8.gz

可以通过查看man文档,是pam_time是符合我们的需求,并且得知pam_time的使用方法

# man pam_time
............(省略其他代码)
DESCRIPTION
       The pam_time PAM module does not authenticate the user, but instead it
       restricts access to a system and or specific applications at various times
       of the day and on specific days or over various terminal lines. This
       module can be configured to deny access to (individual) users based on
       their name, the time of day, the day of week, the service they are
       applying for and their terminal from which they are making their request.
       By default rules for time/port access are taken from config file
       /etc/security/time.conf.
       If Linux PAM is compiled with audit support the module will report when it
       denies access.
EXAMPLES
           #%PAM-1.0
           #
           # apply pam_time accounting to login requests
           #
           login  account  required  pam_time.so
..............

通man知道需要配置/etc/security/time.conf和在/etc/pam.d/ssh中添加account required pam_time.so

(3)配置/etc/pam.d/ssh

# vim /etc/pam.d/sshd
#%PAM-1.0
auth       required     pam_sepermit.so
auth       include      password-auth
account    required     pam_nologin.so
account    required     pam_time.so
account    include      password-auth
..............

(4)配置/etc/security/time.conf

# vim /etc/security/time.conf
在里面添加一行
sshd;*;abc;Wk0800-1800 & !Wd0000-2400

此代码表示普通账户abc可以在工作时间早上8点到下午18点通过ssh登录系统的任何一个安全终端。


例子3、通过pam_tally2进行配置凡是通过ssh登录系统密码错误3次则锁定5分钟

(1)配置/etc/pam.d/sshd

# vim /etc/pam.d/sshd
#%PAM-1.0
auth       required     pam_sepermit.so
auth     required       pam_tally2.so deny=3 even_deny_root unlock_time=300
auth       include      password-auth
account    required     pam_nologin.so

(2)测试

通过ssh登录时3次错误密码则此账户被锁定,5分钟解锁。查看账户登录锁定情况

# pam_tally2
Login           Failures Latest failure     From
abc                 3    10/19/13 22:50:31  192.168.232.1

可以手动进行解锁。

# pam_tally2 -u abc -r
Login           Failures Latest failure     From
abc                 3    10/19/13 22:50:31  192.168.232.1