AWS Microsoft Managed AD にてAD FSを構築し、SAML のArcGIS Enterprise ログインの ID プロバイダー (IDP) として構成(その1)

※(その1)と(その2)から構成されています。こちらを参照のあと(その2)を参照ください。

はじめに

SAML 認証はインターネットドメイン間でユーザー認証を行なうための XML(マークアップ言語)をベースにした標準規格となります。一度のログインで複数のサービスにログインできるシングルサインオンを実現できます。SAML 認証では、ユーザー、サービスプロバイダー、ID プロバイダーの三者間で認証情報をやり取りしていきます。サービスプロバイダーと ID プロバイダーは直接通信できなくても構いません。

ここでは、ArcGIS Enterprise 11.0 を利用して、AWS Directory Service の Managed Microsoft AD に Active Directory Federation Service (以下AD FS) を構成して、SAML 認証を試してみます。ここでは詳しく説明しませんが、ユーザーが ArcGIS Enterprise にアクセスして SSO するまでの流れを下記に示します(ArcGIS Online/ArcGIS Enterprise 同様の流れになります)。

主な作業の流れは以下の通りです。

  • AWS Managed Microsoft AD の作成
  • AD FS の構築(その1)
  • ADFS のメタ情報取得(その2)
  • ArcGIS Enterprise にて SAML IDP を登録(その2)
  • AD FS にサービスプロバイダーを登録(その2)
  • シングルサインオンの確認(その2)

検証環境の説明

AWS Managed Microsoft AD をパブリックサブネット内に構成し(※ここでは検証のためで本来はプライベート環境に構成し ADFS のプロキシサーバーをパブリック環境に建てた方がよいと思います。)、ADFS サーバーにパブリック IP を割り当ててます。また、ArcGIS Enterprise 環境をプライベートサブネット内に構成し、ALB  経由でアクセスできるようにしてます。ADFS サーバー、ArcGIS Enterprise 環境ともにセキュリティグループとして443ポートを開けています。

AWS Managed Microsoft AD の作成

エディションは Standard Edition を選択し、ディレクトリの DNS 名は「ads.esrij.home」としました。VPC には AWS にてデフォルトで用意されている VPC(172.31.0.0/16)を選択しています。詳細は、AWS Managed Microsoft AD のページなどを参照ください。

ADFS サーバーのドメイン参加

同じ VPC 内に EC2 インスタンスを作成します。OS は、Windows Server 2019 を利用しました。

1.ドメインに参加

作成した EC2 インスタンスをドメインに参加させるために TCP/IPv4 のプロパティにて、Managed Microsoft AD の DNS アドレスを参照して設定します。

2.ドメイン名の変更にて Active Directory 名を入力します。(例 ads.esrij.home)

3.Managed Microsoft AD にて設定したアカウント情報を入力します。(ユーザー名は、Admin@ads.esrij.home と名前@ドメイン名 の形式となります。)

ドメインに参加させるとコンピューターの再起動をするか聞かれるのでそのまま再起動します。

4.Active Directory の管理に必要なツールをインストールします。

ADFS の構築に必要なローカル管理者権限を持つユーザーの作成

ADFS の作成時に ADFS ファームというものを構築しますが、その際にローカルマシンへの管理者権限が必要となります。ここでは、localadmin を作成していきます。

1.Active Directory ユーザーとコンピューターにて、localadmin というユーザーを作成し、所属グループに AWS Delegated Administrators というグループに設定します。(Domain Users はデフォルトでグループ設定されています。)

ADFS の構築

AWS Managed Microsoft AD では、Admin が Domain 管理者(Domain Admins)ではありません。ですので、UI より ADFS サーバーを構築しようとすると「入力された資格情報はドメイン管理者のものではありません。」とエラーが出てきます。ここではウィザードでなく手動で構築していきます。

1.gMSAの作成

グループサービスアカウント(gMSA)を作成します。

New-ADServiceAccount -Name ‘adfs-service’ –DNSHostName ‘EC2AMAZ-TUU8412’

2.証明書の準備

サービス通信証明書を準備します。こちらを ADFS サーバーにインポートしていきます。サーバー証明書と秘密鍵を合成した pfx ファイル証明書を用意し、ダブルクリックします。以下の UI の手順でインポートを実施します。

証明書情報を Powershell より取得します。

Get-ChildItem Cert:\LocalMachine\My\

Pfx ファイル証明書の中に中間証明書がインポートされている場合は 2 行表示されます。1 行目がサーバー証明書なります。こちらの情報を取得できるか確認します。Thumprint の値を後ほど使います。

Get-ChildItem Cert:\LocalMachine\My\ | Where-Object { $_.Subject -eq ‘CN=*.esrij.com, O=ESRIジャパン株式会社, L=千代田区, S=東京都, C=JP’ }

3.ADFS コンテナーの作成

通常 ADFS ファームを作成する場合は、[ドメイン名]/Program Data/Microsoft に 2 つのコンテナーオブジェクトが作成されるようです。ただし、この [ドメイン名]/Program Data/Microsoft にオブジェクトを作成するには Domain Admin 権限が必要であり、Managed Microsoft AD でのエラーの原因のようです。ここでは、以下の関数を Powershell で実行して、[ドメイン名]/[NetBIOSドメイン名]/ 配下に ADFS とランダムな GUID のコンテナーを作成し、その設定情報を $adminConfig 変数に格納していきます。(※AWS Managed Microsoft AD環境でADFSサーバーを構築する を参考にさせていただきました。ありがとうございました。)

 # gMSA専用関数
