Linux 安全加固实战:基线、SSH、SELinux 与纵深防御

Linux 主机安全加固全流程:纵深防御模型、系统基线(更新/账户/最小化)、SSH 密钥与配置加固、PAM/sudo 权限、SELinux/AppArmor 强制访问控制、网络与服务最小化、auditd 审计、入侵检测与 CIS 基线验收。

引言

一台刚装好的 Linux 默认配置经不起公网扫描。安全加固不是装一个工具,而是一套纵深防御流程:从系统基线、SSH 与权限,到强制访问控制、网络最小化、审计与入侵检测。本文按攻击者的视角走一遍防守方该做的每一层——先立目标与模型,再逐层落地基线配置、SSH 加固、PAM/sudo、SELinux/AppArmor、服务最小化、审计监控、入侵检测,最后用 CIS 基线验收加固效果。

前置:/linux-user-permissions/(用户/权限/sudo)、/linux-firewall-nftables/(防火墙)、/linux-journald-logging/(日志审计)。


目录


1. 加固目标与纵深防御模型

加固的最终目标:让攻击成本 > 资产价值,缩短入侵检测时间(MTTD)。

纵深防御(Defense in Depth):多层防护,单层被破不至于全盘失守:

外围:防火墙 / 网关 / 限速
边界:SSH 加固 / 服务最小化 / 强制访问控制
内层:账户权限 / PAM / sudo 最小化
最后:审计 / 监控 / 入侵检测 / 应急响应

加固三问(先答再动手):

① 这台机跑什么?(最小暴露)
② 谁能访问?(最小授权)
③ 出了事怎么发现?(可观测)

关键心态:

- 安全是流程不是快照:持续更新与复检
- 加固别破坏业务:先测再上线
- 记录变更:加固项可审计

记忆:加固目标 = 提高攻击成本、缩短检测时间;纵深防御分四层(外围/边界/内层/审计);动手前先答三问——跑什么、谁能访问、出事怎么发现。


2. 系统基线:更新、账户与最小化

第一步:保持更新:

apt update && apt upgrade -y        # Debian/Ubuntu
dnf upgrade -y                      # RHEL/Fedora
# 自动安全更新:unattended-upgrades / dnf-automatic

账户最小化:

userdel -r unused-user              # 删无用账户
passwd -l someone                   # 锁定不删的账户
# 检查空密码/弱密码
awk -F: '($2 == "") {print}' /etc/shadow

服务最小化:

systemctl list-units --type=service --state=running   # 看跑了什么
systemctl disable --now 不用的服务                     # 停并禁用

内核与启动加固:

# /etc/sysctl.d/ 基础加固
kernel.kptr_restrict=2            # 限制内核地址暴露
net.ipv4.conf.all.rp_filter=1     # 反欺骗
kernel.yama.ptrace_scope=1        # 限制 ptrace

基线检查清单:

□ 补丁最新
□ 无空密码/无弱密码/无多余账户
□ 无多余服务在跑
□ root 禁止远程直接登录(见第 3 节)
□ 关键 sysctl 加固项生效

记忆:基线五件事——更新打补丁、账户最小化(删/锁/查空密码)、服务最小化、内核 sysctl 加固、root 禁远程;先清理攻击面再谈深加固。


3. SSH 加固:密钥、配置与访问控制

SSH 是公网主机的第一道门——重点加固。

用密钥不用密码:

ssh-keygen -t ed25519 -a 100          # 生成密钥(ed25519 推荐)
ssh-copy-id user@host                 # 安装公钥

sshd 配置加固(/etc/ssh/sshd_config):

PasswordAuthentication no        # 禁密码登录
PermitRootLogin prohibit-password # 禁止 root 密码登录(可密钥)
PubkeyAuthentication yes         # 密钥认证
MaxAuthTries 3                   # 限制尝试次数
AllowUsers alice                 # 白名单用户
ClientAliveInterval 300          # 空闲保活/踢线

密钥本身管理:

- 密钥设 passphrase(失窃也不能直接用)
- 私钥权限 600、放 ~/.ssh、公钥 ~/.ssh/authorized_keys
- 轮换:定期换密钥、吊销旧密钥

访问控制:结合防火墙只放开 SSH 来源 IP:

nft add rule inet filter input ip saddr 可信网段 tcp dport 22 accept

