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

## 今日やること

昨日の記事で挙げた[Policy Agentでできること](http://qiita.com/nanazero/items/10a593c6b0ac770ee92e#policy-agentでできること)から、下記の2つの動作を実際に確認していきたいと思います。

* 認証したユーザーの属性情報の連携ができる
* Webサーバーの特定のリンクを踏むと、サインアウトできる

## 前準備

まず、検証用のアカウントを作成します。OpenAMの管理者コンソールにはアカウント管理のインターフェースがあるので、ここから作業を行います。

OpenAMの管理者アカウント（ユーザー名は`amadmin`）でサインインし、**Top Level Realm** => **Applications** => **Subjects**とアクセスし、 **新規**をクリックします。

<img width="596" alt="001.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/2d279773-a390-f0af-d17c-696200505778.png">

アカウント作成の画面が表示されますので、下記のユーザーを作成します。

* ID
    - johnd
* 名
    - john
* 姓
    - doe
* フルネーム
    - john doe
* パスワード
    - （適当に）

こんな感じです。

<img width="301" alt="002.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/02685030-6352-5ece-6422-8e07cac81b14.png">


## 認証したユーザーの属性情報の連携ができる

まず、ユーザーのアカウントの属性情報が連携できることを確認します。

### プロファイル属性処理の設定

OpenAMの管理者アカウント（ユーザー名は`amadmin`）でサインインし、**Top Level Realm** => **Applications** => **Web Agents**にアクセスし、[昨日](http://qiita.com/nanazero/items/10a593c6b0ac770ee92e)作成を行ったPolicy Agentの設定である`WebPolicyAgentForApache22`をクリックします。

<img width="375" alt="003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/cc9ed64f-6ba2-22fb-23b0-866e100587b4.png">

**アプリケーション**のタブから**プロファイル属性処理**をクリックします。

<img width="422" alt="004.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/f4895863-0922-0601-c8ac-8b99fe223862.png">

このプロファイル属性処理は、認証したユーザーのプロファイル属性（名や姓、設定していれば所属や役職）をHTTPのHEADERやCookieにセットするといった設定となります。
ここでは、試しに`cn`（氏名）、`givenName`（名）と`sn`（姓）を連携してみましょう。

こんな感じで書きます。

| マップキー | マップ値 |
|:----------|:---|
|cn|CUSTOM-Common-Name|
|givenName|CUSTOM-Given-Name|
|sn|CUSTOM-Sir-Name|

入力後はこんな感じです。

<img width="430" alt="005.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/627a528a-d059-e461-82ec-0f4951937fb2.png">

### ヘッダーが連携されていることを確認するCGIをおく

この作業はPolicy AgentがインストールされたApacheが動いているサーバー（本記事では`web.example.com`）で行います。

適当にPerlで書き起こします。別に`phpinfo()`でも構わないと思います。

```pl
cat /var/www/cgi-bin/headerinfo.pl 
#!/usr/bin/perl --
use strict;
use warnings;
use CGI;

my $q = CGI->new;
my %headers = map { $_ => $q->http($_) } $q->http();

print $q->header('text/plain');
print "Got the following headers:\n";
for my $header ( keys %headers ) {
    print "$header: $headers{$header}\n";
```

CGIファイルに実行権限を付与します。

```bash
$ sudo chmod +x /var/www/cgi-bin/headerinfo.pl 
```

PerlのCGIパッケージをインストールします。

```bash
$ sudo yum -y install perl-CGI
```

### 検証用アカウントでアクセス

ブラウザを立ち上げて、先ほど作成したCGIプログラムにアクセスします。本記事でのURLは`https://web.example.com/cgi-bin/headerinfo.pl`となります。

アクセスをするとOpenAMのサインページが表示されますので、検証用アカウント（ユーザー名は`johnd`）でサインインします。

<img width="505" alt="006.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/d4afcc1b-ee3a-bc14-ca4d-e6d62be88bb1.png">

サインイン後、CGIプログラムが実行され、現在セットされているHTTP HEADERが表示されます。
設定を行った3つのCUSTOM HEADERがセットされていることが確認できますね。

<img width="484" alt="007.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/3f534ebe-67f1-adb2-1e8c-df055d5bfcac.png">

### 軽くまとめ

* プロファイル属性処理の設定を使うと認証済みユーザーの属性情報を連携できる
* このHTTP HEADERを使って、アプリケーションの既存の認証を通したりできる（無理やりにでも）
    - アプリケーションでHTTP HEADERをみて認証してもらうように既存の認証を変更してもらうとか
    - Apache上でCGIプログラムを動かして、既存の認証フォームにPOSTしちゃうとか（代理認証とか呼ばれてるようです）

## Webサーバーの特定のリンクを踏むと、サインアウトできる

次行ってみましょう。

実際的なことを考えると、Policy Agentが導入されるApacheやそのバックエンドのアプリケーションサーバーで動いているアプリケーションは既存のサインアウトの機能があるでしょう。
ただ、アプリケーションのサインアウトだけしても、OpenAMのセッションは生きているので、アプリケーションには認証なしでアクセスできてしまいます。ユーザーが意思を以ってサインアウトするのであれば、**OpenAMのセッションも消して欲しいな～？**...というようなニーズに応えられるのが、ここで紹介する**シングルログアウト**の機能です。

### エージェントログアウトURL

それでは、設定していきます！
プロファイル属性処理の設定と同じように、OpenAMの管理者アカウント（ユーザー名は`amadmin`）でサインインし、**Top Level Realm** => **Applications** => **Web Agents**にアクセスし、[昨日](http://qiita.com/nanazero/items/10a593c6b0ac770ee92e)作成を行ったPolicy Agentの設定である`WebPolicyAgentForApache22`をクリックします。

その後、**OpenAMサービス**タブから、**エージェントログアウトURL**をクリックします。

<img width="444" alt="008.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/98e83f72-65fe-a565-c10b-18c932ca65ab.png">

ここではシングルログアウトするURLを設定します。認証済みのユーザーは、このPolicy Agentが導入されたWebサーバー上のURL にアクセスすると OpenAM セッションからログアウトされちゃいます。
本記事では`https://web.example.com/signout`と設定します。

<img width="568" alt="009.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/58de2178-243b-50ef-6636-5086870c1aee.png">

### エージェントログアウトURLにアクセス

それでは試してみましょう。
まず、普通にPolicy Agentが導入されたApacheにアクセスします。本記事では`https://web.example.com/`となります。

OpenAMのサインイン画面が表示されますので、検証用アカウント（ユーザー名は`johnd`）でサインインします。

<img width="499" alt="010.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/4a8a6aeb-02f7-3379-68c4-e7ab53d7b26d.png">

サインインに成功すると、おなじみのApacheの画面が表示されます。
ここで、アドレスバーに先ほど設定したエージェントログアウトURLを入力し、アクセスを行います。本記事では`https://web.example.com/signout`となります。

すると、無事にOpenAMのセッションも破棄された雰囲気の画面が表示されます。

<img width="410" alt="011.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/8a7d96e9-e1b8-76c5-4d10-eb0bde6a1833.png">

デベロッパーツールで確認してみますと、きちんとブラウザのCookieストアからも消されてますね！

<img width="598" alt="012.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/380bac7b-e895-53fd-a26b-cd88a3912f05.png">


## 軽くまとめ

* Policy Agentを導入済みのWebサーバーでシングルログアウトするためのURLを設定できる
* 認証済みのユーザーはそのURLを踏むとOpenAMのセッションが消されて、OpenAMのサインアウト画面にリダイレクトされる

ただ、単純にアプリケーションが本来持っているサインアウトURLを設定するのは難しいんじゃないかなぁ？やっぱり、Policy Agentによって、守られているとはいえ、**アプリケーションのセッションも消してから、OpenAMのセッションを消す必要がある**んじゃないかと。アプリケーションのセッションが残ったまんまだと、再度OpenAMで認証したとしても、前のアプリケーションのセッションを使いまわしてしまって、想定外のタイミングでアプリケーションのセッションタイムアウトが起こりそうだなぁ。望ましい設定としては、**アプリケーションのサインアウトのURLじゃなくて、アプリケーションのサインアウト完了のURL**かなぁ。

## 〆

今日はこのぐらいで！
明日はアクセス制御するためにポリシーと呼ばれている設定をいじってみる。

ばい！