function New-NonDADkmContainerForgMSA {
    [CmdletBinding()]
    param (
       [Parameter(Mandatory=$True)]
       [string]$AcctToAclDkmContainer
    )
    
    $userNameSplit = $AcctToAclDkmContainer.Split("\")
    if ($userNameSplit.Length -ne 2)
    {
        Write-error "Specify non-DA local admin user in 'domain\username' format"
        return $false
    }
    
    # The OU Name is a randomly generated Guid
    [string]$guid = (New-Guid).Guid
    Write-Host ("OU Name" + $guid)
    
    $ouName = $guid
    $initialPath = "OU=$($userNameSplit[0])," + (Get-ADDomain).DistinguishedName
    $ouPath = "CN=ADFS," + $initialPath
    $ou = "CN=" + $ouName + "," + $ouPath
    
    Write-Host ("Creating organizational unit with DN: " + $ou)
    
    if ($null -eq (Get-ADObject -Filter {distinguishedName -eq $ouPath}))
    {
        Write-Host ("First creating initial path " + $ouPath)
        New-ADObject -Name "ADFS" -Type Container -Path $initialPath
    }
    New-ADObject -Name $ouName -Type Container -Path $ouPath
    
    # get gMSA SID
    $strSID = (Get-ADServiceAccount -Identity $userNameSplit[1]).SID
    
    # set acl to ADFS cottainer object
    Import-Module ActiveDirectory
    try {
        Push-Location ad:
        [System.DirectoryServices.ActiveDirectorySecurityInheritance]$adSecInEnum = [System.DirectoryServices.ActiveDirectorySecurityInheritance]::All
        $ace1 = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $strSID,"GenericRead","Allow",$adSecInEnum
        $ace2 = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $strSID,"CreateChild","Allow",$adSecInEnum
        $ace3 = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $strSID,"WriteOwner","Allow",$adSecInEnum
        $ace4 = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $strSID,"DeleteTree","Allow",$adSecInEnum
        
        $acl = Get-Acl -Path $ou
        
        $acl.AddAccessRule($ace1)
        $acl.AddAccessRule($ace2)
        $acl.AddAccessRule($ace3)
        $acl.AddAccessRule($ace4)
        
        Set-Acl -Path $ou -AclObject $acl
    } finally {
        Pop-Location
    }
    
    return @{"DKMContainerDn" = $ou}
}

以下のコマンドで ADFS コンテナーを作成していきます。

# ADFSコンテナーを作成し、設定情報を変数に格納
$adminConfig = New-NonDADkmContainerForgMSA 'ads\adfs-service'

ADFS コンテナーが無事作成されたか確認します。(※著者の環境では、Active Directory ユーザーとコンピューターの管理ツールでは確認できませんでした。)

Get-ADObject -Filter * -SearchBase 'CN=ADFS,OU=ads,DC=ads,DC=esrij,DC=home'
DistinguishedName                                                              Name                                 ObjectClass ObjectGUID
-----------------                                                              ----                                 ----------- ----------
CN=ADFS,OU=ads,DC=ads,DC=esrij,DC=home                                         ADFS                                 container   7693e3e1-66b4-4f45-b7a8-e0...
CN=0105c2fa-8848-4f6d-8746-9112ef52554c,CN=ADFS,OU=ads,DC=ads,DC=esrij,DC=home 0105c2fa-8848-4f6d-8746-9112ef52554c container   c19eff58-1c8e-46e5-916a-b3...

4.ADFS サーバーの構築 (ADFSファームの構築)

これで準備が整いました。ADFS ファームを作るため、ADFS モジュールにある Install-AdfsFarm コマンドレットを使用していきます。

証明書の情報を取得します。

$cert = Get-ChildItem Cert:\LocalMachine\My\ | Where-Object { $_.Subject -eq 'CN=*.esrij.com, O=ESRIジャパン株式会社, L=千代田区, S=東京都, C=JP' }

さきほど作成した ADFS ファームを構築する際のローカル管理者権限を持つユーザーの認証情報を取得します。

$localAdminCred = Get-Credential 'ads\localadmin'

ADFS ファーム作成のためのパラメータを設定します。

$params = @{
    CertificateThumbprint = $cert.Thumbprint
    SigningCertificateThumbprint = $cert.Thumbprint
    DecryptionCertificateThumbprint = $cert.Thumbprint
    FederationServiceName = 'adstest.esrij.com'
    GroupServiceAccountIdentifier = 'ads\adfs-service$'
    Credential = $localAdminCred
    OverwriteConfiguration = $true
    AdminConfiguration = $adminConfig
    Verbose = $true
}

検証してエラーが出なければ実行します。

# 検証
Test-AdfsFarmInstallation @params
# インストール
Install-AdfsFarm @params

※Test-AdfsFarmInstallation で、ads/adfs-service$ のアクセス権のエラーが出る場合は、こちらの権限委任を参考に localadmin に権限設定してみてください。

正常にインストールされますと以下のようなメッセージが表示されます。

5.ファイアウォールの有効化

EC2 インスタンスのセキュリティグループと OS のファイアウォールの 443 ポートを開放します。

※その2へ続きます。

※参考 Active Directory Federation Services の構成

AWS Managed Microsoft AD環境でADFSサーバーを構築する

ArcGIS Online / ArcGIS Enterprise – Active Directory Federation Service 連携ガイド

フォローする