Funkce role JEA
Při vytváření koncového bodu JEA je potřeba definovat jednu nebo více funkcí rolí, které popisují, co může někdo dělat v relaci JEA. Funkce role je datový soubor PowerShellu s příponou .psrc
, která obsahuje seznam všech rutin, funkcí, poskytovatelů a externích programů, které jsou dostupné pro připojení uživatelů.
Určení příkazů, které mají být povoleny
Prvním krokem při vytváření souboru schopností role je zvážit, k čemu uživatelé potřebují přístup. Proces shromažďování požadavků může nějakou dobu trvat, ale je důležité. Udělení přístupu uživatelům k příliš málo rutinám a funkcím může zabránit tomu, aby se jejich práce dokončila. Povolení přístupu k příliš mnoha rutinám a funkcím umožňuje uživatelům dělat víc, než jste chtěli, a oslabit postoj k zabezpečení.
Postup tohoto procesu závisí na vaší organizaci a cílech. Následující tipy vám můžou pomoct zajistit, že jste na správné cestě.
- Identifikujte příkazy, které uživatelé používají k provedení svých úloh. To může zahrnovat průzkum pracovníků IT, kontrolu automatizačních skriptů nebo analýzu přepisů a protokolů relace PowerShellu.
- Pokud je to možné, aktualizujte použití nástrojů příkazového řádku na ekvivalenty PowerShellu, aby se co nejlépe auditování a přizpůsobení JEA. Externí programy není možné omezit tak podrobně jako nativní rutiny a funkce PowerShellu v JEA.
- Omezte rozsah rutin tak, aby povolovaly jenom konkrétní parametry nebo hodnoty parametrů. To je zvlášť důležité, pokud by uživatelé měli spravovat jenom část systému.
- Vytvořte vlastní funkce, které nahradí složité příkazy nebo příkazy, které se obtížně omezují v JEA. Jednoduchá funkce, která zabalí složitý příkaz nebo použije další logiku ověřování, může nabídnout další kontrolu nad jednoduchostí správců a koncových uživatelů.
- Otestujte vymezený seznam povolených příkazů s uživateli nebo automatizačními službami a podle potřeby upravte.
Příklady potenciálně nebezpečných příkazů
Při pečlivém výběru příkazů je důležité zajistit, aby koncový bod JEA nepovolil uživateli zvýšit svá oprávnění.
Důležité
Základní informace vyžadované pro uživatele successCommands v relaci JEA se často spouštějí se zvýšenými oprávněními.
Následující seznam obsahuje příklady příkazů, které se dají použít se zlými úmysly, pokud jsou povolené v nekontrénovaném stavu. Nejedná se o vyčerpávající seznam a měl by být použit pouze jako upozornění.
Riziko: Udělení oprávnění pro připojení správce uživatele k obejití JEA
Příklad:
Add-LocalGroupMember -Member 'CONTOSO\jdoe' -Group 'Administrators'
Související příkazy:
Add-ADGroupMember
Add-LocalGroupMember
net.exe
dsadd.exe
Riziko: Spuštění libovolného kódu, jako je malware, zneužití nebo vlastní skripty pro obejití ochrany
Příklad:
Start-Process -FilePath '\\san\share\malware.exe'
Související příkazy:
Start-Process
New-Service
Invoke-Item
Invoke-WmiMethod
Invoke-CimMethod
Invoke-Expression
Invoke-Command
New-ScheduledTask
Register-ScheduledJob
Vytvoření souboru schopností role
Nový soubor funkcí role PowerShellu můžete vytvořit pomocí rutiny New-PSRoleCapabilityFile .
New-PSRoleCapabilityFile -Path .\MyFirstJEARole.psrc
Vytvořený soubor schopností role byste měli upravit tak, aby umožňoval pouze příkazy požadované pro tuto roli. Dokumentace nápovědy k PowerShellu obsahuje několik příkladů konfigurace souboru.
Povolení rutin a funkcí PowerShellu
Pokud chcete uživatelům autorizovat spouštění rutin nebo funkcí PowerShellu, přidejte rutinu nebo název funkce do polí VisibleCmdlets nebo VisibleFunctions . Pokud si nejste jistí, jestli je příkazem rutina nebo funkce, můžete ve výstupu spustit Get-Command <name>
a zkontrolovat vlastnost CommandType .
VisibleCmdlets = @('Restart-Computer', 'Get-NetIPAddress')
Rozsah konkrétní rutiny nebo funkce je někdy příliš široký pro potřeby uživatelů. Správce DNS může například potřebovat přístup jenom k restartování služby DNS. V prostředích s více tenanty mají tenanti přístup k nástrojům pro samoobslužnou správu. Tenanti by měli být omezeni na správu vlastních prostředků. V těchto případech můžete omezit, které parametry se z rutiny nebo funkce zveřejňují.
VisibleCmdlets = @{
Name = 'Restart-Computer'
Parameters = @{ Name = 'Name' }
}
V pokročilejších scénářích může být také potřeba omezit hodnoty, které může uživatel s těmito parametry používat. Funkce rolí umožňují definovat sadu hodnot nebo vzor regulárního výrazu, který určuje, jaký vstup je povolený.
VisibleCmdlets = @(
@{
Name = 'Restart-Service'
Parameters = @{ Name = 'Name'; ValidateSet = @('Dns', 'Spooler') }
}
@{
Name = 'Start-Website'
Parameters = @{ Name = 'Name'; ValidatePattern = 'HR_*' }
}
)
Poznámka:
Běžné parametry PowerShellu jsou vždy povolené, i když omezíte dostupné parametry. V poli Parametry byste je neměli explicitně vypsat.
Následující seznam popisuje různé způsoby přizpůsobení viditelné rutiny nebo funkce. V poli VisibleCmdlets můžete kombinovat a shodovat libovolnou z následujících možností.
Případ použití: Umožňuje uživateli spustit
My-Func
bez jakýchkoli omezení parametrů.@{ Name = 'My-Func' }
Případ použití: Umožňuje uživateli spouštět
My-Func
z modulu MyModule bez jakýchkoli omezení parametrů.@{ Name = 'MyModule\My-Func' }
Případ použití: Umožňuje uživateli spustit libovolnou rutinu nebo funkci s příkazem
My
.@{ Name = 'My-*' }
Případ použití: Umožňuje uživateli spustit libovolnou rutinu nebo funkci se podstatným jménam
Func
.@{ Name = '*-Func' }
Případ použití: Umožňuje uživateli spouštět
My-Func
s parametryParam1
.Param2
Do parametrů lze zadat libovolnou hodnotu.@{ Name = 'My-Func'; Parameters = @{ Name = 'Param1'}, @{ Name = 'Param2' }}
Případ použití: Umožňuje uživateli spustit
My-Func
s parametremParam1
. PouzeValue1
parametrValue2
lze zadat.@{ Name = 'My-Func' Parameters = @{ Name = 'Param1'; ValidateSet = @('Value1', 'Value2') } }
Případ použití: Umožňuje uživateli spustit
My-Func
s parametremParam1
. Do parametru lze zadat libovolnou hodnotu začínajícícontoso
na hodnotu.@{ Name = 'My-Func' Parameters = @{ Name = 'Param1'; ValidatePattern = 'contoso.*' } }
Upozorňující
V případě osvědčených postupů zabezpečení se nedoporučuje používat zástupné cardy při definování viditelných rutin nebo funkcí. Místo toho byste měli explicitně uvést každý důvěryhodný příkaz, abyste zajistili, že žádné jiné příkazy, které sdílejí stejné schéma pojmenování, nejsou neúmyslně autorizované.
U stejné rutiny nebo funkce nemůžete použít funkci ValidatePattern i ValidateSet .
Pokud ano, ValidatePattern přepíše ValidateSet.
Další informace o funkci ValidatePattern najdete v tomto příspěvku Hey, Scripting Guy! a referenčním obsahu regulárních výrazů PowerShellu.
Povolení externích příkazů a skriptů PowerShellu
Pokud chcete uživatelům povolit spouštění spustitelných souborů a skriptů PowerShellu (.ps1
) v relaci JEA, musíte do každého programu přidat úplnou cestu do pole VisibleExternalCommands .
VisibleExternalCommands = @(
'C:\Windows\System32\whoami.exe'
'C:\Program Files\Contoso\Scripts\UpdateITSoftware.ps1'
)
Pokud je to možné, použijte rutinu PowerShellu nebo ekvivalenty funkcí pro všechny externí spustitelné soubory, které autorizujete, protože máte kontrolu nad parametry povolenými rutinami a funkcemi PowerShellu.
Mnoho spustitelných souborů umožňuje číst aktuální stav a pak ho změnit zadáním různých parametrů.
Představte si například roli správce souborového serveru, která spravuje sdílené síťové složky hostované v systému. Jedním ze způsobů správy sdílených složek je použití net share
. Povolení net.exe
je však nebezpečné, protože uživatel může pomocí příkazu získat oprávnění net group Administrators unprivilegedjeauser /add
správce . Bezpečnější možností je povolit rutinu Get-SmbShare , která dosáhne stejného výsledku, ale má mnohem omezenější rozsah.
Při zpřístupnění externích příkazů uživatelům v relaci JEA vždy zadejte úplnou cestu ke spustitelnému souboru. Tím se zabrání spuštění podobně pojmenovaných a potenciálně škodlivých programů umístěných jinde v systému.
Povolení přístupu k poskytovatelům PowerShellu
Ve výchozím nastavení nejsou v relacích JEA k dispozici žádní poskytovatelé PowerShellu. To snižuje riziko zpřístupnění citlivých informací a nastavení konfigurace pro uživatele, který se připojuje.
V případě potřeby můžete povolit přístup k poskytovatelům PowerShellu VisibleProviders
pomocí příkazu. Úplný seznam poskytovatelů zobrazíte spuštěním Get-PSProvider
příkazu .
VisibleProviders = 'Registry'
U jednoduchých úloh, které vyžadují přístup k systému souborů, registru, úložišti certifikátů nebo jiným citlivým poskytovatelům, zvažte vytvoření vlastní funkce, která pracuje s poskytovatelem jménem uživatele. Funkce, rutiny a externí programy dostupné v relaci JEA podléhají stejným omezením jako JEA. Ve výchozím nastavení mají přístup k libovolnému poskytovateli. Zvažte také použití uživatelské jednotky , pokud uživatelé potřebují kopírovat soubory do koncového bodu JEA nebo z koncového bodu JEA.
Vytváření vlastních funkcí
Vlastní funkce můžete vytvářet v souboru funkcí role, abyste zjednodušili složité úlohy pro koncové uživatele. Vlastní funkce jsou užitečné také v případě, že pro hodnoty parametrů rutiny požadujete pokročilou logiku ověřování. V poli FunctionDefinitions můžete psát jednoduché funkce:
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
}
}
Důležité
Nezapomeňte do pole VisibleFunctions přidat název vlastních funkcí, aby je uživatelé JEA mohli spustit.
Tělo (blok skriptu) vlastních funkcí běží ve výchozím jazykovém režimu systému a není předmětem omezení jazyka JEA. To znamená, že funkce můžou přistupovat k systému souborů a registru a spouštět příkazy, které nebyly viditelné v souboru funkcí role. Při použití parametrů dbejte na to, abyste se vyhnuli spuštění libovolného kódu. Vyhněte se propojení uživatelského vstupu přímo do rutin, jako je Invoke-Expression
.
V předchozím příkladu si všimněte, že se místo zkratky Select-Object
použil plně kvalifikovaný název modulu (FQMN). Microsoft.PowerShell.Utility\Select-Object
Funkce definované v souborech funkcí rolí stále podléhají rozsahu relací JEA, což zahrnuje funkce proxy serveru JEA, které vytváří omezení existujících příkazů.
Ve výchozím nastavení Select-Object
je omezená rutina ve všech relacích JEA, která neumožňuje výběr libovolných vlastností u objektů. Pokud chcete použít nekontrénované Select-Object
funkce, musíte explicitně požádat o úplnou implementaci pomocí plně kvalifikovaného názvu domény. Každá omezená rutina v relaci JEA má stejná omezení při vyvolání z funkce. Další informace najdete v tématu about_Command_Precedence.
Pokud píšete několik vlastních funkcí, je vhodnější je vložit do modulu skriptu PowerShellu. Tyto funkce zviditelníte v relaci JEA pomocí pole VisibleFunctions, jako byste používali integrované moduly a moduly třetích stran.
Aby dokončování tabulátoru správně fungovalo v relacích JEA, musíte do seznamu VisibleFunctions zahrnout integrovanou funkci.tabexpansion2
Zpřístupnění funkcí role pro konfiguraci
Před PowerShellem 6 musí PowerShell najít soubor schopností role, který musí být uložený ve RoleCapabilities
složce v modulu PowerShellu. Modul se dá uložit do libovolné složky zahrnuté do $env:PSModulePath
proměnné prostředí, ale neměli byste ho umístit do složky, do $env:SystemRoot\System32
které by mohli nedůvěryhodní uživatelé soubory upravovat.
Následující příklad vytvoří modul skriptu PowerShellu s názvem ContosoJEA v $env:ProgramFiles
cestě k hostování souboru schopností role.
# 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
Počínaje PowerShellem 6 byla vlastnost RoleDefinitions přidána do konfiguračního souboru relace. Tato vlastnost umožňuje zadat umístění konfiguračního souboru role pro vaši definici role. Podívejte se na příklady v new-PSSessionConfigurationFile.
Aktualizace funkcí rolí
Soubor funkcí role můžete upravit a aktualizovat nastavení kdykoli. Všechny nové relace JEA zahájené po aktualizaci funkce role se projeví v revidovaných možnostech.
Proto je řízení přístupu ke složce funkcí rolí tak důležité. Soubory funkcí rolí by měli měnit pouze vysoce důvěryhodní správci. Pokud může nedůvěryhodný uživatel změnit soubory funkcí rolí, může se snadno dostat k rutinám, které jim umožní zvýšit svá oprávnění.
Správci, kteří chtějí uzamknout přístup k funkcím role, se ujistěte, že má místní systém přístup jen pro čtení k souborům funkcí rolí a obsahujícím moduly.
Jak se možnosti rolí sloučí
Uživatelům je udělen přístup ke všem možnostem odpovídajících rolí v konfiguračním souboru relace, když zadají relaci JEA. JEA se pokusí uživateli poskytnout nejvíce permisivní sadu příkazů povolených některou z rolí.
VisibleCmdlets a VisibleFunctions
Nejsložitější logika sloučení ovlivňuje rutiny a funkce, které můžou mít parametry a hodnoty parametrů omezené v JEA.
Pravidla jsou následující:
- Pokud je rutina viditelná pouze v jedné roli, je viditelná pro uživatele s případnými platnými omezeními parametrů.
- Pokud je rutina viditelná ve více než jedné roli a každá role má pro tuto rutinu stejná omezení, je tato rutina viditelná pro uživatele s těmito omezeními.
- Pokud je rutina viditelná ve více než jedné roli a každá role umožňuje jinou sadu parametrů, zobrazí se uživateli rutina a všechny parametry definované napříč jednotlivými rolemi. Pokud jedna role nemá pro parametry omezení, jsou povoleny všechny parametry.
- Pokud jedna role definuje model ověření nebo ověření pro parametr rutiny a druhá role parametr povolí, ale neomezí hodnoty parametrů, bude ověřená sada nebo vzor ignorována.
- Pokud je sada ověření definovaná pro stejný parametr rutiny ve více než jedné roli, jsou povoleny všechny hodnoty ze všech validovaných sad.
- Pokud je vzor ověření definovaný pro stejný parametr rutiny ve více než jedné roli, jsou povoleny všechny hodnoty, které odpovídají některému ze vzorů.
- Pokud je sada ověření definovaná v jedné nebo více rolích a vzor ověření je definován v jiné roli pro stejný parametr rutiny, ověřovací sada se ignoruje a pravidlo (6) se použije u zbývajících vzorů ověření.
Níže je příklad sloučení rolí podle těchto pravidel:
# 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
Všechna ostatní pole v souboru funkcí role se přidají do kumulativní sady povolených externích příkazů, aliasů, zprostředkovatelů a spouštěcích skriptů. Pro uživatele JEA je k dispozici libovolný příkaz, alias, zprostředkovatel nebo skript dostupný v jedné funkci role.
Dávejte pozor, abyste zajistili, že kombinovaná sada poskytovatelů z jedné funkce role a rutin, funkcí nebo příkazů z jiného neumožňují uživatelům neúmyslný přístup k systémovým prostředkům.
Pokud například jedna role umožňuje rutinu Remove-Item
a jiná umožňuje FileSystem
poskytovateli, riskujete, že uživatel JEA odstraní libovolné soubory ve vašem počítači. Další informace o identifikaci efektivních oprávnění uživatelů najdete v článku o auditování JEA .