# Linux 安全审计 - 日志分析、合规性检查与安全加固

URL: https://caijiao.org/linux/security/audit
Source: docs/linux/security/audit.md
Description: 全面介绍Linux系统安全审计技术，包括审计系统配置、日志管理与分析、安全扫描、合规性检查以及安全加固最佳实践。

## 1. 安全审计基础

### 1.1 安全审计概念与意义

安全审计是对系统安全状态进行全面评估、监控和分析的过程，旨在发现潜在安全风险、监控异常行为并确保系统符合安全策略和法规要求。

**安全审计的主要目标：**

- **识别安全弱点**：发现系统配置错误、漏洞和安全缺陷
- **监控系统活动**：记录和分析用户行为、系统事件和安全事件
- **确保合规性**：验证系统是否符合安全政策、法规和标准
- **调查安全事件**：提供证据和信息，用于安全事件的分析和调查
- **支持安全决策**：为安全策略制定和资源分配提供依据

**安全审计的重要性：**

- **预防安全事件**：通过发现和修复安全问题，预防安全事件发生
- **减少安全风险**：评估并降低组织面临的安全风险
- **满足法规要求**：许多行业法规和标准都要求定期进行安全审计
- **保护数据安全**：确保敏感数据得到适当保护
- **提高安全意识**：促进组织内部的安全文化和意识

### 1.2 安全审计原则与范围

**安全审计原则：**

1. **完整性**：审计过程应全面覆盖系统的所有关键组件和活动
2. **独立性**：审计人员应保持独立，避免利益冲突
3. **客观性**：基于事实而非主观判断进行评估
4. **保密性**：保护审计过程中获取的敏感信息
5. **及时性**：定期进行审计，并及时报告和解决发现的问题

**安全审计范围：**

1. **系统配置审计**：检查系统配置是否符合安全最佳实践
2. **权限审计**：审查用户账户、组和权限设置
3. **日志审计**：分析系统日志、应用日志和安全日志
4. **网络安全审计**：评估网络配置、防火墙规则和通信安全
5. **应用安全审计**：检查应用程序的安全漏洞和配置
6. **数据安全审计**：评估数据存储、传输和访问控制的安全性
7. **物理安全审计**：检查物理访问控制和环境安全

### 1.3 常见安全审计标准

**国际安全审计标准：**

1. **ISO 27001/27002**：信息安全管理体系(ISMS)标准，提供了信息安全管理的最佳实践

2. **PCI DSS**：支付卡行业数据安全标准，适用于处理支付卡数据的组织

3. **NIST SP 800-53**：美国国家标准与技术研究院发布的安全控制框架

4. **COBIT**：信息及相关技术控制目标，提供IT治理和控制框架

5. **HIPAA**：美国健康保险可携性和责任法案，适用于医疗保健行业

**Linux安全基线标准：**

1. **CIS Linux Benchmarks**：由Center for Internet Security发布的Linux安全配置基线

2. **DISA STIG for Linux**：美国国防信息系统局发布的Linux安全技术实施指南

3. **NIST SP 800-171**：适用于受控非机密信息的保护要求

4. **Australian Cyber Security Centre (ACSC) Essential Eight**：澳大利亚网络安全中心推荐的八个基本安全控制措施

## 2. Linux审计系统配置

### 2.1 auditd审计守护进程

auditd是Linux内核审计系统的用户空间组件，用于收集和存储审计日志：

**1. 安装auditd：**

```bash
# 在Ubuntu/Debian上安装
sudo apt-get update
sudo apt-get install auditd audispd-plugins

# 在CentOS/RHEL上安装
sudo yum install audit
```

**2. 启动和配置auditd服务：**

```bash
# 启动auditd服务
sudo systemctl start auditd
sudo systemctl enable auditd

# 检查服务状态
sudo systemctl status auditd
```

**3. 配置auditd：**

编辑`/etc/audit/auditd.conf`文件：

```txt
# 日志文件位置
log_file = /var/log/audit/audit.log

# 日志文件模式
log_format = RAW

# 日志轮转策略
max_log_file = 8
max_log_file_action = ROTATE
num_logs = 5

# 磁盘空间警告
space_left = 75
space_left_action = SYSLOG
admin_space_left = 50
admin_space_left_action = SUSPEND

# 当磁盘已满时的操作
disk_full_action = SUSPEND
disk_error_action = SUSPEND
```

### 2.2 审计规则配置

审计规则定义了auditd应该监控哪些系统调用、文件和事件：

**1. 基本审计规则语法：**

```bash
# 语法格式
auditctl -w path -p permissions -k key_name

# 参数说明
# -w path: 要监控的文件或目录路径
# -p permissions: 要监控的权限(r:读取, w:写入, x:执行, a:属性更改)
# -k key_name: 用于标识此规则的键名，便于后续搜索
```

**2. 常用审计规则配置：**

创建`/etc/audit/rules.d/audit.rules`文件添加以下规则：

```bash
# 监控系统关键文件和目录
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/gshadow -p wa -k gshadow_changes
-w /etc/sudoers -p wa -k sudoers_changes

# 监控登录和身份验证
-w /var/log/auth.log -p wa -k auth_log
-w /var/log/secure -p wa -k secure_log

# 监控系统调用
-a always,exit -F arch=b64 -S execve -k execve_calls
-a always,exit -F arch=b32 -S execve -k execve_calls

# 监控用户和组管理命令
-w /usr/sbin/useradd -p x -k user_management
-w /usr/sbin/userdel -p x -k user_management
-w /usr/sbin/usermod -p x -k user_management
-w /usr/sbin/groupadd -p x -k group_management
-w /usr/sbin/groupdel -p x -k group_management
-w /usr/sbin/groupmod -p x -k group_management

# 监控文件访问控制更改
-w /usr/bin/chmod -p x -k file_permission
-w /usr/bin/chown -p x -k file_owner
-w /usr/bin/chgrp -p x -k file_group

# 监控网络配置更改
-w /etc/network/ -p wa -k network_config
-w /etc/sysconfig/network-scripts/ -p wa -k network_config
```

