Board logo

标题: [转载代码] Windows等保三级基线加固和检测的PowerShell脚本 [打印本页]

作者: Batcher    时间: 2023-11-24 11:42     标题: Windows等保三级基线加固和检测的PowerShell脚本

加固.ps1
  1. ## ----------------------------------------- ##
  2. # @Description:  Windows Server 安全配置策略基线加固脚本
  3. ## ----------------------------------------- ##
  4. # 脚本主要功能说明:
  5. # (1) Windows 系统安全策略相关基础配置
  6. # (2) Windows 默认共享关闭、屏保、超时时间以及WSUS补丁更新。
  7. # (3) Windows 等保主机测评项安全加固配置
  8. ## ----------------------------------------- ##
  9. # * 文件输出默认为UTF-8格式
  10. # $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  11.   
  12. <#
  13. .SYNOPSIS
  14. Windows Server 安全配置策略基线加固脚本 (脚本将会在Github上持续更新)
  15. .DESCRIPTION
  16. Windows Server 操作系统配置策略 (符合等保3级的关键检查项)
  17. - 系统账号策略
  18. - 系统事件审核策略
  19. - 系统组策略安全选项策略
  20. - 注册表相关安全策略
  21. - 防火墙服务相关安全策略
  22. - 针对于系统暂无办法通过注册表以及组策略配置的安全加固项
  23. .EXAMPLE
  24. WindowsSecurityReinforce.ps1
  25. .NOTES
  26. #>
  27. # - 系统账号策略 - #
  28. $SysAccountPolicy = @{
  29.   # + 密码最短留存期
  30.   "MinimumPasswordAge" = @{operator="eq";value=1;msg="密码最短留存期"}
  31.   # + 密码最长留存期
  32.   "MaximumPasswordAge" = @{operator="eq";value=90;msg="密码最长留存期"}
  33.   # + 密码长度最小值
  34.   "MinimumPasswordLength" = @{operator="ge";value=14;msg="密码长度最小值"}
  35.   # + 密码必须符合复杂性要求
  36.   "PasswordComplexity" = @{operator="eq";value=1;msg="开启密码符合复杂性要求策略"}
  37.   # + 强制密码历史 N个记住的密码
  38.   "PasswordHistorySize" = @{operator="ge";value=3;msg="强制密码历史N个记住的密码"}
  39.   # + 账户登录失败锁定阈值N次数
  40.   "LockoutBadCount" = @{operator="eq";value=6;msg="账户登录失败锁定阈值次数"}
  41.   # + 账户锁定时间(分钟)
  42.   "ResetLockoutCount" = @{operator="ge";value=15;msg="账户锁定时间(分钟)"}
  43.   # + 复位账户锁定计数器时间(分钟)
  44.   "LockoutDuration" = @{operator="ge";value=15;msg="复位账户锁定计数器时间(分钟)"}
  45.   # + 下次登录必须更改密码
  46.   "RequireLogonToChangePassword" = @{operator="eq";value=0;msg="下次登录必须更改密码"}
  47.   # + 强制过期
  48.   "ForceLogoffWhenHourExpire" = @{operator="eq";value=1;msg="强制过期"}
  49.   # + 当前管理账号登陆名称
  50.   "NewAdministratorName" = @{operator="ne";value='"Admin"';msg="更改当前系统管理账号登陆名称为Admin策略"}
  51.   # + 当前来宾用户登陆名称
  52.   "NewGuestName" = @{operator="ne";value='"Guester"';msg="更改当前系统来宾用户登陆名称为Guester策略"}
  53.   # + 管理员是否被启用
  54.   "EnableAdminAccount" = @{operator="eq";value=1;msg="管理员账户停用与启用策略"}
  55.   # + 来宾用户是否启用
  56.   "EnableGuestAccount" = @{operator="eq";value=0;msg="来宾账户停用与启用策略"}
  57.   # + 指示是否使用可逆加密来存储密码一般禁用(除非应用程序要求超过保护密码信息的需要)
  58.   "ClearTextPassword" = @{operator="eq";value=0;msg="指示是否使用可逆加密来存储密码 (除非应用程序要求超过保护密码信息的需要)"}
  59.   # + 启用时此设置允许匿名用户查询本地LSA策略(0关闭)
  60.   "LSAAnonymousNameLookup" = @{operator="eq";value=0;msg="启用时此设置允许匿名用户查询本地LSA策略 (0关闭)"}
  61. }
  62. # - 系统事件审核策略 - #
  63. $SysEventAuditPolicy  = @{
  64.   # + 审核系统事件(0) [成功(1)、失败(2)] (3)
  65.   AuditSystemEvents = @{operator="eq";value=3;msg="审核系统事件"}
  66.   # + 审核登录事件 成功、失败
  67.   AuditLogonEvents = @{operator="eq";value=3;msg="审核登录事件"}
  68.   # + 审核对象访问 成功、失败
  69.   AuditObjectAccess = @{operator="eq";value=3;msg="审核对象访问"}
  70.   # + 审核特权使用 失败
  71.   AuditPrivilegeUse = @{operator="ge";value=2;msg="审核特权使用"}
  72.   # + 审核策略更改 成功、失败
  73.   AuditPolicyChange = @{operator="eq";value=3;msg="审核策略更改"}
  74.   # + 审核账户管理 成功、失败
  75.   AuditAccountManage = @{operator="eq";value=3;msg="审核账户管理"}
  76.   # + 审核过程追踪 失败
  77.   AuditProcessTracking = @{operator="ge";value=2;msg="审核过程追踪"}
  78.   # + 审核目录服务访问 失败
  79.   AuditDSAccess = @{operator="ge";value=2;msg="审核目录服务访问"}
  80.   # + 审核账户登录事件 成功、失败
  81.   AuditAccountLogon = @{operator="eq";value=3;msg="审核账户登录事件"}
  82. }
  83. # - 系统组策略安全选项策略 - #
  84. $SysSecurityOptionPolicy = @{
  85.   # - 帐户:使用空密码的本地帐户只允许进行控制台登录(启用),注意此设置不影响使用域帐户的登录。(0禁用|1启用)
  86.   LimitBlankPasswordUse = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse=4,1";msg="帐户-使用空密码的本地帐户只允许进行控制台登录(启用)"}
  87.   # - 交互式登录: 不显示上次登录用户名值(启用)
  88.   DontDisplayLastUserName = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayLastUserName=4,1";msg="交互式登录-不显示上次登录用户名值(启用)"}
  89.   # - 交互式登录: 登录时不显示用户名
  90.   DontDisplayUserName = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayUserName=4,1";msg="交互式登录: 登录时不显示用户名"}
  91.   # - 交互式登录: 锁定会话时显示用户信息(不显示任何信息)
  92.   DontDisplayLockedUserId = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayLockedUserId=4,3";msg="交互式登录: 锁定会话时显示用户信息(不显示任何信息)"}
  93.   # - 交互式登录: 无需按 CTRL+ALT+DEL(禁用)
  94.   DisableCAD = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableCAD=4,0";msg="交互式登录-无需按CTRL+ALT+DEL值(禁用)"}
  95.   # - 交互式登录:计算机不活动限制值为600秒或更少
  96.   InactivityTimeoutSecs = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\InactivityTimeoutSecs=4,600";msg="交互式登录-计算机不活动限制值为600秒或更少"}
  97.   # - 交互式登录: 计算机帐户阈值此策略设置确定可导致计算机重启的失败登录尝试次数
  98.   MaxDevicePasswordFailedAttempts = @{operator="le";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\MaxDevicePasswordFailedAttempts=4,10";msg="交互式登录: 此策略设置确定可导致计算机重启的失败登录尝试次数"}
  99.   # - 交互式登录: 试图登录的用户的消息标题
  100.   LegalNoticeCaption = @{operator="eq";value='MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeCaption=1,"安全登陆"';msg="交互式登录: 试图登录的用户的消息标题"}
  101.   # - 交互式登录: 试图登录的用户的消息文本
  102.   LegalNoticeText = @{operator="eq";value='MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeText=7,请谨慎的操作服务器中数据,您所有操作将被记录审计';msg="交互式登录: 试图登录的用户的消息文本"}
  103.    
  104.   # - Microsoft网络客户端: 将未加密的密码发送到第三方 SMB 服务器(禁用)
  105.   EnablePlainTextPassword = @{operator="eq";value="MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnablePlainTextPassword=4,0";msg="Microsoft网络客户端-将未加密的密码发送到第三方 SMB 服务器(禁用)"}
  106.   # - Microsoft网络服务器:暂停会话前所需的空闲时间数量值为15分钟或更少但不为0
  107.   AutoDisconnect = @{operator="15";value="MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\AutoDisconnect=4,15";msg="Microsoft网络服务器-暂停会话前所需的空闲时间数量值为15分钟"}
  108.    
  109.   # - 网络安全: 再下一次改变密码时不存储LAN管理器哈希值(启用)
  110.   NoLMHash = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1";msg="网络安全-在下一次改变密码时不存储LAN管理器哈希值(启用)"}
  111.    
  112.   # - 网络访问: 不允许SAM账户的匿名枚举值为(启用)
  113.   RestrictAnonymousSAM = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM=4,1";msg="网络访问-不允许SAM账户的匿名枚举值为(启用)"}
  114.   # - 网络访问:不允许SAM账户和共享的匿名枚举值为(启用)
  115.   RestrictAnonymous = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymous=4,1";msg="网络访问-不允许SAM账户和共享的匿名枚举值为(启用)"}
  116.    
  117.   # - 关机:设置确定是否可以在无需登录 Windows 的情况下关闭计算机(禁用)
  118.   ClearPageFileAtShutdown = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\ClearPageFileAtShutdown=4,0";msg="关机-设置确定是否可以在无需登录 Windows 的情况下关闭计算机(禁用)"}
  119. }
  120. # - 操作系统组策略用户权限管理策略 - #
  121. $SysUserPrivilegePolicy = @{
  122.   # + 操作系统本地关机策略安全
  123.   SeShutdownPrivilege = @{operator="eq";value='*S-1-5-32-544';msg="操作系统本地关机策略"}
  124.   # + 操作系统远程关机策略安全
  125.   SeRemoteShutdownPrivilege = @{operator="eq";value='*S-1-5-32-544';msg="操作系统远程关机策略"}
  126.   # + 取得文件或其他对象的所有权限策略
  127.   SeProfileSingleProcessPrivilege = @{operator="eq";value='*S-1-5-32-544';msg="取得文件或其他对象的所有权限策略"}
  128.   # + 从网络访问此计算机策略
  129.   SeNetworkLogonRight = @{operator="eq";value='*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551';msg="从网络访问此计算机策略"}
  130. }
  131. # - 注册表相关安全策略  -
  132. $SysRegistryPolicy = @{
  133.   # + 屏幕自动保护程序
  134.   ScreenSaveActive = @{reg="HKEY_CURRENT_USER\Control Panel\Desktop";name="ScreenSaveActive";regtype="String";value=1;operator="eq";msg="开启屏幕自动保护程序策略"}
  135.   # + 屏幕恢复时使用密码保护
  136.   ScreenSaverIsSecure = @{reg="HKEY_CURRENT_USER\Control Panel\Desktop";name="ScreenSaverIsSecure";regtype="String";value=1;operator="eq";msg="开启屏幕恢复时使用密码保护策略"}
  137.   # + 屏幕保护程序启动时间
  138.   ScreenSaveTimeOut = @{reg="HKEY_CURRENT_USER\Control Panel\Desktop";name="ScreenSaveTimeOut";regtype="String";value=600;operator="le";msg="开启屏幕保护程序启动时间策略"}
  139.    
  140.   # + 禁止全部驱动器自动播放
  141.   DisableAutoplay  = @{reg="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer";name="DisableAutoplay";regtype="DWord";operator="eq";value=1;msg="禁止全部驱动器自动播放"}
  142.   NoDriveTypeAutoRun = @{reg="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer";name="NoDriveTypeAutoRun";regtype="DWord";operator="eq";value=255;msg="禁止全部驱动器自动播放"}
  143.    
  144.   # + 限制IPC共享(禁止SAM帐户和共享的匿名枚举)
  145.   restrictanonymous = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa";name="restrictanonymous";regtype="DWord";operator="eq";value=1;msg="不允许SAM账户和共享的匿名枚举值为(启用)"}
  146.   restrictanonymoussam = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa";name="restrictanonymoussam";regtype="DWord";operator="eq";value=1;msg="不允许SAM账户的匿名枚举值为(启用)"}
  147.   # + 禁用磁盘共享(SMB服务)
  148.   SMBDeviceEnabled = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NetBT\Parameters";name="SMBDeviceEnabled";regtype="QWord";operator="eq";value=0;msg="关闭禁用SMB共享服务"}
  149.   AutoShareWks = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters";name="AutoShareWks";regtype="DWord";operator="eq";value=0;msg="关闭禁用默认共享策略-Server2012"}
  150.   AutoShareServer = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters";name="AutoShareServer";regtype="DWord";operator="eq";value=0;msg="关闭禁用默认共享策略-Server2012"}
  151.   # + 系统、应用、安全、PS日志查看器大小(单位字节)设置(此处设置默认的两倍配置-建议一定通过日志采集平台采集系统日志比如ELK)
  152.   EventlogSystemMaxSize = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System";name="MaxSize";regtype="DWord";operator="ge";value=41943040;msg="系统基日志配核查-系统日志查看器大小设置策略"}
  153.   EventlogApplicationMaxSize = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application";name="MaxSize";regtype="DWord";operator="ge";value=41943040;msg="系统日志基配核查-应用日志查看器大小设置策略"}
  154.   EventlogSecurityMaxSize = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security";name="MaxSize";regtype="DWord";operator="ge";value=41943040;msg="系统日志基配核查-安全日志查看器大小设置策略"}
  155.   EventlogPSMaxSize = @{reg="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Windows PowerShell";name="MaxSize";regtype="DWord";operator="ge";value=31457280;msg="系统日志基配核查-PS日志查看器大小设置策略"}
  156.   # + 远程桌面开启与关闭
  157.   fDenyTSConnections = @{reg='HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server';name='fDenyTSConnections';regtype="DWord";operator="eq";value=0;msg="是否禁用远程桌面服务-1则为禁用"}
  158.   UserAuthentication = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp';name='UserAuthentication ';regtype="DWord";operator="eq";value=1;msg="只允许运行带网络级身份验证的远程桌面的计算机连接"}
  159.   RDPTcpPortNumber = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp';name='PortNumber';regtype="DWord";operator="eq";value=39393;msg="远程桌面服务端口RDP-Tcp非3389"}
  160.   TDSTcpPortNumber = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp';name='PortNumber';regtype="DWord";operator="eq";value=39393;msg="远程桌面服务端口TDS-Tcp非3389"}
  161.   # + 防火墙相关操作设置(开启、协议、服务)
  162.   DomainEnableFirewall  = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile';name='EnableFirewall';regtype="DWord";operator="eq";value=1;msg="开启域网络防火墙"}
  163.   StandardEnableFirewall = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\StandardProfile';name='EnableFirewall';regtype="DWord";operator="eq";value=1;msg="开启专用网络防火墙"}
  164.   PPEnableFirewall = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\PublicProfile';name='EnableFirewall';regtype="DWord";operator="eq";value=1;msg="开启公用网络防火墙"}
  165.   # + 源路由欺骗保护
  166.   DisableIPSourceRouting = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters';name='DisableIPSourceRouting';regtype="DWord";operator="eq";value=2;msg="源路由欺骗保护"}
  167.   # + 碎片攻击保护
  168.   EnablePMTUDiscovery = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters';name='EnablePMTUDiscovery';regtype="DWord";operator="eq";value=1;msg="碎片攻击保护"}
  169.   # 【TCP/IP 协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作】
  170.   # + 防SYN洪水攻击:
  171.   # SynAttackProtect = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters';name='EnablePMTUDiscovery';regtype="DWord";operator="eq";value=1;msg="设置防syn洪水攻击"}
  172.   # TcpMaxHalfOpen = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters';name='TcpMaxHalfOpen';regtype="DWord";operator="eq";value=500;msg="允许的最大半开连接数"}
  173.   # TcpMaxHalfOpenRetried = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters';name='TcpMaxHalfOpenRetried';regtype="DWord";operator="eq";value=400;msg="处于至少已发送一次重传的 SYN_RCVD 状态中的TCP连接数"}
  174.   # + 防止DDOS攻击保护
  175.   # EnableICMPRedirect = @{reg='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters';name='EnableICMPRedirect';regtype="DWord";operator="eq";value=0;msg="防止DDOS攻击保护,不启用 ICMP 重定向"}
  176.   # 启用策略组“配置自动更新”
  177.   AUOptions = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU";name="AUOptions";regtype="DWord";operator="eq";value=3;msg="自动下载并计划安装(4)-建议设置3自动下载并通知安装"}
  178.   AutomaticMaintenanceEnabled = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU";name="AutomaticMaintenanceEnabled";regtype="DWord";operator="eq";value=1;msg="启用自动维护"}
  179.   NoAutoUpdate = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU";name="NoAutoUpdate";regtype="DWord";operator="eq";value=0;msg="关闭无自动更新设置"}
  180.   ScheduledInstallDay = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU";name="ScheduledInstallDay";regtype="DWord";operator="eq";value=7;msg="计划安装日期为每周六"}
  181.   ScheduledInstallTime = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU";name="ScheduledInstallTime";regtype="DWord";operator="eq";value=1;msg="计划安装时间为凌晨1点"}
  182.   # 启用策略组(指定Intranet Microsoft更新服务位置)
  183.   UseWUServer = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU";name="UseWUServer";regtype="DWord";operator="eq";value=1;msg="指定Intranet Microsoft更新服务补丁服务器"}
  184.   WUServer = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate";name="WUServer";regtype="String";value="$WUSUServer";operator="eq";msg="设置检测更新的intranet更新服务"}
  185.   WUStatusServer = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate";name="WUStatusServer";regtype="String";value="$WUSUServer";operator="eq";msg="设置Intranet统计服务器"}
  186.   # UpdateServiceUrlAlternate = @{reg="HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate";name="UpdateServiceUrlAlternate";regtype="String";value="http://wsus.weiyigeek.top";operator="eq";msg="设置备用下载服务器"}
  187. }
  188.   
  189.   
  190. ################################################################################################################################
  191. # **********************#
  192. # * 全局公用工具依赖函数  *  
  193. # **********************#
  194. function F_Logging {
  195. <#
  196. .SYNOPSIS
  197. F_Logging 函数全局工具
  198. .DESCRIPTION
  199. 用于输出脚本执行结果并按照不同的日志等级输出显示到客户终端上。
  200. .EXAMPLE
  201. F_Logging -Level [Info|Warning|Error] -Msg "测试输出字符串"
  202. #>
  203.   param (
  204.     [Parameter(Mandatory=$true)]$Msg,
  205.     [ValidateSet("Info","Warning","Error")]$Level
  206.   )
  207.   
  208.   switch ($Level) {
  209.     Info {
  210.       Write-Host "[INFO] ${Msg}" -ForegroundColor Green;
  211.     }
  212.     Warning {
  213.       Write-Host "[WARN] ${Msg}" -ForegroundColor Yellow;
  214.     }
  215.     Error {
  216.       Write-Host "[ERROR] ${Msg}" -ForegroundColor Red;
  217.     }
  218.     Default {
  219.       Write-Host "[*] F_Logging 日志 Level 等级错误`n Useage: F_Logging -Level [Info|Warning|Error] -Msg '测试输出字符串'" -ForegroundColor Red;
  220.     }
  221.   }
  222. }
  223.   
  224.   
  225. Function F_IsCurrentUserAdmin
  226. {
  227. <#
  228. .SYNOPSIS
  229. F_IsCurrentUserAdmin 函数:全局公用工具依赖。
  230. .DESCRIPTION
  231. 判断当前运行的powershell终端是否管理员执行,返回值 true 或者 false
  232. .EXAMPLE
  233. F_IsCurrentUserAdmin
  234. #>
  235.   $user = [Security.Principal.WindowsIdentity]::GetCurrent();
  236.   (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
  237. }
  238.   
  239.   
  240. function F_Detection {
  241. <#
  242. .SYNOPSIS
  243. F_Detection 函数: 全局公用工具依赖。
  244. .DESCRIPTION
  245. 函数用于检测 config.cfg 关键项是否匹配并返回相应的结果,返回值 1 或者 0。
  246. .EXAMPLE
  247. F_Detection -Value $Value -Operator $Operator -DefaultValue $DefaultValue
  248. #>
  249.   param (
  250.     [Parameter(Mandatory=$true)]$Value,
  251.     [Parameter(Mandatory=$true)]$Operator,
  252.     [Parameter(Mandatory=$true)]$DefaultValue  
  253.   )
  254.   if ( $Operator -eq "eq" ) {
  255.     if ( $Value -eq "$DefaultValue" ) {return 1;} else { return 0;}
  256.   } elseif ($Operator -eq  "ne" ) {
  257.     if ( $Value -ne $DefaultValue ) {return 1;} else { return 0;}
  258.   } elseif ($Operator -eq  "le") {
  259.     if ( $Value -le $DefaultValue ) {return 1;} else { return 0;}
  260.   } elseif ($Operator -eq "ge") {
  261.     if ( $Value -ge $DefaultValue ) {return 1;} else { return 0;}
  262.   }
  263. }
  264.   
  265.   
  266. function F_GetRegPropertyValue {
  267. <#
  268. .SYNOPSIS
  269. F_GetRegPropertyValue 函数: 全局公用工具依赖函数。
  270. .DESCRIPTION
  271. 函数用于获取指定键与值并与预定义的进行对比,正常返回结果为1或者0,如果键不存在则返回NotExist。
  272. .EXAMPLE
  273. An example
  274. #>
  275.   param (
  276.     [Parameter(Mandatory=$true)][String]$Key,
  277.     [Parameter(Mandatory=$true)][String]$Name,
  278.     [Parameter(Mandatory=$true)][String]$Operator,
  279.     [Parameter(Mandatory=$true)]$DefaultValue
  280.   )
  281.   
  282.   try {
  283.     $Value = Get-ItemPropertyValue -Path "Registry::$Key" -Name $Name -ErrorAction Ignore -WarningAction Ignore
  284.     $Result = F_Detection -Value $Value -Operator $Operator -DefaultValue $DefaultValue
  285.     return $Result
  286.   } catch {
  287.     F_Logging -Level Warning -Msg "[*] $Key - $Name - NotExist"
  288.     return 'NotExist'
  289.   }
  290. }
  291.   
  292.   
  293.   
  294. function F_SeceditReinforce() {
  295. <#
  296. .SYNOPSIS
  297. F_SeceditReinforce 函数:实现系统策略组配置项对比和修改。
  298. .DESCRIPTION
  299. 针对 config.cfg 安全配置项进行检测并修改,主要涉及系统账号策略设置、系统事件审核策略设置、系统组策略安全选项配置、操作系统组用户权限管理策略配置
  300. .EXAMPLE
  301. F_SeceditReinforce
  302. #>
  303.   # - 系统账号策略设置
  304.   $Hash = $SysAccountPolicy.Clone()
  305.   foreach ( $Name in $Hash.keys ) {
  306.     $Flag = $Config | Select-String -AllMatches -Pattern "^$($Name.toString())"
  307.     if ($Flag) {
  308.       F_Logging -Level Info -Msg "[*] Update - $Name"
  309.       $Line = $Flag -split " = "
  310.       $Result = F_Detection -Value $Line[1] -Operator $SysAccountPolicy["$($Line[0])"].operator -DefaultValue $SysAccountPolicy["$($Line[0])"].value
  311.       $NewLine = $Line[0] + " = " + $SysAccountPolicy["$($Line[0])"].value
  312.       # - 在不匹配时进行关键项替换配置
  313.       if ( -not($Result) -or $Line[0] -eq "NewGuestName" -or $Line[0] -eq "NewAdministratorName" ) {
  314.           write-host "    $Flag -->> $NewLine"
  315.         # 此处采用正则进行匹配系统账号策略相关项,防止后续
  316.         $SecConfig = $SecConfig -replace "$Flag", "$NewLine"
  317.       }
  318.     } else {
  319.       F_Logging -Level Info -Msg "[+] Insert - $Name"
  320.       $NewLine = $Name + " = " + $SysAccountPolicy["$Name"].value
  321.       Write-Host "    $NewLine "
  322.       # - 在不存在该配置项时进行插入
  323.       $SecConfig = $SecConfig -replace "\[System Access\]", "[System Access]`n$NewLine"
  324.     }
  325.   }
  326.   # - 系统事件审核策略设置
  327.   $Hash = $SysEventAuditPolicy.Clone()
  328.   foreach ( $Name in $Hash.keys ) {
  329.     $Flag = $Config | Select-String $Name.toString()
  330.     if ($Flag) {
  331.       F_Logging -Level Info -Msg "[*] Update - $Name"
  332.       $Line = $Flag -split " = "
  333.       $Result = F_Detection -Value $Line[1] -Operator $SysEventAuditPolicy["$($Line[0])"].operator -DefaultValue $SysEventAuditPolicy["$($Line[0])"].value
  334.       $NewLine = $Line[0] + " = " + $SysEventAuditPolicy["$($Line[0])"].value
  335.       # - 在不匹配时进行关键项替换配置
  336.       if (-not($Result)) {
  337.         $SecConfig = $SecConfig -replace "$Flag", "$NewLine"
  338.       }
  339.     } else {
  340.       F_Logging -Level Info -Msg "[+] Insert - $Name"
  341.       $NewLine = $Name + " = " + $SysEventAuditPolicy["$Name"].value
  342.       Write-Host "  $NewLine"
  343.       # - 在不存在该配置项时进行插入
  344.       $SecConfig = $SecConfig -replace "\[Event Audit\]", "[Event Audit] `n$NewLine"
  345.     }
  346.   }
  347.   # - 系统组策略安全选项配置 - #
  348.   $Hash = $SysSecurityOptionPolicy.Clone()
  349.   foreach ( $Name in $Hash.keys ) {
  350.     $Flag = $Config | Select-String $Name.toString()
  351.     if ($Flag) {
  352.       F_Logging -Level Info -Msg "[*] Update - $Name"
  353.       # 源字符串
  354.       $Line = $Flag -split "="
  355.       # 目标字符串
  356.       $Value = $SysSecurityOptionPolicy["$($Name)"].value -split "="
  357.       $Result = F_Detection -Value $Line[1] -Operator $SysSecurityOptionPolicy["$($Name)"].operator -DefaultValue $Value[1]
  358.       $NewLine = $Line[0] + "=" + $Value[1]
  359.       if (-not($Result)) {
  360.         $SecConfig = $SecConfig -Replace ([Regex]::Escape("$Flag")),"$NewLine"
  361.       }
  362.     } else {
  363.       F_Logging -Level Info -Msg "[+] Insert - $Name"
  364.       $NewLine = $SysSecurityOptionPolicy["$Name"].value
  365.       Write-Host "   $NewLine"
  366.       # 不采用正则匹配原字符串(值得学习)
  367.       $SecConfig = $SecConfig -Replace ([Regex]::Escape("[Registry Values]")),"[Registry Values]`n$NewLine"
  368.     }
  369.   }
  370.   # - 操作系统组用户权限管理策略配置
  371.   $Hash = $SysUserPrivilegePolicy.Clone()
  372.   foreach ( $Name in $Hash.keys ) {
  373.     $Flag = $Config | Select-String $Name.toString()
  374.     if ($Flag) {
  375.       F_Logging -Level Info -Msg "[*] Update - $Name"
  376.       $Line = $Flag -split " = "
  377.       $Result = F_Detection -Value $Line[1] -Operator $SysUserPrivilegePolicy["$($Line[0])"].operator -DefaultValue $SysUserPrivilegePolicy["$($Line[0])"].value
  378.       $NewLine = $Line[0] + " = " + $SysUserPrivilegePolicy["$($Line[0])"].value
  379.       if (-not($Result)) {
  380.         $SecConfig = $SecConfig -Replace ([Regex]::Escape("$Flag")), "$NewLine"
  381.       }
  382.     } else {
  383.       F_Logging -Level Info -Msg "[+] Insert - $Name"
  384.       $NewLine = $Name + " = " + $SysUserPrivilegePolicy["$Name"].value
  385.       Write-Host "    $NewLine"
  386.       $SecConfig = $SecConfig -Replace ([Regex]::Escape("[Privilege Rights]")),"[Privilege Rights]`n$NewLine"
  387.     }
  388.   }
  389.    # 将生成的本地安全组策略配置输到`secconfig.cfg`,【坑】非常注意文件编码格式为UTF16-LE,此时需要添加-Encoding参数并指定为string
  390.    $SecConfig | Out-File secconfig.cfg -Encoding string
  391. }
  392.   
  393.   
  394. function F_SysRegistryReinforce()  {
  395. <#
  396. .SYNOPSIS
  397. F_SysRegistryReinforce 函数针对于注册表中系统相关配置。
  398. .DESCRIPTION
  399. 针对操作系统注册表安全配置项与SysRegistryPolicy哈希表的键值进行检测与设置。
  400. .EXAMPLE
  401. F_SysRegistryReinforce
  402. #>
  403.   # - 满足等级保护相关基础配置
  404.   $Hash = $SysRegistryPolicy.Clone()
  405.   foreach ( $Name in $Hash.keys ) {
  406.     $Result = F_GetRegPropertyValue -Key $SysRegistryPolicy.$Name.reg -Name $SysRegistryPolicy.$Name.name -Operator $SysRegistryPolicy.$Name.operator -DefaultValue $SysRegistryPolicy.$Name.value
  407.     F_Logging -Level Info -Msg "Get-ItemProperty -Path Registry::$($SysRegistryPolicy.$Name.reg)"
  408.     if ( $Result -eq 'NotExist' ){
  409.       # - 判断注册表项是否存在不存在则创建
  410.       if (-not(Test-Path -Path "Registry::$($SysRegistryPolicy.$Name.reg)")){
  411.         F_Logging -Level Info -Msg "正在创建 $($SysRegistryPolicy.$Name.reg) 注册表项......"
  412.         New-Item -Path "registry::$($SysRegistryPolicy.$Name.reg)" -Force
  413.       }
  414.       # - 可能的枚举值包括"String、ExpandString、Binary、DWord、MultiString、QWord、Unknown"
  415.       New-ItemProperty -Path "Registry::$($SysRegistryPolicy.$Name.reg)" -Name $SysRegistryPolicy.$Name.name -PropertyType $SysRegistryPolicy.$Name.regtype -Value $SysRegistryPolicy.$Name.value
  416.     } elseif ( $Result -eq 0 ) {
  417.       Set-ItemProperty -Path "Registry::$($SysRegistryPolicy.$Name.reg)" -Name $SysRegistryPolicy.$Name.name -Value $SysRegistryPolicy.$Name.value
  418.     }
  419.   }
  420. }
  421.   
  422.   
  423. function F_ServiceManager() {
  424. <#
  425. .SYNOPSIS
  426. F_ServiceManager 函数:针对于系统中相关服务管理操作
  427. .DESCRIPTION
  428. 主要对系统中某些服务进行停止禁用
  429. .EXAMPLE
  430. F_ServiceManager -Name server -Operator restart -StartType Automatic
  431. #>
  432.   param (
  433.     [Parameter(Mandatory=$true)]$Name,
  434.     [ValidateSet("Start","Stop","Restart")]$Operator,
  435.     [ValidateSet("Automatic","Manual","Disabled","Boot","System")]$StartType
  436.   )
  437.   # - 验证服务是否存在
  438.   F_Logging -Level Info -Msg "正在对 $Name 服务进行操作管理......."
  439.   $ServiceStatus = (Get-Service $Name -ErrorAction SilentlyContinue).Status
  440.   if( -not($ServiceStatus.Length) ) {
  441.     F_Logging -Level Error -Msg "$Name Service is not exsit with current system!!!!!!"
  442.     return
  443.   }
  444.   # - 根据$Operator操作服务启动、停止、重启
  445.   switch ($Operator) {
  446.     Start {
  447.       if ( "$ServiceStatus" -eq "Stopped" ) {
  448.         F_Logging -Level Info -Msg "正在启动 $Name 服务";Start-Service -Name $Name -Force
  449.       }
  450.     }
  451.     Stop {
  452.       if ( "$ServiceStatus" -eq "Running" ) {
  453.         F_Logging -Level Warning -Msg "正在停止 $Name 服务";Stop-Service -Name $Name -Force
  454.       }
  455.     }
  456.     Restart {
  457.       F_Logging -Level Warning -Msg "正在重启 $Name 服务";Restart-Service -Name $Name -Force
  458.     }
  459.     Default { F_Logging -Level Info -Msg "未对 $Name 服务做任何操作!" }
  460.   }
  461.    
  462.   # - 根据$StartType设置服务启动类型
  463.   switch ($StartType) {
  464.     Automatic { Set-Service -Name $Name -StartupType Automatic}
  465.     Manual { Set-Service -Name $Name -StartupType Manual }
  466.     Disabled { Set-Service -Name $Name -StartupType Disabled}
  467.     Boot { Set-Service -Name $Name -StartupType Boot}
  468.     System {Set-Service -Name $Name -StartupType System }
  469.     Default {F_Logging -Level Info -Msg "未对 $Name 服务做任何自启配置操作!"}
  470.   }
  471. }
  472.   
  473.   
  474.   
  475. Function F_ExtentionReinforce() {
  476. <#
  477. .SYNOPSIS
  478. F_ExtentionReinforce 函数:针对于系统暂无办法通过注册表以及组策略配置的将在此处执行。
  479. .DESCRIPTION
  480. 执行系统加固的相关命令,其中保护PowerShell或者cmd相关命令
  481. .EXAMPLE
  482. F_ExtentionReinforce
  483. #>
  484.   # 135 -> dcomcnfg -> 组件服务 -> 我的电脑 -> 属性 -> {默认属性,取消启动分布式COM;默认协议,删除面向连接的TCP/IP}
  485.   # HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\EnableDCOM的值改为“N”
  486.   # HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc\ClientProtocols 中删除“ncacn_ip_tcp”
  487.   # 139 -> 网络连接 -> 以太网属性 -> TCP/IPV4属性 -> 高级 -> Wins -> {取消启用LMHOSTS、禁用TCP/IP上的NETBIOS}
  488.   # [+] 禁用共享服务以及删除当前主机中所有共享,即关闭监听445端口
  489.   F_ServiceManager -Name Spooler -Operator Stop -StartType Disabled             # Print Spooler: 该服务在后台执行打印作业并处理与打印机的交互。
  490.   F_ServiceManager -Name LanmanWorkstation -Operator Stop -StartType Disabled   # Workstation: 使用 SMB 协议创建并维护客户端网络与远程服务器之间的连接。
  491.   F_ServiceManager -Name LanmanServer -Operator Stop -StartType Disabled        # Server: 支持此计算机通过网络的文件、打印、和命名管道共享。
  492.   (gwmi -class win32_share).delete()                                            # 其它方式 (Get-WmiObject -class win32_share).delete()
  493.   # [+] 禁用网络发现服务 Function Discovery Resource Publication ,即关闭监听5357端口
  494.   F_ServiceManager -Name FDResPub -Operator Stop -StartType Disabled
  495.   # [+] 禁用Windows远程管理(WinRM)服务 Windows Remote Management (WS-Management) ,即关闭监听5985端口 (注意在安装某些软件时需要启动该服务)
  496.   F_ServiceManager -Name WinRM -Operator Stop -StartType Manual
  497.   # [+] 启用操作系统时间同步
  498.   # F_ServiceManager -Name w32tm -Operator Start -StartType Automatic             # Windows Time 维护在网络上的所有客户端和服务器的时间和日期同步
  499. #  w32tm /config /syncfromflags:MANUAL /manualpeerlist:"192.168.12.254,0x08 192.168.10.254,0x08" /update
  500.    #w32tm /resync /rediscover
  501.    #w32tm /query /peers
  502.   # [+] 启用&关闭windows防火墙
  503.   # 关闭防火墙netsh advfirewall set allprofiles state off
  504.   #netsh advfirewall set allprofiles state on
  505.   # [+] 系统服务防火墙相关规则设置
  506.   # 启用、或者禁用文件和打印机共享(回显请求 - ICMPv4-In) 根据需求而定
  507.   # Enable-NetFirewallRule -Name FPS-ICMP4-ERQ-In
  508.   Disable-NetFirewallRule  -Name FPS-ICMP4-ERQ-In
  509.   Get-NetFirewallRule -Name "CustomSecurity-Remote-Desktop-Port" -ErrorAction SilentlyContinue
  510.   if (-not($?)) {
  511.     # 允许其它主机访问 Remote-Desktop-Port 的39393端口。
  512.     New-NetFirewallRule -Name "CustomSecurity-Remote-Desktop-Port" -DisplayName "CustomSecurity-Remote-Desktop-Port" -Description "CustomSecurity-Remote-Desktop-Port" -Direction Inbound -LocalPort 39393 -Protocol TCP -Action Allow -Enabled True
  513.     New-NetFirewallRule -Name "CustomSecurity-Port" -DisplayName "CustomSecurity-Port" -Description "CustomSecurity-135-137-138-139-Port" -Direction Inbound -LocalPort 135,137,138,139 -Protocol TCP -Action Block -Enabled True
  514.   }
  515. }
  516.   
  517.   
  518. function Main {
  519. <#
  520. .SYNOPSIS
  521. main 函数程序执行入口
  522. .DESCRIPTION
  523. 调用上述编写的相关检测加固函数
  524. .EXAMPLE
  525. main
  526. #>
  527.   
  528. F_Logging -Level Info -Msg "#################################################################################"
  529. F_Logging -Level Info -Msg "- @Desc: Windows Server 安全配置策略基线加固脚本"
  530. F_Logging -Level Info -Msg "#################################################################################`n"
  531. $StartTime = Get-date -Format 'yyyy-M-d H:m:s'
  532. # 1.当前系统策略配置文件导出 (注意必须系统管理员权限运行)
  533. F_Logging -Level Info -Msg "- 正在检测当前运行的PowerShell终端是否管理员权限...`n"
  534. $flag = F_IsCurrentUserAdmin
  535. if (!($flag)) {
  536.   F_Logging -Level Error -Msg "- 脚本执行发生错误,请使用管理员权限运行该脚本..例如: Start-Process powershell -Verb runAs....`n"
  537.   F_Logging -Level Warning -Msg "- 正在退出执行该脚本......`n"
  538.   return
  539. }
  540. # 2.导出当前系统策略配置文件后验证文件是否存在以及原始配置文件备份。
  541. secedit /export /cfg config.cfg /quiet
  542. start-sleep 3
  543. if ( -not(Test-Path -Path config.cfg) ) {
  544.   F_Logging -Level Error -Msg "- 当前系统策略配置文件 config.cfg 不存在,请检查......"
  545.   F_Logging -Level Warning -Msg "- 正在退出执行该脚本......"
  546.   return
  547. } else {
  548.   Copy-Item -Path config.cfg -Destination config.cfg.bak -Force
  549. }
  550. $Config = Get-Content -path config.cfg
  551. $SecConfig = $Config.Clone()
  552.   
  553. # 6.系统扩展相关配置安全加固 (防止防火墙设置不生效)
  554. F_ExtentionReinforce
  555. # 3.进行系统策略配置安全加固
  556. F_SeceditReinforce
  557. # 4.当系统策略配置安全加固完成后将生成的secconfig.cfg导入进系统策略中。
  558. secedit /configure /db secconfig.sdb /cfg secconfig.cfg
  559. # 5.进行系统注册表相关配置安全加固
  560. F_SysRegistryReinforce
  561. # 7.程序执行完毕
  562. $EndTime = Get-date -Format 'yyyy-M-d H:m:s'
  563. F_Logging -Level Info -Msg "- 该操作系统安全测评已完毕......`n开始时间:${StartTime}`n完成时间: ${EndTime}"
  564. }
  565.   
  566. Main
复制代码
原文:https://www.52pojie.cn/thread-1789573-1-1.html
作者: Batcher    时间: 2023-11-24 11:44

检测.ps1
  1. #######################################################
  2. # @Description:  Windows Server安全配置策略基线检测脚本
  3. # @Version: 1.0
  4. #######################################################
  5. <#
  6. .SYNOPSIS
  7. Windows Server 安全配置策略基线检测脚本
  8. .DESCRIPTION
  9. Windows Server 操作系统配置策略核查
  10. .EXAMPLE
  11. WindowsSecurityBaseLine.ps1 -Executor WeiyiGeek -MsrcUpdate False
  12. - Executor : 脚本执行者
  13. - MsrcUpdate : 是否在线拉取微软安全中心的服务器安全补丁列表信息(建议一台主机拉取好之后将WSUSList.json和WSUSListId.json拷贝到当前脚本同级目录下)
  14. .NOTES
  15. 注意:不同的版本操作系统以下某些关键项可能会不存在会有一些警告。
  16. #>
  17. #设置PowerShell执行脚本
  18. #Set-ExecutionPolicy
  19. # * 文件输出默认为UTF-8格式
  20. $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  21. $ip = (ipconfig|select-string "IPV4"|out-string).split(":")[1].split("I")[0].Trim(" ").Trim(".-`t`n`r")
  22. $houzhui = ".log"
  23. $file_name = $ip + $houzhui
  24. echo "$file_name"
  25. ################################################################################################################################
  26. # **********************#
  27. # * 全局公用工具依赖函数  *  
  28. # **********************#
  29. Function F_IsCurrentUserAdmin
  30. {
  31. <#
  32. .SYNOPSIS
  33. F_IsCurrentUserAdmin 函数:全局公用工具依赖。
  34. .DESCRIPTION
  35. 判断当前运行的powershell终端是否管理员执行,返回值 true 或者 false
  36. .EXAMPLE
  37. F_IsCurrentUserAdmin
  38. #>
  39.   $user = [Security.Principal.WindowsIdentity]::GetCurrent();
  40.   (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
  41. }
  42. function F_Logging {
  43. <#
  44. .SYNOPSIS
  45. F_Logging 日志输出函数
  46. .DESCRIPTION
  47. 用于输出脚本执行结果并按照不同的日志等级输出显示到客户终端上。
  48. .EXAMPLE
  49. F_Logging -Level [Info|Warning|Error] -Msg "测试输出字符串"
  50. #>
  51.   param (
  52.     [Parameter(Mandatory=$true)]$Msg,
  53.     [ValidateSet("Info","Warning","Error")]$Level
  54.   )
  55.   switch ($Level) {
  56.     Info {
  57.       Write-Host "[INFO] ${Msg}" -ForegroundColor Green;
  58.     }
  59.     Warning {
  60.       Write-Host "[WARN] ${Msg}" -ForegroundColor Yellow;
  61.     }
  62.     Error {
  63.       Write-Host "[ERROR] ${Msg}" -ForegroundColor Red;
  64.     }
  65.     Default {
  66.       Write-Host "[*] F_Logging 日志 Level 等级错误`n Useage: F_Logging -Level [Info|Warning|Error] -Msg '测试输出字符串'" -ForegroundColor Red;
  67.     }
  68.   }
  69. }
  70. function F_Tools {
  71. <#
  72. .SYNOPSIS
  73. F_Tools 检测对比函数
  74. .DESCRIPTION
  75. 验证判断传入的字段是否与安全加固字段一致
  76. .EXAMPLE
  77. F_Tools -Key "ItemDemo" -Value "2" -Operator "eq" -DefaultValue "1"  -Msg "对比ItemDemo字段值与预设值"
  78. #>
  79.   param (
  80.     [Parameter(Mandatory=$true)][String]$Key,
  81.     [Parameter(Mandatory=$true)]$Value,
  82.     [Parameter(Mandatory=$true)]$DefaultValue,
  83.     [String]$Msg,
  84.     [String]$Operator
  85.   )
  86.    
  87.   if ( $Operator -eq  "eq" ) {
  88.     if ( $Value -eq $DefaultValue ) {
  89.       $Result = @{"$($Key)"="[合格项]|$($Value)|$($DefaultValue)|$($Msg)-【符合】等级保护标准."}
  90.       Write-Host "$($Key)"=" [合格项]|$($Value)|$($DefaultValue)|$($Msg)-【符合】等级保护标准." -ForegroundColor White
  91.       return $Result
  92.     } else {
  93.       $Result = @{"$($Key)"="[异常项]|$($Value)|$($DefaultValue)|$($Msg)-【不符合】等级保护标准."}
  94.       Write-Host "$($Key)"=" [异常项]|$($Value)|$($DefaultValue)|$($Msg)-【不符合】等级保护标准." -ForegroundColor red
  95.       return $Result
  96.     }
  97.   } elseif ($Operator -eq  "ne" ) {
  98.     if ( $Value -ne $DefaultValue ) {
  99.       $Result = @{"$($Key)"="[合格项]|$($Value)|$($DefaultValue)|$($Msg)-【符合】等级保护标准."}
  100.       Write-Host "$($Key)"=" [合格项]|$($Value)|$($DefaultValue)|$($Msg)-【符合】等级保护标准." -ForegroundColor White
  101.       return $Result
  102.     } else {
  103.       $Result = @{"$($Key)"="[异常项]|$($Value)|$($DefaultValue)|$($Msg)-【不符合】等级保护标准."}
  104.       Write-Host "$($Key)"=" [异常项]|$($Value)|$($DefaultValue)|$($Msg)-【不符合】等级保护标准." -ForegroundColor red
  105.       return $Result
  106.     }
  107.   } elseif ($Operator -eq  "le") {
  108.     if ( $Value -le $DefaultValue ) {
  109.       $Result = @{"$($Key)"="[合格项]|$($Value)|$($DefaultValue)|$($Msg)-【符合】等级保护标准."}
  110.       Write-Host "$($Key)"=" [合格项]|$($Value)|$($DefaultValue)|$($Msg)-【符合】等级保护标准." -ForegroundColor White
  111.       return $Result
  112.     } else {
  113.       $Result = @{"$($Key)"="[异常项]|$($Value)|$($DefaultValue)|$($Msg)-【不符合】等级保护标准."}
  114.       Write-Host "$($Key)"=" [异常项]|$($Value)|$($DefaultValue)|$($Msg)-【不符合】等级保护标准." -ForegroundColor red
  115.       return $Result
  116.     }
  117.   } elseif ($Operator -eq "ge") {
  118.     if ( $Value -ge $DefaultValue ) {
  119.       $Result =  @{"$($Key)"="[合格项]|$($Value)|$($DefaultValue)|$($Msg)-【符合】等级保护标准."}
  120.       Write-Host "$($Key)"=" [合格项]|$($Value)|$($DefaultValue)|$($Msg)-【符合】等级保护标准." -ForegroundColor White
  121.       return $Result
  122.     } else {
  123.       $Result = @{"$($Key)"="[异常项]|$($Value)|$($DefaultValue)|$($Msg)-【不符合】等级保护标准."}
  124.       Write-Host "$($Key)"=" [异常项]|$($Value)|$($DefaultValue)|$($Msg)-【不符合】等级保护标准." -ForegroundColor red
  125.       return $Result
  126.     }
  127.   }
  128. }
  129. function F_GetRegPropertyValue {
  130.   param (
  131.     [Parameter(Mandatory=$true)][String]$Key,
  132.     [Parameter(Mandatory=$true)][String]$Name,
  133.     [Parameter(Mandatory=$true)][String]$Operator,
  134.     [Parameter(Mandatory=$true)]$DefaultValue,
  135.     [Parameter(Mandatory=$true)][String]$Msg
  136.   )
  137.   try {
  138.     $Value = Get-ItemPropertyValue -Path "Registry::$Key" -ErrorAction Ignore -WarningAction Ignore -Name $Name
  139.     $Result = F_Tools -Key "Registry::$($Name)" -Value $Value -Operator $Operator -DefaultValue $DefaultValue  -Msg $Msg
  140.     return $Result
  141.   } catch {
  142.    $Result = @{"Registry::$($Name)"="[异常项]|$($Key)中$($Name)不存在该项|$($DefaultValue)|$($Msg)"}
  143.    Write-Host $Result.Values -ForegroundColor Red
  144.    return $Result
  145.   }
  146. }
  147. Function F_UrlRequest {
  148.   param (
  149.     [Parameter(Mandatory=$true)][String]$Msrc_api
  150.   )
  151.   Write-Host "[-] $($Msrc_api)" -ForegroundColor Gray
  152.   $Response=Invoke-WebRequest -Uri "$($Msrc_api)"
  153.   Return ConvertFrom-Json -InputObject $Response
  154. }
  155. ################################################################################################################################
  156. #
  157. # * 操作系统基础信息记录函数 * #
  158. #
  159. # - 系统信息记录函数 - #
  160. $SysInfo = @{}
  161. # - Get-Computer 命令使用
  162. # Tips :在 Server 2019 以及 Windows 10 以下系统无该命令
  163. # $Item = 'WindowsProductName','WindowsEditionId','WindowsInstallationType','WindowsCurrentVersion','WindowsVersion','WindowsProductId','BiosManufacturer','BiosFirmwareType','BiosName','BiosVersion','BiosBIOSVersion','BiosSeralNumber','CsBootupState','OsBootDevice','BiosReleaseDate','CsName','CsAdminPasswordStatus','CsManufacturer','CsModel','OsName','OsType','OsProductType','OsServerLevel','OsArchitecture','CsSystemType','OsOperatingSystemSKU','OsVersion','OsBuildNumber','OsSerialNumber','OsInstallDate','OsSystemDevice','OsSystemDirectory','OsCountryCode','OsCodeSet','OsLocaleID','OsCurrentTimeZone','TimeZone','OsLanguage','OsLocalDateTime','OsLastBootUpTime','CsProcessors','OsBuildType','CsNumberOfProcessors','CsNumberOfLogicalProcessors','OsMaxNumberOfProcesses','OsTotalVisibleMemorySize','OsFreePhysicalMemory','OsTotalVirtualMemorySize','OsFreeVirtualMemory','OsInUseVirtualMemory','OsMaxProcessMemorySize','CsNetworkAdapters','OsHotFixes'
  164. # - Systeminfo 命令使用(通用-推荐)
  165. $Item = 'Hostname','OSName','OSVersion','OSManufacturer','OSConfiguration','OS Build Type','RegisteredOwner','RegisteredOrganization','Product ID','Original Install Date','System Boot Time','System Manufacturer','System Model','System Type','Processor(s)','BIOS Version','Windows Directory','System Directory','Boot Device','System Locale','Input Locale','Time Zone','Total Physical Memory','Available Physical Memory','Virtual Memory: Max Size','Virtual Memory: Available','Virtual Memory: In Use','Page File Location(s)','Domain','Logon Server','Hotfix(s)','Network Card(s)'
  166. Function F_SysInfo {
  167.   # - 当前系统及计算机相关信息 (Primary)
  168.   # Server 2019 以及 Windows 10 适用
  169.   # $Computer = Get-ComputerInfo
  170.   $Computer = systeminfo.exe /FO CSV /S $env:COMPUTERNAME |Select-Object -Skip 1 | ConvertFrom-CSV -Header $Item
  171.   foreach( $key in $Item) {
  172.     $SysInfo += @{"$($key)"=$Computer.$key}
  173.   }
  174.   # - 通用设置针对采用`systeminfo.exe`命令方式
  175.   $SysInfo += @{"WindowsProductName"="$($SysInfo.OSName)"}
  176.   $SysInfo.OsVersion=($Sysinfo.OSVersion -split " ")[0]
  177.   $SysInfo += @{"CsSystemType"=($Sysinfo."System Type" -split " ")[0]}
  178.   # - 当前系统 PowerShell 版本信息以及是否为虚拟机
  179.   $SysInfo += @{"PSVersion"=$PSVersionTable.PSEdition+"-"+$PSVersionTable.PSVersion}
  180.   # - 验证当前计算机产品及其版本 (Primary)
  181.   $Flag = $SysInfo.WindowsProductName -match  "Windows 8.1|Windows 10|Server 2008|Server 2012|Server 2016|Server 2019"
  182.   $ProductName = "$($Matches.Values)"
  183.   if ( $ProductName.Contains("Windows")) {
  184.     $SysInfo += @{"ProductType"="Client"}
  185.     $SysInfo += @{"ProductName"=$ProductName}
  186.     $SysInfo += @{"WindowsVersion"=Get-ItemPropertyValue -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name ReleaseId}
  187.   } else {
  188.     $SysInfo += @{"ProductType"="Server"}
  189.     $SysInfo += @{"ProductName"=$ProductName}
  190.   }
  191.   # - 验证当前计算机产品是是物理机还是虚拟机 (Primary)
  192.   $ComputerType = get-wmiobject win32_computersystem
  193.   if ($ComputerType.Manufacturer -match "VMware"){
  194.     $SysInfo += @{"ComputerType"="虚拟机 - $($ComputerType.Model)"}
  195.   } else {
  196.     $SysInfo += @{"ComputerType"="物理机 - $($ComputerType.Model)"}
  197.   }
  198.    
  199.   # # - 当前计算机温度值信息记录 (WINDOWSERVER2019支持)
  200.   # Get-CimInstance -Namespace ROOT/WMI -Class MSAcpi_ThermalZoneTemperature | % {
  201.   #   $currentTempKelvin = $_.CurrentTemperature / 10
  202.   #   $currentTempCelsius = $currentTempKelvin - 273.15
  203.   #   $currentTempFahrenheit = (9/5) * $currentTempCelsius + 32
  204.   #   $Temperature += "InstanceName: " + $_.InstanceName+ " ==>> " +  $currentTempCelsius.ToString() + " 摄氏度(C);  " + $currentTempFahrenheit.ToString() + " 华氏度(F) ; " + $currentTempKelvin + "开氏度(K) `n"
  205.   # }
  206.   # $SysInfo += @{"Temperature"=$Temperature}
  207.   return $SysInfo
  208. }
  209. #
  210. # * - 计算机Mac及IP地址信息函数 * #
  211. #
  212. #  * 系统网络及适配器信息变量 * #
  213. #$SysNetAdapter = @{}
  214. #function F_SysNetAdapter {
  215.   # - 计算机中已启用的网卡、Mac及IP地址信息
  216. # $Adapter = Get-NetAdapter | Where-Object {$_.Status -eq "Up"} | Sort-Object -Property LinkSpeed
  217. #  foreach ( $Item in $Adapter) {
  218. #    $IPAddress = (Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $Item.ifIndex).IPAddress
  219. #    $SysNetAdapter += @{"$($Item.MacAddress)"="$($Item.Status) | $($Item.Name) | $($IPAddress) | $($Item.LinkSpeed) | $($Item.InterfaceDescription)"}
  220. #  }
  221. #  return $SysNetAdapter
  222. #}
  223. #
  224. # * - 计算机系统磁盘与空间剩余查询函数 * #
  225. #
  226. # - 系统磁盘与空间剩余信息 - #
  227. #$SysDisk = @{}
  228. #function F_SysDisk {
  229.   # - 计算机磁盘信息
  230. #  $Disk = Get-Disk
  231. #  foreach ( $Item in $Disk) {
  232. #    $SysDisk += @{"$($Item.SerialNumber)"="$($Item.Number) | $($Item.FriendlyName) | $($Item.HealthStatus)| $($Item.Size / [math]::Pow(1024,3)) GB | $($Item.PartitionStyle) |$($Item.OperationalStatus)"}
  233. #  }
  234. #  $Drive = Get-PSDrive -PSProvider FileSystem | Sort-Object -Property Name
  235. #  $Drive | % {
  236. #    $Free = [Math]::Round( $_.Free / [math]::pow(1024,3),2 )
  237. #    $Used = [Math]::Round( $_.Used / [math]::pow(1024,3),2 )
  238. #    $Total = [Math]::Ceiling($Free + $Used)
  239. #    $SysDisk += @{"FileSystem::$($_.Name)"="$($_.Name) | Free: $($Free) GB | Used: $($Used) GB | Total: $($Total) GB"}
  240. #  }
  241. #  return $SysDisk
  242. #}
  243. #
  244. # * 系统账号检查函数  * #
  245. #
  246. # - 系统账户信息变量 - #
  247. $SysAccount = @{}
  248. Function F_SysAccount {
  249.   # - 账户检查
  250.   $Account = Get-WmiObject -Class Win32_UserAccount | Select-Object Name,AccountType,Caption,SID
  251.   Write-Host "* 当前系统存在的 $($Account.Length) 名账户 : $($Account.Name)" -ForegroundColor Green
  252.   if($Account.Length -ge 4 -and ($Account.sid  | Select-String -Pattern "^((?!(-500|-501|-503|-504)).)*$")) {
  253.     $Result = @{"SysAccount"="[异常项]-系统中存在其他账号请检查: $($Account.Name)"}
  254.     $SysAccount += $Result
  255.   }else{
  256.     $Result = @{"SysAccount"="[合格项]-系统中无多余其他账号";}
  257.     $SysAccount += $Result
  258.   }
  259.   return $SysAccount
  260. }
  261. #
  262. # * 系统账号策略配置核查函数  * #
  263. #
  264. # - 系统账号策略 - #
  265. $SysAccountPolicy = @{
  266.   # + 密码最短留存期
  267.   "MinimumPasswordAge" = @{operator="le";value=30;msg="密码最短留存期"}
  268.   # + 密码最长留存期
  269.   "MaximumPasswordAge" = @{operator="le";value=90;msg="密码最长留存期"}
  270.   # + 密码长度最小值
  271.   "MinimumPasswordLength" = @{operator="ge";value=14;msg="密码长度最小值"}
  272.   # + 密码必须符合复杂性要求
  273.   "PasswordComplexity" = @{operator="eq";value=1;msg="密码必须符合复杂性要求策略"}
  274.   # + 强制密码历史 N个记住的密码
  275.   "PasswordHistorySize" = @{operator="ge";value=3;msg="强制密码历史个记住的密码"}
  276.   # + 账户登录失败锁定阈值N次数
  277.   "LockoutBadCount" = @{operator="le";value=6;msg="账户登录失败锁定阈值次数"}
  278.   # + 账户锁定时间(分钟)
  279.   "ResetLockoutCount" = @{operator="ge";value=15;msg="账户锁定时间(分钟)"}
  280.   # + 复位账户锁定计数器时间(分钟)
  281.   "LockoutDuration" = @{operator="ge";value=15;msg="复位账户锁定计数器时间(分钟)"}
  282.   # + 下次登录必须更改密码
  283.   "RequireLogonToChangePassword" = @{operator="eq";value=0;msg="下次登录必须更改密码"}
  284.   # + 强制过期
  285.   "ForceLogoffWhenHourExpire" = @{operator="eq";value=0;msg="强制过期"}
  286.   # + 当前管理账号登陆名称
  287.   "NewAdministratorName" = @{operator="ne";value='"Administrator"';msg="当前系统默认管理账号登陆名称策略"}
  288.   # + 当前来宾用户登陆名称
  289.   "NewGuestName" = @{operator="ne";value='"Guest"';msg="当前系统默认来宾用户登陆名称策略"}
  290.   # + 管理员是否被启用
  291.   "EnableAdminAccount" = @{operator="eq";value=1;msg="管理员账户停用与启用策略"}
  292.   # + 来宾用户是否启用
  293.   "EnableGuestAccount" = @{operator="eq";value=0;msg="来宾账户停用与启用策略"}
  294.   # + 指示是否使用可逆加密来存储密码一般禁用(除非应用程序要求超过保护密码信息的需要)
  295.   "ClearTextPassword" = @{operator="eq";value=0;msg="指示是否使用可逆加密来存储密码 (除非应用程序要求超过保护密码信息的需要)"}
  296.   # + 启用时此设置允许匿名用户查询本地LSA策略(0关闭)
  297.   "LSAAnonymousNameLookup" = @{operator="eq";value=0;msg="启用时此设置允许匿名用户查询本地LSA策略 (0关闭)"}
  298.   # + 检查结果存放的空数组
  299.   "CheckResults" = @()
  300.   }
  301. Function F_SysAccountPolicy {
  302.   $Count = $Config.Count
  303.   for ($i=0;$i -lt $Count; $i++){
  304.     $Line = $Config[$i] -split " = "
  305.     if ($SysAccountPolicy.ContainsKey("$($Line[0])")) {
  306.       $Result = F_Tools -Key "SysAccountPolicy::$($Line[0])" -Value $Line[1] -Operator $SysAccountPolicy["$($Line[0])"].Operator -DefaultValue $SysAccountPolicy["$($Line[0])"].Value  -Msg "系统账号策略配置-$($SysAccountPolicy["$($Line[0])"].Msg)"
  307.       $SysAccountPolicy['CheckResults'] += $Result
  308.     }
  309.     if ( $Line[0] -eq "[Event Audit]" ) { break;}
  310.   }
  311.   return $SysAccountPolicy['CheckResults']
  312. }
  313. #
  314. # * 系统事件审核策略配置核查函数  * #
  315. #
  316. # - 系统事件审核策略 - #
  317. $SysEventAuditPolicy  = @{
  318.   # + 审核系统事件(0) [成功(1)、失败(2)] (3)
  319.   AuditSystemEvents = @{operator="eq";value=3;msg="审核系统事件"}
  320.   # + 审核登录事件 成功、失败
  321.   AuditLogonEvents = @{operator="eq";value=3;msg="审核登录事件"}
  322.   # + 审核对象访问 成功、失败
  323.   AuditObjectAccess = @{operator="eq";value=3;msg="审核对象访问"}
  324.   # + 审核特权使用 失败
  325.   AuditPrivilegeUse = @{operator="ge";value=3;msg="审核特权使用"}
  326.   # + 审核策略更改 成功、失败
  327.   AuditPolicyChange = @{operator="eq";value=3;msg="审核策略更改"}
  328.   # + 审核账户管理 成功、失败
  329.   AuditAccountManage = @{operator="eq";value=3;msg="审核账户管理"}
  330.   # + 审核过程追踪 失败
  331.   AuditProcessTracking = @{operator="ge";value=3;msg="审核过程追踪"}
  332.   # + 审核目录服务访问 失败
  333.   AuditDSAccess = @{operator="ge";value=3;msg="审核目录服务访问"}
  334.   # + 审核账户登录事件 成功、失败
  335.   AuditAccountLogon = @{operator="eq";value=3;msg="审核账户登录事件"}
  336.   # + 检查结果存放的空数组
  337.   CheckResults = @()
  338. }
  339. function F_SysEventAuditPolicy {
  340.   $Count = $Config.Count
  341.   for ($i=0;$i -lt $Count; $i++){
  342.     $Line = $Config[$i] -split " = "
  343.     if ( $Line[0] -eq "[Registry Values]" ) { break;}
  344.     if ($SysEventAuditPolicy.ContainsKey("$($Line[0])")) {
  345.       $Result = F_Tools -Key "SysEventAuditPolicy::$($Line[0])" -Value $Line[1] -Operator $SysEventAuditPolicy["$($Line[0])"].Operator -DefaultValue $SysEventAuditPolicy["$($Line[0])"].Value  -Msg "系统账号策略配置-$($SysEventAuditPolicy["$($Line[0])"].Msg)"
  346.       $SysEventAuditPolicy['CheckResults'] += $Result
  347.     }
  348.   }
  349.   return $SysEventAuditPolicy['CheckResults']
  350. }
  351. #
  352. # * 操作系统用户权限管理策略检查  * #
  353. #
  354. # - 组策略用户权限管理策略 - #
  355. $SysUserPrivilegePolicy = @{
  356. # + 操作系统本地关机策略安全
  357. SeShutdownPrivilege = @{operator="eq";value='*S-1-5-32-544';msg="操作系统本地关机策略"}
  358. # + 操作系统远程关机策略安全
  359. SeRemoteShutdownPrivilege = @{operator="eq";value='*S-1-5-32-544';msg="操作系统远程关机策略"}
  360. # + 取得文件或其他对象的所有权限策略
  361. SeProfileSingleProcessPrivilege = @{operator="eq";value='*S-1-5-32-544';msg="取得文件或其他对象的所有权限策略"}
  362. # + 从网络访问此计算机策略
  363. SeNetworkLogonRight = @{operator="eq";value='*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551';msg="从网络访问此计算机策略"}
  364. CheckResults = @()
  365. }
  366. Function F_SysUserPrivilegePolicy {
  367.   # - 策略组用户权限配置
  368.   $Hash = $SysUserPrivilegePolicy.Clone()  # 巨坑之处
  369.   foreach ( $Name in $Hash.keys) {
  370.     if ( $Name.Equals("CheckResults")){ continue; }
  371.     $Line = ($Config | Select-String $Name.toString()) -split " = "
  372.     $Result = F_Tools -Key "SysUserPrivilegePolicy::$($Line[0])" -Value $Line[1] -Operator $SysUserPrivilegePolicy["$($Line[0])"].Operator -DefaultValue $SysUserPrivilegePolicy["$($Line[0])"].Value  -Msg "策略组用户权限配置-$($SysUserPrivilegePolicy["$($Line[0])"].Msg)"
  373.     $SysUserPrivilegePolicy['CheckResults'] += $Result
  374.   }
  375.   return $SysUserPrivilegePolicy['CheckResults']
  376. }
  377. #
  378. # * 操作系统策略组安全选项权限配置检查 * #
  379. #
  380. # - 组策略安全选项策略 - #
  381. $SysSecurityOptionPolicy = @{
  382.   # - 帐户:使用空密码的本地帐户只允许进行控制台登录(启用),注意此设置不影响使用域帐户的登录。(0禁用|1启用)
  383.   LimitBlankPasswordUse = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse=4,1";msg="帐户-使用空密码的本地帐户只允许进行控制台登录(启用)"}
  384.    
  385.   # - 交互式登录: 不显示上次登录用户名值(启用)
  386.   DontDisplayLastUserName = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayLastUserName=4,1";msg="交互式登录-不显示上次登录用户名值(启用)"}
  387.   # - 交互式登录: 登录时不显示用户名
  388.   DontDisplayUserName = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayUserName=4,1";msg="交互式登录: 登录时不显示用户名"}
  389.   # - 交互式登录: 锁定会话时显示用户信息(不显示任何信息)
  390.   DontDisplayLockedUserId = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayLockedUserId=4,3";msg="交互式登录: 锁定会话时显示用户信息(不显示任何信息)"}
  391.   # - 交互式登录: 无需按 CTRL+ALT+DEL(禁用)
  392.   DisableCAD = @{operator="eq";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableCAD=4,0";msg="交互式登录-无需按CTRL+ALT+DEL值(禁用)"}
  393.   # - 交互式登录:计算机不活动限制值为600秒或更少
  394.   InactivityTimeoutSecs = @{operator="le";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\InactivityTimeoutSecs=4,600";msg="交互式登录-计算机不活动限制值为600秒或更少"}
  395.   # - 交互式登录: 计算机帐户阈值此策略设置确定可导致计算机重启的失败登录尝试次数
  396.   MaxDevicePasswordFailedAttempts = @{operator="le";value="MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\MaxDevicePasswordFailedAttempts=4,10";msg="交互式登录: 此策略设置确定可导致计算机重启的失败登录尝试次数"}
  397.   # - 交互式登录: 试图登录的用户的消息标题
  398.   LegalNoticeCaption = @{operator="eq";value='MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeCaption=1,"安全登陆"';msg="交互式登录: 试图登录的用户的消息标题"}
  399.   # - 交互式登录: 试图登录的用户的消息文本
  400.   LegalNoticeText = @{operator="eq";value='MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeText=7,请谨慎的操作服务器中数据,您所有操作将被记录审计';msg="交互式登录: 试图登录的用户的消息文本"}
  401.    
  402.   # - Microsoft网络客户端: 将未加密的密码发送到第三方 SMB 服务器(禁用)
  403.   EnablePlainTextPassword = @{operator="eq";value="MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnablePlainTextPassword=4,0";msg="Microsoft网络客户端-将未加密的密码发送到第三方 SMB 服务器(禁用)"}
  404.   # - Microsoft网络服务器:暂停会话前所需的空闲时间数量值为15分钟或更少但不为0
  405.   AutoDisconnect = @{operator="eq";value="MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\AutoDisconnect=4,15";msg="Microsoft网络服务器-暂停会话前所需的空闲时间数量值为15分钟"}
  406.    
  407.   # - 网络安全: 再下一次改变密码时不存储LAN管理器哈希值(启用)
  408.   NoLMHash = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1";msg="网络安全-在下一次改变密码时不存储LAN管理器哈希值(启用)"}
  409.    
  410.   # - 网络访问: 不允许SAM账户的匿名枚举值为(启用)
  411.   RestrictAnonymousSAM = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM=4,1";msg="网络访问-不允许SAM账户的匿名枚举值为(启用)"}
  412.   # - 网络访问:不允许SAM账户和共享的匿名枚举值为(启用)
  413.   RestrictAnonymous = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymous=4,1";msg="网络访问-不允许SAM账户和共享的匿名枚举值为(启用)"}
  414.    
  415.   # - 关机:设置确定是否可以在无需登录 Windows 的情况下关闭计算机(禁用)
  416.   ClearPageFileAtShutdown = @{operator="eq";value="MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\ClearPageFileAtShutdown=4,0";msg="关机-设置确定是否可以在无需登录 Windows 的情况下关闭计算机(禁用)"}
  417.    
  418.   "CheckResults" = @()
  419. }
  420. Function F_SysSecurityOptionPolicy {
  421.   $Hash = $SysSecurityOptionPolicy.Clone()  # 巨坑之处
  422.   foreach ( $Name in $Hash.keys) {
  423.     if ( $Name.Equals("CheckResults")){ continue; }
  424.     $Flag = $Config | Select-String $Name.toString()
  425.     $Value = $SysSecurityOptionPolicy["$($Name)"].Value -split ","
  426.     if ( $Flag ) {
  427.       $Line = $Flag -split ","
  428.       $Result = F_Tools -Key "SysSecurityOptionPolicy::$($Name)" -Value $Line[1] -Operator $SysSecurityOptionPolicy["$($Name)"].Operator -DefaultValue $Value[1] -Msg "策略组安全选项配置-$($SysSecurityOptionPolicy["$($Name)"].Msg)"
  429.       $SysSecurityOptionPolicy['CheckResults'] += $Result
  430.     } else {
  431.       $Result = @{"SysSecurityOptionPolicy::$($Name)"="[异常项]|未配置|$($Value[1])|策略组安全选项配置-$($SysSecurityOptionPolicy["$($Name)"].Msg)-【不符合】等级保护标准."}
  432.       $SysSecurityOptionPolicy['CheckResults'] += $Result
  433.     }
  434.   }
  435.   return $SysSecurityOptionPolicy['CheckResults']
  436. }
  437. #
  438. # * 操作系统注册表相关配置检查函数  * #
  439. #
  440. # - 注册表相关安全策略  -
  441. $SysRegistryPolicy = @{
  442. # + 屏幕自动保护程序
  443. ScreenSaveActive = @{regname="HKEY_CURRENT_USER\Control Panel\Desktop";name="ScreenSaveActive";operator="eq";value=1;msg="系统基配核查-屏幕自动保护程序策略"}
  444. # + 屏幕恢复时使用密码保护
  445. ScreenSaverIsSecure = @{regname="HKEY_CURRENT_USER\Control Panel\Desktop";name="ScreenSaverIsSecure";operator="eq";value=1;msg="系统基配核查-屏幕恢复时使用密码保护策略"}
  446. # + 屏幕保护程序启动时间
  447. ScreenSaveTimeOut = @{regname="HKEY_CURRENT_USER\Control Panel\Desktop";name="ScreenSaveTimeOut";operator="le";value=600;msg="系统基配核查-屏幕保护程序启动时间策略"}
  448. # + 禁止全部驱动器自动播放
  449. DisableAutoplay  = @{regname="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer";name="DisableAutoplay";regtype="DWord";operator="eq";value=1;msg="禁止全部驱动器自动播放"}
  450. NoDriveTypeAutoRun = @{regname="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer";name="NoDriveTypeAutoRun";regtype="DWord";operator="eq";value=255;msg="禁止全部驱动器自动播放"}
  451. # - 检查关闭默认共享盘
  452. restrictanonymous = @{regname="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa";name="restrictanonymous";operator="eq";value=1;msg="系统网络基配核查-关闭默认共享盘策略"}
  453. restrictanonymoussam = @{regname="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa";name="restrictanonymoussam";regtype="DWord";operator="eq";value=1;msg="不允许SAM账户的匿名枚举值为(启用)"}
  454. # - 禁用磁盘共享(SMB)
  455. AutoShareWks = @{regname="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters";name="AutoShareWks";regtype="DWord";operator="eq";value=0;msg="关闭禁用默认共享策略-Server2012"}
  456. AutoShareServer = @{regname="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters";name="AutoShareServer";regtype="DWord";operator="eq";value=0;msg="关闭禁用默认共享策略-Server2012"}
  457. # - 系统、应用、安全、PS日志查看器大小设置(此处设置默认的两倍配置-建议一定通过日志采集平台采集系统日志比如ELK)
  458. EventlogSystemMaxSize = @{regname="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System";name="MaxSize";operator="ge";value=41943040;msg="系统日志基配核查-系统日志查看器大小设置策略"}
  459. EventlogApplicationMaxSize = @{regname="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application";name="MaxSize";operator="ge";value=41943040;msg="系统日志基配核查-应用日志查看器大小设置策略"}
  460. EventlogSecurityMaxSize = @{regname="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security";name="MaxSize";operator="ge";value=41943040;msg="系统日志基配核查-安全日志查看器大小设置策略"}
  461. EventlogPSMaxSize = @{regname="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Windows PowerShell";name="MaxSize";operator="ge";value=31457280;msg="系统日志基配核查-PS日志查看器大小设置策略"}
  462. # - 防火墙相关操作设置(开启、协议、服务)
  463. DomainEnableFirewall  = @{regname='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile';name='EnableFirewall';regtype="DWord";operator="eq";value=1;msg="开启域网络防火墙"}
  464. StandardEnableFirewall = @{regname='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\StandardProfile';name='EnableFirewall';regtype="DWord";operator="eq";value=1;msg="开启专用网络防火墙"}
  465. PPEnableFirewall = @{regname='HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\PublicProfile';name='EnableFirewall';regtype="DWord";operator="eq";value=1;msg="开启公用网络防火墙"}
  466. # - 结果存储
  467. CheckResults=@()
  468. }
  469. Function F_SysRegistryPolicy {
  470.   $Registry=  $SysRegistryPolicy.Clone()
  471.   foreach ( $item in $Registry.keys) {
  472.     if ( $item -eq "CheckResults" ){ continue;}
  473.     $Result = F_GetRegPropertyValue -Key $SysRegistryPolicy.$item.regname -Name $SysRegistryPolicy.$item.name -Operator $SysRegistryPolicy.$item.operator -DefaultValue $SysRegistryPolicy.$item.value -Msg $SysRegistryPolicy.$item.msg
  474.     $SysRegistryPolicy['CheckResults'] += $Result
  475.   }
  476.   return $SysRegistryPolicy['CheckResults']
  477. }
  478. #
  479. # * 操作系统服务及运行程序检查函数  * #
  480. #
  481. $SysProcessServicePolicy = @{"CheckResults"=@()}
  482. function F_SysProcessServicePolicy {
  483.   # + 检测系统及用户开机启动项
  484.   $SysAutoStart = Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
  485.   $SysAutoStart.GetValueNames() | % {
  486.     $res += "$($_)#$($SysAutoStart.GetValue($_)) "
  487.   }
  488.   $Result = @{"SysProcessServicePolicy::SysAutoStart"=$res}
  489.   $SysProcessServicePolicy['CheckResults'] += $Result
  490.   $UserAutoStart = Get-Item -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run'
  491.   $UserAutoStart.GetValueNames() | % {
  492.     $res += "$($_)#$($SysAutoStart.GetValue($_)) "
  493.   }
  494.   $Result = @{"SysProcessServicePolicy::UserAutoStart"=$res}
  495.   $SysProcessServicePolicy['CheckResults'] += $Result
  496.   # + 否启用远程桌面服务
  497.   $RDPStatus = (Get-Service -Name "TermService").Status
  498.   # if ($RDP -eq "0" -and $RDPStatus -eq "Running" ) {
  499.   #   $Result = @{"SysProcessServicePolicy::RDPStatus"="当前系统【已启用】远程桌面服务."}
  500.   # } else {
  501.   #   $Result = @{"SysProcessServicePolicy::RDPStatus"="当前系统【未启用】远程桌面服务."}
  502.   # }
  503.   if ($RDPStatus -eq "Running" ) {
  504.     $Result = F_GetRegPropertyValue -Key 'HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server' -Name 'fDenyTSConnections' -Operator "eq" -DefaultValue 0 -Msg "是否将远程桌面服务禁用"
  505.   } else {
  506.     $Result = @{"SysProcessServicePolicy::RDPStatus"="当前系统【未启用】远程桌面服务."}
  507.   }
  508.   $SysProcessServicePolicy['CheckResults'] += $Result
  509.   # - 否启用NTP服务来同步时钟
  510.   # $NTP = F_GetReg -Key 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer' -Name 'Enabled'
  511.   # if ( $NTP -eq "1") {
  512.   #   $Result = @{"SysProcessServicePolicy::NtpServerEnabled"="[合格项]|$NTP|1|系统基础配置核查-启用NTP服务同步时钟策略-【符合】等级保护标准."}
  513.   # } else {
  514.   #   $Result = @{"SysProcessServicePolicy::NtpServerEnabled"="[异常项]|$NTP|1|系统基础配置核查-启用NTP服务同步时钟策略-【不符合】等级保护标准."}
  515.   # }
  516.   $Result = F_GetRegPropertyValue -Key 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer' -Name 'Enabled' -Operator "eq" -DefaultValue 1 -Msg "是否启用NTP服务同步时钟策略"
  517.   $SysProcessServicePolicy['CheckResults'] += $Result
  518.    
  519.   # - 是否修改默认的远程桌面端口
  520.   $RDP1 = Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\' | % {$_.GetValue("PortNumber")}
  521.   $RDP2 = Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp\' | % {$_.GetValue("PortNumber")}
  522.   if ( $RDP1 -eq $RDP2 -and $RDP2 -ne "3389") {
  523.     $Result = @{"SysProcessServicePolicy::RDPPort"="[合格项]|$RDP1|除3389以外的端口|系统基础配置核查-默认的远程桌面端口已修改-【符合】等级保护标准."}
  524.   } else {
  525.     $Result = @{"SysProcessServicePolicy::RDPPort"="[异常项]|$RDP1|除3389以外的端口|系统基础配置核查-默认的远程桌面端口未修改-【不符合】等级保护标准."}
  526.   }
  527.   $SysProcessServicePolicy['CheckResults'] += $Result
  528. }
  529. #
  530. # * 操作系统安全检测函数 *
  531. #
  532. # * 微软Windows服务器安全补丁列表信息 * #
  533. $Msrc_api = "https://api.msrc.microsoft.com/sug/v2.0/zh-CN/affectedProduct?%24orderBy=releaseDate+desc&%24filter=productFamilyId+in+%28%27100000010%27%29+and+severityId+in+%28%27100000000%27%2C%27100000001%27%29+and+%28releaseDate+gt+2020-01-14T00%3A00%3A00%2B08%3A00%29+and+%28releaseDate+lt+2021-05-22T23%3A59%3A59%2B08%3A00%29"
  534. $SysWSUSList = @{}
  535. $SysWSUSListId = @()
  536. $AvailableWSUSList = @{}
  537. function F_SysSecurityPolicy {
  538.   # - 系统补丁验证
  539.   if ( $MsrcUpdate -or ! (Test-Path -Path .\WSUSList.json) ) {
  540.     $MSRC_JSON = F_UrlRequest -Msrc_api $Msrc_api
  541.     $MSRC_JSON.value | % {
  542.       $id = $_.id;
  543.       $product = $_.product;
  544.       $articleName = $_.kbArticles.articleName | Get-Unique;
  545.       $fixedBuildNumber = $_.kbArticles.fixedBuildNumber | Get-Unique;
  546.       $severity = $_.severity;
  547.       $impact = $_.impact;
  548.       $baseScore = $_.baseScore;
  549.       $cveNumber = $_.cveNumber | Get-Unique;
  550.       $releaseDate = $_.releaseDate
  551.       $SysWSUSList += @{"$($id)"=@{"product"=$product;"articleName"=$articleName;"fixedBuildNumber"=$fixedBuildNumber;"severity"=$severity;"impact"=$impact;"baseScore"=$baseScore;"cveNumber"=$cveNumber;"releaseDate"=$releaseDate}}
  552.     }
  553.     while ($MSRC_JSON.'@odata.nextLink'.length) {
  554.       $MSRC_JSON = F_UrlRequest -Msrc_api $MSRC_JSON.'@odata.nextLink'
  555.       $MSRC_JSON.value | % {
  556.         $id = $_.id;
  557.         $product = $_.product;
  558.         $articleName = $_.kbArticles.articleName | Get-Unique;
  559.         $fixedBuildNumber = $_.kbArticles.fixedBuildNumber | Get-Unique;
  560.         $severity = $_.severity;
  561.         $impact = $_.impact;
  562.         $baseScore = $_.baseScore;
  563.         $cveNumber = $_.cveNumber | Get-Unique;
  564.         $releaseDate = $_.releaseDate
  565.         $SysWSUSList += @{"$($id)"=@{"product"=$product;"articleName"=$articleName;"fixedBuildNumber"=$fixedBuildNumber;"severity"=$severity;"impact"=$impact;"baseScore"=$baseScore;"cveNumber"=$cveNumber;"releaseDate"=$releaseDate }}
  566.       }
  567.     }
  568.     Write-Host "[-] 已从 Microsoft 安全响应中心获取更新 $($MSRC_JSON.'@odata.count') 条补丁信息!" -ForegroundColor Green
  569.     Write-Host "[-] 正在将获取的更新 $($MSRC_JSON.'@odata.count') 条补丁信息写入到本地 WSUSList.json 文件之中!" -ForegroundColor Green
  570.     $SysWSUSList | ConvertTo-Json | Out-File WSUSList.json -Encoding utf8
  571.     $SysWSUSListId = $SysWSUSList.keys
  572.     $SysWSUSList.keys | ConvertTo-Json | Out-File WSUSListId.json -Encoding utf8
  573.   } else {
  574.     # 从本地读取JSON文件存储的补丁信息。
  575.     if (Test-Path -Path .\WSUSList.json) {
  576.       #$SysWSUSList = Get-Content -Raw -Encoding UTF8 .\WSUSList.json | ConvertFrom-Json
  577.       $SysWSUSListId  = Get-Content -Raw -Encoding UTF8 .\WSUSListId.json | ConvertFrom-Json
  578.       Write-Host "[-] 已从本地 WSUSList.json 文件获得 $($SysWSUSListId.count) 条补丁信息!" -ForegroundColor Green
  579.     } else {
  580.       Write-Host "[-] 本地未能找到存放补丁信息的 WSUSList.json 文件! 请采用 -Update True 标记从Microsoft 安全响应中心获取更新" -ForegroundColor Red
  581.       break
  582.       exit
  583.     }
  584.   }
  585.   
  586.   # 获取当前系统版本可用的补丁列表
  587.   $AvailableWSUSListId = @()
  588.   if ($SysInfo.ProductType -eq "Client") {
  589.     Write-Host "[-] Desktop Client" -ForegroundColor Gray
  590.     foreach ($KeyName in $SysWSUSListId) {
  591.       if(($SysWSUSList."$KeyName".product -match $SysInfo.ProductName) -and ($SysWSUSList."$KeyName".product -match $SysInfo.WindowsVersion) -and ($SysWSUSList."$KeyName".product -match ($SysInfo.CsSystemType -split " ")[0])) {
  592.         if (($SysWSUSList."$KeyName".fixedBuildNumber -match $SysInfo.OsVersion) -or ($SysWSUSList."$KeyName".fixedBuildNumber.length -eq 0 )) {
  593.           $AvailableWSUSList."$KeyName" = $SysWSUSList."$KeyName"
  594.           $AvailableWSUSListId += "$KeyName"
  595.         }
  596.       }
  597.     }
  598.   } else {
  599.     Write-Host "[-] Windows Server" -ForegroundColor Gray
  600.     foreach ($KeyName in $SysWSUSListId) {
  601.       if(($SysWSUSList."$KeyName".product -match $SysInfo.ProductName) -and ($SysWSUSList."$KeyName".product -match $SysInfo.ProductName)) {
  602.         $AvailableWSUSList."$KeyName" = $SysWSUSList."$KeyName"
  603.         $AvailableWSUSListId += "$KeyName"
  604.       }
  605.     }
  606.   }
  607.   Write-Host $SysInfo.ProductName $SysInfo.WindowsVersion ($SysInfo.CsSystemType -split " ")[0] $SysInfo.OsVersion
  608.   Write-Host "[-] 已从梳理出适用于当前 $($SysInfo.ProductType) 系统版本的 $($AvailableWSUSList.count) 条补丁信息!`n" -ForegroundColor Green
  609.   # 已安装的补丁
  610.   $InstallWSUSList = @{}
  611.   $msg = @()
  612.   foreach ($id in $AvailableWSUSListId) {
  613.     if( $SysInfo.'Hotfix(s)' -match $AvailableWSUSList."$id".articleName ) {
  614.       $InstallWSUSList."$id" = $SysWSUSList."$id"
  615.       $msg += "[+]" + $SysWSUSList."$id".product + $SysWSUSList."$id".fixedBuildNumber + " " +  $SysWSUSList."$id".articleName + "(" + $SysWSUSList."$id".cveNumber   + ")" + $SysWSUSList."$id".severity  + $SysWSUSList."$id".baseScore + "`n"
  616.     }
  617.   }
  618.   Write-Host "[-] $($SysInfo.'Hotfix(s)') ,共 $($AvailableWSUSList.count) 条漏洞补丁信息!`n$($msg)" -ForegroundColor Green
  619.   # 未安装的补丁
  620.   $NotInstallWSUSList = @{}
  621.   $msg = @()
  622.   foreach ($id in $AvailableWSUSListId) {
  623.     if(-not($InstallWSUSList."$id")) {
  624.      $NotInstallWSUSList."$id" = $SysWSUSList."$id"
  625.      $msg += "[+]" + $SysWSUSList."$id".product + $SysWSUSList."$id".fixedBuildNumber + " " + $SysWSUSList."$id".articleName + "(" + $SysWSUSList."$id".cveNumber + ")" + $SysWSUSList."$id".severity + $SysWSUSList."$id".baseScore + "`n"
  626.     }
  627.   }
  628.   Write-Host "[-] 未安装 $($NotInstallWSUSList.count) 条漏洞补丁信息,共 $($AvailableWSUSList.count) 条漏洞补丁信息!`n$($msg)" -ForegroundColor red
  629. }
  630. function Get-BasicInfo{
  631.     $scanTime=Get-date -Format 'yyyy-M-d H:m:s'
  632.     $hostname = hostname
  633.     $osVersion=Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty Caption
  634.     $ipList = ""
  635.     $macaddr = ""
  636.     foreach($line in ipconfig /all|Select-String -Pattern "^\s*IPv4"){
  637.         $line=$line.ToString().split(":")[1].replace("(","\(").replace(")","\)")
  638.         $context = (ipconfig /all |Select-String -Pattern $line -Context 10,0).Context[0]
  639.         if ($context.Precontext|Select-String "VMware" -Quiet){
  640.             continue   
  641.         }
  642.         foreach ($lline in $context.Precontext.split("\n")){
  643.             #Write-Host $lline
  644.             if ($lline.ToString().contains("Physical")){
  645.                 #Write-Host $lline.ToString() dddd
  646.                 $macaddr = $macaddr + $lline.ToString().split(":")[1].Trim() + ";"
  647.                 break
  648.             }
  649.         }
  650.         $ipList = $ipList + $line.ToString().split("\")[0].trim() + ";"
  651.     }
  652.     Write-Host scanTime:$scanTime
  653.     Write-Host osVersion:$osVersion
  654.     Write-Host hostname:$hostname
  655.     Write-Host macaddr: $macaddr
  656.     Write-Host ipList : $ipList
  657.     $basic_info="{""scanTime"":""$scanTime"",""osVersion"":""$osVersion"",""hostname"":""$hostname"",""macaddr"":""$macaddr"",""ipList"":""$ipList""}"
  658.     return $basic_info
  659. }
  660. #2022年9月12日新增功能区域
  661. #搜集所有的KB补丁
  662. function Get-CollectKB(){
  663.     $KBArray = @()
  664.     $KBArray = Get-HotFix|ForEach-Object {$_.HotFixId}
  665.     $CollectKB = $KBArray|ConvertTo-Json
  666.     return $CollectKB
  667. }
  668. #自动运行程序数量获取
  669. function Get-SystemSecureCheckRes{
  670.     $key="HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer"
  671.     $name="NoDriveTypeAutoRun"
  672.     #$autoRunRes=(Get-ItemProperty hklm:\software\wow6432node\microsoft\windows\currentversion\uninstall\* | select-object DisplayName, InstallDate).$name
  673.     $autoRunRes=(Get-ItemProperty -Path "Registry::$key" -ErrorAction:SilentlyContinue).$name
  674.     if(-not $autoRunRes){
  675.         $autoRunRes="False"
  676.     }
  677.     $systemsecure_check_res="{""autoRunRes"":""$autoRunRes""}"
  678.     return $systemsecure_check_res
  679. }
  680. #远程端口获取测试(虽然鸡肋,但我还是要写出来,就是玩儿!)
  681. function Get-PortSecureCheckRes{
  682.     $key="HKLM\SYSTEM\CurrentControlSet\Control\Terminal server\WinStations\RDP-Tcp"
  683.     $name="Portnumber"
  684.     $rdpPort=(Get-ItemProperty -Path "Registry::$key" -ErrorAction:SilentlyContinue).$name
  685.     if($rdpPort -eq "3389"){
  686.         Write-Host "[-] RDPPort should not be 3389" -ForegroundColor Red
  687.     }
  688.     $portsecure_check_res="{""rdpPort"":""$rdpPort""}"
  689.     return $portsecure_check_res
  690. }
  691. #2022年9月15号新增功能区域
  692. #查询系统中所有的用户信息
  693. $OtherUserCheck = @{}
  694. function F_OtherUserPolicy {
  695.   $UserOther = Get-WmiObject -Class Win32_UserAccount -Filter "Name='$env:username' and Domain='$env:userdomain'" | Select-Object *
  696.   $OtherUserCheck += @{"UserOther"="$($UserOther)"}
  697.   return $OtherUserCheck
  698. }
  699. #获取系统时间
  700. function F_Date {
  701.   $Date = Get-Date
  702.   $DateCheck += @{"Date"="$($Date)"}
  703.   return $DateCheck
  704. }
  705. #获取NTP时钟设备
  706. function F_NTP {
  707.   $NTP = w32tm /query /status | Format-Table | Out-String
  708.   $NTPCheck += @{"NTP"="$($NTP)"}
  709.   return $NTPCheck
  710. }
  711. #获取系统服务
  712. function F-Service {
  713.   $Service = Get-Service
  714.   $ServiceCheck += @{"Service"="$($Service)"}
  715.   return $ServiceCheck
  716. }
  717. #
  718. # * 杂类检测函数 *
  719. #
  720. $OtherCheck = @{}
  721. function F_OtherCheckPolicy {
  722.   # - 当前系统已安装的软件
  723.   $Product = Get-WmiObject -Class Win32_Product | Select-Object -Property Name,Version,IdentifyingNumber | Sort-Object Name | Out-String
  724.   $OtherCheck += @{"Product"="$($Product)"}
  725.   # - 当前系统最近访问文件或者目录
  726.   $Recent = (Get-ChildItem ~\AppData\Roaming\Microsoft\Windows\Recent).Name
  727.   $OtherCheck += @{"Recent"="$($Recent)"}
  728.   return $OtherCheck
  729. }
  730. function Main() {
  731. <#
  732. .SYNOPSIS
  733. main 函数程序执行入口
  734. .DESCRIPTION
  735. 调用上述编写的相关检测脚本
  736. .EXAMPLE
  737. main
  738. #>
  739. $ScanStartTime = Get-date -Format 'yyyy-M-d H:m:s'
  740. F_Logging -Level Info -Msg "[*] Windows Server 安全配置策略基线检测脚本已启动."
  741. F_Logging -Level Info -Msg "[*] 脚本执行: $($Executor), 是否在线拉取微软安全中心的服务器安全补丁列表信息: $($MsrcUpdate)`n"
  742. # 1.判断当前运行的powershell终端是否管理员执行
  743. F_Logging -Level Info -Msg "[-] 正在检测当前运行的PowerShell终端是否管理员权限...`n"
  744. $flag = F_IsCurrentUserAdmin
  745. if (!($flag)) {
  746.   F_Logging -Level Error -Msg "[*] 脚本执行发生错误,请使用管理员权限运行该脚本..例如: Start-Process powershell -Verb runAs...."
  747.   F_Logging -Level Warning -Msg "[*] 正在退出执行该脚本......"
  748.   return
  749. }
  750. F_Logging -Level Info -Msg "[*] PowerShell 管理员权限检查通过...`n"
  751. # 2.当前系统策略配置文件导出 (注意必须系统管理员权限运行)
  752. F_Logging -Level Info -Msg "[-] 正在导出当前系统策略配置文件 config.cfg......`n"
  753. secedit /export /cfg config.cfg /quiet
  754. start-sleep 3
  755. if ( -not(Test-Path -Path config.cfg)) {
  756.   F_Logging -Level Error -Msg "[*] 当前系统策略配置文件 config.cfg 不存在,请检查......`n"
  757.   F_Logging -Level Warning -Msg "[*] 正在退出执行该脚本......"
  758.   return
  759. } else {
  760.   Copy-Item -Path config.cfg -Destination config.cfg.bak -Force
  761. }
  762. $Config = Get-Content -path config.cfg
  763. # 3.系统相关信息以及系统安全组策略检测
  764. echo "————————————————————————" >> $file_name
  765. echo "当前系统时间" >> $file_name
  766. F_Logging -Level Info -Msg "[-] 当前系统时间"
  767. $DateCheck = F_Date
  768. $DateCheck >> $file_name
  769. echo "————————————————————————" >> $file_name
  770. echo "系统NTP时钟设置" >> $file_name
  771. F_Logging -Level Info -Msg "[-] 系统NTP时钟设置"
  772. $NTPCheck = F_NTP
  773. $NTPCheck >> $file_name
  774. echo "————————————————————————" >> $file_name
  775. echo "IP地址查询" >> $file_name
  776. F_Logging -Level Info -Msg "[-] IP地址查询"
  777. ipconfig >> $file_name
  778. echo "————————————————————————" >> $file_name
  779. echo "当前自动运行程序进程数量信息一览" >> $file_name
  780. F_Logging -Level Info -Msg "[-] 当前自动运行程序进程数量信息一览"
  781. $systemsecure_check_res = Get-SystemSecureCheckRes
  782. $systemsecure_check_res >> $file_name
  783. echo "————————————————————————" >> $file_name
  784. echo "远程端口获取测试" >> $file_name
  785. F_Logging -Level Info -Msg "[-] 当前远程端口获取信息一览"
  786. $portsecure_check_res = Get-PortSecureCheckRes
  787. $portsecure_check_res >> $file_name
  788. echo "————————————————————————" >> $file_name
  789. echo "IP地址查询" >> $file_name
  790. F_Logging -Level Info -Msg "[-] IP地址查询"
  791. ipconfig >> $file_name
  792. echo "————————————————————————" >> $file_name
  793. echo "系统安装的修补程序一览" >> $file_name
  794. F_Logging -Level Info -Msg "[-] 系统安装的修补程序一览"
  795. $CollectKB = Get-CollectKB
  796. $CollectKB  >> $file_name
  797. #$SysNetAdapter
  798. #echo "————————————————————————" >> $file_name
  799. #echo "当前***信息一览" >> $file_name
  800. #F_Logging -Level Info -Msg "[-] 当前***信息一览"
  801. #$secInfoArray = Get-SecInfo
  802. #$secInfoArray >> $file_name
  803. echo "————————————————————————" >> $file_name
  804. echo "当前运行端口信息一览" >> $file_name
  805. F_Logging -Level Info -Msg "[-] 当前运行端口信息一览"
  806. netstat -ano >> $file_name
  807. echo "————————————————————————" >> $file_name
  808. echo "系统服务运行一览" >> $file_name
  809. F_Logging -Level Info -Msg "[-] 系统服务运行一览"
  810. $ServiceCheck = F-Service
  811. $ServiceCheck  >> $file_name
  812. #echo "————————————————————————" >> $file_name
  813. #echo "当前默认共享信息一览" >> $file_name
  814. #F_Logging -Level Info -Msg "[-] 当前默认共享信息一览"
  815. #net share >> $file_name
  816. echo "————————————————————————" >> $file_name
  817. echo "当前系统账户信息一览" >> $file_name
  818. F_Logging -Level Info -Msg "[-] 当前系统账户信息一览"
  819. $SysAccount = F_SysAccount
  820. $SysAccount  >> $file_name
  821. echo "————————————————————————" >> $file_name
  822. echo "系统中所有的用户信息一览" >> $file_name
  823. F_Logging -Level Info -Msg "[-] 系统中所有的用户信息一览"
  824. $OtherUserCheck = F_OtherUserPolicy
  825. $OtherUserCheck  >> $file_name
  826. echo "————————————————————————" >> $file_name
  827. echo "当前系统安全策略信息一览" >> $file_name
  828. F_Logging -Level Info -Msg "[-] 当前系统安全策略信息一览"
  829. $SysAccountPolicy.CheckResults = F_SysAccountPolicy >> $file_name
  830. $SysEventAuditPolicy.CheckResults = F_SysEventAuditPolicy >> $file_name
  831. $SysUserPrivilegePolicy.CheckResults = F_SysUserPrivilegePolicy >> $file_name
  832. $SysSecurityOptionPolicy.CheckResults = F_SysSecurityOptionPolicy >> $file_name
  833. $SysRegistryPolicy.CheckResults = F_SysRegistryPolicy >> $file_name
  834. $SysProcessServicePolicy.CheckResults = F_SysProcessServicePolicy >> $file_name
  835. echo "————————————————————————" >> $file_name
  836. echo "当前系统杂类信息一览" >> $file_name
  837. F_Logging -Level Info -Msg "[-] 当前系统杂类信息一览"
  838. $OtherCheck = F_OtherCheckPolicy
  839. $OtherCheck.Values >> $file_name
  840. #F_Logging -Level Info -Msg "[-] 当前系统安全补丁情况信息一览"
  841. # 4.程序执行完毕
  842. $ScanEndTime = Get-date -Format 'yyyy-M-d H:m:s'
  843. F_Logging -Level Info -Msg "- Windows Server 安全配置策略基线检测脚本已执行完毕,详细见桌面$ip.txt文件`n开始时间:${ScanStartTime}`n完成时间: ${ScanEndTime}"
  844. }
  845. Main
复制代码

作者: yyz219    时间: 2023-11-24 12:07

谢谢分享啊




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2