Policy AgentをApacheにインストールして、OpenAMと認証連携する

## 今日やること

今日は昨日セットアップを行ったOpenAMと別のサーバー上のApacheの間で認証連携をします。もちろん、ApacheにはOpenAMと連携する機能はありませんので、Policy Agentと呼ばれるモジュールをApacheにインストールし、これを実装します。

## Policy Agentってなに？

Policy AgentはApacheやIISなどのWebサーバーにインストールすることで、OpenAMと認証連携をすることができるモジュールとなります。

大雑把な動きは[OpenAM Web Policy Agent User's Guide](https://backstage.forgerock.com/docs/openam-web-policy-agents/4/web-users-guide#figure-web-pa-interaction)にある図がわかりやすいです。

![](https://backstage.forgerock.com/static/docs/openam-web-policy-agents/4/web-users-guide/images/wpa-interaction.png)

Policy AgentはWeb Client（ブラウザ）からのリクエストをフックして、OpenAMで認証済みかどうかを確認するような動きをします。OpenAMで認証済みかどうかの識別には**ドメインクッキー**を使用しています。
そのほかにも様々なポリシー情報を参照し、細かいアクセス制御を実装することができます。このあたりの方法については、後日取り扱います。（たぶん）

### Policy Agentでできること

簡単にPolicy AgentをWebサーバーにインストールしてできることをピックアップしてみました。

* OpenAMで認証後、Webサーバー上のアプリケーションにアクセスできる（≒SSO）
* 認証したユーザーの属性情報の連携ができる
    - 連携した情報を使って認証できたことにする
    - 連携した情報を使ってアプリケーションを動かす
* WebサーバーのURL毎にアクセス制御ができる
    - ユーザーの属性情報（所属とか役職とか）で制御する
    - どんな認証を経たかで制御する
    - コンディション（アクセス時間とか）で制御する
    - など
* OpenAMで認証しなくてもアクセスできるURLの指定ができる
* Webサーバーの特定のリンクを踏むと、サインアウトできる

他にもありますが、実際に使うのはこのあたりだと思います。

### Policy Agentの種類

サポートされているWebサーバーは以下のようなものがあります。

* Apache 2.2/2.4
* IIS 7/7.5/8

ApacheはWindows版でも動くみたいですね～。あんまり見たことないですが...

(参考：[Supported Operating Systems & Web Servers](https://backstage.forgerock.com/docs/openam-web-policy-agents/4/web-release-notes#table-web-pa-platform-requirements))

## Apacheの準備

それではやっていきましょう。

### 環境

OpenAMをセットアップしたサーバーとは別のサーバーを使用します。

* OS
    - CentOS 6.8 (Vagrant)
* メモリ
    - 512MB
* FQDN
    - web.example.com

### Apache のインストール

yumでApacheをインストールします。

```bash
$ sudo yum -y install httpd mod_ssl
```

### hostsの設定

OpenAMとPolicy AgentはFQDNを使って通信をするみたいなので、**双方で名前解決ができるようにする必要があります**。昨日、セットアップを行ったOpenAMのサーバーでも忘れずにhostsの設定を行いましょう。

```bash
$ diff /etc/hosts{,.org}
3,4d2
< 192.168.33.10 iam.example.com
< 192.168.33.20 web.example.com
```

### hostnameを設定

気持ち悪いので変えておきます。

```bash
$ sudo hostname web.example.com
```

設定の方も変えておきます。

```bash
$ sudo diff /etc/sysconfig/network{,.org}
2,3c2
< #HOSTNAME=localhost.localdomain
< HOSTNAME=web.example.com
---
> HOSTNAME=localhost.localdomain
```

### Apache を起動して、確認する

Apacheを起動して、ブラウザからアクセスしてみます。

```bash
$ sudo service httpd start
```

おなじみの画面が表示されます。

<img width="694" alt="002.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/eaf59db5-ca80-b245-e22d-e4bf56d309d2.png">

## Policy Agentのインストール

それでは、Policy Agentをインストールします。

### 決めごと

Policy Agentをインストールする前に以下のパラメータを決めておきます。

* Policy Agentの名前
    - OpenAMがPolicy Agentを識別するためのIDみたいなもの
    - 本記事では`WebPolicyAgentForApache22`とします
* Policy Agentのパスワード
    - 上記のIDみたいなやつのパスワード
    - 本記事では`password`とします
* OpenAMが動いているサイトのURL
    - 本記事では`https://iam.example.com:443/openam`
* Apacheが動いているサイトのURL
    - 本記事では`https://web.example.com:443`

### OpenAM側にPolicy Agentの設定をつくる

まず、ブラウザを立ち上げて、OpenAM(`https://iam.example.com/openam`)にアクセスし、管理者ユーザー(ユーザー名は`amadmin`)でログインします。

ログイン後、**Top Level Realm**をクリックします。
<img width="755" alt="003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/e2a9be41-324d-a4aa-893a-9e95afecb274.png">

Applicationsから**Web Agents**をクリックします。

<img width="745" alt="004.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/b2813833-15d3-77cc-257d-e034e8ce382b.png">

ちょっと、レガシーなUIに変わりましたね。
**新規**をクリックします。

<img width="761" alt="005.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/c7311674-d05c-fa4c-833e-7508c98d29a5.png">

先ほどの**決めごと**を入力し、作成をクリックします。
この時点で、Policy Agentの設定は完了です。

<img width="773" alt="006.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/80ea94bb-716f-3c1c-a6dd-fd4731c59da5.png">

再びWeb Agentsの画面に戻りますので、先ほど作ったPolicy Agentの設定が作成されていることを確認し、クリックします。

<img width="758" alt="007.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/357395be-cf34-fb1f-533b-a9a755ef04e6.png">

画面の中段ぐらいにある**SSOのみモード**というチェックボックスを有効にして、**保存**をクリックします。この設定はあまり気にしなくていいかと思いますが、簡単に言うと**「OpenAMが発行したCookieを持ってたらアクセスを許可するよ！」**といった**単純モード**みたいな感じです。適当ですみません。ただ、手っ取り早く試すにはこの設定がよいかと思います。

<img width="695" alt="008.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/6a264b92-0bee-8dc1-337a-54e7c36a3793.png">


### Policy Agentのダウンロード

なんだか最近になって、Forgerock CommunityからNightly Buildのダウンロードができなくなってるみたいですね～。今回は下記のURLからサブスクリプションが不要のバージョン（4.0.0）をダウンロードします。

https://www.forgerock.com/downloads/

ダウンロード後のファイルは下記のディレクトリに配置している状態からインストールをはじめます。

```bash
$ ls ~
Apache_v22_Linux_64bit_4.0.0.zip
```

### Policy Agentの解凍

解凍します。

```bash
$ sudo unzip ~/Apache_v22_Linux_64bit_4.0.0.zip -d /opt/
```

### パスワードファイルの生成

**決めごと**で決めたパスワードを含むファイルをつくります。

```bash
$ echo password > /tmp/password.txt
```

### Policy Agentのインストール

インストールのプログラムを実行します。`--i`オプションが必要です。

```bash
$ sudo /opt/web_agents/apache22_agent/bin/agentadmin --i
```

インタラクティブなインストーラーなので、質問に答えていきます。
まず、ライセンスアグリーメントです。

```bash
Do you completely agree with all the terms and conditions 
of this License Agreement (yes/no): [no]: yes
```

Apacheの設定ファイルの所在を聞かれるので、指定します。

```bash
Enter the complete path to the httpd.conf file which is used by Apache HTTP
Server to store its configuration.
[ q or 'ctrl+c' to exit ]
Configuration file [/opt/apache/conf/httpd.conf]: /etc/httpd/conf/httpd.conf
```

既存の設定ファイルがある場合は入力を促されます。今回はないので、Enterで無視します。

```bash
To set properties from an existing configuration enter path to file
[ q or 'ctrl+c' to exit, return to ignore ]
Existing OpenSSOAgentBootstrap.properties file:
```

次に**決めごと**で決めた、**OpenAMが動いているサイトのURL**を入力します。

```bash
Enter the URL where the OpenAM server is running. Please include the
deployment URI also as shown below:
(http://openam.example.com:58080/openam)
[ q or 'ctrl+c' to exit ]
OpenAM server URL: https://iam.example.com:443/openam
```

これまた**決めごと**で決めた、**Apacheが動いているサイトのURL**を入力します。

```bash
Enter the Agent URL as shown below:
(http://agent.example.com:1234)
[ q or 'ctrl+c' to exit ]
Agent URL: https://web.example.com:443 
```

次も**決めごと**で決めた**Policy Agentの名前**と、OpenAMの**Realm名**、**パスワードファイルのパス**を入力します。Realm名というのは初出ですが、今回は何も考えずEnterを押しておいてください。簡単（適当）にいうと、**OpenAMにはツリー構造をとれる領域みたいなのがあるようで、領域ごとに個別の認証設定を展開できるみたい**です。Enterを押すと、そのツリー構造の最上位のレルムが指定されるようです。

```bash
Enter the Agent profile name
[ q or 'ctrl+c' to exit ]
Agent Profile name: WebPolicyAgentForApache22

Enter the Agent realm/organization
[ q or 'ctrl+c' to exit ]
Agent realm/organization name: [/]:      

Enter the path to a file that contains the password to be used
for identifying the Agent
[ q or 'ctrl+c' to exit ]
The path and name of the password file: /tmp/pwd.txt

Enter the path to a file that contains the password to be used
for identifying the Agent
[ q or 'ctrl+c' to exit ]
The path and name of the password file: /tmp/password.txt
```

最後にパラメータの確認が表示されます。内容に問題がないことを確認し、Enterをおします。

```bash
Installation parameters:

   OpenAM URL: https://iam.example.com:443/openam
   Agent URL: https://web.example.com:443
   Agent Profile name: WebPolicyAgentForApache22
   Agent realm/organization name: /
   Agent Profile password source: /tmp/password.txt

Confirm configuration (yes/no): [no]: yes
```

以下のようなログが表示されたら完了です。

```bash
Validating...

Validating... Success.

Cleaning up validation data...

Creating configuration...

Installation complete.
```

少し余談ですが、インストール時にApacheに変更が加えられます。差分は以下の通りです。
ApacheのモジュールがLoadされて、モジュールが必要な設定ファイルがIncludeされてるって感じですね～。

```bash
/httpd/conf/httpd.conf{,_amagent_20161201151934}
1010,1015d1009
< 
< 
< LoadModule amagent_module /opt/web_agents/apache22_agent/bin/../lib/mod_openam.so
< AmAgent On
< AmAgentConf /opt/web_agents/apache22_agent/bin/../instances/agent_1/config/agent.conf
<
```

なので、Apacheは再起動してあげましょう。

```
$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
```

## 動作確認

では、動作確認しますね～。
ブラウザを立ち上げて、`https://web.example.com/`にアクセスします。
すると、`https://iam.example.com/openam/XUI/?goto=https%3A%2F%2Fweb.example.com%3A443%2F#login/`にリダイレクトされて、OpenAMのサインイン画面が表示されます。
ここでは、デモユーザー（ユーザー名は`demo`、パスワードは`changeit`）でサインインします。

![image](https://qiita-image-store.s3.amazonaws.com/0/148404/bf30b9a4-7dd5-fe6c-328a-9f4843ecd64b.png)

サインインすると、再び`https://web.example.com/`にリダイレクトされて、**おなじみのApacheの画面**が表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/148404/b42077fb-12b7-ee57-db8b-328962d6d1b0.png)

<font size="7">うーん。地味だ(◞‸◟)</font>

この時点で、デベロッパーコンソールで、クッキーの情報をみてみるとちゃんと`.example.com`ドメインのドメインクッキーがセットされていることが確認できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/148404/717a5a04-2bd5-48c9-3e0b-7e01d5f928cc.png)

## まとめ

* Policy AgentはApacheとかIISにインストールできる
* 動かすにはモジュールのインストールとOpenAMへの設定の登録が必要
* 動かすとApacheにアクセスするときには、必ずOpenAMで発行されたドメインクッキーが必要になる

明日はPolicy Agentの設定をちょっと触ってみたいと思います。

ばい！