IBM Cloud: IBMidを利用せずにIBM Cloudのユーザーを作成する方法(App ID連携）

# 1. はじめに
IBM Cloudにログインするためには一般的にはIBMidを利用するが、[IBM Cloud: SAM Federation方式の比較（IBMid Federation v.s. IBM Cloud App ID)](https://qiita.com/testnin2/items/9115aea95d47f32050df)にも記載した通り、IBMidを利用せずに外部IdPを使うことも可能である（つまりIBMidのようにメールアドレスをIDとして利用する必要もない）。今回は、そのための連携ツールであるIBM Cloud App IDと、そのApp IDに内包されているユーザー管理ツールのCloud Directoryを使って、ユーザーの作成、ログイン、CLIやClient-to-Site VPNが利用できることまでを確認してみた。

P.S. [App IDのユーザーでIBM Cloudのポータルを利用する](https://qiita.com/teruq/items/af2c29d8bab6d6cbe91e)を参考にさせてもらいました。

# 2. App IDの注文

`https://cloud.ibm.com/catalog/services/app-id`から注文可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/87766f6e-d43f-ce0e-8d3a-081b28099f6c.png)


# 3. App ID: 利用可能なIdPを選択。

今回は、外部IdPとしてApp IDに付随するCloud Directoryを利用する。よって、Cloud Directory以外は利用できないように構成する。（デフォルトでは、Facebook, Google, Anonymousが有効になっている）。
**外部SNSで認証されたユーザーが誰でもIBM Cloudアカウントにログインできてしまうようなことを避けるため、必ずCloud Directory以外は無効にする。[IBM Cloud docs](https://cloud.ibm.com/docs/account?topic=account-idp-integration)にも同様の注意が記載されている。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/f889b078-3c2f-4406-ba4f-4a89b5d1e5cb.png)

# 4. App ID: Cloud Directoryの設定

[参考情報](https://cloud.ibm.com/docs/appid?topic=appid-cloud-directory)

- ログイン方式は（せっかくIBMidを使わないのだから）、`Email and password`ではなく`Username and password`を今回は選択してみる。
- URLを知っている人が勝手にユーザーを追加できてしまうことを避けるため、`Allow users to sign-up to your app`はNoにする（**これは必ずNoにすることをお勧めします**）。
- 今回は、勝手にアプリから勝手にパスワードを変更したり、ユーザー情報を編集させたくないので、今回は`Allow users to manage their account from your app`もNoにする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b4e6aba1-7628-fa2b-33dd-2f0207d07787.png)

# 5. Default IDP URLの構成

IBM Cloud Portalの ` Manage -> Access(IAM)-> Identity providers` もしくは`https://cloud.ibm.com/iam/identity-providers` にて構成。
IBM Cloud Portalにて、このApp IDを登録する。まず、最初にDefault IDP URLを構成する。App IDで認証する際には、`https://cloud.ibm.com`ではなく、この`https://cloud.ibm.com/authorize/xxxx`というURLを使って認証する。よって、この`xxxx`はアカウント固有の識別子となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0a823e7b-52a4-9296-25d1-ac5218cbd308.png)

# 6. IBM CloudのIdentity Providerとして上記で作成したIBM Cloud App IDを登録

IBM Cloud Portalの ` Manage -> Access(IAM)-> Identity providers` もしくは`https://cloud.ibm.com/iam/identity-providers` にて構成。
`Create`を選択して、今回注文したApp IDインスタンスを登録する。
- 名称などを入力![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/9582068e-bad7-636e-1afb-36ec7335f9ca.png)
- realm IDで切り替えられるように、`Set as the default`にはチェックを入れない。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/8d75329a-5c46-95e1-de82-648b6f3f4716.png)
- このIdPにアクセスする時のIdP URLは以下からでも確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5ba09902-b157-434b-cf86-f4a371ef2c04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6f955ed6-a61e-007f-5a15-0c320327500a.png)


# 7. App ID: Cloud Directoryでのユーザーの作成