**3. 加载审计规则：**

```bash
# 查看当前加载的规则
sudo auditctl -l

# 从配置文件加载规则
sudo augenrules --load

# 或直接使用auditctl加载规则
sudo auditctl -R /etc/audit/rules.d/audit.rules

# 清除所有规则
sudo auditctl -D
```

### 2.3 实时监控与报告

**1. 查看审计日志：**

```bash
# 使用ausearch命令搜索审计日志
sudo ausearch -k passwd_changes  # 按关键字搜索
sudo ausearch -ua 1000  # 按用户ID搜索
sudo ausearch -ts today  # 按时间搜索今天的日志
sudo ausearch -m USER_LOGIN  # 按消息类型搜索登录事件

# 使用aureport生成审计报告
sudo aureport  # 生成摘要报告
sudo aureport -au  # 认证报告
sudo aureport -l  # 登录报告
sudo aureport -p  # 进程报告
sudo aureport -f  # 文件访问报告
sudo aureport --start today --end now  # 指定时间范围的报告
```

**2. 实时监控审计事件：**

```bash
# 使用auditd的实时监控功能
sudo auditctl -w /etc/passwd -p wa -k实时监控
# 打开另一个终端，实时查看日志
sudo ausearch -k实时监控 -f /etc/passwd --just-one

# 或使用autrace工具跟踪单个进程的系统调用
sudo autrace ls -la /etc/
```

**3. 配置审计告警：**

创建自定义脚本响应审计事件：

```bash
#!/bin/bash
# /usr/local/bin/audit_alert.sh

while read line; do
  # 提取关键字
  key=$(echo $line | grep -oP "key=\\K[^\s]+")
  # 根据不同的关键字执行不同的操作
  if [ "$key" = "sudoers_changes" ]; then
    echo "Sudoers file modified at $(date)" | mail -s "Security Alert: sudoers Modified" admin@example.com
  fi
done
```

配置auditd的dispatcher使用此脚本：

```bash
# 编辑/etc/audisp/audispd.conf
active = yes
```

## 3. 日志管理与分析

### 3.1 系统日志管理

Linux系统使用多种日志系统记录不同类型的事件和信息：

**1. 主要日志文件位置：**

- `/var/log/syslog` 或 `/var/log/messages`：系统日志，包含大部分系统事件
- `/var/log/auth.log` 或 `/var/log/secure`：认证和授权日志，记录登录尝试和权限相关事件
- `/var/log/kern.log`：内核日志，记录内核事件和错误
- `/var/log/daemon.log`：守护进程日志
- `/var/log/user.log`：用户级日志
- `/var/log/boot.log`：系统启动日志
- `/var/log/cron.log`：定时任务日志

**2. 日志轮转配置：**

编辑`/etc/logrotate.conf`或在`/etc/logrotate.d/`目录下创建配置文件：

```txt
# 全局配置
weekly  # 每周轮转一次
rotate 4  # 保留4个备份
create  # 创建新的空日志文件
compress  # 压缩旧日志

# 自定义应用配置示例
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
    sharedscripts
    postrotate
        systemctl reload myapp > /dev/null 2>&1 || true
    endscript
}
```

**3. 日志集中管理：**

使用syslog-ng或rsyslog将日志发送到中央日志服务器：

配置rsyslog客户端（`/etc/rsyslog.conf`）：

```txt
# 将日志发送到远程服务器
*.* @@logserver.example.com:514  # 使用TCP
# 或
*.* @logserver.example.com:514  # 使用UDP

# 只发送特定类型的日志
auth,authpriv.* @@logserver.example.com:514
```

配置rsyslog服务器（`/etc/rsyslog.conf`）：

```txt
# 启用UDP监听
module(load="imudp")
input(type="imudp" port="514")

# 启用TCP监听
module(load="imtcp")
input(type="imtcp" port="514")

# 配置接收日志的存储位置
$template RemoteLogs, "/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~
```

### 3.2 日志分析工具

**1. 命令行日志分析工具：**

```bash
# 基本日志查看
cat /var/log/syslog
tail -f /var/log/auth.log  # 实时监控日志

# 过滤和搜索日志
grep "error" /var/log/syslog
grep -i "failed login" /var/log/auth.log

# 统计和分析
grep "Failed password" /var/log/auth.log | wc -l  # 统计失败登录次数
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr  # 统计失败登录的IP地址

# 使用journalctl查看systemd日志
journalctl  # 查看所有日志
journalctl -u sshd  # 查看特定服务的日志
journalctl --since "24 hours ago"  # 查看过去24小时的日志
journalctl -p err..emerg  # 只查看错误和严重级别的日志
journalctl -f  # 实时监控日志
```

**2. 高级日志分析工具：**

**Logwatch：** 自动分析系统日志并生成摘要报告

```bash
# 安装Logwatch
sudo apt-get install logwatch  # Ubuntu/Debian
sudo yum install logwatch  # CentOS/RHEL

# 运行Logwatch
sudo logwatch --output stdout --range today --service sshd

# 配置Logwatch自动发送报告
# 编辑/etc/logwatch/conf/logwatch.conf
```

