PAM可插拔身份额认证模块
简介:
Linux-PAM(Pluggable Authentication Modules for Linux.基于Linux的插入式验证模块)是一组共享库,使用这些模块,系统管理者可以自由选择应用程序使用的验证机制。也就是说,勿需重新编译应用程序就可以切换应用程序使用的验证机制。甚至,不必触动应用程序就可以完全升级系统使用的验证机制。
主要作用于管理工具和相关命令
配置文件
PAM包含了一组动态可加载库模块,这些模块控制单个应用程序如何验证用户
通过修改PAM配置文件,为不同管理使用工具自定义安全要求。
配置文件都在/etc/pam.d中
[root@xiaoagiao pam.d]# ls
chfn fingerprint-auth-ac password-auth-ac runuser smtp.postfix su-l vmtoolsd
chsh login polkit-1 runuser-l sshd system-auth
config-util other postlogin smartcard-auth su system-auth-ac
crond passwd postlogin-ac smartcard-auth-ac sudo systemd-user
fingerprint-auth password-auth remote smtp sudo-i vlock
每个配置文件都有一些模块,大多数模块在/usr/lib64/security下
在/usr/share/doc/pam-1.1.8/txts/以及html子目录下是每个模块的详细描述
- 以login文件为例
[root@xiaoagiao pam.d]# cat login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
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 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 required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
#服务类型 控制标记 模块名 参数
- /usr/lib64/security/
[root@xiaoagiao security]# ls
pam_access.so pam_faildelay.so pam_listfile.so pam_pwhistory.so pam_succeed_if.so pam_unix_session.so
pam_cap.so pam_faillock.so pam_localuser.so pam_pwquality.so pam_systemd.so pam_unix.so
pam_chroot.so pam_filter pam_loginuid.so pam_rhosts.so pam_tally2.so pam_userdb.so
pam_console.so pam_filter.so pam_mail.so pam_rootok.so pam_time.so pam_warn.so
pam_cracklib.so pam_ftp.so pam_mkhomedir.so pam_securetty.so pam_timestamp.so pam_wheel.so
pam_debug.so pam_group.so pam_motd.so pam_selinux_permit.so pam_tty_audit.so pam_xauth.so
pam_deny.so pam_issue.so pam_namespace.so pam_selinux.so pam_umask.so
pam_echo.so pam_keyinit.so pam_nologin.so pam_sepermit.so pam_unix_acct.so
pam_env.so pam_lastlog.so pam_permit.so pam_shells.so pam_unix_auth.so
pam_exec.so pam_limits.so pam_postgresok.so pam_stress.so pam_unix_passwd.so
配置文件内容解析
服务类型
- auth:身份验证管理(是否提供了有效的用户名和密码)
- account:账户管理,依据账户策略允许或拒绝访问。例如,可依据时间,口令有效 期限或者受限用户的列表来拒绝访问。
- psaawd:密码管理管理口令变更策略。
- session:会话管理,将设置应用于程序会话
控制标记
require | 如果模块运行成功,继续执行下一个类型的规则,如果失败,执行文件中下一个规则 |
---|---|
requisite | 如果模块失败,pam不会检查任何其他规则并停止执行 |
sufficient | 如果模块正常运行,PAM就不再继续执行这种类型的其他规则且结果会成功。如果检查失败,PAM会继续检查剩下的规则 |
optional | PAM忽略该规则的成功或失败 |
include | 包括所注明的配置文件中相同type的所有指令;例如指令是password include system-auth,它将包括PAM system-auth文件中的所有口令指令 |
1.基于pam_securetty.so模块限制root用户登录虚拟终端
/etc/securetty文件下包含了11个虚拟控制台访问指令,指定了允许root用户登录的tty设备,由/bin/login读取
[root@xiaoagiao pam.d]# cat /etc/securetty
console
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
ttyS0
ttysclp0
sclp_line0
3270/tty1
hvc0
hvc1
hvc2
hvc3
hvc4
hvc5
hvc6
hvc7
hvsi0
hvsi1
hvsi2
- 本文件只对root用户做出限制,若全部注释,root用户不可登录,普通用户不受影响,可以在普通用户下切换到root下。
- 若删除该文件,则root,普通用户都可登录所有终端
2. 基于pam_listefilte.os模块指定用户可以登录
实现只能root用户登录
:
- 在/etc/pam.d/login文件中添加 :
account required pam_nologin.so
- 创建文件 /etc/noligin:这个文件下的内容将在普通用户登录失败后显示。
结果:只有root用户可以的登录终端。
实现指定用户可以登录终端:
- 在/etc/pam.d/login文件中添加 :
account required pam_nologin.so
- 创建文件 /etc/noligin:这个文件下写入 pam_listfile.so模块
auth required pam_listfile.so item=user sense=deny file=/etc/myuser/user onerr=secceed
- 其中file文件指定了可以登录的用户名单
- 在/etc/myuser/user下写入可以登录的用户名单
结果:只有名单中的用户可以登录终端,其余用户拒绝
注:也可以通过pam_wheel.so模块实现对用户访问限制(在上一篇文章)
3. 基于pam_access.so模块实现限制用户登录,限制用户登录位置
一般的,/etc/securetty文件控制的是root的登录终端。比此文件更强大的是/etc/security/access.conf 文件,他控制所有用户的访问以及访问位置
-
要想使用access.config,需要在/etc/pam.d/login中添加pam_access.so模块.
account required pam_access.so
access.conf文件
………………
# User "foo" and members of netgroup "nis_group" should be
# allowed to get access from all sources.
# This will only work if netgroup service is available.
#+:@nis_group foo:ALL
#
# User "john" should get access from ipv4 net/mask
#+:john:127.0.0.0/24
#
# User "john" should get access from ipv4 as ipv6 net/mask
#+:john:::ffff:127.0.0.0/127
#
# User "john" should get access from ipv6 host address
#+:john:2001:4ca0:0:101::1
#
# User "john" should get access from ipv6 host address (same as above)
#+:john:2001:4ca0:0:101:0:0:0:1
#
# User "john" should get access from ipv6 net/mask
#+:john:2001:4ca0:0:101::/64
#
# All other users should be denied to get access from all sources.
#-:ALL:ALL
文件内容
permission : users : origins
permission | +或-,表示允许或访问 |
---|---|
users | 用户或组,all代表所有用户 |
origins | 登录地点,(local:本地,all:所有地点,console:控制台) |
实现过程
- /etc/pam.d/login中加入
account required pam_access.so
- /etc/pam.d/sshd中加入同样模块
account required pam_access.so
- 修改/etc/security/asscss.conf文件
添加
+:root:ALL #root可从任意位置进入
+:user1,user2:192.168.126 #允许user1,user2从192.168.126网段访问
-:ALL:ALL #其余全部拒绝
结果:
- root可从任何虚拟终端,伪终端登录系统
- user1,user2只能存在于192.168.42.1上的ssh客户端登录系统。
- user3不能登录