Udostępnij za pośrednictwem


Możliwości roli JEA

Podczas tworzenia punktu końcowego JEA należy zdefiniować co najmniej jedną funkcję roli, która opisuje, co ktoś może zrobić w sesji JEA. Funkcja roli to plik danych programu PowerShell z .psrc rozszerzeniem zawierającym listę wszystkich poleceń cmdlet, funkcji, dostawców i programów zewnętrznych udostępnianych do łączenia użytkowników.

Określanie poleceń, które mają być dozwolone

Pierwszym krokiem tworzenia pliku możliwości roli jest rozważenie, do czego użytkownicy potrzebują dostępu. Proces zbierania wymagań może chwilę potrwać, ale jest to ważne. Zapewnienie użytkownikom dostępu do zbyt kilku poleceń cmdlet i funkcji może uniemożliwić im wykonanie zadania. Zezwolenie na dostęp do zbyt wielu poleceń cmdlet i funkcji może umożliwić użytkownikom wykonywanie większej liczby czynności niż zamierzone i osłabienie stanu zabezpieczeń.

Sposób pracy z tym procesem zależy od organizacji i celów. Poniższe porady mogą pomóc w upewnieniu się, że jesteś na właściwej ścieżce.

  1. Zidentyfikuj polecenia używane przez użytkowników do wykonywania swoich zadań. Może to obejmować ankietowanie pracowników IT, sprawdzanie skryptów automatyzacji lub analizowanie transkrypcji i dzienników sesji programu PowerShell.
  2. Zaktualizuj użycie narzędzi wiersza polecenia do odpowiedników programu PowerShell, jeśli to możliwe, aby uzyskać najlepsze środowisko inspekcji i dostosowywania JEA. Programy zewnętrzne nie mogą być ograniczone tak szczegółowo, jak natywne polecenia cmdlet i funkcje programu PowerShell w narzędziu JEA.
  3. Ogranicz zakres poleceń cmdlet, aby zezwalać tylko na określone parametry lub wartości parametrów. Jest to szczególnie ważne, jeśli użytkownicy powinni zarządzać tylko częścią systemu.
  4. Utwórz funkcje niestandardowe, aby zastąpić złożone polecenia lub polecenia, które są trudne do ograniczenia w narzędziu JEA. Prosta funkcja, która opakowuje złożone polecenie lub stosuje dodatkową logikę walidacji, może oferować dodatkową kontrolę dla administratorów i prostoty użytkownika końcowego.
  5. Przetestuj listę dozwolonych poleceń w zakresie z użytkownikami lub usługami automatyzacji i dostosuj je w razie potrzeby.

Przykłady potencjalnie niebezpiecznych poleceń

Staranne wybieranie poleceń jest ważne, aby upewnić się, że punkt końcowy JEA nie zezwala użytkownikowi na podniesienie uprawnień.

Ważne

Podstawowe informacje wymagane do powodzenia użytkownikaPolecenia w sesji JEA są często uruchamiane z podwyższonym poziomem uprawnień.

Poniższa lista zawiera przykłady poleceń, które mogą być używane złośliwie, jeśli są dozwolone w stanie nieskonsekwowanym. Nie jest to wyczerpująca lista i powinna być używana tylko jako punkt wyjścia ostrzegawcza.

  • Ryzyko: udzielanie uprawnień administratora użytkownika łączącego w celu obejścia narzędzia JEA

    Przykład:

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

    Powiązane polecenia:

    • Add-ADGroupMember
    • Add-LocalGroupMember
    • net.exe
    • dsadd.exe
  • Ryzyko: Uruchamianie dowolnego kodu, takiego jak złośliwe oprogramowanie, luki w zabezpieczeniach lub skrypty niestandardowe w celu obejścia ochrony

    Przykład:

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

    Powiązane polecenia:

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

Tworzenie pliku możliwości roli

