Linux服务器SSH安全加固实战:密钥认证与端口伪装配置方案

SSH是Linux服务器远程管理的核心通道,默认配置存在密码暴力破解、端口扫描等安全风险。通过密钥认证替代密码登录、修改默认端口、配置防火墙白名单和fail2ban入侵检测,可将SSH攻击面降至最低。这套服务器安全加固方案适用于生产环境服务器集群的统一安全管理,覆盖从认证机制到入侵防御的完整防护链路。

SSH密钥认证配置

密钥认证使用非对称加密替代密码验证,消除暴力破解风险。在客户端生成Ed25519密钥对,该算法比RSA更安全且密钥更短:

# 客户端生成密钥对
ssh-keygen -t ed25519 -C "admin@yunthe-server" -f ~/.ssh/yunthe_ed25519

# 上传公钥到服务器
ssh-copy-id -i ~/.ssh/yunthe_ed25519.pub -p 22 root@192.168.1.100

# 测试密钥登录
ssh -i ~/.ssh/yunthe_ed25519 -p 22 root@192.168.1.100

确认密钥登录正常后,禁用密码认证。编辑服务端SSH配置文件:

# /etc/ssh/sshd_config
Port 22
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers admin deploy

关键参数说明:

  • PasswordAuthentication no:彻底禁用密码登录
  • PermitRootLogin prohibit-password:允许root密钥登录但禁止密码登录
  • MaxAuthTries 3:限制认证尝试次数为3次
  • AllowUsers admin deploy:仅允许指定用户SSH登录

配置修改后重启SSH服务并验证:

systemctl restart sshd
# 新开终端测试登录,确认密钥认证生效后再关闭旧连接

SSH端口修改与防火墙配置

修改默认22端口可规避大部分自动化扫描攻击。选择1024-65535范围内的高位端口:

# 修改SSH端口
sed -i 's/^Port 22$/Port 58923/' /etc/ssh/sshd_config

# SELinux环境需放行新端口
semanage port -a -t ssh_port_t -p tcp 58923

# firewalld放行
firewall-cmd --permanent --add-port=58923/tcp
firewall-cmd --reload

# 确保旧端口暂时保留,防止断连
# 建议在sshd_config中同时配置两个端口测试
systemctl restart sshd

使用iptables配置更精细的访问控制,仅允许指定IP段连接SSH:

# 允许运维网段
iptables -A INPUT -p tcp --dport 58923 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 58923 -s 203.0.113.50/32 -j ACCEPT

# 拒绝其他所有来源
iptables -A INPUT -p tcp --dport 58923 -j DROP

# 保存规则
iptables-save > /etc/sysconfig/iptables
service iptables save

fail2ban自动封禁暴力破解IP

fail2ban通过监控SSH日志自动封禁多次认证失败的IP地址,是防御暴力扫描的有效补充:

# 安装fail2ban
yum install -y epel-release
yum install -y fail2ban

# 配置SSH保护规则
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 58923
filter = sshd
logpath = /var/log/secure
maxretry = 3
findtime = 600
bantime = 86400
banaction = iptables-multiport
ignoreip = 127.0.0.1/8 10.0.0.0/24
EOF

systemctl enable fail2ban
systemctl start fail2ban

配置参数说明:10分钟内认证失败3次的IP封禁24小时,运维网段加入白名单不触发封禁。查看fail2ban状态:

fail2ban-client status sshd
# 查看被封禁的IP列表
fail2ban-client status sshd | grep "Banned IP"
# 手动解封IP
fail2ban-client set sshd unbanip 203.0.113.100

SSH跳板机与多因素认证

对于多服务器环境,通过跳板机集中管理SSH访问,所有运维操作经由跳板机转发。跳板机配置端口转发:

# ~/.ssh/config(客户端配置)
Host jump-server
    HostName 192.168.1.10
    Port 58923
    User admin
    IdentityFile ~/.ssh/yunthe_ed25519

Host web-01
    HostName 10.0.1.11
    User deploy
    ProxyJump jump-server
    IdentityFile ~/.ssh/yunthe_ed25519

Host db-01
    HostName 10.0.2.11
    User deploy
    ProxyJump jump-server
    IdentityFile ~/.ssh/yunthe_ed25519

在跳板机上启用Google Authenticator实现多因素认证:

yum install -y google-authenticator
google-authenticator
# 扫描二维码绑定手机端,记录备用验证码

# 在sshd_config中启用
echo "ChallengeResponseAuthentication yes" >> /etc/ssh/sshd_config
echo "AuthenticationMethods publickey,keyboard-interactive" >> /etc/ssh/sshd_config

