SSMドキュメントでWindowsインスタンスをAWS Managed Microsoft ADドメインに参加させる

SSMドキュメントでWindowsインスタンスをAWSManaged Microsoft ADドメインに参加させる

SSMドキュメント AWS-JoinDirectoryServiceDomainを使用して、WindowsインスタンスをAWS Managed Microsoft ADドメインに参加させる構成

AWS Managed Microsoft ADはAWSが提供するマネージドタイプのディレクトリサービスです。

AWS Directory Serviceを使用すると、Microsoft Active Directory (AD) を管理対象サービスとして実行できます。(中略) AWS Managed Microsoft AD は、Windows Server 2012 R2 によって動作します。

AWS Managed Microsoft AD

今回はSSMドキュメントを使用して、Windowsインスタンスを、AWS Managed Microsoft ADのドメインに参加させる方法を確認します。

構築する環境

Diagram of joining Windows instance to AWS Managed Microsoft AD domain with SSM documentation.

プライベートサブネットにWindowsインスタンスを設置します。インスタンスのOSは最新のWindowsServer2019とします。
同サブネットと別AZに用意した2つのプライベートサブネットに、AWS Managed Microsoft ADを関連付けます。
以下の2つのSSMドキュメントを実行して、AWS Managed Microsoft ADのドメインに参加および管理用ツールをインストールします。

  • AWS-JoinDirectoryServiceDomain
  • AWS-RunPowerShellScript

環境構築用のCloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置します。

https://github.com/awstut-an-r/awstut-fa/tree/main/017

テンプレートファイルのポイント解説

今回のアーキテクチャを構成するための、各テンプレートファイルのポイントを取り上げます。

NATゲートウェイでSSM用通信の経路を用意する

プライベートサブネット内のWindowsインスタンスがインターネットにアクセスするための経路を用意します。ポイントはVPCエンドポイントを使用しないという点です。

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidrBlock

  IGW:
    Type: AWS::EC2::InternetGateway

  IGWAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref IGW

  EIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  NATGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt EIP.AllocationId
      SubnetId: !Ref PublicSubnet
Code language: YAML (yaml)

今回の構成では、Windowsインスタンスはプライベートサブネットに設置されています。プライベートサブネット内のインスタンスがSSMにアクセスするためには、SSM用VPCエンドポイントを使用するか、NATゲートウェイを使用する必要がありますが、今回は後者を選択します。これはAWS-JoinDirectoryServiceDomain実行の条件に理由があります。

Systems Manager で Amazon Virtual Private Cloud (Amazon VPC) エンドポイントを使用している場合、EC2 インスタンスを AWS Directory Service ドメインに参加させるリクエストは失敗します。

AWS Systems Manager を使って、実行中の EC2 Windows インスタンスを AWS Directory Service ドメインに参加させるにはどうすればよいですか?

以上の理由より、今回はSSM用VPCエンドポイントは使用せず、NATゲートウェイを配置して、インターネットを通じてSSMと通信します。

AWS Managed Microsoft ADは2つのAZのサブネットを関連づける

AWS Managed Microsoft ADを確認します。

Resources:
  MSAD:
    Type: AWS::DirectoryService::MicrosoftAD
    Properties:
      Edition: Standard
      Name: !Ref MSADName
      Password: !Ref MSADPassword
      VpcSettings:
        SubnetIds:
          - !Ref PrivateSubnet1
          - !Ref PrivateSubnet2
        VpcId: !Ref VPC


Outputs:
  MSAD:
    Value: !Ref MSAD

  MSADDnsIpAddress1:
    Value: !Select [0, !GetAtt MSAD.DnsIpAddresses]

  MSADDnsIpAddress2:
    Value: !Select [1, !GetAtt MSAD.DnsIpAddresses]
Code language: YAML (yaml)

AWS Managed Microsoft ADを作成する場合、ポイントとなる設定はサブネット設定です。

少なくとも 2 つのサブネット。各サブネットはそれぞれ異なるアベイラビリティーゾーンにある必要があります。

AWS Managed Microsoft AD の前提条件

上記の条件を満たすように、SubnetIdsプロパティに、今回はWindowsインスタンスが設置されているサブネットに加え、別AZに作成したもう1つのサブネットを指定します。
加えて、Nameプロパティでドメイン名、Passwordプロパティにドメインの管理者ユーザー(Admin)のパスワードを指定します。

