讲《Linux下禁止root远程登录访问》故事的时候,说好会另开一篇讲讲pam_listfile。我们先看看pam_listfile的man文档怎么介绍的。
下面这些就好比人物的简介,甚是恼人;让人看得不明就里,反正"他大舅他二舅都是他舅"。可以直接跳到下面的示例环节,看如何使用的,直接参考就行了。
名称
pam_listfile - 基于任意文件允许或拒绝服务
概要
pam_listfile.so item=[tty|user|rhost|ruser|group|shell] sense=[allow|deny] file=/path/filename onerr=[succeed|fail] [apply=[user|@group]] [quiet]
描述
pam_listfile
是一个 PAM(可插拔认证模块)模块,它提供了一种基于任意文件来允许或拒绝服务的方法。
该模块会根据指定的类型获取项目:
user
:指定用户名,对应 PAM_USER;tty
:指定请求所经过的终端名称,对应 PAM_TTY;rhost
:指定发起请求的远程主机名称(如果有),对应 PAM_RHOST;ruser
:指定发起请求的远程用户名(如果可用),对应 PAM_RUSER;group
:指定用户所属的组;shell
:指定用户的登录 shell。
然后在 file=filename
中查找该项目。filename
文件中每行列出一个项目。如果找到了该项目,则根据 sense
参数决定操作:
- 如果
sense=allow
,则返回PAM_SUCCESS
,使授权请求成功; - 如果
sense=deny
,则返回PAM_AUTH_ERR
,使授权请求失败。
如果遇到错误(例如,文件不存在或参数构造不良),则根据 onerr
参数决定处理方式:
- 如果
onerr=succeed
,则返回PAM_SUCCESS
; - 如果
onerr=fail
,则返回PAM_AUTH_ERR
或PAM_SERVICE_ERR
(视情况而定)。
额外的参数 apply=
可以用来限制上述规则的应用范围,仅对特定用户 (apply=username
) 或特定组 (apply=@groupname
) 生效。此限制仅在使用 tty
、rhost
和 shell
项目时有意义。
除了最后一个参数外,所有参数都应该是明确指定的;不要依赖任何默认行为。
此模块不会授予任何凭据。
选项
-
item=[tty|user|rhost|ruser|group|shell]
要在文件中列出并检查的项目。 -
sense=[allow|deny]
如果在文件中找到项目时应采取的操作;如果未找到项目,则执行相反的操作。 -
file=/path/filename
包含每个项目一行的文件。文件需要是普通文件,并且不能是世界可写的。 -
onerr=[succeed|fail]
如果发生异常情况(如无法打开文件)时应采取的操作。 -
apply=[user|@group]
限制应用规则的用户类别。对于item=[user|ruser|group]
,这没有意义,但对于item=[tty|rhost|shell]
,它有意义。 -
quiet
不将服务拒绝或缺少列表文件视为需要记录的错误。
提供的模块类型
提供所有模块类型(auth, account, password 和 session)。
返回值
-
PAM_AUTH_ERR
认证失败。 -
PAM_BUF_ERR
内存缓冲区错误。 -
PAM_IGNORE
规则不适用于apply
选项。 -
PAM_SERVICE_ERR
服务模块中的错误。 -
PAM_SUCCESS
成功。
示例-vsftpd黑名单:禁止某些用户访问ftp服务
# 拒绝 /etc/ftpusers 文件中列出的用户访问 ftp 服务
auth required pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/vsftpd/ftpusers
注意,/etc/vsftpd/ftpusers
文件中列出的用户不允许访问 vsftp 服务。
示例-login白名单:只允许某些用户可以console登录用户
在 /etc/pam.d/login
中使用如下条目:
# 允许 /etc/loginusers 文件中列出的用户登录
auth required pam_listfile.so \
onerr=fail item=user sense=allow file=/etc/loginusers
在这个例子中,所有被允许使用登录服务的用户都应该列在 /etc/loginusers
文件中。除非你明确尝试锁定 root 用户,否则确保将 root 列入 /etc/loginusers
文件,或者列出能够切换到 root 账户的用户。
示例-sshd黑名单:不允许某些用户通过ssh登录
**前提:**当前sshd配置了UsePAM yes。
在 /etc/pam.d/sshd
中使用如下条目:
#%PAM-1.0
auth required pam_sepermit.so
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/sshd.deny onerr=succeed
auth include password-auth
该文件禁止访问ssh的黑名单列表:/etc/ssh/sshd.deny
在/var/log/secure日志文件中会记录相关日志(如下是在auth和session模块分别实验的日志记录,都有效!):
pam_listfile(sshd_bak:session): Refused user user1 for service sshd
pam_listfile(sshd_bak:auth): Refused user user1 for service sshd
示例-su目标用户白名单:只允许su到某些用户
在 /etc/pam.d/sshd
中使用如下条目:
auth required pam_wheel.so use_uid group=groupa
auth required pam_listfile.so item=user sense=allow onerr=fail file=/etc/security/su-groupa-access
该文件允许su切的白名单列表:/etc/security/su-groupa-access
如果文件中添加root,则只允许su切到root,如果su切到其他用户(包含本用户)也是不被允许的。