1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IAM Roles Anywhere を使って閉域ネットワークのオンプレミスから AWS のクレデンシャルを安全に取得する

1
Posted at

インターネットにアクセスできない閉域のオンプレミスなどから AWS リソースを利用するための認証認可の方法として、IAM ユーザーのアクセスキーを発行する方法があります。しかし、IAM ユーザーのアクセスキーが外部に漏れてしまうとその権限が第三者に悪用されるリスクがあるため、一般的には推奨されない方法です。

ガバメントクラウドにおいても、原則 IAM ユーザーの作成は禁止されており、これ以外の方法を検討しなければなりません。

IAM ユーザーのアクセスキーを使わずに安全に認証認可する方法はいくつかありますが、今回は IAM Roles Anywhere と AWS Private CA を使う方法を検証してみました。

IAM Roles Anywhere を使った認証認可の概要

IAM Roles Anywhere とは、信頼アンカーに設定した認証局(CA)が発行する証明書を持つクライアントを認証し、IAM Role のクレデンシャルで認可できるサービスです。

適切な証明書を持つクライアントは aws_signing_helper を実行するだけで安全に IAM Role のクレデンシャルを取得できます。

IAM Roles Anywhere を設定する手順の概要は次のとおりです。

  1. オンプレミスのフルリゾルバー DNS にインターフェース型 VPC エンドポイントの DNS 名に対する条件付きフォワーダーを設定
  2. オンプレミスのクライアントにあらかじめ AWS CLI と aws_signing_helper をインストール
  3. IAM Roles Anywhere など必要なインターフェース型 VPC エンドポイントを作成
  4. 利用したい AWS リソースのあるアカウントで Private CA を構築
  5. オンプレミスのクライアントから openssl などを使って証明書発行要求(CSR)を作成
  6. Private CA でクライアントの CSR から証明書を発行
  7. 同じアカウントで IAM Roles Anywhere の信頼アンカー(Private CA)とプロファイル(払い出す IAM Role)を作成
  8. オンプレミスのクライアントから aws_signing_helper で IAM Role のクレデンシャルを取得
  9. オンプレミスのクライアントから AWS CLI で取得したクレデンシャルでリソースを利用する

今回は検証として、IAM Roles Anywhere で取得する IAM Role を使い、インターフェース型 VPC エンドポイント経由で S3 へアクセスできることを確認しようと思います。

前提となるネットワーク構成

構築するリージョンは東京リージョンとします。

オンプレミスのクライアントから IAM Roles Anywhere を使うためには、インターフェース型 VPC エンドポイントの DNS 名である rolesanywhere.ap-northeast-1.amazonaws.com(東京リージョンの場合)を名前解決できて、かつそこまでルーティングできる必要があります。

ネットワーク構成の概要は次のとおりです。

IAMRolesAnywhere.drawio.png

オンプレミスとルーティング可能な VPC に Route 53 インバウンドエンドポイントと、IAM Roles Anywhere ほか、必要なインターフェース型 VPC エンドポイントを作成します。

Private CA、IAM Roles Anywhere、S3 は、実運用を想定して別の AWS アカウントに作成します。オンプレミス側から見れば、VPC エンドポイント経由でこれらのリソースにアクセスするだけなので、VPC エンドポイントと各リソースの所有アカウントが異なっても特に留意点はありません。

IAM Roles Anywhere の構築手順

VPC エンドポイント DNS 名への条件付きフォワーダーを設定

オンプレミスのクライアントが参照するフルリゾルバー DNS に、各インターフェース型 VPC エンドポイントの DNS 名に対する名前解決要求を Route 53 インバウンドエンドポイントに転送するよう条件付きフォワーダーを設定します。詳細は割愛しますが、過去に設定例の記事を書いているのでよかったら参考にしてください。

オンプレミスのクライアントに aws_signing_helper と AWS CLI をインストール

オンプレミスのクライアントが IAM Roles Anywhere を使って簡単にクレデンシャルを取得できるよう、aws_signing_helper のバイナリーを配置しておきます。合わせて検証作業に使うため、AWS CLI もインストールしておきます。

インターフェース型 VPC エンドポイントの作成

