Posted in: Základy PowerShellu

Základní zabezpečení PowerShellu

Zabezpečení Powershellu začíná u zabezpečení operačního systému. Powershell je opravdu dvousečnou zbraní (nejlepším hackerským nástrojem i nejlepším přítelem obránců a správců), nicméně jsou určité postupy, které reálně snižují potenciální rizika spojená s přítomností PowerShellu. Nežli si dále povíme něco o zabezpečení PowerShellu jako takového, pojďme se podávat na základy. Doporučené body pro bezpečnou práci:

  1. Nepracuji pod účtem s admin oprávněním
  2. Nezpouštím pozornost z odemčeného PC
  3. Pravidleně instaluji bezpečnostní aktualizace
  4. Nespouštím skripty z internetu, které jsem celé nezkontroloval a nerozumím jim na 100%
  5. Moduly a další SW instaluji vždy z důvěryhodných zdrojů (oficiální stažení z webu vydavatele, ověření kontrolních součtů a vše pouze legálně)
  6. Všechny úlohy spouštím s minimálním nutným oprávněním
  7. Vždy mám na systému aktivní Firewall a zabezpečení
  8. Využívám komplexní hesla
  9. Dodržuji všechny bezpečnostní doporučení výrobce OS i jednotlivých aplikací
  10. Navštěvuji jen důvěryhodné weby a nic nedávám do výjimek bezpečnostních SW
  11. PowerShellu nedávám oprávnění administrátora, pokud není nezbytné
  12. S právy admina nespouštím skripty z internetu

Dalším doporučením je, aby práce vždy probíhala v aktuální verzi PowerShellu, verze 5.1 není problémem, pokud nechybí bezpečnostní aktualizace. Starší verze PowerShellu by měly být z PC odebrány, a pokud je potřebuje nějaký SW, mělo by být jejich spouštění logováno a omezeno na daný SW např. pomocí Applocker.

Execution Policy

V PowerShellu od verze 3 najdeme tzv. Execution Policy, což je nastavení, které říká, jaké skripty je povoleno spouštět. Jde o první obrannou linii PowerShellu. Ve výchozím stavu je na Windows Serveru hodnota RemoteSigned, na systémech Windows 10 je výchozí hodnotou Restricted. Co které nastavení znamená?

  • AllSigned Vyžaduje, aby všechny skripty a konfigurační soubory byly podepsány důvěryhodným vydavatelem, včetně skriptů napsaných v místním počítači.
  • Bypass Spustí jakýkoliv skript bez varování a výzev.
  • Default Nastaví na Windows serveru RemoteSigned a na Windows Restricted
  • RemoteSigned Všechny skripty a konfigurační soubory stažené z internetu musí být podepsány důvěryhodným vydavatelem.
  • Restricted Nenačte konfigurační soubory a nespustí skripty.
  • Undefined Pro obor nejsou nastaveny žádné zásady provádění. Odebere přiřazenou zásadu provádění z oboru, který není nastaven zásadami skupiny. Pokud je zásada provádění ve všech oborech Nedefinovaná, je účinná politika Restricted
  • Unrestricted Počínaje PowerShell 6.0 se jedná o výchozí zásadu provádění pro počítače, které nejsou Windows, a nelze ji změnit. Načte všechny konfigurační soubory a spustí všechny skripty. Pokud spustíte nepodepsaný skript, který byl stažen z internetu, budete před spuštěním vyzváni k povolení.

Jak zjistím aktuálně nastavenou politiku ve svém PowerShelu? Odpovědí je příkaz: 

Get-ExecutionPolicy -List

Jak nastavím Execution policy? Odpovědí je příkaz: 

Set-ExecutionPolicy

Execution policy jde nastavovat granuárně na různé úrovně. Pokud spustíme příkaz Set-ExecutionPolicy nastavujeme pravidla pouze pro daný proces PowerShellu. Pro nastavení pravidel například pro uživatele, počítač, nebo všechny uživatele složí přepínač: -Scope

Pro nastavení pravidel máme následující oblasti:

  • MachinePolicy Pomocí zásad skupiny aplikuje nastavení na všechny uživatele daného PC.
  • UserPolicy Nastavení platí lokálně pro daného uživatele.
  • Process Nastavení platí pouze pro dané okno PowerShellu.
  • CurrentUser Nastavení platí pouze pro daného uživatele (může s ním cestovat)
  • LocalMachine Mění výchozí nastavení pro všechny uživatele na daném PC.

Pokud nechcete, aby se v PowerShellu objevila výzva pro potvrzení nastavení použijte přepínač: -Force Pokud chci nastavit, že v aktuálně spuštěné instanci PowerShellu spustím podepsaný skript, využiji příklad níže.

Set-ExecutionPolicy AllSigned -Scope Process -Force

Obcházení Execution Policy

