Bagikan melalui


Kemampuan Peran JEA

Saat membuat titik akhir JEA, Anda perlu menentukan satu atau beberapa kemampuan peran yang menjelaskan apa yang dapat dilakukan seseorang dalam sesi JEA. Kemampuan peran adalah file data PowerShell dengan .psrc ekstensi yang mencantumkan semua cmdlet, fungsi, penyedia, dan program eksternal yang tersedia untuk menghubungkan pengguna.

Menentukan perintah mana yang akan diizinkan

Langkah pertama dalam membuat file kemampuan peran adalah mempertimbangkan apa yang perlu diakses pengguna. Proses pengumpulan persyaratan dapat memakan waktu cukup lama, tetapi penting. Memberi pengguna akses ke terlalu sedikit cmdlet dan fungsi dapat mencegah mereka menyelesaikan pekerjaan mereka. Memungkinkan akses ke terlalu banyak cmdlet dan fungsi dapat memungkinkan pengguna untuk melakukan lebih dari yang Anda inginkan dan melemahkan sikap keamanan Anda.

Cara Anda membahas proses ini tergantung pada organisasi dan tujuan Anda. Tips berikut dapat membantu memastikan Anda berada di jalur yang benar.

  1. Identifikasi perintah yang digunakan pengguna untuk menyelesaikan pekerjaan mereka. Ini mungkin melibatkan staf TI survei, memeriksa skrip otomatisasi, atau menganalisis transkrip dan log sesi PowerShell.
  2. Perbarui penggunaan alat baris perintah ke setara PowerShell, jika memungkinkan, untuk pengalaman auditing dan penyesuaian JEA terbaik. Program eksternal tidak dapat dibatasi secara terperinci seperti cmdlet dan fungsi PowerShell asli di JEA.
  3. Batasi cakupan cmdlet untuk hanya mengizinkan parameter atau nilai parameter tertentu. Ini sangat penting jika pengguna hanya harus mengelola bagian dari sistem.
  4. Buat fungsi kustom untuk menggantikan perintah atau perintah kompleks yang sulit dibatasi di JEA. Fungsi sederhana yang membungkus perintah kompleks atau menerapkan logika validasi tambahan dapat menawarkan kontrol tambahan untuk admin dan kesederhanaan pengguna akhir.
  5. Uji daftar lingkup perintah yang diizinkan dengan pengguna atau layanan otomatisasi Anda, dan sesuaikan seperlunya.

Contoh perintah yang berpotensi berbahaya

Pemilihan perintah yang cermat penting untuk memastikan titik akhir JEA tidak memungkinkan pengguna untuk meningkatkan izin mereka.

Penting

Informasi penting yang diperlukan untuk keberhasilan penggunaPengguna dalam sesi JEA sering dijalankan dengan hak istimewa yang ditinggikan.

Daftar berikut berisi contoh perintah yang dapat digunakan dengan berbahaya jika diizinkan dalam keadaan tidak dibatasi. Ini bukan daftar lengkap dan hanya boleh digunakan sebagai titik awal yang hati-hati.

  • Risiko: Memberikan hak istimewa admin pengguna yang terhubung untuk melewati JEA

    Contoh:

    Add-LocalGroupMember -Member 'CONTOSO\jdoe' -Group 'Administrators'
    

    Perintah terkait:

    • Add-ADGroupMember
    • Add-LocalGroupMember
    • net.exe
    • dsadd.exe
  • Risiko: Menjalankan kode arbitrer, seperti malware, eksploitasi, atau skrip kustom untuk melewati perlindungan

    Contoh:

    Start-Process -FilePath '\\san\share\malware.exe'
    

    Perintah terkait:

    • Start-Process
    • New-Service
    • Invoke-Item
    • Invoke-WmiMethod
    • Invoke-CimMethod
    • Invoke-Expression
    • Invoke-Command
    • New-ScheduledTask
    • Register-ScheduledJob

Membuat file kemampuan peran

Anda dapat membuat file kemampuan peran PowerShell baru dan kosong menggunakan cmdlet New-PSRoleCapabilityFile.

New-PSRoleCapabilityFile -Path .\MyFirstJEARole.psrc

Anda harus mengedit file kemampuan peran yang dibuat untuk hanya mengizinkan perintah yang diperlukan untuk peran tersebut. Dokumentasi bantuan PowerShell berisi beberapa contoh cara mengonfigurasi file.

