OpenAMと連携したPolicy Agentの設定をさわってみる　その２

## 今日やること

OpenAMと連携したPolicy Agentは、OpenAM側で設定された認可設定をつかって、以下のようなアクセス制御を実装することができます。

* あるユーザー属性をもった認証済みユーザーだけがアクセスできる
* GETはできるけどPOST、PUT、DELETEはできない
* 特定のURLにたいしてアクセス制御のルールを適用できる
* 送信元IPアドレスなんかを評価して制御する

## OpenAMの認可設定ってなに？

OpenAMの認可設定では、アクセスを許可するか拒否するかを決定する方法を定義することができます。認可設定を定義して、OpenAMがリソースへのアクセスを許可するかどうかを判断できるようすることで、Policy Agentはその設定に依存し、ユーザーからのアクセスに認可を適用することができます。

ちなみに、認可設定は以下のような設定をすることができます。

* Resource
    - Resourceは、認可設定を適用するURLを指定することができます
* Action
    - Actionは、Webサーバー上のページの閲覧、フォームの送信など、ユーザーがResourceに対して行うことができる操作を指定することができます
    - GET、POST、PUT、DELETE などのHTTPのRequest Methodで定義します
* Subject
    - Subectは、認証したユーザーの属性を評価するルールを指定することができます
    - 認証されていればOKとするとか、管理者のみOKとするとか、ある所属の人であればOKなどを定義できます
* Environment
    - Environmentは、認証したユーザーの属性ではなく、時間や送信元IPアドレスなどの状態を評価するルールを指定することができます。
* Response Attribute
    - これはあまり使いどころが正直わからないです
    - 定義した認可設定にマッチした場合に、レスポンスに含むユーザーの属性を指定するというような項目だと思っています
    - しかし、ユーザー属性は昨日のプロファイル属性処理の設定とかで連携したらよいのでは？認可のフェーズで連携すると嬉しいユースケースがあるのでしょうか？わかんない(◞‸◟)

## 前準備

では、試す前にすこし前準備をします。

### Webサーバー上にリソースを作成

