Linux服务器安全加固实战:从账户权限到入侵检测的落地指南

📅 2026/7/4 17:42:28
Linux服务器安全加固实战:从账户权限到入侵检测的落地指南
1. 项目概述为什么你需要一份“落地版”安全加固清单如果你正在管理一台或多台Linux服务器无论是个人项目、初创公司还是企业级应用安全加固都是一个绕不开的话题。网上关于“Linux安全”的文章浩如烟海从原理到概念讲得天花乱坠但当你真正坐到服务器前面对黑漆漆的命令行最常问自己的问题往往是“第一步到底该敲什么命令” 或者“我昨天看的那篇讲SSH加固的文章具体参数怎么设来着”这就是我整理这份《Linux服务器安全加固速查表落地版》的初衷。它不是一个面面俱到的安全理论教科书而是一份可以直接“抄作业”的行动指南。我把自己在运维一线十多年里反复验证、真正有效的加固步骤和命令按照从外到内、从易到难的逻辑整理成了这份清单。它的核心价值在于“落地”——每一个条目都对应着一条或多条可执行的命令你甚至可以复制粘贴到你的终端里当然理解后再执行更安全。这份清单覆盖了从最基础的账户与认证安全到网络服务加固、系统层面防护再到入侵检测与应急响应的全链路。无论你是刚接手服务器的运维新人还是想系统化梳理安全体系的老手都能从中找到即用的解决方案。我们接下来要做的就是把这些纸上或者说屏幕上的命令变成你服务器上实实在在的防护墙。2. 安全加固的核心思路与优先级在开始敲命令之前我们必须先理清思路。安全加固不是把网上看到的所有安全建议都执行一遍那样可能会让你的服务变得不可用。正确的做法是基于“攻击面最小化”和“纵深防御”的原则按照风险等级和操作影响分层次、有步骤地推进。2.1 理解“攻击面”从门户到内核想象你的服务器是一座城堡。攻击者会尝试所有可能的入口城门SSH/RDP等远程管理端口这是最直接的入口如果城门大开或守卫密码太弱城堡瞬间易主。城墙上的小门其他开放的网络服务比如Web服务器80/443、数据库3306, 5432、缓存6379等。每个开放端口都是一个潜在的入口。城堡内的叛徒弱权限的本地用户和服务攻击者一旦通过某种方式进入比如利用Web应用漏洞就会尝试在内部提权从一个低权限用户变成“国王”root。城堡的结构性缺陷有漏洞的系统软件或内核即使所有门都关好了如果城墙内核本身有裂缝攻击者也可能直接炸开一个洞。我们的加固清单就是按照“先关紧大门再排查小门肃清内部最后加固城墙”的顺序来设计的。2.2 加固优先级立即做、尽快做、规划做我将加固措施分为三个优先级P0立即执行不执行就会面临极高风险且对业务影响极小。例如更新SSH配置禁用root登录、确保所有账户有强密码、检查并关闭非必要端口。P1本周内完成能显著提升安全水位需要一些测试和规划。例如配置防火墙规则、安装Fail2ban、设置文件系统关键目录的权限。P2纳入日常运维属于持续改进和监控范畴。例如部署日志集中分析与告警、定期漏洞扫描、制定并演练应急响应流程。遵循这个优先级可以确保我们用最小的代价最快地消除最致命的风险。3. 账户、认证与权限加固第一道防线这是安全的第一道也是最重要的一道防线。绝大多数入侵都始于一个薄弱的登录凭证。3.1 密码策略与账户管理默认的Linux密码策略非常宽松我们必须收紧它。1. 使用passwd修改弱密码这是第一步。为所有用户尤其是root和任何有sudo权限的用户设置一个强密码。强密码通常要求长度大于12位包含大小写字母、数字和特殊字符。2. 通过chage命令设置密码过期策略让密码定期强制更换即使泄露也能限制其有效时间。# 查看当前用户的密码策略 sudo chage -l 用户名 # 设置密码最长使用90天最短7天内不能修改过期前7天开始警告 sudo chage -M 90 -m 7 -W 7 用户名实操心得对于服务账户如nginx,mysql通常将其密码过期设置为99999相当于永不过期但前提是使用非常复杂的随机密码或密钥认证并禁用其登录shell。3. 编辑/etc/login.defs设置全局策略这个文件定义了创建新用户时的默认参数。sudo vim /etc/login.defs找到并修改以下关键参数PASS_MAX_DAYS 90 # 密码最大天数 PASS_MIN_DAYS 7 # 密码最小天数 PASS_MIN_LEN 12 # 密码最小长度建议 PASS_WARN_AGE 7 # 密码过期前警告天数4. 使用pam_pwquality模块增强密码复杂度CentOS/RHEL系对于CentOS/RHEL 7或Rocky Linux可以配置pam_pwquality。sudo vim /etc/security/pwquality.conf示例配置minlen 12 dcredit -1 # 至少包含一个数字 ucredit -1 # 至少包含一个大写字母 lcredit -1 # 至少包含一个小写字母 ocredit -1 # 至少包含一个特殊字符5. 锁定或删除无用账户检查/etc/passwd锁定那些不再使用的账户。# 查看所有可登录的账户有登录shell cat /etc/passwd | grep -v “/sbin/nologin” | grep -v “/bin/false” # 锁定一个账户无法登录但家目录等保留 sudo passwd -l 用户名 # 删除一个账户及其家目录 sudo userdel -r 用户名3.2 SSH服务深度加固SSH是运维的生命线也是攻击者的首要目标。以下配置均需修改/etc/ssh/sshd_config文件修改后需重启服务sudo systemctl restart sshd。1. 禁止Root用户直接登录这是铁律。永远不要用root直接SSH。PermitRootLogin no2. 禁用密码认证强制使用密钥对密码可能被暴力破解或钓鱼而密钥对公钥加密私钥解密在数学上更安全。PasswordAuthentication no PubkeyAuthentication yes操作流程在本地客户端生成密钥对ssh-keygen -t ed25519 -C “your_emailexample.com”推荐ed25519算法比RSA更安全高效。将公钥~/.ssh/id_ed25519.pub内容上传到服务器的~/.ssh/authorized_keys文件中。务必妥善保管私钥id_ed25519并为其设置密码短语。3. 限制监听接口和端口如果服务器有多个网卡只监听管理内网IP。修改默认22端口可以避开自动化扫描脚本的“广撒网”。# 只监听特定IP例如内网IP 192.168.1.100 ListenAddress 192.168.1.100 # 修改端口例如改为 5922 Port 5922注意修改端口后连接命令需指定端口ssh -p 5922 userserver_ip。同时务必在防火墙中放行新端口。4. 使用AllowUsers/AllowGroups白名单只允许特定的用户或用户组通过SSH登录。AllowUsers alice bob # 或 AllowGroups ssh-users5. 启用其他高级安全选项Protocol 2 # 只使用SSH协议第2版 ClientAliveInterval 300 # 300秒无活动则发送保活消息 ClientAliveCountMax 2 # 发送2次保活消息无响应则断开 MaxAuthTries 3 # 最大认证尝试次数配合Fail2ban PermitEmptyPasswords no # 禁止空密码3.3 Sudo权限精细化管理sudo是一把双刃剑配置不当会导致权限泛滥。原则是按需分配命令最小化。1. 使用visudo命令编辑配置永远不要直接编辑/etc/sudoers文件使用visudo命令它会在保存前检查语法防止配置错误导致所有sudo权限失效。sudo visudo2. 为用户或组分配特定命令权限例如只允许开发人员alice重启Nginx服务而不需要给她所有root权限。# 允许 alice 在不输入密码的情况下执行特定的 systemctl 命令 alice ALL(ALL) NOPASSWD: /bin/systemctl restart nginx, /bin/systemctl status nginx更安全的做法是创建一个用户组比如web-admins然后赋予该组权限。3. 禁用危险的默认行为在/etc/sudoers或/etc/sudoers.d/下的独立文件中可以添加以下行来增加安全性Defaults logfile/var/log/sudo.log # 记录所有sudo操作 Defaults log_input, log_output # 记录输入输出谨慎使用可能包含敏感信息 Defaults requiretty # 要求在一个真正的终端中运行sudo Defaults !env_reset # 谨慎使用控制环境变量是否重置4. 网络与服务层加固缩小攻击面服务器暴露在网络上每一个开放的服务都是一个潜在的风险点。我们的目标是只开放必要的端口并对开放的服务进行加固。4.1 防火墙配置使用firewalld或iptablesfirewalldCentOS/RHEL 7/Rocky Linux/Fedorafirewalld动态管理防火墙配置更直观。# 查看默认区域和活动区域 sudo firewall-cmd --get-default-zone sudo firewall-cmd --get-active-zones # 将接口如eth0添加到internal区域假设internal区域更安全 sudo firewall-cmd --zoneinternal --change-interfaceeth0 --permanent # 在public区域开放SSH新端口和HTTP/HTTPS sudo firewall-cmd --zonepublic --add-port5922/tcp --permanent sudo firewall-cmd --zonepublic --add-servicehttp --add-servicehttps --permanent # 移除不需要的默认服务如dhcpv6-client sudo firewall-cmd --zonepublic --remove-servicedhcpv6-client --permanent # 重载配置使其生效 sudo firewall-cmd --reload # 查看所有永久规则 sudo firewall-cmd --list-all --permanentiptablesDebian/Ubuntu或传统系统iptables是底层的防火墙工具功能强大但配置稍复杂。建议使用iptables-persistent来保存规则。# 清空所有现有规则谨慎操作最好在本地操作 sudo iptables -F sudo iptables -X # 设置默认策略INPUT链丢弃FORWARD链丢弃OUTPUT链允许 sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT # 允许本地回环接口 sudo iptables -A INPUT -i lo -j ACCEPT # 允许已建立的及相关连接保证对外发起的请求能收到回包 sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许SSH新端口5922和HTTP/HTTPS sudo iptables -A INPUT -p tcp --dport 5922 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许ICMPping sudo iptables -A INPUT -p icmp -j ACCEPT # 保存规则使用iptables-persistent sudo netfilter-persistent save4.2 服务发现与端口管理在配置防火墙之前你需要知道系统上到底运行着什么。1. 使用ss或netstat查看监听端口# 推荐使用 ss更快速 sudo ss -tulpn # 或 sudo netstat -tulpn查看输出关注LISTEN状态的端口。对于每一个监听在0.0.0.0即所有接口上的非必要服务你都需要做出决定关闭它或者用防火墙限制其访问来源。2. 使用systemctl管理服务# 查看所有运行中的服务 sudo systemctl list-units --typeservice --staterunning # 停止并禁用一个非必要服务例如蓝牙服务bluetooth sudo systemctl stop bluetooth sudo systemctl disable bluetooth # 屏蔽一个服务防止其被意外启动 sudo systemctl mask bluetooth4.3 安装与配置Fail2banFail2ban是一个入侵防御框架它监控系统日志如/var/log/auth.log当发现多次失败的登录尝试密码错误时会自动在防火墙层面封禁该IP地址一段时间。1. 安装Fail2ban# Debian/Ubuntu sudo apt update sudo apt install fail2ban # CentOS/RHEL/Rocky Linux sudo yum install epel-release sudo yum install fail2ban2. 配置Fail2ban不要直接修改/etc/fail2ban/jail.conf而是创建本地配置文件/etc/fail2ban/jail.local。sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo vim /etc/fail2ban/jail.local关键配置项[DEFAULT] # 封禁IP的时长 bantime 3600 # 在 findtime 时间内最大失败次数 maxretry 5 findtime 600 # 使用的防火墙后端根据系统选择 banaction iptables-multiport # 或 firewalld-rich-rules [sshd] # 启用SSH防护 enabled true # 如果修改了SSH端口必须指定 port 5922 # 日志路径通常自动检测 logpath %(sshd_log)s3. 启动并设置开机自启sudo systemctl enable --now fail2ban sudo systemctl status fail2ban4. 查看封禁状态sudo fail2ban-client status sudo fail2ban-client status sshd # 查看sshd监狱的状态5. 系统层面与文件安全加固即使攻击者突破了外围防线我们也要在系统内部设置重重障碍增加其横向移动和提权的难度。5.1 文件系统权限与属性错误的权限是导致提权漏洞的常见原因。1. 检查关键目录的权限# 检查 /etc/passwd, /etc/shadow 等关键文件的权限 ls -l /etc/passwd /etc/shadow /etc/group # 正确的权限应该是 # /etc/passwd: -rw-r--r-- # /etc/shadow: -rw-r----- 或更严格 (root:shadow) # /etc/group: -rw-r--r-- # 检查 /tmp, /var/tmp 目录的粘滞位sticky bit ls -ld /tmp /var/tmp # 应该有 drwxrwxrwt 中的 ‘t’防止用户删除他人的文件。2. 设置用户家目录的严格权限新用户家目录默认权限是755其他人可读应改为750。# 修改全局默认值在 /etc/login.defs 中 UMASK 027 # 这会使得新建家目录权限为 750 (777-027) # 批量修改现有用户家目录权限谨慎操作 sudo chmod 750 /home/*注意修改现有目录前确保没有服务或进程依赖于其他用户对这些目录的读取权限。3. 使用不可变属性保护关键文件chattr命令可以设置文件的扩展属性使其无法被修改或删除即使是root用户。# 为 /etc/passwd, /etc/shadow, /etc/group 添加不可变属性 sudo chattr i /etc/passwd /etc/shadow /etc/group # 移除不可变属性当需要合法修改时 sudo chattr -i /etc/passwd # 查看属性 lsattr /etc/passwd实操心得这个操作要非常小心。在需要添加新用户或修改密码前务必先-i解除属性。建议只在非常稳定、用户账户很少变动的服务器上使用。5.2 内核参数调优/etc/sysctl.conf通过调整内核网络参数可以抵御一些常见的网络攻击如SYN洪水攻击、IP欺骗等。编辑/etc/sysctl.conf文件添加或修改以下行sudo vim /etc/sysctl.conf# 禁止IP源路由防止IP欺骗 net.ipv4.conf.all.accept_source_route 0 net.ipv6.conf.all.accept_source_route 0 # 启用反向路径过滤验证数据包来源 net.ipv4.conf.all.rp_filter 1 net.ipv4.conf.default.rp_filter 1 # 禁止接受ICMP重定向防止路由表被恶意修改 net.ipv4.conf.all.accept_redirects 0 net.ipv6.conf.all.accept_redirects 0 net.ipv4.conf.all.send_redirects 0 # 保护基于IP的TCP SYN cookie防范SYN洪水攻击 net.ipv4.tcp_syncookies 1 # 减少time_wait连接加速回收高并发服务器可调整 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_fin_timeout 30 # 控制核心转储防止敏感信息泄露 fs.suid_dumpable 0使配置生效sudo sysctl -p5.3 禁用不必要的核心转储与模块核心转储文件可能包含内存中的敏感信息如密码。1. 通过ulimit全局限制在/etc/security/limits.conf文件中添加* hard core 0这会将所有用户的核心文件大小限制为0。2. 通过sysctl禁用如上节所示设置fs.suid_dumpable 0。3. 禁用不用的内核模块如果服务器是虚拟机或特定硬件很多内核模块用不上。# 查看已加载的模块 lsmod # 将需要禁用的模块加入黑名单例如蓝牙、火线等 echo “blacklist bluetooth” | sudo tee -a /etc/modprobe.d/blacklist.conf echo “blacklist firewire-core” | sudo tee -a /etc/modprobe.d/blacklist.conf重启后生效。6. 入侵检测、审计与应急响应安全加固不是一劳永逸的我们需要眼睛监控和预案响应来应对可能发生的入侵。6.1 部署基本的主机入侵检测系统HIDSAIDEAIDEAdvanced Intrusion Detection Environment通过创建文件系统的“指纹”数据库记录文件权限、大小、MD5/SHA校验和等并在后续定期扫描中对比来报告被更改、添加或删除的文件。1. 安装AIDE# Debian/Ubuntu sudo apt install aide # CentOS/RHEL/Rocky Linux sudo yum install aide2. 初始化数据库在系统处于一个“干净”状态时刚安装完、加固后生成初始数据库。sudo aideinit # 移动生成的数据库到标准位置 sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz3. 手动运行检查sudo aide --check输出会详细列出所有发生变化的文件。你需要学会区分正常的变化如日志文件增长、软件更新和异常变化。4. 配置定时任务将AIDE检查加入cron定期如每天运行并邮件通知结果。sudo crontab -e # 添加一行例如每天凌晨2点运行 0 2 * * * /usr/bin/aide --check | mail -s “AIDE Report for $(hostname)” adminyourdomain.com6.2 配置系统审计auditdauditd是Linux内核的审计框架可以记录非常详细的系统事件如文件访问、系统调用、用户命令等是事后调查取证的利器。1. 安装与启动# 通常默认已安装 sudo systemctl enable --now auditd2. 添加审计规则规则可以写在/etc/audit/rules.d/audit.rules中。以下是一些关键规则示例# 监控对 /etc/passwd 文件的写、属性更改操作 -w /etc/passwd -p wa -k identity # 监控对 /etc/shadow 文件的所有访问非常详细谨慎使用 -w /etc/shadow -p wa -k identity # 监控所有删除、重命名、创建文件的系统调用 -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid1000 -F auid!4294967295 -k delete # 监控所有sudo提权命令的执行 -a always,exit -S execve -C uid!euid -F euid0 -k sudo_priv_esc3. 查看审计日志# 使用 ausearch 工具查询 sudo ausearch -k identity # 查看所有与“identity”关键字相关的审计事件 sudo ausearch -ts today # 查看今天的所有审计事件 # 使用 aureport 生成报告 sudo aureport --summary # 摘要报告 sudo aureport -f # 文件访问报告6.3 应急响应检查清单如果怀疑服务器已被入侵保持冷静按步骤操作立即隔离如果可能将服务器从网络断开关闭网卡但不要关机或重启以免丢失内存中的证据。sudo ip link set eth0 down备份现场在隔离状态下立即对系统关键信息进行快照备份。# 备份进程列表 ps auxf /tmp/process_snapshot.txt # 备份网络连接 ss -tulpan /tmp/network_snapshot.txt # 备份登录历史 last /tmp/last_snapshot.txt # 备份cron任务 crontab -l /tmp/cron_snapshot.txt ls -la /etc/cron.* /tmp/cron_dirs.txt # 备份审计日志如果启用 cp -r /var/log/audit/ /tmp/audit_backup/查找入侵痕迹检查用户cat /etc/passwd查看是否有异常新增用户。检查授权cat /etc/sudoers和/etc/sudoers.d/*查看是否有异常提权。检查定时任务crontab -l和ls -la /etc/cron.*。检查服务systemctl list-units --typeservice --staterunning查看是否有陌生服务。检查网络ss -tulpan查看是否有异常监听端口。检查进程ps auxf查看异常进程特别关注消耗大量CPU/内存的进程。检查文件使用find命令查找近期被修改的可执行文件、隐藏文件等。find / -type f -name “.*” -ls 2/dev/null # 查找隐藏文件 find / -type f -perm /4000 -ls 2/dev/null # 查找SUID文件 find / -type f -mtime -2 -ls 2/dev/null # 查找最近2天内修改的文件分析入侵途径根据以上痕迹结合/var/log/auth.logSSH日志、/var/log/secure、Web服务日志等推断攻击者是如何进来的。决定恢复策略清理修复如果入侵范围小、原因明确如某个应用漏洞可以清理后门、修补漏洞、恢复文件。全量重建这是最安全、最推荐的方式。从干净的镜像或备份重建系统应用所有安全加固措施然后从安全备份中恢复数据。永远不要信任一个已被入侵的系统。7. 自动化与持续维护安全是一个持续的过程不是一次性的任务。将加固动作脚本化、将检查任务自动化是保证安全水位不下降的关键。7.1 编写自动化加固脚本你可以将上述的许多检查点和配置命令整合到一个Bash脚本中在新服务器初始化时一键执行。脚本应该具备幂等性多次执行结果一致和良好的日志记录。脚本示例框架 (security_harden.sh)#!/bin/bash set -euo pipefail LOG_FILE“/var/log/security_harden_$(date %Y%m%d_%H%M%S).log” exec (tee -a “$LOG_FILE”) 21 echo “[$(date)] 开始执行安全加固脚本...” # 1. 更新系统 echo “步骤1: 更新系统包...” apt update apt upgrade -y # 或 yum update -y # 2. 创建具有sudo权限的管理员用户 echo “步骤2: 创建管理员用户...” # ... 交互式或参数化创建用户设置密钥等 # 3. 配置SSH echo “步骤3: 配置SSH...” SSHD_CONFIG“/etc/ssh/sshd_config” cp “$SSHD_CONFIG” “${SSHD_CONFIG}.backup.$(date %s)” sed -i ‘s/^#PermitRootLogin.*/PermitRootLogin no/’ “$SSHD_CONFIG” sed -i ‘s/^PasswordAuthentication.*/PasswordAuthentication no/’ “$SSHD_CONFIG” # ... 其他sed替换 systemctl restart sshd # 4. 配置防火墙 echo “步骤4: 配置防火墙...” # ... 使用firewall-cmd或iptables命令 # 5. 安装并配置Fail2ban echo “步骤5: 安装配置Fail2ban...” # ... echo “[$(date)] 安全加固脚本执行完毕。详细日志见: $LOG_FILE” echo “**重要**请立即使用新用户和密钥测试SSH连接确认无误后再断开当前会话”注意此类脚本涉及系统关键配置务必先在测试环境中充分验证并确保有回滚方案比如备份了原始配置文件。7.2 配置定期安全扫描与报告结合cron和简单的脚本实现自动化安全检查。1. 系统漏洞扫描使用yum/apt自带工具# CentOS/RHEL: 检查安全更新 sudo yum updateinfo list security # Ubuntu/Debian: 安装 unattended-upgrades 并配置自动安全更新 sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades2. 根kit检查脚本示例创建一个定期运行的脚本检查常见的入侵指标。#!/bin/bash # check_rootkit.sh echo “ Rootkit 检查报告 $(date) ” echo “1. 检查隐藏进程...” ps auxf | grep -E ‘\[.*\]’ || echo “未发现异常。” echo “” echo “2. 检查异常SUID文件...” find / -type f -perm /4000 -ls 2/dev/null | grep -vE ‘/usr/bin|/usr/sbin’ || echo “未在非标准目录发现SUID文件。” echo “” echo “3. 检查系统命令是否被篡改rkhunter需安装...” if command -v rkhunter /dev/null; then sudo rkhunter --check --sk else echo “rkhunter 未安装跳过。” fi然后将其加入cron0 3 * * * /root/scripts/check_rootkit.sh /var/log/rootkit_check.log3. 日志监控与告警使用logwatch或logcheck工具定期分析系统日志将异常摘要发送给管理员。# 安装 logwatch sudo apt install logwatch # 或 yum install logwatch # 配置每日邮件报告需要邮件服务 # 编辑 /etc/cron.daily/00logwatch 或使用 logwatch --output mail --mailto admindomain.com --detail high安全加固的旅程没有终点。这份速查表为你提供了一个坚实的起点和日常维护的参考。真正的安全来自于将这些实践内化为习惯并结合对自身业务架构的深刻理解持续地评估、调整和加固。记住没有绝对的安全但通过系统性的工作和深度的防御我们可以让攻击者的成本高到难以承受从而有效地保护我们的资产。