**GoAccess：** 交互式实时Web日志分析工具

```bash
# 安装GoAccess
sudo apt-get install goaccess  # Ubuntu/Debian
sudo yum install goaccess  # CentOS/RHEL

# 分析Nginx日志
goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/html/report.html
```

**ELK Stack：** 企业级日志管理和分析平台

```bash
# 使用Docker Compose部署ELK Stack
# 创建docker-compose.yml文件
version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
    volumes:
      - esdata:/usr/share/elasticsearch/data
  logstash:
    image: docker.elastic.co/logstash/logstash:7.14.0
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    ports:
      - "5044:5044"
    depends_on:
      - elasticsearch
  kibana:
    image: docker.elastic.co/kibana/kibana:7.14.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
volumes:
  esdata:
```

### 3.3 日志告警配置

**1. 使用Fail2ban防止暴力破解：**

```bash
# 安装Fail2ban
sudo apt-get install fail2ban  # Ubuntu/Debian
sudo yum install fail2ban  # CentOS/RHEL

# 配置Fail2ban
# 创建本地配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑/etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

# 启用SSH保护
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600

# 启动Fail2ban服务
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# 查看Fail2ban状态
sudo fail2ban-client status
sudo fail2ban-client status sshd
```

**2. 使用logwatch配置邮件告警：**

```bash
# 编辑/etc/logwatch/conf/logwatch.conf
Output = mail
Format = html
MailTo = admin@example.com
MailFrom = logwatch@example.com
Range = yesterday
Detail = High
```

**3. 使用自定义脚本进行日志监控和告警：**

```bash
#!/bin/bash
# /usr/local/bin/log_monitor.sh

LOG_FILE="/var/log/auth.log"
ALERT_EMAIL="admin@example.com"
THRESHOLD=5

# 检查过去10分钟内的失败登录尝试
FAILED_ATTEMPTS=$(grep "Failed password" $LOG_FILE | grep "$(date --date='10 minutes ago' +'%b %_d %H:%M')" | wc -l)

if [ "$FAILED_ATTEMPTS" -gt "$THRESHOLD" ]; then
  echo "警告：检测到大量失败登录尝试！" | mail -s "安全告警：可疑登录活动" $ALERT_EMAIL
  
  # 提取可疑IP地址
  grep "Failed password" $LOG_FILE | grep "$(date --date='10 minutes ago' +'%b %_d %H:%M')" | awk '{print $11}' | sort | uniq -c | sort -nr | mail -s "安全告警：可疑IP地址" $ALERT_EMAIL
fi

# 添加到crontab中，每10分钟执行一次
# */10 * * * * /usr/local/bin/log_monitor.sh
```

## 4. 安全扫描与漏洞评估

### 4.1 漏洞扫描工具

**1. OpenVAS/Greenbone安全助手：** 开源的全面漏洞扫描器

```bash
# 在Ubuntu/Debian上安装OpenVAS
sudo apt-get install openvas

# 在CentOS/RHEL上安装OpenVAS
sudo yum install openvas

# 初始化OpenVAS
sudo gvm-setup

# 启动服务
sudo gvm-start

# 访问Web界面
# 浏览器中打开 https://localhost:9392/
```

**2. Nmap：网络扫描和安全评估工具**

```bash
# 安装Nmap
sudo apt-get install nmap  # Ubuntu/Debian
sudo yum install nmap  # CentOS/RHEL

# 基本扫描
sudo nmap -sV target_ip  # 扫描目标开放端口和服务版本

# 漏洞扫描
sudo nmap --script vuln target_ip  # 使用漏洞扫描脚本
sudo nmap -A target_ip  # 综合扫描，包括操作系统检测、版本检测、脚本扫描和跟踪路由

# 扫描整个网络段
sudo nmap -sV 192.168.1.0/24
```

**3. Lynis：开源安全审计和漏洞扫描工具**

```bash
# 安装Lynis
sudo apt-get install lynis  # Ubuntu/Debian
sudo yum install lynis  # CentOS/RHEL

# 或从源代码安装
git clone https://github.com/CISOfy/lynis
sudo ./lynis/lynis audit system

# 执行系统审计
sudo lynis audit system  # 完整系统审计
sudo lynis audit system --pentest  # 渗透测试模式

# 查看特定类别的检查
sudo lynis show options
```

### 4.2 系统安全基线检查

**1. CIS基线检查：**

使用Lynis或OpenSCAP工具检查系统是否符合CIS基线标准：

```bash
# 使用Lynis检查CIS合规性
sudo lynis audit system --profile cis

# 使用OpenSCAP检查CIS合规性
sudo apt-get install openscap-scanner scap-security-guide  # Ubuntu/Debian
sudo yum install openscap-scanner scap-security-guide  # CentOS/RHEL

# 执行CIS基线扫描
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis --results results.xml /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml  # 对于Ubuntu 20.04
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis --results results.xml /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml  # 对于RHEL 8
```

**2. 手动安全检查清单：**

**账户安全检查：**

```bash
# 检查空密码账户
sudo awk -F: '($2 == "") {print $1}' /etc/shadow

# 检查sudo权限用户
sudo grep -Po '^sudo.+?:\K.*$' /etc/group | tr ',' '\n'

# 检查登录shell为nologin或false的用户
grep -E ':(nologin|false)$' /etc/passwd

# 检查最近登录的用户
last

# 检查活跃用户
w
```

**文件权限检查：**

