4.5.4. Red Hat Single Sign-On の Authorization Services の試行
この例では、Red Hat Single Sign-On Authorization Services をkeycloak
認証で使用する方法を説明します。Red Hat Single Sign-On の Authorization Services を使用して、Kafka クライアントにアクセス制限を強制します。Red Hat Single Sign-On の Authorization Services では、承認スコープ、ポリシー、およびパーミッションを使用してアクセス制御をリソースに定義および適用します。
Red Hat Single Sign-On の Authorization Services REST エンドポイントは、認証されたユーザーのリソースに付与されたパーミッションの一覧を提供します。許可 (パーミッション) のリストは、Kafka クライアントによって認証されたセッションが確立された後に最初のアクションとして Red Hat Single Sign-On サーバーから取得されます。付与の変更が検出されるように、バックグラウンドで一覧が更新されます。付与は、各ユーザーセッションが迅速な承認決定を提供するために、Kafka ブローカーにてローカルでキャッシュおよび適用されます。
AMQ Streams では、Red Hat Single Sign-On を設定するためにデプロイメントアーティファクトを含む 2 つのサンプルファイルが提供されます。
kafka-ephemeral-oauth-single-keycloak-authz.yaml
-
Red Hat Single Sign-On を使用して OAuth 2.0 トークンベースの承認に設定された
Kafka
カスタムリソースの例。カスタムリソースを使用して、keycloak
承認およびトークンベースのoauth
認証を使用する Kafka クラスターをデプロイできます。 kafka-authz-realm.json
- サンプルグループ、ユーザー、ロール、およびクライアントで設定された Red Hat Single Sign-On レルムの例。レルムを Red Hat Single Sign-On インスタンスにインポートし、Kafka にアクセスするための詳細なパーミッションを設定できます。
Red Hat Single Sign-On で例を試す場合は、これらのファイルを使用して、本セクションの順序で説明したタスクを実行します。
認証
トークンベースの oauth
認証を設定する場合、jwksEndpointUri
をローカル JWT 検証の URI として指定します。keycloak
承認を設定するとき、a tokenEndpointUri
を Red Hat Single Sign-On トークンエンドポイントの URI として指定します。両方の URI のホスト名は同じである必要があります。
グループまたはロールポリシーを使用した対象パーミッション
Red Hat Single Sign-On では、サービスアカウントが有効になっている機密性の高いクライアントを、クライアント ID とシークレットを使用して、独自の名前のサーバーに対して認証できます。これは、通常、特定ユーザーのエージェント (Web サイトなど) としてではなく、独自の名前で動作するマイクロサービスに便利です。サービスアカウントには、通常のユーザーと同様にロールを割り当てることができます。ただし、グループを割り当てることはできません。そのため、サービスアカウントを使用してマイクロサービスへのパーミッションをターゲットにする場合は、グループポリシーを使用できないため、代わりにロールポリシーを使用する必要があります。逆に、ユーザー名およびパスワードを使用した認証が必要な通常のユーザーアカウントにのみ特定のパーミッションを制限する場合は、ロールポリシーではなく、グループポリシーを使用すると、副次的に実現することができます。これは、ClusterManager
で始まるパーミッションの例で使用されるものです。通常、クラスター管理の実行は CLI ツールを使用して対話的に行われます。結果的に生成されるアクセストークンを使用して Kafka ブローカーに対して認証を行う前に、ユーザーのログインを要求することは妥当です。この場合、アクセストークンはクライアントアプリケーションではなく、特定のユーザーを表します。
4.5.4.1. Red Hat Single Sign-On 管理コンソールへのアクセス
Red Hat Single Sign-On を設定してから、管理コンソールに接続し、事前設定されたレルムを追加します。kafka-authz-realm.json
ファイルのサンプルを使用して、レルムをインポートします。管理コンソールのレルムに定義された承認ルールを確認できます。このルールは、Red Hat Single Sign-On レルムの例を使用するよう設定された Kafka クラスターのリソースへのアクセスを許可します。
前提条件
- 実行中の OpenShift クラスター。
-
事前設定されたレルムが含まれる AMQ Streams の
examples/security/keycloak-authorization/kafka-authz-realm.json
ファイル。
手順
- Red Hat Single Sign-On ドキュメントの「Server Installation and Configuration」の説明にしたがって、Red Hat Single Sign-On Operator を使用して Red Hat Single Sign-On サーバーをインストールします。
- Red Hat Single Sign-On インスタンスが実行されるまで待ちます。
管理コンソールにアクセスできるように外部ホスト名を取得します。
NS=sso oc get ingress keycloak -n $NS
この例では、Red Hat Single Sign-On サーバーが
sso
namespace で実行されていることを前提としています。admin
ユーザーのパスワードを取得します。oc get -n $NS pod keycloak-0 -o yaml | less
パスワードはシークレットとして保存されるため、Red Hat Single Sign-On インスタンスの設定 YAML ファイルを取得して、シークレット名(
secretKeyRef.name
)を特定します。シークレットの名前を使用して、クリアテキストのパスワードを取得します。
SECRET_NAME=credential-keycloak oc get -n $NS secret $SECRET_NAME -o yaml | grep PASSWORD | awk '{print $2}' | base64 -D
この例では、シークレットの名前が
credential-keycloak
であることを前提としています。ユーザー名
admin
と取得したパスワードを使用して、管理コンソールにログインします。https://HOSTNAME
を使用して OpenShift Ingress にアクセスします。管理コンソールを使用して、サンプルレルムを Red Hat Single Sign-On にアップロードできるようになりました。
- Add Realm をクリックして、サンプルレルムをインポートします。
examples/security/keycloak-authorization/kafka-authz-realm.json
ファイルを追加してから Create をクリックします。これで、管理コンソールの現在のレルムとして
kafka-authz
が含まれるようになりました。デフォルトビューには、Master レルムが表示されます。
Red Hat Single Sign-On 管理コンソールで Clients > kafka > Authorization > Settings の順に移動し、Decision Strategy が Affirmative に設定されていることを確認します。
肯定的な (Affirmative) ポリシーとは、クライアントが Kafka クラスターにアクセスするためには少なくとも 1 つのポリシーが満たされている必要があることを意味します。
Red Hat Single Sign-On 管理コンソールで、Groups、Users、Roles、および Clients と移動して、レルム設定を表示します。
- グループ
-
Groups
は、ユーザーグループの作成やユーザー権限の設定に使用します。グループは、名前が割り当てられたユーザーのセットです。地域、組織、または部門単位に区分するために使用されます。グループは LDAP アイデンティティープロバイダーにリンクできます。Kafka リソースにパーミッションを付与するなど、カスタム LDAP サーバー管理ユーザーインターフェースを使用して、ユーザーをグループのメンバーにすることができます。 - ユーザー
-
Users
は、ユーザーを作成するために使用されます。この例では、alice
とbob
が定義されています。alice
はClusterManager
グループのメンバーであり、bob
はClusterManager-my-cluster
グループのメンバーです。ユーザーは LDAP アイデンティティープロバイダーに保存できます。 - ロール
-
Roles
は、ユーザーやクライアントが特定の権限を持っていることを示すものです。ロールはグループに似た概念です。通常ロールは、組織ロールでユーザーを タグ付け するために使用され、必要なパーミッションを持ちます。ロールは LDAP アイデンティティープロバイダーに保存できません。LDAP が必須である場合は、代わりにグループを使用し、Red Hat Single Sign-On ロールをグループに追加して、ユーザーにグループを割り当てるときに対応するロールも取得するようにします。 - Clients
Clients
は特定の構成を持つことができます。この例では、kafka
、kafka-cli
、team-a-client
、team-b-client
の各クライアントが設定されています。-
kafka
クライアントは、Kafkaブローカーがアクセストークンの検証に必要なOAuth 2.0 通信を行うために使用されます。このクライアントには、Kafka ブローカーで承認を実行するために使用される承認サービスリソース定義、ポリシー、および承認スコープも含まれます。認証設定はkafka
クライアントの Authorization タブで定義され、Settings タブでAuthorization Enabled をオンにすると表示されます。 -
kafka-cli
クライアントは、アクセストークンまたは更新トークンを取得するためにユーザー名とパスワードを使用して認証するときに Kafka コマンドラインツールによって使用されるパブリッククライアントです。 -
team-a-client
およびteam-b-client
クライアントは、特定の Kafka トピックに部分的にアクセスできるサービスを表す機密クライアントです。
-
Red Hat Single Sign-On 管理コンソールで、Authorization > Permissions の順に移動し、レルムに定義されたリソースおよびポリシーを使用する付与されたパーミッションを確認します。
たとえば、
kafka
クライアントには以下のパーミッションがあります。Dev Team A can write to topics that start with x_ on any cluster Dev Team B can read from topics that start with x_ on any cluster Dev Team B can update consumer group offsets that start with x_ on any cluster ClusterManager of my-cluster Group has full access to cluster config on my-cluster ClusterManager of my-cluster Group has full access to consumer groups on my-cluster ClusterManager of my-cluster Group has full access to topics on my-cluster
- Dev Team A
-
Dev チーム A レルムロールは、任意のクラスターで
x_
で始まるトピックに書き込みできます。これは、Topic:x_*
というリソース、Describe
とWrite
のスコープ、そしてDev Team A
のポリシーを組み合わせたものです。Dev Team A
ポリシーは、Dev Team A
というレルムロールを持つすべてのユーザーにマッチします。 - Dev Team B
-
Dev チーム B レルムロールは、任意のクラスターで
x_
で始まるトピックから読み取ることができます。これは、Topic:x_*、
Group:x_*
のリソース、Describe
とRead
のスコープ、およびDev Team B
のポリシーを組み合わせたものです。Dev Team B
ポリシーは、Dev Team B
というレルムロールを持つすべてのユーザーにマッチします。一致するユーザーおよびクライアントはトピックから読み取りでき、名前がx_
で始まるトピックおよびコンシューマーグループの消費されたオフセットを更新できます。