Linux服务器等保测评实战:SSH加固与密码策略配置指南

发布时间:2026/7/21 6:27:07
Linux服务器等保测评实战:SSH加固与密码策略配置指南 1. 项目概述为什么等保测评是Linux服务器的“必修课”最近帮几个朋友的公司做服务器安全加固无一例外都提到了“等保测评”这个事儿。说实话刚开始接触等保信息安全等级保护的时候我也觉得头大一堆条款、要求感觉离我们日常敲命令、调服务的运维工作有点远。但真正踩过几次坑甚至因为配置疏忽导致测评不通过、项目延期之后我才深刻理解等保测评不是“面子工程”而是一套非常务实的安全基线。它把那些我们可能知道但没严格执行或者干脆忽略的安全隐患用标准化的条款给明确出来了。对于一台暴露在公网的Linux服务器来说等保测评的核心就是检验它是否具备了抵御常见攻击的基本能力。你可以把它想象成给房子做安全验收门窗SSH服务是否牢固锁具密码策略是否足够复杂有没有安装防盗网和监控日志与审计测评员就是那个验收师傅他会用一套标准方法逐一检查。我们今天要聊的就是如何让你的Linux服务器在“安全验收”中一次过关重点聚焦在最容易出问题的两个核心领域SSH远程访问和系统密码策略。这两个点看似基础但配置不当就是最致命的短板也是测评中最常见的扣分项。无论你是运维工程师、系统管理员还是负责项目上线的开发者这份从实战中总结的避坑指南都能帮你省下大量反复整改的时间。2. 等保测评核心要求与Linux服务器映射在动手改配置之前我们必须先搞清楚“考官”要考什么。等保测评尤其是二级和三级对操作系统有一系列明确的安全要求这些要求最终都会落到服务器的具体配置上。如果脱离标准盲目操作很容易做无用功。2.1 身份鉴别与访问控制SSH与密码的主战场这是等保测评的重中之重对应到Linux服务器主要考察以下几点口令复杂度密码不能太简单。测评会检查密码策略是否强制要求包含数字、字母大小写、特殊字符并且长度足够通常要求8位以上。登录失败处理是否设置了连续登录失败后的锁定策略比如连续输错5次密码账户或IP是否会被锁定一段时间这是防止暴力破解的关键。远程管理安全对于通过SSH进行的远程管理是否禁止了root账户直接登录是否采用了更安全的密钥认证方式SSH服务的协议版本、加密算法是否安全访问超时管理会话是否有自动超时退出机制防止管理员离开后终端会话被他人恶意利用。2.2 安全审计与入侵防范日志说了算测评员会非常关注日志是否“可用”和“可信”。审计覆盖性是否开启了关键事件的审计比如用户登录成功/失败、特权命令执行sudo、系统开关机等。常用的审计工具是auditd。日志保护日志文件是否设置了适当的权限防止被任意修改或删除日志是否被实时发送到远程的日志服务器Syslog Server进行集中存储这是为了防止攻击者在入侵后抹除痕迹。入侵检测是否有机制能发现最小权限原则的违反、异常登录行为等这往往需要结合日志分析和第三方工具如Fail2ban来实现。理解了这些要求我们的配置工作就有了清晰的靶子。接下来我们就进入实战环节从最关键的SSH服务开始。3. SSH服务安全加固实战详解SSH是通往Linux服务器的“大门”这扇门没关好其他安全措施形同虚设。等保测评中对SSH的检查会非常细致。3.1 关键配置文件解析与安全设置SSH的服务端配置文件是/etc/ssh/sshd_config。我们的所有加固操作都围绕这个文件展开。在修改前务必先备份sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak。下面是一份针对等保测评优化的配置示例我会逐条解释其作用和必要性# 1. 禁止使用不安全的SSH协议版本1 Protocol 2 # 等保要求使用安全的协议。SSHv1存在严重缺陷必须禁用。 # 2. 限制监听接口非必须但建议 # ListenAddress 192.168.1.100 # 如果服务器有多块网卡可以指定只在内网网卡上监听SSH减少暴露面。 # 3. 修改默认端口强烈建议 Port 2222 # 等保虽不强制要求改端口但这是最有效的防扫描手段。将默认的22端口改为一个高位端口如2222、3522等能过滤掉99%的自动化扫描脚本。 # 注意修改后连接命令需加 -p 参数如 ssh -p 2222 userhost。 # 4. 禁止root用户直接登录等保强制要求 PermitRootLogin no # 这是硬性规定。必须使用普通用户登录后再通过sudo提权。直接暴露root是极度危险的行为。 # 5. 强制使用密钥认证禁用密码认证最佳实践 PasswordAuthentication no PubkeyAuthentication yes # 密钥认证比密码安全几个数量级。等保测评鼓励甚至要求采用非口令方式认证。关闭密码认证后暴力破解彻底失效。 # 重要在关闭PasswordAuthentication前必须确保你的公钥已正确部署到服务器的~/.ssh/authorized_keys文件中并且能用密钥登录成功。 # 6. 限制用户和用户组登录 AllowUsers alice bob # AllowGroups ssh-users # 明确指定允许哪些用户或用户组通过SSH登录。遵循最小权限原则非必要不授权。 # 7. 设置登录失败处理等保要求 MaxAuthTries 3 # 设置最大认证尝试次数为3次。连续3次失败后SSH连接会断开。这需要与Fail2ban等工具配合才能实现账户锁定。 # 8. 设置会话超时等保要求 ClientAliveInterval 300 ClientAliveCountMax 2 # 客户端每隔300秒5分钟无活动服务器会发送一次保活消息。连续2次无响应即10分钟则断开连接。 # 这个配置在/etc/ssh/sshd_config中设置的是服务端全局策略。 # 9. 使用更强的加密算法 Ciphers chacha20-poly1305openssh.com,aes256-gcmopenssh.com,aes128-gcmopenssh.com,aes256-ctr,aes192-ctr,aes128-ctr MACs hmac-sha2-512-etmopenssh.com,hmac-sha2-256-etmopenssh.com,umac-128-etmopenssh.com KexAlgorithms curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group-exchange-sha256 # 禁用一些老旧、脆弱的加密套件采用现代、强壮的算法。这能抵御降级攻击。 # 10. 禁用不安全的特性 PermitEmptyPasswords no # 禁止空密码登录这应该是默认的但检查一下没坏处。实操心得修改sshd_config后不要立即重启sshd服务。正确的姿势是先通过sudo sshd -t命令测试配置文件语法是否正确。确认无误后保持一个当前有效的SSH连接窗口不要关闭然后在新窗口中使用新配置进行连接测试。确保新的连接方式如新端口、密钥登录完全成功再重启服务。这是防止把自己锁在服务器外面的“救命技巧”。3.2 密钥对管理比密码更安全的选择既然禁用了密码登录密钥对的管理就成了核心。生成密钥对在客户端进行ssh-keygen -t ed25519 -C “your_emailexample.com” -f ~/.ssh/id_ed25519_my_server-t ed25519使用Ed25519算法它比传统的RSA更安全、更快、密钥更短。-f指定密钥文件存放路径和名称。建议为不同服务器使用不同密钥便于管理。执行后会提示输入密码短语passphrase强烈建议设置。这为你的私钥又加了一层密码保护即使私钥文件泄露没有密码短语也无法使用。部署公钥到服务器 方法一最安全使用ssh-copy-id命令。ssh-copy-id -i ~/.ssh/id_ed25519_my_server.pub -p 2222 aliceserver_ip方法二手动将公钥内容追加到服务器对应用户家目录下的~/.ssh/authorized_keys文件中并确保该文件和~/.ssh目录的权限正确# 在服务器上操作 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys权限设置错误会导致密钥认证失败这是常见坑点。管理多服务器密钥在客户端的~/.ssh/config文件中进行配置可以极大简化连接命令。Host myserver HostName 192.168.1.100 Port 2222 User alice IdentityFile ~/.ssh/id_ed25519_my_server IdentitiesOnly yes配置后只需执行ssh myserver即可连接无需记忆IP、端口和密钥路径。3.3 高级防御Fail2ban部署与配置MaxAuthTries只是断开了单次连接攻击者换个IP可以继续尝试。Fail2ban可以动态分析日志将多次失败的IP加入防火墙黑名单实现真正的锁定。安装以Ubuntu/Debian为例sudo apt update sudo apt install fail2ban -y配置Fail2ban的配置文件在/etc/fail2ban/。不建议直接修改jail.conf而是创建局部配置文件jail.local。sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo vim /etc/fail2ban/jail.local找到[sshd]段落或类似段落进行如下修改[sshd] enabled true port 2222 # 如果你修改了SSH端口这里必须同步修改 filter sshd logpath /var/log/auth.log maxretry 3 # 最大重试次数与SSH的MaxAuthTries保持一致或更小 bantime 3600 # 禁止时间单位秒。这里设置1小时。可以设置更长如86400一天 findtime 600 # 在10分钟内达到maxretry次数则触发禁令这里的关键是port一定要和你SSH的实际端口一致否则Fail2ban无法正确识别SSH登录失败日志。启动与验证sudo systemctl enable fail2ban sudo systemctl start fail2ban sudo fail2ban-client status sshd # 查看sshd监狱的状态你可以故意用错误密码从另一台机器尝试登录几次然后在该服务器上执行sudo fail2ban-client status sshd查看“Banned IP list”里是否出现了测试IP。也可以用sudo iptables -L -n或sudo ss -tulpn | grep :2222查看防火墙规则确认该IP已被拒绝。避坑指南Fail2ban的过滤器filter依赖于系统日志的格式。不同Linux发行版或SSH配置可能会让日志格式略有差异。如果发现Fail2ban不生效首要检查/var/log/fail2ban.log日志看是否有解析错误。有时需要调整/etc/fail2ban/filter.d/sshd.conf中的正则表达式failregex来匹配你的日志格式。4. 系统密码策略全面强化SSH大门锁好了系统内部的密码防线也不能松懈。等保对密码复杂度、有效期、历史都有明确要求。4.1 使用PAM模块配置密码复杂度Linux的密码策略主要通过PAMPluggable Authentication Modules模块pam_pwquality旧版叫pam_cracklib来实现。安装与配置 首先确保已安装libpam-pwqualitysudo apt install libpam-pwquality # Debian/Ubuntu sudo yum install libpwquality # RHEL/CentOS主要配置文件是/etc/security/pwquality.conf。你可以直接编辑这个文件但更规范的做法是在/etc/pam.d/common-passwordDebian系或/etc/pam.d/system-authRHEL系中修改PAM栈。以下是通过修改/etc/security/pwquality.conf来设定策略的示例# 最小长度 minlen 10 # 至少包含一个大写字母 (ucredit) minclass 3 # 至少包含一个小写字母 (lcredit) # 至少包含一个数字 (dcredit) # 至少包含一个特殊字符 (ocredit) # 注意minclass3 表示密码必须包含来自至少3个不同字符类别的字符大写、小写、数字、其他。 # 你也可以分别设置 # minlen 10 # dcredit -1 # 至少需要1个数字 # ucredit -1 # 至少需要1个大写字母 # lcredit -1 # 至少需要1个小写字母 # ocredit -1 # 至少需要1个特殊字符 # 拒绝包含用户名 usercheck 1 # 拒绝包含连续或重复字符 maxsequence 3 maxrepeat 3重要credit参数的语法容易混淆。负数表示“至少需要”正数表示“给予奖励分但不强制”。例如dcredit-1表示至少需要1个数字。而minclass是更直观的配置方式。配置完成后当用户通过passwd命令修改密码时系统就会依据此策略进行校验。4.2 设置密码有效期与历史密码不能永久使用必须定期更换且不能与近期用过的密码重复。这通过/etc/login.defs和PAM的pam_unix模块共同管理。修改/etc/login.defsPASS_MAX_DAYS 90 # 密码最长使用90天 PASS_MIN_DAYS 7 # 密码最短使用7天内不能修改 PASS_WARN_AGE 14 # 密码过期前14天开始警告 PASS_MIN_LEN 10 # 最小密码长度通常被PAM覆盖这个文件主要对新创建的用户生效。对于已存在用户需要使用chage命令修改sudo chage -M 90 -m 7 -W 14 username查看某个用户的密码策略详情sudo chage -l username配置密码历史记忆防止重复使用旧密码 这需要在PAM配置中设置。编辑/etc/pam.d/common-passwordDebian或/etc/pam.d/system-authRHEL找到包含pam_unix.so的行添加remember参数password [success1 defaultignore] pam_unix.so obscure sha512 remember5remember5表示系统会记住最近5次使用的密码哈希不允许用户设置为这5个密码之一。4.3 用户账户锁定策略除了SSH层面的Fail2ban系统本地登录失败也需要锁定策略。这通过pam_tally2或pam_faillock模块实现。使用pam_tally2(较通用)编辑PAM配置文件例如/etc/pam.d/common-authauth required pam_tally2.so deny5 unlock_time600 onerrsucceed file/var/log/tallylogdeny5: 连续失败5次后锁定。unlock_time600: 锁定600秒10分钟。file: 记录失败次数的文件。在/etc/pam.d/common-account文件中添加account required pam_tally2.so管理命令查看用户失败次数sudo pam_tally2 --user username解锁用户sudo pam_tally2 --user username --reset使用pam_faillock(更新功能更强) 现代系统更推荐pam_faillock。编辑/etc/pam.d/system-auth或相关文件auth required pam_faillock.so preauth silent audit deny5 unlock_time600 auth [defaultdie] pam_faillock.so authfail audit deny5 unlock_time600 account required pam_faillock.so配置完成后使用faillock命令管理sudo faillock --user username # 查看状态 sudo faillock --user username --reset # 重置踩坑实录账户锁定策略配置后务必用另一个终端或用户会话先进行测试模拟几次失败登录看锁定是否生效以及解锁时间过后是否能正常登录。我曾经配置失误把自己常用的管理账户锁死了而解锁时间设成了24小时最后只能通过单用户模式进系统修复非常狼狈。5. 等保测评辅助项配置与检查除了SSH和密码还有一些配置项虽小但在测评中也是检查点且能切实提升安全。5.1 用户与权限最小化原则禁用无用默认账户检查/etc/passwd禁用像games、lp等非必要系统账户的登录shell。sudo usermod -s /sbin/nologin username定期审查特权账户定期检查/etc/sudoers文件和/etc/group中sudo、wheel组的成员移除不再需要的用户。sudo grep -Po ‘^sudo.:\K.*$’ /etc/group sudo visudo # 使用visudo安全地编辑sudoers文件使用sudo代替su鼓励管理员使用sudo执行特权命令而不是切换到root。sudo可以记录谁在什么时候执行了什么命令便于审计。5.2 系统日志与审计配置等保要求安全事件可追溯日志是关键。配置远程日志服务器Syslog将重要日志实时发送到另一台受保护的日志服务器。修改/etc/rsyslog.conf或syslog-ng.conf*.* 192.168.1.200:514 # 使用UDP发送所有日志到远程服务器192.168.1.200的514端口 *.* 192.168.1.200:514 # 使用TCP发送更可靠重启rsyslog服务生效。启用auditd审计服务auditd是Linux内核的审计框架能记录更底层、更详细的事件。安装sudo apt install auditd audispd-plugins添加审计规则例如监控/etc/passwd文件的写操作。sudo auditctl -w /etc/passwd -p wa -k identity_access-w监控文件路径-p监控的权限r读w写x执行a属性更改-k给规则打一个关键词标签。永久生效将规则写入/etc/audit/rules.d/audit.rules文件。查看日志sudo ausearch -k identity_access或sudo aureport。5.3 网络与服务最小化关闭不需要的服务使用systemctl或service命令关闭并禁用如telnet、rpcbind等陈旧且不安全的服务。sudo systemctl stop service_name sudo systemctl disable service_name使用防火墙限制访问配置iptables或firewalld只开放必要的端口如你的SSH端口、Web服务端口等拒绝所有其他入站连接。# 使用firewalld (RHEL/CentOS) sudo firewall-cmd --permanent --add-port2222/tcp sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --reload定期更新系统建立定期的安全更新机制。等保要求及时修复已知漏洞。sudo apt update sudo apt upgrade -y # Debian/Ubuntu sudo yum update -y # RHEL/CentOS6. 测评前自检清单与常见问题排查在正式迎检前自己先当一遍考官按照下面的清单逐一检查能发现大部分问题。6.1 全项自检清单Checklist你可以将以下命令整合成一个脚本定期运行自检。身份鉴别与访问控制[ ]SSH配置sudo sshd -T | grep -E “permitrootlogin|passwordauthentication|permitemptypasswords|protocol|maxauthtries” # 检查关键参数 grep “^Port” /etc/ssh/sshd_config # 检查端口 sudo netstat -tlnp | grep sshd # 确认服务监听端口[ ]密码策略sudo grep -E “PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE” /etc/login.defs sudo chage -l root # 检查root账户策略其他账户同理 sudo grep “remember” /etc/pam.d/common-password # 检查密码历史[ ]账户锁定sudo grep “pam_tally2\|pam_faillock” /etc/pam.d/common-auth # 检查PAM配置 sudo faillock --user 测试用户名 或 sudo pam_tally2 --user 测试用户名 # 测试功能安全审计[ ]日志配置sudo systemctl status rsyslog auditd # 检查审计服务状态 sudo ls -l /var/log/auth.log /var/log/secure # 检查关键认证日志 sudo auditctl -l # 列出当前生效的audit规则[ ]时间同步日志时间必须准确。sudo systemctl status systemd-timesyncd chronyd ntpd # 检查时间同步服务 timedatectl status # 查看时间同步状态入侵防范[ ]Fail2ban状态sudo systemctl status fail2ban sudo fail2ban-client status sshd[ ]不必要的服务sudo systemctl list-unit-files --stateenabled | grep service # 查看所有已启用的服务 sudo netstat -tulpn # 查看所有监听端口[ ]防火墙规则sudo iptables -L -n 或 sudo firewall-cmd --list-all6.2 典型问题与快速修复方案在自检或测评过程中你可能会遇到以下问题问题现象可能原因排查命令与修复方案SSH密钥登录失败1.authorized_keys文件权限不对2..ssh目录权限不对3. SELinux/AppArmor限制ls -la ~/.ssh/chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys查看/var/log/secure或audit.log获取SELinux拒绝日志使用setenforce 0临时禁用测试生产环境慎用。密码复杂度策略不生效1. PAM配置未正确引用pwquality2.pwquality.conf配置错误sudo grep pwquality /etc/pam.d/common-password检查minlen,minclass等参数用passwd命令测试。Fail2ban不封锁IP1. 日志路径或格式不匹配2. 监狱jail未启用或端口配置错误3. 防火墙规则未正确添加sudo tail -f /var/log/fail2ban.logsudo fail2ban-client status sshd检查jail.local中port和logpath设置。账户锁定后无法自动解锁pam_tally2或pam_faillock参数配置错误检查unlock_time参数单位是否为秒。确认配置在正确的PAM文件common-auth,system-auth中。审计日志auditd无内容1. 服务未运行2. 未添加审计规则3. 磁盘空间不足sudo systemctl status auditdsudo auditctl -lsudo df -h /var/log最后再分享一个关键技巧所有安全配置的修改都必须记录变更日志。在/etc/下相关配置文件的原件旁保留一个.bak或带日期的备份文件。在测评时这不仅能证明你的工作过程在配置出错时也能快速回滚。安全加固是一个持续的过程等保测评是一个很好的契机帮助我们建立起规范的安全基线配置和运维习惯。把这些配置标准化、脚本化以后无论是部署新服务器还是进行安全复查效率都会高得多。