Alpine Linux 完全指南 / 第 09 章:安全加固
第 09 章:安全加固
Alpine Linux 的安全特性和系统加固策略。
9.1 Alpine 默认安全特性
| 特性 | 说明 | 状态 |
|---|---|---|
| PaX | 内存保护(防止代码注入) | 内核支持 |
| SSP | Stack Smashing Protection | 默认启用 |
| PIE | 位置无关可执行文件 | 默认编译选项 |
| RELRO | 重定位只读 | 默认启用 |
| FORTIFY_SOURCE | 缓冲区溢出检测 | 默认启用 |
| ASLR | 地址空间布局随机化 | 内核默认 |
| 最小化安装 | 无多余软件包 | 设计原则 |
# 查看安全编译选项
# 检查二进制文件的保护特性
apk add checksec
checksec --file=/usr/bin/ls
# 查看 PaX 标志
cat /proc/sys/kernel/randomize_va_space # 2 = 完全 ASLR
# 查看内核安全选项
zgrep -i "PAX\|SECCOMP\|NAMESPACE" /proc/config.gz 2>/dev/null || \
cat /boot/config-* 2>/dev/null | grep -i "PAX\|SECCOMP\|NAMESPACE"
9.2 系统更新策略
# 安全更新策略
# 1. 定期更新(推荐每周)
# crontab
0 3 * * 0 apk update && apk upgrade >> /var/log/apk-upgrade.log 2>&1
# 2. 仅安全更新
apk upgrade --available
# 3. 锁定特定包版本(避免意外升级)
apk add "nginx=1.26.2-r0"
echo "nginx" >> /etc/apk/world.pinned
# 4. 查看可用更新
apk update
apk version -l '<'
# 5. 安全公告监控
# Alpine 安全公告: https://alpinelinux.org/posts/
# CVE 查询: https://cve.mitre.org/
# 自动安全更新脚本
cat > /usr/local/bin/security-update << 'SCRIPT'
#!/bin/sh
LOG="/var/log/security-update.log"
echo "=== Security Update: $(date) ===" >> "$LOG"
apk update >> "$LOG" 2>&1
# 获取可更新包列表
UPDATES=$(apk version -l '<' | wc -l)
echo "Available updates: $UPDATES" >> "$LOG"
if [ "$UPDATES" -gt 0 ]; then
apk upgrade >> "$LOG" 2>&1
echo "Update completed" >> "$LOG"
# 检查是否需要重启
if [ -f /var/run/reboot-required ]; then
echo "REBOOT REQUIRED" >> "$LOG"
fi
fi
SCRIPT
chmod +x /usr/local/bin/security-update
9.3 AppArmor
# 安装 AppArmor
apk add apparmor apparmor-utils apparmor-profiles
# 启用 AppArmor
echo "apparmor=1 security=apparmor" >> /etc/update-extlinux.conf
update-extlinux
# 重启后检查状态
rc-service apparmor status
aa-status
# 加载配置文件
aa-enforce /etc/apparmor.d/usr.sbin.nginx
# 查看配置文件
ls /etc/apparmor.d/
# 创建自定义配置文件
cat > /etc/apparmor.d/usr.local.bin.myapp << 'EOF'
#include <tunables/global>
/usr/local/bin/myapp {
#include <abstractions/base>
#include <abstractions/nameservice>
# 允许读取配置
/etc/myapp/** r,
# 允许读写日志
/var/log/myapp/** rw,
# 允许创建临时文件
/tmp/myapp.* rw,
# 网络访问
network inet stream,
network inet dgram,
# 拒绝其他所有
deny /** w,
}
EOF
# 重新加载配置
apparmor_parser -r /etc/apparmor.d/usr.local.bin.myapp
AppArmor 模式
| 模式 | 说明 | 命令 |
|---|---|---|
| enforce | 强制执行(违规阻止) | aa-enforce |
| complain | 报告违规(不阻止) | aa-complain |
| unconfined | 不受限制 | aa-disable |
9.4 SELinux
# SELinux 在 Alpine 上需要自定义内核
# 安装基础工具
apk add policycoreutils selinux-utils
# 注意:Alpine 默认内核不支持 SELinux
# 如需 SELinux,需重新编译内核
# 检查 SELinux 状态
getenforce
sestatus
# 临时禁用
setenforce 0
# 设置模式
# /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted
注意:Alpine Linux 默认支持 AppArmor,SELinux 需要自定义内核配置。大多数场景下 AppArmor 已足够。
9.5 文件系统安全
# 只读挂载关键目录
# /etc/fstab
proc /proc proc defaults,hidepid=2 0 0
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=2G 0 0
tmpfs /run tmpfs defaults,noexec,nosuid,nodev,mode=0755 0 0
# 文件权限检查
# 关键文件权限
chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 600 /etc/ssh/sshd_config
chmod 700 /root
chmod 600 /etc/crontabs/*
# 查找 SUID/SGID 文件
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \; 2>/dev/null
# 查找全局可写文件
find / -type f -perm -o+w ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null
# 查找无主文件
find / -nouser -o -nogroup 2>/dev/null
文件完整性检查
# 安装 AIDE(高级入侵检测环境)
apk add aide
# 初始化数据库
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 检查文件系统变化
aide --check
# 更新数据库
aide --update
# 定期检查
echo "0 4 * * * /usr/bin/aide --check | mail -s 'AIDE Report' admin@example.com" >> /etc/crontabs/root
9.6 网络安全
SSH 加固
# /etc/ssh/sshd_config 安全配置
cat > /etc/ssh/sshd_config << 'EOF'
# 基本设置
Port 22
Protocol 2
AddressFamily inet
# 认证
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
# 加密算法(仅允许强算法)
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# 安全选项
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PermitTunnel no
ClientAliveInterval 300
ClientAliveCountMax 2
# 日志
LogLevel VERBOSE
# 限制用户
AllowUsers myuser admin
# 或使用组
# AllowGroups ssh-users
EOF
# 生成强密钥
ssh-keygen -t ed25519 -a 100
# 或 RSA 4096 位
ssh-keygen -t rsa -b 4096
# 禁用弱主机密钥
rm -f /etc/ssh/ssh_host_dsa_key*
rm -f /etc/ssh/ssh_host_ecdsa_key*
Fail2Ban
# 安装 Fail2Ban
apk add fail2ban
# 配置
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = iptables-multiport
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/messages
maxretry = 3
bantime = 86400
EOF
rc-update add fail2ban
rc-service fail2ban start
# 查看被封禁的 IP
fail2ban-client status sshd
内核网络安全参数
cat >> /etc/sysctl.conf << 'EOF'
# 网络安全参数
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# IPv6 安全
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# 内核安全
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.randomize_va_space = 2
EOF
sysctl -p
9.7 审计与日志
# 安装审计框架
apk add audit
# 审计规则
cat > /etc/audit/audit.rules << 'EOF'
# 删除所有规则
-D
# 监控关键文件修改
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
# 监控 SSH 配置
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 监控 cron
-w /etc/crontabs -p wa -k cron
# 监控系统启动
-w /etc/init.d -p wa -k init
EOF
rc-update add auditd
rc-service auditd start
# 查询审计日志
ausearch -k identity -ts recent
aureport --summary
9.8 安全扫描
# 安装 Lynis 安全审计工具
apk add lynis
# 运行安全审计
lynis audit system
# 查看加固建议
lynis audit system --quick 2>&1 | grep "Hardening"
# 安装 ClamAV 杀毒
apk add clamav clamav-daemon
freshclam # 更新病毒库
clamscan -r /home/
# rootkit 检测
apk add rkhunter
rkhunter --check
rkhunter --update
9.9 安全加固清单
| 类别 | 检查项 | 状态 |
|---|---|---|
| 用户 | 禁用 root 密码登录 | ☐ |
| 用户 | 使用 SSH 密钥认证 | ☐ |
| 用户 | 设置密码复杂度策略 | ☐ |
| SSH | 禁用弱加密算法 | ☐ |
| SSH | 限制登录用户 | ☐ |
| 网络 | 配置防火墙默认 DROP | ☐ |
| 网络 | 仅开放必要端口 | ☐ |
| 系统 | 启用自动安全更新 | ☐ |
| 系统 | 配置日志审计 | ☐ |
| 文件 | 设置关键目录权限 | ☐ |
| 文件 | 启用文件完整性检查 | ☐ |
| 内核 | 调整安全参数 | ☐ |
| 应用 | 启用 AppArmor 配置 | ☐ |
| 监控 | 配置 Fail2Ban | ☐ |
9.10 注意事项
⚠️ 重要安全规则
- 永远不要以 root 运行应用程序
- 定期更新系统和应用软件包
- 备份加密密钥和配置文件
- 测试安全策略后再应用到生产环境
- 监控系统日志和安全事件
扩展阅读
上一章:第 08 章:Docker 基础镜像 下一章:第 10 章:容器管理