Linux 安全加固
大约 13 分钟约 3818 字
Linux 安全加固
简介
Linux 安全加固是保障服务器免受未授权访问和恶意攻击的关键措施,涵盖 SSH 安全配置、用户权限管理、防火墙策略、入侵检测、审计日志以及 SELinux 强制访问控制等多个层面。系统化的安全加固能够显著降低被攻击的风险,提升整体安全态势。
特点
SSH 安全加固
SSH 服务端配置
# 备份原始配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 编辑 SSH 配置
vim /etc/ssh/sshd_config# /etc/ssh/sshd_config 关键安全配置
# 修改默认端口
Port 2222
# 禁用 root 直接登录
PermitRootLogin no
# 仅允许密钥认证,禁用密码登录
PubkeyAuthentication yes
PasswordAuthentication no
# 限制可登录的用户
AllowUsers deploy admin
# 设置空闲超时断开
ClientAliveInterval 300
ClientAliveCountMax 2
# 禁用空密码
PermitEmptyPasswords no
# 限制认证尝试次数
MaxAuthTries 3
# 禁用不必要的认证方式
ChallengeResponseAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no# 重启 SSH 服务使配置生效
systemctl restart sshd
# 验证配置语法
sshd -tSSH 密钥管理
# 生成 ED25519 密钥对(推荐)
ssh-keygen -t ed25519 -C "deploy@server"
# 生成 RSA 密钥对(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "deploy@server"
# 将公钥复制到远程服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@192.168.1.100
# 使用 ssh-agent 管理密钥
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# 配置 SSH 客户端别名
cat >> ~/.ssh/config << 'EOF'
Host myserver
HostName 192.168.1.100
Port 2222
User deploy
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
EOF用户与权限管理
用户账户安全
# 创建用户并指定 home 目录和 shell
useradd -m -s /bin/bash deploy
# 设置强密码策略
chage -M 90 -m 7 -W 14 deploy
# 锁定不需要登录的账户
passwd -l nobody
# 查看用户密码策略
chage -l deploy
# 将用户加入 sudo 组(Ubuntu)
usermod -aG sudo deploy
# 将用户加入 wheel 组(CentOS)
usermod -aG wheel deploysudo 权限精细化控制
# 编辑 sudoers 文件(使用 visudo)
visudo
# 允许 deploy 用户无密码执行特定命令
# deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
# deploy ALL=(ALL) NOPASSWD: /usr/bin/docker ps
# 允许运维组执行所有命令但需要密码
# %ops ALL=(ALL) ALL
# 禁止用户执行 su 命令
# deploy ALL=(ALL) !/bin/su
# 查看用户的 sudo 权限
sudo -lU deploy文件权限与属性
# 设置敏感文件权限
chmod 600 /etc/ssh/sshd_config
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
# 查找 SUID/SGID 文件(潜在风险)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
# 移除不必要的 SUID 权限
chmod u-s /usr/bin/passwd
# 设置文件不可修改属性(防篡改)
chattr +i /etc/passwd
chattr +i /etc/shadow
# 查看文件属性
lsattr /etc/passwd
# 解除不可修改属性
chattr -i /etc/passwd防火墙配置
firewalld 策略
# 启动并启用 firewalld
systemctl enable --now firewalld
# 查看默认区域和活动区域
firewall-cmd --get-default-zone
firewall-cmd --get-active-zones
# 仅开放必要服务
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 限制 SSH 仅允许特定网段
firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="10.0.0.0/24"
service name="ssh"
accept'
# 禁止其他来源 SSH
firewall-cmd --permanent --remove-service=ssh
# 重载配置
firewall-cmd --reload
# 查看完整规则集
firewall-cmd --list-alliptables 高级规则
# 设置默认策略为 DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 限速 ICMP(防 Ping 洪水)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
# 防止 SYN 洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 记录被丢弃的包
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
# 保存 iptables 规则
iptables-save > /etc/iptables/rules.v4Fail2ban 入侵防御
安装与基本配置
# 安装 fail2ban
yum install -y fail2ban # CentOS
apt install -y fail2ban # Ubuntu
# 创建本地配置文件
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local# /etc/fail2ban/jail.local
[DEFAULT]
# 封禁时间(秒)
bantime = 3600
# 检测时间窗口(秒)
findtime = 600
# 最大失败次数
maxretry = 5
# 封禁动作
banaction = iptables-multiport
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 7200
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3# 启动 fail2ban
systemctl enable --now fail2ban
# 查看封禁状态
fail2ban-client status sshd
# 手动解封 IP
fail2ban-client set sshd unbanip 192.168.1.50
# 查看所有 jail 状态
fail2ban-client status
# 查看日志
tail -f /var/log/fail2ban.log系统审计
audit 审计系统
# 安装 audit
yum install -y audit # CentOS
apt install -y auditd # Ubuntu
# 启动审计服务
systemctl enable --now auditd
# 添加审计规则 — 监控 /etc/passwd 的修改
auditctl -w /etc/passwd -p wa -k passwd_changes
# 监控 sudo 命令执行
auditctl -a always,exit -F arch=b64 -C euid=0 -S execve -k sudo_commands
# 监控特定目录的文件操作
auditctl -w /etc/ssh/ -p wa -k ssh_config_changes
# 查看审计日志
ausearch -k passwd_changes | ausearch -i
# 生成审计报告
aureport --summary
# 持久化审计规则
cat >> /etc/audit/rules.d/audit.rules << 'EOF'
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config
-a always,exit -F arch=b64 -S mount -k mount_events
EOF
# 重载规则
augenrules --loadSELinux 强制访问控制
SELinux 模式管理
# 查看 SELinux 状态
sestatus
getenforce
# 临时切换模式(重启失效)
setenforce 1 # Enforcing
setenforce 0 # Permissive
# 永久修改模式
# /etc/selinux/config
# SELINUX=enforcing
# SELINUXTYPE=targeted# 查看 SELinux 上下文
ls -Z /var/www/html/
ps -Z -C nginx
# 查看布尔值设置
getsebool -a | grep httpd
getsebool -a | grep nfs
# 允许 HTTP 服务连接网络
setsebool -P httpd_can_network_connect 1
# 允许 NFS 共享给 HTTP 服务
setsebool -P httpd_use_nfs 1
# 恢复文件默认上下文
restorecon -Rv /var/www/html/
# 查看审计日志中的 SELinux 拒绝记录
ausearch -m avc -ts recent | audit2why
# 生成自定义策略模块
ausearch -m avc -ts recent | audit2allow -M mypol
semodule -i mypol.pp入侵检测与日志分析
OSSEC/HIDS 主机入侵检测
# 安装 OSSEC(开源主机入侵检测系统)
yum install -y ossec-hids ossec-hids-server
# 关键配置 — /var/ossec/etc/ossec.conf
# <ossec_config>
# <global>
# <email_notification>yes</email_notification>
# <email_to>admin@example.com</email_to>
# </global>
# <syscheck>
# <frequency>7200</frequency>
# <directories check_all="yes">/etc,/usr/bin,/usr/sbin</directories>
# <ignore>/etc/mtab</ignore>
# </syscheck>
# <rootcheck>
# <rootkit_files>/var/ossec/etc/shared/rootkit_files.txt</rootkit_files>
# </rootcheck>
# </ossec_config>
# 查看告警日志
tail -f /var/ossec/logs/alerts/alerts.log
# 使用 rkhunter 检查 rootkit
rkhunter --update
rkhunter --check --skip-keypress
rkhunter --check --report-warnings-only
# 使用 chkrootkit 扫描
chkrootkit日志安全分析
# journalctl — 集中查看系统日志
journalctl -u sshd --since "1 hour ago" # SSH 日志
journalctl -p err --since today # 今天的错误日志
journalctl -u nginx -f # 实时跟踪 nginx 日志
# 分析失败的 SSH 登录尝试
journalctl -u sshd | grep "Failed password" | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 检查异常 sudo 使用
journalctl -t sudo --since yesterday
# 查看最近的登录记录
last -n 20
lastb -n 20 # 失败的登录
# 检查当前登录用户
w
who
# 检查用户历史命令(安全审计)
cat /home/deploy/.bash_history | grep -E "(rm|chmod|chown|sudo)"
# 配置日志轮转与保留策略
# /etc/logrotate.d/security
# /var/log/security.log {
# daily
# rotate 90
# compress
# missingok
# notifempty
# create 0600 root root
# }网络安全扫描与漏洞管理
端口扫描与服务审计
# 使用 ss 检查监听端口
ss -tlnp # TCP 监听端口
ss -ulnp # UDP 监听端口
# 检查所有监听端口及其进程
ss -tlnp | column -t
# 使用 nmap 扫描本机(自检)
nmap -sT -O localhost
nmap -sV -p 1-65535 localhost # 扫描所有端口和服务版本
# 关闭不必要的服务
systemctl list-unit-files --type=service --state=enabled
systemctl disable avahi-daemon
systemctl disable cups
systemctl disable bluetooth
# 检查已安装软件包的安全漏洞(CentOS)
yum updateinfo list security all
yum updateinfo list security --security
# 检查已安装软件包的安全漏洞(Ubuntu)
apt list --upgradable
unattended-upgrade --dry-run
pro fix --dry-runOpenSCAP 合规扫描
# 安装 SCAP 安全引导工具
yum install -y scap-security-guide openscap-scanner
# 执行安全合规扫描(基于 CIS Benchmark)
oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis \
--report /tmp/scan-report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
# 查看扫描报告
firefox /tmp/scan-report.html
# 自动修复不符合项(谨慎使用)
oscap xccdf eval --remediate \
--profile xccdf_org.ssgproject.content_profile_cis \
/usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml服务与进程安全
进程隔离与资源限制
# /etc/security/limits.conf — 资源限制配置
# 限制用户最大进程数和文件描述符
# deploy soft nofile 65535
# deploy hard nofile 65535
# deploy soft nproc 4096
# deploy hard nproc 4096
# * hard core 0 # 禁止生成 core dump
# systemd 服务沙箱化
# /etc/systemd/system/myapp.service
# [Service]
# ExecStart=/usr/bin/myapp
# NoNewPrivileges=true
# ProtectSystem=strict
# ProtectHome=true
# PrivateTmp=true
# PrivateDevices=true
# ProtectKernelTunables=true
# ProtectControlGroups=true
# RestrictNamespaces=true
# RestrictRealtime=true
# MemoryDenyWriteExecute=true
# SystemCallFilter=@system-service
# SystemCallErrorNumber=EPERM
# ReadOnlyPaths=/etc/ssl/certs
# ReadWritePaths=/var/lib/myapp /var/log/myapp
# 重新加载并启动
systemctl daemon-reload
systemctl restart myapp内核模块安全
# 查看已加载的内核模块
lsmod
# 禁用不必要的文件系统和协议模块
# /etc/modprobe.d/security.conf
echo "install dccp /bin/true" >> /etc/modprobe.d/security.conf
echo "install sctp /bin/true" >> /etc/modprobe.d/security.conf
echo "install rds /bin/true" >> /etc/modprobe.d/security.conf
echo "install tipc /bin/true" >> /etc/modprobe.d/security.conf
# 禁用 USB 存储(服务器环境)
echo "install usb-storage /bin/true" >> /etc/modprobe.d/security.conf
# 禁用不必要的文件系统
echo "install cramfs /bin/true" >> /etc/modprobe.d/security.conf
echo "install freevxfs /bin/true" >> /etc/modprobe.d/security.conf
echo "install jffs2 /bin/true" >> /etc/modprobe.d/security.conf
# 重新生成 initramfs
dracut -fSSL/TLS 安全配置
Nginx SSL 加固
# /etc/nginx/conf.d/ssl-hardening.conf
server {
listen 443 ssl http2;
server_name api.example.com;
# 仅使用 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# 优先使用服务端密码套件
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
# HSTS(强制 HTTPS,31536000 秒 = 1 年)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 安全响应头
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Content-Security-Policy "default-src 'self'" always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
# SSL 会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# DH 参数(使用 2048 位以上)
ssl_dhparam /etc/nginx/dhparam.pem;
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri;
}证书管理与自动化
# 使用 certbot 自动管理 Let's Encrypt 证书
yum install -y certbot python3-certbot-nginx
certbot --nginx -d api.example.com
# 自动续期(crontab)
echo "0 0,12 * * * certbot renew --quiet --post-hook 'systemctl reload nginx'" | \
crontab -
# 生成 DH 参数(首次部署时执行)
openssl dhparam -out /etc/nginx/dhparam.pem 2048
# 检查证书有效期
echo | openssl s_client -connect api.example.com:443 2>/dev/null | \
openssl x509 -noout -dates
# 测试 SSL 配置(使用 testssl.sh)
# https://testssl.sh/
./testssl.sh https://api.example.com安全自动化脚本
一键安全审计脚本
#!/bin/bash
# security_audit.sh — 基础安全审计脚本
echo "========== Linux 安全审计报告 =========="
echo "主机名: $(hostname)"
echo "内核版本: $(uname -r)"
echo "审计时间: $(date)"
echo ""
echo "=== 1. 用户安全检查 ==="
# 检查空密码账户
echo "[警告] 空密码账户:"
awk -F: '($2 == "" || $2 == "!") {print $1}' /etc/shadow
# 检查 UID 为 0 的账户(除 root 外)
echo "[检查] UID=0 的账户:"
awk -F: '($3 == 0) {print $1}' /etc/passwd
# 检查可登录账户
echo "[信息] 可登录账户:"
grep -v '/nologin\|/false' /etc/passwd | cut -d: -f1
echo ""
echo "=== 2. SSH 安全检查 ==="
echo "[检查] SSH 配置关键项:"
grep -E "^(PermitRootLogin|PasswordAuthentication|Port|MaxAuthTries)" /etc/ssh/sshd_config
echo ""
echo "=== 3. 开放端口检查 ==="
ss -tlnp | grep LISTEN
echo ""
echo "=== 4. 防火墙状态 ==="
systemctl is-active firewalld || echo "firewalld 未运行!"
firewall-cmd --list-services 2>/dev/null
echo ""
echo "=== 5. SELinux 状态 ==="
getenforce
sestatus | head -3
echo ""
echo "=== 6. 最近失败的登录 ==="
lastb | head -10
echo ""
echo "=== 7. 最近 sudo 使用记录 ==="
journalctl -t sudo --since "24 hours ago" | tail -10
echo ""
echo "=== 8. SUID 文件检查 ==="
find / -perm -4000 -type f 2>/dev/null | head -20
echo ""
echo "========== 审计完成 =========="系统加固检查清单
内核参数加固
# /etc/sysctl.d/99-security.conf
# 禁用 IP 转发(非路由器场景)
net.ipv4.ip_forward = 0
# 防止 SYN 洪水攻击
net.ipv4.tcp_syncookies = 1
# 禁用 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
# 记录可疑包
net.ipv4.conf.all.log_martians = 1
# 禁用 IPv6(不使用时)
net.ipv6.conf.all.disable_ipv6 = 1# 应用内核参数
sysctl -p /etc/sysctl.d/99-security.conf
# 查看当前参数
sysctl -a | grep syncookies优点
缺点
总结
Linux 安全加固是一项系统性工程,需要从 SSH 访问控制、用户权限管理、防火墙策略、入侵防御、审计日志和强制访问控制等多个维度综合施策。通过禁用密码认证、精细化 sudo 权限、配置 firewalld/iptables 规则、部署 fail2ban 自动封禁、启用 audit 审计以及合理使用 SELinux,可以构建起一套完善的防御体系。安全加固不是一次性工作,需要持续关注安全漏洞公告并定期审查和更新安全策略。
关键知识点
- DevOps 主题的核心是让交付更快、更稳、更可审计。
- 自动化不是把命令脚本化,而是把失败、回滚、权限和观测一起设计进去。
- 生产链路必须明确制品、环境、凭据、配置和责任边界。
- 安全类主题的关键不只在认证成功,而在于权限边界、证书信任链和审计链路是否完整。
项目落地视角
- 把流水线拆成构建、测试、制品、部署、验证和回滚几个阶段。
- 为关键步骤补齐日志、指标、通知和人工兜底点。
- 定期演练扩容、回滚、故障注入和灾备切换。
- 明确令牌生命周期、刷新策略、作用域、Claims 和失败返回模型。
常见误区
- 只关注部署成功,不关注失败恢复和审计追踪。
- 把环境差异藏在临时脚本或人工操作里。
- 上线频率高了以后,没有标准化制品和配置管理。
- 只验证登录成功,不验证权限收敛和令牌失效场景。
进阶路线
- 继续补齐 GitOps、可观测性、平台工程和成本治理。
- 把主题和应用架构、安全、权限、备份恢复联动起来理解。
- 形成团队级平台能力,而不是每个项目重复造轮子。
- 继续深入零信任、细粒度授权、证书自动化和密钥轮换。
适用场景
- 当你准备把《Linux 安全加固》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合构建自动化交付、基础设施治理、监控告警和生产发布体系。
- 当团队规模扩大、发布频率提升或环境变多时,这类主题会显著影响交付效率。
落地建议
- 所有自动化流程尽量做到幂等、可审计、可回滚。
- 把制品、变量、凭据和执行权限分层管理。
- 定期演练扩容、回滚、密钥轮换和灾备恢复。
排错清单
- 先定位失败发生在代码、构建、制品、环境还是权限层。
- 检查流水线变量、凭据、镜像标签和目标环境配置是否一致。
- 如果问题偶发,重点看并发发布、资源争抢和外部依赖抖动。
复盘问题
- 如果把《Linux 安全加固》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《Linux 安全加固》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《Linux 安全加固》最大的收益和代价分别是什么?
