教程 linux tutorial

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" [email protected]
  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 = [email protected]
MailFrom = [email protected]
Range = yesterday
Detail = High

3. 使用自定义脚本进行日志监控和告警:

bash
#!/bin/bash
# /usr/local/bin/log_monitor.sh

LOG_FILE="/var/log/auth.log"
ALERT_EMAIL="[email protected]"
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
<VirtualHost *:443>
    ServerName example.com
    
    # SSL证书配置
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key
    
    # 安全SSL配置
    SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 +TLSv1.3
    SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128
    SSLHonorCipherOrder on
    SSLSessionCache "shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)"
    SSLSessionCacheTimeout 300
    
    # HSTS配置
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    
    # 安全头部
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    
    # 其他配置...
</VirtualHost>

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系统长期安全的重要策略。