Nowy plik funkcji roli programu PowerShell można utworzyć za pomocą polecenia cmdlet New-PSRoleCapabilityFile .

New-PSRoleCapabilityFile -Path .\MyFirstJEARole.psrc

Należy edytować utworzony plik możliwości roli, aby zezwolić tylko na polecenia wymagane dla roli. Dokumentacja pomocy programu PowerShell zawiera kilka przykładów sposobu konfigurowania pliku.

Zezwalanie na polecenia cmdlet i funkcje programu PowerShell

Aby autoryzować użytkowników do uruchamiania poleceń cmdlet lub funkcji programu PowerShell, dodaj polecenie cmdlet lub nazwę funkcji do pól VisibleCmdlets lub VisibleFunctions . Jeśli nie masz pewności, czy polecenie jest poleceniem cmdlet lub funkcją, możesz uruchomić Get-Command <name> polecenie i sprawdzić właściwość CommandType w danych wyjściowych.

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

Czasami zakres określonego polecenia cmdlet lub funkcji jest zbyt szeroki dla potrzeb użytkowników. Na przykład administrator DNS może potrzebować dostępu tylko do ponownego uruchomienia usługi DNS. W środowiskach z wieloma dzierżawami dzierżawcy mają dostęp do narzędzi do samoobsługowego zarządzania. Dzierżawy powinny być ograniczone do zarządzania własnymi zasobami. W takich przypadkach można ograniczyć, które parametry są udostępniane z polecenia cmdlet lub funkcji.

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

W bardziej zaawansowanych scenariuszach może być również konieczne ograniczenie wartości, których użytkownik może użyć z tymi parametrami. Funkcje roli umożliwiają zdefiniowanie zestawu wartości lub wzorca wyrażenia regularnego określającego, jakie dane wejściowe są dozwolone.

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

Uwaga

Typowe parametry programu PowerShell są zawsze dozwolone, nawet jeśli ograniczasz dostępne parametry. Nie należy jawnie wyświetlać ich w polu Parametry.

Poniższa lista zawiera opis różnych sposobów dostosowywania widocznego polecenia cmdlet lub funkcji. W polu VisibleCmdlets można mieszać i dopasować dowolną z poniższych wartości.

  • Przypadek użycia: zezwala użytkownikowi na uruchamianie My-Func bez żadnych ograniczeń dotyczących parametrów.

    @{ Name = 'My-Func' }
    
  • Przypadek użycia: zezwala użytkownikowi na uruchamianie My-Func z modułu MyModule bez żadnych ograniczeń dotyczących parametrów.

    @{ Name = 'MyModule\My-Func' }
    
  • Przypadek użycia: zezwala użytkownikowi na uruchamianie dowolnego polecenia cmdlet lub funkcji z czasownikiem My.

    @{ Name = 'My-*' }
    
  • Przypadek użycia: zezwól użytkownikowi na uruchomienie dowolnego polecenia cmdlet lub funkcji z nounem Func.

    @{ Name = '*-Func' }
    
  • Przypadek użycia: zezwala użytkownikowi na uruchamianie My-Func z parametrami Param1 i Param2 . Do parametrów można podać dowolną wartość.

    @{ Name = 'My-Func'; Parameters = @{ Name = 'Param1'}, @{ Name = 'Param2' }}
    
  • Przypadek użycia: zezwala użytkownikowi na uruchamianie My-Func za pomocą parametru Param1 . Tylko Value1 i Value2 można go dostarczyć do parametru.

    @{
        Name       = 'My-Func'
        Parameters = @{ Name = 'Param1'; ValidateSet = @('Value1', 'Value2') }
    }
    
  • Przypadek użycia: zezwala użytkownikowi na uruchamianie My-Func za pomocą parametru Param1 . Do parametru można podać dowolną wartość rozpoczynającą contoso się od .

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

Ostrzeżenie

