Amazon Web Services ブログ

IAM Roles Anywhere を使用して AWS 外の Kafka クライアントから Amazon MSK にセキュアに接続する

本記事は 2026 年 3 月 16 日 に公開された「Securely connect Kafka clients running outside AWS to Amazon MSK with IAM Roles Anywhere」を翻訳したものです。

AWS 外 (オンプレミス環境や他のクラウド) で動作する Kafka クライアントは、コードベースやサーバー設定に長期 IAM ユーザーのアクセスキーを含める必要があります。長期認証情報が漏洩すると、AWS アカウントへの不正アクセスにつながるリスクがあります。

本記事では、AWS IAM Roles Anywhere を使用して、X.509 証明書によるクライアントアプリケーションの一時的な AWS セキュリティ認証情報を取得し、Amazon Managed Streaming for Apache Kafka (Amazon MSK) クラスターとセキュアに通信する方法を紹介します。本記事のソリューションは、Amazon MSK Provisioned と Serverless の両方のクラスターに対応しています。

AWS IAM Roles Anywhere の概要

AWS Identity and Access Management (IAM) Roles Anywhere を使用すると、サーバー、コンテナ、アプリケーションなど AWS 外で動作するワークロードに対して、IAM の一時的なセキュリティ認証情報を取得できます。

IAM Roles Anywhere を使用すると、AWS アプリケーションと同じ IAM ポリシーとロールを AWS 外のワークロードでも利用できます。AWS 外で動作する Kafka クライアントの長期認証情報を管理する必要がなくなります。プロファイルに 1 つ以上のロールを関連付け、IAM Roles Anywhere でそのロールを引き受けられるようにすると、認証局 (CA) が発行したクライアント証明書で AWS へのリクエストを安全に開始できます。アプリケーションは一時的な認証情報を取得し、AWS 環境にアクセスできるようになります。

Amazon MSK の IAM アクセスコントロールを使用すると、追加コストなしで Amazon MSK クラスターの認証と認可の両方を管理できます。認証と認可に別々のメカニズムを使用する必要がなくなります。mutual TLS や SASL/SCRAM 認証/認可を使用する特別な要件がない限り、Amazon MSK では IAM アクセスコントロールの使用をお勧めします。

以降では、AWS IAM Roles Anywhere で MSK クラスターに接続するセキュアな Kafka クライアントマシンの実装手順を説明します。

ソリューションの概要

ソリューションのアーキテクチャを次の図に示します。

 Architecture diagram showing a hybrid AWS setup where an on-premises MSK client connects to Amazon MSK Provisioned and Serverless clusters via AWS Direct Connect or VPN, using IAM Roles Anywhere, AWS STS, Route 53, and VPC endpoints for secure, private Kafka connectivity.

アーキテクチャのフローは次のとおりです。

  1. クライアントマシンが X.509 証明書を使用して AWS IAM Roles Anywhere エンドポイントにセッショントークンをリクエストします。
  2. IAM Roles Anywhere が証明書を検証し、STS から一時的なセッショントークンを取得してクライアントマシンに返します。
  3. Amazon MSK Provisioned の場合、MSK クライアントマシンは AWS VPN または AWS Direct Connect 経由で VPC 内の AWS Transit Gateway または AWS Network Load Balancer に接続します。詳細については、Amazon MSK へのセキュアな接続パターンを参照してください。
  4. Amazon MSK Serverless の場合、MSK クライアントマシンは AWS VPN または AWS Direct Connect 経由で VPC 内のインターフェイス VPC エンドポイントに接続します。詳細については、オンプレミスネットワークから Amazon MSK Serverless に接続するを参照してください。
  5. Amazon MSK Serverless では、インターフェイスエンドポイントはアカウント内のプライベート IP アドレスを持つ 1 つ以上の Elastic Network Interface の集合です。MSK Serverless サービスへのトラフィックのエントリポイントです。

前提条件

本記事では、MSK Serverless クラスターとクライアントマシンの作成に慣れていることを前提としています。以下のタスクが完了していることを想定しています。

  1. Amazon MSK Serverless クラスターの作成または Amazon MSK Provisioned クラスターの作成
  2. オンプレミスのデータセンターまたは別の AWS アカウントの VPC に MSK クライアントマシンを作成
  3. オンプレミスと Amazon MSK Serverless クラスター間のネットワーク接続の確立、または オンプレミスと Amazon MSK Provisioned クラスター間のネットワーク接続の確立

