だいぶ前に、CentOS 7にKeycloakをインストールして触ってみるということをしていたが、今回はちゃんとsystemdで管理できるようにインストールをしてみる。 基本的なインストール方法は変わらないが、一応事前準備から進めていく。

1.事前準備

前回と変わらず、以下のコマンドを実行して実行ユーザの作成や必要となるパッケージを導入しておく。

useradd keycloak
yum install -y git wget

動作にMavenが必要になるので、それらをインストールする。 まずはOracle JDKのインストールを行う。

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u152-b16/aa0333dd3019491ca4f6ddbe78cdb6d0/jdk-8u152-linux-x64.rpm
rpm -ihv jdk-8u152-linux-x64.rpm

次に、Mavenのインストール。 作業中に実行ユーザに切り替えて、PATHを通しておく。

cd /opt
wget http://ftp.riken.jp/net/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz
tar xzvf apache-maven-3.5.0-bin.tar.gz
mv apache-maven{-3.5.0,}
su - keycloak
cat << "EOF" >> ~/.bash_profile
export JAVA_HOME=/usr/java/default/
export PATH=$PATH:/opt/apache-maven/bin
EOF
. ~/.bash_profile

これで事前準備は完了。

2. Keycloakをインストール、起動する(http)

事前準備が終わったら、Keycloakをインストールする。 まずはhttpで接続できることを確認する。

wget https://downloads.jboss.org/keycloak/3.4.0.Final/keycloak-3.4.0.Final.tar.gz
tar xzvf keycloak-*.tar.gz
mv keycloak-*/ keycloak
cd keycloak
sed -i.bk '{s/127.0.0.1/'$(hostname -i)'/g}' standalone/configuration/standalone.xml

ひとまず、この段階で一時的にfirewalldを切ってKeycloakを起動させてみる。

exit
sudo systemctl stop firewalld
su - keycloak
cd /opt/keycloak
bin/add-user-keycloak.sh -u admin -p P@ssw0rd
bin/standalone.sh -b 0.0.0.0

Keycloakサーバにアクセスし、ログイン画面が表示されること、追加したユーザでログインできることが確認できたらOK。 firewallについては後ほどポートを指定するので、今はこのままにする。

3.serviceファイルを作成してsystemdで起動、停止を行えるようにする

rootに切り替えて、先程展開したファイル類を/opt配下に移動する。また、Keycloak用のログ出力先ディレクトリを作成しておく。

mv /home/keycloak/keycloak /opt/
mkdir /var/log/keycloak

移動後、systemdで管理できるように.serviceファイルを作成する。

/etc/systemd/system/keycloak.service

[Unit]
Description=Jboss Application Server
After=network.target

[Service]
Type=idle
Environment=JBOSS_HOME=/opt/keycloak JBOSS_LOG_DIR=/var/log/keycloak "JAVA_OPTS=-Xms1024m -Xmx20480m -XX:MaxPermSize=768m"
User=keycloak
Group=keycloak
ExecStart=/opt/keycloak/bin/standalone.sh
TimeoutStartSec=600
TimeoutStopSec=600

[Install]
WantedBy=multi-user.target

.serviceファイル作成後、以下のようにsystemdからKeycloakを起動する。 (起動に失敗した場合は、一度SELinuxを無効にして再度試してみる(起動後にちゃんと有効にしなおすのを忘れずに))

systemctl start keycloak

起動後、ブラウザから管理画面にアクセスできることを確認する。

4.Nginxをリバースプロキシにしてhttps接続を行えるようにする

Keycloakへの通信を暗号化するため、Nginxをリバースプロキシにしてhttps接続できるようにする。なお、すでにローカルの認証局で中間CA証明書やサーバ証明書は出ている前提で設定を進めていく。 以下のコマンドを実行し、Nginxのインストールを行う。

cat <<EOF > /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/\$basearch/
gpgcheck=0
enabled=1
EOF
yum install -y nginx

リバースプロキシとして動作させるため、Nginxの設定ファイルを作成する。

/etc/nginx/conf.d/keycloak.conf
server { listen 80; server_name {{VirtualHostname}}; rewrite ^(.*)$ https://$host$1 permanent; } server { listen 443; server_name {{VirtualHostname}}; ssl on; ssl_certificate /etc/nginx/cert/ssl.crt; ssl_certificate_key /etc/nginx/cert/ssl.key; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect http:// https://; } }

証明書の保持先ディレクトリを作成して、SELinuxの設定を変更してNginxが読み込めるようにする。

chcon system_u:object_r:httpd_config_t:s0 /etc/nginx/cert/*

Keycloakの設定を変更し、127.0.0.1でのみ受け付けるよう変更する。

sed -i 's/'$(hostname -i)'/127.0.0.1/g' /opt/keycloak/standalone/configuration/standalone.xml

今のままだとリバースプロキシ経由のため、そのままだとKeycloakへのログインができない。 こちら を参考に、Keycloak側でProxy元の設定を追加する。

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    ....
    <!--既存の内容を置き換え(465行目あたり)-->
    <http-listener name="default" socket-binding="http" proxy-address-forwarding="true" redirect-socket="proxy-https"/>
    ....
</subsystem>
....

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    ....
    <!--追記(561行目あたり)-->
    <socket-binding name="proxy-https" port="443"/>
</socket-binding-group>

最後に、SELinuxの設定をしてNginx、Kyecloakのサービスを再起動する。

setsebool -P httpd_can_network_connect 1
systemctl restart nginx
systemctl restart keycloak

これで、Systemdで管理できる状態になった。 本当は冗長化とか考慮した方が良いのだろうけど、ひとまずシングル構成での構築手順として残しておく。