はじめに
今年最後のアドベントカレンダーを担当します、コンサルタントの金子です。クリスマスということでサンタクロースがプレゼントを持ってきたご家庭もあるかとお思いますが、セキュリティは万全でしょうか。OpenShift の Identity Provider に htpasswd をお使いの方もいらっしゃるかもしれませんが、OpenShift をよりセキュアにして安心安全な年末年始を過ごしましょう。
目次
- はじめに
- 目次
- Identity Provider
- 環境
- Red Hat Singl Sign-on (KeyCloak) の設定
- Identity Provider の設定
- ログインの検証
- 終わりに
Identity Provider
OpenShift 4.x では構築後にデフォルトでは、 kubeadmin ユーザーが利用できます。クラスター管理者権限 (cluster-admin) を持つこのユーザーだけでも普段の検証は行なえますが、ユーザー名がすべての OpenShift クラスターで固定であることや、パスワードが変更できないことから Identity Provider 設定後にクラスター管理者権限を持つユーザーを登録した時点で削除することが推奨されています。
kubeadminはさておき、OpenShift では様々な Identity Provider が利用できます。どちらの Identity Provider をお使いでしょうか。LDAP を利用したり、Azure AD などと OpenIDConnect で接続されている方もいるかと思います。
今回は生体認証を利用し OpenShift へログインすることを実現するために、Red Hat Single Sign-on (RHSSO) を利用します。RHSSO は OpenShift の Identity Provider として利用でき、また Operator を利用してインストールことができます。 今年の7月ごろに 7.6 が GA になり、WebAuthn が利用できるようになりました。これにより、FIDO2規格に対応したOS/ブラウザ(スマートフォーン含む)で、生体認証が実現できます。 今回はこの記事で紹介されている機能を利用しつつ OpenShift にログインできるようにしようと思います。
環境
今回は以下の環境で検証を行います。
- 作業端末: Macbook Pro (Montery)
- OpenShift バージョン:4.11
- RHSSO バージョン:7.6
Red Hat Singl Sign-on (KeyCloak) の設定
Operator のインストール
OperatorHub から RHSSO をインストールします。インストール方法は GUI か CLI どちらでも構いません。今回は見やすいように GUI で導入しました。

今回は rhsso プロジェクトに Operator を導入します。channel は stable を利用します。Update は自動を選択します。

Install ボタンをクリックしたあとは、インストールが完了するまで待ちましょう。
KeyCloak インスタンスのデプロイ
OpenShift Web Console の Operators - Installed operators を開くと、Red Hat Single Sign-on がインストールされていることが確認できますので、該当の Operator をクリックします。

API の一覧から Keycloak を選択し、Yaml 編集画面を開きます。

KeyCloak の Custom Resource を利用することで冗長性の確保や外部DBを利用した事もできますが、目的は生体認証のため、冗長性などは無視して進めます。設定内容は次のとおりです。

デプロイ完了後、設定通りの内容の場合、rhsso プロジェクト配下に credential-example-keycloak という名前の Secret が作成されていることが確認できますので、KeyCloak の Admin のパスワードを確認します。

KeyCloak の設定
Administration Console にログインします。先程確認した Admin のパスワードを利用してコンソールにログインします。

Realm の作成
サンプルのため、Realm の名前は test としてます。

Realm の設定
WebAuthn Passwordless Policy の設定
Realm 作成後、Authentication の設定を行います。[Configure] - [Authentication] を開きます。

メニューバーから [WebAuthn Passwordless Policy] を開き、User Verification Requirement を required に設定し Save し、 [Required Actions] に移動します。

Required Actions の設定
[Required Actions] にて、Register を押して、Webauthn Register Passwordless を追加します。その後、Webauthn Register Passwordless の Default Action を有効にします。これにより、新規ユーザーが初回ログイン時に Webauthn の登録が求められるようになります。

Flows の設定
[Flows] タブを開くと、Browser の Flow が開いているかと思いますので、右にある Copy を押して、Browser をベースにした新規の Authentication Flow を作成します。フロー名は Webauthen とします。

Flow を修正していきます。今回の認証フローは、ユーザー名入力後、ユーザー認証として、パスワードか指紋認証によりログインできるようにします。まずはユーザー名とパスワード認証のフォームを削除し、ユーザー名のフォームに差し替えます。
設定の細かい部分は以下の製品ドキュメントを参照していただければと思います。 access.redhat.com
設定した内容は次のとおりです。
- Username のフォームを追加(もともとあったUsername、Passwordのフォームは削除)
- パスワード認証か Passwordless Authenticator かを選択するフローを追加
- 上記フローに Passwordless の Execution と Password フォームのフローを追加

