だいぶ前に、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.confserver { 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で管理できる状態になった。 本当は冗長化とか考慮した方が良いのだろうけど、ひとまずシングル構成での構築手順として残しておく。