```bash
# 检查SUID/SGID文件
sudo find / -type f ( -perm -4000 -o -perm -2000 ) -ls 2>/dev/null

# 检查全局可写文件和目录
sudo find / -type f -perm -o+w 2>/dev/null | grep -v "^/proc"
sudo find / -type d -perm -o+w 2>/dev/null | grep -v "^/proc"

# 检查重要系统文件权限
sudo stat /etc/passwd /etc/shadow /etc/group /etc/sudoers
```

**网络安全检查：**

```bash
# 检查开放端口
sudo netstat -tuln
sudo ss -tuln

# 检查网络连接
sudo netstat -tulnps
sudo lsof -i

# 检查防火墙规则
sudo iptables -L -n
```

### 4.3 漏洞管理流程

**1. 漏洞管理生命周期：**

1. **发现**：通过扫描、渗透测试等方式发现漏洞
2. **分类**：根据漏洞的严重性、影响范围进行分类
3. **评估**：评估漏洞的风险和潜在影响
4. **修复**：制定修复计划并实施修复
5. **验证**：验证修复是否有效
6. **文档记录**：记录整个漏洞管理过程

**2. 漏洞评估标准：**

使用CVSS（通用漏洞评分系统）评估漏洞的严重性：

- **0.0-3.9**：低危漏洞
- **4.0-6.9**：中危漏洞
- **7.0-8.9**：高危漏洞
- **9.0-10.0**：严重漏洞

**3. 漏洞修复优先级：**

确定漏洞修复优先级时应考虑以下因素：

- 漏洞的严重性（CVSS评分）
- 漏洞的利用难度
- 受影响系统的重要性
- 漏洞的潜在影响范围
- 修复的复杂度和风险

**4. 漏洞管理文档模板：**

```markdown
# 漏洞管理记录

## 漏洞信息
- **漏洞ID**：CVE-2021-XXXX
- **漏洞名称**：[漏洞名称]
- **CVSS评分**：[评分]
- **严重性**：[低/中/高/严重]
- **发现日期**：YYYY-MM-DD

## 影响范围
- **受影响系统**：[系统列表]
- **影响版本**：[版本信息]

## 漏洞详情
[漏洞详细描述]

## 风险评估
[对组织的风险评估]

## 修复计划
- **修复措施**：[修复方法]
- **责任人**：[负责人]
- **计划修复日期**：YYYY-MM-DD
- **验证日期**：YYYY-MM-DD

## 修复状态
- **状态**：[未修复/修复中/已修复/已验证]
- **验证结果**：[验证详细信息]

## 备注
[其他相关信息]
```

## 5. 用户权限审计

### 5.1 用户账户与组审计

**1. 用户账户审计：**

```bash
# 列出所有用户账户
cut -d: -f1 /etc/passwd

# 列出系统用户和普通用户
awk -F: '$3 < 1000 {print $1 " (系统用户)"} $3 >= 1000 {print $1 " (普通用户)"}' /etc/passwd

# 检查最近创建的用户
sudo find /etc/passwd -mtime -30 -ls  # 查找30天内修改过的passwd文件

# 检查密码过期信息
sudo chage -l username

# 检查所有用户的密码状态
sudo awk -F: '$2 != "*" && $2 != "!" {print $1}' /etc/shadow | xargs -I {} sudo chage -l {}
```

**2. 用户组审计：**

```bash
# 列出所有用户组
cut -d: -f1 /etc/group

# 查看特定用户所属的组
groups username
id username

# 查看特定组包含的用户
grep ^groupname: /etc/group | cut -d: -f4 | tr ',' '\n'

# 检查特权组的成员
sudo grep -E '^(sudo|admin|wheel|root):' /etc/group
```

**3. 账户安全审计脚本：**

```bash
#!/bin/bash
# user_audit.sh - 用户账户安全审计脚本

echo "========= 用户账户安全审计报告 ========="
echo "生成时间: $(date)"
echo ""

# 1. 检查空密码账户
echo "\n1. 空密码账户检查:"
empty_passwords=$(sudo awk -F: '($2 == "") {print $1}' /etc/shadow)
if [ -n "$empty_passwords" ]; then
  echo "警告: 发现以下空密码账户:"
  echo "$empty_passwords"
else
  echo "未发现空密码账户"
fi

# 2. 检查密码永不过期的账户
echo "\n2. 密码永不过期的账户:"
no_expire=$(sudo awk -F: '($2 !~ /^\!/ && $5 == "99999") {print $1}' /etc/shadow)
if [ -n "$no_expire" ]; then
  echo "警告: 发现以下密码永不过期的账户:"
  echo "$no_expire"
else
  echo "未发现密码永不过期的账户"
fi

# 3. 检查sudo权限用户
echo "\n3. sudo权限用户:"
sudo_users=$(sudo grep -Po '^sudo.+?:\K.*$' /etc/group | tr ',' '\n')
if [ -n "$sudo_users" ]; then
  echo "发现以下具有sudo权限的用户:"
  echo "$sudo_users"
else
  echo "未发现sudo权限用户"
fi

# 4. 检查shell为nologin的系统账户
echo "\n4. shell为nologin的系统账户:"
nologin_shells=$(grep -E ':(nologin|false)$' /etc/passwd | cut -d: -f1)
if [ -n "$nologin_shells" ]; then
  echo "发现以下shell为nologin/false的账户:"
  echo "$nologin_shells"
else
  echo "未发现shell为nologin/false的账户"
fi

echo "\n========= 审计报告结束 ========="
```

### 5.2 特权账户管理

**1. sudo权限审计：**

