pam(2)-pam_limits.so

在 Linux 系统中,pam_limits.so 是 PAM(Pluggable Authentication Modules)框架中的一个模块,用于在用户登录时应用资源限制。它通过读取 /etc/security/limits.conf 文件或 /etc/security/limits.d/ 目录下的配置文件,设置用户或组的系统资源使用限制,例如最大进程数、内存使用量、打开文件数等。

  • /etc/security/limits.conf
  • /etc/security/limits.d/xxx.conf

1. 模块功能

pam_limits.so 属于 session 模块类型,主要在用户会话建立时生效。它通过调用 setrlimit() 系统调用,限制用户的资源使用。这些限制可以防止单个用户或进程过度消耗系统资源,确保系统稳定性。


2. 配置文件

pam_limits.so 的限制规则通常定义在以下文件中:

  • 主配置文件/etc/security/limits.conf
  • 扩展配置文件目录/etc/security/limits.d/*.conf(优先级高于主配置文件)

配置文件中的每行规则格式如下:

<domain> <type> <item> <value>
  • **<domain>**:应用限制的目标,可以是用户名、组名(以 @ 开头,如 @group)、或通配符 *
  • **<type>**:限制类型:
    • soft:软限制,用户可以超过但会收到警告。
    • hard:硬限制,用户无法超过。
    • -同时设置软硬限制
  • **<item>**:限制的资源类型(见下表)。
  • **<value>**:限制的具体数值(可以是数字或 unlimited)。

常用资源类型(<item>

<item> 说明 示例值
core 核心转储文件大小 (KB) 0, unlimited
data 数据段大小 (KB) 102400
fsize 最大文件大小 (KB) 204800
memlock 锁定内存大小 (KB) 65536
nofile 最大打开文件数 1024
rss 驻留集大小 (KB) 8192
stack 栈大小 (KB) 8192
cpu CPU 时间 (分钟) 60
nproc 最大进程数 50
as 地址空间大小 (KB) unlimited
maxlogins 最大登录会话数 4
priority 进程优先级 -10

示例配置(/etc/security/limits.conf

# 限制用户 "testuser" 的最大进程数为 50
testuser hard nproc 50

# 限制 "students" 组的最大打开文件数为 1024
@students soft nofile 1024
@students hard nofile 1024

# or
#@students - nofile 1024

# 限制所有用户(除 root)的最大登录会话数为 4
* hard maxlogins 4

# 设置用户 "dev" 的栈大小为 8MB
dev - stack 8192

3. 在 PAM 中启用 pam_limits.so

要让 pam_limits.so 生效,需要在相关服务的 PAM 配置文件中添加调用。通常在 /etc/pam.d//etc/pam.conf 中配置。

示例 1:针对特定服务(如 sshd

编辑 /etc/pam.d/sshd

session    required   pam_limits.so

这表示每次通过 SSH 登录时,pam_limits.so 都会加载并应用 /etc/security/limits.conf 中的限制。

示例 2:全局生效

编辑 /etc/pam.d/common-session(适用于 Debian/Ubuntu 系统):

session    required   pam_limits.so

或编辑 /etc/pam.conf(适用于基于全局配置的系统):

session    required   pam_limits.so

参数选项

pam_limits.so 支持一些可选参数,例如:

  • conf=/path/to/file:指定自定义限制配置文件路径。
  • debug:启用调试模式,输出详细信息到日志。
  • utmp_early:提前处理用户会话记录。

示例:

session    required   pam_limits.so conf=/etc/custom_limits.conf debug

4. 验证配置

配置完成后,可以通过以下方式验证限制是否生效:

  1. 登录测试

    • 以目标用户登录(如 su - testuser 或通过 SSH)。
    • 检查资源限制是否生效。
  2. 使用 ulimit 命令

    • 在用户会话中运行 ulimit -a,查看当前限制。
      示例输出:
    $ ulimit -a
    core file size          (blocks, -c) 0
    max locked memory       (kbytes, -l) 65536
    open files                      (-n) 1024
    max user processes              (-u) 50
    

ulimit参数
02fc2ba3185dffbb57f65a6baa7d5a3a.png

  1. 检查日志
    • 查看 /var/log/auth.log/var/log/secure,确认是否有错误或调试信息。

5. 注意事项

  • root 用户例外:默认情况下,pam_limits.soroot 用户的限制无效,除非明确配置。
  • 优先级/etc/security/limits.d/*.conf 中的规则会覆盖 /etc/security/limits.conf
  • 服务重启:修改配置后,可能需要重启相关服务(如 sshd)或重新登录才能生效。
  • 系统默认值:如果未配置 pam_limits.so,系统会使用内核默认限制(如 /proc/sys/kernel/pid_max)。

6. 实际应用场景

  • 限制普通用户资源:防止用户运行过多进程或占用过多内存。
  • 服务器安全:限制每个用户的登录会话数,防止暴力破解或资源滥用。
  • 开发环境:为特定用户设置更高的文件描述符限制以支持开发需求。

示例:限制 SSH 用户的最大进程数

  1. 编辑 /etc/security/limits.conf
    @sshusers hard nproc 20
  2. 编辑 /etc/pam.d/sshd
    session required pam_limits.so
  3. 重启 SSH 服务:
    systemctl restart sshd
  4. 测试:以 @sshusers 组的用户登录,尝试运行超过 20 个进程,应被阻止。