主题
Linux 安全审计 - 日志分析、合规性检查与安全加固
1. 安全审计基础
1.1 安全审计概念与意义
安全审计是对系统安全状态进行全面评估、监控和分析的过程,旨在发现潜在安全风险、监控异常行为并确保系统符合安全策略和法规要求。
安全审计的主要目标:
- 识别安全弱点:发现系统配置错误、漏洞和安全缺陷
- 监控系统活动:记录和分析用户行为、系统事件和安全事件
- 确保合规性:验证系统是否符合安全政策、法规和标准
- 调查安全事件:提供证据和信息,用于安全事件的分析和调查
- 支持安全决策:为安全策略制定和资源分配提供依据
安全审计的重要性:
- 预防安全事件:通过发现和修复安全问题,预防安全事件发生
- 减少安全风险:评估并降低组织面临的安全风险
- 满足法规要求:许多行业法规和标准都要求定期进行安全审计
- 保护数据安全:确保敏感数据得到适当保护
- 提高安全意识:促进组织内部的安全文化和意识
1.2 安全审计原则与范围
安全审计原则:
- 完整性:审计过程应全面覆盖系统的所有关键组件和活动
- 独立性:审计人员应保持独立,避免利益冲突
- 客观性:基于事实而非主观判断进行评估
- 保密性:保护审计过程中获取的敏感信息
- 及时性:定期进行审计,并及时报告和解决发现的问题
安全审计范围:
- 系统配置审计:检查系统配置是否符合安全最佳实践
- 权限审计:审查用户账户、组和权限设置
- 日志审计:分析系统日志、应用日志和安全日志
- 网络安全审计:评估网络配置、防火墙规则和通信安全
- 应用安全审计:检查应用程序的安全漏洞和配置
- 数据安全审计:评估数据存储、传输和访问控制的安全性
- 物理安全审计:检查物理访问控制和环境安全
1.3 常见安全审计标准
国际安全审计标准:
ISO 27001/27002:信息安全管理体系(ISMS)标准,提供了信息安全管理的最佳实践
PCI DSS:支付卡行业数据安全标准,适用于处理支付卡数据的组织
NIST SP 800-53:美国国家标准与技术研究院发布的安全控制框架
COBIT:信息及相关技术控制目标,提供IT治理和控制框架
HIPAA:美国健康保险可携性和责任法案,适用于医疗保健行业
Linux安全基线标准:
CIS Linux Benchmarks:由Center for Internet Security发布的Linux安全配置基线
DISA STIG for Linux:美国国防信息系统局发布的Linux安全技术实施指南
NIST SP 800-171:适用于受控非机密信息的保护要求
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 audit2. 启动和配置auditd服务:
bash
# 启动auditd服务
sudo systemctl start auditd
sudo systemctl enable auditd
# 检查服务状态
sudo systemctl status auditd3. 配置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 = SUSPEND2.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_config3. 加载审计规则:
bash
# 查看当前加载的规则
sudo auditctl -l
# 从配置文件加载规则
sudo augenrules --load
# 或直接使用auditctl加载规则
sudo auditctl -R /etc/audit/rules.d/audit.rules
# 清除所有规则
sudo auditctl -D2.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 = yes3. 日志管理与分析
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.confGoAccess: 交互式实时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.htmlELK 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 sshd2. 使用logwatch配置邮件告警:
bash
# 编辑/etc/logwatch/conf/logwatch.conf
Output = mail
Format = html
MailTo = [email protected]
MailFrom = [email protected]
Range = yesterday
Detail = High3. 使用自定义脚本进行日志监控和告警:
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.sh4. 安全扫描与漏洞评估
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/243. 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 options4.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 82. 手动安全检查清单:
账户安全检查:
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 -n4.3 漏洞管理流程
1. 漏洞管理生命周期:
- 发现:通过扫描、渗透测试等方式发现漏洞
- 分类:根据漏洞的严重性、影响范围进行分类
- 评估:评估漏洞的风险和潜在影响
- 修复:制定修复计划并实施修复
- 验证:验证修复是否有效
- 文档记录:记录整个漏洞管理过程
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/group3. 账户安全审计脚本:
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 apache23. 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/sshd5.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.conf2. 配置强密码策略:
编辑/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 yes6. 网络安全审计
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 -tuln2. 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_filter3. 网络安全加固配置:
编辑/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 -p6.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_configWeb服务器安全审计:
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.crt2. 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设置为yes2. 配置防火墙规则:
使用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-all7.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/file3. 使用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.htmlAppArmor配置(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/myapp8. 合规性检查与报告
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.xml2. 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.dat3. 自定义合规性检查脚本:
创建自定义脚本来检查特定合规要求:
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系统长期安全的重要策略。