Rancher のログイン認証に Keycloak を使ってみる

# はじめに
[前回](https://qiita.com/t_ume/items/fbf8dc18bd94866f9e28)は ID 管理ソフトウェアである Keycloak を kubernetes 上に Deploy しました。
今回は Deploy した Keycloak を使って、Rancher のログイン認証を設定していきます。

設定に際し日本語化やSAMLの設定などを以下の AdventCalendar で勉強させていただきました。
https://qiita.com/advent-calendar/2017/keycloak-by-openstandia

Rancher の Keycloak(SAML) 用ページもあります。
https://rancher.com/docs/rancher/v2.x/en/admin-settings/authentication/keycloak/

が、上記だけでは難しかったので、手順は以下のサイトを参考にしています。
https://number1.co.za/using-keycloak-identity-provider-for-rancher-sso/
https://gist.github.com/PhilipSchmid/506b33cd74ddef4064d30fba50635c5b

# 環境情報
docker-ce：18.09
kubernetes：1.17
Rancher：2.4.2
Keycloak：9.0.2

※kubernetes は vagrant 上の CentOS で クラスタを構築しています。
※rancher / keycloak のアクセス URL は以下を指定しています。設定される際は適宜ご自身の環境に読み替えてください。
rancher：https://192.168.10.50/
keycloak：https://192.168.10.51:31995/

# 設定(Keycloak)

## 前準備
SAML 設定をする前にテスト用に realm や group、user を作成していきます。

### realm 作成

まずは管理者アカウント（keycloak）でログインして、rancher 用に realm を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/545b5776-cc88-1567-8f37-cbf52b52cae5.png)

今回は「rancher」という realm を作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/2d82c89d-b3ad-7ea8-cb23-f63e63c09341.png)

作成ボタンを押すと、「rancher」realm のダッシュボードに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/c177ff99-8075-55e7-62be-4c91dd072228.png)

realm 間の移動は左上の realm 名にマウスオーバーすると realm の一覧が表示されます。

### group 作成

次にグループを作成します。
「管理 - グループ」⇒「新規作成」から「admin」「user」の名前で２つ作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/d41aee75-ae55-f8f4-046e-a0db836ebc98.png)

### user 作成

次にユーザを作成します。
「管理 - ユーザー」⇒「ユーザの追加」から作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/4e17d2d9-d4e3-3a9a-a14f-0cd0100d3f93.png)

以下を指定して２つ作成します。
※今回のEメールは送信先用には使いません。試用であれば適当な値でも問題ありません。

|ユーザ名|Eメール|名|姓|備考|
|:---|:---|:---|:---|:---|
|radmin|radmin@localhost.invalid|admin|rancher|管理者アカウント|
|ruser|ruser@localhost.invalid|user|rancher|一般アカウント|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/32641b9a-38bb-ead5-8789-d0b88684b2ac.png)

「クレデンシャル」タブでパスワードを設定しておきます。
今回は「一時的」を「オフ」に設定します（初回パスワード変更をスキップ）。
「Set Password」ボタンを押すのを忘れずに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/2cb60eae-51f5-4f28-6f5d-3a6ae0ea9bda.png)

また、「グループ」タブでグループに参加させます。
「radmin」ユーザ ⇒「admin」と「user」グループ、「ruser」ユーザ ⇒「user」グループ にそれぞれ参加させておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/498114f3-dbc6-a035-9731-026c91892ba3.png)

一度ログアウトして、作成したユーザーでログインします。
ログインする際の URL ですが、realm を新しく作成したので、管理者用の URL と異なります。
「設定 - クライアント」から「account」に記載がある URL からアクセスします。

※realm 毎のログイン先 URL は以下になります。
ログイン URL：```https://<keycloak Access URL>/auth/realms/<realm 名>/account/```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/86a17d1f-e9bd-e5b7-a086-39b80d1ad546.png)

realm 名が表示されているログイン画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/32a7899b-d96c-98ee-3ebe-e611c1952cd3.png)

正常にログインできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/75864343-c83a-806b-93be-fa379253e00a.png)

## SAML 設定

ログアウトし、管理用の URL から管理者アカウントでログインします。
ここから SAML の設定を行います。

### SAML Client 作成

まずは Rancher 用に SAML Client を作成します。
「クライアント」から「作成」ボタンから作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/7f92dad4-0774-364e-feaf-432f8ab719ba.png)