```bash
# 检查sudo配置文件
sudo visudo  # 安全编辑sudo配置

# 检查sudo访问日志
grep "sudo" /var/log/auth.log  # Ubuntu/Debian
grep "sudo" /var/log/secure   # CentOS/RHEL

# 查看sudo配置详情
sudo cat /etc/sudoers /etc/sudoers.d/*

# 查找使用通配符的sudo规则
sudo grep -E '[\\*\\?]' /etc/sudoers /etc/sudoers.d/*
```

**2. 特权账户最小权限原则：**

遵循最小权限原则配置sudo访问：

```bash
# 限制用户只能执行特定命令
username ALL=(ALL) /usr/bin/systemctl restart apache2, /usr/bin/tail -f /var/log/apache2/error.log

# 允许用户以特定用户身份执行命令
username ALL=(www-data) /usr/bin/php /var/www/html/script.php

# 限制命令参数
username ALL=(ALL) /bin/systemctl restart [a-z]*

# 不要求密码的命令（谨慎使用）
username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart apache2
```

**3. PAM（可插拔认证模块）配置审计：**

```bash
# 查看PAM配置文件
sudo ls -la /etc/pam.d/
sudo cat /etc/pam.d/common-auth  # Ubuntu/Debian
sudo cat /etc/pam.d/password-auth  # CentOS/RHEL

# 检查密码复杂度要求
sudo cat /etc/pam.d/common-password  # Ubuntu/Debian
sudo cat /etc/pam.d/system-auth  # CentOS/RHEL

# 检查登录失败限制
sudo cat /etc/pam.d/sshd
```

### 5.3 密码策略审计

**1. 密码策略检查：**

```bash
# 查看密码策略配置
# Ubuntu/Debian
sudo cat /etc/pam.d/common-password
# CentOS/RHEL
sudo cat /etc/pam.d/system-auth

# 查看密码过期策略
grep -E 'PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE' /etc/login.defs

# 检查密码质量要求（如果使用libpam-pwquality/pam_pwquality）
sudo cat /etc/security/pwquality.conf
```

**2. 配置强密码策略：**

编辑`/etc/security/pwquality.conf`文件：

```txt
# 密码最小长度
minlen = 12

# 密码必须包含的字符类型数量
minclass = 4

# 至少包含的小写字母数量
lcredit = -1

# 至少包含的大写字母数量
ucredit = -1

# 至少包含的数字数量
dcredit = -1

# 至少包含的特殊字符数量
ocredit = -1

# 拒绝包含用户名的密码
reject_username

# 检查密码是否在词典中
dictcheck = 1

# 检查前一个密码（防止循环使用）
remember = 5
```

编辑`/etc/login.defs`文件：

```txt
# 密码最长使用天数
PASS_MAX_DAYS 90

# 密码最短使用天数
PASS_MIN_DAYS 7

# 密码过期前警告天数
PASS_WARN_AGE 14

# 密码复杂度检查
PASS_COMPLEX_Check yes
```

## 6. 网络安全审计

### 6.1 网络配置安全检查

**1. 网络接口和防火墙检查：**

```bash
# 查看网络接口配置
ip addr show
ifconfig -a

# 检查网络接口安全设置
sudo ethtool -i eth0  # 查看网络接口驱动信息
sudo ethtool eth0    # 查看网络接口配置

# 检查防火墙规则
sudo iptables -L -n -v
sudo iptables-save > firewall_rules.txt  # 保存当前防火墙规则

# 检查连接跟踪表
sudo conntrack -L

# 检查开放端口和监听服务
sudo ss -tuln
sudo netstat -tuln
```

**2. TCP/IP安全参数检查：**

```bash
# 检查TCP/IP安全参数
sysctl -a | grep -E 'tcp|ip|icmp'

# 检查TCP SYN cookies设置
sysctl net.ipv4.tcp_syncookies

# 检查ICMP重定向设置
sysctl net.ipv4.conf.all.accept_redirects
sysctl net.ipv6.conf.all.accept_redirects

# 检查源路由设置
sysctl net.ipv4.conf.all.accept_source_route
sysctl net.ipv6.conf.all.accept_source_route

# 检查反向路径过滤设置
sysctl net.ipv4.conf.all.rp_filter
```

**3. 网络安全加固配置：**

编辑`/etc/sysctl.conf`或在`/etc/sysctl.d/`目录下创建配置文件：

```txt
# 启用SYN cookies
net.ipv4.tcp_syncookies = 1

# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0

# 启用严格的反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 禁用ICMP广播请求
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 启用ICMP错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 限制TCP TIME_WAIT套接字的最大数量
net.ipv4.tcp_max_tw_buckets = 6000

# 增加TCP最大连接数
net.core.somaxconn = 65535

# 禁止发送ICMP重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
```

应用新的sysctl设置：

```bash
sudo sysctl -p
```

### 6.2 服务安全审计

**1. 运行服务检查：**

```bash
# 查看所有运行的服务（systemd）
systemctl list-units --type=service --state=running

# 查看启动时自动运行的服务
systemctl list-unit-files --type=service --state=enabled

# 查看inetd/xinetd服务（如果使用）
ls -la /etc/xinetd.d/  # 查看xinetd配置文件
```

**2. 网络服务安全配置：**

**SSH服务安全审计：**

```bash
# 检查SSH配置
sudo cat /etc/ssh/sshd_config

# 审计SSH配置的安全最佳实践
sshd_config=/etc/ssh/sshd_config
echo "检查SSH根登录限制:"
grep "^PermitRootLogin" $sshd_config
echo "\n检查密码认证:"
grep "^PasswordAuthentication" $sshd_config
echo "\n检查公钥认证:"
grep "^PubkeyAuthentication" $sshd_config
echo "\n检查SSH协议版本:"
grep "^Protocol" $sshd_config
echo "\n检查登录失败限制:"
grep "^MaxAuthTries" $sshd_config
echo "\n检查空密码登录:"
grep "^PermitEmptyPasswords" $sshd_config
```