W przypadku najlepszych rozwiązań w zakresie zabezpieczeń nie zaleca się używania symboli wieloznacznych podczas definiowania widocznych poleceń cmdlet lub funkcji. Zamiast tego należy jawnie wyświetlić każde zaufane polecenie, aby upewnić się, że żadne inne polecenia, które współużytkują ten sam schemat nazewnictwa, nie są przypadkowo autoryzowane.

Nie można zastosować zarówno elementu ValidatePattern , jak i ValidateSet do tego samego polecenia cmdlet lub funkcji.

Jeśli to zrobisz, funkcja ValidatePattern zastępuje element ValidateSet.

Aby uzyskać więcej informacji na temat ValidatePattern, zapoznaj się z tym wpisem Hey, Scripting Guy! i zawartością referencyjną wyrażeń regularnych programu PowerShell.

Zezwalanie na polecenia zewnętrzne i skrypty programu PowerShell

Aby umożliwić użytkownikom uruchamianie plików wykonywalnych i skryptów programu PowerShell (.ps1) w sesji JEA, należy dodać pełną ścieżkę do każdego programu w polu VisibleExternalCommands .

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

Jeśli to możliwe, użyj polecenia cmdlet programu PowerShell lub odpowiedników funkcji dla wszystkich zewnętrznych plików wykonywalnych, ponieważ masz kontrolę nad parametrami dozwolonymi za pomocą poleceń cmdlet i funkcji programu PowerShell.

Wiele plików wykonywalnych umożliwia odczytywanie bieżącego stanu, a następnie zmianę go przez podanie różnych parametrów.

Rozważmy na przykład rolę administratora serwera plików, który zarządza udziałami sieciowymi hostowanymi w systemie. Jednym ze sposobów zarządzania udziałami jest użycie polecenia net share. Jednak zezwolenie net.exe jest niebezpieczne, ponieważ użytkownik może użyć polecenia , aby uzyskać uprawnienia administratora za pomocą polecenia net group Administrators unprivilegedjeauser /add. Bezpieczniejszą opcją jest zezwolenie na polecenie cmdlet Get-SmbShare , które osiąga ten sam wynik, ale ma znacznie bardziej ograniczony zakres.

Podczas udostępniania poleceń zewnętrznych użytkownikom w sesji JEA należy zawsze określić pełną ścieżkę do pliku wykonywalnego. Zapobiega to wykonaniu podobnie nazwanych i potencjalnie złośliwych programów znajdujących się gdzie indziej w systemie.

Zezwalanie na dostęp do dostawców programu PowerShell

Domyślnie żadni dostawcy programu PowerShell nie są dostępni w sesjach JEA. Zmniejsza to ryzyko ujawnienia poufnych informacji i ustawień konfiguracji użytkownikowi łączącemu się.

W razie potrzeby możesz zezwolić na dostęp do dostawców programu PowerShell przy użyciu VisibleProviders polecenia . Aby uzyskać pełną listę dostawców, uruchom polecenie Get-PSProvider.

VisibleProviders = 'Registry'

W przypadku prostych zadań, które wymagają dostępu do systemu plików, rejestru, magazynu certyfikatów lub innych poufnych dostawców, rozważ napisanie funkcji niestandardowej, która współpracuje z dostawcą w imieniu użytkownika. Funkcje, polecenia cmdlet i programy zewnętrzne dostępne w sesji JEA nie podlegają tym samym ograniczeniom co JEA. Domyślnie mogą uzyskiwać dostęp do dowolnego dostawcy. Rozważ również użycie dysku użytkownika, gdy użytkownicy muszą kopiować pliki do punktu końcowego JEA lub z tego punktu końcowego.

Tworzenie funkcji niestandardowych

Funkcje niestandardowe można tworzyć w pliku funkcji roli, aby uprościć złożone zadania dla użytkowników końcowych. Funkcje niestandardowe są również przydatne, gdy wymagana jest zaawansowana logika walidacji dla wartości parametrów polecenia cmdlet. Proste funkcje można napisać w polu 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
    }
}

