AWS Secrets Manager によるサインイン認証情報認証
AWS Secrets Manager を使用して保存および保護されているサインイン認証情報を使用して、Amazon MSK クラスターへのアクセスを制御できます。ユーザーの認証情報を Secrets Manager に保存すると、認証情報の監査、更新、ローテーションなど、クラスター認証のオーバーヘッドが削減されます。Secrets Manager を使用すると、クラスター間でユーザーの認証情報を共有することもできます。
このトピックには、次のセクションが含まれています。
使用方法
Amazon MSK のサインイン認証情報認証では、SASL/SCRAM (Simple Authentication and Security Layer/Salted Challenge Response Mechanism) 認証を使用します。クラスターのサインイン認証情報認証を設定するには、「AWS Secrets Manager」でシークレットリソースを作成し、サインイン認証情報をそのシークレットに関連付けます。
SASL/SCRAMは、RFC 5802
注記
クラスターに SASL/SCRAM 認証を設定すると、Amazon MSK はクライアントとブローカー間のすべてのトラフィックに対して TLS 暗号化をオンにします。
Amazon MSK クラスターの SASL/SCRAM 認証の設定
AWS Secrets Manager でシークレットを設定するには、「AWS Secrets Manager ユーザーガイド」のシークレットの作成と取得のチュートリアルに従ってください。
Amazon MSK クラスターのシークレットを作成するときは、次の要件に注意してください。
シークレットタイプには、他のタイプのシークレット (API キーなど) を選択します。
シークレット名は、プレフィックス AmazonMSK_ から始まる必要があります。
既存のカスタム AWS KMS キーを使用するか、シークレット用に新しいカスタム AWS KMS キーを作成する必要があります。Secrets Manager は、デフォルトでシークレットにデフォルトの AWS KMS キーを使用します。
重要
デフォルトの AWS KMS キーで作成されたシークレットは、Amazon MSK クラスターでは使用できません。
[プレーンテキスト] オプションを使用してキーと値のペアを入力するには、サインイン認証情報データは次の形式である必要があります。
{ "username": "alice", "password": "alice-secret" }
シークレットの ARN (Amazon リソース名) 値をレコードします。
-
重要
「 クラスターの適切なサイズ設定: ブローカーあたりのパーティション数」で説明されている制限を超えるクラスターに Secrets Manager シークレットを関連付けることはできません。
AWS CLI を使用してシークレットを作成する場合は、
kms-key-id
パラメータにキー ID または ARN を指定します。エイリアスは指定しないでください。-
シークレットをクラスターに関連付けるには、Amazon MSK コンソールまたは BatchAssociateScramSecret オペレーションのいずれかを使用します。
重要
シークレットをクラスターに関連付けると、Amazon MSK はそのシークレットにリソースポリシーをアタッチします。これにより、定義したシークレット値にクラスターがアクセスして読み取ることができるようになります。このリソースポリシーは変更しないでください。変更すると、クラスターがシークレットにアクセスできなくなる可能性があります。
次の
BatchAssociateScramSecret
オペレーションの JSON 入力の例は、シークレットをクラスターに関連付けます。{ "clusterArn" : "arn:aws:kafka:us-west-2:0123456789019:cluster/SalesCluster/abcd1234-abcd-cafe-abab-9876543210ab-4", "secretArnList": [ "arn:aws:secretsmanager:us-west-2:0123456789019:secret:AmazonMSK_MyClusterSecret" ] }
サインイン認証情報を使用したクラスターへの接続
シークレットを作成してクラスターに関連付けると、クライアントをクラスターに接続できます。以下のサンプルステップでは、SASL/SCRAM 認証を使用するクラスターにクライアントを接続する方法と、サンプルトピックのデータを生成したり消費したりする方法を示します。
次のコマンドを使用して、クラスターの詳細を取得します。
ClusterArn
は、クラスターの Amazon リソースネーム (ARN) に置き換えてください。aws kafka describe-cluster --cluster-arn "
ClusterArn
"コマンドの JSON 結果から、
ZookeeperConnectString
という名前の文字列に関連付けられた値を保存します。サンプルトピックを作成するには、クライアントマシンで次のコマンドを実行します。
ZookeeperConnectString
は、前のステップで記録した文字列に置き換えてください。<path-to-your-kafka-installation>
/bin/kafka-topics.sh --create --zookeeperZookeeperConnectString
--replication-factor 3 --partitions 1 --topicExampleTopicName
クライアントマシンで、シークレットに保存されているユーザー認証情報を含む JAAS 設定ファイルを作成します。例えば、ユーザー alice の場合、次の内容を含む
users_jaas.conf
という名前のファイルを作成します。KafkaClient { org.apache.kafka.common.security.scram.ScramLoginModule required username="alice" password="alice-secret"; };
次のコマンドを使用して、JAAS 設定ファイルを
KAFKA_OPTS
環境パラメータとしてエクスポートします。export KAFKA_OPTS=-Djava.security.auth.login.config=
<path-to-jaas-file>
/users_jaas.conf./tmp
ディレクトリにkafka.client.truststore.jks
という名前のファイルを作成します。-
次のコマンドを使用して、JVM
cacerts
フォルダの JDK キーストアファイルを、前のステップで作成したkafka.client.truststore.jks
ファイルにコピーします。JDKFolder
は、インスタンス上の JDK フォルダの名前に置き換えてください。例えば、JDK フォルダにはjava-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64
という名前が付いている場合があります。cp /usr/lib/jvm/
JDKFolder
/jre/lib/security/cacerts /tmp/kafka.client.truststore.jks Apache Kafka のインストール済み環境の
bin
ディレクトリに、次の内容を含むclient_sasl.properties
という名前のクライアントプロパティファイルを作成します。このファイルは、SASL メカニズムとプロトコルを定義します。security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-512 ssl.truststore.location=
<path-to-keystore-file>
/kafka.client.truststore.jks次のコマンドを使用して、ブートストラップブローカーの文字列を取得します。
ClusterArn
は、クラスターの Amazon リソースネーム (ARN) に置き換えてください。aws kafka get-bootstrap-brokers --cluster-arn
ClusterArn
コマンドの JSON 結果から、
BootstrapBrokerStringSaslScram
という名前の文字列に関連付けられた値を保存します。作成したサンプルトピックにデータを生成するには、クライアントマシンで次のコマンドを実行します。
BootstrapBrokerStringSaslScram
は、前のステップで取得した値に置き換えてください。<path-to-your-kafka-installation>
/bin/kafka-console-producer.sh --broker-listBootstrapBrokerStringSaslScram
--topicExampleTopicName
--producer.config client_sasl.properties作成したトピックからデータを消費するには、クライアントマシンで次のコマンドを実行します。
BootstrapBrokerStringSaslScram
は、以前に取得した値に置き換えてください。<path-to-your-kafka-installation>
/bin/kafka-console-consumer.sh --bootstrap-serverBootstrapBrokerStringSaslScram
--topicExampleTopicName
--from-beginning --consumer.config client_sasl.properties
ユーザーの使用
ユーザーの作成:キーバリューのペアとして秘密のユーザーを作成します。Secrets Manager コンソールで [プレーンテキスト] オプションを使用する場合は、サインイン認証情報データを次の形式で指定する必要があります。
{ "username": "alice", "password": "alice-secret" }
ユーザーアクセスの取り消し:クラスターにアクセスするためのユーザーの認証情報を取り消すには、最初にクラスターの ACL を削除または適用してから、シークレットの関連付けを解除することをお勧めします。これは、次の理由によるものです。
ユーザーを削除しても既存の接続は閉じられません。
シークレットへの変更が反映されるまでに最大 10 分かかります。
Amazon MSK で ACL を使用する方法については、「Apache Kafka ACL」を参照してください。
ユーザーが ACL を変更できないように、zookeeper ノードへのアクセスを制限することをお勧めします。詳細については、「Apache ZooKeeper へのアクセスの制御」を参照してください。
制限事項
SCRAM シークレットを使用する場合は、次の制限に注意してください。
Amazon MSK は、SCRAM-SHA-512 認証のみをサポートします。
Amazon MSK クラスターには、最大 1000 人のユーザーを含めることができます。
シークレットと一緒に AWS KMS keyを使用する必要があります。デフォルトの Secrets Manager 暗号化キーを使用するシークレットを Amazon MSK で使用することはできません。KMS キーの作成については、「対称暗号化 KMS キーの作成」を参照してください。
Secrets Manager で非対称 KMS キーを使用することはできません。
BatchAssociateScramSecret オペレーションを使用して、一度に最大 10 個のシークレットをクラスターに関連付けることができます。
Amazon MSK クラスターに関連付けられているシークレットの名前には、プレフィックス Amazon MSK_ が必要です。
Amazon MSK クラスターに関連付けられているシークレットは、クラスターと同じ Amazon Web Services アカウントおよび AWS リージョンに存在する必要があります。