IBM Cloud 新しい認証認可の仕組み(IBM Cloud IAM)の概要

　IBM Cloudは2017年10月にリブランドを行い、従来IBM Bluemix Infrastructure(もともとのSoftLayer, IaaS)、IBM Bluemix(PaaS)をIBM Cloudブランドに統合しました。ブランド名は一瞬で変わる一方で、それぞれの管理体系は徐々に統合されており、古い管理体系が残っています。管理ポータル画面やAPI/CLIも同じIBM Cloudなのに複数あってわかりにくいというご指摘はごもっともで、これらは今後も徐々に統合されていきます。
　今回ご紹介するIBM Cloud Identity and Access Management(IAM)は、IBM Cloud内でご利用可能なサービスへの認証と、リソースへのアクセス制御を目的として新たに登場した機能です。従来から存在するIaaS/PaaSの認可の仕組みも現時点では残っており、これらも徐々にIAMへの対応がなされていく予定です。

# IBM Cloud IAMが提供する主な機能
IBM Cloud IAMは以下のような機能をご提供いたします。これらの機能はIBM Cloudのプラットフォームが提供する機能としてアカウントの種類にかかわらず無料でご利用いただけます。
**ユーザー管理**
IaaS/PaaSサービスを通じたユーザーの管理機能を提供します。
**厳格なアクセス管理**
ユーザーとサービスIDを用いたアクセスはポリシーにより定義されます。ポリシーはアクセス可能なリソースと役割を含みます。役割はプラットフォームレベルの管理タスク、サービスレベルでの管理コンソールへのアクセスやAPIコールの実行などアクションに対する実行権限から構成され、必要に応じて複数の役割を付与できます。
**リソース・グループ**
リソースは単体で利用されることもありますが、複数のリソースを組み合わせて利用されるケースが大半です。複数のリソースを組み合わせてリソース・グループを形成することが可能です。アクセス権を記述するポリシーのスコープとしてもご利用可能です。ライト・アカウントでは１つのみ利用できます。
**サービスID**
サービスIDはユーザーIDがユーザーを特定するのと同じようにサービスやアプリケーションを識別します。サービスIDに対してもユーザーと同じようにポリシーによるアクセス管理を提供します。
**APIキー**
APIキーはお客様の認証プロバイダーとのフェデレーションを実施されているお客様などで認証機能を提供します。
**管理コンソールおよびCLI**
IBM CloudコンソールおよびCLIを通じてIBM Cloud IAMの機能をご利用いただけます。

# ポリシーを設定する前に
　
　IBM Cloudが提供するサービスのうち、従来IaaS側のサービスとしてご提供しPaaS側のコンソールでもご利用いただけるようになったIBM Cloud Object Storageを例にポリシーの設定してみたいと思います。ポリシー自体をまだ説明していないので、作成時に指定するスコープと役割について説明します。
　なお、すべてのユーザーが自由にポリシーを作成できるわけではありません。特に設定されていないアカウントではポリシー作成はアカウント所有者の方にのみ許可された操作なのでご注意ください。


### ポリシーで設定するスコープ
ポリシー作成時にスコープを定義します。スコープとはそのポリシーが有効になる範囲を意味し、以下の4つがあります。
1. すべての ID およびアクセス対応サービス (アカウントに紐づくすべてのIAM対応サービス・インスタンス)
2. 特定の ID およびアクセス対応サービス
3. ID およびアクセス対応サービスのインスタンス
4. リソース・グループ
「ID およびアクセス対応サービス」は現在のIBM Cloudコンソール上での記述で、IAM対応のサービスを意味します。また、これらに加えてリージョン（米国南部、英国、シドニー、ドイツ）をスコープに加えることもできます。

### ポリシーで設定する役割
2種類の役割が存在します。プラットフォーム管理用の役割、サービスへのアクセス用の役割です。ユーザーが実施すべきアクションに応じてそれぞれの役割を付与することが可能です。付与しない場合には該当するアクションの実行権限なしとなります。

- プラットフォーム管理用の役割
 
IBM Cloudプラットフォーム上での管理タスクを実施するための権限を与えるものです。サービス・インスタンスの作成・変更、ユーザーやサービスIDの管理などを含みます。プラットフォーム管理用の役割には以下のものがあります。

| プラットフォーム管理用の役割 | サービスに対するアクション | サービスIDに許可されたアクション | リソース・グループに対するアクション | リソース・グループ内のリソースに対するアクション |
|:--|:--|:--|:--|:--|
| ビューアー(Viewer) | インスタンスの表示、クリデンシャルの表示 | IDの表示、APIキーの表示 | リソース・グループの表示 | リソース・グループ内のリソースの表示 |
| オペレーター(Operator) | インスタンスの表示、クリデンシャル情報の管理 | N/A | N/A | N/A |
| エディター(Editor) | インスタンスの作成・削除・編集・表示、クリデンシャル情報の管理 | IDの作成・削除・表示、APIキーの作成・削除・表示 | リソース・グループの表示・名称変更 | リソース・グループ内のリソースの作成・削除・編集・表示 |
| 管理者(Administrator) | すべての管理用アクション | IDの作成・削除・表示、APIキーの作成・削除・表示、IDに対するポリシーのアサイン | リソース・グループの表示・編集・アクセス権限の管理 | リソース・グループ内のリソースに対する全ての管理用アクション |

