【Powershell】Just Enough Administration(JEA)をマイPC1台で動作検証してみた<入門編>

PowerShell

今回はWindows Powershellに関する記事です。
掲題にあるJust Enough Administration(JEA)をマイPC1台で動作検証していきます。

【Powershell】Just Enough Administration(JEA)をマイPC1台で動作検証してみた<入門編>

本記事のターゲット

主にGUI操作で構築/運用を行うWindowsにおいても、
Powershellの存在感は無視できるものではありません。
これを使って運用を自動化したり、出力を成形して必要なパラメータだけをリスト取得したりと
利用できればできるほどヒトがかかわる工数を削減することができます。

しかしながら実際の運用シーンでは「管理者権限を要求されるコマンド」を
権限の低い運用ユーザなどでそのまま打鍵するのは不可能だったりしませんか?

でもやっぱり「権限の低いユーザでも特定のコマンドだけは打鍵したい」

そういった方に向けて本記事を作成していきます。

構成図

検証環境の構成図です。
今回はWindows PC1台を使って検証していくため、
以下はすべて同じPC内における説明とお考え下さい。

➡ホームPCで手軽に検証できるのが、本記事の利点です。

リソース配置は以下のようなフォルダ構成/ネーミングとします。
これを満たすことで「JEAのモジュール」を構成できたことになります。
以下モジュール構成は、手順内で自動的に作成されていきます。お楽しみに!

C:\Program Files\WindowsPowerShell\Modules\
└─MyJEA\
  └─MyJEA.psd1
  └─ RoleCapabilities\
    └─ BasicAdmin.psrc
C:\ProgramData\JEA_Demo.pssc

構築すべき概念が複数あり、少し難しく感じるかもしれませんが
本記事の手順に従えば、簡単に動作確認や仕様の体験ができるようになっています。
なおMS公式説明は非常に難解なので、まずは本記事で練習していただいたほうが無難です。
 ※エクスプローラを開いて手動でモジュール構成を配置していく必要はありません

JEAを利用することのメリット(ざっくりした説明)

Just Enough Administration(JEA)を利用すると、
「特定のコマンド(CMD/PS)」に対する実効権限を設定することができます。
非常にざっくりしたイメージをお伝えすると、

RHELでいうところの sudo がPowershellで実行できる!

とお考え下さい。
➡JEAの詳細説明はこちら

なお本記事ではnetshコマンド(管理者権限を要求されることが多々ある)の
実行許可設定をしていきます。

JEAを利用するための事前設定

ここから本題に入ります。まずは

管理者権限が利用できるユーザでPowershell(管理者)を開く

Windows11の画面です。
田(Windowsマーク/スタート ともいう)を右クリックし Powershell(管理者)を開きます。

PowerShell Remoting を有効化

以下のコマンドを打鍵します。

Enable-PSRemoting -Force
■非常によくあるエラー対処

ホームPCだと以下のようなエラーが出ることがあります。

これは、インターフェース Wifi or イーサネット「ネットワークの場所」が「パブリック」になっていることで発生します。
これを修正しないと先に進めないので、まずは以下のコマンドを打鍵し、
インターフェース の状態を確認し、「ネットワークの場所」を変更します。

Get-NetConnectionProfile

赤枠の部分を変更します。
vEthernet (MYPCxxxxx) の部分は、上記[InterfaceAlias]のパラメータを指定してください。
※伏せてあるところは個人情報です。正確にコピーして指定下さい。

Set-NetConnectionProfile -InterfaceAlias "vEthernet (MYPCxxxxx)" -NetworkCategory Private

コマンド打鍵後はステータスが変わったことを確認します。[Private]になっていたらOKです。

Get-NetConnectionProfile

筆者のホームPCはLANがふたつあるので上記のように表示されています。
よくわからなければ両方変更してください。
この後、再度先ほどのPowershell Remoting有効化を実施ください。きっとうまく行きます。

Enable-PSRemoting -Force

検証用の一般ユーザーを作成