AWS IAM Roles Anywhere の設定

オンプレミスの Kafka クライアントマシンで IAM Roles Anywhere を有効にするには、トラストアンカーとプロファイルの 2 つを設定する必要があります。トラストアンカーは、Roles Anywhere と認証局間の信頼関係を確立します。証明書認証で IAM ロールの認証情報を取得する際に使用されます。プロファイルは、Roles Anywhere での認証成功後に適用される権限セットです。

ステップ 1: CA の生成

X.509 証明書は、クライアントマシンと Roles Anywhere 間の通信に不可欠です。任意の公開鍵基盤 (PKI) プラットフォームで認証局 (CA) を構築できます。

独自の X.509 クライアント証明書を生成する場合は、外部認証局を使用した IAM Roles Anywhere の手順を参照してください。

この例では、簡略化のため AWS Private CA を使用します。

AWS Private CA コンソールに移動します。

ルート CA の作成

  1. CA タイプオプションで Root を選択し、組織名と組織単位名を入力します。
  2. キーアルゴリズムにデフォルトの RSA 2048 を選択します。
  3. Create CA ボタンを選択してプライベート CA を生成し、証明書をインストールします。

下位 CA の作成

  1. CA タイプオプションで Subordinate を選択します。
  2. キーアルゴリズムにデフォルトの RSA 2048 を選択します。
  3. Create CA ボタンを選択します。
  4. 下位 CA から CSR を取得し、ルート CA で署名します。

この CA は、IAM Roles Anywhere への証明書発行に使用します。

よりセキュアで自動更新される AWS Private CA の生成については、CA の作成手順CA 階層の構築方法を参照してください。

ステップ 2: アンカーの設定

  1. Roles Anywhere コンソールに移動し、Create a trust anchor ページを開きます。
  2. トラストアンカーの名前を入力し、ステップ 1 で作成したプライベート CA を選択します。独自の外部 CA を使用する場合は、External certificate bundle オプションを選択し、必要な証明書バンドルを指定します。
  3. create a trust anchor ボタンを選択してプロセスを完了します。

ステップ 3: IAM Roles Anywhere を信頼するロールの作成と設定

IAM Roles Anywhere での認証後にオンプレミスの Kafka クライアントマシンが引き受けるロールを作成します。

  1. ロールの信頼ポリシーには以下を含める必要があります。
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "rolesanywhere.amazonaws.com"
          },
          "Action": [
            "sts:AssumeRole",
            "sts:SetSourceIdentity",
            "sts:TagSession"
          ],
          "Condition": {
            "StringEquals": {
              "aws:PrincipalTag/x509Subject/CN": "specific-certificate-common-name"
            }
          }
        }
      ]
    }
  2. このデモでは、以下のポリシーを作成してロールにアタッチします。
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "kafka-cluster:Connect",
                    "kafka-cluster:AlterCluster",
                    "kafka-cluster:DescribeCluster"
                ],
                "Resource": [
                    "arn:aws:kafka:<Region>:<Account-ID>:cluster/<Cluster-name>/<Cluster-identifier>"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "kafka-cluster:CreateTopic",
                    "kafka-cluster:DescribeTopic",
                    "kafka-cluster:WriteData",
                    "kafka-cluster:ReadData",
                    "kafka-cluster:AlterGroup",
                    "kafka-cluster:DescribeGroup"
                ],
                "Resource": [
                    "arn:aws:kafka:<Region>:<Account-ID>:cluster/ <Cluster-Name>/<Cluster-identifier>",
                    "arn:aws:kafka:<Region>:<Account-ID>:topic/msk-<Cluster-Name>/<Cluster-Identifier>/<Topic-Name> ",
                    "arn:aws:kafka:<Region>:<Account-ID>:group/<Cluster-Name>/<Cluster-Identifier>/<Group-Name>"
                ]
            }
        ]
    }

ステップ 4: プロファイルの設定

  1. Roles Anywhere コンソールに戻ります。
  2. Profiles で Create a profile を選択します。
  3. プロファイルの名前を入力します。
  4. ステップ 3 で作成したロールを選択し、Roles Anywhere プロファイルを作成します。

ステップ 5: クライアントマシンのテスト

