正文开始
相逢即是缘,关注⭐星标不错过~,每天分享实操教程和技巧。
一、Linux等保核查脚本(linux_security_audit.sh)
#!/bin/bash
# 初始化变量
report_file="/tmp/security_audit_$(date +%Y%m%d).html"
tmpfile=$(mktemp /tmp/check.XXXXXX)
# HTML报告头
cat > $report_file <<EOF
<html>
<head>
<title>Linux安全基线核查报告</title>
<style>
body{font-family: Arial; margin: 20px;}
table{border-collapse: collapse; width: 100%;}
th,td{padding: 8px; text-align: left; border: 1px solid #ddd;}
th{background-color: #4CAF50; color: white;}
tr:nth-child(even){background-color: #f2f2f2;}
.pass{color: green;}
.fail{color: red;}
</style>
</head>
<body>
<h2>Linux系统安全基线核查报告</h2>
<p>生成时间:$(date "+%Y-%m-%d %H:%M:%S")</p>
<table>
<tr><th>检查项</th><th>状态</th><th>检测结果</th><th>标准要求</th><th>修复建议</th></tr>
EOF
# 检查结果记录函数
functionadd_result() {
local item=$1
local status=$2
local result=$3
local standard=$4
local suggestion=$5
echo"<tr><td>$item</td><td class='$status'>${status^^}</td><td>$result</td><td>$standard</td><td>$suggestion</td></tr>" >> $report_file
}
# 1. 身份鉴别检查
functioncheck_auth() {
echo"[+] 正在进行身份鉴别检查..."
# 检查密码复杂度策略
local pass_ret=$(grep -P '^password\s+requisite\s+pam_pwquality.so' /etc/pam.d/system-auth)
if [[ $pass_ret =~ minlen=12 ]]; then
add_result "密码复杂度策略""pass""已配置(minlen=12)""密码长度至少12位""保持当前配置"
else
add_result "密码复杂度策略""fail""未满足要求""密码长度至少12位""在/etc/pam.d/system-auth中配置minlen=12"
fi
# 检查登录失败处理
if grep -q "pam_tally2.so.*deny=5" /etc/pam.d/sshd; then
add_result "登录失败处理""pass""失败锁定策略已启用""登录失败5次锁定账户""保持当前配置"
else
add_result "登录失败处理""fail""未配置登录锁定""登录失败5次锁定账户""在pam配置中添加auth required pam_tally2.so deny=5 unlock_time=600"
fi
}
# 2. 访问控制检查
functioncheck_access() {
echo"[+] 正在进行访问控制检查..."
# 检查特权账户
if [[ $(awk -F: '$3==0{print $1}' /etc/passwd | wc -l) -eq 1 ]]; then
add_result "特权账户检查""pass""单一root账户""只允许一个特权账户""保持当前配置"
else
add_result "特权账户检查""fail""存在多个特权账户""只允许一个特权账户""删除多余特权账户"
fi
# 检查umask设置
if grep -q "umask 027" /etc/profile; then
add_result "默认umask值""pass""umask 027已配置""默认权限不应超过750""保持当前配置"
else
add_result "默认umask值""fail""umask配置不安全""默认权限不应超过750""在/etc/profile中添加umask 027"
fi
}
# 3. 安全审计检查
functioncheck_audit() {
echo"[+] 正在进行安全审计检查..."
# 检查审计服务状态
if systemctl is-active auditd &>/dev/null; then
add_result "审计服务状态""pass""auditd服务运行中""应启用安全审计功能""保持服务启用状态"
else
add_result "审计服务状态""fail""审计服务未运行""应启用安全审计功能""启动auditd服务:systemctl start auditd"
fi
# 检查日志保存时间
if grep -q "rotate 180" /etc/logrotate.conf; then
add_result "日志保存策略""pass""日志保存180天""审计记录至少保存180天""保持当前配置"
else
add_result "日志保存策略""fail""日志保存时间不足""审计记录至少保存180天""修改logrotate配置为rotate 180"
fi
}
# 执行检查
check_auth
check_access
check_audit
# 生成报告尾
cat >> $report_file <<EOF
</table>
</body>
</html>
EOF
echo "检查完成,报告已生成至:$report_file"
[root@localhost tmp]# chmod +x linux_security_audit.sh
[root@localhost tmp]# ./linux_security_audit.sh


二、Windows等保核查脚本(windows_security_audit.ps1)
# 初始化报告
$reportFile = Join-Path-Path$env:USERPROFILE\Documents -ChildPath"Windows安全核查报告_$(Get-Date -Format yyyyMMdd).html"
$style = @"
<style>
body{font-family: Arial; margin: 20px;}
table{border-collapse: collapse; width: 100%;}
th,td{padding: 8px; text-align: left; border: 1px solid #ddd;}
th{background-color: #4CAF50; color: white;}
tr:nth-child(even){background-color: #f2f2f2;}
.pass{color: green;}
.fail{color: red;}
</style>
"@
# 创建HTML报告
try {
ConvertTo-Html-Title"Windows安全基线核查报告"-Head$style-Body"<h2>Windows系统安全核查报告</h2><p>生成时间:$(Get-Date)</p><table>" | Out-File$reportFile
} catch {
Write-Host"创建报告文件时出错: $_"
return
}
# 检查函数
function Add-AuditResult {
param(
[string]$Item,
[string]$Status,
[string]$Result,
[string]$Standard,
[string]$Solution
)
$row = "<tr><td>$Item</td><td class='$Status'>$Status</td><td>$Result</td><td>$Standard</td><td>$Solution</td></tr>"
try {
Add-Content-Path$reportFile-Value$row
} catch {
Write-Host"写入报告文件时出错: $_"
}
}
# 1. 账户策略检查
function Check-AccountPolicy {
Write-Host"[+] 检查账户策略..."
# 密码复杂度
if (Test-Path"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System") {
try {
$passComplexity = (Get-ItemProperty"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System").PasswordComplexity
if ($passComplexity-eq1) {
Add-AuditResult-Item"密码复杂度"-Status"pass"-Result"已启用"-Standard"必须启用密码复杂性要求"-Solution"保持当前策略"
} else {
Add-AuditResult-Item"密码复杂度"-Status"fail"-Result"未启用"-Standard"必须启用密码复杂性要求"-Solution"在组策略中启用密码复杂性要求"
}
} catch {
Add-AuditResult-Item"密码复杂度"-Status"fail"-Result"读取注册表项时出错: $_"-Standard"必须启用密码复杂性要求"-Solution"检查注册表项或手动设置密码复杂度策略"
}
} else {
Add-AuditResult-Item"密码复杂度"-Status"fail"-Result"注册表项不存在"-Standard"必须启用密码复杂性要求"-Solution"检查注册表项是否存在或手动设置密码复杂度策略"
}
# 账户锁定策略
try {
$lockoutThreshold = (net accounts | Select-String"锁定阈值").ToString().Split(":")[1].Trim()
if ([int]$lockoutThreshold-le5) {
Add-AuditResult-Item"账户锁定策略"-Status"pass"-Result"锁定阈值$lockoutThreshold次"-Standard"登录失败次数≤5次"-Solution"保持当前配置"
} else {
Add-AuditResult-Item"账户锁定策略"-Status"fail"-Result"当前阈值$lockoutThreshold次"-Standard"登录失败次数≤5次"-Solution"通过gpedit.msc调整账户锁定阈值"
}
} catch {
Add-AuditResult-Item"账户锁定策略"-Status"fail"-Result"获取账户锁定阈值时出错: $_"-Standard"登录失败次数≤5次"-Solution"手动检查账户锁定策略"
}
}
# 2. 日志审计检查
function Check-AuditPolicy {
Write-Host"[+] 检查审计策略..."
# 安全日志保留天数
if (Test-Path"HKLM:\SOFTWARE\Policies\Microsoft\Windows\EventLog\Security") {
try {
$logRetention = (Get-ItemProperty"HKLM:\SOFTWARE\Policies\Microsoft\Windows\EventLog\Security").Retention
if ($logRetention-eq180) {
Add-AuditResult-Item"日志保留天数"-Status"pass"-Result"保留180天"-Standard"日志至少保留180天"-Solution"保持当前配置"
} else {
Add-AuditResult-Item"日志保留天数"-Status"fail"-Result"当前保留${logRetention}天"-Standard"日志至少保留180天"-Solution"修改组策略:计算机配置→管理模板→Windows组件→事件日志→安全日志保留天数"
}
} catch {
Add-AuditResult-Item"日志保留天数"-Status"fail"-Result"读取注册表项时出错: $_"-Standard"日志至少保留180天"-Solution"检查注册表项或手动设置日志保留天数"
}
} else {
Add-AuditResult-Item"日志保留天数"-Status"fail"-Result"注册表项不存在"-Standard"日志至少保留180天"-Solution"检查注册表项是否存在或手动设置日志保留天数"
}
}
# 3. 服务配置检查
function Check-ServiceConfig {
Write-Host"[+] 检查服务配置..."
# 远程桌面服务状态
try {
$rdpStatus = (Get-Service TermService -ErrorAction SilentlyContinue).Status
if ($rdpStatus-eq"Running") {
if (Test-Path"HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp") {
try {
$rdpPort = (Get-ItemProperty"HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp").PortNumber
if ($rdpPort-ne3389) {
Add-AuditResult-Item"远程桌面配置"-Status"pass"-Result"非默认端口${rdpPort}"-Standard"应修改默认RDP端口"-Solution"保持当前配置"
} else {
Add-AuditResult-Item"远程桌面配置"-Status"fail"-Result"使用默认3389端口"-Standard"应修改默认RDP端口"-Solution"修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp下的PortNumber值"
}
} catch {
Add-AuditResult-Item"远程桌面配置"-Status"fail"-Result"读取注册表项时出错: $_"-Standard"应修改默认RDP端口"-Solution"检查注册表项或手动设置RDP端口"
}
} else {
Add-AuditResult-Item"远程桌面配置"-Status"fail"-Result"注册表项不存在"-Standard"应修改默认RDP端口"-Solution"检查注册表项是否存在或手动设置RDP端口"
}
}
} catch {
Add-AuditResult-Item"远程桌面配置"-Status"fail"-Result"获取远程桌面服务状态时出错: $_"-Standard"应修改默认RDP端口"-Solution"手动检查远程桌面服务状态"
}
}
# 执行检查
try {
Check-AccountPolicy
Check-AuditPolicy
Check-ServiceConfig
} catch {
Write-Host"执行检查时出错: $_"
}
# 完成报告
try {
Add-Content-Path$reportFile-Value"</table></body></html>"
Write-Host"检查完成,报告已生成至:$reportFile"
} catch {
Write-Host"完成报告时出错: $_"
}
三、脚本特点说明
1. 双平台支持: • 分别针对Linux和Windows系统设计,符合各自系统特性 • 检查项覆盖等级保护三级要求 2. 核心检查项: • Linux版: • 身份鉴别(密码策略、登录失败处理) • 访问控制(特权账户、文件权限) • 安全审计(审计服务、日志留存) • 入侵防范(防火墙配置、SSH安全) • Windows版: • 账户策略(密码复杂度、锁定策略) • 审计策略(日志配置、事件查看) • 安全配置(服务管理、共享设置) • 补丁管理(系统更新状态)
C:\Users\zhh>Set-ExecutionPolicy RemoteSigned
C:\Users\zhh>Get-ExecutionPolicy
C:\Users\zhh>.\windows_security_audit.ps1


往期推荐:👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
欢迎关注公众号:智能运维护航舰,致力于数字政府、智慧城市领域的运维知识和经验分享,专注于自动化、智能化、数字化的运维能力发展,提供各类技术支持服务。
文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




