ウェブサイト検索

最小限の管理権限を用いてPowerShellスクリプトを委任する (JEA)


タスクを割り当てたいと思ったことがありますか?しかし、必要な権限を渡すのが危険すぎると感じたことはありませんか?また、ADでグループの作成を制限して、グループの命名規則を強制したいと思ったことはありませんか?

JEAは、あなたがその目的やそれ以上のことを助けることができます。この記事では、あなたがすでに作成したスクリプトをPowerShell 5.1でどのように委任できるかについて説明します。

JEAとは何ですか?

JEAは、MicrosoftのPowerShellソリューションで、ユーザー(および管理者)が特定のPowerShellセッション内で指定されたタスクのみを実行できるように制限することができます。これは、対象リソースでローカル管理者の権限が必要な場合でも同様です。さらに、非常に具体的に設定できます。指定したコマンドだけが実行でき、特定のパラメーター値や特定のパターンに一致するパラメーター値のみを有効にすることができます。

例えば、特定のサービスだけを再起動するためにサービスデスクを有効にすることができます

Restart-Service

、または特定の命名規則に従ってグループをADにのみ追加します。サーバーやADに明示的な権限を与えることなく、これらすべてを実行できます。これは、膨大な時間を節約し、環境を安全に保つことができるツールです。スクリプトを関数にまとめることから始めましょう。

ステップ1: スクリプトから関数を作成する

まだ行っていない場合、最初のステップはあなたのスクリプトを関数にすることです。これは非常に簡単です、あなたがすでに持っていることを前提とすれば。

parameters

設定します。以下に、私のシンプルなスクリプト「New-FolderAndShare」を関数にまとめました:

Function New-FolderAndShare {
    [cmdletbinding()]
    param(
        Name of the share
        [parameter(Mandatory)]
        [ValidatePattern("^(Project d{5}|Team (Finance|HR|IT|Multi) [a-z ]+)$")]
        [string]$ShareName,
        Directory of the new share folder locally
        [parameter(Mandatory)]
        [ValidatePattern("^(D|E|F):\Shares\$")]
        [string]$Path,
        Who to have full access
        [parameter(Mandatory)]
        [ValidateSet("^CONTOSO\")]
        [string]$FullAccess
    )
        $FullPath = Join-Path $Path $ShareName
    New-Item -ItemType Directory -Path $FullPath
    New-SmbShare -Path $FullPath -Name $ShareName -FullAccess $FullAccess
}

あなたは関数内でValidatePatternを使用してパラメータを検証しますが、もしこれがモジュールの一部であれば、代わりにRoleCapabilitiesファイル内のVisibleFunctionsでそれを行うことができます。

スクリプトを関数にすることで、JEAで許可されるパラメータの制御が強化され、エクスポートも容易になります。

ステップ2:ロール能力の作成

RoleCapabilitiesファイルは、指定された役割(次のステップで定義されている)が何を行うことが許可されているかを決定します。これには、実行できるコマンド、使用できるパラメーター、およびインポートするモジュールが含まれます。

RoleCapabilitiesは手動で作成することもできますが、PowerShell 5.1に組み込まれているNew-PSRoleCapabilityFileコマンドを使用することをお勧めします。また、このファイル内で前のステップで作成した関数を読み込むことになります。

次のスクリプトは、FileShareCreator.psrc という名前のファイルを作成し、現在のセッションにロードする必要がある New-FolderAndShare 関数を追加します。

RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT
$RoleCapabilitiesParam = @{
    Define a function that will be available in the cmdlet
    FunctionDefinitions = @{ 
        Name = 'New-FolderAndShare'
                Import the code of the function
        ScriptBlock = [ScriptBlock]::Create(
            (Get-Command New-FolderAndShare).Definition
        )
    }
    Modules used in the function needs to be explicity imported
    ModulesToImport = @(
        "SmbShare",
        "Microsoft.PowerShell.Management"
    )
    Path = ".FileShareCreator.psrc"
}
New-PSRoleCapabilityFile @RoleCapabilitiesParam

Get-Commandを利用して、FunctionDefinitionsパラメータ内の関数を取得します。パラメータを持つ生のスクリプトを追加することもできます。

また、VisibleCmdletパラメータで関数の使用方法を指定することもできます。これを行うには、関数の名前とそのパラメータを正規表現と一緒に指定します。

これにより、ユーザーが何をできて何をできないかを非常に詳細に制御することができます。しかし、これを機能させるための一つの注意点があります。それは、psrcファイルをモジュールに追加する必要があるということです。

ステップ3:RoleCapabilityファイルのモジュールを作成する

役割機能を入れるためのモジュールを作成する時が来ました。JEAは、psrcファイルの拡張子を除いた名前からRoleCapabilitiesを見つけるので、後でさらに役割機能を作成する場合は重複を避けてください。

以下のスクリプトは、公式JEAドキュメントにあるものを修正したバージョンです。モジュールディレクトリに新しいモジュールを作成し、必要なファイルとフォルダーを作成し、ステップ2で作成したpsrcファイルをそれにコピーします:

RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT
Create a folder for the module
$modulePath = Join-Path $env:ProgramFiles "WindowsPowerShellModulesFileShareJEA"
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.
New-Item -ItemType File -Path (Join-Path $modulePath "FileShareJEA.psm1")
New-ModuleManifest -Path (Join-Path $modulePath "FileShareJEA.psd1") -RootModule "FileShareJEA.psm1"
Create the RoleCapabilities folder and copy in the PSRC file
$rcFolder = Join-Path $modulePath "RoleCapabilities"
New-Item -ItemType Directory $rcFolder
Copy-Item -Path .FileShareCreator.psrc -Destination $rcFolder

あなたは今、JEAで使用できるように役割機能と関数を作成しました。残っているのは、ADグループを先ほど作成した役割にマッピングするためのPowerShellセッション設定を作成することです。

ステップ4: 役割の定義

このステップでは、どの役割にどの機能が割り当てられるかを定義するPowerShellセッション構成ファイルを作成します(これはステップ2で作成した.psrcファイルからのものです)。

あなたはここでADグループとトランスクリプトディレクトリを作成することになります。

Create directory to store logs
New-Item -ItemType Directory -Path 'C:ProgramDataJEAConfigurationTranscripts' -Force
Create AD group (you might need to do it on another server)
New-ADGroup -Path "OU=Groups,DC=contoso,DC=com" -Name 'JEA_FILESHARE_CREATOR' -GroupScope DomainLocal
RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT
Define parameters for New-PSSessionConfigurationFile
$PSSessionConfigurationParams = @{
    Run as a temporary account
    RunAsVirtualAccount = $True
    That is a local administrator
    RunAsVirtualAccountGroups = @(
        "administrators"
    )
    Path where to save log files of what connected users are doing
    TranscriptDirectory = 'C:ProgramDataJEAConfigurationTranscripts'
    Map an active directory group to the capability we created
    RoleDefinitions = @{
        'CONTOSOJEA_FILESHARE_CREATOR' = @{
            RoleCapabilities = 'FileShareCreator'
        }
    }
        
        Path of the PSSC file
    Path = ".SessionConfiguration.pssc"
}
Create the PSSC file
New-PSSessionConfigurationFile @PSSessionConfigurationParams

ステップ5:PowerShellセッションの作成

このステップでは、前のステップで作成したSessionConfiguration.psscファイルを読み込みます。これにより、JEA_FILESHARE_CREATORのメンバーがPowerShellを介してサーバーに接続できるようになります。

PS51> Register-PSSessionConfiguration -Path .SessionConfiguration.pssc -Name 'JEAFileShare' -Force
PSPath : Microsoft.WSMan.ManagementWSMan::localhostPluginJEAFileShare
PSParentPath : Microsoft.WSMan.ManagementWSMan::localhostPlugin
PSChildName : JEAFileShare
PSDrive : WSMan
PSProvider : Microsoft.WSMan.ManagementWSMan
PSIsContainer : True
Keys : {Name=JEAFileShare}
Name : JEAFileShare
TypeNameOfElement : Container
Type : Container

完了です!通常の手段でサーバーにアクセスできないユーザーをJEA_FILESHARE_CREATORに追加し、そのユーザーとして次のように入力して試してみてください:

PS51> Enter-PSSession -ComputerName fs02.contoso.com -ConfigurationName JEAFileShare
PS51> New-FolderAndShare -ShareName "Project 12345" -Path D:Share

これで、セッション中に表示されるいくつかのデフォルトコマンド(Get-Commandを使用して確認可能)を実行するためにのみ有効化され、制限された一時的なローカル管理者としてコマンドを実行できるようになりました。また、役割機能ファイルに追加されたNew-FolderAndShare関数もあります。

一時的に作成されたアカウントを表示したい場合は、ステップ2のRoleCapabilitiesパラメータにVisibleExternalCommands @('c:windowssystem32whoami.exe')を追加してください。whoamiを実行してローカル管理者の名前を見ることができます。

PS51 >whoami
winrm virtual userswinrm va_1_contoso_joe_helpdesk

要約

JEAを使用することは、タスクを委任し、環境を保護する素晴らしく簡単な方法です。これは、自分のスクリプトだけでなく、組み込みモジュールやインストールされたモジュールも含まれます。JEAは大きな価値を提供することができますが、注意が必要です!誤ったコマンドを委任したり、予期しない人に対して誤ったパラメータを指定すると、あなたの環境に大きなリスクをもたらす可能性があります。

もっと学びたいですか?

  • マイクロソフトのJEAに関するドキュメント
  • ジェイソン・ヘルミックによる「Just Enough Administration (JEA)」の始め方 [YouTube]

関連記事: