CUIメインでWindows Active Directory Server on AWS EC2環境を実現する(ドメインコントローラ1台目構築)
私の場合、BI&ビッグデータ周りの案件に携わる事が多いのですが、Tableau製品の1つTableau Server(Tableauコンテンツの共有を行う際に活用するサーバ製品)でクラスタリング構成を組む際、Tableau Server本体を複数台立ち上げて連携させる他に、Active Directoryサーバ構成も必要となります。しかし、Active Directoryサーバを構築する際は、普通であれば幾つかの手順をGUIで行う形となり、若干大変と言うか面倒な部分でもあったりします。私自身Active Directoryをそこまで知らない身なので、その辺もActive Directoryに対する億劫さに影響しているのかも知れません。
そこで当エントリでは、Tableau Serverクラスタリング構成を組むための前段作業として、Active Directoryサーバの冗長構成について、極力GUIを使わずにCUIメインで各種スクリプト系言語等を用いて構築する手順をまとめて見たいと思います。完全全自動はさすがに無理っぽい(いや、もしかしたら行けるのかも知れないけど相当な労力が掛かりそう...)ので、スクリプトとして貼り付ければ一連の作業を実行してくれるようなテキストを揃える事を目標としてみたいと思います。
目次
構築する環境のイメージ
今回のエントリの趣旨は『既存のActive Directory環境構築手順を如何にCUI操作で実現して、作業を効率化させるか』に主眼を置いていますので、構築する環境としてはGUIで行うものと変わらないものとなります。以下エントリに記載されている構成そのままの内容をGUIをなるべく使わずに作り上げる方向で進めたいと思います。
事前準備
今回構築する内容に必要なリソースも予め作成しておきます。
Active Directory Server用のSecurity Group作成 by AWS CLI
セキュリティグループについては、Active Directory関連の制御を行う上で必要なポートやIP指定を行なったものを用意しました。下記例では、AWS CLIを用いてセキュリティグループを作成し、必要な設定情報を1件ずつ追記したものです。(※動作確認用の為、CIDR指定はAnywhere(0.0.0.0/0)としています。実業務に用いる場合は適した情報に置き換えてください。)
- AWSで Active Directory の冗長化をやってみる 最初のドメインコントローラをたてる! | Developers.IO
- awscliでセキュリティグループを定義する - 戦場のプログラマー
$ aws ec2 create-security-group --group-name sg_ad_for_tableau --description "for Active Directory of Tableau Server." --vpc-id vpc-xxxxxxxx { "GroupId": "sg-xxxxxxxx" } ## Active Directory環境で必要とされる情報 $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 389 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 389 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 636 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 3268 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 3269 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 88 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 88 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 53 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 53 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 445 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 445 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 25 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 135 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 49152-65535 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 5722 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 123 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 464 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 464 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 49152-65535 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 138 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 9389 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 67 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 2535 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol udp --port 137 --cidr "0.0.0.0/0" $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 139 --cidr "0.0.0.0/0" ## RDP接続用 $ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 3389 --cidr "0.0.0.0/0"
Tableau ServerのEC2インスタンスに付与するIAM Role
EC2インスタンスに割り当てるIAM Roleも事前に作成しておきます。こちらについては管理コンソール経由で手動で作成しました。
EC2インスタンスに紐付くKeyPair情報
また、EC2(Windows Server 2012)インスタンスにリモートデスクトップ接続する為の情報を得るためのKeyPairファイルも併せて用意しておいてください。
こちらについてもエントリ上では手動で作成しましたが、AWS CLIでも以下の様に作成する事が出来ます。
$ aws ec2 create-key-pair --key-name (KeyPair名) { "KeyMaterial": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBA(中略)ppNTGz0=\n-----END RSA PRIVATE KEY-----", "KeyName": "(KeyPair名)", "KeyFingerprint": "XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX" } $
Active Directoryサーバ: 1台目
EC2インスタンスの作成・起動 by CloudFormation
EC2インスタンス自体の作成については、CloudFormationを用いました。上記の要素にVPC-IDを含めた以下4つと、
- VPC ID
- Subnet ID
- セキュリティグループ(上記作成のもの)
- IAM Role
パラメータ設定ファイルとして用意したこちらのテンプレートファイルです。
[ { "ParameterKey" : "TableauServerInstanceName", "ParameterValue" : "(インスタンスの名前)" }, { "ParameterKey" : "TableauServerInstanceType", "ParameterValue" : "(任意のインスタンスタイプ)" }, { "ParameterKey" : "TableauServerInstanceSubnetId", "ParameterValue" : "(サブネットID)" }, { "ParameterKey" : "KeyName", "ParameterValue" : "(KeyPairファイル名)" }, { "ParameterKey" : "IAMInstanceRole", "ParameterValue" : "(任意のIAMロール名)" }, { "ParameterKey" : "SecurityGroupIds", "ParameterValue" : "(セキュリティグループID)" }, { "ParameterKey" : "RootVolumeSize", "ParameterValue" : "(任意のGB数)" }, { "ParameterKey" : "EBSVolumeSize", "ParameterValue" : "(任意のGB数)" } ]
必要な要素を構成するためのCloudFormationテンプレートファイルを用意し、aws cloudformation create-stackコマンド実行でEC2インスタンスを起動させます。(以下実行例ではIntellij IDEAプロジェクトにて各種テンプレートファイルを管理した状況から実行させています。)
$ aws cloudformation create-stack \ --stack-name AD1-Server \ --template-body file:///Users/xxxxxxxx/IdeaProjects/cm-tableau-verification/cloudformation/templates/20_ec2_WindowsServer2012withDDrive.template.json \ --parameters file:///Users/xxxxxxxx/IdeaProjects/cm-tableau-verification/cloudformation/parameters/20_ec2_WindowsServer2012withDDrive-ADServer1st.parameter.json { "StackId": "arn:aws:cloudformation:us-east-1:XXXXXXXXXXXX:stack/AD1-Server/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" } $
インスタンスの起動が確認出来たらKeyPairファイルを使ってWindowsアクセスパスワードを取得し、リモートデスクトップ接続を行います。
Windows環境 初期設定作業実施 by PowerShell
Windows環境を利用するにあたって初期設定で必要そうなものについては以下のPowerShellスクリプトをガツっと一発コピペで流します。暫く待てば諸々設定が進み、OS再起動まで進む算段です。マシン名を認識しやすい名前(ここではAD-SERVER1)で設定しています。
- PowerShellスクリプト一発でツールのダウンロード&サイレントインストールを行う | Developers.IO
- PowerShellスクリプトサンプル(Windows Server環境構築 初期設定の一括実行) | Developers.IO
- Windows PowerShell の機能
- Windows PowerShell によるセキュリティ管理が強化された Windows ファイアウォール
- Server CoreモードでのFirewallの無効化 | 日々徒然
## PowerShell実行ポリシーの変更(強制) Set-ExecutionPolicy RemoteSigned -force ## AWSデフォルトリージョンの設定 Set-DefaultAWSRegion us-east-1 ## コンピュータ名の変更(強制) Rename-Computer -NewName "AD-SERVER1" -Force ## タイムゾーンを変更 tzutil.exe /s "Tokyo Standard Time" ## フォルダオプション(拡張子を表示する) Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -name "HideFileExt" -Value 0 ## フォルダオプション(隠しファイル、隠しフォルダ、隠しドライブを表示する) Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -name "Hidden" -Value 1 ## Windows ファイアウォールの無効化 Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False ## 追加: Firefoxのインストール ## make Directory for tools mkdir C:\tools ## Firefox Download & Install Invoke-WebRequest -Uri "https://download.mozilla.org/?product=firefox-36.0-SSL&os=win&lang=ja" -OutFile C:\toolsfirefox.exe C:\toolsfirefox.exe -ms ## Firefoxインストール完了を待つ Start-Sleep -s 60 ## OS再起動 Restart-Computer
Active Directory関連サービス・ツールのインストール by PowerShell
この辺から当エントリの本題的な部分に入ります。Active Directoryに関するサービス・ツール群をPowerShellのコマンドでインストール。
- Windows Server 2008 R2 に追加された Active Directory ドメイン サービスの新機能: Active Directory PowerShell
- [Active Directory] Active Directory モジュールを使用する | PowerShell from Japan!! Blog
## Active Directoryドメインサービスと管理ツールのインストール Get-WindowsFeature AD-Domain-Services | Install-WindowsFeature Get-WindowsFeature RSAT-ADDS | Install-WindowsFeature ## AD DS Deployment PowerShell Moduleのインストール Import-Module ADDSDeployment
事前に必要となるディレクトリを作成しておき(今回はADサーバにDドライブを用意しておいたので対応ディレクトリもDドライブに設定してみました)、
mkdir D:\Windows\NTDS mkdir D:\Windows\SYSVOL
フォレストのインストールからドメインコントローラー昇格までをPowerShellで一発実行。
- Windows PowerShell script for AD DS Deployment
- Windows Server 2012 R2: ドメイン コントローラーへの昇格 (ja-JP) - TechNet Articles - United States (English) - TechNet Wiki
コマンド行については見易さも考慮してPowerShellに於ける改行対策(バッククオートを用いる)を施しています。
設定内容は以下のエントリを参考にしつつ、値を定めています。皆様の環境下で構築を行う場合も適宜読み替えてください。
- 設定内容について
- 大筋は上記エントリに準拠
- ドメイン名はcm.local
- FSMOとなるドメインコントローラはAD-SERVER1.cm.local (当エントリで構築する環境)
- GCとなるドメインコントローラはAD-SERVER2.cm.local (後日投稿するエントリで構築する環境)
- ドメインのNetBIOS名はcm
Install-ADDSForest ` -CreateDnsDelegation:$false ` -DatabasePath "D:\Windows\NTDS" ` -DomainMode "Win2012R2" ` -DomainName "cm.local" ` -DomainNetbiosName "CM" ` -ForestMode "Win2012R2" ` -InstallDns:$true ` -LogPath "D:\Windows\NTDS" ` -NoRebootOnCompletion:$false ` -SysvolPath "D:\Windows\SYSVOL" ` -Force:$true
パスワード入力を終えると、PowerShellによる環境導入が実行されていきます。(パスワード入力については -SafeModeAdministratorPassword というオプションもあるので、ここは指定で盛り込んでしまっても良いかも知れません。)
ひと通りの設定が完了するとOS再起動を促されますので従います。
環境検証
下記エントリで実施している様に、導入処理完了後ntdsutilコマンドを使って所定の内容を確認してみます。問題無さそうですね!
Windows PowerShell Copyright (C) 2014 Microsoft Corporation. All rights reserved. PS C:\Users\Administrator> ntdsutil C:\Windows\system32\ntdsutil.exe: roles fsmo maintenance: select operation target select operation target: connections server connections: connect to domain cm.local \\AD-SERVER1.cm.local に結合しています... ローカルでログオンしているユーザーの資格情報を使って \\AD-SERVER1.cm.local に接続しました。 server connections: quit select operation target: list roles for connected server サーバー "\\AD-SERVER1.cm.local" は 5 個の役割を認識しています スキーマ - CN=NTDS Settings,CN=AD-SERVER1,CN=Servers,CN=Default-First-SiteName,CN=Sites,CN=Configuration,DC=cm,DC=local 名前付けマスター - CN=NTDS Settings,CN=AD-SERVER1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=cm,DC=local PDC - CN=NTDS Settings,CN=AD-SERVER1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=cm,DC=local RID - CN=NTDS Settings,CN=AD-SERVER1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=cm,DC=local インフラストラクチャ - CN=NTDS Settings,CN=AD-SERVER1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=cm,DC=local select operation target: quit fsmo maintenance: quit C:\Windows\system32\ntdsutil.exe: quit PS C:\Users\Administrator>
その他状況についても念の為確認してみます。役割とサーバーグループ。
システムのプロパティより、フルコンピュータ名とドメインの情報。
DNSサフィックス情報。
管理ツールより[Active Directory サイトとサービス]を選択、NTDSセッティングの内容も問題無さそうです。
まとめ
当初の予定では一連の構築手順を1エントリに収めようとしてたのですが、やはり(予想通り)ブラウザのスクロールバーがだいぶ長めな感じになって来ましたのでここでひと区切りとし、続きは別エントリにて展開したいと思います。今回Active Directory環境の構築については自身(ほぼ)初の作業だったのですが、"CUIで極力実現させる"という目標の元色々調べ物をして行く過程で必要となるポイントも見えて来たので勉強になりました。今後もまずはGUIで操作内容を確認し、CUIで出来るかどうかを試してみてポイントを整理するという手法は実践して行こうかなと思います。こちらからは以上です。