# 配置PAM
cat > /etc/pam.d/sshd << 'EOF'
auth required pam_google_authenticator.so
auth substack password-auth
EOF

systemctl restart sshd

配置后SSH登录需要密钥认证加动态验证码双重验证,即使密钥泄露也无法直接登录。每个运维人员独立绑定验证码,操作可追溯。定期审计/var/log/secure日志,检查异常登录记录和fail2ban封禁列表,及时调整安全策略。服务器安全加固是持续过程,SSH防护配合网络层iptables和应用层SELinux构建纵深防御体系,才能有效应对不断演变的攻击手段。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ssh-an-quan-jia-gu-shi-zhan-mi-yao-ren-zheng/

赞 (0)
小编小编
上一篇 2026年8月25日
下一篇 2026年8月25日

相关推荐

Linux服务器SSH安全加固实战:密钥认证配置与Fail2ban防暴力破解部署

SSH是Linux服务器远程管理的核心通道,默认配置存在密码认证弱、端口暴露、root直登等安全隐患。SSH安全加固是服务器安全加固的第一道防线,涉及密钥认证、暴力破解防护、端口隐蔽、审计日志等多个层面。本文给出完整的SSH安全加固操作流程。

SSH服务安全基线检查与配置优化

修改sshd配置文件前,保持原SSH会话不断开,新开终端测试新配置后再关闭旧会话,避免锁定自己。

# 备份原始配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 关键安全配置项
vim /etc/ssh/sshd_config

核心安全参数:

# 禁用root直接登录
PermitRootLogin no

# 禁用密码认证,仅允许密钥登录
PasswordAuthentication no
KbdInteractiveAuthentication no

# 禁用空密码
PermitEmptyPasswords no

# 修改默认端口(示例改为22022)
Port 22022

# 限制最大认证尝试次数
MaxAuthTries 3

# 登录超时时间
LoginGraceTime 30

# 禁用X11转发(非必要场景)
X11Forwarding no

# 限制允许登录的用户
AllowUsers deploy admin

# 禁用DNS反查,加速登录
UseDNS no

配置修改后验证语法并重载服务:

# 验证配置语法
sshd -t

# 重载配置(不中断现有连接)
systemctl reload sshd

Ed25519密钥对生成与免密认证配置

Ed25519密钥相比RSA更短、更快、更安全,推荐作为首选算法。客户端生成密钥对:

# 生成Ed25519密钥对
ssh-keygen -t ed25519 -C "deploy@prod-server" -f ~/.ssh/ed25519_prod

# 指定密钥位数的RSA密钥(兼容旧系统时使用)
ssh-keygen -t rsa -b 4096 -C "deploy@prod-server" -f ~/.ssh/rsa_prod

将公钥部署到服务器:

# 方法1:ssh-copy-id(自动配置)
ssh-copy-id -i ~/.ssh/ed25519_prod.pub -p 22022 deploy@server_ip

# 方法2:手动写入
cat ~/.ssh/ed25519_prod.pub | ssh -p 22 deploy@server_ip \
    "mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
     cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

客户端配置SSH别名简化连接:

# ~/.ssh/config
Host prod
    HostName 192.168.1.100
    Port 22022
    User deploy
    IdentityFile ~/.ssh/ed25519_prod
    ServerAliveInterval 60
    ServerAliveCountMax 3

配置完成后直接ssh prod即可连接。

Fail2ban安装配置与暴力破解防护策略

Fail2ban通过监控SSH日志,自动封禁多次认证失败的IP地址。安装与配置:

# 安装Fail2ban
yum install -y epel-release && yum install -y fail2ban
# 或
apt install -y fail2ban

# 创建本地配置(不修改原始文件,便于升级)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vim /etc/fail2ban/jail.local

SSH防护配置:

[DEFAULT]
# 封禁时长:1小时
bantime = 3600
# 检测时间窗口:10分钟
findtime = 600
# 最大失败次数
maxretry = 3
# 封禁动作:iptables
banaction = iptables-multiport

[sshd]
enabled = true
port = 22022
logpath = /var/log/secure
# CentOS/RHEL使用/var/log/secure
# Ubuntu/Debian使用/var/log/auth.log
maxretry = 3
bantime = 86400
# 启动并设置开机自启
systemctl enable --now fail2ban

# 查看SSH防护状态
fail2ban-client status sshd

# 手动解封IP
fail2ban-client set sshd unbanip 1.2.3.4

端口敲门(Port Knocking)与隐蔽端口方案

端口敲门通过预设的连接序列动态开放防火墙端口,使SSH端口在正常扫描中不可见。使用knockd实现:

