应先用systemctl list-units --type=service --state=running识别非核心运行服务,再通过systemctl list-dependencies --reverse检查依赖关系,确认无业务关联后执行stop测试并disable禁用;同时用ss -tuln或netstat -tuln核查监听端口,确保如127.0.0.1:631、:::5353等无关端口已消失。

怎么关掉不用的服务和端口
不关掉闲置服务,等于给攻击者留着一扇没锁的后门。很多默认安装的 Linux 发行版会启动 rpcbind、avahi-daemon、bluetooth、cups 等服务,但你的 Web 服务器根本用不上它们。
先查正在运行的服务:systemctl list-units --type=service --state=running
- 确认每个服务用途,比如
sshd必须留,postfix若没发邮件需求就该停 - 停用并禁止开机启动:
systemctl stop avahi-daemon && systemctl disable avahi-daemon - 对老旧 init 系统(如 CentOS 6)用:
chkconfig avahi-daemon off - 别只停服务,还要检查监听端口:
ss -tuln或netstat -tuln,确认127.0.0.1:631(CUPS)、:::5353(Avahi)等是否已消失
SSH 怎么配才不算“默认状态”
默认的 sshd_config 是攻击者的温床。直接改主配置文件风险高,推荐用 drop-in 方式管理:
- 新建
/etc/ssh/sshd_config.d/99-hardening.conf,只写加固项,避免覆盖未来更新 - 必须设
PermitRootLogin no和PasswordAuthentication no,否则密钥再强也白搭 -
AllowUsers比DenyUsers更安全——只列明确要放行的用户,比如AllowUsers deploy@192.168.10.0/24 -
ClientAliveInterval 300+ClientAliveCountMax 3组合,实际超时约 15 分钟,防僵死连接堆积 - 改完执行
sshd -t验证语法,再systemctl reload sshd,别用 restart(可能断连接)
用户权限怎么做到“最小化”
一个能 sudo su - 的普通用户,和 root 几乎没区别。加固不是靠删账号,而是靠分权和限制:
- 用
awk -F: '($3==0)' /etc/passwd检查 UID 0 账号,确保只有root一行 - 禁用空密码:
awk -F: '($2=="")' /etc/shadow,若有输出,立刻passwd username - 给运维用户分配具体命令权限,例如:
%deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx, /usr/bin/rsync - 禁止 shell 转义:在
/etc/sudoers中加Defaults:%deploy !shell_escape(需 sudo 1.9.0+) - 用
pam_wheel控制su权限,而不是开放su -给所有人
内核参数哪些真该调,哪些只是“看起来很美”
改 /etc/sysctl.conf 不是堆参数越多越安全,重点在防御明确威胁路径:
-
net.ipv4.conf.all.rp_filter = 1防 IP 欺骗,但若用多路径或策略路由,可能误杀合法流量 -
kernel.kptr_restrict = 2隐藏内核符号地址,影响perf和部分调试工具,生产环境建议设为1(仅对 root 可见) -
vm.swappiness = 1减少 swap 使用,降低敏感内存被写盘风险;设为0可能触发 OOM killer 异常终止进程 -
fs.suid_dumpable = 0禁止 SUID 程序 core dump,防止泄露特权进程内存布局 - 所有 sysctl 修改后必须运行
sysctl -p生效,且注意某些参数(如kernel.randomize_va_space)无法运行时修改,需重启











