Linux 系统安全加固与防护

5次阅读

最有效禁用root远程ssh登录是设permitrootlogin no并重载sshd服务;/tmp需挂载noexec,nosuid,nodev防提权;fail2ban应启用sshd-ddos jail并匹配invalid user日志;systemd服务要设nonewprivileges、capabilityboundingset和protectsystem=strict。

Linux 系统安全加固与防护

如何快速禁用 root 远程 SSH 登录

直接改 /etc/ssh/sshd_config 里的 PermitRootLogin 是最有效的方式,但改完不重启服务或不重载配置,等于没做。

  • 必须设为 PermitRootLogin no(不是 without-passwordprohibit-password,后者仍允许密钥登录,风险未清)
  • 修改后运行 sudo systemctl reload sshdubuntu/debian)或 sudo systemctl reload sshd(RHEL/centos),restart 更稳妥但会断当前连接
  • 操作前确保你已有另一个具备 sudo 权限的普通用户,且该用户已配好 SSH 密钥——否则可能被锁在系统外
  • 检查是否生效:用 ssh root@host 测试,应直接拒绝;再查日志 sudo journalctl -u sshd | grep "root" 确认无成功登录记录

为什么 /tmp 必须挂载 noexec,nosuid,nodev

默认的 /tmp 是攻击者提权的高频跳板,比如上传恶意 ELF 文件直接执行,或利用 setuid 程序绕过权限限制。

  • /etc/fstab 中添加对应挂载选项:tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0
  • 立即生效用 sudo mount -o remount,noexec,nosuid,nodev /tmp,但重启后失效——必须写进 /etc/fstab
  • 注意:某些老旧软件(如部分 Java 应用、临时编译脚本)会往 /tmp 写可执行文件,启用 noexec 后会报 Permission denied 错误,需排查并迁移临时工作目录
  • nodev 防止在 /tmp 创建设备节点(如 /tmp/attack_dev),nosuid 让任何 setuid 位在该目录下失效

fail2ban 配置里最容易漏掉的三个匹配项

默认的 sshd jail 往往只拦密码爆破,对暴力扫端口、SSH 协议探测、甚至成功登录后的异常命令行为完全无感。

  • /etc/fail2ban/jail.local 中启用 sshd-ddos jail,它专门匹配大量短连接(sshd[.*]: Connection closed by invalid user 类日志)
  • 加一条自定义 Filter:匹配 Failed password for .* from <host></host> 的同时,也捕获 Invalid user .* from <host></host> ——后者常被忽略,但正是扫描器最活跃的痕迹
  • bantime 设为 1h 以上(如 3600),别用默认的 10mfindtime 建议设为 600(10 分钟),避免误伤内网扫描或运维误操作
  • 验证是否生效:用 sudo fail2ban-client status sshd 查当前封禁 IP;日志路径要和 filter 定义一致,常见错配是 /var/log/auth.log(Debian) vs /var/log/secure(RHEL)

systemd 服务最小权限原则怎么落地

多数人只记得加 User=,但真正关键的是限制能力(capabilities)、文件系统访问和网络范围。

  • 在 service 文件的 [Service] 段加 NoNewPrivileges=yes,阻止进程后续通过 execve 提权
  • CapabilityBoundingSet= 显式声明所需能力,例如 Web 服务只需 cap_net_bind_service(绑定 1024 以下端口),删掉 cap_sys_admincap_dac_override 等高危项
  • ProtectSystem=strictProtectHome=yes 能阻断对 /usr/boot/home 的写入,但要注意:若服务需要写日志到 /var/log/myapp/,得额外用 ReadWritePaths=/var/log/myapp
  • 测试权限是否真受限:启动后进容器或用 sudo nsenter -t $(pgrep myapp) -r -w /bin/sh,尝试 touch /tmp/testcat /proc/kcore,应失败

安全加固不是配置,而是每次加一条规则,都得反问一句:这个服务真的需要它吗?很多崩溃和兼容问题,都源于过度限制后没验证真实路径和依赖。

text=ZqhQzanResources