前置知识: 网络安全

合规与审计

5 min中级

合规与审计:等保2.0、GDPR、ISO27001、安全审计与合规自动化

前置知识

建议先阅读以下内容再进入本文:

1. 合规体系

1.1 主要法规标准

标准地区范围
等保2.0中国信息系统
GDPR欧盟个人数据
ISO27001全球信息安全
SOC2美国服务组织
PCI DSS全球支付卡
HIPAA美国医疗

1.2 合规管理流程

识别适用法规 → 差距分析 → 制定合规计划 → 实施控制 → 持续监控 → 审计评估

2. 等保2.0

2.1 定级流程

确定定级对象 → 初步确定等级 → 专家评审 → 主管部门审核 → 公安备案

2.2 三级等保要求

类别要求
物理安全机房门禁、监控、消防
网络安全边界防护、入侵检测
主机安全身份鉴别、审计、入侵防范
应用安全访问控制、通信完整性
数据安全数据完整性、保密性、备份
管理安全制度、人员、运维

3. GDPR

3.1 核心原则

  • 合法性、公平性、透明性
  • 目的限制
  • 数据最小化
  • 准确性
  • 存储限制
  • 完整性和保密性
  • 问责制

3.2 数据主体权利

权利说明
访问权获取个人数据副本
更正权修正不准确数据
删除权被遗忘权
限制处理权限制数据处理
数据可携权转移数据
反对权反对数据处理

3.3 违规处罚

  • 一般违规:1000万欧元或全球营业额2%
  • 严重违规:2000万欧元或全球营业额4%

4. 安全审计

4.1 审计类型

类型审计者频率
内部审计内部团队季度/半年
外部审计第三方年度
合规审计监管机构按要求

4.2 审计范围

  • 访问控制审计
  • 变更管理审计
  • 日志审计
  • 漏洞管理审计
  • 备份恢复审计
  • 人员安全审计

4.3 审计证据

类型示例
文档证据策略文档、流程文件
技术证据配置截图、日志记录
访谈证据人员访谈记录
观察证据现场观察记录

5. 合规自动化

5.1 自动化工具

工具用途
AWS Config资源合规检查
Azure Policy策略强制执行
OPA策略即代码
InSpec合规测试
ProwlerAWS安全检查

5.2 合规即代码

# OPA 策略:禁止公开S3桶
package aws.s3

deny[msg] {
bucket := input.resource.aws_s3_bucket[name]
bucket.acl == "public-read"
msg := sprintf("S3 bucket '%s' is publicly readable", [name])
}

5.3 持续合规

代码提交 → 合规检查 → 部署 → 运行时监控 → 合规报告
  • IaC扫描:部署前检查
  • CSPM:运行时检查
  • 持续报告:仪表盘展示

系统账户加固

基本写法:检查空密码账户 awk -F: '($2 == "") {print $1}' /etc/shadow

# 查找密码为空的用户账户
sudo awk -F: '($2 == "") {print $1}' /etc/shadow

基本写法:锁定空密码账户 passwd -l <用户>

# 锁定空密码账户
sudo passwd -l username

基本写法:设置密码最长有效期 chage -M <天数> <用户>

# 设置密码 90 天必须更换
sudo chage -M 90 username

基本写法:查看密码策略 chage -l <用户>

# 查看用户密码策略信息
chage -l root

基本写法:设置密码最短长度 sed -i 's/PASS_MIN_LEN.*/PASS_MIN_LEN 12/' /etc/login.defs

# 设置密码最小长度为 12 位
sudo sed -i 's/PASS_MIN_LEN.*/PASS_MIN_LEN 12/' /etc/login.defs

基本写法:检查 UID 为 0 的用户 awk -F: '$3 == 0 {print $1}' /etc/passwd

# 查找 UID 为 0 的用户(应只有 root)
awk -F: '$3 == 0 {print $1}' /etc/passwd

SSH 服务加固

基本写法:禁止 root 远程登录 sed -i 's/#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config

# 禁止 root 通过 SSH 登录
sudo sed -i 's/#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config

基本写法:禁用密码认证 sed -i 's/#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config

# 仅允许密钥认证
sudo sed -i 's/#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config

基本写法:修改默认端口 sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config

# 修改 SSH 端口为 2222
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config

基本写法:限制登录用户 echo "AllowUsers <用户>" >> /etc/ssh/sshd_config

# 仅允许特定用户 SSH 登录
echo "AllowUsers admin deploy" | sudo tee -a /etc/ssh/sshd_config

基本写法:重启 SSH 服务 systemctl restart sshd