AWS Managed Microsoft ADのDNSアドレスは、後述のAWS-JoinDirectoryServiceDomainドキュメント実行のために必要となります。DNSアドレスは関連付けたサブネットごとに作成されるため、今回は2つ用意されることになります。これらのアドレスは、外部のテンプレートから参照する必要があるため、Outputsセクションに記載しますが、この記法に注意してください。それはDnsIpAddressesは文字列型の配列を返すという仕様に従うように定義する必要があるということです。Outputsに定義できる値は数値か文字列のみです。ですから今回は組み込み関数Fn::Selectを使用し、2つの値を1つずつ定義して対応します。

Windowsインスタンス用ロールは2つのAWS管理ポリシーをアタッチする

Windowsインスタンス用のIAMロールがポイントです。

Resources:
  InstanceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - ec2.amazonaws.com
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
        - arn:aws:iam::aws:policy/AmazonSSMDirectoryServiceAccess
Code language: YAML (yaml)

SSMドキュメントAWS-JoinDirectoryServiceDomainを実行するための条件に、WindowsインスタンスにアタッチするIAMロールに関するものがあります。

Systems Manager およびディレクトリ参加アクセスに関する以下のアクセス許可ポリシーがある AWS Identity and Access Management (IAM) インスタンスプロファイルロール:

AmazonSSMManagedInstanceCore

AmazonSSMDirectoryServiceAccess

AWS Systems Manager を使って、実行中の EC2 Windows インスタンスを AWS Directory Service ドメインに参加させるにはどうすればよいですか?

今回は上記の2つのAWS管理ポリシーをアタッチしたIAMロールを作成し、Windowsインスタンスのインスタンスプロファイルに割り当てます。

SSM AWS-JoinDirectoryServiceDomainドキュメントの実行のポイントはDNSサーバアドレス

まずAWS-JoinDirectoryServiceDomainを実行するための関係付けを確認します。

Resources:
  AWSJoinDirectoryServiceDomainAssociation:
    Type: AWS::SSM::Association
    Properties:
      AssociationName: !Sub "${Prefix}-aws-join-directory-service-domain-association"
      Name: AWS-JoinDirectoryServiceDomain
      Parameters:
        directoryId:
          - !Ref MSAD
        directoryName:
          - !Ref MSADName
        dnsIpAddresses:
          - !Ref MSADDnsIpAddress1
          - !Ref MSADDnsIpAddress2
      Targets:
        - Key: InstanceIds
          Values:
            - !Ref Instance
      WaitForSuccessTimeoutSeconds: !Ref WaitForSuccessTimeoutSeconds
Code language: YAML (yaml)

AWS-JoinDirectoryServiceDomainを実行する場合、ポイントとなる設定はDNSサーバアドレスです。dnsIpAddressesプロパティに、AWS Managed Microsoft ADに割り当てられたDNSアドレスを指定する必要があります。そのため先述の2つのアドレスを本プロパティに指定します。
加えて、directoryIdプロパティにAWS Managed Microsoft ADのID、directoryNameプロパティにドメイン名を指定します。

SSM AWS-RunPowerShellScriptドキュメントAD管理ツールインストール

最後にWindowsインスタンスにAD管理用のツールをインストールするSSMドキュメントを定義します。

Resources:
  AWSRunPowerShellScriptAssociation:
    Type: AWS::SSM::Association
    DependsOn:
      - AWSJoinDirectoryServiceDomainAssociation
    Properties:
      AssociationName: !Sub "${Prefix}-aws-runpowershellscript-association"
      Name: AWS-RunPowerShellScript
      Parameters:
        commands:
          - "Install-WindowsFeature RSAT-ADDS"
      Targets:
        - Key: InstanceIds
          Values:
            - !Ref Instance
      WaitForSuccessTimeoutSeconds: !Ref WaitForSuccessTimeoutSeconds
Code language: YAML (yaml)

AWS Managed Microsoft ADはマネージドサービスのため、直接、ユーザーがアクセスすることはできません。その代わりに管理用インスタンスを用意することで、間接的にAWS Managed Microsoft AD内の設定を操作することができます。

EC2 Windows インスタンスからディレクトリを管理するには、インスタンスに Active Directory ドメインサービスと Active Directory ライトウェイトディレクトリサービスツールをインストールする必要があります。

Active Directory 管理ツールのインストール

管理のために必要なツールのインストールは、GUIもしくはPowerShellでインストール可能です。今回は後者でインストールします。公式サイトでは、PowerShellでインストールする方法について触れています。

PowerShell プロンプトから Active Directory リモート管理ツールをインストールするには、Install-WindowsFeature RSAT-ADDS。

Active Directory 管理ツールのインストール

