Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Při vytváření koncového bodu JEA je třeba definovat jednu nebo více rolových funkcí, 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.
- Update používat nástroje příkazového řádku k ekvivalentům PowerShellu, pokud je to možné, pro nejlepší možnosti auditování a přizpůsobení JEA. Externí programy není možné omezit tak podrobně jako nativní rutiny a funkce PowerShellu v JEA.
- Omezit rozsahu rutin tak, aby povolovaly pouze konkrétní parametry nebo hodnoty parametrů. To je zvlášť důležité, pokud by uživatelé měli spravovat jenom část systému.
- Vytvořit vlastní funkce, které nahradí složité příkazy nebo příkazy, které jsou obtížné omezit 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ů.
- Test 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 potřebné pro úspěch uživatele. Příkazy 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í administrátorských oprávnění připojenému uživateli 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 možností 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 pověřit právo spouštět rutiny nebo funkce PowerShellu, přidejte název rutiny nebo funkce do polí VisibleCmdlets nebo VisibleFunctions. Pokud si nejste jistí, jestli je příkazem rutina nebo funkce, můžete spustit Get-Command <name>
a zkontrolovat vlastnost CommandType ve výstupu.
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 libovolně kombinovat kteroukoli z následujících možností.
případ použití : Povolit uživateli spustit
My-Func
bez jakýchkoli omezení parametrů.@{ Name = 'My-Func' }
případ použití : Povolit uživateli spuštění
My-Func
z modulu MyModule bez jakýchkoli omezení parametrů.@{ Name = 'MyModule\My-Func' }
Případ použití: Povolit uživateli spuštění jakékoli rutiny nebo funkce s příkazem
My
.@{ Name = 'My-*' }
Případ použití: Povolit uživateli spuštění jakékoli rutiny nebo funkce s podstatným jménem
Func
.@{ Name = '*-Func' }
případ použití : Povolit uživateli spustit
My-Func
s parametryParam1
aParam2
. Do parametrů lze zadat libovolnou hodnotu.@{ Name = 'My-Func'; Parameters = @{ Name = 'Param1'}, @{ Name = 'Param2' }}
případ použití : Povolit uživateli spustit
My-Func
s parametremParam1
. Parametru lze zadat pouzeValue1
aValue2
.@{ Name = 'My-Func' Parameters = @{ Name = 'Param1'; ValidateSet = @('Value1', 'Value2') } }
případ použití : Povolit uživateli spustit
My-Func
s parametremParam1
. Do parametru lze zadat libovolnou hodnotu začínajícícontoso
.@{ Name = 'My-Func' Parameters = @{ Name = 'Param1'; ValidatePattern = 'contoso.*' } }
Varování
V případě osvědčených postupů zabezpečení se nedoporučuje používat zástupné symboly při definování viditelných cmdletů 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é.
Na stejný cmdlet nebo funkci nemůžete použít jak ValidatePattern, tak ValidateSet.
Pokud ano, ValidatePattern přepíše ValidateSet.
Další informace o ValidatePattern, podívejte se na tento Ahoj, Skripting Guy! publikovat a regulárních výrazů PowerShellu referenční obsah.
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 akcií 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í správce pomocí příkazu net group Administrators unprivilegedjeauser /add
. Bezpečnější možností je povolit rutinu Get-SmbShare, která dosahuje 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 pomocí příkazu VisibleProviders
. Pro úplný seznam poskytovatelů spusťte Get-PSProvider
.
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 nepodléhají stejným omezením jako samotná JEA. Ve výchozím nastavení mají přístup k libovolnému poskytovateli. Také zvažte použití uživatelské jednotky , když uživatelé potřebují kopírovat soubory do koncového bodu JEA, nebo z nich.
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í. Jednoduché funkce můžete psát do pole 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
}
}
Důležité
Nezapomeňte přidat název vlastních funkcí do pole VisibleFunctions, 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 uvedeném příkladu si povšimněte, že místo zkráceného označení Microsoft.PowerShell.Utility\Select-Object
byl použit plně kvalifikovaný název modulu (FQMN) Select-Object
.
Funkce definované v souborech s oprávněními rolí stále podléhají rozsahu relací JEA, kde zahrnuje proxy funkce, které JEA vytváří pro omezení stávajících příkazů.
Ve výchozím nastavení je Select-Object
omezený cmdlet ve všech relacích JEA, který neumožňuje výběr libovolných vlastností u objektů. Pokud chcete ve funkcích použít neomezené Select-Object
, musíte explicitně požádat o úplnou implementaci pomocí FQMN (plně kvalifikovaného názvu). V relaci JEA má každá omezená cmdletová rutina stejná omezení i při volá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 zahrnout předdefinovanou funkci TabExpansion2
do seznamu VisibleFunctions.
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 složce RoleCapabilities
v modulu PowerShellu. Modul lze uložit do libovolné složky, která je součástí proměnné prostředí $Env:PSModulePath
, ale neměli byste ho umístit do $Env:SystemRoot\System32
ani do složky, kde by nedůvěryhodní uživatelé mohli soubory upravovat.
Následující příklad vytvoří modul skriptu PowerShellu s názvem ContosoJEA v cestě $Env:ProgramFiles
pro 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
Další informace o modulech PowerShellu najdete v tématu Principy modulu PowerShellu.
Počínaje PowerShellem 6 se do konfiguračního souboru relace přidala vlastnost RoleDefinitions. 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 schopností role budou odrážet revidované schopnosti.
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 s oprávněními rolí, může se snadno dostat k příkazům, které jim umožní zvýšit své pravomoci.
Správci, kteří chtějí uzamknout přístup k funkcím role, by se měli ujistit, že Místní systém má přístup pouze pro čtení k souborům funkcí rolí a k modulům, které je obsahují.
Jak jsou schopnosti rolí sloučeny
Uživatelům je udělen přístup ke všem možnostem odpovídajících rolí v konfiguračním souboru relace při vstupu do relace 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 cmdlet viditelný pouze v jedné roli, je viditelný pro uživatele s příslušný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 ověřenou sadu nebo vzor ověřování pro parametr rutiny cmdletu a druhá role parametr povolí, ale neomezí hodnoty parametrů, ověřená sada nebo vzor se ignoruje.
- 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'
}
}
)
}
ViditelnéExterníPříkazy, ViditelnéAlias, ViditelníPoskytovatelé, SkriptyKeZpracování
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 rámci funkce role.
Dávejte pozor, aby kombinovaná sada poskytovatelů z jedné role a rutin, funkcí nebo příkazů z jiné neumožňovala 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 druhá umožňuje poskytovateli FileSystem
, 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 auditování JEA.