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

如何快速禁用 root 远程 SSH 登录
直接改 /etc/ssh/sshd_config 里的 PermitRootLogin 是最有效的方式,但改完不重启服务或不重载配置,等于没做。
- 必须设为
PermitRootLogin no(不是without-password或prohibit-password,后者仍允许密钥登录,风险未清) - 修改后运行
sudo systemctl reload sshd(Ubuntu/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 协议探测、甚至成功登录后的异常命令行为完全无感。
该系统采用多层模式开发,这个网站主要展示女装的经营,更易于网站的扩展和后期的维护,同时也根据常用的SQL注入手段做出相应的防御以提高网站的安全性,本网站实现了购物车,产品订单管理,产品展示,等等,后台实现了动态权限的管理,客户管理,订单管理以及商品管理等等,前台页面设计精致,后台便于操作等。实现了无限子类的添加,实现了动态权限的管理,支持一下一个人做的辛苦
- 在
/etc/fail2ban/jail.local中启用sshd-ddosjail,它专门匹配大量短连接(sshd\[.*\]: Connection closed by invalid user类日志) - 加一条自定义 filter:匹配
Failed password for .* from <host></host>的同时,也捕获Invalid user .* from <host></host>——后者常被忽略,但正是扫描器最活跃的痕迹 - 把
bantime设为1h以上(如3600),别用默认的10m;findtime建议设为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_admin、cap_dac_override等高危项 -
ProtectSystem=strict和ProtectHome=yes能阻断对/usr、/boot、/home的写入,但要注意:若服务需要写日志到/var/log/myapp/,得额外用ReadWritePaths=/var/log/myapp - 测试权限是否真受限:启动后进容器或用
sudo nsenter -t $(pgrep myapp) -r -w /bin/sh,尝试touch /tmp/test或cat /proc/kcore,应失败
安全加固不是堆配置,而是每次加一条规则,都得反问一句:这个服务真的需要它吗?很多崩溃和兼容问题,都源于过度限制后没验证真实路径和依赖。









