JEA 审核和报告

部署 JEA 后,需要定期审核 JEA 配置。 审核可帮助你评估正确的人员是否有权访问 JEA 终结点及其分配的角色。

在计算机上查找已注册的 JEA 会话

若要检查计算机上注册了哪些 JEA 会话,请使用 Get-PSSessionConfiguration cmdlet。

# Filter for sessions that are configured as 'RestrictedRemoteServer' to
# find JEA-like session configurations
Get-PSSessionConfiguration | Where-Object { $_.SessionType -eq 'RestrictedRemoteServer' }
Name          : JEAMaintenance
PSVersion     : 5.1
StartupScript :
RunAsUser     :
Permission    : CONTOSO\JEA_DNS_ADMINS AccessAllowed, CONTOSO\JEA_DNS_OPERATORS AccessAllowed,
                CONTOSO\JEA_DNS_AUDITORS AccessAllowed

终结点的有效权限列在 Permission 属性中。 这些用户有权连接到 JEA 终结点。 但是,他们有权访问的角色和命令由用于注册终结点的会话配置文件中的 RoleDefinitions 属性确定。 展开 RoleDefinitions 属性以评估已注册 JEA 终结点中的角色映射。

# Get the desired session configuration
$jea = Get-PSSessionConfiguration -Name 'JEAMaintenance'

# Enumerate users/groups and which roles they have access to
$jea.RoleDefinitions.GetEnumerator() | Select-Object Name, @{
  Name = 'Role Capabilities'
  Expression = { $_.Value.RoleCapabilities }
}

在计算机上查找可用的角色功能

JEA 从 .psrc PowerShell 模块中 RoleCapabilities 文件夹中存储的文件获取角色功能。 以下函数查找计算机上可用的所有角色功能。

function Find-LocalRoleCapability {
    $results = @()

    # Find modules with a "RoleCapabilities" subfolder and add any PSRC files to the result set
    Get-Module -ListAvailable | ForEach-Object {
        $psrcpath = Join-Path -Path $_.ModuleBase -ChildPath 'RoleCapabilities'
        if (Test-Path $psrcpath) {
            $results += Get-ChildItem -Path $psrcpath -Filter *.psrc
        }
    }

    # Format the results nicely to make it easier to read
    $results | Select-Object @{ Name = 'Name'; Expression = { $_.Name.TrimEnd('.psrc') }}, @{
        Name = 'Path'; Expression = { $_.FullName }
    } | Sort-Object Name
}

注释

如果多个角色功能共享同名,则此函数的结果顺序不一定是选择角色功能的顺序。

检查特定用户的有效权限

Get-PSSessionCapability cmdlet 根据用户的组成员身份枚举 JEA 终结点上可用的所有命令。 Get-PSSessionCapability输出与 JEA 会话中运行的Get-Command -CommandType All指定用户输出相同。

Get-PSSessionCapability -ConfigurationName 'JEAMaintenance' -Username 'CONTOSO\Alice'

如果你的用户不是授予他们其他 JEA 权限的组的常任理事国,则此 cmdlet 可能不会反映这些额外的权限。 使用实时特权访问管理系统允许用户暂时属于安全组时,会出现这种情况。 仔细评估用户与角色和功能的映射,以确保用户仅获得成功执行其作业所需的访问权限级别。

PowerShell 事件日志

如果在系统上启用了模块或脚本块日志记录,可以在 Windows 事件日志中查看用户在 JEA 会话中运行的每个命令的事件。 若要查找这些事件,请打开 Microsoft-Windows-PowerShell/作 事件日志,并查找事件 ID 为 4104 的事件。

每个事件日志条目都包含有关运行命令的会话的信息。 对于 JEA 会话,事件包括 有关 ConnectedUserRunAsUser 的信息。 ConnectedUser 是创建 JEA 会话的实际用户。 RunAsUser 是用于执行命令的帐户 JEA。

应用程序事件日志显示 RunAsUser 所做的更改。 因此,需要启用模块和脚本日志记录才能跟踪回 ConnectedUser 的特定命令调用。

应用程序事件日志

命令在与外部应用程序或服务交互的 JEA 会话中运行,这些命令可能会将事件记录到其自己的事件日志中。 与 PowerShell 日志和脚本不同,其他日志记录机制不会捕获 JEA 会话的连接用户。 相反,这些应用程序仅记录虚拟运行方式用户。 若要确定谁运行了该命令,需要查阅 会话脚本 或将 PowerShell 事件日志与应用程序事件日志中显示的时间和用户相关联。

WinRM 日志还有助于将运行方式用户与应用程序事件日志中的连接用户相关联。 Microsoft-Windows-Windows 远程管理/作日志记录中Microsoft的事件 ID 193 记录连接用户的安全标识符(SID)和帐户名称,并为每个新的 JEA 会话以用户身份运行。

会话记录

如果将 JEA 配置为为每个用户会话创建脚本,则每个用户作的文本副本将存储在指定的文件夹中。

以下命令(以管理员身份)查找所有脚本目录。

Get-PSSessionConfiguration |
  Where-Object { $_.TranscriptDirectory -ne $null } |
    Format-Table Name, TranscriptDirectory

每个脚本都从会话开始的时间、连接到会话的用户以及分配给会话的 JEA 标识的信息开始。

**********************
Windows PowerShell transcript start
Start time: 20160710144736
Username: CONTOSO\Alice
RunAs User: WinRM Virtual Users\WinRM VA_1_CONTOSO_Alice
Machine: SERVER01 (Microsoft Windows NT 10.0.14393.0)
[...]

脚本正文包含有关用户调用的每个命令的信息。 由于对 PowerShell 远程处理转换命令的方式,使用的命令的确切语法在 JEA 会话中不可用。 但是,仍可以确定已执行的有效命令。 下面是 JEA 会话中运行 Get-Service Dns 的用户的示例脚本片段:

PS>CommandInvocation(Get-Service): "Get-Service"
>> ParameterBinding(Get-Service): name="Name"; value="Dns"
>> CommandInvocation(Out-Default): "Out-Default"
>> ParameterBinding(Out-Default): name="InputObject"; value="Dns"

Running  Dns                DNS Server

将为用户运行的每个命令编写 CommandInvocation 行。 ParameterBindings 记录命令提供的每个参数和值。 在前面的示例中,可以看到参数名称已为 cmdlet 提供值 DnsGet-Service

每个命令的输出也会触发 CommandInvocation,通常触发 。Out-DefaultInputObjectOut-Default 是从命令返回的 PowerShell 对象。 该对象的详细信息将打印下面的几行,仔细模拟用户将看到的内容。

另请参阅

PowerShell ♥ 蓝队 关于安全性的博客文章