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のドメインに参加させる方法を確認します。
構築する環境
プライベートサブネットに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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- インスタンスのID:i-049a023af221c6399
- AWS Managed Microsoft ADのID:d-956709c0ce
- ADのドメイン名:awstut.com
- ドメインAdminのパスワード:P@ssw0rd
AWS Managed Microsoft ADの作成状況をAWS Management Consoleから確認します。
Directory DNS nameの値を見ると、ADのドメイン名が指定通りに設定されています。CloudFormationテンプレートで指定した通り、Subnetsが2つ指定されています。これに応じてDNS addressが2つ割り当てられています。
SSMドキュメントの実行状況を確認します。
確かに2つのドキュメントが実行されました。これでインスタンスは、ドメイン参加および管理ツールのインストールが完了したことになります。
SSM Session Manager経由でトンネリングアクセスしてモートデスクトップ接続でアクセスする
準備が整いましたので、EC2インスタンスにアクセスします。
今回はSSM Session Manager経由でトンネリングアクセスして、モートデスクトップ接続でアクセスします。
SSM Session Managerに関する詳しい説明は以下のページをご確認ください。
まずクライアント側で以下のコマンドを実行し、インスタンスに対してトンネリングアクセスを行います。
% aws ssm start-session \
--target i-049a023af221c6399 \
--document-name AWS-StartPortForwardingSession \
--parameters "portNumber=3389, localPortNumber=13389"
Code language: Bash (bash)
次にクライアント側でリモートデスクトップクライアントを起動し、localhost:13389向けにリモートデスクトップ接続を行います。
ユーザー名およびパスワードはドメイン管理者(Admin)の情報を入力します。ユーザー名はドメイン名も含めた形で入力します。今回ですとユーザー名が「Admin@awstut.com」となります。
しばらく待つと、ドメイン管理者としてサインインが完了し、Windowsインスタンスのデスクトップ画面が表示されます。
ドメイン参加状況確認
いくつかドメイン参加状況を確認します。
まず以下にアクセスします。
設定 > アカウント
確かにドメイン管理者としてサインインしていることがわかります。
次に以下にアクセスします。
コントロールパネル > システムとセキュリティ > システム
Domainの値が「awstut.com」とあります。正常にドメイン参加していることがわかります。
次にWindowsインスタンスのDNSサーバアドレスを確認します。
先ほど確認したAWS Managed Microsoft ADのDNSアドレスが指定されています。AWS-JoinDirectoryServiceDomainドキュメントを実行することで、DNSサーバアドレスが適切に変更された上で、ドメイン参加が実行されたということがわかります。
AD管理ツール
最後にAWS-RunPowerShellScriptドキュメントでインストールしたAD管理ツールを確認します。
スタートメニューにAD管理ツール「Active Directory Users and Computers」が表示されています。確かにインストールが実行されていることがわかります。
同ツールを起動します。
管理対象のドメインとして、「awstut.com」が表示されています。これで直接AWS Managed Microsoft ADにアクセスせずとも、本インスタンスを通じて操作することができます。
最後に既存のオブジェクトを確認します。
Computersコンテナの方には本インスタンスのコンピュータオブジェクト、Usersコンテナの方は現在サインインしているドメイン管理者のユーザーオブジェクトが設置されています。
まとめ
AWS Managed Microsoft ADでActive Directory環境を構築しました。
SSMドキュメントAWS-JoinDirectoryServiceDomainを使用して、Windowsインスタンス構築時に、同環境へのドメイン参加を実施しました。
SSMドキュメントAWS-RunPowerShellScriptを使用して、AD管理ツールをインストールして管理サーバとすることで、同環境を操作できることを確認しました。