以下でクライアントを作成します。
※認証の利用元、今回は Rancher の情報を登録します
クライアント ID：https://192.168.10.50/v1-saml/keycloak/saml/metadata
クライアントプロトコル：saml
クライアント SAML エンドポイント：https://192.168.10.50/v1-saml/keycloak/saml/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/3d2ceaae-b105-53cf-6a2a-20cc7455604a.png)

作成が完了すると、クライアントの設定ページに遷移します。
まずは、SAML 鍵のページで証明書、鍵情報をメモしておいてください。後で使います。

**設定ページ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/1b42b44c-e575-775f-a6e8-76d0340e0154.png)

**SAML 鍵**
※設定を保存した際に「SAML鍵」タブが消えてしまうので先にメモして下さい。
※メモできなかった場合でも以降で取得する Metadata XML の中でも確認することはできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/558a467d-5a18-2944-5be1-7f25b0e80b4f.png)

設定タブに戻り、以下を設定します。
設定後、最下段の「保存」ボタンを忘れずに。

名前：Rancher（任意）
説明：任意
ログインテーマ：keycloak（任意）

有効：オン
ドキュメントを署名する：オン
その他のオン／オフの設定：オフ

有効なリダイレクト URI：https://192.168.10.50/v1-saml/keycloak/saml/acs
※「+」をクリックして追加するのを忘れないように。
SAML を処理するマスター URL：https://192.168.10.50/v1-saml/keycloak/saml/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/10d5e02b-20d4-f1fa-40ce-000523b27db2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/09f57aec-3285-d1a7-6397-ad057df67096.png)

### プロトコルマッパーの作成

Rancher 側で指定する際に必要なフィールドと、Keycloak の情報とをマッピングするプロトコルマッパーを作成します。
まず、ビルトインのプロトコルマッパーを追加します。
「マッパー」タブから「ビルトインを追加」をクリックします。
今回は全て追加します。

**「ビルトインを追加」**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/2c4ea82a-d0de-275e-c82d-edce50a3f562.png)

**全てを選択して追加**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/79a64ec4-402d-6844-aec3-000caf99ee60.png)

また、UID / group 用にプロトコルマッパーを作成します。
「作成」をクリックし、以下内容で作成します。

プロトコル：saml(編集不可)
名前：groups
マッパータイプ：Group list
Group attribute name：member
SAML Attribute NameFormat：Basic

**group 用マッパー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/1bbcd845-2058-d620-bed5-e2d5c3b5889e.png)

プロトコル：saml(編集不可)
名前：username to uid
マッパータイプ：User Property
プロパティ：username
SAML Attribute Name：uid
SAML Attribute NameFormat：Basic

**UID 用マッパー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/b228d576-36e3-6171-caaa-4f9828f6b8ff.png)

**最終的なマッパー一覧**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/f5bec97b-9370-b2ed-ae49-9ff42d713407.png)

### Metadata XML の取得

最後に Metadata XML を取得します。
メニューから「レルムの設定」ページにアクセスして 「エンドポイント」⇒「SAML 2.0アイデンティティー・プロバイダー・メタデータ」をクリックします。
表示されたページをローカルに保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/3a3075bc-1a8d-4c87-e6a8-a169dd17a1ea.png)

取得後、以下のように編集します。

```xml:【修正前】descriptor.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
・・・
  -->

<EntitiesDescriptor Name="urn:keycloak" xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
                    xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <EntityDescriptor entityID="https://192.168.10.51:31995/auth/realms/rancher">
・・・
    </EntityDescriptor>
</EntitiesDescriptor>
```

上記内容を以下のように修正します。

* コメントアウト(<!-- から -->)を削除
* 「<font color="red">Entities</font>Descriptor 」の要素(Name など)を「<font color="red">Entity</font>Descriptor」に移動
* 上記で要素を移動後 <font color="red">Entities</font>Descriptor のタグを削除（閉じタグも合わせて）
* タブを空白(半角スペース４つ)に置換（空白とタブが混ざっていたため、念のため置換しました）

```xml:【修正後】descriptor.xml
<?xml version="1.0" encoding="UTF-8"?>
    <EntityDescriptor entityID="https://192.168.10.51:31995/auth/realms/rancher" Name="urn:keycloak" xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
・・・
    </EntityDescriptor>
```

ここまでで Keycloak 側の準備は完了です。
次は Rancher 側の設定です。

# 設定(Rancher)
Rancher 側の設定をしていきます。
「グローバル」⇒「セキュリティ」⇒「認証」から認証プロバイダ選択画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/4f6712ea-41db-fd97-2a77-81054b581497.png)

Keycloak を選択し、以下を入力します。