フローの設定はここまでです。
Bindings の設定
[Bindings] タブを開き、設定した Flow の [webauthn] を Browser の認証フローで利用するよう設定します。Browser Flow のプルダウンから Webauthen を選択し、Save ボタンをクリックしてください。

ここまでで、Webauthn に関する設定は完了です。
Client の作成と設定
メニューから Clients を選択し、Create ボタンを押してください。Client 名に idp-4-ocp を指定し、Client Protocol は openid-connect が選択されていることを確認して Save をクリックしてください。

client idp-4-ocp が作成されると設定画面が開きます。Setting の Access Type を confidential に、Validation URL に https://oauth-openshift.apps.<cluster_name>.<domain>/oauth2callback/keycloak を設定します
cluster_name>.keycloak は OpenShift 側で登録する Identity Provider の名称です。要件に合わせて変更しても構いません。設定後 save します。

次に、Credentials タブを開き、Secret を記録します。別途 Identity Provider の設定時に利用します。

ユーザーの追加
OpenShift にログインするユーザーを追加します。 Test Realm の [Manage] の [Users] をクリックします。Add user ボタンが右側にあるので、クリックしてユーザーを追加します。サンプルのためユーザー名を sample として登録します。

ユーザー登録後、登録したユーザーの Credentails を開くとパスワードが設定できますので、パスワードを設定してログインができるようにします。

Identity Provider の設定
そろそろ設定も大詰めです。KeyCloak インスタンスを OpenShift の Identity Provider として利用できるように設定します。まずは、OpenShift が KeyCloak へアクセスするときの Secret を設定します。
設定準備
Secret 作成では、先程記録した idp-4-ocp の Credential を指定します。${Credential} を読み替えてください。
$ oc -n openshift-config create secret generic keycloak-client-secret --from-literal=clientSecret=${Credential}
RHSSO が OpenShift の Route にデフォルトで設定される証明書を信頼済みとするように、CA 証明書を取得し、ConfigMap として登録します。OpenShift の証明書が正規のベンダーにより購入済みのものの場合、以下のCA証明書の取得、ConfigMap としての登録、Identity Provider 登録時の ca フィールドの指定は不要となります。
CA 証明書の取得
$ oc -n openshift-ingress-operator get secret router-ca -o jsonpath="{ .data.tls.crt }" | base64 -d -i > ca.crt
ConfigMap として登録
$ oc -n openshift-config create cm keycloak-ca --from-file=ca.crt
OpenShift OAuth の設定
OAuth Custom Resource から、Identity Provider を設定します。以下のコマンドを実行します。issuer は KeyCloak インスタンスのアクセス情報を指定します。Realm 名は test となっていますが環境に合わせて変更してください。
$ cat <<EOF | oc apply -f -
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
name: cluster
spec:
identityProviders:
- mappingMethod: claim
name: keycloak
openID:
ca:
name: keycloak-ca
claims:
email:
- email
name:
- name
preferredUsername:
- preferred_username
clientID: idp-4-ocp
clientSecret:
name: keycloak-client-secret
issuer: https://keycloak-rhsso.apps.ocp4.example.com/auth/realms/test
type: OpenID
EOF
ここまでで、identity Provider の設定は完了です。設定の反映には数分かかるので少しまちます。
ログインの検証
Identity Provider が正常に設定されると、OpenShift Web Console のログイン画面が次のようになります。keycloak をクリックして登録したユーザーでログインします。

sample ユーザーで Sign In します。パスワードでサインインすると Security Key の登録として、生体認証登録が行えるようになります。

認証が完了すると、OpenShift のログインが完了します。ただここではパスワード認証でログインしているため、一旦ログアウトします。OpenShift からのログインだけでは完全にログインしたことにならない場合があるため、RHSSO からもログアウトしておきます。
今環境では、以下にアクセスすると、sample ユーザーでログインしたことになっているため、ログアウトしました。
https://keycloak-rhsso.apps.ocp4.example.com/auth/realms/test/account/
改めて、ログインしてみます。Web Console の keycloak をクリックします。先ほどと異なり、パスワード入力の下に Try Another Way というリンクが見えますのでクリックします。

すると、パスワードか Security Key 認証か選択する画面が表示されます。ここで、Security Key を選択します。

Google Chrome から Touch ID を利用した認証の確認がポップアップで表示されます。

スキャンを行うと、ログインが完了し、OpenShift Web Console が表示されることが確認できます。

終わりに
Red Hat Single Sign-on を利用することで、OpenShift に生体認証を利用してログインできることが確認できました。これで安心して年を越すことができそうです。来年もセキュアな一年にしましょう。