**Web服务器安全审计：**

```bash
# Nginx安全检查
nginx -V  # 查看Nginx版本和编译参数
sudo cat /etc/nginx/nginx.conf  # 检查Nginx主配置
sudo find /etc/nginx/sites-enabled/ -type f -exec cat {} \;  # 检查所有启用的站点配置

# Apache安全检查
apache2 -v  # 查看Apache版本
sudo apache2ctl -M  # 查看加载的模块
sudo cat /etc/apache2/apache2.conf  # 检查Apache主配置
sudo cat /etc/apache2/conf-enabled/security.conf  # 检查安全配置
```

### 6.3 数据传输安全审计

**1. SSL/TLS配置审计：**

```bash
# 检查SSL/TLS版本和密码套件（使用nmap）
sudo nmap --script ssl-enum-ciphers -p 443 example.com

# 使用SSL Labs API进行在线检查（需要curl）
curl -s https://api.ssllabs.com/api/v3/analyze?host=example.com

# 检查本地SSL证书
openssl x509 -in /etc/ssl/certs/example.com.crt -text -noout

# 检查SSL证书过期时间
openssl x509 -enddate -noout -in /etc/ssl/certs/example.com.crt
```

**2. SSL/TLS安全加固：**

**Nginx SSL配置示例：**

```nginx
server {
    listen 443 ssl http2;
    server_name example.com;
    
    # SSL证书配置
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    
    # 安全SSL配置
    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";
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    
    # HSTS配置
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    # 安全头部
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-XSS-Protection "1; mode=block";
    
    # 其他配置...
}
```

**Apache SSL配置示例：**

```apache

```

## 7. 系统安全加固

### 7.1 系统更新与补丁管理

**1. 系统更新审计与配置：**

```bash
# 检查待更新的包
apt list --upgradable  # Ubuntu/Debian
yum check-update  # CentOS/RHEL

# 更新系统
sudo apt update && sudo apt upgrade -y  # Ubuntu/Debian
sudo yum update -y  # CentOS/RHEL

# 配置自动安全更新（Ubuntu/Debian）
sudo apt-get install unattended-upgrades

# 编辑自动更新配置
sudo nano /etc/apt/apt.conf.d/20auto-upgrades
```

配置文件`/etc/apt/apt.conf.d/20auto-upgrades`内容示例：

```txt
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
```

配置`/etc/apt/apt.conf.d/50unattended-upgrades`文件控制自动更新行为：

```txt
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        // 其他源...
};

// 自动重启设置
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
```

**2. 补丁管理策略：**

制定系统补丁管理策略应考虑以下方面：

- **评估流程**：如何评估补丁的重要性和潜在影响
- **测试流程**：在生产环境部署前如何测试补丁
- **部署时间表**：何时以及如何部署补丁
- **回滚计划**：如果补丁导致问题，如何快速回滚
- **文档记录**：如何记录补丁管理活动

### 7.2 服务与端口加固

**1. 禁用不必要的服务：**

```bash
# 停止并禁用服务
sudo systemctl stop service_name
sudo systemctl disable service_name

# 检查是否禁用成功
sudo systemctl is-enabled service_name

# 查找并关闭不必要的xinetd服务
# 编辑/etc/xinetd.d/中的配置文件，将disable设置为yes
```

**2. 配置防火墙规则：**

**使用iptables：**

```bash
# 基本防火墙规则脚本
#!/bin/bash

# 清空现有规则
iptables -F
iptables -X
iptables -Z

# 设置默认策略
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

# 允许SSH连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许Web服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 保存规则
iptables-save > /etc/iptables/rules.v4
```

**使用ufw（Ubuntu/Debian）：**

```bash
# 启用ufw
sudo ufw enable

# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 允许特定服务
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

# 允许特定IP访问特定端口
sudo ufw allow from 192.168.1.100 to any port 22

# 查看规则
sudo ufw status verbose
```

**使用firewalld（CentOS/RHEL 7+）：**

```bash
# 启动并启用firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 设置默认区域
sudo firewall-cmd --set-default-zone=public

# 允许特定服务
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 允许特定端口
sudo firewall-cmd --permanent --add-port=8080/tcp

# 重新加载规则
sudo firewall-cmd --reload

# 查看规则
sudo firewall-cmd --list-all
```

### 7.3 文件系统安全加固

**1. 文件系统挂载选项：**

编辑`/etc/fstab`文件，添加安全挂载选项：

```
# 基本格式
/dev/sda1  /  ext4  defaults,noexec,nosuid,nodev  0  1

# 挂载/tmp分区为独立分区，使用noexec,nosuid,nodev选项
/dev/sda2  /tmp  ext4  defaults,noexec,nosuid,nodev  0  2

# 挂载/var/tmp分区
/dev/sda3  /var/tmp  ext4  defaults,noexec,nosuid,nodev  0  2

# 挂载/home分区，使用nodev选项
/dev/sda4  /home  ext4  defaults,nodev  0  2

# 挂载/var/log分区
/dev/sda5  /var/log  ext4  defaults,noexec,nosuid,nodev  0  2

# 挂载/var/log/audit分区
/dev/sda6  /var/log/audit  ext4  defaults,noexec,nosuid,nodev  0  2
```

重要的挂载选项说明：

