OpenAM Web Policy Agent for Nginx 導入について

# はじめに
#### 本記事は、[OpenAM/OpenIGを使用したシングルサインオン環境の構築](http://qiita.com/gzock/items/a64940833dbaae9802db)という記事から続く関連記事の一部です

既にOpenAMが構築しApacheやIIS用のエージェント方式の設定を行ってあることを前提に、Nginx用のWeb Policy Agentの導入を目指す。

# この記事の意味
実はForgerockから公式に提供されているWeb Policy AgentはApacheやIIS用のみであり、Nginx用は公開されていない。
※要望はあがっているみたいなので、そう遠くない未来にいつか作られると思う

ただし、OpenAMのSDKを使ってNginx用のWeb Policy Agentおよび連携できるNginxをOSSとして開発/公開してくれている方もとい神がいらっしゃるため、神に感謝の意を唱えながら、ありがたく使わせてもらい、今後需要が多いであろうNginxにおけるWeb Policy Agentの導入方法を説明します。
※基本的なやることはApache用のWeb Policy Agentと変わらないので、明らかに異なる作業箇所だけ説明をします。


# 前提
* 既にOpenAMはインストール済であること
* OpenAMがインストールされているサーバはCentOS7.3を想定
* OpenAMは無料で手に入る中では最新のv13.0を使用
* 同一ホスト内のNginxをSPとする
* 検証目的の構成を行う

# 環境
* サーバOS: CentOS7.3
* ホスト名: sso.test.local
* IPアドレス: 172.16.1.130
* JDK Ver: 1.8.0_111
* Tomcat Ver: 8.0.39
* OpenAM Ver: 13.0.0

# 構築作業

## ダウンロードとインストール

以下のDonwloadから必要なアーキテクチャのバイナリをダウンロード
[https://github.com/hamano/nginx-mod-am](https://github.com/hamano/nginx-mod-am)

基本的にはREADMEに書かれている通りなので、正直ここに書かなくても良さそうなものなんだけど、一応メモ程度に・・・
公開されているのは、Web Policy Agentだけでなく、それを使えるように改良された専用のnginxバイナリも同梱されている。
つまり、yumとかでインストールしたnginxにWeb Policy Agentをインストールしてあげる・・・といったものではない。
※Apacheとかはその形なんだけど、この場合は違う

なので、まずは展開 => 配置 => systemdへの登録など、一連の流れを下記に。

```
[root@sso ~]# wget https://www.osstech.co.jp/download/hamano/nginx/nginx_agent_20141119.el7.x86_64.zip
[root@sso ~]# unzip nginx_agent_20141119.el7.x86_64.zip
[root@sso ~]# mv nginx_agent /opt/nginx
[root@sso ~]# useradd nginx
[root@sso ~]# chown nginx:nginx -R /opt/nginx
[root@sso ~]# vim /usr/lib/systemd/system/nginx.service

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
User=nginx
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=sudo /usr/bin/rm -f /opt/nginx/logs/nginx.pid
ExecStartPre=sudo /opt/nginx/bin/nginx -t -c /opt/nginx/conf/nginx.conf
ExecStart=sudo /opt/nginx/bin/nginx -c /opt/nginx/conf/nginx.conf
ExecReload=sudo /bin/kill -s HUP $MAINPID
ExecStop=sudo /bin/kill -s TERM $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
WorkingDirectory=/opt/nginx/

[Install]
WantedBy=multi-user.target

[root@sso ~]# systemctl daemon-reload
```

ポート80で動作させるにはroot権限が必要になる。そのためsudoを利用している。
sudoがない場合、上記のnginx.serviceの中でUser=nginxとしてしまっているがために、systemctk start nginxとしようとしても失敗してしまう。
rootで動かすことに抵抗がないのであれば、User=nginxの行と全体的にsudoは削除してしまって良い。
また、その場合、nginx.confで`user  nginx;`を設定を追加すれば、worker processはnginxユーザで動作するようになる。
ただし、master prodessはrootなので、そこもnginxで動かしたい場合は、nginx.serviceは上記のままで、下記のようにsudoersを変更する必要がある。

```
[root@sso ~]# visudo

# insert
nginx   ALL=(root)    NOPASSWD:/opt/nginx/bin/*,/usr/bin/rm,/bin/kill
```

## OpenAM側での設定
ApacheのWeb Policy Agentの設定と全く同じなので割愛します。
結局のところ、接続しに来るエージェントがApacheのものなのか、Nginxなのかってだけで、OpenAM側がやることは全く変わらないので、特に変化はない。

## エージェントのインストール
```
[root@sso ~]# /opt/nginx/bin/agentadmin.sh
※聞かれる内容は。ApacheのWeb Policy Agentとほぼ同じなので割愛
```

# 参考
非常に感謝です。
https://github.com/hamano/nginx-mod-am