PAM limits 是什么
limits.conf 由 PAM 的 pam_limits 模块读取,为登录会话设置用户级资源上限,例如进程数、打开文件数、并发登录会话数与核心转储大小。它能限制单个账号把主机资源耗尽的行为,比如 fork 炸弹,属于认证会话加固的一部分;但对不经过 PAM 的进程以及 systemd 托管的服务无效。
基本信息
| 加固项 | 会话级资源约束 |
|---|---|
| 适用平台 | Linux(pam_limits,主流发行版通用) |
| 风险等级 | 低 |
| 配置文件 | /etc/security/limits.conf 与 limits.d 目录 |
| 生效范围 | 经 PAM 建立的登录会话 |
典型使用场景
- 多用户主机:限制单账号可创建的进程数,抑制 fork 炸弹
- 跳板机:限制并发登录会话数,降低账号被共用的风险
- 服务账号:按应用实际需求设置打开文件数上限
- 合规核查:确认关键限制项存在且不是默认的无限制
- 排障定位:应用报打开文件数过多时,区分会话限制与服务限制
基线示例与生效核验
基线示例与生效核验
# 写入 /etc/security/limits.d/90-baseline.conf
* hard nproc 4096 # 单用户最大进程数
* hard nofile 65535 # 单用户最大打开文件数
* hard maxlogins 10 # 并发登录会话数
@dev hard core 0 # 关闭开发组的核心转储
# 生效核验(限制只对新会话生效,必须重新登录)
ulimit -u; ulimit -n
su - testuser -c 'ulimit -u'限制项判读
| 限制项 | 含义 | 注意点 |
|---|---|---|
| nproc | 单用户最大进程数 | 对已存在的进程不生效 |
| nofile | 单用户最大打开文件数 | 与 systemd 的 LimitNOFILE 相互独立 |
| maxlogins | 并发登录会话数上限 | 连接复用不计入新会话 |
| core | 核心转储大小 | 置 0 可避免转储泄密 |
systemd 托管的服务走 unit 里的 LimitXXX 配置,不受 limits.conf 约束:应用侧的限制要在 unit 文件里设置。
限制只对新建会话生效:改完文件后要重新登录再验证,否则读到的仍是旧值。
落地检查点
- 先统计现有会话的实际取值,再决定限制值,避免直接照搬模板把业务压垮
- 把限制写入 limits.d 目录下的独立文件,便于版本管理与逐项回退
- 服务侧的限制同时检查 systemd unit 的 Limit 配置,两边口径保持一致
- 对 service 账号按应用文档设置 nofile,并在变更记录中注明依据
- 把 nproc、nofile、core 三项纳入季度基线核查,确认未被放宽