トラストアンカーとプロファイルを作成して Roles Anywhere のセットアップが完了したので、次はクライアントマシンと Roles Anywhere の通信をテストします。セッショントークンを取得し、MSK ブローカーとの通信を確立します。

  1. ステップ 1 で作成した CA からプライベート証明書をリクエストし、クライアントマシンで使用するクライアント証明書をエクスポートします。
  2. .pem ファイルを作成し、すべての証明書の内容をファイル (例: private_key.pem) にコピーして、以下のコマンドで復号化した証明書を生成します。
    openssl rsa -in private_key.pem -out decrypted_private_key.pem

  3. 認証情報ヘルパーをダウンロードし、署名ヘルパーツールでクライアントマシンからの動作を確認します。Roles Anywhere のトラストアンカーとプロファイルの ARN、および IAM で作成したロールの ARN を指定します。
    ./aws_signing_helper credential-process \
    --certificate /path/to/certificate.pem \
    --private-key /path/to/decrypted_private_key.pem \
    --trust-anchor-arn <TA_ARN> \
    --profile-arn <PROFILE_ARN> \
    --role-arn <Roles_ARN> \
    --region <Region>

    IAM Roles Anywhere からセッション認証情報を正常に取得できるはずです。

  4. セットアップの成功を確認したら、~/.aws/config ファイルを更新または作成します。オンプレミスサーバーの無人アクセスを有効にするため、署名ヘルパーを credential_process として追加します。
    [default]
    credential_process = ./aws_signing_helper credential-process 
    --certificate /path/to/certificate.pem 
    --private-key /path/to/decrypted_private_key.pem 
    --trust-anchor-arn <TA_ARN> 
    --profile-arn <PROFILE_ARN> 
    --role-arn <Roles_ARN>
    --region <Region>

すべてのステップが完了すると、Kafka クライアントが MSK ブローカーと通信できるようになります。

./kafka-topics.sh --create \
--bootstrap-server <BOOTSTRAP_SERVER> \
--command-config <Command Config File> \
--replication-factor <Replication Factor> \
--partitions <Number of Partitions> \
--topic <Topic Name>

クリーンアップ

不要なコストを避けるには、IAM ロール、プロファイル、トラストアンカー、ポリシー、ACM でリクエストした証明書、AWS Private CA で作成した証明書を削除してください。

aws delete-role --role-name <value>
aws delete-profile --profile-id <value>
aws delete-trust-anchor --trust-anchor-id <value>
aws acm delete-certificate --certificate-arn <value>
aws acm-pca revoke-certificate --certificate-authority-arn <value> --certificate-serial <value> --revocation-reason <value>
aws acm-pca delete-certificate --certificate-authority-arn <value> --certificate-serial <value>

まとめ

本記事では、AWS IAM Roles Anywhere を使用して、AWS 外のクライアントマシンから MSK ブローカーにアクセスするための一時的なセッショントークンを生成する方法を紹介しました。IAM Roles Anywhere の導入により、AWS 外から MSK に接続する Kafka クライアントのセキュリティ体制が強化され、厳格なセキュリティ要件があるお客様も安心して MSK を導入できます。

ご質問は、AWS re:Post で新しいスレッドを作成するか、AWS サポートにお問い合わせください。

著者について

Ankit Mishra

Ankit Mishra

Ankit は、Amazon Web Services のシニアソリューションアーキテクトです。セキュアでスケーラブル、信頼性が高く、コスト効率の良いクラウドソリューションの設計と構築を支援しています。仕事以外では、妻と幼い娘と過ごす時間を楽しんでいます。

Tony Anastasio

Tony Anastasio

Tony は、AWS の Global Healthcare チームのシニアソリューションアーキテクトマネージャーです。データの相互運用性、AI ソリューション、セキュアなクラウド基盤にわたるイノベーションを推進するアーキテクトチームをリードし、業界最大級のヘルスケア組織を支援しています。余暇には、妻と 2 人の子供と過ごす時間を楽しんでいます。

Kalyan Janaki

Kalyan Janaki

Kalyan は、Amazon Web Services のシニアビッグデータ & アナリティクススペシャリストです。高いスケーラビリティ、パフォーマンス、セキュリティを備えたクラウドベースのソリューションの設計と構築を支援しています。


この記事は Kiro が翻訳を担当し、Solutions Architect の Takayuki Enomoto がレビューしました。