关于Linux PAM模块下的pam_listfile

讲《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_ERRPAM_SERVICE_ERR(视情况而定)。

额外的参数 apply= 可以用来限制上述规则的应用范围,仅对特定用户 (apply=username) 或特定组 (apply=@groupname) 生效。此限制仅在使用 ttyrhostshell 项目时有意义。

除了最后一个参数外,所有参数都应该是明确指定的;不要依赖任何默认行为。

此模块不会授予任何凭据。

选项

  • 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切到其他用户(包含本用户)也是不被允许的。

相关推荐
-Harvey14 分钟前
ubuntu为Docker配置代理
linux·ubuntu·docker
thehunters20 分钟前
win10 ubuntu 使用Android ndk 问题:clang-14: Exec format error
android·linux·ubuntu
Ven%1 小时前
如何让后台运行llamafactory-cli webui 即使关掉了ssh远程连接 也在运行
运维·人工智能·chrome·python·ssh·aigc
晚风_END1 小时前
node.js|浏览器插件|Open-Multiple-URLs的部署和使用,实现一键打开多个URL的强大工具
服务器·开发语言·数据库·node.js·dubbo
迷茫的小技术4 小时前
OSPF使能配置
运维·服务器·网络
soragui4 小时前
【Ubuntu】想知道怎么通过命令行查看笔记本电池健康程度吗?
linux·ubuntu·电脑
云计算DevOps-韩老师4 小时前
【网络云SRE运维开发】2025第2周-每日【2025/01/07】小测-【第7章 GVRP链路捆绑】理论和实操
服务器·网络·计算机网络·云计算·运维开发
码力全開4 小时前
C 语言奇幻之旅 - 第14篇:C 语言高级主题
服务器·c语言·开发语言·人工智能·算法
小学导航员4 小时前
centos服务器 /1ib64/libm.so.6: version “GLIBc 2.27’ not found 异常
linux·服务器·centos
揽星逐月酒微醺5 小时前
find 查找文件grep匹配数据
linux·运维·服务器