fail2ban(见第 8 节)自动封禁爆破来源。

记忆:SSH 加固五件——ed25519 密钥替代密码、禁 PasswordAuthentication、禁 root 密码登录、AllowUsers 白名单、防火墙限来源 IP;密钥带 passphrase 且权限 600。


4. 权限与 PAM:sudo、PAM 与 umask

sudo 最小授权:

# 仅给需要的命令,不给全部 root
useradd -G sudo alice                    # Debian sudo 组
# 或 /etc/sudoers.d/alice
alice ALL=(ALL) /usr/bin/systemctl restart nginx

sudoers 铁律:

- 不用 NOPASSWD 给全权限
- 按角色拆分(运维组/只读组)
- 用 visudo 编辑防语法错

PAM 认证加固:

- 密码策略:/etc/pam.d/common-password 强制复杂度/长度
- 锁定爆破:pam_faillock / pam_tally2 连续失败锁定
- 双因子:pam_google_authenticator(OTP)可选

umask 与文件权限:

umask 027          # 新文件 640、新目录 750
# 系统级:/etc/profile、/etc/login.defs 设置

SUID/SGID 排查:

find / -perm -4000 -type f 2>/dev/null   # 找出 SUID 文件,排查异常

记忆:权限加固四件——sudo 最小授权(只给必要命令)、PAM 密码策略+失败锁定+OTP、umask 027 收紧默认权限、定期排查 SUID/SGID 文件。


5. SELinux 与 AppArmor:强制访问控制

强制访问控制(MAC):即使 root 进程被攻破,也不让它在系统里乱跑。

DAC(默认):进程按 owner/权限决定访问
MAC(SELinux/AppArmor):额外按「策略」强制约束

SELinux(RHEL 系):

getenforce                    # 查看:Enforcing/ Permissive/ Disabled
sestatus                      # 详细状态
# 放行某服务(Web 服务器绑定非标准端口)
semanage port -a -t http_port_t -p tcp 8080
# 排查 AVC 拒绝
ausearch -m avc -ts recent

SELinux 模式:Enforcing(强制执行)> Permissive(只记不拦)> Disabled。

AppArmor(Ubuntu/Debian):

aa-status                     # 查看已加载 profile
# 生成 profile:aa-genprof /usr/bin/xxx
# 强制执行
aa-enforce /usr/bin/xxx

日常策略:

- 上线先 Permissive/记录模式,看日志无误再 Enforcing
- 给每个对外服务配 profile(httpd/nginx/mysql……)
- 遇到「Permission denied」先看 AVC/日志,别直接关 SELinux

记忆:MAC 是最后防线——SELinux 用 Enforcing/Permissive/Disabled 三级、AppArmor 用 aa-enforce/aa-genprof;上线先 Permissive 观察再 Enforcing,遇拒绝查 AVC 别关 SELinux。


6. 网络与服务最小化:端口与攻击面

只开该开的端口:

ss -tlnp                     # 列出监听端口与服务
# 防火墙只放行必要端口,见 nftables 专题

常见风险端口:

□ 22(改高/限来源)、3306/5432(绝不对公网)
□ 6379/11211(redis/memcached 未认证 → 常被挖矿)
□ 2375/2376(docker 远程未保护)
□ 8080/8888(面板类,需鉴权)

服务自身加固:

- 数据库只监听内网地址(bind 127.0.0.1 或内网卡)
- 管理面板加认证 + 限 IP
- 关闭不必要的开端口服务

IP 欺骗与路由器加固:

# 反欺骗、禁 ICMP 重定向
net.ipv4.conf.all.accept_redirects=0
net.ipv6.conf.all.accept_redirects=0

记忆:最小化攻击面——ss -tlnp 盘点端口、防火墙只放必要端口;数据库/redis/docker 端口禁公网;服务只监听内网、面板加认证;禁 ICMP 重定向防欺骗。


7. 审计与监控:auditd 与日志

审计(auditd):记录敏感操作,出事有据可查。

# 安装并启用
apt install auditd
# 审计关键文件与命令
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -a always,exit -F arch=b64 -S execve -k exec_calls
# 查询
ausearch -k passwd_changes -ts recent

audit 规则三件:

-w 文件:监控 /etc/passwd、/etc/shadow、/etc/ssh/sshd_config
-a execve:审计命令执行
登录/失败登录:pam 触发