Mengizinkan cmdlet dan fungsi PowerShell

Untuk mengotorisasi pengguna untuk menjalankan cmdlet atau fungsi PowerShell, tambahkan cmdlet atau nama fungsi ke bidang VisibleCmdlets atau VisibleFunctions . Jika Anda tidak yakin apakah perintah adalah cmdlet atau fungsi, Anda dapat menjalankan Get-Command <name> dan memeriksa properti CommandType dalam output.

VisibleCmdlets = @('Restart-Computer', 'Get-NetIPAddress')

Terkadang cakupan cmdlet atau fungsi tertentu terlalu luas untuk kebutuhan pengguna Anda. Admin DNS, misalnya, mungkin hanya memerlukan akses untuk memulai ulang layanan DNS. Di lingkungan multi-penyewa, penyewa memiliki akses ke alat manajemen layanan mandiri. Penyewa harus dibatasi untuk mengelola sumber daya mereka sendiri. Untuk kasus ini, Anda dapat membatasi parameter mana yang diekspos dari cmdlet atau fungsi.

VisibleCmdlets = @{
    Name       = 'Restart-Computer'
    Parameters = @{ Name = 'Name' }
}

Dalam skenario yang lebih canggih, Anda mungkin juga perlu membatasi nilai yang dapat digunakan pengguna dengan parameter ini. Kemampuan peran memungkinkan Anda menentukan sekumpulan nilai atau pola ekspresi reguler yang menentukan input apa yang diizinkan.

VisibleCmdlets = @(
    @{
        Name       = 'Restart-Service'
        Parameters = @{ Name = 'Name'; ValidateSet = @('Dns', 'Spooler') }
    }
    @{
        Name       = 'Start-Website'
        Parameters = @{ Name = 'Name'; ValidatePattern = 'HR_*' }
    }
)

Catatan

Parameter PowerShell umum selalu diizinkan, bahkan jika Anda membatasi parameter yang tersedia. Anda tidak boleh mencantumkannya secara eksplisit di bidang Parameter.

Daftar di bawah ini menjelaskan berbagai cara Anda dapat menyesuaikan cmdlet atau fungsi yang terlihat. Anda dapat mencampur dan mencocokkan salah satu hal di bawah ini di bidang VisibleCmdlets .

  • Kasus penggunaan: Izinkan pengguna untuk berjalan My-Func tanpa batasan pada parameter.

    @{ Name = 'My-Func' }
    
  • Kasus penggunaan: Izinkan pengguna untuk menjalankan My-Func dari modul MyModule tanpa batasan pada parameter.

    @{ Name = 'MyModule\My-Func' }
    
  • Kasus penggunaan: Izinkan pengguna untuk menjalankan cmdlet atau fungsi apa pun dengan kata kerja My.

    @{ Name = 'My-*' }
    
  • Kasus penggunaan: Izinkan pengguna untuk menjalankan cmdlet atau fungsi apa pun dengan kata benda Func.

    @{ Name = '*-Func' }
    
  • Kasus penggunaan: Izinkan pengguna untuk berjalan My-Func dengan Param1 parameter dan Param2 . Nilai apa pun dapat diberikan ke parameter.

    @{ Name = 'My-Func'; Parameters = @{ Name = 'Param1'}, @{ Name = 'Param2' }}
    
  • Kasus penggunaan: Izinkan pengguna untuk berjalan My-Func dengan Param1 parameter . Hanya Value1 dan Value2 dapat disediakan ke parameter .

    @{
        Name       = 'My-Func'
        Parameters = @{ Name = 'Param1'; ValidateSet = @('Value1', 'Value2') }
    }
    
  • Kasus penggunaan: Izinkan pengguna untuk berjalan My-Func dengan Param1 parameter . Nilai apa pun yang dimulai dengan contoso dapat diberikan ke parameter .

    @{
        Name       = 'My-Func'
        Parameters = @{ Name = 'Param1'; ValidatePattern = 'contoso.*' }
    }
    

Peringatan

Untuk praktik keamanan terbaik, tidak disarankan untuk menggunakan kartubebas saat menentukan cmdlet atau fungsi yang terlihat. Sebagai gantinya, Anda harus secara eksplisit mencantumkan setiap perintah tepercaya untuk memastikan tidak ada perintah lain yang memiliki skema penamaan yang sama yang tidak diotorisasi secara tidak sengaja.

