跳转至

Linux 开启 OTP 认证

1. 安装 google-authenticator

CentOS 运行:

sudo yum install epel-release
sudo dnf install google-authenticator qrencode qrencode-libs

2. 配置令牌

直接使用 google-authenticator 配置(此处配置的是当前用户令牌):

google-authenticator

3. 配置 PAM

编辑 /etc/pam.d/sshd

auth required pam_google_authenticator.so

4. 配置 sshd 使用二次验证

修改 /etc/ssh/sshd_config 配置,加入:

AuthenticationMethods publickey,keyboard-interactive

找到 /etc/ssh/sshd_config.d/50-redhat.conf 并注释以下行:

ChallengeResponseAuthentication no

检查配置无误后重启 sshd 服务:

sudo sshd -t && sudo systemctl restart sshd

此时 SSH 登录会变成需要公钥、密码和二次认证码,如果要求只要公钥和二次认证码,找到 /etc/pam.d/sshd 并注释:

auth       substack     password-auth

5. 为 ProxyJump 跳板用户免除 OTP

如果需要新建一个专用于 SSH ProxyJump 的用户(如 proxy),该用户仅做端口转发跳板、不分配 shell、不需要 OTP,其他用户仍走公钥 + OTP 双因素认证,按以下步骤配置。

5.1 1. 创建 proxy 用户

sudo useradd -m -s /sbin/nologin proxy

Note

-s /sbin/nologin 使该用户无法获得 shell,但 SSH ProxyJump(端口转发)不需要 shell 也能正常工作。

5.2 2. 修改 PAM 配置:proxy 用户跳过 OTP

编辑 /etc/pam.d/sshd,将原来的:

auth required pam_google_authenticator.so

改为:

1
2
3
# proxy 用户跳过 OTP,其他用户必须 OTP
auth [success=done default=ignore] pam_succeed_if.so user = proxy
auth required pam_google_authenticator.so
  • pam_succeed_if.so user = proxy — 如果当前用户是 proxysuccess=done 直接跳过后续 auth 模块(OTP 被跳过)
  • 其他用户匹配 default=ignore,继续走下一行 pam_google_authenticator.so

5.3 3. 修改 sshd_config:proxy 用户仅需公钥

/etc/ssh/sshd_config 中,AuthenticationMethods 下方增加 Match 块:

# 普通用户:公钥 + OTP
AuthenticationMethods publickey,keyboard-interactive

# proxy 用户:仅公钥即可
Match User proxy
    AuthenticationMethods publickey
    AllowTcpForwarding yes
    X11Forwarding no
    PermitTTY no
    GatewayPorts no

5.4 4. 为 proxy 用户配置公钥

1
2
3
4
5
sudo mkdir -p /home/proxy/.ssh
sudo cp /path/to/authorized_keys /home/proxy/.ssh/authorized_keys
sudo chown -R proxy:proxy /home/proxy/.ssh
sudo chmod 700 /home/proxy/.ssh
sudo chmod 600 /home/proxy/.ssh/authorized_keys

Note

proxy 用户不需要运行 google-authenticator,PAM 层已经跳过了 OTP 验证。

5.5 5. 验证并重启

sudo sshd -t && sudo systemctl restart sshd

5.6 使用示例

在其他机器的 ~/.ssh/config 中通过跳板机连接目标服务器:

1
2
3
4
Host via-proxy
    HostName target.example.com
    ProxyJump proxy@jump-server
    IdentityFile ~/.ssh/id_ed25519

5.7 安全要点

措施 作用
-s /sbin/nologin proxy 用户无法获得 shell
PermitTTY no 禁止分配终端
Match User proxy + AuthenticationMethods publickey 仅需公钥,无 OTP
不为 proxy 生成 OTP secret 纵深防御,即使 PAM 配置出错也无法通过 OTP 认证

Warning

DisablePTTY 不是 OpenSSH 合法指令,不要使用,PermitTTY no 已足够。