日志集中与保护:

- journald 持久化(见日志专题)
- 关键日志异地/集中收集(防被篡改灭迹)
- 日志权限:root 才能读 /var/log/auth.log

登录监控:

journalctl -u sshd --since "1 hour ago"    # SSH 登录记录
last / lastb                               # 成功/失败登录

记忆:审计三件——auditd 监控敏感文件(-w /etc/passwd)与命令执行(-a execve)、日志集中+权限保护防篡改、last/journalctl 盯登录;出事能回溯是谁干了什么。


8. 入侵检测:AIDE、fail2ban 与 rootkit 检查

文件完整性(AIDE):关键文件哈希基线,变更报警。

apt install aide
aideinit                     # 初始化基线库
# 定期比对
aide --check
# cron 每日比对 + 差异告警

fail2ban(爆破防护):

apt install fail2ban
# 默认 jail 封 SSH 多次失败
systemctl enable --now fail2ban
fail2ban-client status sshd

rootkit/恶意软件检查:

apt install rkhunter chkrootkit
rkhunter --check
chkrootkit
# 结合进程/网络异常排查

异常行为指标(IOC):

- 陌生进程/高 CPU(挖矿)
- 新开的监听端口
- 异常登录(异地/凌晨)
- /tmp、/dev/shm 的可疑文件
- crontab、authorized_keys 被改

记忆:入侵检测三件——AIDE 哈希基线比对防篡改、fail2ban 封爆破、rkhunter/chkrootkit 查 rootkit;日常盯 IOC——陌生进程、新端口、异常登录、可疑文件与 cron 变更。


9. 加固验收:CIS 基线扫描与持续加固

CIS 基线:业界公认的加固标准清单(分级 Level1/Level2)。

扫描工具:

# Lynis(开源审计)
apt install lynis
lynis audit system        # 报告 + 加固建议(分数)

# 或 CIS-CAT / OpenSCAP
oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis ...

Lynis 看什么:

- 安全分数(越高越好)
- 每项 hardening index
- 发现项:警告、建议、提示

验收闭环:

基线扫描(记分) → 逐项加固 → 复扫(提分) → 持续监控

持续加固自动化:配置管理(Ansible)把加固项固化为代码,新机器一键达标:

ansible-playbook hardening.yml   # 一键加固多台

记忆:验收用 CIS 基线 + Lynis/OpenSCAP 扫描记分——扫出项逐条加固、复扫验证提分、Ansible 固化为代码持续达标;加固不是一次完成而是闭环流程。


10. 速查表与一句话记忆

加固项关键动作
系统基线更新、删账户、最小化服务、sysctl
SSHed25519 密钥、禁密码、禁 root、白名单
权限sudo 最小化、PAM 策略、umask 027
MACSELinux Enforcing / AppArmor profile
网络只开必要端口、库禁公网
审计auditd 监控文件与命令
检测AIDE 基线、fail2ban、rkhunter
验收Lynis/CIS 扫描 + Ansible 固化

一句话记忆:Linux 加固是纵深防御流程——基线(更新/账户/服务最小化)→ SSH(密钥替代密码、禁 root、白名单限 IP)→ 权限(sudo 最小化、PAM 策略、umask)→ MAC(SELinux/AppArmor 让 root 也不能乱跑)→ 网络最小化(只开必要端口、库禁公网)→ 审计(auditd 记录敏感操作、日志集中保护)→ 检测(AIDE 基线、fail2ban 封爆破、rootkit 检查)→ CIS 基线扫描验收 + Ansible 固化为代码——每一层被破还有下一层兜底,攻击成本高于资产价值、异常能在审计里被看见,才是真的「加固」。


延伸阅读

  • /linux-user-permissions/ — 用户、权限、sudo 与 ACL
  • /linux-firewall-nftables/ — 防火墙与网络访问控制
  • /linux-journald-logging/ — 日志管理与审计
  • /linux-network-commands/ — 端口与服务排查
  • [[security]] — 安全攻防全景
  • [[observability]] — 监控与告警

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 高级文件系统:XFS、Btrfs、ZFS 与存储进阶
  2. Linux 高可用与负载均衡:HAProxy、Keepalived 与集群方案
  3. Linux 防火墙与 nftables:规则集、链、NAT 与网络安全防护