Anda tidak dapat menerapkan ValidatePattern dan ValidateSet ke cmdlet atau fungsi yang sama.

Jika Anda melakukannya, ValidatePattern akan mengambil alih ValidateSet.

Untuk informasi selengkapnya tentang ValidatePattern, lihat postingan Hey, Scripting Guy! dan konten referensi PowerShell Regular Expressions ini.

Mengizinkan perintah eksternal dan skrip PowerShell

Untuk mengizinkan pengguna menjalankan executable dan skrip PowerShell (.ps1) dalam sesi JEA, Anda harus menambahkan jalur lengkap ke setiap program di bidang VisibleExternalCommands .

VisibleExternalCommands = @(
    'C:\Windows\System32\whoami.exe'
    'C:\Program Files\Contoso\Scripts\UpdateITSoftware.ps1'
)

Jika memungkinkan, gunakan cmdlet PowerShell atau fungsi yang setara untuk setiap executable eksternal yang Anda otorisasi karena Anda memiliki kontrol atas parameter yang diizinkan dengan cmdlet dan fungsi PowerShell.

Banyak executable memungkinkan Anda membaca status saat ini dan kemudian mengubahnya dengan menyediakan parameter yang berbeda.

Misalnya, pertimbangkan peran admin server file yang mengelola berbagi jaringan yang dihosting pada sistem. Salah satu cara mengelola berbagi adalah dengan menggunakan net share. Namun, mengizinkan net.exe berbahaya karena pengguna dapat menggunakan perintah untuk mendapatkan hak istimewa admin dengan perintah net group Administrators unprivilegedjeauser /add. Opsi yang lebih aman adalah mengizinkan cmdlet Get-SmbShare , yang mencapai hasil yang sama tetapi memiliki cakupan yang jauh lebih terbatas.

Saat membuat perintah eksternal tersedia untuk pengguna dalam sesi JEA, selalu tentukan jalur lengkap ke yang dapat dieksekusi. Ini mencegah eksekusi program bernama dan berpotensi berbahaya yang terletak di tempat lain pada sistem.

Mengizinkan akses ke penyedia PowerShell

Secara default, tidak ada penyedia PowerShell yang tersedia dalam sesi JEA. Ini mengurangi risiko informasi sensitif dan pengaturan konfigurasi yang diungkapkan ke pengguna yang menghubungkan.

Jika perlu, Anda dapat mengizinkan akses ke penyedia PowerShell menggunakan VisibleProviders perintah . Untuk daftar lengkap penyedia, jalankan Get-PSProvider.

VisibleProviders = 'Registry'

Untuk tugas sederhana yang memerlukan akses ke sistem file, registri, penyimpanan sertifikat, atau penyedia sensitif lainnya, pertimbangkan untuk menulis fungsi kustom yang berfungsi dengan penyedia atas nama pengguna. Fungsi, cmdlet, dan program eksternal yang tersedia dalam sesi JEA tidak tunduk pada batasan yang sama dengan JEA. Mereka dapat mengakses penyedia apa pun secara default. Pertimbangkan juga untuk menggunakan drive pengguna saat pengguna perlu menyalin file ke atau dari titik akhir JEA.

Membuat fungsi kustom

Anda dapat menulis fungsi kustom dalam file kemampuan peran untuk menyederhanakan tugas kompleks bagi pengguna akhir Anda. Fungsi kustom juga berguna ketika Anda memerlukan logika validasi tingkat lanjut untuk nilai parameter cmdlet. Anda dapat menulis fungsi sederhana di bidang FunctionDefinitions :

VisibleFunctions = 'Get-TopProcess'

FunctionDefinitions = @{
    Name        = 'Get-TopProcess'
    ScriptBlock = {
        param($Count = 10)

        Get-Process |
            Sort-Object -Property CPU -Descending |
            Microsoft.PowerShell.Utility\Select-Object -First $Count
    }
}

Penting

Jangan lupa untuk menambahkan nama fungsi kustom Anda ke bidang VisibleFunctions sehingga dapat dijalankan oleh pengguna JEA.

Isi (blok skrip) fungsi kustom berjalan dalam mode bahasa default untuk sistem dan tidak tunduk pada batasan bahasa JEA. Ini berarti bahwa fungsi dapat mengakses sistem file dan registri, dan menjalankan perintah yang tidak dibuat terlihat dalam file kemampuan peran. Berhati-hatilah untuk menghindari menjalankan kode arbitrer saat menggunakan parameter. Hindari masukan pengguna perpipaan langsung ke cmdlet seperti Invoke-Expression.

