メインコンテンツまでスキップ

KeycloakをUbuntuにインストールする

Ubuntu24でのKeycloakの構築方法です。
私は個人の開発テスト用なのでH2データベースを使ってます。
DBの変更を推奨します。
一応,MariaDBでの方法は書いておきます
※個人用もMariaDBに変更しました。

私用のメモです。一部、雑かも

今回,Oracle OCIに構築したKeycloakのページ
https://login.momijiina.tech/

開発環境としての残してます。
私みたいに構築方法とURLを一緒に公開するのはただの脆弱性になりうるのでやめましょう。
いつか気づいたら真っ赤なページが表示されそう。

※ビルド後、初期スタートにドメイン間違えたらKeycloakを再ビルドしないと間違えたドメインに飛び続けます

アップデートとか

sudo apt -y update && sudo apt -y upgrade

ポート開放(必要なら)

sudo ufw allow 80
sudo ufw allow 443
sudo ufw reload

必要なソフトのインストール

unzipはお好みです。(別にtarでも)

sudo apt -y install certbot unzip openjdk-21-jdk

証明書の取得

sudo certbot certonly --standalone -d login.momijiina.tech

Keycloakインストール

Optにいれます
好みの場所があれば変えてください

cd /opt

Keycloakダウンロード

最新版は以下を確認
zip版ですtar版の場合も確認してください。 https://github.com/keycloak/keycloak/releases

ダウンロード

10月時点での最新版26.4.2をインストール(必要に応じて変更)

sudo wget https://github.com/keycloak/keycloak/releases/download/26.4.2/keycloak-26.4.2.zip

解凍

ダウンロードしたversionに合わせて解凍

sudo unzip keycloak-26.4.2.zip

ユーザーの作成

keycloak専用ユーザーを作成

ログイン権限とホームディレクトリ等はなし

sudo useradd -r -s /bin/false keycloak

Keycloakのインストールディレクトリの所有権を変更など

作成したユーザーに所有権を変更

sudo chown -R keycloak:keycloak /opt/keycloak-26.4.2

H2データベースを使う場合

DBを設定しなければ自動的にH2になります。
あとで切り替える場合、エラーだらけで大変だったのでDB変更は推奨します。

H2のメリットは設定不要でフォルダのコピーとって別サーバー持って行ってもそのまま動いてくれます。
動作もたぶん個人利用やユーザー数100人規模とかなら気にする必要はなさそうでした。

デメリットは公式が本番環境では非推奨としているのとデータの破損の可能性です。

以下から好きなの入れておくのが安定です。

  • PostgreSQL
  • MySQL
  • MariaDB
  • Oracle
  • SQL Server

DBを変更する場合(例:MariaDB)

DBを作成する。
MySQLの場合でもほぼ同じです。

MariaDBにログイン

sudo mysql -u root -p

データベースとユーザーを作成

%を指定しているので必要があればlocalhostか接続元IP(分離する場合)にしてください。
DB名は必要があれば変更、パスワードは必ず変更してください。

CREATE DATABASE keycloak CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'keycloak'@'%' IDENTIFIED BY 'keycloak_password';
GRANT ALL PRIVILEGES ON keycloak.* TO 'keycloak'@'%';
FLUSH PRIVILEGES;
EXIT;

keycloak.confを編集する

keycloak.confにDBを設定します

sudo vi conf/keycloak.conf

Databaseコメントの下に追加しました。

# Database
db=mariadb
db-url=jdbc:mariadb://localhost:3306/keycloak
db-username=keycloak
db-password=keycloak_password

build後にDBがちゃんと動いてるの確認をしました(不要)

※ここはbuild後の確認です(不要です)
起動時のステータスメッセージ

[org.mariadb.jdbc.message.server.ErrorPacket] (main) Error: 1065-42000: Query was empty

データベース上での確認

sudo mysql -u keycloak -p
USE keycloak;
SELECT id, username, email, enabled, email_verified 
FROM USER_ENTITY
LIMIT 10;

ユーザーもちゃんとつくられてました

MariaDB [keycloak]> SELECT id, username, email, enabled, email_verified 
-> FROM USER_ENTITY
-> LIMIT 10;
+--------------------------------------+---------------+-------+---------+----------------+
| id | username | email | enabled | email_verified |
+--------------------------------------+---------------+-------+---------+----------------+
| 2c9296cc-eaa9-4693-ab97-301b127c1358 | administrator | NULL | 1 | 0 |
+--------------------------------------+---------------+-------+---------+----------------+
1 row in set (0.000 sec)

Keycloakの初期管理者アカウントの作成

とりあえず一時的なアカウントです。
あとで消すのでなんでも
削除しろと警告がでるのでとりあえず初回で使わなさそうなのがいいです。

ユーザーの確実な追加

Administratorは自由に変更してください。
パスワードを聞いてくるのでいい感じのを
環境変数による追加もありますが環境によってはできないので今回はスルー

sudo -u keycloak /opt/keycloak-26.4.2/bin/kc.sh bootstrap-admin user --username Administrator

ビルドと起動テスト

keycloakのbinに移動するかbinまで指定してください。

cd /opt/keycloak-26.4.2/bin

ビルド

ユーザーをkeycloakで指定するかbuild後に権限を再付与してください。
権限エラーで見れないページがでます。

sudo -u keycloak /opt/keycloak-26.4.2/bin/kc.sh build

一部ページがみれない場合は以下を再度実行してください。

sudo chown -R keycloak:keycloak /opt/keycloak-26.4.2

起動テスト

Listening on: http://127.0.0.1:8080 と表示されれば終了して問題なし
ポート干渉などがある場合はずらしてください。