- usernameとpasswordを登録する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/59467039-f5b3-80bc-631b-9bce3cb69db9.png)

# 8. ユーザーへの動的な権限の追加

今回はClient-to-site VPNのための権限を動的に追加する構成を追加した。ユーザーが初回ログインするまで、アカウントにユーザーは追加されないのであらかじめ静的に権限を付与しておくことはできない。App IDで連携されたユーザーに動的に権限を付与しておくために、[IBM Cloud: App IDのユーザーに動的に権限を設定する](https://qiita.com/testnin2/items/c886d07fbb25f87ea59c)を参考にして動的ruleを追加する。

（運用的には手間になるが、ユーザーが初回ログインした後に、IAMで権限を付与しても良い。テスト・検証目的ならこのやり方でもいいかもしれない）

# 9. App ID ログイン画面のカスタマイズ

タブ名やフッターノートは簡単に変更できるが、ロゴはUIから変更できなかった。[IBM Cloud: App IDのログイン画面にロゴをアップロードする方法](https://qiita.com/testnin2/items/81b971b60fe33f347089)を参考に、お好みでやってください。分かりやすくするため、私は変更しておきました。


# 10. Customer Portalへのログインテスト

App ID連携したIDPにアクセスする際には、`https://cloud.ibm.com`ではなく、以下のいずれかを利用する。

- セクション6で`Set as the default`にチェックが入れているならば`https://cloud.ibm.com/authorize/xxxxx`でアクセス可能。
- セクション6で`Set as the default`にチェックが入れていない場合には、`https://cloud.ibm.com/authorize/xxxxx`にアクセスした際に、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/48d1e208-1efb-99a0-4e83-5a26e25ef295.png)
のような選択肢が出るので、ここで該当のApp IDを選択しても良い。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/2135f8fa-14fa-b71b-eb31-78537a4f5f58.png)

- もしくは直接`https://cloud.ibm.com/authorize/xxxxx/<Realm ID>`でアクセスしても良い。

いずれにしても、上記のいずれかを選択することで、以下のようにApp IDで構成されるログイン画面に転送される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/201d1fca-ddd0-3a57-6970-b85256fb7a59.png)

認証が完了すると、IBM Cloudポータルにログインできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a6d31a17-27cb-b682-a511-1bc2e23485c9.png)



# 11. CLIでのログインテスト

[IBM Cloud: 認証用passcodeの取得方法](https://qiita.com/testnin2/items/0428b24b41f135a5ef3f)で紹介した通り、App ID連携されたユーザーでもログイン可能。

# 12. Client-to-Site VPNユーザーの検証

今回は、Client-to-Server VPNにて、「ユーザーIDとパスワード」を選択している際の検証である（クライアント証明書方式であれば、そもそもApp ID連携しているかどうかに関係なく成功できてしまうに決まっているので）。

1. passcodeを取得する[IBM Cloud: 認証用passcodeの取得方法](https://qiita.com/testnin2/items/0428b24b41f135a5ef3f)にて取得可能。
2. 認証時に今回Cloud Directoryで作成したユーザーのユーザー名を入れる（IBMidではないためメールアドレスではない！）。パスワード欄には上記で取得したpasscodeを入力。<br><img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/8566ef52-ba8e-06a9-7445-5ebcb502be5e.png">
3. 無事ログインできた。Client-to-Server VPNの接続履歴からも確認可能。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ee8c375f-272d-90e8-1f82-5e5d755a0db1.png)


VPC上のサーバーにもPC端末から接続できる。

```
syasuda@MacBook ~ % ping 10.0.0.4
PING 10.0.0.4 (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: icmp_seq=0 ttl=63 time=82.822 ms
64 bytes from 10.0.0.4: icmp_seq=1 ttl=63 time=125.507 ms
64 bytes from 10.0.0.4: icmp_seq=2 ttl=63 time=170.078 ms
64 bytes from 10.0.0.4: icmp_seq=3 ttl=63 time=216.251 ms
^C
--- 10.0.0.4 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 82.822/148.665/216.251/49.744 ms
```