Dalam contoh di atas, perhatikan bahwa nama modul yang sepenuhnya memenuhi syarat (FQMN) Microsoft.PowerShell.Utility\Select-Object digunakan alih-alih singkatan Select-Object. Fungsi yang ditentukan dalam file kemampuan peran masih tunduk pada cakupan sesi JEA, yang mencakup fungsi proksi yang dibuat JEA untuk membatasi perintah yang ada.

Secara default, Select-Object adalah cmdlet yang dibatasi di semua sesi JEA yang tidak memungkinkan pemilihan properti arbitrer pada objek. Untuk menggunakan fungsi yang tidak dibatasi Select-Object , Anda harus secara eksplisit meminta implementasi penuh menggunakan FQMN. Setiap cmdlet yang dibatasi dalam sesi JEA memiliki batasan yang sama ketika dipanggil dari fungsi. Untuk informasi selengkapnya, lihat about_Command_Precedence.

Jika Anda menulis beberapa fungsi kustom, lebih mudah untuk menempatkannya dalam modul skrip PowerShell. Anda membuat fungsi tersebut terlihat dalam sesi JEA menggunakan bidang VisibleFunctions seperti yang Anda lakukan dengan modul bawaan dan pihak ketiga.

Agar penyelesaian tab berfungsi dengan baik dalam sesi JEA, Anda harus menyertakan fungsi tabexpansion2 bawaan dalam daftar VisibleFunctions .

Membuat kemampuan peran tersedia untuk konfigurasi

Sebelum PowerShell 6, agar PowerShell menemukan file kemampuan peran, powerShell harus disimpan dalam RoleCapabilities folder dalam modul PowerShell. Modul dapat disimpan dalam folder apa pun yang disertakan dalam $env:PSModulePath variabel lingkungan, namun Anda tidak boleh menempatkannya di dalam atau folder di $env:SystemRoot\System32 mana pengguna yang tidak tepercaya dapat mengubah file.

Contoh berikut membuat modul skrip PowerShell yang disebut ContosoJEA di $env:ProgramFiles jalur untuk menghosting file kemampuan peran.

# Create a folder for the module
$modulePath = Join-Path $env:ProgramFiles "WindowsPowerShell\Modules\ContosoJEA"
New-Item -ItemType Directory -Path $modulePath

# Create an empty script module and module manifest.
# At least one file in the module folder must have the same name as the folder itself.
$rootModulePath = Join-Path $modulePath "ContosoJEAFunctions.psm1"
$moduleManifestPath = Join-Path $modulePath "ContosoJEA.psd1"
New-Item -ItemType File -Path $RootModulePath
New-ModuleManifest -Path $moduleManifestPath -RootModule "ContosoJEAFunctions.psm1"

# Create the RoleCapabilities folder and copy in the PSRC file
$rcFolder = Join-Path $modulePath "RoleCapabilities"
New-Item -ItemType Directory $rcFolder
Copy-Item -Path .\MyFirstJEARole.psrc -Destination $rcFolder

Untuk informasi selengkapnya tentang modul PowerShell, lihat Memahami Modul PowerShell.

Dimulai di PowerShell 6, properti RoleDefinitions ditambahkan ke file konfigurasi sesi. Properti ini memungkinkan Anda menentukan lokasi file konfigurasi peran untuk definisi peran Anda. Lihat contoh di New-PSSessionConfigurationFile.

Memperbarui kemampuan peran

Anda dapat mengedit file kemampuan peran untuk memperbarui pengaturan kapan saja. Setiap sesi JEA baru dimulai setelah kemampuan peran diperbarui akan mencerminkan kemampuan yang direvisi.

Inilah sebabnya mengapa mengontrol akses ke folder kemampuan peran sangat penting. Hanya administrator yang sangat tepercaya yang harus diizinkan untuk mengubah file kemampuan peran. Jika pengguna yang tidak tepercaya dapat mengubah file kemampuan peran, mereka dapat dengan mudah memberi diri mereka akses ke cmdlet yang memungkinkan mereka meningkatkan hak istimewa mereka.

Bagi administrator yang ingin mengunci akses ke kemampuan peran, pastikan Sistem Lokal memiliki akses baca-saja ke file kemampuan peran dan berisi modul.

Bagaimana kemampuan peran digabungkan

