深入探索PowerShell远程会话管理与安全审计
1. 安全描述符创建步骤
在PowerShell中,创建安全描述符并转换为SDDL格式是一个重要的操作,以下是详细步骤:
1.1 创建ACE
$EveroneAuditACE = [System.Security.AccessControl.ObjectAce]::new(
[System.Security.AccessControl.AceFlags]::SuccessfulAccess,
[System.Security.AccessControl.AceQualifier]::SystemAudit,
1,
# 'WD' is an SID string constant for 'Everyone'
[System.Security.Principal.SecurityIdentifier]::new('WD'),
[System.Security.AccessControl.ObjectAceFlags]::None,
[System.Guid]::NewGuid(),
[System.Guid]::NewGuid(),
$false,
$null
)
1.2 将ACE添加到SystemACL
$index = 0
$SystemACL.InsertAce($index, $EveroneAuditACE)
1.3 定义安全描述符的控制标志
$ControlFlags = [System.Security.AccessControl.ControlFlags]
$Flags = @(
$ControlFlags::DiscretionaryAclPresent
$ControlFlags::SystemAclPresent
$ControlFlags::DiscretionaryAclProtected
$ControlFlags::SystemAclProtected
$ControlFlags::SelfRelative
)
1.4 创建安全描述符并转换为SDDL格式
$SecurityDescriptor =
[System.Security.AccessControl.RawSecurityDescriptor]::new(
$Flags, $Owner, $PrimaryGroup, $SystemACL,$DiscretionaryACL
)
$SecurityDescriptor.GetSddlForm(
[System.Security.AccessControl.AccessControlSections]::All
)
输出结果为:
O:NSG:BAD:P(OA;;CC;;;WD)S:P(OU;SA;CC;;;WD)
2. PowerShell远程会话审计
PowerShell远程会话审计是确保系统安全和合规性的重要手段,主要包括以下几个方面:
2.1 审查有效权限
使用
Get-PSSessionCapability
cmdlet可以枚举特定用户从PowerShell远程端点可用的所有命令。
$PSSessionCapabilityParams = @{
ConfigurationName = 'JEAMaintenance'
Username = 'CONTOSO\HelpdeskUser01'
}
Get-PSSessionCapability @PSSessionCapabilityParams
执行上述代码后,会列出该用户在当前PSRemoting会话中可用的命令,如下表所示:
| CommandType | Name | Version | Source |
| ---- | ---- | ---- | ---- |
| Alias | clear -> Clear-Host | | |
| Alias | cls -> Clear-Host | | |
| Alias | exsn -> Exit-PSSession | | |
| Alias | gcm -> Get-Command | | |
| Alias | measure -> Measure-Object | | |
| Alias | select -> Select-Object | | |
| Function | Clear-Host | | |
| Function | Exit-PSSession | | |
| Function | Get-Command | | |
| Function | Get-FormatData | | |
| Function | Get-Help | | |
| Function | Measure-Object | | |
| Function | Out-Default | | |
| Function | Select-Object | | |
| Cmdlet | Get-Process | 3.0.0.0 | … |
| Cmdlet | Get-Service | 3.0.0.0 | … |
| Cmdlet | Restart-Service | 3.0.0.0 | … |
| Cmdlet | Stop-Process | 3.0.0.0 | … |
同时,建议在委派PowerShell会话或角色功能的访问权限时,使用Active Directory组权限(最好使用基于角色的访问控制(RBAC)Active Directory组模型)。
2.2 使用Pester测试验证有效访问
可以使用Pester测试来验证不同用户的有效访问权限。
$Params = @(
@{
# User1 should have no access to the server
ADUserName = 'CONTOSO\User1'
ExpectedCmdlets = @()
},
@{
# User2 should only have Get-ChildItem
ADUserName = 'CONTOSO\User2'
ExpectedCmdlets = @('Get-ChildItem')
},
@{
# User3 should only have Get-Service and Stop-Service
ADUserName = 'CONTOSO\User3'
ExpectedCmdlets = @('Get-Service', 'Stop-Service')
}
)
Describe "Test PowerShell remoting effective access on $ENV:Computer" {
It "Returns <ExpectedCmdlets> (<ADUserName> on <Computer>)"
-ForEach $Params -Test {
$params = @{
ConfigurationName = 'JEAMaintenance'
UserName = $ADUserName
}
$session = Get-PSSessionCapability @params |
Where-Object CommandType -eq 'Cmdlet'
($session | Sort-Object -Property Name).Name |
Should -Be ($ExpectedCmdlets | Sort-Object)
}
}
2.3 PowerShell事件日志
可以通过组策略启用PowerShell脚本块和模块日志记录,以记录PowerShell JEA会话中执行的每个命令。具体步骤如下:
1. 打开组策略编辑器。
2. 浏览到:计算机配置 \ 管理模板 \ Windows组件 \ Windows PowerShell。
3. 选择“启用PowerShell脚本块日志记录”。
4. 选择“已启用”。
5. 选择“确定”。
6. 重启计算机以应用组策略配置。
需要注意的是,启用“记录脚本块调用开始/停止事件”会生成大量事件。可以将PowerShell事件日志和转录日志合并到Azure Sentinel中,但要注意Azure Sentinel日志记录不是免费的,大量事件可能会导致高额的存储空间费用。
2.4 会话转录日志
PowerShell会话配置提供了PowerShell会话的转录日志功能,允许你分析正在进行的PowerShell远程会话配置。在实施转录时,应将所有转录位置合并到一个受限制的暂存目录中,以便上传到Azure Log Analytics/Sentinel。
2.5 移除现有PowerShell会话
如果不需要默认的PowerShell会话配置,可以使用DSC来禁用它们。
Configuration DisableDefaultPowerShellRemoting
{
Import-DscResource -ModuleName 'PSDesiredStateConfiguration'
Import-DscResource -ModuleName 'WSManDsc'
Node $AllNodes.Where{$_.PSRemotingEnabled}.NodeName {
Script EnablePowerShellRemoting {
SetScript = {
Get-PSSessionConfiguration -Name microsoft.* |
Disable-PSSessionConfiguration
}
GetScript = {
# Fetch all OOBE default PS sessions.
@{
Result = Get-PSSessionConfiguration -Name microsoft.*
}
}
TestScript = {
$state = [scriptblock]::Create($GetScript).Invoke() |
Where-Object Enabled -eq $true
$state.Result -contains $true
}
}
}
}
3. 相关技术点分析
3.1 正则表达式
正则表达式在PowerShell中有着广泛的应用,其主要元素和特性如下:
-
锚点
:用于指定匹配的位置,如字符串的开头、结尾或单词边界。
-
字符类
:用于匹配一组字符中的任意一个。
-
捕获组
:用于捕获匹配的子字符串。
-
回溯
:正则表达式引擎在匹配过程中可能会进行回溯,需要注意避免灾难性回溯。
3.2 运算符优先级
PowerShell中的运算符有不同的优先级,在编写代码时需要注意运算符的优先级,以确保表达式的计算顺序符合预期。例如:
graph LR
A[赋值运算符] --> B[逻辑运算符]
B --> C[比较运算符]
C --> D[算术运算符]
3.3 数据序列化和反序列化
数据的序列化和反序列化在PowerShell中用于数据的存储和传输,常见的格式包括CSV、JSON、XML等。例如:
# 序列化数据为CSV格式
$data = @{Name = 'John'; Age = 30}
$data | Export-Csv -Path 'data.csv' -NoTypeInformation
# 反序列化CSV数据
Import-Csv -Path 'data.csv'
3.4 模块和函数
PowerShell中的模块和函数可以提高代码的复用性和可维护性。可以使用
Import-Module
加载模块,使用
function
定义函数。例如:
Import-Module -Name 'MyModule'
function Get-MyData {
param(
[string]$Name
)
# 函数逻辑
}
3.5 测试框架Pester
Pester是PowerShell中常用的测试框架,可以用于单元测试、集成测试等。使用Pester可以确保代码的正确性和稳定性。例如:
Describe "Test My Function" {
It "Should return correct result" {
$result = Get-MyData -Name 'John'
$result | Should -Be 'Expected Result'
}
}
4. 代码示例及应用场景
4.1 安全描述符创建应用场景
安全描述符的创建在需要精确控制访问权限的场景中非常有用,例如在企业环境中对敏感资源进行访问控制。以下是一个更详细的应用场景示例:
假设企业中有一个共享文件夹,只有特定的用户组才能访问。可以通过创建安全描述符并应用到该文件夹上,实现对访问权限的细粒度控制。
# 假设已经有了$SystemACL和$DiscretionaryACL等对象
$EveroneAuditACE = [System.Security.AccessControl.ObjectAce]::new(
[System.Security.AccessControl.AceFlags]::SuccessfulAccess,
[System.Security.AccessControl.AceQualifier]::SystemAudit,
1,
[System.Security.Principal.SecurityIdentifier]::new('WD'),
[System.Security.AccessControl.ObjectAceFlags]::None,
[System.Guid]::NewGuid(),
[System.Guid]::NewGuid(),
$false,
$null
)
$index = 0
$SystemACL.InsertAce($index, $EveroneAuditACE)
$ControlFlags = [System.Security.AccessControl.ControlFlags]
$Flags = @(
$ControlFlags::DiscretionaryAclPresent
$ControlFlags::SystemAclPresent
$ControlFlags::DiscretionaryAclProtected
$ControlFlags::SystemAclProtected
$ControlFlags::SelfRelative
)
$SecurityDescriptor =
[System.Security.AccessControl.RawSecurityDescriptor]::new(
$Flags, $Owner, $PrimaryGroup, $SystemACL,$DiscretionaryACL
)
$SecurityDescriptor.GetSddlForm(
[System.Security.AccessControl.AccessControlSections]::All
)
# 将安全描述符应用到共享文件夹
$folderPath = '\\server\sharedfolder'
$folder = Get-Item $folderPath
$acl = $folder.GetAccessControl()
$acl.SetSecurityDescriptorSddlForm($SecurityDescriptor.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All))
$folder.SetAccessControl($acl)
4.2 远程会话审计应用场景
远程会话审计在企业的安全管理中起着至关重要的作用,以下是几个具体的应用场景:
-
合规性检查
:企业需要满足各种合规性要求,如GDPR等。通过审查远程会话的有效权限和记录事件日志,可以确保用户的操作符合相关法规。
-
安全事件调查
:当发生安全事件时,如未经授权的访问或异常操作,可以通过查看会话转录日志和事件日志来追溯事件的源头。
-
用户权限管理
:通过定期审查用户的有效权限,可以及时发现并纠正权限滥用的情况,确保用户只能访问其工作所需的资源。
4.3 正则表达式应用场景
正则表达式在文本处理、数据验证等方面有广泛的应用,以下是几个具体的应用场景:
-
数据验证
:验证用户输入的电子邮件地址、电话号码等是否符合格式要求。
$email = 'test@example.com'
if ($email -match '^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$') {
Write-Host 'Valid email address'
} else {
Write-Host 'Invalid email address'
}
- 文本提取 :从大量文本中提取特定格式的信息,如日期、IP地址等。
$text = 'The IP address is 192.168.1.1'
$ipPattern = '\b(?:\d{1,3}\.){3}\d{1,3}\b'
$ipAddress = [regex]::Matches($text, $ipPattern) | Select-Object -ExpandProperty Value
Write-Host "Extracted IP address: $ipAddress"
5. 总结与建议
5.1 总结
通过对PowerShell远程会话管理与安全审计的深入探索,我们了解了安全描述符的创建、远程会话审计的多个方面(包括审查有效权限、使用Pester测试、事件日志和转录日志等),以及正则表达式、运算符优先级、数据序列化和反序列化、模块和函数、测试框架Pester等相关技术点。这些知识和技能可以帮助我们更好地管理和保护PowerShell环境,确保系统的安全性和合规性。
5.2 建议
- 加强安全意识 :在使用PowerShell进行远程会话管理时,要始终牢记安全原则,遵循最小权限原则,定期审查用户权限,避免权限滥用。
- 定期审计 :定期进行远程会话审计,包括审查有效权限、查看事件日志和转录日志等,及时发现并处理安全事件。
- 使用测试框架 :在编写PowerShell代码时,使用Pester等测试框架进行单元测试和集成测试,确保代码的正确性和稳定性。
- 学习和实践 :不断学习和掌握PowerShell的新特性和技术,通过实践来提高自己的技能水平。
以下是一个简单的总结表格:
| 技术点 | 应用场景 | 关键操作 |
| ---- | ---- | ---- |
| 安全描述符创建 | 访问控制 | 创建ACE、添加到ACL、定义控制标志、转换为SDDL格式 |
| 远程会话审计 | 合规性检查、安全事件调查、用户权限管理 | 审查有效权限、使用Pester测试、启用事件日志和转录日志 |
| 正则表达式 | 数据验证、文本提取 | 定义正则表达式模式、使用-match运算符进行匹配 |
| 运算符优先级 | 表达式计算 | 注意运算符的优先级顺序 |
| 数据序列化和反序列化 | 数据存储和传输 | 使用Export-Csv、Import-Csv等命令进行序列化和反序列化 |
| 模块和函数 | 代码复用和可维护性 | 使用Import-Module加载模块、使用function定义函数 |
| 测试框架Pester | 单元测试、集成测试 | 使用Describe和It关键字编写测试用例 |
通过以上的总结和建议,希望能帮助大家更好地应用PowerShell进行远程会话管理和安全审计,提高系统的安全性和可靠性。
超级会员免费看
80

被折叠的 条评论
为什么被折叠?



