ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux服务器安全加固实战:SSH、用户权限与防火墙配置详解

Linux服务器安全加固实战:SSH、用户权限与防火墙配置详解 一、引言默认配置的服务器本质上是带公网 IP 的靶机任何一台绑定公网 IP 的 Linux 服务器上线后数分钟内就会开始收到 SSH 爆破流量。这不是危言耸听——/var/log/auth.log里那些来自全球各地、每秒数次的Failed password for root是每一台新机器的出生证明。问题在于绝大多数发行版的默认配置是为可用性而非安全性设计的sshd默认允许 root 直接登录、默认开启密码认证且没有速率限制用户体系扁平运维人员共用 root 或随意sudo缺乏审计防火墙要么没开要么只放行了端口却保留了宽泛的入站策略云厂商的 Security Group 与主机防火墙职责重叠规则互相打架。更棘手的是加固悖论加固的目标是减少攻击面但操作不当会把自己也挡在门外。一条写错的nft规则、一次忘记测试的sshd_config修改都可能让一台生产机器彻底失联只能走 VNC 救援。本文以 Ubuntu 22.04 / Debian 12 为例从 SSH、用户权限、防火墙三个维度给出一套可落地、可回滚的加固方案并重点讨论那些文档里不写、但会让你半夜爬起来救火的坑。二、核心原理攻击面收敛的三层模型安全加固不是堆砌配置项而是沿着攻击链的必经之路逐层设卡。对于一台典型的 Web 服务器外部攻击者要拿到 root通常需要穿透三层2.1 SSH 层把猜密码从可行变成不可行密码认证的本质缺陷是共享秘密 可离线验证。攻击者可以对同一个用户名无限次尝试而服务器无法区分合法用户输错密码和字典攻击。以 8 位纯小写字母密码为例搜索空间约 2×10¹¹看似很大但字典攻击只针对人类常用的几千个密码命中率极高。公钥认证则把认证从你知道什么变成你持有什么。私钥不出本地服务器只保存公钥不存在可被暴力枚举的共享秘密。同时服务端可关闭密码认证从协议层面直接消灭爆破路径。关键参数的设计逻辑参数作用推荐值PermitRootLogin阻断最高权限账户直连noPasswordAuthentication关闭密码认证noMaxAuthTries限制单连接认证次数3LoginGraceTime缩短未认证连接占用时间20AllowGroups白名单准入ssh-users2.2 用户权限层最小权限与可追溯性Linux 的权限模型建立在 UID/GID 之上。加固的核心是两点每个人有自己的账户可追溯默认无特权按需提权最小权限。这里最容易出问题的是sudo。直接给ALL(ALL) NOPASSWD: ALL等于把 root 换个名字而sudo的日志默认写进auth.log如果没开log_output你只能看到谁执行了 sudo看不到执行了什么命令。另一个常被忽视的是文件权限的继承性umask决定新建文件的默认权限SUID位则可能成为提权跳板。加固时应定期扫描异常 SUID 文件。2.3 防火墙层默认拒绝 显式放行防火墙的原则只有一条default drop白名单放行。现代 Linux 有两套主流方案——nftables内核 3.13 的新框架Ubuntu 22.04 的默认后端和firewalldRHEL 系封装。无论用哪套都要注意状态跟踪放行ct state established,related否则出站响应包会被丢弃速率限制对 SSH 端口做limit rate比单纯改端口有效得多与云安全组的分工安全组做粗粒度网络隔离主机防火墙做细粒度进程级控制两者不是替代关系。三、实战加固一台公网 Ubuntu 22.04 服务器假设服务器 IP 为203.0.113.10我们已有一个普通用户ops现在要完成全量加固。强烈建议全程保持一个已登录的 SSH 会话不关闭直到验证通过。3.1 第一步SSH 加固先在本机生成密钥ed25519比 RSA 更短更安全-a 100增加 KDF 迭代次数抵抗私钥被窃后的暴力破解# 本地执行ssh-keygen-ted25519-a100-Copsexample.com-f~/.ssh/id_ed25519 ssh-copy-id-i~/.ssh/id_ed25519.pub ops203.0.113.10# 验证免密登录成功后再继续ssh-oPreferredAuthenticationspublickey ops203.0.113.10echo ok服务端不要直接改/etc/ssh/sshd_config——Ubuntu 的Include /etc/ssh/sshd_config.d/*.conf会加载额外配置且 cloud-init 可能在重启时覆盖主文件。更稳妥的做法是新增独立片段利用先匹配先生效的规则覆盖默认值# /etc/ssh/sshd_config.d/00-hardening.confProtocol2PermitRootLogin no PasswordAuthentication no KbdInteractiveAuthentication no PermitEmptyPasswords no PubkeyAuthenticationyesMaxAuthTries3MaxSessions4LoginGraceTime20ClientAliveInterval300ClientAliveCountMax2AllowGroups ssh-users X11Forwarding no AllowAgentForwarding no AllowTcpForwarding no PermitTunnel no LogLevel VERBOSE生效前必须做语法检查这是避免失联的第一道保险sudosshd-tsudosystemctl reloadssh# 用新会话验证成功后再关闭旧会话ssh-oPreferredAuthenticationspublickey ops203.0.113.10whoami注意AllowGroups ssh-users要求ops已加入该组否则会被直接拒绝。这一步务必在 reload 前完成。3.2 第二步用户与权限治理下面这段脚本封装了新增运维账号的标准流程包含组准入、密钥注入、强制首次改密、sudo 授权与日志审计#!/usr/bin/env bash# /usr/local/sbin/add-ops-user.shset-euopipefailNEW_USER${1:?usage:$0 username pubkey-file}PUBKEY${2:?usage:$0 username pubkey-file}# 1. 准入组与 sshd 的 AllowGroups 对应getent group ssh-users/dev/null||groupaddssh-usersid-u$NEW_USER/dev/null{echouser exists;exit1;}# 2. 建用户家目录 bash 加入准入组useradd-m-s/bin/bash-Gssh-users$NEW_USERchage-d0$NEW_USER# 强制首次登录改密# 3. 严格权限注入公钥.ssh 700authorized_keys 600install-d-m0700-o$NEW_USER-g$NEW_USER/home/$NEW_USER/.sshinstall-m0600-o$NEW_USER-g$NEW_USER\$PUBKEY/home/$NEW_USER/.ssh/authorized_keys# 4. sudo 授权带时间戳超时与命令输出记录cat/etc/sudoers.d/90-$NEW_USEREOF Defaults:$NEW_USERtimestamp_timeout5, log_output, logfile/var/log/sudo-$NEW_USER.log$NEW_USERALL(ALL:ALL) ALL EOFchmod0440/etc/sudoers.d/90-$NEW_USERvisudo-cf/etc/sudoers.d/90-$NEW_USER# 语法校验写错 sudoers 会导致全系统无法提权echo[]$NEW_USERprovisioned.配套的系统级基线检查# 查找异常 SUID 文件提权跳板排查sudofind/-xdev-perm-4000-typef-execls-ld{}\;2/dev/null# 检查空密码账户sudoawk-F:($2){print $1}/etc/shadow# 检查除 root 外 UID0 的账户sudoawk-F:($30 $1!root){print $1}/etc/passwd3.3 第三步防火墙配置nftables下面是一份生产可用的最小规则集策略为默认丢弃只放行 SSH、HTTP/HTTPS 与必要的 ICMP#!/usr/sbin/nft -f# /etc/nftables.confflush ruleset table inet filter{# 动态黑名单配合 fail2ban 或自定义脚本写入setblackhole{typeipv4_addr flags dynamic,timeouttimeout1h}chain input{typefilter hook input priority filter;policy drop;ct state established,related accept# 放行已建立连接的回包ct state invalid drop# 丢弃畸形状态包iif lo accept# 放行本地回环# ICMP 限速保留 PMTU 发现能力ipprotocol icmp icmptype{echo-request, destination-unreachable}\limit rate10/second accept# SSH限速 6 次/分钟抵御爆破tcp dport2222ct state new\limit rate6/minute burst4packets accept tcp dport{80,443}ct state new acceptipsaddr blackhole drop log prefixnft-drop: level warn limit rate10/minute}chain forward{typefilter hook forward priority filter;policy drop;}chain output{typefilter hook output priority filter;policy accept;}}应用顺序极其重要先nft -c -f /etc/nftables.conf做语法检查再加载规则最后才systemctl enable nftables。如果先 enable 再写规则重启后可能直接失联。sudonft-c-f/etc/nftables.conf# 仅检查不加载sudonft-f/etc/nftables.conf# 加载sudosystemctlenable--nownftables# 持久化sudonft list ruleset|head-40# 确认规则生效最后用外部视角验证端口暴露面nmap-Pn-p- --min-rate1000203.0.113.10# 期望结果仅 2222/tcp、80/tcp、443/tcp 为 open其余 filtered四、踩坑与优化建议1. 永远保留一条逃生通道。修改 SSH 或防火墙时保持一个已认证的会话不关闭用第二个会话验证。Ubuntu 可临时启用systemd救援或云厂商 VNC 控制台。2. 改 SSH 端口不是安全措施。它只是降低日志噪音。真正有效的是关闭密码认证 限速。扫描器扫全端口只需几十秒把安全寄托在端口隐蔽上是自欺欺人。**3.更多硬核网安与AI工具包请扫码获取完整源码
返回列表