# 重启 SSH 服务应用配置
sudo systemctl restart sshd

文件权限加固

基本写法:查找无主文件 find / -nouser -o -nogroup 2>/dev/null

# 查找无属主或无属组的文件
sudo find / -nouser -o -nogroup 2>/dev/null

基本写法:查找世界可写文件 find / -perm -0002 -type f -not -path "/proc/*" 2>/dev/null

# 查找世界可写文件
sudo find / -perm -0002 -type f -not -path "/proc/*" 2>/dev/null

基本写法:查找 SUID 文件 find / -perm -4000 -type f 2>/dev/null

# 查找所有 SUID 文件
sudo find / -perm -4000 -type f 2>/dev/null

基本写法:查找 SGID 文件 find / -perm -2000 -type f 2>/dev/null

# 查找所有 SGID 文件
sudo find / -perm -2000 -type f 2>/dev/null

基本写法:加固关键文件权限 chmod 644 /etc/passwd; chmod 600 /etc/shadow

# 设置关键系统文件权限
sudo chmod 644 /etc/passwd
sudo chmod 640 /etc/shadow
sudo chmod 644 /etc/group
sudo chmod 600 /etc/gshadow

内核参数加固

基本写法:启用 SYN Cookies sysctl -w net.ipv4.tcp_syncookies=1

# 启用 SYN Cookies 防 SYN Flood
sudo sysctl -w net.ipv4.tcp_syncookies=1

基本写法:禁用 IP 转发 sysctl -w net.ipv4.ip_forward=0

# 禁用 IP 转发(非路由器场景)
sudo sysctl -w net.ipv4.ip_forward=0

基本写法:禁用源路由 sysctl -w net.ipv4.conf.all.accept_source_route=0

# 禁用源路由数据包
sudo sysctl -w net.ipv4.conf.all.accept_source_route=0
sudo sysctl -w net.ipv4.conf.default.accept_source_route=0

基本写法:启用反向路径过滤 sysctl -w net.ipv4.conf.all.rp_filter=1

# 启用反向路径过滤防 IP 欺骗
sudo sysctl -w net.ipv4.conf.all.rp_filter=1
sudo sysctl -w net.ipv4.conf.default.rp_filter=1

基本写法:永久保存配置 sysctl -p

# 重新加载 sysctl 配置
sudo sysctl -p

服务最小化

基本写法:列出启用服务 systemctl list-unit-files --state=enabled

# 列出所有开机自启服务
systemctl list-unit-files --state=enabled

基本写法:禁用不必要服务 systemctl disable <服务>

# 禁用不需要的服务
sudo systemctl disable avahi-daemon
sudo systemctl disable cups

基本写法:停止运行中服务 systemctl stop <服务>

# 停止不必要的服务
sudo systemctl stop bluetooth
sudo systemctl stop modem-manager

基本写法:查看监听端口 ss -tlnp

# 查看所有监听端口与服务
sudo ss -tlnp

基本写法:卸载不需要软件 apt-get purge <包名>

# 卸载不需要的软件包
sudo apt-get purge rpcbind nfs-common

日志审计加固

基本写法:启用审计服务 systemctl enable auditd

# 启用 auditd 审计服务
sudo systemctl enable auditd
sudo systemctl start auditd

基本写法:监控 passwd 文件 auditctl -w /etc/passwd -p wa -k passwd_change

# 审计 passwd 文件变更
sudo auditctl -w /etc/passwd -p wa -k passwd_change

基本写法:监控 sudo 使用 auditctl -w /var/log/sudo.log -p wa -k sudo_log

# 审计 sudo 命令使用
sudo auditctl -w /var/log/sudo.log -p wa -k sudo_log

基本写法:配置日志保留 sed -i 's/max_log_file.*/max_log_file = 50/' /etc/audit/auditd.conf

# 配置审计日志保留大小
sudo sed -i 's/max_log_file.*/max_log_file = 50/' /etc/audit/auditd.conf
sudo sed -i 's/max_log_file_action.*/max_log_file_action = rotate/' /etc/audit/auditd.conf

基本写法:启用远程日志 echo "*.* @<日志服务器>" >> /etc/rsyslog.conf

# 配置远程日志服务器
echo "*.* @192.168.1.100" | sudo tee -a /etc/rsyslog.conf
sudo systemctl restart rsyslog

网络加固

基本写法:配置防火墙默认策略 ufw default deny incoming

# 默认拒绝所有入站流量
sudo ufw default deny incoming
sudo ufw default allow outgoing

基本写法:限制 SSH 连接速率 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set