sudo -u keycloak /opt/keycloak-26.4.2/bin/kc.sh start \
--hostname=login.momijiina.tech \
--proxy-headers=xforwarded \
--http-enabled=true \
--http-host=127.0.0.1 \
--http-port=8080

自動起動スクリプト

自動起動スクリプトの作成
2025年11月にテストしたものです。

sudo vi /etc/systemd/system/keycloak.service

ドメインと/opt/keycloak-26.4.2は必ず置き換えてください
とりあえず起動できればいい設定です。

[Unit]
Description=Keycloak Authentication Server
After=network.target

[Service]
Type=simple
User=keycloak
Group=keycloak
WorkingDirectory=/opt/keycloak-26.4.2

# Keycloak設定
Environment="KC_HOSTNAME=login.momijiina.tech"
Environment="KC_PROXY_HEADERS=xforwarded"
Environment="KC_HTTP_ENABLED=true"
Environment="KC_HTTP_HOST=127.0.0.1"
Environment="KC_HTTP_PORT=8080"

ExecStart=/opt/keycloak-26.4.2/bin/kc.sh start

ExecStop=/bin/kill -INT $MAINPID

[Install]
WantedBy=multi-user.target
要調整版(私用のテスト設定です)

テスト用なので削ったり追加したりしてください。

[Unit]
Description=Keycloak Authentication Server
After=network.target

[Service]
Type=simple
User=keycloak
Group=keycloak
WorkingDirectory=/opt/keycloak-26.4.2

# Keycloak設定
Environment="KC_HOSTNAME=login.momijiina.tech"
Environment="KC_PROXY_HEADERS=xforwarded"
Environment="KC_HTTP_ENABLED=true"
Environment="KC_HTTP_HOST=127.0.0.1"
Environment="KC_HTTP_PORT=8080"

# プロセス管理
Restart=on-failure
RestartSec=10
TimeoutStartSec=900
TimeoutStopSec=30

# セキュリティ設定
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/keycloak-26.4.2/data
ReadWritePaths=/opt/keycloak-26.4.2/providers

# ログ設定
StandardOutput=journal
StandardError=journal
SyslogIdentifier=keycloak

ExecStart=/opt/keycloak-26.4.2/bin/kc.sh start --optimized

ExecStop=/bin/kill -INT $MAINPID

[Install]
WantedBy=multi-user.target

起動スクリプトの有効化とステータス確認

sudo systemctl daemon-reload
sudo systemctl enable keycloak
sudo systemctl start keycloak
sudo systemctl status keycloak

Nginxの最新版をインストールする

最新のNginx取得に必要なものをインストール

sudo apt -y install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

nginx の署名鍵をインポート

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

最新の安定板を取得する

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

インストール

恐らく2025年10月現在はうまくいってれば1.28以上が入ります。

sudo apt update
sudo apt -y install nginx

有効化と起動

sudo systemctl enable nginx --now

Nginx の設定

sudo vi /etc/nginx/conf.d/kecloak.conf

セキュリティヘッダー等は調整してください

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name login.momijiina.tech;

# Let's Encrypt用のみ許可
location /.well-known/acme-challenge {
root /var/www/html/;
}

# それ以外は全てHTTPSへリダイレクト
location / {
return 301 https://$host$request_uri;
}
}

server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name login.momijiina.tech;

# SSL証明書
ssl_certificate /etc/letsencrypt/live/login.momijiina.tech/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/login.momijiina.tech/privkey.pem;

# SSL設定
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;

# セキュリティヘッダー
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
#add_header X-Frame-Options "SAMEORIGIN" always;
#add_header X-Content-Type-Options "nosniff" always;
#add_header X-XSS-Protection "1; mode=block" always;
#add_header Referrer-Policy "strict-origin-when-cross-origin" always;

location /.well-known/acme-challenge {
root /var/www/html/;
}

location / {
# プロキシバッファ設定
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

# Keycloak用のプロキシヘッダー
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Scheme https;

# タイムアウト設定
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

proxy_pass http://localhost:8080;
}

# ログ設定(オプション)
access_log /var/log/nginx/keycloak_access.log;
error_log /var/log/nginx/keycloak_error.log;
}

確認と再読み込み

再読み込みできるか確認
successfulとでない場合はエラー部分を修正してください。

sudo nginx -t

再読み込み

sudo systemctl reload nginx

ログインする

ドメインにアクセスするとログイン画面が表示されます。
作成した初期管理者アカウントでログインしてください。

初期アカウントの削除

以下の警告が出ているはずです。

You are logged in as a temporary admin user. To harden security, create a permanent admin account and delete the temporary one.

ローカライズをしている場合は日本語で

一時的な管理者ユーザーとしてログインしています。セキュリティーを強化するには永続的な管理者アカウントを作成し一時的なアカウントを削除してください。

管理者アカウントの作成と一時アカウントの削除をしてください。

少し前のversionはこの警告はなかった気もします。

管理者パスワードを忘れた場合

初期管理者作成と手順は同じです。
Keycloakを止めて以下を実行
Administratorは自由に変更してください
パスワードを聞いてくるのでいい感じのを

sudo -u keycloak /opt/keycloak-26.4.2/bin/kc.sh bootstrap-admin user --username Administrator

その他

サーバー移行(H2使用時)

H2は楽です停止させた状態でzipなりに圧縮して別サーバーにもっていけば環境が整っていればそのまま動きます。
scp,rsyncとかで転送した方がいいのは間違いないですが・・
テスト用によくサーバー消すことが多いのでzipにして使いまわしてました。

sudo apt install zip
zip -r keycloak-26.4.2.zip keycloak-26.4.2