OpenAMのデータストアをOpenDJで構築し連携させる設定

# OpenDJの環境構築

前回、[OpenAMのSAML認証でAWSへログインするまでの設定](https://qiita.com/ot-nemoto/items/50b259bb53a5d41ad657)でOpenAMを構築しましたが、とりあえずOpenAM内にデータストアをもつように定義しました。

今回は、データストアを外に出す場合の設定変更についてです。

データストアはOpenDJを利用します。OpenDJを構築するための[CloudFormationのテンプレート](https://github.com/ot-nemoto/cloudformation-openam-template)はOpenAMに同じです。

CloudFormationで構築するための前提は、

- aws-cli がインストールされ、プロファイルの設定がされていること
- HostedZoneに ドメイン が登録されていること
- 対象のRegionに キーペア が作成されていること
- 実行するIAMユーザに十分な権限があること
- OpenDJは事前にForgeRockからダウンロードします(要アカウント登録)
  - CloudFormation でrpmファイルをダウンロードするため、ダウンロード可能な場所に配置して下さい
  - パブリックなS3は[前回のOpenAMの構築手順](https://qiita.com/ot-nemoto/items/50b259bb53a5d41ad657)からの続きになります。

```sh
# バケット名を取得
BUCKET_NAME=$(aws cloudformation describe-stacks \
  --stack-name public-bucket \
  --query 'Stacks[].Outputs[?OutputKey==`BucketName`].OutputValue' \
  --output text)
echo ${BUCKET_NAME}
  #

# OpenAMのwarファイルをS3にアップロード
aws s3 cp opendj-3.0.0-1.noarch.rpm s3://${BUCKET_NAME}/

# アップロードしたRPMファイルのURIを取得
DONWLOD_URI=$(aws cloudformation describe-stacks \
  --stack-name public-bucket \
  --query 'Stacks[].Outputs[?OutputKey==`DownloadUri`].OutputValue' \
  --output text)
echo ${DONWLOD_URI}
  #
```

RPMをダウンロード可能な場所に配置したら、環境変数を設定します。

```sh
# 例)
KEY_NAME=openam-key
HOSTED_ZONE_NAME=example.com.
OPENDJ_RPM_URI=${DONWLOD_URI}/opendj-3.0.0-1.noarch.rpm
ROOT_PW=secret
BASE_DN=dc=example\\\,dc=com
```

それでは、以下のコマンドでOpenDJの環境構築を行います。


```sh
aws cloudformation create-stack \
  --stack-name opendj \
  --capabilities CAPABILITY_IAM \
  --parameters ParameterKey=KeyName,ParameterValue=${KEY_NAME} \
               ParameterKey=HostedZoneName,ParameterValue=${HOSTED_ZONE_NAME} \
               ParameterKey=OpendjRpmUri,ParameterValue=${OPENDJ_RPM_URI} \
               ParameterKey=RootPw,ParameterValue="${ROOT_PW}" \
               ParameterKey=BaseDn,ParameterValue="${BASE_DN}" \
  --template-body file://opendj-template.yml
```

# OpenAMのデータストアの設定変更

### データストアの更新

- Administratorユーザ(`amAdmin`)でログイン
- `Top Level Realm` > `Data Stores`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297616/e2359e09-7ec7-d3cc-e232-05646639196d.png)

- `新規`をクリック

### データストアのタイプを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297616/bcc5fa4e-a3b1-15ab-039c-2d89f101e931.png)

- 名前: OpenDJ（任意）
- タイプ: OpenDJ
- `次へ` をクリック

### 新規データストア

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297616/752e3d80-3a67-db56-7cba-dd9c831bb106.png)

- LDAPサーバー: （例: example.com:389）
- LDAPバインドDN: （例: cn=Directory Manager）
- LDAPバインドパスワード（LDAPバインドパスワード（確認））: （例: password）
- LDAP組織DN: （例: dc=example,dc=com）
- デフォルトで設定されている `localhost:50389` は削除してください。
- 他の設定はデフォルトのままで。
- `終了` をクリック

※上記手順でOpenDJを構築した場合、設定値は以下から取得できます。

*LDAPサーバー*

```sh
aws cloudformation describe-stacks \
  --stack-name opendj \
  --query 'Stacks[].Outputs[?OutputKey==`LDAPServer`].OutputValue' \
  --output text
```
*LDAPバインドDN*

```sh
aws cloudformation describe-stacks \
  --stack-name opendj \
  --query 'Stacks[].Outputs[?OutputKey==`LDAPBindDN`].OutputValue' \
  --output text
```
*LDAPバインドパスワード*

```sh
aws cloudformation describe-stacks \
  --stack-name opendj \
  --query 'Stacks[].Outputs[?OutputKey==`LDAPBindPW`].OutputValue' \
  --output text
```
*LDAP組織DN*

```sh
aws cloudformation describe-stacks \
  --stack-name opendj \
  --query 'Stacks[].Outputs[?OutputKey==`LDAPBaseDN`].OutputValue' \
  --output text
```

### ローカルのデータストアを削除

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297616/da592e2e-4009-ea9b-18a7-d5735e71dde9.png)

- `embedded` のチェックボックスをチェックし、`削除` をクリック

設定は以上です。
ユーザを作成できたら、OpenDJのサーバへログインし以下のコマンドでユーザがLDAPに作成できていることを確認できます。

```sh
/opt/opendj/bin/ldapsearch \
  -D "<LDAPバインドDN>" \
  -w <LDAPバインドパスワード> \
  -b "ou=people,<LDAP組織DN>" "objectclass=*"
```

以上