Route 53 インバウンドエンドポイントのある VPC に以下のインターフェース型 VPC エンドポイントを作成します。いずれもプライベート DNS 名を有効にして作成します。

  • rolesanywhere.ap-northeast-1.amazonaws.com
  • s3.ap-northeast-1.amazonaws.com

Private CA の作成

IAM Roles Anywhere を設定する AWS アカウント側で、マネジメントコンソールから Private CA を作成します。

今回は検証目的なので、費用の安い「有効期間の短い証明書」モードで Private CA を設定しました。実運用の場合は有効期間の長い証明書が発行できる通常のモードの方がよいかもしれません。

「CA タイプのオプション」は「ルート」を選択し、CN などを任意の文字列に設定します。

スクリーンショット 2026-09-06 18.27.32.png

その他の設定はデフォルトのままとしました。

スクリーンショット 2026-09-06 18.28.04.png

Private CA が作成できたら、「CA 証明書のインストール」を行います。

スクリーンショット 2026-09-06 18.28.31.png

CA 証明書の有効期間は、デフォルトのまま 10 年間としました。

スクリーンショット 2026-09-06 18.28.48.png

クライアント証明書の発行

クライアント証明書を ACM で発行する方法もありますが、今回はオンプレミスのクライアントで CSR を作成し、これに Private CA が署名して証明書を作成する方法とします。

オンプレミスのクライアントで openssl を使って CSR を作成

今回オンプレミスのクライアントは Ubuntu 26.04 としました。openssl がデフォルトでインストール済みのため、以下のコマンドで CSR を作成できます。ここでは CSR を client-csr.pem、秘密鍵を client-key.pem というファイル名で作成しています。

ここで CN に指定した onpremises-client-01 という値は、後で IAM ロールを設定する際に使うのでメモしておきます。

$ mkdir -p ~/.aws/rolesanywhere && chmod 700 ~/.aws/rolesanywhere
$ cd ~/.aws/rolesanywhere
$ openssl req -new -noenc \
-newkey rsa:2048 \
-keyout client-key.pem \
-out client-csr.pem \
-subj '/CN=onpremises-client-01'
$ chmod 600 client-key.pem

作成された CSR ファイルを Private CA を操作できる環境へ一旦持ち出します。

Private CA で CSR からクライアント証明書を発行

マネジメントコンソールに CSR を署名してクライアント証明書を発行する画面がないため、AWS CLI で作業します。

まずは CSR に署名します。なお、オンプレミスから持ち出した CSR ファイルはカレントディレクトリに置いていることとします。

$ aws acm-pca issue-certificate \
--certificate-authority-arn <Private CA の ARN> \
--csr fileb://client-csr.pem \
--signing-algorithm SHA256WITHRSA \
--validity Value=7,Type=DAYS \
--query CertificateArn \
--output text

作成した証明書の ARN が出力されるので、これをコピーし、証明書を取得するコマンドにセットします。ここでは証明書を client-cert.pem というファイル名で作成しています。

$ aws acm-pca get-certificate \
--certificate-authority-arn <Private CA の ARN> \
--certificate-arn <上記でコピーした ARN> \
--query Certificate --output text > client-cert.pem

作成した証明書ファイルはオンプレミスのクライアントへ戻します。

IAM Roles Anywhere の信頼アンカーの作成

IAM Roles Anywhere のマネジメントコンソールから信頼アンカーを作成します。

「認証機関(CA)ソース」は「AWS 証明書管理プライベート CA」とし、「AWS 証明書管理プライベート CA」には作成した Private CA を設定します。

「Notification settings」は、今回「有効期間の短い証明書」モードで Private CA を設定していることから、証明書のアラートを 3 日前に設定していますが、実運用の際は慎重に設定した方がよいと思います。

スクリーンショット 2026-09-06 19.06.36.png

オンプレミスからアクセスさせたい S3 バケットを作成

任意の名前で S3 バケットを作成します。ここでは test02-dev-s3-rolesanywhere-<アカウント ID> といった名前でバケットを作成しました。

作成したバケットの ARN は後で IAM ロールを作成する際に使用するのでメモしておきます。

オンプレミスのクライアントに払い出す IAM ロールの作成