今回はAWS-RunPowerShellScriptドキュメントを使用して、上記のコマンドを実行します。commandsプロパティに同コマンドを指定します。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • インスタンスのID:i-049a023af221c6399
  • AWS Managed Microsoft ADのID:d-956709c0ce
  • ADのドメイン名:awstut.com
  • ドメインAdminのパスワード:P@ssw0rd

AWS Managed Microsoft ADの作成状況をAWS Management Consoleから確認します。

Domain name and DNS address are configured in AWS Managed Microsoft AD.

Directory DNS nameの値を見ると、ADのドメイン名が指定通りに設定されています。CloudFormationテンプレートで指定した通り、Subnetsが2つ指定されています。これに応じてDNS addressが2つ割り当てられています。

SSMドキュメントの実行状況を確認します。

Two SSM documents have been successfully executed.

確かに2つのドキュメントが実行されました。これでインスタンスは、ドメイン参加および管理ツールのインストールが完了したことになります。

SSM Session Manager経由でトンネリングアクセスしてモートデスクトップ接続でアクセスする

準備が整いましたので、EC2インスタンスにアクセスします。
今回はSSM Session Manager経由でトンネリングアクセスして、モートデスクトップ接続でアクセスします。
SSM Session Managerに関する詳しい説明は以下のページをご確認ください。

あわせて読みたい
WindowsインスタンスにSSM Session Manager経由でアクセスする 【WindowsインスタンスにSSM Session Manager経由でアクセスする構成】 WindowsインスタンスにSSM Session Manager経由でアクセスする構成を確認します。 Session Manag...

まずクライアント側で以下のコマンドを実行し、インスタンスに対してトンネリングアクセスを行います。

% aws ssm start-session \
--target i-049a023af221c6399 \
--document-name AWS-StartPortForwardingSession \
--parameters "portNumber=3389, localPortNumber=13389"
Code language: Bash (bash)

次にクライアント側でリモートデスクトップクライアントを起動し、localhost:13389向けにリモートデスクトップ接続を行います。

Use SSM Session Manager to make a remote desktop connection to a Windows instance.

ユーザー名およびパスワードはドメイン管理者(Admin)の情報を入力します。ユーザー名はドメイン名も含めた形で入力します。今回ですとユーザー名が「Admin@awstut.com」となります。

Use SSM Session Manager to make a remote desktop connection to a Windows instance.

しばらく待つと、ドメイン管理者としてサインインが完了し、Windowsインスタンスのデスクトップ画面が表示されます。

Remote Desktop connection successful.

ドメイン参加状況確認

いくつかドメイン参加状況を確認します。
まず以下にアクセスします。

設定 > アカウント

Sign in with Domain Admin.

確かにドメイン管理者としてサインインしていることがわかります。

次に以下にアクセスします。

コントロールパネル > システムとセキュリティ > システム

A Windows instance is joined to the domain.

Domainの値が「awstut.com」とあります。正常にドメイン参加していることがわかります。

次にWindowsインスタンスのDNSサーバアドレスを確認します。

AWS Managed Microsoft AD will be configured as the DNS server address for the Windows instance.

先ほど確認したAWS Managed Microsoft ADのDNSアドレスが指定されています。AWS-JoinDirectoryServiceDomainドキュメントを実行することで、DNSサーバアドレスが適切に変更された上で、ドメイン参加が実行されたということがわかります。

AD管理ツール

最後にAWS-RunPowerShellScriptドキュメントでインストールしたAD管理ツールを確認します。

The SSM document will install the AD management tools.

スタートメニューにAD管理ツール「Active Directory Users and Computers」が表示されています。確かにインストールが実行されていることがわかります。

同ツールを起動します。

The domain of AWS Managed Microsoft AD is included in the management target.

管理対象のドメインとして、「awstut.com」が表示されています。これで直接AWS Managed Microsoft ADにアクセスせずとも、本インスタンスを通じて操作することができます。

最後に既存のオブジェクトを確認します。

The computer object of the Windows instance is in the Computers container.
The domain Admin user object is in the Users container.

Computersコンテナの方には本インスタンスのコンピュータオブジェクト、Usersコンテナの方は現在サインインしているドメイン管理者のユーザーオブジェクトが設置されています。

まとめ

AWS Managed Microsoft ADでActive Directory環境を構築しました。

SSMドキュメントAWS-JoinDirectoryServiceDomainを使用して、Windowsインスタンス構築時に、同環境へのドメイン参加を実施しました。

SSMドキュメントAWS-RunPowerShellScriptを使用して、AD管理ツールをインストールして管理サーバとすることで、同環境を操作できることを確認しました。