ubuntu18.04配置账户认证失败次数限制-高风险

这是 **高风险操作**——PAM 配置写错会导致所有用户(含 root)无法登录,包括 SSH。下面给出 Ubuntu 18.04 上的正确做法和风险防控。

## 重要修正:Ubuntu 18.04 应使用 pam_tally2.so

你给的说明里写"高版本使用 pam_faillock.so",但 **Ubuntu 18.04 的 libpam 版本是 1.1.8,并不包含 pam_faillock**(该模块需 libpam ≥ 1.4.0,Ubuntu 20.04+ 才有)。而 `pam_tally.so` 在 Ubuntu 18.04 中虽仍可用但已废弃。

**Ubuntu 18.04 正确选择是 `pam_tally2.so`。**

## 操作步骤

### Step 0:先备份(必做)

```bash
sudo cp /etc/pam.d/common-auth /etc/pam.d/common-auth.bak.$(date +%F)
sudo cp /etc/pam.d/common-account /etc/pam.d/common-account.bak.$(date +%F)
```

### Step 1:编辑 /etc/pam.d/common-auth

```bash
sudo vi /etc/pam.d/common-auth
```

找到 `auth` 开头的行区域,在靠近顶部(`pam_unix.so` 之前)添加一行:

```bash
auth  required  pam_tally2.so deny=5 unlock_time=600 even_deny_root audit
```

保存退出(`Esc` → `:wq`)。

参数说明:
| 参数 | 含义 |
|------|------|
| `deny=5` | 连续失败 5 次锁定 |
| `unlock_time=600` | 锁定 600 秒后自动解锁 |
| `even_deny_root` | root 也受限制(可选,按需) |
| `audit` | 失败事件写入 audit 日志 |

### Step 2:编辑 /etc/pam.d/common-account

```bash
sudo vi /etc/pam.d/common-account
```

在 `account` 区域添加:

```bash
account  required  pam_tally2.so
```

保存退出。

### Step 3:重启相关服务 / 不重启直接验证

PAM 配置无需重启服务即对新登录会话生效。

## ⚠️ 风险点

1. **最高风险:配置语法错误 → 全员无法登录**
   - 多一个空格、写错模块名、行顺序错误都可能导致 PAM 拒绝认证。
   - 典型错误:`pam_tally2.so` 写成 `pam_tally.so` 而模块实际不存在;或把 `auth` 行放到 `pam_unix.so` 之后导致计数不生效。

2. **even_deny_root 风险:root 被锁后无法用 sudo 解锁**
   - 若 root 也被锁,且 unlock_time 内无法登录,需要进入单用户模式。

3. **SSH 现有连接不受影响,但新连接会受策略约束**
   - 配置时务必保持当前 SSH 会话不断开。

4. **unlock_time 到期前无法登录**,影响运维响应。

## 验证方法(不要断开当前 SSH)

**新开一个终端**测试,原会话保持不动:

```bash
# 故意用错误密码登录 5 次
ssh testuser@localhost

# 查看锁定状态
sudo pam_tally2 --user=testuser

# 手动解锁(如果需要)
sudo pam_tally2 --user=testuser --reset
```

如果新会话正常,再用一个普通用户测一次错误密码锁定 → 等待解锁 → 正常登录,确认策略生效。

## 如果配置出错导致无法登录:单用户模式恢复

1. 重启服务器,GRUB 菜单按 `e`
2. 找到 `linux` 行,末尾追加:
   ```
   init=/bin/bash
   ```
3. `Ctrl+X` 启动进入单用户 shell
4. 重新挂载根目录可写:
   ```bash
   mount -o remount,rw /
   ```
5. 恢复备份:
   ```bash
   cp /etc/pam.d/common-auth.bak.<日期> /etc/pam.d/common-auth
   cp /etc/pam.d/common-account.bak.<日期> /etc/pam.d/common-account
   ```
6. 重启:
   ```bash
   sync
   reboot -f
   ```

## 建议的安全做法

- **先在测试机验证**,再推到生产。
- 配置前 **保留至少一个已登录的 root SSH 会话** 不要关闭。
- 备份文件命名带日期,方便回滚。
- 如果不要求 root 也受锁定,**去掉 `even_deny_root`**,保留 root 作为应急通道。


Revision #1
Created 3 July 2026 01:14:46 by Admin
Updated 3 July 2026 01:15:35 by Admin