オンプレミスのクライアントに払い出したい IAM ロールを作成します。ここでは test02-dev-role-rolesanywhere-client という名前で IAM ロールを作成しました。

信頼されたエンティティを、先ほど作成した信頼アンカーと、証明書の CN が CSR を作成する際に指定した onpremises-client-01 に限定するよう設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "rolesanywhere.amazonaws.com" },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession",
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "<信頼アンカーの ARN>"
        },
        "StringEquals": {
          "aws:PrincipalTag/x509Subject/CN": "onpremises-client-01"
        }
      }
    }
  ]
}

また、インラインポリシーを、先ほど作成した S3 バケットに限定して一部の操作を許可するよう、以下のとおり設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetBucketLocation"],
      "Resource": "<S3 バケットの ARN>"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": "<S3 バケットの ARN>/*"
    }
  ]
}

IAM Roles Anywhere のプロファイルを作成

IAM Roles Anywhere のプロファイルを作成し、先ほど作成した IAM ロールを指定します。

スクリーンショット 2026-09-06 20.07.58.png

ここまでで IAM Roles Anywhere に関する AWS 側の設定は完了です。

最後にクライアントから動作確認してみます。

オンプレミスのクライアントから aws_signing_helper を実行してクレデンシャルを取得

オンプレミスのクライアントのホームディレクトリ直下に aws_signing_helper のバイナリーを置き、実行権限を付与します。

$ chmod +x ~/aws_signing_helper

また、Private CA で署名した証明書 client-cert.pem ファイルをホームディレクトリ配下の ~/.aws/rolesanywhere/client-cert.pem に配置します。

最後にオンプレミスのクライアントの ~/.aws/config に以下のように記載します。(フルパスで指定しているので /home/ubuntu/ となっていますが、環境に合わせて読み替えてください。)

[profile rolesanywhere]
region = ap-northeast-1
credential_process = /home/ubuntu/aws_signing_helper credential-process --certificate /home/ubuntu/.aws/rolesanywhere/client-cert.pem --private-key /home/ubuntu/.aws/rolesanywhere/client-key.pem --trust-anchor-arn <信頼アンカーの ARN> --profile-arn <プロファイルの ARN> --role-arn <IAM ロールの ARN>

ここまで準備できたら、aws_signing_helper を実行して実際にクレデンシャルを取得してみます。

$ ~/aws_signing_helper credential-process \
--certificate ~/.aws/rolesanywhere/client-cert.pem \
--private-key ~/.aws/rolesanywhere/client-key.pem \
--trust-anchor-arn <信頼アンカーの ARN> \
--profile-arn <プロファイルの ARN> \
--role-arn <IAM ロールの ARN>

セッショントークンを含む JSON が返ってくれば成功です。

それでは AWS CLI から S3 バケットに読み書きできるか試してみます。

$ aws s3 ls s3://test02-dev-s3-rolesanywhere-<アカウント ID>/ --profile rolesanywhere
$ echo "hello" > hello.txt
$ aws s3 cp hello.txt s3://test02-dev-s3-rolesanywhere-<アカウント ID>/hello.txt --profile rolesanywhere
upload: ./hello.txt to s3://test02-dev-s3-rolesanywhere-<アカウント ID>/hello.txt
$ aws s3 ls s3://test02-dev-s3-rolesanywhere-<アカウント ID>/ --profile rolesanywhere
2026-09-06 20:57:53          6 hello.txt

IAM ロールで設定した S3 バケットにファイルをアップロードできることが確認できました。

実際の出力は次のとおりです。(途中確認のために STS のエンドポイントを作成してテストしていますがこれは不要です。)

スクリーンショット 2026-09-06 20.58.40.png

まとめ

IAM Roles Anywhere を使うと、オンプレミスのクライアントから安全に AWS のクレデンシャルを取得することができます。

また、IAM Roles Anywhere のインターフェース型 VPC エンドポイントを作成すれば、閉域ネットワークで接続されているオンプレミス環境からでも同じようにクレデンシャルを取得できます。

ガバメントクラウドにおける地方自治体の基幹業務システムのように、閉域ネットワーク接続が求められる環境で、オンプレミスから安全に AWS 環境のリソースを使用するのにも、IAM Roles Anywhere は扱いやすいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?