AWS Microsoft ADをAnsibleでユーザ管理する

# はじめに

AnsibleでAWS Microsoft ADサービスのユーザ管理をしてみます。
記事ではAWS Microsoft ADにスコープをあてていますが
おそらくそれ以外のActiveDirectoryでも同じように管理できると思います。

# 参考記事と前処理

* [AWS Directory Service] Microsoft ADのセットアップ手順

https://qiita.com/ai-2723/items/e276a93195ad019e1a2e

AWS Microsoft ADとADを操作するインスタンスを構築できます。
この記事に従い、AWS Microsoft ADと操作用のインスタンスを立ち上げます。

* AnsibleでWindowsを操作する準備をする

https://qiita.com/yunano/items/f9d5652a296931a09a70

WindowsでAnsibleのTaskが動くようにしておきます。
オペレーション元はWindowsでなくて大丈夫です。
私は他のLinuxサーバと同じ場所からPlaybookを切り替えて操作できるようにしています。
  
# 手順

## Windowsサーバのドメイン参加

操作対象のWindowsサーバを、AWS Microsoft ADのドメインに参加させます。
この時、AWS Microsoft ADを作成するときに作成した管理ユーザで
ログインできるか確認しておきます。

*ADの利用は、AD上のユーザにログインしてから行う必要があります。*

## ドメイングループの作成

### グループ変数の定義

ここでは、varsファイルでグループ変数を定義します。
リスト型の変数で定義できればどのような方法でもよいでしょう。

``` yaml:vars/main.yml
ad_group:
  - example_gourp_1
  - example_gourp_2
  - example_gourp_3
```

### タスクの実行

``` yaml:tasks/main.yml
- name: create group
  win_domain_group:
    name: "{{ item }}"
    scope: domainlocal
    domain_username: "{{ ad_domain }}\{{ ad_admin_user }}"
    domain_password: "{{ ad_admin_pass }}"
  with_items:
    "{{ ad_group }}"
```

* ad_domain
* ad_admin_user
* ad_admin_pass

上の3つの変数はどこかで定義しておきます。
それぞれ、AWS Microsoft AD作成時に指定したパラメータを使用します。
最も、ポリシーとして別のユーザを作成し
そのユーザを使ってもよいでしょう。

簡単にパラメータを解説します。
恒例ではありますが、
正確な内容は公式リファレンスを参照してください、
https://docs.ansible.com/ansible/latest/modules/win_domain_group_module.html

| パラメータ名    | 説明                                              |
|-----------------|---------------------------------------------------|
| name            | グループ名です                                    |
| scope           | ADのスコープです。私はdomainlocalで運用しています |
| domain_username | ドメインを登録するのに使うユーザ名です            |
| domain_password | ドメインを登録するのに使うユーザパスワードです    |


## ドメインユーザの作成

### ユーザ変数の定義

varsファイルでユーザの変数を定義します。

``` yaml:vars/main.yml
ad_user:
  - name: ad_example_user1
    last_name: user1_last_name
    first_name: user1_first_name
    list_group:
		- example_gourp_1
		- example_gourp_2
    email: ad_example_user1@example.com
  - name: ad_example_user2
    last_name: user2_last_name
    first_name: user2_first_name
    list_group:
		- example_gourp_1
    email: ad_example_user2@example.com
```

### タスクの実行

``` yaml:tasks/main.yml
- name: create user
  win_domain_user:
    name: "{{ item.last_name }}"
    surname: "{{ item.last_name }}"
    firstname: "{{ item.first_name }}"
    company: company_name
    password: "{{ password[item.name] }}"
    state: present
    update_password: on_create
    groups:
      "{{ item.list_group + ['Domain Users'] }}"
    upn: "{{ item.name }}@{{ ad_domain_name }}"
    email: "{{ item.email }}"
    attributes:
      displayname: "{{ item.name }}"
    domain_username: "{{ ad_domain }}\{{ ad_admin_user }}"
    domain_password: "{{ ad_admin_pass }}"
  with_items: "{{ ad_user }}"
```

AD操作用ユーザのパラメータはgroup作成時と同じです。

こちらでも簡単にパラメータを解説します。
詳細は同じく公式リファレンスを参照してください。
https://docs.ansible.com/ansible/latest/modules/win_domain_user_module.html

| パラメータ名    | 説明                                                                                                                         |
|-----------------|------------------------------------------------------------------------------------------------------------------------------|
| name            | ユーザ名です。                                                                                                               |
| password        | ユーザのパスワードです。                                                                                                     |
| update_password | どのタイミングでパスワードをアップデートするかしています。                                                                   |
| surname         | ADのsurnameパラメータの値です。last_nameに相当します。                                                                       |
| firstname       | ADのfirstnameパラメータの値です。                                                                                            |
| company         | ADのcompanパラメータの値です。                                                                                               |
| email           | ADのemailパラメータの値です。                                                                                                |
| groups          | ユーザの所属グループです。ここではDomain Usersグループには必ず所属するようにしています。                                     |
| upn             | ユーザー・プリンシパル名です。                                                                                               |
| attributes      | Ansibleで予約されているパラメータ以外の属性を指定するときに利用します。辞書型でパラメータのキー:パラメータの値を指定します。 |
| domain_username | ドメインを登録するのに使うユーザ名です                                                                                       |
| domain_password | ドメインを登録するのに使うユーザパスワードです                                                                               |

### ADの確認

Windows ServerにRDPでリモート接続し、「Active Directory Users and Computers」サービスで
ADの構造を確認することができます。

![ad_001.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/7c4ac5ac-6221-03b4-8efe-0b0d3bd187b4.png)


# おわりに

最初は手で構築する必要がありますが、その後はAnsibleで運用をいい感じにできそうです。
SSOなどと組み合わせることによって効率よくユーザ管理できるといいですね。