次に一般ユーザーを作成し、JEA検証用グループ(JEAOPS)へ所属させます。
パラメータはそのまま使っていただいてOKです。

$USER = "jeauser"
$PASS = "P@ssw0rd!"
$JEAGRP = "JEAOPS"
net user $USER $PASS /add
net localgroup $JEAGRP /add
net localgroup $JEAGRP $USER /add

ここは失敗しないと思います。

JEA 基本フォルダ & ファイル自動生成

まずは変数を設定します。

$moduleRoot = "C:\Program Files\WindowsPowerShell\Modules\MyJEA"
$rolePath = "$moduleRoot\RoleCapabilities"
$psrcPath = "$rolePath\BasicAdmin.psrc"
$psd1Path = "$moduleRoot\MyJEA.psd1"
■必要なフォルダを作成

設定した変数を使って、フォルダを構成します。

# --- 必要なフォルダを作成 ---
New-Item -ItemType Directory -Path $moduleRoot -Force | Out-Null
New-Item -ItemType Directory -Path $rolePath   -Force | Out-Null
■モジュールマニフェストを作成

モジュールマニフェストを作成します。
これが欠落していると、JEAモジュールとみなされません。

# --- モジュールマニフェスト(必須)---
if (!(Test-Path $psd1Path)) {
    New-ModuleManifest -Path $psd1Path `
        -RootModule '' `
        -Author 'JEA-Demo' `
        -Description 'Basic JEA Module'
}
■RoleCapability ファイルを生成

ロールの機能/権限 を設定するファイルを作成します。
青色の部分が、今回検証利用するCMDおよびPSのコマンドです。
あとから他の利用コマンドを追加することもできます。

# --- RoleCapability ファイルを生成 ---
@"
@{
    GUID = '$(New-Guid)'
    Author = 'JEA-Demo'
    Description = 'Minimal JEA Role for PC1 Standalone Test.'

    VisibleExternalCommands = @(
        'C:\Windows\System32\netsh.exe'
    )

    VisibleCmdlets = @(
        'Where-Object',
        'Select-Object',
        'Measure-Object',
        'Write-Output'
    )

    VisibleProviders = @('FileSystem','Registry')
}
"@ | Set-Content -Path $psrcPath -Encoding UTF8

なお、Author は検証用の一般ユーザと一致させる必要はありません。
そのため適当な名前にしていますがこれでもちゃんと動作しますのでご安心を。

これにより、以下が可能になります:

  • netsh advfirewall show allprofiles
  • netsh interface ipv4 show interfaces
  • | Where-Object
  • | Select-Object

などの 「管理者権限必須コマンド」が JEA セッション経由でのみ実行許可される
Select-Objectは一般ユーザでも打鍵できるが、JEAセッションを利用する場合は
こういった出力操作するようなコマンドもすべて記載しておく必要あり。

■フォルダパスなど確認

あまりにも長いので分離していますが、上のコマンドとまとめて打鍵してもらってもいいです。

Write-Host "JEA モジュール & RoleCapability を作成しました:" -ForegroundColor Green
Write-Host " $moduleRoot"
Write-Host " $psrcPath"

■マイコンピューター名確認

これはワークグループ環境なら確実にやったほうが良いです。
この出力結果を、次の打鍵コマンドへ正確に含める必要があります。

$env:COMPUTERNAME

■PSSC(セッション構成)の作成

XXXXXXXXXX へ、マイコンピューター名を記載します。
シナリオありきの検証手順のため、それ以外は気にする必要ありませんが、
よく見ると固有値がたくさん入っています(太字
実行ユーザ、ファイルパス等も非常に重要です。
 ※オリジナルな構築をする場合は気にしてください
  つじつまが合っていないとまともに動作しません

New-PSSessionConfigurationFile `
    -Path 'C:\ProgramData\JEA_Demo.pssc' `
    -SessionType RestrictedRemoteServer `
    -LanguageMode ConstrainedLanguage `
    -RunAsVirtualAccount `
    -RoleDefinitions @{
        'XXXXXXXXXX\JEAOPS' = @{ RoleCapabilities = 'BasicAdmin' }
    }

ポイント:

  • RunAsVirtualAccount
    → JEA内では “仮想管理者アカウント” として実行される
    → 試験に最適、危険性ゼロ
  • RoleDefinitions で JEAOPS グループに権限付与

■JEA セッションを登録

ここまで来たら、いよいよJEAセッションの登録です。以下打鍵してください。

Register-PSSessionConfiguration -Name $JEAGRP -Path 'C:\ProgramData\JEA_Demo.pssc' -Force

確認コマンドは以下。

Get-PSSessionConfiguration JEA-Demo

■JEAOPS(グループ) をエンドポイント ACL へ 追加

これも非常に重要です。一般ユーザでJEAエンドポイントを利用するには、
適切な権限を付与する必要があります。
以下のコマンドを打鍵後、GUIで追加していきましょう。

Set-PSSessionConfiguration -Name JEA-Demo -ShowSecurityDescriptorUI

上記出力と同時にGUIが開きます。

JEAに慣れてくると、この初期状態ではいけないということがすぐわかるようになります。
追加を押下してください。

JEAグループ名を入力します。
ワークグループ環境ならマイPC名を、ドメイン環境ならドメイン名を入力して
①名前の確認
②OK
の順で進みます。

JEAOPSグループへ[実行権限]を付与し、
[OK]を入力します。

これにて準備完了です。(長かったですね)

動作確認

先ほど作成した一般ユーザ(jeauser)でマイPCへサインインします。
サインイン後は、一般権限でPowershellを開くところから始めます。

確認①:一般ユーザでJEAのセッションが開けるか?

PSを開き、以下のコマンドを打鍵します。

Enter-PSSession -ComputerName localhost -ConfigurationName JEA-Demo
■成功例:
■失敗例:

何らかの手順抜け、特に準備手順最後のエンドポイント ACL へ適切な権限設定がされていないと以下のようにエラーになります。これはたとえて言うなら門前払いされたようなものです。

確認②:JEAセッションでnetsh の結果が表示されるか?

以下コマンドを打鍵します。

netsh advfirewall show allprofiles
■成功例

このように、管理ユーザで実行したときと同様、コマンド結果が返ってくればOKです。

JEA セッションに入るとコードページが変わるため、日本語出力は文字化けする場合があります。
回避したければ chcp 65001 で UTF-8 に切り替えてください。

■失敗例

これはJEAへ登録しなかったコマンドをあえて打鍵し、失敗している様子です。

Get-NetFirewallProfile


JEA が許可していない操作は不可能(安全)ということです。

なお、JEAセッションから抜けた後なら一般ユーザが利用できるコマンドが応答します。
 ※本例は管理者権限必須のコマンドではない。

■上記の文字化けが気になりますか?

本記事にはchcpを含んでいませんでしたので、ちょっと「文字コード変更」したいなと
コマンド打鍵するとこの通りエラーが返ってきます。

chcp.exe をJEAセッションへ登録してあげれば、コマンドにて文字コードを変更し、
文字化けを防ぐことができます。

テスト終了

以下のコマンドを打鍵すれば、JEAセッションから抜けられます。

Exit-PSSession

最後に

いかがでしたでしょうか。

国内Webにおいて、JEAの実装方法を正確に記述しているサイトは
2025年時点では存在していないと思います。

筆者も苦労して実装したのですが、これが皆さまの本番環境構築のお役に立てましたら
これに勝る喜びはありません。

入門編は以上になります。
機会があればより実践的な応用編記事など執筆できればと考えておりますので
期待してお待ちくださいませ!

関連記事のご紹介

検証手順の詳細解説記事

➡【Powershell】Just Enough Administration(JEA)の仕組み・概念・構成要素を解説<理論編>

JEAっていつから存在するの?というさりげない疑問に対する筆者のアンサー

➡【Powershell】Just Enough Administration(JEA)っていつから存在するの?<歴史編>

それでは!

コメント

タイトルとURLをコピーしました