AWS EC2でWindows 2016 Server のOSテンプレートを作成

AWS環境でのシステム構築の際に各サーバのベースとなるWindows2016サーバテンプレートを作成した時のメモ。
ドメイン参加はテンプレートを使って各サーバを構築した後にそれぞれのサーバで実行する方針。

# IAMロール作成

- IAMはテンプレートから展開される各サーバに割り当てる事になるのでサーバの役割・用途に応じて作り分けるとよい。
    - 1 つの EC2 インスタンスに同時に関連付けることができるのは 1 つの IAM ロールのみです。インスタンスあたり 1 つというロールの制限を増やすことはできません。
<br>https://aws.amazon.com/jp/iam/faqs/

- とりあえず汎用のIAMロールとして下記の権限でIAMロールを作成

| 用途 | ポリシー | 備考 |
|:--|:--|:--|
| Systems Manager | AmazonSSMManagedInstanceCore | Systems Manager(SSM)でEC2タスクを実行する為の権限。<br>SSMでのCloudWatchAgentインストール時にも必要。 |
| CloudWatch Agent | CloudWatchAgentServerPolicy |  |

- SSM用権限は従来AmazonEC2RoleforSSM を使用してきたが、権限が広すぎる為将来的に非推奨になるとの事
<br>[Developers.IO | 新ポリシー AmazonSSMManagedInstanceCore がサポートされました](https://dev.classmethod.jp/articles/not-recommended-amazonec2roleforssm/)


# EC2インスタンス作成
### Windows 2016日本語版のAMIでインスタンスを作成

- インスタンスイメージ選択画面のクイックスタートには英語版のWindowsサーバのみなので下記を参考に日本語版AMIを選択してインスタンスを作成
    - [Developers.IO | AWS Management ConsoleからWindows Server 2016日本語版AMIを探す
](https://dev.classmethod.jp/articles/search-windows-server-2016-japanese-aws-management-console/)

### Administratorユーザのパスワードを取得
- AWSコンソールから作成したインスタンスのAdministratorユーザのパスワードを取得
    - [Developers.IO | [初心者向け] 初めてのEC2ログイン：Windows編](https://dev.classmethod.jp/articles/first-login-to-ec2-windows/)

# OS初期セットアップ
セキュリティ強化設定や不要サービスの停止、こまごました動作設定を行う。
詳細はこちらに記載。

- [Windows 2016 OSインストール時にやる事リスト](https://qiita.com/sugenuma/items/c7633e9c7ea5c2cdaeb4)
- タイムゾーン設定はSysprepを実行したタイミングで元に戻ってしまうようなのでサーバ複製後に再設定が必要。

# AWS関連設定

### IMDSv1の無効化
- IMDS(Instance Meta Data Service)はIAMロールによるアクセスの際に使用されるが、v1はSSRFに対する脆弱性があるようなので無効化し、IMDSv2が使用されるように設定する。
- 下記を参考にセットアップ
<br>[Developers.IO | [待望のアプデ]EC2インスタンスメタデータサービスv2がリリースされてSSRF脆弱性等への攻撃に対するセキュリティが強化されました！](https://dev.classmethod.jp/articles/ec2-imdsv2-release/)
- AWSブログでは下記のような記載もあり、必要性を判断の上設定を行うのがよいか。新規ならV1は無効にしても不都合ないような気はするが。
https://aws.amazon.com/jp/blogs/news/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/
> 既存のインスタンスメタデータサービス（ IMDSv1 ）は完全にセキュアであり、こちらも引き続きサポートします。

- (2020/4/30追記)現在ではEC2インスタンス作成の際にコンソール上でv2の無効化が出来る様子。
![WS000364.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551087/ce3a5da0-b6e7-9420-f259-fb2e000c35b3.jpeg)

### AWS Tools for PowerShellのセットアップ
- 使用するかどうかは別として標準ツールとして入れておくことにする
- 下記を参考にセットアップ
<br>[Developers.IO | AWS Tools for PowerShellのセットアップ手順](https://dev.classmethod.jp/articles/aws-tools-for-powershell-setup/)
- EC2に設定するIAMロールを使用する前提のためCredentialは設定しない

#####[（参考）PowerShell利用時のクレデンシャルの探索順序](https://dev.classmethod.jp/articles/windows-security-credentials-sdk-store/)
>1. （非推奨）PowerShellコマンド実行時の引数に直接指定されているAccess Key IDとSecret Access Key
2. 指定されたProfile Name、またはProfile Location
3. -Credentialsパラメータで指定されたプロファイル
4. セッションプロファイル
5. defaultプロファイル
6. IAM Roleが指定されているAmazon EC2インスタンスでコマンドを実行している場合、インスタンスプロファイルにあるEC2インスタンスクレデンシャル

# Sysprep実行・AMI取得

そのままAMI取得してサーバーをコピー作成するとインスタンスセキュリティ識別子 (SID) 等の重複が発生してドメイン参加やWindows Server Update Services (WSUS)などで問題が発生する為、Sysprep を実行してインスタンスセキュリティ識別子 (SID)、コンピュータ名、およびドライバーを含む固有の情報を削除する。

- EC2環境の場合はEC2ConfigまたはEC2LaunchでSysprepを実行。
    - Windows Server 2012 R2 まで:　EC2Config
    - Windows Server 2016 以降: EC2Launch
- Sysprepを実行すると最後にサーバがシャットダウンされるので、その状態のインスタンスのAMIを取得する。
- 参考手順
    - [AWS Knowledge Center | Sysprep を使用して、カスタムの再利用可能な Windows AMI を作成およびインストールする方法を教えてください](https://aws.amazon.com/jp/premiumsupport/knowledge-center/sysprep-create-install-ec2-windows-amis/)
    - [Serverworks | 【EC2】Sysprepの手順【Windows】](http://blog.serverworks.co.jp/tech/2019/05/07/sysprepfirst/)
- Sysprepをしないとどういった動作になるかは以下のページに記載あり
    - [Windows Server 2019でSysprepを実行してシステムを初期化する](https://www.rem-system.com/win2019-sysprep/)


# 参考：サーバ展開後に実施する作業
- ドライブ追加
    - Dドライブ以降を追加する場合は実施
    <br>https://dev.classmethod.jp/articles/attach_ebs_volume_to_windows-server/

- タイムゾーン設定
    - テンプレート作成時に設定変更してもSysprepで設定がクリアされてしまう模様。

- IPv6無効化
    - EC2側でIPv6を有効にしていない場合は実施するのがベター
    <br>https://sanuki-tech.net/windows-server-2016/setup/network/

- ネットワークの場所変更
    - 必要に応じてネットワークの場所をパブリックまたはプライベートに設定
    <br>https://www.mosesu.xyz/wordpress/?p=213

- ファイウォールの無効化
    - パブリックネットワークについてはテンプレートで無効化していてもSysprepで設定がクリアされ有効化されてしまう模様。パブリックネットワークに設定する場合は必要に応じて再度無効化。

- ホスト名変更
    - https://sanuki-tech.net/windows-server-2016/setup/computer-name/

- Administratorユーザの無効化
    - テンプレート作成時に設定変更してもSysprepで設定がクリアされてしまう模様。
    - セキュリティ強化のためにAdministratorユーザの無効化を行う場合は実施。但しその場合は代わりにAdministrator権限を持つ別のユーザを作成しておくこと。

- CloudWatch Agentインストール
    - CloudWatch AgentはSystems Manager(SSM)から一括インストールが可能なので、後からインストールした方が設定修正なども発生しないだろうと考えてテンプレートにはいれなかった。
    - 作業実施時は下記を参考に実施
    <br>[Developers.IO | CloudWatch Agentを使ってWindows Serverのメトリクスを監視してみた](https://dev.classmethod.jp/articles/cloudwatch-agent-windows-20181003/)
    <br>[WindowsServerにCloudWatch エージェントを入れてリソース監視](https://hacknote.jp/archives/50483/)