怎样用脚本启用SSH双因素认证?

wen 实用脚本 1

怎样用脚本启用SSH双因素认证?从零搭建安全堡垒

目录导读

  • 为什么需要双因素认证:理解SSH风险与2FA价值
  • 核心组件解析:Google Authenticator + PAM模块
  • 全自动脚本编写:一键部署与配置
  • 实战问答:常见故障与优化技巧
  • 安全最佳实践:备份、恢复与合规建议

为什么需要双因素认证?

问:SSH只有密码/密钥就足够安全了吗?
答:仅依赖密码存在暴力破解、凭据泄露风险;密钥虽强,但若私钥被盗(如终端感染木马),攻击者可直达服务器,双因素认证(2FA)要求“你知道的(密码/密钥)”+“你拥有的(一次性验证码)”,显著提升防护。

怎样用脚本启用SSH双因素认证?

问:双因素认证会降低运维效率吗?
答:通过脚本自动化配置,日常使用仅需额外输入6位动态码,而整体安全性提升数十倍,适合生产环境、跳板机、暴露公网的服务器。


核心组件:Google Authenticator + PAM模块

  • Google Authenticator(PWA):开源TOTP(基于时间的一次性密码)生成器,支持手机App或命令行客户端。
  • libpam-google-authenticator:PAM(可插拔认证模块)插件,用于SSH登录时校验动态码。

原理流程
SSH连接 → 验证密码/密钥 → PAM模块要求输入6位验证码 → 校验通过则放行。


全自动脚本编写:一键启用SSH 2FA

以下脚本适用于Ubuntu 18.04+/Debian 10+/CentOS 7+(需调整包管理器)。请以root或具有sudo权限的用户执行

