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