- **noexec**：禁止在该分区执行可执行文件
- **nosuid**：禁止设置SUID/SGID位
- **nodev**：禁止创建设备文件
- **noatime**：不更新文件访问时间戳，提高性能并减少磁盘I/O
- **nodiratime**：不更新目录访问时间戳

**2. 文件权限加固：**

```bash
# 设置重要系统文件的安全权限
sudo chmod 644 /etc/passwd
sudo chmod 600 /etc/shadow
sudo chmod 644 /etc/group
sudo chmod 600 /etc/gshadow
sudo chmod 440 /etc/sudoers

# 查找并修复全局可写文件
sudo find / -type f -perm -002 -not -path "/proc/*" -not -path "/sys/*" -not -path "/dev/*" -exec chmod o-w {} \; 2>/dev/null

# 查找并修复SUID/SGID文件
sudo find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \; 2>/dev/null

# 移除不必要的SUID/SGID权限
sudo chmod u-s /path/to/file
sudo chmod g-s /path/to/file
```

**3. 使用SELinux/AppArmor强化安全：**

**SELinux配置（CentOS/RHEL）：**

```bash
# 查看SELinux状态
sestatus

# 设置SELinux模式
sudo setenforce 1  # 强制模式
sudo setenforce 0  # 宽容模式

# 永久设置SELinux模式，编辑/etc/selinux/config文件
SELINUX=enforcing  # 强制模式
SELINUX=permissive  # 宽容模式
SELINUX=disabled  # 禁用SELinux

# 查看SELinux布尔值设置
getsebool -a

# 设置SELinux布尔值
sudo setsebool -P httpd_can_network_connect on

# 查看文件的SELinux上下文
ls -Z filename

# 修改文件的SELinux上下文
sudo chcon -t httpd_sys_content_t /var/www/html/file.html
```

**AppArmor配置（Ubuntu/Debian）：**

```bash
# 查看AppArmor状态
sudo apparmor_status

# 启用配置文件
sudo aa-enforce /etc/apparmor.d/profile-name

# 切换到投诉模式
sudo aa-complain /etc/apparmor.d/profile-name

# 创建自定义AppArmor配置文件
# 复制现有模板并根据需要修改
sudo cp /etc/apparmor.d/template /etc/apparmor.d/myapp
# 编辑配置文件
sudo nano /etc/apparmor.d/myapp
# 加载配置文件
sudo apparmor_parser -r /etc/apparmor.d/myapp
```

## 8. 合规性检查与报告

### 8.1 常见合规标准要求

**1. PCI DSS合规要求：**

支付卡行业数据安全标准(PCI DSS)主要要求包括：

- **建立和维护防火墙配置**：保护持卡人数据
- **不使用供应商提供的默认密码和安全参数**
- **保护存储的持卡人数据**
- **加密传输中的持卡人数据**
- **使用和定期更新防病毒软件**
- **开发和维护安全系统和应用程序**
- **限制对持卡人数据的访问权限**
- **为每个访问计算机的人分配唯一ID**
- **限制对持卡人数据的物理访问**
- **跟踪和监控对网络资源和持卡人数据的所有访问**
- **定期测试安全系统和流程**
- **维护安全策略**

**2. HIPAA合规要求：**

健康保险可携性和责任法案(HIPAA)的安全规则要求：

- **实施行政保障**：制定和实施安全管理政策和程序
- **实施物理保障**：限制对电子受保护健康信息(ePHI)的物理访问
- **实施技术保障**：确保ePHI的保密性、完整性和可用性
- **实施访问控制**：限制对ePHI的访问，只给有正当业务需要的人
- **实施审计控制**：记录和检查系统活动
- **实施完整性控制**：防止ePHI被不当更改或销毁
- **实施传输安全**：防止传输中ePHI被不当访问

**3. GDPR合规要求：**

通用数据保护条例(GDPR)的安全要求包括：

- **实施技术和组织措施**：确保适当级别的安全
- **实施数据保护设计和默认数据保护**
- **定期测试、评估和评价技术和组织措施的有效性**
- **记录处理活动**
- **实施数据泄露通知程序**
- **实施数据保护影响评估**
- **指定数据保护官**

### 8.2 合规性检查工具

**1. OpenSCAP合规检查工具：**

```bash
# 安装OpenSCAP
sudo apt-get install openscap-scanner scap-security-guide  # Ubuntu/Debian
sudo yum install openscap-scanner scap-security-guide  # CentOS/RHEL

# 列出可用的安全配置文件
sudo oscap info /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml  # 对于Ubuntu 20.04
sudo oscap info /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml  # 对于RHEL 8

# 执行PCI DSS合规性检查
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_pci-dss --results pci-dss-results.xml --report pci-dss-report.html /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

# 执行CIS基准检查
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis --results cis-results.xml --report cis-report.html /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

# 执行HIPAA合规性检查
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_hipaa --results hipaa-results.xml --report hipaa-report.html /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml
```

**2. Lynis合规性检查：**

```bash
# 使用Lynis进行合规性检查
sudo lynis audit system --profile pci-dss  # PCI DSS合规检查
sudo lynis audit system --profile hipaa  # HIPAA合规检查
sudo lynis audit system --profile cis  # CIS基线检查

# 生成合规性报告
sudo lynis audit system --report-file /tmp/lynis-report.dat
```

**3. 自定义合规性检查脚本：**

创建自定义脚本来检查特定合规要求：