(保存为 enable_ssh_2fa.sh

#!/bin/bash
# ========================================
# SSH双因素认证自动部署脚本 v2.1
# 兼容:Ubuntu/Debian/CentOS/RHEL
# ========================================
set -e
# 颜色提示
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
echo -e "${GREEN}[*] 开始部署SSH双因素认证...${NC}"
# 步骤1:检测操作系统并安装依赖
if [ -f /etc/debian_version ]; then
    apt update
    apt install -y libpam-google-authenticator python3-qrcode
elif [ -f /etc/redhat-release ]; then
    yum install -y epel-release
    yum install -y google-authenticator libpam-google-authenticator qrencode
else
    echo -e "${RED}[!] 不支持的OS${NC}"
    exit 1
fi
# 步骤2:配置PAM模块
echo -e "${GREEN}[*] 配置SSHD的PAM策略...${NC}"
sed -i 's/^@include common-auth/#@include common-auth/' /etc/pam.d/sshd
echo "auth required pam_google_authenticator.so" >> /etc/pam.d/sshd
# 步骤3:修改SSHD配置
echo -e "${GREEN}[*] 修改SSH服务配置...${NC}"
sed -i 's/^#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#UsePAM yes/UsePAM yes/' /etc/ssh/sshd_config
sed -i 's/^UsePAM no/UsePAM yes/' /etc/ssh/sshd_config
# 步骤4:为用户初始化密钥(必须为每个用户单独执行)
for user in $(who | awk '{print $1}' | sort -u); do
    echo -e "${GREEN}[*] 为用户 $user 生成密钥...${NC}"
    su - $user -c "google-authenticator -t -d -r3 -R30 -W -s ~/.google_authenticator"
    echo -e "${GREEN}  密钥位于:~/.google_authenticator${NC}"
    echo -e "${GREEN}  请使用手机App扫描生成的二维码,或手动输入密钥${NC}"
done
# 步骤5:重启SSH服务
echo -e "${GREEN}[*] 重启SSH服务...${NC}"
systemctl restart sshd || service ssh restart
echo -e "${GREEN}[✓] 部署完成!请保留当前会话并新开终端测试连接。${NC}"
echo -e "${RED}[!] 警告:如果当前未测试通过,请勿关闭此会话!${NC}"

使用说明

  1. 上传脚本至服务器:scp enable_ssh_2fa.sh user@host:~
  2. 执行:sudo bash enable_ssh_2fa.sh
  3. 脚本会自动为当前登录用户生成TOTP密钥,并打印二维码或密钥字符串。
    • 手机端:安装Google Authenticator / Authy / Microsoft Authenticator,扫描二维码。
    • 命令行客户端:使用oathtool --totp -b <base32密钥> 生成验证码。

实战问答:常见故障与优化

Q1:启用双因素后,密钥登录失效怎么办?

A:检查/etc/ssh/sshd_config确保AuthenticationMethods publickey,keyboard-interactive(优先密钥+2FA),若仅需密码+2FA,可配置为password,keyboard-interactive注意:建议保留密钥作为第一因素,2FA作为第二因素。

Q2:无法扫描二维码(纯终端环境)?

Agoogle-authenticator会输出密钥字符串(如JBSWY3DPEHPK3PXP)和应急恢复码,可直接在手机App手动输入密钥,或通过qrencode重新生成二维码。

Q3:如何为特定用户排除2FA(如自动化工具)?

A:在PAM配置中新增规则,跳过特定组的2FA校验,例如为backup组豁免:

auth [success=1 default=ignore] pam_succeed_if.so user ingroup backup
auth required pam_google_authenticator.so

并将自动化工具的用户加入backup组:usermod -aG backup automation-user

Q4:验证码始终无效(时间不同步)?

A:确保服务器时间同步(安装ntpchrony):

  • Ubuntu:apt install ntp -y && systemctl enable ntp
  • CentOS:yum install chrony -y && systemctl enable chronyd
    手机时间也应自动同步。

Q5:如何批量重置已失效用户的密钥?

A:删除用户家目录的.google_authenticator文件,重新执行初始化:

rm /home/<user>/.google_authenticator
su <user> -c "google-authenticator -t -d -r3 -R30 -W"

安全最佳实践与合规建议

  1. 保留一条应急通道
    在完全部署2FA前,确保至少保留一个SSH会话不关闭,或通过带外管理(如IPMI、iDRAC)访问,防止误配置导致锁死。

  2. 生成并安全存储恢复码
    google-authenticator会打印5个一次性恢复码(每个仅可使用一次),建议:

    • 保存在离线密码管理器(如KeePass)。
    • 打印并密封在保险柜。
    • 绝不能截屏或存入邮箱。
  3. 结合密钥认证
    建议使用ed25519密钥对 + TOTP双因素,禁用密码登录(PasswordAuthentication no),形成“硬件密钥+动态码”双保险。

  4. 日志审计
    检查/var/log/secure(CentOS)或/var/log/auth.log(Ubuntu)中pam_google_authenticator的拒绝记录,用脚本发送告警:

    grep "pam_google_authenticator" /var/log/auth.log | grep "authentication failure" | mail -s "SSH 2FA失败" admin@example.com
  5. 符合PCI-DSS / SOC2要求
    双因素认证是多数合规框架的强制要求,该脚本部署后,可配合fail2ban防止暴力破解,形成多层防护。


延伸:使用密钥+Duo Security脚本

若需要更企业级方案(如推送验证),可参考Duo Security官方脚本:

  1. 注册Duo账号,获取集成密钥。
  2. 通过pam_duo模块替代pam_google_authenticator
  3. 脚本框架与上述类似,仅需替换PAM模块和脚本逻辑。

注意:Duo的免费版支持10个用户,适合小团队;Google Authenticator完全免费且开源。


通过本文提供的enable_ssh_2fa.sh脚本,您可在5分钟内为所有SSH用户启用基于TOTP的双因素认证,关键点包括:

  • 自动化部署:兼容主流Linux发行版。
  • 灵活豁免:支持对特定用户组跳过2FA(如CI/CD工具)。
  • 安全冗余:务必保留恢复码和应急会话。

行动建议:立即在一个测试服务器上运行脚本,并用手机App生成验证码,体验“输入密码+动态码”的安全感,生产环境前建议先在非关键节点灰度测试。

抱歉,评论功能暂时关闭!