Ważne

Nie zapomnij dodać nazwy funkcji niestandardowych do pola VisibleFunctions , aby mogły być uruchamiane przez użytkowników JEA.

Treść (blok skryptu) funkcji niestandardowych działa w trybie domyślnym dla systemu i nie podlega ograniczeniom języka JEA. Oznacza to, że funkcje mogą uzyskiwać dostęp do systemu plików i rejestru oraz uruchamiać polecenia, które nie zostały widoczne w pliku możliwości roli. Należy zachować ostrożność, aby uniknąć uruchamiania dowolnego kodu podczas używania parametrów. Unikaj potokowania danych wejściowych użytkownika bezpośrednio do poleceń cmdlet, takich jak Invoke-Expression.

W powyższym przykładzie zwróć uwagę, że użyto w pełni kwalifikowanej nazwy modułu (FQMN) Microsoft.PowerShell.Utility\Select-Object zamiast skrótu Select-Object. Funkcje zdefiniowane w plikach funkcji roli nadal podlegają zakresowi sesji JEA, które obejmują funkcje serwera proxy tworzone przez jea w celu ograniczenia istniejących poleceń.

Domyślnie Select-Object jest ograniczonym poleceniem cmdlet we wszystkich sesjach JEA, które nie zezwalają na wybór dowolnych właściwości w obiektach. Aby użyć funkcji nieprzyciągniętych Select-Object , należy jawnie zażądać pełnej implementacji przy użyciu nazwy FQMN. Każde ograniczone polecenie cmdlet w sesji JEA ma te same ograniczenia podczas wywoływania z funkcji. Aby uzyskać więcej informacji, zobacz about_Command_Precedence.

Jeśli piszesz kilka funkcji niestandardowych, wygodniejsze jest umieszczenie ich w module skryptu programu PowerShell. Te funkcje są widoczne w sesji JEA przy użyciu pola VisibleFunctions , tak jak w przypadku wbudowanych i modułów innych firm.

Aby ukończenie karty działało prawidłowo w sesjach JEA, należy uwzględnić wbudowaną funkcję tabexpansion2 na liście VisibleFunctions .

Udostępnianie możliwości roli w konfiguracji

Przed programem PowerShell 6, aby program PowerShell znalazł plik funkcji roli, musi być przechowywany w RoleCapabilities folderze w module programu PowerShell. Moduł może być przechowywany w dowolnym folderze dołączonym do $env:PSModulePath zmiennej środowiskowej, jednak nie należy umieszczać go w folderze lub folderze, w $env:SystemRoot\System32 którym niezaufani użytkownicy mogą modyfikować pliki.

Poniższy przykład obejmuje tworzenie modułu skryptu programu PowerShell o nazwie ContosoJEA w $env:ProgramFiles ścieżce do hostowania pliku możliwości roli.

# 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

Aby uzyskać więcej informacji na temat modułów programu PowerShell, zobacz Omówienie modułu programu PowerShell.

Począwszy od programu PowerShell 6, właściwość RoleDefinitions została dodana do pliku konfiguracji sesji. Ta właściwość umożliwia określenie lokalizacji pliku konfiguracji roli dla definicji roli. Zobacz przykłady w pliku New-PSSessionConfigurationFile.

Aktualizowanie możliwości roli

Plik możliwości roli można edytować, aby zaktualizować ustawienia w dowolnym momencie. Wszystkie nowe sesje JEA rozpoczęte po zaktualizowaniu funkcji roli będą odzwierciedlać zmienione możliwości.

Dlatego kontrolowanie dostępu do folderu możliwości roli jest tak ważne. Tylko wysoce zaufani administratorzy powinni mieć możliwość zmiany plików funkcji roli. Jeśli niezaufany użytkownik może zmienić pliki funkcji roli, może łatwo przyznać sobie dostęp do poleceń cmdlet, które umożliwiają im podniesienie uprawnień.