表示名フィールド：givenName
ユーザー名フィールド：uid
UID フィールド：uid
グループ フィールド：member
Rancher APIホスト：Rancher のアクセスURL(デフォルト)
プライベートキー：SAML 鍵(署名鍵)でメモした秘密鍵
※以下の形式で入力する

```
-----BEGIN RSA PRIVATE KEY-----
※秘密鍵
-----END RSA PRIVATE KEY-----
```

CA Certificate：SAML 鍵(署名鍵)でメモした証明書
※以下の形式で入力する

```
-----BEGIN CERTIFICATE-----
※証明書
-----END CERTIFICATE-----
```

メタデータ：編集したメタデータファイル(descriptor.xml、ファイルから読み込んでも、中身をコピペしてもよい)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/44c92b8d-0ecb-0ed1-4388-e7f9e90b1221.png)

入力完了後、下段の「Keycloak による認証」をクリックしテストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/5d48a898-dcc2-cb08-a323-5c1c311f4349.png)

別ウィンドウでログイン画面が表示されるので、作成したユーザ(radmin)でログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/b04d0b95-5133-3318-c32a-d6535735a795.png)

ログイン画面が表示されていたウィンドウが閉じて、「認証」画面に Keycloak の設定が表示されるようになります。
※この状態ですでに設定は保存されています
※認証を外したい場合は、「アクセスコントロールを無効化」をクリックすると設定前の状態に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/6c21c3eb-36d7-6191-895b-5446068a1607.png)

最後にサイトアクセスの設定でグループを指定します。
「クラスターのメンバーと認証済み ユーザー、組織 を許可」をチェックし、右側のプルダウンリストから「admin」と「user」を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/1c7f04d7-1be8-7c46-61ca-30a605b09ddc.png)

保存して完了です。
Rancher 側の SAML 設定は以上になります。

# ログインしてみる

## 管理者でログイン
最後にログインして、設定を確認します。
ローカルのユーザをログアウトしてみると、ログイン画面に Keycloak 用のログインリンクが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/95ba87bb-abdd-ee0a-4896-6cb16de04179.png)

「Log in with Keycloak」をクリックすると設定の際にログインした情報(radmin)を元に SSO が適用され Rancher に自動ログインされると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/fb5b7e01-54fb-8cf4-de2b-e884ff0c6818.png)

また、Keycloak へ未ログインだった場合には、Keycloak 側のログイン画面に遷移し、ログイン完了後に Rancher のダッシュボードに遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/4e558352-c305-e361-e3c3-bbc27ed70da0.png)

## グループへロール割当て
radmin でログイン後、アクセス権の設定を行っていきます。
「セキュリティ」⇒「Groups」から「グローバルロールの割り当て」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/431dd4c9-8380-3b83-2ea3-ffc36a1894ad.png)

以下で、設定を行います。

追加するグループ：/user
グローバル権限：User-Base にのみチェック

追加するグループ：/admin
グローバル権限：管理者、一般ユーザーにチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/78c3349f-a9e2-05bd-0cfb-0f496aa8a02c.png)

また、「Default」のプロジェクトに権限を割振ります。
クラスターを選択後、「Default」プロジェクト⇒「メンバー」⇒「メンバーを追加」をクリック。
以下で、メンバーを追加します。
メンバー：/user
Project 権限：メンバー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/f509ac9f-1ae7-a88d-b147-e8215e7cfd89.png)

## 一般ユーザでログイン

Rancher / keycloak 共にログアウトし、今度は「ruser」でログインして確認します。
設定したクラスターの「Default」プロジェクトは操作できるのですが、Rancher の管理系の設定や、クラスターのノード情報、「System」プロジェクトの情報が見えなくなっているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/fbb5080a-e2de-4381-ff41-01c1251cdf7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/652b9455-3735-f8a3-f506-40bfac79078d.png)

# おわりに
Rancher の 2.1.0 から利用が可能となった Keycloak ですが、設定自体はお手軽にできるのではと思います。
今回は詳しく触れてはいないのですが、Rancher 自身の操作権限や各プロジェクトの利用権限も詳細に設定可能となっています。
設定していて、気を付ける点としては

* グループの設定の際には、設定するユーザが設定対象のグループに参加している必要がある
* Rancher をログアウトしても、Keycloak 側のセッションが残っていると、Rancher に再ログインの際に残っている Keycloak のセッションで自動でログインしてしまう
* UID をちゃんと紐づけないと Rancher の管理者に紐づいてしまう場合がある

認証、権限は奥が深く、難しい・・・