生体認証でログインする OpenShift

はじめに

今年最後のアドベントカレンダーを担当します、コンサルタントの金子です。クリスマスということでサンタクロースがプレゼントを持ってきたご家庭もあるかとお思いますが、セキュリティは万全でしょうか。OpenShift の Identity Provider に htpasswd をお使いの方もいらっしゃるかもしれませんが、OpenShift をよりセキュアにして安心安全な年末年始を過ごしましょう。

目次

Identity Provider

OpenShift 4.x では構築後にデフォルトでは、 kubeadmin ユーザーが利用できます。クラスター管理者権限 (cluster-admin) を持つこのユーザーだけでも普段の検証は行なえますが、ユーザー名がすべての OpenShift クラスターで固定であることや、パスワードが変更できないことから Identity Provider 設定後にクラスター管理者権限を持つユーザーを登録した時点で削除することが推奨されています。

access.redhat.com

kubeadminはさておき、OpenShift では様々な Identity Provider が利用できます。どちらの Identity Provider をお使いでしょうか。LDAP を利用したり、Azure AD などと OpenIDConnect で接続されている方もいるかと思います。

access.redhat.com

今回は生体認証を利用し OpenShift へログインすることを実現するために、Red Hat Single Sign-on (RHSSO) を利用します。RHSSO は OpenShift の Identity Provider として利用でき、また Operator を利用してインストールことができます。 今年の7月ごろに 7.6 が GA になり、WebAuthn が利用できるようになりました。これにより、FIDO2規格に対応したOS/ブラウザ(スマートフォーン含む)で、生体認証が実現できます。 今回はこの記事で紹介されている機能を利用しつつ OpenShift にログインできるようにしようと思います。

rheb.hatenablog.com

環境

今回は以下の環境で検証を行います。

  • 作業端末: Macbook Pro (Montery)
  • OpenShift バージョン:4.11
  • RHSSO バージョン:7.6

Red Hat Singl Sign-on (KeyCloak) の設定

Operator のインストール

OperatorHub から RHSSO をインストールします。インストール方法は GUI か CLI どちらでも構いません。今回は見やすいように GUI で導入しました。

OperatorHub で RHSSO を検索

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

RHSSO Operator インストールオプション

Install ボタンをクリックしたあとは、インストールが完了するまで待ちましょう。

KeyCloak インスタンスのデプロイ

OpenShift Web Console の Operators - Installed operators を開くと、Red Hat Single Sign-on がインストールされていることが確認できますので、該当の Operator をクリックします。

RHSSO

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 Requirementrequired に設定し 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 Protocolopenid-connect が選択されていることを確認して Save をクリックしてください。

client idp-4-ocp が作成されると設定画面が開きます。SettingAccess Typeconfidential に、Validation URLhttps://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 に生体認証を利用してログインできることが確認できました。これで安心して年を越すことができそうです。来年もセキュアな一年にしましょう。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。