W przypadku administratorów, którzy chcą zablokować dostęp do funkcji roli, upewnij się, że system lokalny ma dostęp tylko do odczytu do plików funkcji roli i zawierających moduły.

Jak funkcje roli są scalane

Użytkownicy otrzymują dostęp do wszystkich pasujących funkcji roli w pliku konfiguracji sesji podczas wprowadzania sesji JEA. JeA próbuje nadać użytkownikowi najbardziej permissywny zestaw poleceń dozwolonych przez dowolną z ról.

VisibleCmdlets i VisibleFunctions

Najbardziej złożona logika scalania ma wpływ na polecenia cmdlet i funkcje, które mogą mieć ich parametry i wartości parametrów ograniczone w narzędziu JEA.

Reguły są następujące:

  1. Jeśli polecenie cmdlet jest widoczne tylko w jednej roli, jest widoczne dla użytkownika z dowolnymi odpowiednimi ograniczeniami parametrów.
  2. Jeśli polecenie cmdlet jest widoczne w więcej niż jednej roli, a każda rola ma te same ograniczenia dotyczące polecenia cmdlet, polecenie cmdlet jest widoczne dla użytkownika z tymi ograniczeniami.
  3. Jeśli polecenie cmdlet jest widoczne w więcej niż jednej roli, a każda rola zezwala na inny zestaw parametrów, polecenie cmdlet i wszystkie parametry zdefiniowane w każdej roli są widoczne dla użytkownika. Jeśli jedna rola nie ma ograniczeń dotyczących parametrów, wszystkie parametry są dozwolone.
  4. Jeśli jedna rola definiuje zestaw weryfikacji lub walidować wzorzec dla parametru cmdlet, a druga rola zezwala na parametr, ale nie ogranicza wartości parametrów, zestaw weryfikacji lub wzorzec jest ignorowany.
  5. Jeśli zestaw weryfikacji jest zdefiniowany dla tego samego parametru polecenia cmdlet w więcej niż jednej roli, wszystkie wartości ze wszystkich zestawów weryfikacji są dozwolone.
  6. Jeśli wzorzec weryfikacji jest zdefiniowany dla tego samego parametru polecenia cmdlet w więcej niż jednej roli, wszystkie wartości zgodne z dowolnymi wzorcami są dozwolone.
  7. Jeśli zestaw weryfikacji jest zdefiniowany w co najmniej jednej roli, a wzorzec weryfikacji jest zdefiniowany w innej roli dla tego samego parametru polecenia cmdlet, zestaw weryfikacji jest ignorowany, a reguła (6) ma zastosowanie do pozostałych wzorców walidacji.

Poniżej przedstawiono przykład scalania ról zgodnie z tymi regułami:

# 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

Wszystkie inne pola w pliku możliwości roli są dodawane do zbiorczego zestawu dozwolonych poleceń zewnętrznych, aliasów, dostawców i skryptów uruchamiania. Dowolne polecenie, alias, dostawca lub skrypt dostępny w jednej funkcji roli jest dostępne dla użytkownika JEA.

Należy zachować ostrożność, aby łączny zestaw dostawców z jednej funkcji roli i poleceń cmdlet/funkcji/poleceń z innego nie zezwalał użytkownikom na niezamierzony dostęp do zasobów systemowych. Jeśli na przykład jedna rola zezwala na Remove-Item polecenie cmdlet, a druga zezwala FileSystem na dostawcę, istnieje ryzyko usunięcia przez użytkownika JEA dowolnych plików na komputerze. Dodatkowe informacje na temat identyfikowania skutecznych uprawnień użytkowników można znaleźć w artykule dotyczącym inspekcji serwera JEA .

Następne kroki

Tworzenie pliku konfiguracji sesji