# 限制 SSH 连接速率防爆破
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

基本写法:禁用 ICMP 重定向 sysctl -w net.ipv4.conf.all.accept_redirects=0

# 禁用 ICMP 重定向防中间人攻击
sudo sysctl -w net.ipv4.conf.all.accept_redirects=0
sudo sysctl -w net.ipv4.conf.default.accept_redirects=0

基本写法:禁用 ICMP 广播 sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1

# 禁用 ICMP 广播响应
sudo sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1

基本写法:启用防火墙 ufw enable

# 启用 ufw 防火墙
sudo ufw enable
sudo ufw allow 22/tcp

合规扫描工具

基本写法:安装 Lynis apt-get install lynis

# 安装 Lynis 安全扫描工具
sudo apt-get install lynis

基本写法:运行 Lynis 扫描 lynis audit system

# 运行系统安全审计
sudo lynis audit system

基本写法:输出扫描报告 lynis audit system --pentest

# 以渗透测试视角运行扫描
sudo lynis audit system --pentest

基本写法:查看扫描结果 cat /var/log/lynis.log | grep -E "Warning|Suggestion"

# 查看 Lynis 扫描警告与建议
sudo cat /var/log/lynis.log | grep -E "Warning|Suggestion" | head -30

基本写法:使用 OpenSCAP 扫描 oscap xccdf eval --profile <配置> <基准文件>

# 使用 OpenSCAP 运行合规扫描
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_pci_dss /usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml

CIS 基准检查

基本写法:检查密码策略 cat /etc/pam.d/common-password

# 查看 PAM 密码策略配置
cat /etc/pam.d/common-password

基本写法:检查登录失败锁定 cat /etc/pam.d/common-auth | grep pam_tally

# 检查是否配置账户锁定策略
grep -i "pam_tally\|pam_faillock" /etc/pam.d/common-auth

基本写法:配置登录失败锁定 echo "auth required pam_tally2.so deny=5 unlock_time=600" >> /etc/pam.d/common-auth

# 配置 5 次失败后锁定 10 分钟
echo "auth required pam_tally2.so deny=5 unlock_time=600" | sudo tee -a /etc/pam.d/common-auth

基本写法:检查会话超时 cat /etc/profile | grep -i TMOUT

# 检查是否配置会话超时
grep -i "TMOUT" /etc/profile

基本写法:配置会话超时 echo "export TMOUT=600" >> /etc/profile

# 配置 10 分钟无操作自动登出
echo "export TMOUT=600" | sudo tee -a /etc/profile

补丁管理

基本写法:检查可用更新 apt-get update && apt list --upgradable

# 列出所有可升级软件包
sudo apt-get update && apt list --upgradable

基本写法:安装安全更新 apt-get upgrade

# 安装所有可用更新
sudo apt-get upgrade -y

基本写法:仅安装安全更新 unattended-upgrade --dry-run -v

# 仅检查安全更新
sudo unattended-upgrade --dry-run -v

基本写法:启用自动安全更新 dpkg-reconfigure -plow unattended-upgrades

# 配置自动安装安全更新
sudo dpkg-reconfigure -plow unattended-upgrades

基本写法:查看已安装补丁 apt list --installed | grep -i security

# 查看已安装的安全更新
sudo apt list --installed | grep -i security

加固自检脚本

基本写法:综合安全检查 #!/bin/bash ...

# 综合安全检查脚本
echo "=== 用户检查 ==="
awk -F: '$3 == 0 {print "UID 0 用户:", $1}' /etc/passwd
echo "=== SSH 配置 ==="
grep -E "PermitRootLogin|PasswordAuthentication|Port" /etc/ssh/sshd_config
echo "=== 监听端口 ==="
sudo ss -tlnp
echo "=== SUID 文件 ==="
sudo find / -perm -4000 -type f 2>/dev/null

基本写法:检查服务状态 systemctl list-unit-files --state=enabled | wc -l

# 统计启用服务数量
systemctl list-unit-files --state=enabled | wc -l

基本写法:验证防火墙状态 ufw status

# 验证防火墙启用状态
sudo ufw status verbose

基本写法:生成加固报告 lynis audit system > hardening_report.txt 2>&1

# 生成系统加固报告
sudo lynis audit system > hardening_report.txt 2>&1
echo "加固评分: $(grep "Hardening index" /var/log/lynis-report.dat | cut -d= -f2)"

基本写法:对比加固前后 diff <(cat /etc/ssh/sshd_config) <(cat sshd_config.backup)

# 对比配置文件变更
diff /etc/ssh/sshd_config /backup/sshd_config.backup