16.3. ユーザー (クライアント側) セキュリティーメカニズムの設定
クライアントでセキュリティーメカニズムを設定する場合、クライアントはユーザーとして表されます。Kafka クライアントの認証、認可、およびアクセス権を設定するには、KafkaUser リソースを使用します。
認証はユーザーアクセスを許可し、認可はユーザーアクセスを許可されたアクションに制限します。Kafka ブローカーへのアクセスが制限されない スーパーユーザー を作成することもできます。
認証および認可メカニズムは、Kafka ブローカーへのアクセスに使用されるリスナーの仕様 と一致する必要があります。
Kafka ブローカーにセキュアにアクセスするための KafkaUser リソースの設定の詳細は、「例: セキュアなクライアントアクセスの設定」 を参照してください。
16.3.1. ユーザーと Kafka クラスターの関連付け リンクのコピーリンクがクリップボードにコピーされました!
KafkaUser リソースには、このリソースが属する Kafka クラスターに適した名前 (Kafka リソースの名前から派生) を定義するラベルが含まれています。
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
このラベルにより、User Operator が KafkaUser リソースを識別し、ユーザーを作成して管理できるようになります。
ラベルが Kafka クラスターと一致しない場合、User Operator は KafkaUser を識別できず、ユーザーは作成されません。
KafkaUser リソースのステータスが空のままの場合は、ラベル設定を確認してください。
16.3.2. ユーザー認証の設定 リンクのコピーリンクがクリップボードにコピーされました!
KafkaUser カスタムリソースを使用して、Kafka クラスターへのアクセスを必要とするユーザー (クライアント) の認証情報を設定します。KafkaUser.spec の authentication プロパティーを使用して認証情報を設定します。type を指定することで、生成される認証情報を制御します。
サポートされる認証タイプ
-
mTLS 認証用の
tls -
外部証明書を使用した mTLS 認証用の
tls-external -
scram-sha-512(SCRAM-SHA-512 認証用)
tls または scram-sha-512 が指定された場合、User Operator がユーザーを作成する際に、認証用のクレデンシャルを作成します。tls-external が指定されている場合、ユーザーは引き続き mTLS を使用しますが、認証情報は作成されません。独自の証明書を指定する場合は、このオプションを使用します。認証タイプが指定されていない場合、User Operator はユーザーまたはそのクレデンシャルを作成しません。
tls-external を使用して、User Operator の外部で発行された証明書を使用して mTLS で認証できます。User Operator は TLS 証明書またはシークレットを生成しません。tls メカニズムを使用する場合と同様に、User Operator を使用して ACL ルールおよびクォータを管理できます。これは、ACL ルールおよびクォータを指定する際に CN=USER-NAME 形式を使用することを意味します。USER-NAME は、TLS 証明書で指定したコモンネームです。
16.3.2.1. mTLS 認証 リンクのコピーリンクがクリップボードにコピーされました!
mTLS 認証を使用するには、KafkaUser リソースの type フィールドを tls に設定します。
mTLS 認証が有効になっているユーザーの例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: tls
# ...
認証タイプは、Kafka クラスターへのアクセスに使用される Kafka リスナーの同等の設定と一致する必要があります。
ユーザーが User Operator によって作成されると、KafkaUser リソースと同じ名前で新しいシークレットが作成されます。シークレットには、mTLS の秘密鍵と公開鍵が含まれています。公開鍵はユーザー証明書に含まれており、作成時にクライアント CA (認証局) によって署名されます。すべての鍵は X.509 形式です。
Cluster Operator によって生成されたクライアント CA を使用している場合、Cluster Operator によってクライアント CA が更新されると、User Operator によって生成されたユーザー証明書も更新されます。
ユーザーシークレットは、キーと証明書を PEM および PKCS #12 形式で提供します。
ユーザー認証情報を含むシークレットの例
apiVersion: v1
kind: Secret
metadata:
name: my-user
labels:
strimzi.io/kind: KafkaUser
strimzi.io/cluster: my-cluster
type: Opaque
data:
ca.crt: <public_key> # Public key of the clients CA used to sign this user certificate
user.crt: <user_certificate> # Public key of the user
user.key: <user_private_key> # Private key of the user
user.p12: <store> # PKCS #12 store for user certificates and keys
user.password: <password_for_store> # Protects the PKCS #12 store
クライアントを設定するときは、次を指定します。
- Kafka クラスターの ID を検証するためのパブリッククラスター CA 証明書の トラストストア プロパティー
- クライアントを検証するためのユーザー認証クレデンシャルの キーストア プロパティー
設定は、ファイル形式 (PEM または PKCS #12) によって異なります。この例では、PKCS #12 ストアと、ストア内の認証情報にアクセスするために必要なパスワードを使用しています。
PKCS #12 形式の mTLS を使用したクライアント設定の例
bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093
security.protocol=SSL
ssl.truststore.location=/tmp/ca.p12
ssl.truststore.password=<truststore_password>
ssl.keystore.location=/tmp/user.p12
ssl.keystore.password=<keystore_password>
- 1
- Kafka クラスターに接続するためのブートストラップサーバーアドレス。
- 2
- 暗号化に TLS を使用する場合のセキュリティープロトコルオプション。
- 3
- トラストストアの場所には、Kafka クラスターの公開鍵証明書 (
ca.p12) が含まれます。クラスター CA 証明書とパスワードは、Kafka クラスターの作成時に<cluster_name>-cluster-ca-certシークレットで Cluster Operator によって生成されます。 - 4
- トラストストアにアクセスするためのパスワード (
ca.password)。 - 5
- キーストアの場所には、Kafka ユーザーの公開鍵証明書 (
user.p12) が含まれます。 - 6
- キーストアにアクセスするためのパスワード (
user.password)。
16.3.2.2. User Operator の外部で発行された証明書を使用した mTLS 認証 リンクのコピーリンクがクリップボードにコピーされました!
User Operator の外部で発行された証明書を使用して mTLS 認証を使用するには、KafkaUser リソースの type フィールドを tls-external に設定します。シークレットおよび認証情報はユーザー用には作成されません。
User Operator 以外で発行された証明書を使用する mTLS 認証を使用するユーザーの例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: tls-external
# ...
16.3.2.3. SCRAM-SHA-512 認証 リンクのコピーリンクがクリップボードにコピーされました!
SCRAM-SHA-512 認証メカニズムを使用するには、KafkaUser リソースの type フィールドを scram-sha-512 に設定します。
SCRAM-SHA-512 認証が有効になっているユーザーの例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: scram-sha-512
# ...
ユーザーが User Operator によって作成されると、KafkaUser リソースと同じ名前で新しいシークレットが作成されます。シークレットの password キーには、生成されたパスワードが含まれ、base64 でエンコードされます。パスワードを使用するにはデコードする必要があります。
ユーザー認証情報を含むシークレットの例
apiVersion: v1
kind: Secret
metadata:
name: my-user
labels:
strimzi.io/kind: KafkaUser
strimzi.io/cluster: my-cluster
type: Opaque
data:
password: Z2VuZXJhdGVkcGFzc3dvcmQ=
sasl.jaas.config: b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VjdXJpdHkuc2NyYW0uU2NyYW1Mb2dpbk1vZHVsZSByZXF1aXJlZCB1c2VybmFtZT0ibXktdXNlciIgcGFzc3dvcmQ9ImdlbmVyYXRlZHBhc3N3b3JkIjsK
生成されたパスワードをデコードします。
echo "Z2VuZXJhdGVkcGFzc3dvcmQ=" | base64 --decode
16.3.2.3.1. カスタムパスワード設定 リンクのコピーリンクがクリップボードにコピーされました!
ユーザーが作成されると、Streams for Apache Kafka によってランダムなパスワードが生成されます。Streams for Apache Kafka によって生成されたパスワードの代わりに、独自のパスワードを使用できます。これを行うには、パスワードでシークレットを作成し、KafkaUser リソースでこれを参照します。
SCRAM-SHA-512 認証に設定されたパスワードを持つユーザーの例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: scram-sha-512
password:
valueFrom:
secretKeyRef:
name: my-secret
key: my-password
# ...
16.3.3. ユーザー認可の設定 リンクのコピーリンクがクリップボードにコピーされました!
KafkaUser カスタムリソースを使用して、Kafka クラスターへのアクセスを必要とするユーザー (クライアント) の認可ルールを設定します。KafkaUser.spec の authorization プロパティーを使用してルールを設定します。type を指定することで、使用するルールを制御します。
簡易認可を使用するには、KafkaUser.spec.authorization で type プロパティーを simple に設定します。簡易認可は、Kafka Admin API を使用して Kafka クラスター内で ACL ルールを管理します。User Operator での ACL 管理が有効かどうかは、Kafka クラスターの認可設定によって異なります。
- 簡易認可の場合、ACL 管理は常に有効になります。
- OPA 認可の場合、ACL 管理は常に無効になります。認可ルールは OPA サーバーで設定されます。
- Red Hat build of Keycloak の認可の場合、Red Hat build of Keycloak で ACL ルールを直接管理できます。設定のフォールバックオプションとして、簡易オーソライザーに認可を委譲することもできます。簡易オーソライザーへの委譲が有効になっている場合、User Operator は ACL ルールの管理も有効にします。
-
カスタム認可プラグインを使用したカスタム認可の場合は、
Kafkaカスタムリソースの.spec.kafka.authorization設定のsupportsAdminApiプロパティーを使用してサポートを有効または無効にします。
認可はクラスター全体で行われます。認可タイプは、Kafka カスタムリソースの同等の設定と一致する必要があります。
ACL 管理が有効になっていない場合、Streams for Apache Kafka は、ACL ルールが含まれているリソースを拒否します。
User Operator のスタンドアロンデプロイメントを使用している場合、ACL 管理はデフォルトで有効にされます。STRIMZI_ACLS_ADMIN_API_SUPPORTED 環境変数を使用してこれを無効にすることができます。
承認が指定されていない場合は、User Operator によるユーザーのアクセス権限のプロビジョニングは行われません。このような KafkaUser がリソースにアクセスできるかどうかは、使用されているオーソライザーによって異なります。たとえば、simple 認可の場合、これは Kafka クラスターの allow.everyone.if.no.acl.found 設定によって決定されます。
16.3.3.1. ACL ルール リンクのコピーリンクがクリップボードにコピーされました!
simple 認可では、ACL ルールを使用して Kafka ブローカーへのアクセスを管理します。
ACL ルールによって、acls プロパティーで指定したユーザーにアクセス権限が付与されます。
AclRule オブジェクトの詳細は、AclRule スキーマリファレンス を参照してください。
16.3.3.2. Kafka ブローカーへのスーパーユーザーアクセス リンクのコピーリンクがクリップボードにコピーされました!
ユーザーを Kafka ブローカー設定のスーパーユーザーのリストに追加すると、KafkaUser の ACL で定義された承認制約に関係なく、そのユーザーにはクラスターへのアクセスが無制限に許可されます。
ブローカーへのスーパーユーザーアクセスの設定に関する詳細は Kafka の承認 を参照してください。
16.3.4. ユーザークォータの設定 リンクのコピーリンクがクリップボードにコピーされました!
ユーザーが Kafka ブローカーに過負荷をかけないように、KafkaUser リソースの spec を設定してクォータを適用します。サイズベースのネットワーク使用量と時間ベースの CPU 使用率のしきい値を設定します。
パーティション変更は、次のタイプのユーザー要求に応答して発生します。
- 新しいトピック用のパーティションの作成
- 既存のトピックへのパーティションの追加
- トピックからのパーティションの削除
パーティション変更のクォータを追加して、パーティションを変更する要求を受け入れるレートを制御することもできます。
ユーザークォータを使用する KafkaUser の例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
# ...
quotas:
producerByteRate: 1048576
consumerByteRate: 2097152
requestPercentage: 55
controllerMutationRate: 10
Kafka クライアントにクォータを使用することは、さまざまな状況で役に立つ場合があります。レートが高すぎる要求を送信する Kafka プロデューサーを誤って設定したとします。このように設定が間違っていると、他のクライアントにサービス拒否を引き起こす可能性があるため、問題のあるクライアントはブロックする必要があります。ネットワーク制限クォータを使用すると、他のクライアントがこの状況の著しい影響を受けないようにすることが可能です。
Streams for Apache Kafka では、ユーザーレベルのクォータはサポートされますが、クライアントレベルのクォータはサポートされません。