# 安装knockd
apt install -y knockd

# 配置敲门序列
vim /etc/knockd.conf
[options]
    UseSyslog
    Interface = eth0

[openSSH]
    sequence = 7000,8000,9000
    seq_timeout = 15
    command = iptables -A INPUT -s %IP% -p tcp --dport 22022 -j ACCEPT
    tcpflags = syn

[closeSSH]
    sequence = 9000,8000,7000
    seq_timeout = 15
    command = iptables -D INPUT -s %IP% -p tcp --dport 22022 -j ACCEPT
    tcpflags = syn

客户端敲门后连接:

# 发送敲门序列
knock 192.168.1.100 7000 8000 9000

# 敲门成功后SSH连接
ssh prod

# 使用完毕后关闭端口
knock 192.168.1.100 9000 8000 7000

SSH审计日志分析与入侵检测

定期检查SSH登录记录,识别异常访问行为:

# 查看成功登录记录
last -n 20

# 查看失败登录尝试
lastb -n 20

# 统计失败登录IP及次数
grep "Failed password" /var/log/secure | 
    awk '{print $(NF-3)}' | 
    sort | uniq -c | sort -rn | head -20

# 查看当前在线用户
w

# 检查密钥文件权限
ls -la ~/.ssh/
# authorized_keys权限必须600,.ssh目录权限必须700

配合logrotate配置日志轮转,避免日志文件无限增长。将SSH安全审计加入crontab定期执行,发现异常IP及时封禁并告警。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ssh-an-quan-jia-gu-shi-zhan-mi-yao-ren-zheng/

赞 (0)
小编小编
上一篇 2026年8月25日
下一篇 2026年8月25日

相关推荐

Linux服务器SSH安全加固实战:密钥认证配置与Fail2ban入侵防御部署

SSH是Linux服务器远程管理的核心通道,也是攻击者最常尝试入侵的入口。默认配置的SSH服务存在密码暴力破解、root直接登录、默认端口扫描等风险。通过密钥认证替代密码登录、部署Fail2ban自动封禁恶意IP、配置端口跳转与防火墙联动,可以将SSH服务的安全等级提升到生产可用标准。本文覆盖SSH安全加固的完整配置流程。

SSH服务安全风险评估

暴露在公网的SSH服务平均每天会收到数千次扫描和登录尝试。通过分析/var/log/secure(CentOS)或/var/log/auth.log(Ubuntu)中的认证日志,可以清晰看到攻击模式:扫描器使用常见用户名(root、admin、test)和弱密码字典进行批量尝试。

默认配置的主要风险点包括:Port 22端口暴露,容易被自动化扫描器发现;PermitRootLogin设置为yes,root账户直接暴露在暴力破解范围内;PasswordAuthentication为yes,密码认证可被字典攻击破解;没有登录失败次数限制,攻击者可以无限重试。

密钥认证配置与密码登录关闭

SSH密钥认证基于非对称加密,私钥保存在客户端,公钥部署在服务器。攻击者即使知道用户名和服务器地址,没有私钥也无法登录。密钥认证的暴力破解难度远高于密码,2048位RSA密钥的破解计算量在当前算力下不可行。

客户端生成密钥对:

# 在本地机器执行,生成Ed25519密钥(比RSA更安全、更短)
ssh-keygen -t ed25519 -C "admin@yunthe-server" -f ~/.ssh/yunthe_ed25519

# 参数说明:
# -t ed25519:使用Ed25519算法,比RSA更高效安全
# -C:注释信息,标识密钥用途
# -f:指定密钥文件路径

# 设置passphrase保护私钥(即使私钥文件泄露,没有passphrase也无法使用)
# 建议设置强passphrase:至少16位,包含大小写字母、数字、符号

将公钥部署到服务器:

# 方法一:使用ssh-copy-id自动部署
ssh-copy-id -i ~/.ssh/yunthe_ed25519.pub matao@server_ip

# 方法二:手动部署
cat ~/.ssh/yunthe_ed25519.pub | ssh matao@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

服务器端sshd_config配置关闭密码认证:

# /etc/ssh/sshd_config 关键配置项

Port 2222                          # 修改默认端口
PermitRootLogin no                 # 禁止root直接登录
PasswordAuthentication no          # 关闭密码认证
PubkeyAuthentication yes           # 开启密钥认证
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3                     # 单次连接最大认证尝试次数
LoginGraceTime 30                  # 认证超时时间30秒
AllowUsers matao deploy            # 仅允许指定用户SSH登录
ClientAliveInterval 300            # 300秒无操作发送心跳
ClientAliveCountMax 0              # 不响应心跳则断开(防止僵尸连接)

