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. 验证配置
配置完成后,可以通过以下方式验证限制是否生效:
登录测试:
- 以目标用户登录(如
su - testuser
或通过 SSH)。 - 检查资源限制是否生效。
- 以目标用户登录(如
使用
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参数
- 检查日志:
- 查看
/var/log/auth.log
或/var/log/secure
,确认是否有错误或调试信息。
- 查看
5. 注意事项
- root 用户例外:默认情况下,
pam_limits.so
对root
用户的限制无效,除非明确配置。 - 优先级:
/etc/security/limits.d/*.conf
中的规则会覆盖/etc/security/limits.conf
。 - 服务重启:修改配置后,可能需要重启相关服务(如
sshd
)或重新登录才能生效。 - 系统默认值:如果未配置
pam_limits.so
,系统会使用内核默认限制(如/proc/sys/kernel/pid_max
)。
6. 实际应用场景
- 限制普通用户资源:防止用户运行过多进程或占用过多内存。
- 服务器安全:限制每个用户的登录会话数,防止暴力破解或资源滥用。
- 开发环境:为特定用户设置更高的文件描述符限制以支持开发需求。
示例:限制 SSH 用户的最大进程数
- 编辑
/etc/security/limits.conf
:
@sshusers hard nproc 20 - 编辑
/etc/pam.d/sshd
:
session required pam_limits.so - 重启 SSH 服务:
systemctl restart sshd - 测试:以
@sshusers
组的用户登录,尝试运行超过 20 个进程,应被阻止。