38、深入探索PowerShell远程会话管理与安全审计

深入探索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进行远程会话管理和安全审计,提高系统的安全性和可靠性。

**项目名称:** 基于Vue.jsSpring Cloud架构的博客系统设计开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值