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

相关推荐
liulilittle19 分钟前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
小阳睡不醒2 小时前
小白成长之路-部署Zabbix7(二)
android·运维
mCell2 小时前
从删库到跑路?这50个Linux命令能保你职业生涯
linux·windows·macos
杰克逊的日记2 小时前
GPU运维常见问题处理
linux·运维·gpu
caolib3 小时前
无需云服务器的内网穿透方案 -- cloudflare tunnel
运维·服务器·内网穿透·tunnel·cloudflared
奇舞精选3 小时前
k8s基本概念初探
运维
誰能久伴不乏3 小时前
Linux系统调用概述与实现:深入浅出的解析
linux·运维·服务器
程序员学习随笔4 小时前
Linux进程深度解析(2):fork/exec写时拷贝性能优化与exit资源回收机制(进程创建和销毁)
linux·运维·服务器
mmoyula4 小时前
【RK3568 PWM 子系统(SG90)驱动开发详解】
android·linux·驱动开发
-SGlow-4 小时前
MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
linux·运维·服务器·数据库·mysql