# 保存后验证配置语法
sshd -t

# 重载SSH服务(不要直接restart,先reload确保配置正确)
systemctl reload sshd

配置完成后,保持当前SSH会话不要断开,另开一个终端使用新配置连接测试。确认密钥登录正常后再关闭旧会话,避免配置错误导致无法登录。

Fail2ban入侵检测与自动封禁部署

Fail2ban通过监控SSH认证日志,自动识别暴力破解行为并调用iptables/firewalld封禁来源IP。默认配置下,10分钟内5次认证失败即封禁该IP 1小时,可按需调整阈值。

# 安装Fail2ban
yum install -y epel-release && yum install -y fail2ban
# 或
apt install -y fail2ban

# 创建本地配置文件(不要直接修改jail.conf,升级会覆盖)
# /etc/fail2ban/jail.local

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8    # 信任IP段,不封禁
bantime = 3600                             # 封禁时长1小时
findtime = 600                              # 检测窗口10分钟
maxretry = 3                                # 3次失败即封禁
banaction = firewallcmd-ipset               # 使用firewalld封禁
backend = systemd                           # 从systemd journal读取日志

[sshd]
enabled = true
port = 2222                                # 与sshd_config端口一致
logpath = %(sshd_log)s
maxretry = 3
bantime = 86400                            # SSH封禁延长至24小时

启动Fail2ban并设置开机自启:

systemctl enable fail2ban
systemctl start fail2ban

# 查看SSH防护状态
fail2ban-client status sshd

# 输出示例:
# Status for the jail: sshd
# |- Filter
# |  |- Currently failed: 0
# |  |- Total failed:     127
# |  `- File list:        /var/log/secure
# `- Actions
#    |- Currently banned: 3
#    |- Total banned:     15
#    `- Banned IP list:   192.168.1.100 10.0.0.50 203.0.113.45

手动解封IP或手动封禁IP:

# 解封指定IP
fail2ban-client set sshd unbanip 192.168.1.100

# 手动封禁IP
fail2ban-client set sshd banip 203.0.113.50

# 查看封禁策略详情
fail2ban-client get sshd actions
fail2ban-client get sshd bantime

SSH端口修改与防火墙联动

修改SSH端口可以过滤掉90%以上的自动化扫描。攻击者使用nmap等工具扫描全端口虽然可以发现非标准端口,但扫描全端口的时间成本远高于只扫描22端口,修改端口本身就是一种有效的防御手段。

# firewalld放行新SSH端口
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --remove-port=22/tcp    # 关闭旧端口
firewall-cmd --reload

# 如果使用iptables
iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 上述规则限制同一IP在60秒内最多5次SSH连接尝试

SSH审计日志与安全监控

配置SSH详细日志记录,便于事后审计追溯:

# /etc/ssh/sshd_config 增加审计配置
LogLevel VERBOSE                    # 记录详细日志
PermitTunnel no                     # 禁止隧道转发
AllowTcpForwarding yes              # 按需开放端口转发
X11Forwarding no                    # 禁止X11转发
AllowAgentForwarding no             # 禁止Agent转发

# 记录SSH登录成功/失败到单独审计文件
# /etc/rsyslog.d/ssh-audit.conf
if $programname == 'sshd' then /var/log/ssh-audit.log
& stop

# 重启rsyslog
systemctl restart rsyslog

定期审查SSH登录记录,关注异常登录行为:

# 查看最近成功登录记录
last -a | head -20

# 查看失败登录记录
lastb -a | head -20

# 统计各IP登录失败次数(排查暴力破解)
journalctl -u sshd --since "24 hours ago" | grep "Failed password" | awk '{print $(NF)}' | sort | uniq -c | sort -rn | head -20

# 统计当前在线用户
who

对于多台服务器的统一SSH管理,建议配合堡垒机(Jump Server)使用。堡垒机集中管理SSH访问入口,所有操作录屏审计,即使单台服务器SSH配置存在漏洞,攻击者也需要先突破堡垒机才能接触到内网服务器。开源方案如JumpServer提供完整的身份认证、权限管理和操作审计功能。

密钥管理方面,生产环境建议定期轮换SSH密钥(每季度或人员变动时),废弃密钥及时从authorized_keys中删除。对于离职人员,应在第一时间清除其公钥和系统账号,避免权限残留。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ssh-an-quan-jia-gu-shi-zhan-mi-yao-ren-zheng/

赞 (0)
小编小编
上一篇 2026年8月24日
下一篇 2026年8月24日

相关推荐