资讯动态

Linux安全加固实操:从账号SSH到内核防火墙的完整指南

发布时间:2026/10/6 11:22:45 来源:尧图企业网站定制
简介面向Linux系统运维人员与安全工程师的加固实操指南从系统安装阶段的安全设置讲起围绕用户帐号安全和网络服务安全两大主线展开。内容涵盖密码安全策略制定、弱口令检查、Password Shadowing机制、密码管理流程并针对网络层给出服务过滤、/etc/inetd.conf配置、R服务安全限制、Tcp_wrapper访问控制及/etc/hosts.equiv文件管理等具体措施。资源为单一PDF文件大小仅40KB便于随时查阅或打印使用正文共16页目录结构清晰按概述、安装、用户帐号安全、网络服务安全等模块组织既适合初次接触Linux安全的入门者建立整体加固框架也能帮助有经验的运维人员对照手册逐项自查、系统排查薄弱环节形成从密码策略到网络访问控制的完整加固闭环。目前已有1332人学习浏览是一份精炼实用的Linux安全基线参考。1. LINUX安全加固先想清楚要挡住谁再打开手册大多数 Linux 服务器出问题不是被什么零日漏洞打穿而是默认配置太宽松SSH 开着 root 密码登录、rpcbind 这些没人记得的服务挂在公网、内核参数全部是出厂值。拿到的这份 LINUX安全加固手册本质上是给系统做减法把用不到的端口、账号、服务和隐患参数一个个收掉让攻击者即使拿到一个普通执行权限也很难提权、横向、持久化。它的使用对象很明确负责生产服务器、云主机和物理机的运维、系统管理员以及做攻防演练或 CTF 题时需要对目标环境做防御加固的安全工程师。我这篇不按手册的目录一章章念而是按真正动手的顺序讲先盘点、再收紧、最后验证把参数含义和翻车点说透。2. 加固前必做的三件事资产盘点、基线选型与风险分级很多人拿到手册直接就在生产机上敲命令结果业务先跪了。我自己最早踩过这个坑所以在讲具体加固项之前必须先说清楚准备工作。Linux 安全加固不是一条条指令的堆叠而是一套面向基线的收敛过程动手之前你得知道自己面对的是什么样的系统、按什么标准来收、先收哪里后收哪里。2.1 资产盘点先把跑着的服务、端口、内核版本摸清楚第一步不是改配置而是给这台机器做一次完整的“人口普查”。我在拿到一台新接管的服务器时通常会用下面这组命令把基础信息捞一遍uname -a # 内核版本和架构判断有没有安装非标准内核模块 cat /etc/os-release # 发行版版本决定后续用 apt 还是 yum 装加固工具 ss -tulnp # 当前监听的所有 TCP/UDP 端口和对应进程 systemctl list-units --typeservice --staterunning # 所有正在运行的服务单元 ps -ef # 当前进程列表后面会专门讲异常进程排查这组命令的输出就是你的加固起点。uname -a和/etc/os-release决定了下文里的命令和源是否适用ss -tulnp是确认暴露面的关键公网 IP 的机器如果监听端口里有 0.0.0.0:3306 这类数据库端口这就是第一个高优先级问题systemctl list-units能让你发现一堆“装系统时自动带上、但根本没用”的服务比如 avahi-daemon、cups、rpcbind这些后面要逐个关掉。盘点的目的不是把命令输出存个档而是让你能给每个端口和服务回答三个问题谁在用、是否需要对外、挂了会产生什么后果。回答不上来的服务一律进入“待关闭”清单。2.2 基线选型用 CIS Benchmark 还是自建精简基线确定有什么之后要确定“加固到什么程度”。当前业内最常参考的 Linux 基线是 CIS Benchmark它把加固项分成账号策略、SSH 服务、内核网络参数、文件权限、审计日志、防火墙等十几个域每项都标注了对应风险和检测方法国内单位也常按等保 2.0 里“主机安全”的测评项来对齐通常要求身份鉴别、访问控制、入侵防范、审计记录。两种选型我都用过实际做法是拿 CIS 的项作为底表按业务能接受的牺牲程度删掉一批“会阻断现有流程”的项。基线选型不需要一开始做到完美但要有个清单。下面这张表是我给普通生产服务器定基线时最常用的分类方式加固域建议做的典型项误伤风险账号认证密码过期时间、最小长度、登录失败锁定低注意别把弱密码存量账号逼死SSH 服务禁用 root 登录、密钥替换口令、限制登录失败次数中公钥没配好会把自己关在门外内核网络地址随机化、关闭 ICMP 重定向、开启 SYN cookies中关闭转发会影响容器网络文件权限shadow 文件收紧、查找全局可写文件、umask 收紧低但要小心应用写日志审计日志rsyslog 开启、auditd 规则、日志转储低只占用磁盘空间防火墙默认丢弃、白名单放行高规则顺序错了直接断网建议不要直接照搬全套测评项那是审计视角落地时要从“最小可用”出发先把表里标“中风险误伤”的项设计成可回滚配置再逐步收紧。2.3 风险分级与回滚准备先改认证再动网络一台服务器上往往同时跑着数据库、Web 服务和内网对接进程它们对停机或连接中断的容忍度完全不一样。我的处理顺序是先做安全收益最高、误伤最小的认证加固再做系统内核参数最后动防火墙和 SELinux 这类可能直接阻断业务的项。动手以前花十分钟做一份可回滚快照这是 Linux 安全加固里的“后悔药”mkdir -p /root/backup/$(date %F) cp -a /etc/ssh /etc/pam.d /etc/login.defs /etc/sysctl.conf /etc/sysctl.d /root/backup/$(date %F)/ sysctl -a /root/backup/$(date %F)/sysctl_before.txt systemctl list-unit-files --stateenabled /root/backup/$(date %F)/enabled_services.txt备份/etc下的关键配置目录是因为后面每一步都在改这些文件sysctl -a快照会在内核参数改坏时帮你还原到改动前的全部当前值启用服务清单也是一个基线后面排查新出现可疑服务时会用到。有了这个备份后面第 6 章讲的回滚才算有据可依。3. 账号与 SSH 加固从口令到登录链路的完整收紧账号是 Linux 系统安全的第一道门也是最容易被忽视的门。很多加固手册的第一章就是口令策略和 SSH 配置原因很简单暴力破解、弱口令登录、离职员工账号未回收是运维事故里出现频率最高的三件事。这一章我会把 PAM 密码策略、SSH 服务参数、sudo 权限回收串成一条完整的登录链路来改。3.1 密码策略与 PAM 配置把口令的“下线时间”管起来口令策略不是单纯设一个复杂密码而是要把密码的生命周期管理起来。先改/etc/login.defs里的四个参数# /etc/login.defs 修改后仅对新创建用户生效 PASS_MAX_DAYS 90 PASS_MIN_DAYS 7 PASS_WARN_AGE 14PASS_MAX_DAYS 90要求密码每 90 天必须更换PASS_MIN_DAYS 7防止用户当天改完又立刻改回去以绕过历史记录PASS_WARN_AGE 14是提前 14 天提醒用户到期。这三个参数共同保证口令有上限、有下限、有提醒。注意它对存量用户不生效所以还要用chage -M 90 -m 7 -W 14 用户名对现有用户逐个设置或者直接对/etc/shadow里所有账号统一刷一遍。口令复杂度由 PAM 的pam_pwquality模块控制。在 CentOS/RHEL 系上是/etc/pam.d/password-auth和/etc/pam.d/system-auth在 Ubuntu/Debian 系上是/etc/pam.d/common-password加一行password requisite pam_pwquality.so retry3 minlen12 dcredit-1 ucredit-1 lcredit-1 ocredit-1这里的minlen12控制最小长度 12 位dcredit-1表示必须包含至少 1 位数字负号表示“必须包含”后面三个参数同理分别表示大写字母、小写字母、特殊符号。retry3是允许用户最多失败 3 次重新输入。需要提醒的是复杂度策略只拦新密码存量弱密码还得靠后续的批量检查和chage强制过期来兜底。如果你用的是国产 Linux比如基于 openEuler、统信 UOS 的服务器PAM 配置文件路径和pwquality模块名称基本与 RHEL 系一致差异通常在/etc/pam.d/system-auth是否被单独链接用ls -l /etc/pam.d/确认一下即可。3.2 SSH 服务加固禁用 root 登录前先确认自己有钥匙SSH 是服务器最常暴露给外网的服务也是爆破和提权的第一入口。加固手册里最核心的一段配置集中在/etc/ssh/sshd_config# /etc/ssh/sshd_config 关键加固项改完执行 sshd -t 再重载 PermitRootLogin no # 禁止 root 直接 SSH 登录必须用普通用户 su 或 sudo PasswordAuthentication no # 禁用密码登录只允许密钥认证 PubkeyAuthentication yes # 开启公钥认证 MaxAuthTries 3 # 每次连接最多尝试 3 次 LoginGraceTime 30 # 登录超时 30 秒 ClientAliveInterval 300 # 服务端每 300 秒检查一次客户端存活 ClientAliveCountMax 0 # 客户端无响应 1 次即断开 AllowUsers ops deploy # 只允许这两个用户从 SSH 登录PermitRootLogin no和PasswordAuthentication no是收益最大的两项但也是最容易把自己关在外面的两项。我的建议是分两步走第一步先把自己的公钥写进~/.ssh/authorized_keys用密钥能登录之后再在sshd_config里把密码登录关掉。MaxAuthTries 3和LoginGraceTime 30用来限制暴力破解的连接频率AllowUsers是账号白名单把不需要登录的人挡在外面。改完配置必须做两件事sshd -t检查语法然后systemctl reload sshd而不是 restart因为 reload 不断开现有连接避免重载失败把自己踢下线。任何一次 SSH 加固操作之前我还会额外开一个临时 tmux 会话防止网络波动和配置错误叠加在一起导致彻底失联。3.3 sudo 权限回收与最小授权把“万能钥匙”换成门禁卡账号章节里最容易忽略的是 sudo。很多服务器上直接给研发账号ALL(ALL) ALL这和给攻击者发了一张万能卡没什么区别。加固的思路是收敛授权范围用命令别名替代无差别的ALL# /etc/sudoers.d/webadmin 示例由 root 执行 visudo -f 校验后生效 Cmnd_Alias WEBADMIN /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx, \ /usr/bin/nginx -t, /usr/bin/tail -f /var/log/nginx/* webadmin ALL(root) NOPASSWD: WEBADMIN这段配置的含义是webadmin用户只能在webadmin这台或这一组机器上、以 root 身份执行冒号后面限定的那几条命令且不需要输密码。NOPASSWD只应用在限定命令上是可接受的因为nginx -t做个语法检查不会伤到系统但如果它是ALL就必须要求输入密码否则别人拿到这个账号等于拿到一台 root 级别的跳板机。sudo 收紧之后还要回头查两个地方。第一grep -P ^[^:]:[^:]:0: /etc/passwd把所有 UID 为 0 的账号列出来正常情况下应该只有 root 一个多出来的就是隐藏管理员后门第二用getent group sudoDebian/Ubuntu或getent group wheelRHEL 系查看哪些用户拥有 sudo 资格把不用的账号从组里移掉。最小授权这一步做完提权攻击的可用路径就窄了大半。4. 系统与内核加固文件权限、内核参数与隐藏风险排查账号和登录链路收紧了攻击者直接进门的难度变大了但还要防已经拿到普通权限的人就地提权、落地持久化。这一章做的是系统层加固把文件权限和不可变属性管好把内核里影响纵深防御的参数调对最后用一组命令找出那些已经在系统里潜伏的异常。4.1 关键文件权限与不可变属性让攻击者改不了、写不动Linux 权限模型中最常被忽略的是“全局可写”和“属主不对”这两类问题。先跑一个全盘扫描find / -xdev -type d -perm -0002 -print 2/dev/null # 查找全局可写目录 find / -xdev -type f -perm -0002 -print 2/dev/null # 查找全局可写文件 find / -xdev -type f -nouser -o -nogroup 2/dev/null # 查找属主或属组已删除的僵尸文件第一类全局可写目录是攻击者放脚本、替换二进制文件的温床常见的/tmp要保留可写但通过修改/tmp挂载选项加nodev,nosuid,noexec来限制执行能力第二类无主文件很容易被利用——因为 nobody 或某个已删除用户的文件任何同名新用户都可能接管它。对这些文件的处理不做一刀切逐个确认业务方是谁确认为垃圾就删确认为业务文件就chown给正确属主。对确定不能动的关键文件用chattr加不可变属性这是很多运维手册里一笔带过但非常有效的防篡改手段chattr i /etc/passwd /etc/group /etc/shadow # 加上写保护锁root 也不能直接改 lsattr /etc/passwd # 查看是否带 ----i---------- 标记i是 immutable加上之后文件连 root 都不能改写、不能删除、不能创建硬链接对防止后门篡改账号文件很有用。但注意chattr i用在/etc/shadow上会导致你以后用useradd或passwd创建新用户时报错改动前必须先chattr -i /etc/shadow解锁。我见过有人把整个/etc目录加了i结果 cron、日志轮转全部写入失败这就是典型的加固翻车所以不可变属性只建议加在最关键的少数几个文件上。4.2 sysctl 内核参数地址随机化与网络防欺骗的实测组合内核参数加固主要解决两类问题利用内存布局问题提权和利用网络协议特性发起扫描、欺骗、DoS。常见做法是在/etc/sysctl.d/下建一个独立配置文件比如99-hardening.conf# /etc/sysctl.d/99-hardening.conf kernel.randomize_va_space 2 # 开启 ASLR地址空间随机化 kernel.kptr_restrict 1 # 限制 /proc/kallsyms 暴露内核符号防止被用来计算内核基址 kernel.dmesg_restrict 1 # 限制 dmesg 读取权限 net.ipv4.conf.all.accept_redirects 0 # 不接收 ICMP 重定向报文 net.ipv4.conf.all.accept_source_route 0 # 丢弃带源路由选项的包 net.ipv4.conf.all.rp_filter 1 # 开启反向路径过滤杜绝源地址伪造 net.ipv4.tcp_syncookies 1 # 开启 SYN cookies缓解 SYN 洪泛 net.ipv4.icmp_echo_ignore_broadcasts 1 # 忽略广播 ping写入后执行sysctl --system重新加载再用sysctl net.ipv4.conf.all.accept_redirects这类命令验证每一项的当前值是否已生效。每个参数我单独说明kptr_restrict和dmesg_restrict是配合使用的它们把内核符号地址和内核日志从普通用户视野里隐去攻击者提权前最爱的信息源就被堵住了rp_filter是反伪造的关键尤其对公网服务器它能拒绝那些源地址不在路由回程路径上的包accept_redirects和accept_source_route则直接指向一种常见的中间人手法——向受害主机发送伪造的 ICMP 重定向来篡改它的路由表。这块有一个经常踩的坑很多服务器本身起着路由转发的作用比如 Docker 宿主机的net.ipv4.ip_forward1。如果你同时把accept_redirects或rp_filter改成激进值容器和宿主机之间的通信可能变得时好时坏。所以内核参数也要按第 2 章盘点出来的角色来定纯粹的 web 服务器可以全开云原生节点要谨慎测试rp_filter对外挂容器网卡的影响。4.3 异常进程、定时任务与登录后门排查系统层加固最后要确认一件事这台机器是不是已经被入侵过、留下了后门。Linux 提权和持久化的常见手法里定时任务和系统服务是最容易被复用的载体。排查路径我一般固定为三条# 1. 检查所有定时任务重点是 /etc/cron.* 目录里的系统级条目 cat /etc/crontab ls -la /etc/cron.d/ /etc/cron.daily/ # 2. 检查正在运行的进程关注名字被空格、中括号伪装的可疑进程 ps -eo pid,user,stat,cmd --sortpid | awk $3 ~ /^[A-Z]/ {print} # 3. 检查最近启动的系统服务和端口监听是否有不明新增 systemctl list-units --typeservice --staterunning | grep -v -E systemd|dbus|ssh|nginx|mysql|redis ss -tulnp | grep -v -E 127.0.0.1|::1定时任务里的坑是某些后门不会写在/etc/crontab里而是以/etc/cron.d/下带随机文件名的一条记录存在所以ls -la看目录里有没有“面生”的文件比直接cat更有效。进程排查时攻击者经常用一个可执行程序的副本伪装成[kworker]这类内核线程名真正的内核线程名称都是带方括号且没有路径的如果遇到/[kworker]/tmp/x这种组合就要立刻警觉。端口排查则关注监听在0.0.0.0上的非本地端口——反弹 shell 和代理后门通常长这样。这节不追求一条命令找到所有后门而是把“新出现的、没人认识的服务和端口”暴露出来。配合第 2 章备份的enabled_services.txt凡是当前运行服务和备份基线不一致的逐个拉出来审一遍这就是加固题里排查隐藏风险的标准做法。5. 服务与防火墙加固常见翻车点排查与避坑路径前两章把账号和系统层收紧之后剩下的工作集中在网络暴露面停掉多余服务、配置防火墙规则、处理好 SELinux 与业务之间的摩擦。这一章我会把操作步骤和真正的血泪教训放在一起讲因为网络加固是所有加固动作里最容易让自己和业务一起翻车的环节。5.1 先做服务收敛把没在用的端口关掉再做防火墙防火墙规则只能拦截新连接它拦不住本机已经监听的恶意端口。所以正确的顺序是先收敛服务再配置防火墙。常见做法是先把那些“装系统时带上但没人用”的服务停掉systemctl disable --now avahi-daemon cups rpcbind 2/dev/null systemctl stop --now telnet.socket 2/dev/null ss -tulnp | grep -v -E sshd|nginx|mysqld|redisdisable --now会同时做两件事立刻停止当前进程并且把开机自启动的符号链接从/etc/systemd/system的多用户目标目录下移除这样重启后也不会再出现。服务收敛后用ss -tulnp重新看一遍监听端口排除sshd、nginx、mysqld、redis 这类确认真实业务需要的端口后剩下的监听项要么补进防火墙白名单要么回到第 4 章查进程。5.2 防火墙规则落地默认策略的最后一步才能设为 DROP防火墙配置绝对是加固流程里维护事故率最高的操作。很多手册给出的规则写法是“先 DROP 再放行”但直接执行会让你的 SSH 当场断掉。我推荐的顺序是先放行管理端口再设置默认拒绝。以 firewalld 为例firewall-cmd --permanent --zonepublic --add-servicessh firewall-cmd --permanent --zonepublic --add-servicehttp firewall-cmd --permanent --zonepublic --add-servicehttps firewall-cmd --permanent --zonepublic --change-interfaceeth0 firewall-cmd --reload第一步把 ssh、http、https 加为放行服务第二步把 eth0 放入默认的 public zone第三步 reload 使配置生效。之后再把默认 target 从default改成DROP。如果用的是 iptables逻辑完全一致但要特别注意规则的顺序-A INPUT -j DROP必须放在所有放行规则之后否则它会匹配所有数据包并直接丢弃。我的习惯是先用一个临时脚本放行ESTABLISHED,RELATED和自己当前的 SSH 连接再在脚本末尾追加 DROP 规则最后给脚本设置 30 秒的延迟执行——这样即使规则写错了连接断开后 30 秒内规则自动恢复人不会彻底失联。这个 30 秒“后悔药”是我做网络加固时的保留技巧也建议你把它写进自己团队的变更单里。对核心数据库端口如 3306、5432不要直接开放到 public zone而要新建一个internal或自定义 zone只放行指定内网网段。防火墙的价值不在于挡住所有 IP而在于只让该来的流量进来。5.3 避坑清单五条运维里最常见的 Linux 加固翻车记录加固命令本身不复杂复杂的是那些“配置看起来对、服务却起不来”的瞬间。下面五条是我在处理 Linux 运维故障案例时多次遇到的高频问题按现象、原因、解决的格式拆开说希望你不需要再踩一遍。现象一改完 sshd_config所有 SSH 连接都连不上了。原因PermitRootLogin no和PasswordAuthentication no是在没有确认公钥可用的情况下同时启用的密钥未部署成功或authorized_keys权限不对导致唯一登录通道失效。解决不要在远程会话里直接改禁用项先用 tmux/screen 保持一个长会话改完先sshd -t校验语法再用systemctl reload sshd让现有连接不断最后另开一个窗口验证新配置能登录再关掉旧窗口。现象二防火墙规则一执行服务器瞬间失联机房只能靠带外管理重启。原因在还没有任何放行规则时就把默认策略改成了 DROP等于把自己家的钥匙在出门前扔了。解决管理端口必须最先放行且需要放行ESTABLISHED,RELATED让回程包能进来生产环境用延时生效脚本做变更所有入方向规则写完后先iptables -L -n或firewall-cmd --list-all检查一遍再决定是否让规则持久化。现象三按加固手册关闭了 ICMP 重定向整个内网的机器互相 ping 不通了。原因不只关了accept_redirects还把net.ipv4.icmp_echo_ignore_all设成了 1把 ICMP 全禁了。内网监控和多路径探测依赖一定能用。解决只关accept_redirects和accept_source_route就够了icmp_echo_ignore_all不要全局开启想防探测可以只对公网接口开启保留内网接口的 ICMP 能力。现象四给/etc/passwd加了chattr i之后系统升级、创建用户全部失败。原因不可变属性锁死了关键文件但 rpm/dpkg 在升级时需要对/etc/passwd做临时修改和替换直接写入被拒绝。解决chattr i只用于最核心、极少变化的文件且必须在系统升级和账号变更前chattr -i解锁惯例上是把系统升级窗口与加固锁定窗口分开升级前批量解锁升级后重新锁定并做一次lsattr校验。现象五SELinux 设为 Enforcing 后nginx 绑定非标准端口或读自定义目录直接启动失败。原因SELinux 的布尔值和文件上下文没有跟随配置改动而更新。解决先用ausearch -m avc -ts recent查看被拒事件再用semanage port -a -t http_port_t -p tcp 8080放行 nginx 的非标准端口对自定义目录执行semanage fcontext -a -t httpd_sys_content_t /data/web(/.*)?后restorecon -Rv /data/web。如果团队对 SELinux 不熟我建议先用setenforce 0观察审计日志确认没有 AVC 拒绝后再在维护窗口内正式开启 Enforcing。6. 验证你的加固结果手动核查、基线扫描与回滚技巧加固做完不等于结束要能证明“我改了什么、效果如何、出问题怎么退回”。这一章是一套收尾习惯先用手工命令核对关键项再用扫描工具整体过一遍最后把回滚路径说清楚。6.1 手工核查清单核查项预期结果命令SSH root 登录应显示 nosshd -T | grep -i permitrootlogin密码策略应显示 90/7/14chage -l 用户名全局可写文件应无异常输出find / -xdev -type f -perm -0002sysctl 参数应显示 2/1/1sysctl kernel.randomize_va_space kernel.kptr_restrict监听端口应仅剩业务端口ss -tulnp防火墙默认策略应为 dropiptables -L -n | head6.2 自动化扫描与回滚路径手工核查之后我一般会在测试环境跑一轮自动化基线扫描最常见的是 Lynis执行之前用apt install lynis或yum install lynis安装装好后直接执行lynis audit system。扫描报告会给出一个 hardening index 分数但分数高低不是重点重点在报告末尾的“建议”列表——它会把每一项加固缺失标成suggestion或warning。我的习惯是把分数前后对比当参考把建议导致的操作风险逐条人工复核宁可不追求满分也不让一条建议把业务弄挂。回滚路径靠第 2 章的备份实现配置类文件直接用cp -a的备份覆盖回去再systemctl restart对应服务sysctl 参数用sysctl -f /root/backup/sysctl_before.txt恢复或者手动改回99-hardening.conf后sysctl --system如果改坏了 SSH而备份也覆盖不了当前连接就用机房/控制台的 VNC 或单用户模式把改动的配置行还原。这一套流程我用下来最大的心得是每次加固必须把改动清单记在变更单里倒不是给别人看而是三个月后系统出问题时你可以准确地说出“我改过哪六个参数”。整套 Linux 安全加固我在线上环境前后推动过几十次最有价值的不是扫描分数从 30 涨到 80而是攻击者进来之后发现账号是锁死的、端口是收敛的、内核提权路径是堵住的最后只能灰溜溜退出去。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