[前回](http://qiita.com/nanazero/items/f4b59e3923e3057d3406)作成したHTTP HEADERを表示するCGIプログラム（`https://web.example.com/cgi-bin/headerinfo.pl`）を使い回します。

### SSOのみモードの無効化

昨日、有効化した**SSOのみモード**を無効化します。この設定が有効化されていると、認可設定が一切評価されず、OpenAMの認証済みCookieを持ってさえいれば、だれでもアクセスできてしまうためです。

まず、ブラウザを立ち上げて、OpenAMの管理者アカウント（ユーザー名はamadmin）でサインインし、Top Level Realm => Applications => Web Agentsにアクセスし、前々回に作成を行ったPolicy Agentの設定であるWebPolicyAgentForApache22をクリックします。

画面中段にある、**SSOのみモード**のチェックボックスを外し、**保存**をクリックします。

<img width="677" alt="001.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/fcb109bc-1a4a-2df0-da05-58c1e687f868.png">

### この時点で403 Forbiddenになる

試しに、Policy Agentが導入ずみのWebサーバーにアクセスしてみましょう。
ユーザーは管理者アカウント(`amadmin`)でも、デモアカウント(`demo`)でも、[前回](http://qiita.com/nanazero/items/f4b59e3923e3057d3406)作ったアカウント(`johnd`)でもいいですが、OpenAMでサインイン後、アクセスをすると**403 FORBIDDEN**（「閲覧禁止」「禁止されています」の意）となります。

<img width="654" alt="002.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/b467cd5b-3792-9068-20da-0b96ac777ab4.png">

## johndだけがアクセスできる

ここから徐々にアクセスを許可するルールを追加していきましょう。
まずは、**johndだけアクセスできる**という設定です。

### 認可設定

OpenAMの管理者アカウント（ユーザー名はamadmin）でサインインし、Top Level Realm => Authorization => Policy Sets => Default Policy Setにアクセスします。

<img width="922" alt="003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/25202f23-6c67-6311-e320-15fe9da2fea8.png">

**Add a Policy**をクリックします。

<img width="736" alt="004.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/43e1bd65-89af-9e35-7be8-2af5f73c46bc.png">

New Policyの画面が表示されるので、以下の設定を入力し、**Create**をクリックします。
`/cgi-bin/`以下のリソースにアクセスできるっていう設定ですね。

| Name | Resource Type | Resources |
|:--|:--|:--|
|Test Policy | URL | \*://\*:\*/cgi-bin/* |

こんな感じです。

<img width="741" alt="005.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/871bfa2a-5d73-6fef-fda6-374242b22872.png">


ここで認可設定画面が表示されます。上のタブに前項で紹介したResource、Action etc...が並んでますね。
本項で設定したいのは**johndだけ**（Subject）が**アクセス**（Action）できるという設定なので、まず、**Subjects**タブから以下の設定を行います。
設定後、**Save Changes**を押す前に右の__✔__を押さないと保存されませんので注意してください(´・ω・｀)

| Type | User Subjects | Group SUbjects |
| :--- | :--- | :--- |
|Users & Groups | johnd |   |

<img width="737" alt="006.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/37fd9dbc-84c0-231c-4630-711f48ae46c3.png">

続いて、Actionの設定です。
**Actions**タブをクリックして、以下の設定を行います。

| ACTION | DEFAUT STATE |
|:-------|:-------------|
| GET    | Allow|

こんな感じです。

<img width="773" alt="008.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/5064d950-b5d6-1622-4985-ee36884997ba.png">


### 確認

* デモアカウント(`demo`/`changeit`)でアクセス

403 FORBIDDEN ... (◞‸◟)

<img width="396" alt="007.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/84f55069-a82b-e3b2-9af7-832d542433b3.png">

* 検証アカウント(`johnd`/`password`)でアクセス

200 OK (・∀・)ｲｲ!!

<img width="347" alt="009.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/9cd89fdb-712f-801c-08bd-a28d63ea1b54.png">

### 軽くまとめ

* ユーザーのSubject（ユーザー名）をみて、アクセス制御ができる
* アプリケーションに対して行われるAction（HTTP Method）に対しても、アクセス制御ができる
* リソース（URL）ごとにルールをつくれる

## 送信元IPアドレスで制限をかける

続いて、送信元IPアドレスで制限をかけたいとおもいます。

### 認可設定

先ほど作成した**Test Policy**の設定変更を行います。
**Environments**タブから以下の設定を入力します。

|Type|Start IP|End IP|IP Range|DNS Name|
|:--|:--|:--|:--|:--|
|IPv4 Address/DNS Name|192.168.33.128| 192.168.33.255 |[]| [] |

こんな感じです。

<img width="777" alt="010.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/4e22824d-38a0-6a17-ec08-3dba7953a9ca.png">

### 確認

* 送信元IPアドレス`192.168.33.1`でアクセス

403 FORBIDDEN ... (◞‸◟)

<img width="396" alt="011.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/0f6f54b8-6a18-90af-7d86-791400fab800.png">

* IPアドレスの設定を`192.168.33.0 ～ 192.168.33.127`に変更してアクセス

こんな感じにすると。

<img width="769" alt="012.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/ae1c6035-b72e-0a36-7370-b9fe3fa2e38a.png">

200 OK (・∀・)ｲｲ!!

<img width="404" alt="013.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/7143d63d-d889-9446-063f-58e3d8eedeb7.png">

### 軽くまとめ

* 送信元IPアドレスを評価して、認可することができる
* 会社のアプリケーションで、重要度の高いシステムの場合はこういった認可設定を入れるのがいいかも

## 〆

今日はこのへんで！
明日は、Policy Agentを導入したWebサーバーをリバースプロキシにしてみる。

ばい！