Obejít Execution Policy není nic těžkého a nejsou na to zapotřebí žádná oprávnění, člověk může být klidně uživatelem typu host. Níže si popíšeme 3 nejběžnější způsoby obcházení:

  1. Příkaz Set-ExecutionPolicy, kterým nastavím policy na požadovanou hodnotu (nelze provést uvnitř skriptu)
  2. V Průzkumníku kliknout na soubor skriptu pravým tlačítkem myši a zvolit „Run with PowerShell“
  3. Spustit si PowerShell ISE, skript v něm otevřít, celý označit pomocí CTRL+A a zvolit RUN SELECTION

Jak je vidět, tak Execution policy jsou pouze nástrojem, který má zabránit chybám z nepozornosti a nechtěnému spuštění kódu, nikoliv reálnou bezpečnostní technologií.

Constrained Language mode

Jak již bylo zmíněno PowerShell stojí na .NET Frameworku a z toho plyne, že umí volat .NET příkazy. Tato zkutečnost je podstatnou, protože dokáže zjednodušit některé úkony správy, ale zároveň je volání .NET příkazů alfou a omegou většiny škodlivých kódů v PowerShellu. Pro hackery je často samotný PowerShell skvělý pomocník, ale protože je určen pro jiné odvětví, je zároveň limitujícím faktorem útoku. Právě technologie Language mode, má za úkol omezit volání .NET příkazů, čímž eliminuje spouštění řady generických skriptů, které hackeři užívají.

Nastavení

Obrana proti školdivému kódu v PowerShellu je poměrně jednoduchá, stačí užívat Constrained Language mode, který značně omezí možnosti, které útočník má. Toto nastavení umožňuje zakázat volání .NET příkazů, a nastavit i další omezení omezení na vlastní PowerShell.

Zjištění jazykového režimu provedeme příkazem:

$ExecutionContext.SessionState.LanguageMode

Základní nastavení do omezeného režimu provedeme příkazem:

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

Pokud toto nastavení provádíme příkazy, pak není možné jej z omezeného režimu vrátit zpět na plný režim v rámci stejného okna PowerShellu. Stejně jako u Execution policy zde nejsou zapotřebí žádná správcovská práva. Krom omezeného jazykového režimu existují i další, pojďme se tedy podívat na úplný výčet.

  • Full Language – Režim jazyka FullLanguage umožňuje všechny jazykové prvky v relaci. FullLanguage je výchozí jazykový režim
  • Restricted Language – V jazykovém režimu RestrictedLanguage mohou uživatelé používat příkazy (rutiny, funkce, příkazy CIM a pracovní postupy), ale není dovoleno používat bloky skriptů. Jsou omezeny i proměnné a operátory. Bližší informace: Get-Help about_Language_Modes
  • No Language – V jazykovém režimu NoLanguage mohou uživatelé spouštět příkazy, ale nemohou používat žádné jazykové prvky.
  • Constrained Language – povoluje všechny prvky jazyka PowerShell, ale neumožňuje volání .NET a vybraných systémových rutin.

Na rozdíl od Execution policy lze z pozice správce vynutit nastavení na úrovni počítače, jež pevně stavuje jazykový režim a uživatelé jej nemohou změnit. Toto pevné nastavení se provádí pomocí systémové proměnné __PSLockDownPolicy, což lze udělat příkazem .NET:

[Environment]::SetEnvironmentVariable('__PSLockdownPolicy', '4', 'Machine')

Další alternativou je využití systémového GIU:

Poslední možností, pro správce systémů tou nejlepší, je využití Group Policy, resp. Local Policy.

Blokované soubory z internetu

Soubory konfigurace, skriptů a nápovědy jsou ve výchozím stavu po stažení z internetu blokovány a PowerShell bude explicitně vyžadovat potvrzení, že má takový soubor opravdu spustit i když politiky spuštění povolují. Každý soubor, který je stažen z internetu má o této skutečnosti informující příznak v NTFS (alternativní datový proud Zone.Identifier, který má hodnotu „3“), proto PowerShell zná jeho původ. Tuto informaci neobsahují jen soubory pro PowerShell, ale také ostatní stažené soubory, jako jsou Office, PDF, MSI, EXE apod. Výjimku tvoří soubory stažené v rámci modulu příkazem Install-Module z PowerShell galerie nebo jiného důvěryhodného repozitáře, zde si je PowerShell v rámci procesu instalace odblokuje.

Pro odblokování souborů slouží příkaz Unblock-File, který má povinný parametr -Path, nicméně dokáže pracovat i s pozičním zadáním hodnoty parametru, tudíž bez uvedení jména parametru, jen zadáním jeho hodnoty.

Následující příkaz odblokuje všechny soubory umístěné v adresáři C:\Users\Public\Dokuments:

Get-ChildItem C:\Users\Public\Dokuments\*.* | Unblock-File

Výše zmíněný příkaz odblokuje všechny soubory, tedy i soubory Office, pdf či instalátory. Jeho užití tedy může leckdy ušetřit i klikání na Povolit úpravy v sadě Office na souborech stažených z Moodlu nebo SISu. Více o tomto příkazu v jeho dokumentaci.

Back to Top