Audit dan Pelaporan pada JEA

Setelah menyebarkan JEA, Anda perlu mengaudit konfigurasi JEA secara teratur. Audit membantu Anda menilai bahwa orang yang benar memiliki akses ke titik akhir JEA dan peran yang ditetapkan masih sesuai.

Menemukan sesi JEA terdaftar di komputer

Untuk memeriksa sesi JEA mana yang terdaftar di komputer, gunakan cmdlet Get-PSSessionConfiguration .

# 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

Hak efektif untuk titik akhir tercantum di properti Izin . Pengguna ini memiliki hak untuk terhubung ke titik akhir JEA. Namun, peran dan perintah yang dapat mereka akses ditentukan oleh properti RoleDefinitions dalam file konfigurasi sesi yang digunakan untuk mendaftarkan titik akhir. Perluas properti RoleDefinitions untuk mengevaluasi pemetaan peran di titik akhir JEA terdaftar.

# 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 }
}

Menemukan kemampuan peran yang tersedia di komputer

JEA mendapatkan kemampuan peran dari file yang .psrc disimpan di folder RoleCapabilities di dalam modul PowerShell. Fungsi berikut menemukan semua kemampuan peran yang tersedia di komputer.

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
}

Catatan

Urutan hasil dari fungsi ini belum tentu urutan di mana kemampuan peran akan dipilih jika beberapa kemampuan peran memiliki nama yang sama.

Memeriksa hak efektif untuk pengguna tertentu

Cmdlet Get-PSSessionCapability menghitung semua perintah yang tersedia pada titik akhir JEA berdasarkan keanggotaan grup pengguna. Output Get-PSSessionCapability identik dengan pengguna yang ditentukan yang berjalan Get-Command -CommandType All dalam sesi JEA.

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

Jika pengguna Anda bukan anggota permanen grup yang akan memberi mereka hak JEA tambahan, cmdlet ini mungkin tidak mencerminkan izin tambahan tersebut. Ini terjadi saat menggunakan sistem manajemen akses istimewa just-in-time untuk memungkinkan pengguna untuk sementara termasuk dalam kelompok keamanan. Evaluasi dengan cermat pemetaan pengguna ke peran dan kemampuan untuk memastikan bahwa pengguna hanya mendapatkan tingkat akses yang diperlukan untuk melakukan pekerjaan mereka dengan sukses.

Log peristiwa PowerShell

Jika Anda mengaktifkan pengelogan blok modul atau skrip pada sistem, Anda dapat melihat peristiwa di log peristiwa Windows untuk setiap perintah yang dijalankan pengguna dalam sesi JEA. Untuk menemukan peristiwa ini, buka log peristiwa Microsoft-Windows-PowerShell/Operational dan cari peristiwa dengan ID peristiwa 4104.

Setiap entri log peristiwa menyertakan informasi tentang sesi tempat perintah dijalankan. Untuk sesi JEA, acara ini menyertakan informasi tentang ConnectedUser dan RunAsUser. ConnectedUser adalah pengguna aktual yang membuat sesi JEA. RunAsUser adalah akun JEA yang digunakan untuk menjalankan perintah.

Log peristiwa aplikasi menunjukkan perubahan yang dilakukan oleh RunAsUser. Jadi, mengaktifkan pembuatan log modul dan skrip diperlukan untuk melacak pemanggilan perintah tertentu kembali ke ConnectedUser.

Log peristiwa aplikasi

Perintah yang dijalankan dalam sesi JEA yang berinteraksi dengan aplikasi atau layanan eksternal dapat mencatat peristiwa ke log peristiwa mereka sendiri. Tidak seperti log dan transkrip PowerShell, mekanisme pengelogan lainnya tidak menangkap pengguna sesi JEA yang terhubung. Sebaliknya, aplikasi tersebut hanya mencatat run-as pengguna virtual. Untuk menentukan siapa yang menjalankan perintah, Anda perlu berkonsultasi dengan transkrip sesi atau menghubungkan log peristiwa PowerShell dengan waktu dan pengguna yang ditampilkan di log peristiwa aplikasi.

Log WinRM juga dapat membantu Anda menghubungkan pengguna run-as dengan pengguna yang menghubungkan dalam log peristiwa aplikasi. ID Peristiwa 193 dalam log Manajemen Jarak Jauh/Operasional Microsoft-Windows mencatat pengidentifikasi keamanan (SID) dan nama akun untuk pengguna yang menghubungkan dan berjalan sebagai pengguna untuk setiap sesi JEA baru.

Transkrip sesi

Jika Anda mengonfigurasi JEA untuk membuat transkrip untuk setiap sesi pengguna, salinan teks setiap tindakan pengguna disimpan di folder yang ditentukan.

Perintah berikut (sebagai administrator) menemukan semua direktori transkrip.

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

Setiap transkrip dimulai dengan informasi tentang waktu sesi dimulai, pengguna mana yang terhubung ke sesi, dan identitas JEA mana yang ditetapkan kepada mereka.

**********************
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)
[...]

Isi transkrip berisi informasi tentang setiap perintah yang dipanggil pengguna. Sintaks yang tepat dari perintah yang digunakan tidak tersedia dalam sesi JEA karena cara perintah diubah untuk PowerShell jarak jauh. Namun, Anda masih dapat menentukan perintah efektif yang dijalankan. Di bawah ini adalah contoh cuplikan transkrip dari pengguna yang berjalan Get-Service Dns dalam sesi JEA:

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

Baris CommandInvocation ditulis untuk setiap perintah yang dijalankan pengguna. ParameterBindings merekam setiap parameter dan nilai yang disediakan dengan perintah . Dalam contoh sebelumnya, Anda dapat melihat bahwa nama parameter diberikan dengan nilai Dns untuk Get-Service cmdlet .

Output dari setiap perintah juga memicu CommandInvocation, biasanya ke Out-Default. InputObject adalah Out-Default objek PowerShell yang dikembalikan dari perintah . Detail objek tersebut dicetak beberapa baris di bawah ini, meniadakan dengan cermat apa yang akan dilihat pengguna.

Lihat juga

Posting blog Tim Biru PowerShell ♥ tentang keamanan