- サービスへのアクセス用の役割
 
特定のサービス・インスタンスを操作するための権限です。管理コンソールへのアクセス、APIコールの呼び出しなどが対象です。サービスへのアクセス用の役割には以下のものがあります。

| サービスへのアクセス用の役割 | サービスに対するアクション |
|:--|:--|
| リーダー(Reader) | 一覧の表示・閲覧など読み取り専用のアクション |
| ライター(Writer) | 作成・編集などの書き込みおよび読み取りのアクション |
| マネージャー(Manager) | サービス内部の設定の変更などのアクション、書き込みおよび読み取りのアクション |

ここまでご説明したスコープと役割を組み合わせて、ポリシーを設定します。例えば開発チームのリーダーにはIBM Cloud Containerサービスをスコープとして、プラットフォーム管理用のエディター、サービスへのアクセス用のマネージャーの役割を付与するというようなことをします。設定方法はこのあと説明しますので、もう少々お待ち下さい。

### ポリシーを設定権限を付与する（ポリシーをアカウント所有者以外でも操作したい場合）
　先述のとおりポリシーはユーザーが自由に設定できるわけではありません。アカウント所有者は全ての操作をできるのですが、ご契約形態によってはアカウント所有者の方が実際にはほとんどポリシーの操作のような細かな管理を実施されないケースもあると思います。
　このようなケースではアカウント所有者の方がコンソール上から全てのIAM対応サービスへの管理者権限を付与する必要があります。
　簡単に手順を示します。
- アカウント所有者として[IBM Cloud](https://console.bluemix.net)にログインします
- 「管理」 > 「セキュリティ」 > 「IDおよびアクセス」を選択します
<img width="245" alt="スクリーンショット 2017-12-13 4.19.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/8191a2fb-3641-285c-d6d0-675c940e8cf5.png">
- 権限を付与したいユーザーの名前をクリックします
- 「Assign access」ボタンをクリックします
<img width="947" alt="スクリーンショット 2017-12-13 4.24.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/681cb374-00c9-46a5-71a7-fbf4cc4156f6.png">
- 「リソース・インスタンス・アクセス」ボタンをクリックします
<img width="354" alt="スクリーンショット 2017-12-13 4.26.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/88a67acf-4dc5-005a-76fc-9ff473601c57.png">
- サービスに「すべてのIDおよびアクセス対応サービス」、役割の選択でプラットフォームのアクセス役割の割り当ての「管理者」にチェックを入れ、「Assign」ボタンをクリックします
<img width="1019" alt="スクリーンショット 2017-12-13 4.28.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/20258c26-2724-6550-ce99-6ac7713a493b.png">

以上でアカウント所有者の方の操作は終わりです。
複数のメンバーに権限を与える必要がある場合には画面左側の「ユーザー」へのリンクを使って別のメンバーに対する操作を続けます。

# IBM Cloud Object Storageに対するポリシーを付与する

ここからはIBM Cloud Object Storageに対するポリシーを設定していきます。

### どのようなポリシーを設定すればいいのか
　システムの開発・運用の現場では開発者は本番データにアクセスしない、業務担当者には読み取り専用でのみデータにアクセスさせたいなどお客様もしくはシステムごとで暗黙のルールとして決められているルールがあるかと思います。そのルールを遵守できるようにポリシーを策定いただければよいです。
 以降の例では業務部門の責任者でIBM Cloudコンソール上からデータのアップロードを行う必要があるケースを想定して設定を進めていきます。IBM Cloudコンソールへのアクセスが必要なことからプラットフォーム管理用の役割の「ビューアー」、ファイルのアップロードを必要とすることからサービスへのアクセス用の役割の「ライター」が必要になります。

### IBM Cloud Object Storageサービス・インスタンスを作成する
以下の手順でアクセス管理対象のCloud Object Storageサービスのインスタンスを作成します。
- [IBM Cloud](https://console.bluemix.net)にログインします
- 画面上部のカタログをクリックします
- 「オブジェクト・ストレージ」のタイルをクリックします
<img width="151" alt="スクリーンショット 2017-12-13 5.01.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/5c639e5a-cfae-c102-238a-d242d2bccd6c.png">
- 次の画面に遷移後しばらくすると画面右下の「作成」ボタンが活性化するのでクリックします
<img width="1237" alt="スクリーンショット 2017-12-13 5.03.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/eb462527-6058-e459-7ecb-35ff63e80d5a.png">
- クリック後、インスタンスが作成され、以下のような画面に遷移します。これで準備は完了です。
<img width="1240" alt="スクリーンショット 2017-12-13 5.07.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/b3200ca1-ef1e-9f66-c4ac-f49a2d997291.png">


### 権限を付与されるユーザーがこの時点で何ができるのか
サービスインスタンスを作成しましたが、この時点でポリシーでアクセス権限を付与されるユーザーが何をできるか確認しておきましょう。別のWebブラウザーが利用可能ならそちらをご利用ください。権限を付与されるユーザーとして[ダッシュボード](https://console.bluemix.net/dashboard/apps)へアクセスし、サービス・インスタンス自体が表示されないことを確認します。

インスタンスを作成したユーザーでの表示
<img width="1125" alt="スクリーンショット 2017-12-13 5.11.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/3aaf06fa-79ed-c775-d9d6-1d21bc40dea4.png">
権限を付与されるユーザーでの表示
（表示されない）



### ポリシーを作成する
以下の手順でポリシーを作成します。

- [IBM Cloud](https://console.bluemix.net)にログインします
- 「管理」 > 「セキュリティ」 > 「IDおよびアクセス」を選択します
<img width="245" alt="スクリーンショット 2017-12-13 4.19.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/8191a2fb-3641-285c-d6d0-675c940e8cf5.png">
- 権限を付与したいユーザーの名前をクリックします
- 「Assign access」ボタンをクリックします
<img width="947" alt="スクリーンショット 2017-12-13 4.24.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/681cb374-00c9-46a5-71a7-fbf4cc4156f6.png">
- 「リソース・インスタンス・アクセス」ボタンをクリックします
<img width="354" alt="スクリーンショット 2017-12-13 4.26.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/88a67acf-4dc5-005a-76fc-9ff473601c57.png">
- サービスに「Cloud Object Storage」、サービス・インスタンスに「Cloud Object Srorage-cp」(さきほど作成したもの)、役割の選択でプラットフォームのアクセス役割の割り当てから「ビューアー」、サービスのアクセス役割の割り当てから「Writer」にチェックを入れ、「Assign」ボタンをクリック
<img width="1016" alt="スクリーンショット 2017-12-13 5.17.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/a9d202cb-e40c-11fe-ac87-a58b1474a5e3.png">
<img width="1016" alt="スクリーンショット 2017-12-13 5.30.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/c01be35f-7c1b-c45a-9854-59cdaa45a561.png">
<img width="1016" alt="スクリーンショット 2017-12-13 5.28.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/4f55a300-0b14-7852-252a-eaf807b32088.png">


### 権限が付与されたことを確認する
権限を付与されたユーザーとして[ダッシュボード](https://console.bluemix.net/dashboard/apps)へアクセスします。すると、先ほどは表示されなかったインスタンスが表示されます。名前の部分をクリックします。
<img width="1159" alt="スクリーンショット 2017-12-13 5.35.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/f2f256cc-6159-cf90-d480-0db454d93f7a.png">
Cloud Object Storageのダッシュボードが表示されます。ここからObject Storageにオブジェクト（何らかのファイル）を登録していきます。bucket)
<img width="991" alt="スクリーンショット 2017-12-13 5.36.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/4a31eb72-1a6b-d3e1-f937-a25a8ab42dc9.png">
バケツ作成用のダイアログが表示されるので、bucketの名前（固有の名称である必要あり）、Resiliencyを「Cross Region」、Locationを「us-geo」、Storage classを「Flex」として「Create」ボタンをクリックします。
<img width="321" alt="スクリーンショット 2017-12-13 5.40.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/98d69dfa-4904-a918-4633-5e4811babd33.png">
バケツが作成されました。IAMのアクセス管理の機能で権限が付与されていることは個々までで確認できました。引き続きオブジェクトも追加します。デスクトップやExplorerからファイルをドラッグ・アンド・ドロップでObjectsの下にあるテーブルに落としてみます。
<img width="940" alt="スクリーンショット 2017-12-13 5.47.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/d81946c7-428b-ae0e-5414-23eadc8af2a3.png">
ファイルのアップロードが終わると以下のようにObjectsの表にファイルが一つ追加されました。
<img width="838" alt="スクリーンショット 2017-12-13 5.52.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/1c2be17b-8bf3-56fc-3c52-3a60ddf09195.png">

# まとめ

IBM Cloud IAMの概要とポリシーを作成する方法を一通り実施いたしました。IAM対応のサービスはまだまだ少ないですが今後は従来からあったサービスのIAM対応も予定され、IAM自体の機能強化も予定されておりますのでご期待下さい！
IAM自体について、PaaS platformが従来から使用してきたCloud Foundryの役割との接続(alias)やCLIからの設定などまだまだトピックはたくさんあるのですが、それらはまたの機会に触れたいとおもいます。

# 参考文献
[IDおよびアクセス管理] (https://console.bluemix.net/docs/iam/iamusermanage.html#iamusermanage)
[IBM Cloud Blog: Resource Groups and Access Management](
https://www.ibm.com/blogs/bluemix/2017/12/resource-groups-access-management/ )