Pengguna diberikan akses ke semua kemampuan peran yang cocok dalam file konfigurasi sesi saat mereka memasuki sesi JEA. JEA mencoba memberi pengguna serangkaian perintah paling permisif yang diizinkan oleh salah satu peran.

VisibleCmdlets dan VisibleFunctions

Logika penggabungan yang paling kompleks memengaruhi cmdlet dan fungsi, yang dapat membatasi parameter dan nilai parameternya di JEA.

Aturannya adalah sebagai berikut:

  1. Jika cmdlet hanya dibuat terlihat dalam satu peran, cmdlet terlihat oleh pengguna dengan batasan parameter yang berlaku.
  2. Jika cmdlet dibuat terlihat dalam lebih dari satu peran, dan setiap peran memiliki batasan yang sama pada cmdlet, cmdlet terlihat oleh pengguna dengan batasan tersebut.
  3. Jika cmdlet dibuat terlihat dalam lebih dari satu peran, dan setiap peran memungkinkan serangkaian parameter yang berbeda, cmdlet dan semua parameter yang ditentukan di setiap peran terlihat oleh pengguna. Jika satu peran tidak memiliki batasan pada parameter, semua parameter diizinkan.
  4. Jika satu peran mendefinisikan kumpulan validasi atau memvalidasi pola untuk parameter cmdlet, dan peran lainnya memungkinkan parameter tetapi tidak membatasi nilai parameter, kumpulan atau pola validasi diabaikan.
  5. Jika set validasi didefinisikan untuk parameter cmdlet yang sama dalam lebih dari satu peran, semua nilai dari semua set validasi diizinkan.
  6. Jika pola validasi didefinisikan untuk parameter cmdlet yang sama dalam lebih dari satu peran, nilai apa pun yang cocok dengan salah satu pola diizinkan.
  7. Jika set validasi didefinisikan dalam satu atau beberapa peran, dan pola validasi ditentukan dalam peran lain untuk parameter cmdlet yang sama, set validasi diabaikan dan aturan (6) berlaku untuk pola validasi yang tersisa.

Di bawah ini adalah contoh bagaimana peran digabungkan sesuai dengan aturan ini:

# Role A Visible Cmdlets
$roleA = @{
    VisibleCmdlets = @(
        'Get-Service'
         @{
            Name       = 'Restart-Service'
            Parameters = @{ Name = 'DisplayName'; ValidateSet = 'DNS Client' }
        }
    )
}

# Role B Visible Cmdlets
$roleB = @{
    VisibleCmdlets = @(
        @{
            Name       = 'Get-Service';
            Parameters = @{ Name = 'DisplayName'; ValidatePattern = 'DNS.*' }
        }
        @{
            Name       = 'Restart-Service'
            Parameters = @{ Name = 'DisplayName'; ValidateSet = 'DNS Server' }
        }
    )
}

# Resulting permissions for a user who belongs to both role A and B
# - The constraint in role B for the DisplayName parameter on Get-Service
#   is ignored because of rule #4
# - The ValidateSets for Restart-Service are merged because both roles use
#   ValidateSet on the same parameter per rule #5
$mergedAandB = @{
    VisibleCmdlets = @(
        'Get-Service'
        @{
            Name = 'Restart-Service';
            Parameters = @{
                Name = 'DisplayName'
                ValidateSet = 'DNS Client', 'DNS Server'
            }
        }
    )
}

VisibleExternalCommands, VisibleAliases, VisibleProviders, ScriptsToProcess

Semua bidang lain dalam file kemampuan peran ditambahkan ke sekumpulan kumulatif perintah eksternal, alias, penyedia, dan skrip startup yang diizinkan. Setiap perintah, alias, penyedia, atau skrip yang tersedia dalam satu kemampuan peran tersedia untuk pengguna JEA.

Berhati-hatilah untuk memastikan bahwa kumpulan penyedia gabungan dari satu kemampuan peran dan cmdlet/fungsi/perintah dari yang lain tidak memungkinkan pengguna mengakses sumber daya sistem secara tidak disengaja. Misalnya, jika satu peran memungkinkan Remove-Item cmdlet dan peran lain memungkinkan FileSystem penyedia, Anda berisiko menghapus file arbitrer pengguna JEA di komputer Anda. Informasi tambahan tentang mengidentifikasi izin efektif pengguna dapat ditemukan di artikel JEA audit.

Langkah berikutnya

Membuat file konfigurasi sesi