```bash
#!/bin/bash
# compliance_check.sh - 自定义合规性检查脚本

echo "========= 合规性检查报告 ========="
echo "生成时间: $(date)"
echo ""

# 检查1: 密码策略合规性
echo "\n1. 密码策略合规性检查:"
max_days=$(grep PASS_MAX_DAYS /etc/login.defs | awk '{print $2}')
if [ "$max_days" -le 90 ]; then
  echo "[通过] 密码最长使用天数: $max_days 天 (≤ 90 天)"
else
  echo "[失败] 密码最长使用天数: $max_days 天 (> 90 天)"
fi

# 检查2: 防火墙状态
echo "\n2. 防火墙状态检查:"
if command -v ufw >/dev/null && sudo ufw status | grep -q "Status: active"; then
  echo "[通过] UFW防火墙已激活"
elif command -v firewall-cmd >/dev/null && sudo firewall-cmd --state | grep -q "running"; then
  echo "[通过] firewalld防火墙已激活"
elif [ "$(sudo iptables -L | grep -c "policy DROP")" -ge 2 ]; then
  echo "[通过] iptables防火墙规则已配置"
else
  echo "[失败] 未检测到活动的防火墙配置"
fi

# 检查3: SSH安全配置
echo "\n3. SSH安全配置检查:"
if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config; then
  echo "[通过] SSH根登录已禁用"
else
  echo "[失败] SSH根登录未禁用"
fi

if grep -q "^PasswordAuthentication no" /etc/ssh/sshd_config; then
  echo "[通过] SSH密码认证已禁用"
else
  echo "[警告] SSH密码认证未禁用"
fi

# 检查4: 系统更新状态
echo "\n4. 系统更新状态检查:"
if [ -x "$(command -v apt)" ]; then
  updates=$(apt list --upgradable 2>/dev/null | grep -c "upgradable")
elif [ -x "$(command -v yum)" ]; then
  updates=$(yum check-update 2>/dev/null | grep -c "\.")
fi

if [ "$updates" -eq 0 ]; then
  echo "[通过] 系统已更新，没有待更新的包"
else
  echo "[警告] 有 $updates 个包需要更新"
fi

# 更多检查可以根据具体合规要求添加
echo "\n========= 检查报告结束 ========="
```

### 8.3 安全审计报告生成

**1. 安全审计报告模板：**

```markdown
# Linux系统安全审计报告

## 1. 执行摘要

[简要概述审计范围、发现的主要问题和建议的优先修复项]

## 2. 审计范围与方法

### 2.1 审计范围
- **审计系统**：[系统名称/主机名]
- **审计时间**：[开始日期] 至 [结束日期]
- **审计人员**：[审计人员姓名]
- **审计工具**：[使用的工具，如OpenSCAP、Lynis、nmap等]

### 2.2 审计方法
[描述使用的审计方法和流程]

## 3. 审计发现

### 3.1 高风险发现
| 编号 | 发现项 | 风险级别 | 合规影响 | 建议修复 |
|------|--------|----------|----------|----------|
| 1 | [高风险问题描述] | 高 | [相关合规要求] | [具体修复建议] |
| 2 | ... | ... | ... | ... |

### 3.2 中风险发现
| 编号 | 发现项 | 风险级别 | 合规影响 | 建议修复 |
|------|--------|----------|----------|----------|
| 1 | [中风险问题描述] | 中 | [相关合规要求] | [具体修复建议] |
| 2 | ... | ... | ... | ... |

### 3.3 低风险发现
| 编号 | 发现项 | 风险级别 | 合规影响 | 建议修复 |
|------|--------|----------|----------|----------|
| 1 | [低风险问题描述] | 低 | [相关合规要求] | [具体修复建议] |
| 2 | ... | ... | ... | ... |

## 4. 详细发现与证据

### 4.1 [高风险发现详情]

**问题描述**：[详细描述问题]

**技术细节**：[相关技术细节和配置]

**证据**：[审计日志或命令输出]

**风险评估**：[评估问题可能导致的风险]

**修复建议**：[具体的修复步骤]

### 4.2 [其他发现详情]
[类似结构]

## 5. 合规状态

### 5.1 [合规标准名称] (如PCI DSS)
- **合规状态**：[完全合规/部分合规/不合规]
- **合规百分比**：XX%
- **不合规项**：[简要列出不合规项]

### 5.2 [其他合规标准]
[类似结构]

## 6. 总结与建议

### 6.1 总结
[总结审计结果和系统整体安全状态]

### 6.2 建议措施
1. **紧急措施**：[需要立即采取的措施]
2. **短期措施**：[30天内需要实施的措施]
3. **长期措施**：[需要长期规划和实施的措施]

### 6.3 后续审计
- **建议下次审计时间**：[日期]
- **建议重点关注领域**：[领域列表]

## 7. 附录

### 7.1 审计工具输出
[包含详细的审计工具输出或引用]

### 7.2 相关文档
[列出参考的安全标准、政策和程序]
```

**2. 使用自动化工具生成报告：**

```bash
# 使用OpenSCAP生成HTML报告
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis --report security-report.html /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

# 使用Lynis生成报告
sudo lynis audit system --report-file /tmp/lynis-report.dat
```

## 总结

Linux安全审计是确保系统安全和合规的关键过程。通过实施全面的安全审计策略，包括配置审计系统、收集和分析日志、执行漏洞扫描、检查用户权限、评估网络安全以及加固系统配置，可以有效识别和减少安全风险。

持续的安全审计和合规性检查不仅有助于满足法规要求，还能保护系统和数据免受不断演变的安全威胁。结合自动化工具和手动检查，建立定期审计流程，并保持与最新安全最佳实践的同步，是维护Linux系统长期安全的重要策略。
