- 1 1. ハイブリッドワークロードIDの課題とAWS IAM Roles Anywhereの全体像
- 2 2. 基礎概念 — Trust Anchor × Profile × credential helper
- 3 3. セットアップ — Private CA / 既存PKI連携 × Trust Anchor × ロール信頼ポリシー
- 4 4. 認証フロー&認可 — credential helper署名 × aws:PrincipalTag
- 5 5. ユースケース別実装 — オンプレ × CI/CD × マルチクラウド × IoT
- 6 6. セキュリティ・運用・コスト
- 7 7. 実戦統合パターン — CloudHSM × Private CA × Roles Anywhereの連環
- 8 8. 詰まりポイントとアンチパターン・まとめ
1. ハイブリッドワークロードIDの課題とAWS IAM Roles Anywhereの全体像

AWS外のワークロード(オンプレミスサーバー・他クラウドのVM・CI/CDランナー)からAWSリソースへアクセスする際、長期のIAMアクセスキーを配布する運用は重大なセキュリティリスクになります。鍵の漏洩・ローテーション漏れ・棚卸し困難といった問題を、X.509証明書ベースの一時認証情報で解消するのがAWS IAM Roles Anywhereです。
本セクションでは、ハイブリッドワークロードIDの本番課題を整理したうえで、IAM Roles Anywhereの全体像・既存IAM/Identity Centerとの違い・本記事全体の構成を説明します。
- 基礎概念 — Trust Anchor/Profile/X.509証明書/credential helper/一時認証情報の仕組み(§2)
- セットアップ — Private CA or 既存PKI連携/Trust Anchor作成/Profile/ロール信頼ポリシー(§3)
- 認証フロー&認可 — credential helper署名フロー/aws:PrincipalTag属性ベース認可(§4)
- ユースケース別実装 — オンプレ/CI-CD/マルチクラウド/IoT・エッジ(§5)
- セキュリティ・運用・コストと実戦統合パターン(§6・§7)
- IAM Identity Center — 人間(ワークフォース)のSSO・社内IdP連携(AWS内のアクセス管理)
- EKSのノード認証 — Kubernetes固有のハイブリッドノード参加(既存EKS記事で解説)
- IAM Roles Anywhere — AWS外の汎用ワークロード(マシン)へX.509ベースで一時認証情報を発行
- 本記事は汎用ワークロードIDに集中。人間のSSO・EKSノード認証は既存記事を参照
1-1. 長期アクセスキーの危険とハイブリッドIDの課題
AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY のペアは、有効期限のない静的なシークレットです。オンプレミスサーバーやCI/CDランナーに配布する際、次のリスクが本番環境で顕在化します。
漏洩リスク
環境変数・設定ファイル・.env ファイルといった形でサーバーに保存されたアクセスキーは、OSの脆弱性・設定ミス・内部不正によって漏洩する危険があります。コードリポジトリへの誤コミットも後を絶たず、公開リポジトリにシークレットが混入した場合、数秒以内に自動ボットへ収集されるケースが報告されています。静的なアクセスキーには有効期限がないため、漏洩後も無効化するまで悪用され続けます。
アクセスキーが漏洩した場合の被害は甚大です。攻撃者は公開されたキーで自由にAWS APIを呼び出し、S3バケットからの機密データ抜き取り・EC2インスタンスの大量起動によるコスト攻撃・IAMユーザーの作成による持続的アクセス確保といった攻撃が可能です。セキュリティスキャンツール(GitGuardian・truffleHog等)でリポジトリをチェックしても、すでに外部に漏洩した鍵を回収できません。
ローテーション困難
配布先のサーバー数が増えるほど、一斉ローテーションは複雑になります。新旧キーの切り替えをどこかのサーバーへ反映し忘れると、APIコールが失敗して本番サービスへの影響が発生します。複数のサービスやCI/CDパイプラインへの反映状況を追跡するだけで、相当な運用コストがかかります。
IAMのベストプラクティスでは定期的なローテーションが推奨されていますが、配布先が数十箇所を超えると、各環境での切り替えテストと本番反映を無停止で行うことが困難になります。ローテーション作業の煩雑さから後回しにされることも多く、「創業以来一度もローテーションしていないキーが環境変数に設定されている」というケースは珍しくありません。
監査の困難さ
長期アクセスキーは「誰がどのサーバーで使っているか」を把握しにくい構造です。CloudTrailでAPIコールは記録されますが、同一のキーIDが複数のサーバーで使われている場合、どのサーバーが発信したリクエストかをキーIDだけでは特定できません。退役済みのサーバーに紐付いたキーが有効なまま残り続けるケースも発生しやすく、棚卸しコストが常に発生します。
IAM認証情報レポートを使えば未使用キーを特定できます。しかし、そのキーの利用者・利用システム・用途を追跡する仕組みのない組織では、不用意な無効化は想定外のシステム停止を招きかねません。こうした「使っていると思うが確証がない」状態は、長期アクセスキー特有の問題です。
インシデント対応の遅れ
漏洩や不正利用が疑われた場合、当該キーを無効化することで影響を遮断できます。しかしキーが複数箇所で使われていれば、無効化がサービス断を引き起こす可能性があり、影響範囲の確認と代替手段の準備に時間がかかります。有効期限のない静的キーでは、インシデント対応における俊敏性が著しく低下します。
「最小権限の原則」によって被害を限定化することが推奨されますが、実際には汎用的に使えるよう過剰な権限が付与された1つのキーを複数の用途で使いまわしているケースが多く見られます。こうした設計では漏洩時の影響範囲が最大化されます。
IAM Roles Anywhereによる解決アプローチ
IAM Roles Anywhereは、X.509証明書をワークロードのIDとして使い、STSから一時IAM認証情報を取得する仕組みです。解決の要点は次のとおりです。
- ワークロードが保持するのは「X.509証明書と対応する秘密鍵」であり、長期アクセスキーは不要になります
- credential helper(aws_signing_helper)が証明書・秘密鍵で署名したリクエストをSTSへ送信し、デフォルト最大1時間の一時認証情報(アクセスキーID・シークレット・セッショントークン)を取得します
- 一時認証情報は有効期限が短いため、漏洩しても攻撃者の悪用できる時間は極めて短くなります
- CRL(証明書失効リスト)に証明書を登録することで、侵害されたワークロードを即座かつ確実に遮断できます
- 証明書の有効期限を短く設定し、定期的に自動更新する設計とすることで、長期運用時の管理リスクを低減できます
この仕組みにより、AWS外に存在するワークロードが長期アクセスキーなしで安全にAWSリソースへアクセスできるようになります。ゼロスタンディングクレデンシャル(常時有効なシークレットを持たない設計)という観点でも、IAM Roles Anywhereは有効な実装手段の一つです。
ゼロスタンディングクレデンシャルへの移行
「ゼロスタンディングクレデンシャル」とは、常時有効な認証情報をシステムに保持しない設計思想です。IAM Roles Anywhereは、この設計を実現するための核心となる技術の一つです。
移行にあたっての推奨ステップは次のとおりです。
- 現状棚卸し: IAM認証情報レポートで既存の長期アクセスキーを全件特定し、各キーの用途・配布先を記録します
- Trust Anchor・Profile設計: 用途別にProfileを設計し、最小権限のIAMロールと紐付けます
- パイロット移行: 1つのサービスからIAM Roles Anywhereへ切り替え、動作確認と運用手順を確立します
- 全体展開: パイロットで確立した手順を他のサービス・ランナーへ横展開します
- 旧キー廃止: 移行完了後、長期アクセスキーを順次無効化・削除します
この移行プロセスは、既存システムへの影響を最小限に抑えながら段階的に進めることができます。
1-2. 読者像
本記事は次の読者を想定しています。
- オンプレミスサーバー運用担当: バッチ処理・監視ツール・バックアップスクリプトがS3・DynamoDB・SQS等へアクセスしており、アクセスキーの配布・ローテーション管理に課題を感じているエンジニア
- DevSecOpsエンジニア: GitHub Actions・GitLab CI・Jenkins等のCI/CDランナーにIAM権限を付与する際、シークレット管理とゼロトラスト設計を両立させたい担当者
- マルチクラウドアーキテクト: Azure・GCP上のVMやコンテナからAWSリソースへクロスクラウドアクセスする認証設計に取り組むエンジニア
- セキュリティ推進チーム: 組織全体での長期アクセスキー廃止を推進し、ゼロスタンディングクレデンシャルを実現したい担当者
- IoTプラットフォームエンジニア: エッジデバイスや産業用ゲートウェイにAWSアクセス権限を最小権限で付与したいエンジニア
前提として、IAMロール・ポリシー・STSの基礎知識があると理解がスムーズです。X.509証明書・CA・PKIについては本文内で必要な概念を補足しますが、「CAとはどんな役割か」「証明書と秘密鍵のペアとは何か」という基礎知識があると読み進めやすくなります。
本記事(Vol1)では、IAM Roles Anywhereの基礎概念から実際のセットアップ・本番運用・コスト設計までを体系的に解説します。
本記事の想定読者が直面している典型的な課題を示します。
- オンプレサーバーのバッチスクリプトが数年前に設定した長期アクセスキーを使い続けており、ローテーションのタイミングを見失っている
- CI/CDパイプラインのシークレット管理が複雑化し、新しいパイプラインの追加のたびにキーの発行・登録作業が増加している
- セキュリティ監査でIAM長期アクセスキーの棚卸しを求められたが、配布先の全リストを作成するのに多大な時間がかかった
IAM Roles Anywhereは、これらの課題を証明書ベースのキーレスアーキテクチャで根本から解決します。
本記事を通じて、IAM Roles Anywhereの導入判断・設計・実装・運用に必要な知識を体系的に習得できます。
長期アクセスキーからの脱却は、一朝一夕に完了するものではありません。しかし、IAM Roles Anywhereを使えば既存システムへの影響を最小限に抑えながら段階的に移行できます。
1-3. IAM Roles AnywhereとIAM/Identity Centerの使い分け
IAM Roles Anywhereは、AWSの他のID/認証サービスと混同されることがあります。次の比較を参考に、ユースケースに応じたサービスを選んでください。
| サービス | 主な対象 | 認証方式 | 代表ユースケース |
|---|---|---|---|
| IAM Identity Center | 人間(ワークフォース) | SAML 2.0 / OIDC | 開発者・管理者のAWSコンソール・CLI統合アクセス |
| IRSA / Pod Identity | EKS上のKubernetes Pod | Kubernetes OIDC | EKS PodのAWSリソースアクセス(最小権限) |
| EC2インスタンスプロファイル | AWS内のEC2・コンテナ | IMDSv2 | EC2・Lambda・ECSタスクのAWSリソースアクセス |
| IAM Roles Anywhere | AWS外の汎用ワークロード | X.509証明書(PKI) | オンプレサーバー・CI-CDランナー・他クラウドVM・IoT |
判断の基準は次のとおりです。
- 対象が人間(エンジニア・管理者)かどうか: 開発者や管理者のコンソール・CLIアクセスには IAM Identity Center を使います。既存の社内IdP(Active Directory等)と連携したSSOを実現し、人間の認証フローに特化した設計です
- ワークロードがAWS内(EC2・Lambda・ECSタスク等)かどうか: AWSインフラ上のワークロードにはEC2インスタンスプロファイル・ECSタスクロール等を使います。IMDSv2経由で一時認証情報を自動取得できます
- ワークロードがEKS上のPodかどうか: Kubernetes Podには IRSAまたはPod Identity を使います。ServiceAccountへのIAMロール紐付けがKubernetes固有の操作と親和性が高い方式です
- AWS外の汎用ワークロードかどうか: オンプレサーバー・CI-CDランナー・他クラウドのVM・IoTデバイスのようにAWS外に存在するワークロードには、IAM Roles Anywhere が最適な選択です
本記事はIAM Roles Anywhereに絞った解説です。人間のSSOはIAM Identity Centerの記事を、EKS PodのIAM連携はIRSA/Pod Identityの記事をそれぞれ参照してください。
2. 基礎概念 — Trust Anchor × Profile × credential helper

IAM Roles Anywhereは、Trust Anchor・Profile・credential helperの3要素が連携して機能します。Trust AnchorでCA証明書の信頼関係を確立し、Profileで引き受け可能なロールと権限を定義し、credential helperがワークロード側で証明書と秘密鍵を使って署名リクエストを送り一時認証情報を取得します。本セクションでは、この3要素の役割とX.509証明書の属性がIAM認可に接続される仕組みを詳しく解説します。
2-1. Trust Anchor(信頼の起点)
Trust Anchorとは、IAM Roles AnywhereがX.509証明書を検証する際に「このCAを信頼する」と宣言するAWSリソースです。ワークロードが提示する証明書は、Trust Anchorに登録されたCA(またはその下位CA)が発行したものでなければ認証が失敗します。
Trust Anchorに登録できるCAの種類
Trust Anchorには、以下2種類のCA参照方式があります。
- AWS Private CA参照: AWS Certificate Manager Private CA(ACM PCA)で作成したCAを指定します。Private CAのARNをTrust Anchorに紐付けることで、AWSが自動的に最新のCA証明書を取得・更新します。
- 外部CA証明書アップロード: エンタープライズPKI(Microsoft AD CS、HashiCorp Vault、OpenSSL自己署名CAなど)のルートまたは中間CA証明書をPEM形式でアップロードします。更新時は手動での再インポートが必要です。
どちらの方式でも、Trust AnchorはそのCAが発行した証明書に対して信頼を付与します。組織のPKI方針・コスト・運用負荷を比較して選択します。
CAチェーンの検証
ワークロードが提示する証明書は、Trust Anchorに登録されたCA証明書まで連鎖して検証されます。中間CAを経由する証明書チェーンの場合、credential helperのリクエスト時に中間CA証明書も含めて送付する必要があります(--certificate-bundle-fileオプションで指定)。チェーンが欠けていると認証エラーになります。Trust Anchorには1つのCAのみ登録できるため、ルートCAを登録する場合は中間CA証明書をバンドルファイルに含める設計が必要です。
複数Trust Anchorの設計指針
Trust Anchorは1つのAWSアカウント内に複数作成できます。以下のシナリオで複数のTrust Anchorが有効です。
- 環境分離: 本番/ステージング/開発ごとに別のCAを割り当て、環境間の証明書の誤用を防ぐ
- 組織分割: 事業部ごとに独自のCAを管理し、PKI管理権限を分散させる
- PKI移行期: 旧CAと新CAを並行運用し、証明書の段階的な移行を実現する
# Trust Anchor作成(AWS Private CA参照)
aws rolesanywhere create-trust-anchor \
--name "prod-pca-trust-anchor" \
--source "sourceType=AWS_ACM_PCA,sourceData={acmPcaArn=arn:aws:acm-pca:ap-northeast-1:123456789012:certificate-authority/example-id}" \
--enabled
# Trust Anchor作成(外部CA証明書インポート)
CERT_B64=$(base64 -w 0 root-ca-cert.pem)
aws rolesanywhere create-trust-anchor \
--name "corp-pki-trust-anchor" \
--source "sourceType=CERTIFICATE_BUNDLE,sourceData={x509CertificateData=${CERT_B64}}" \
--enabled
Trust Anchorの無効化による緊急遮断
Trust Anchorは後から有効化/無効化を即時に切り替えられます。侵害の疑われるCAが発行した証明書を一括遮断したいケースや、不正アクセス発生時の緊急停止手段として、Trust Anchor単位での無効化が有効です。無効化すると、そのTrust Anchorを参照するProfileを通じた認証が即座に停止されます。長期アクセスキーの場合は鍵を1本ずつ削除する作業が必要なのに対し、Trust Anchor無効化は組織横断で一括対応できる点が大きな利点です。
Trust Anchorのリージョナル性
Trust AnchorはリージョナルなAWSリソースです。作成したリージョンのIAM Roles Anywhere APIエンドポイントに対してのみ有効であり、credential helperのリクエスト先リージョンと一致させる必要があります。グローバルに展開するワークロードでは、各リージョンに別々のTrust Anchorを作成するか、全アクセスを特定リージョンへ集約する設計を検討します。
2-2. Profile(引受ロールとセッションポリシー)
ProfileはTrust Anchorとペアで機能するリソースです。「どのIAMロールを引き受け可能か」と「どのセッションポリシーを適用するか」を定義します。ワークロードはcredential helperで特定のProfileを指定することで、そのProfileが許可するロールの一時認証情報を取得します。
Profileの主要な設定項目
| 設定項目 | 説明 |
|---|---|
roleArns | 引き受け可能なIAMロールのARNリスト(最大50個) |
sessionPolicy | 引き受け時に追加で適用するインラインセッションポリシー(JSON形式、任意) |
durationSeconds | 一時認証情報の有効期間(デフォルト3600秒/最大43200秒) |
managedPolicyArns | 追加で適用するAWS管理ポリシーのARNリスト(任意) |
セッションポリシーによる権限の絞り込み
Profileのセッションポリシーは、ロールのアタッチポリシーとの積集合(AND条件)で実際の権限が決まります。たとえば、ロール自体にはS3フルアクセスが付与されていても、セッションポリシーで特定バケットへの読み取りのみに絞れます。この仕組みにより、同一のIAMロールを複数のProfileで共有しつつ、Profile単位で最小権限を実装できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::my-prod-bucket",
"arn:aws:s3:::my-prod-bucket/*"
]
}
]
}
durationSecondsの設計指針
一時認証情報の有効期間は、Profile設定のdurationSecondsとロールのMaxSessionDuration(デフォルト3600秒/最大43200秒)の小さい方が実際の上限になります。短命にするほど侵害時の影響が限定されますが、credential helperの再実行頻度が増えます。CI/CDランナーのような短命ジョブには1時間以下、長時間稼働するオンプレサーバーには数時間程度が目安です。
# Profile作成例(1時間の有効期間)
aws rolesanywhere create-profile \
--name "ci-cd-deploy-profile" \
--role-arns "arn:aws:iam::123456789012:role/CiCdDeployRole" \
--duration-seconds 3600 \
--enabled
ProfileとロールのIAM信頼ポリシー連携
ProfileにロールARNを登録するだけでなく、IAMロール側の信頼ポリシーにもrolesanywhere.amazonaws.comサービスプリンシパルを記述する必要があります。両方が設定されて初めて引き受けが成立します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rolesanywhere.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession",
"sts:SetSourceIdentity"
],
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID"
}
}
}
]
}
sts:TagSessionとsts:SetSourceIdentityはX.509証明書の属性をセッションタグへ変換するために必須です。この2つが欠けると認証が失敗します。aws:SourceArnにTrust AnchorのARNを限定することで、同一AWSアカウント内の別のTrust Anchor経由でのロール引き受けを防止できます。
2-3. credential helper(aws_signing_helper)
credential helper(aws_signing_helper)は、AWS公式が提供するGo製の軽量CLIツールです。2026年1月時点の最新バージョンはv1.7.3で、GitHubのaws/rolesanywhere-credential-helperリポジトリからシングルバイナリとして配布されています。Linux・macOS・Windowsに対応しており、追加の依存ライブラリなしに動作します。
credential helperの処理フロー
credential helperはワークロード側で以下の処理を実行します。
- ローカルの証明書ファイル(PEM形式)と秘密鍵ファイルを読み込む
- Sigv4Xアルゴリズムで署名したHTTPリクエストを生成する
- IAM Roles Anywhereの
CreateSessionAPIへリクエストを送信する - Trust AnchorがX.509証明書を検証し、Subject属性からセッションタグを抽出する
- STSが一時認証情報(
AccessKeyId/SecretAccessKey/SessionToken/Expiration)を発行する - credential helperがJSON形式で標準出力へ出力する
credential_process統合
AWS SDK/CLIの~/.aws/configファイルにcredential_processとして登録するのが最も一般的な統合方法です。
[profile roles-anywhere-prod]
credential_process = /usr/local/bin/aws_signing_helper credential-process \
--certificate /etc/iam-ra/cert.pem \
--private-key /etc/iam-ra/key.pem \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID \
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/PROFILE-ID \
--role-arn arn:aws:iam::123456789012:role/RolesAnywhereProdRole \
--region ap-northeast-1
この設定により、aws --profile roles-anywhere-prod s3 lsなどのコマンドを実行すると、credential helperが自動起動して一時認証情報を取得します。認証情報の有効期限が近づくとSDKがExpirationフィールドを読んで自動リフレッシュします。
X.509証明書のSubject属性とaws:PrincipalTag
credential helperがリクエストを送ると、IAM Roles Anywhereは証明書のSubjectフィールドを解析し、以下の属性をaws:PrincipalTagとしてセッションに付与します。
| 証明書フィールド | PrincipalTagキー | 例 |
|---|---|---|
| Subject CN | x509Subject/CN | prod-server-01 |
| Subject O | x509Subject/O | MyCompany |
| Subject OU | x509Subject/OU | WebTeam |
| Subject SerialNumber | x509Subject/SerialNumber | SN12345 |
| Issuer CN | x509Issuer/CN | My-Root-CA |
| SAN DNS | x509SAN/DNS | server01.example.com |
これらのタグをIAMポリシーの条件として使用することで、証明書属性に基づく属性ベースアクセス制御(ABAC)が実現できます。たとえば、x509Subject/OUがproductionの証明書を持つサーバーだけを本番バケットへアクセス可能にする、といった制御が可能です。
一時認証情報のライフタイム
一時認証情報の有効期間はProfileのdurationSecondsで制御します。デフォルトは3600秒(1時間)で、最大は43200秒(12時間)です。ロールのMaxSessionDuration(デフォルト3600秒)との小さい方が実際の上限となるため、12時間の認証情報が必要な場合はロール側のMaxSessionDurationも変更が必要です。
# MaxSessionDurationを12時間に変更(ロール側の設定)
aws iam update-role \
--role-name RolesAnywhereProdRole \
--max-session-duration 43200
v1.7.3の主な改善点(2026-01リリース)
v1.7.3では、中間CA対応のための証明書チェーンバンドルファイル(--certificate-bundle-file)の処理が強化され、WindowsでのPKCS#11プロバイダー統合が安定化されました。updateサブコマンドによる認証情報ファイルの動的更新がファイル出力形式に対応し、systemdサービスユニットから定期的に認証情報ファイルを更新するユースケースに活用できます。macOSのKeychainやYubiKeyなどのHSMを用いたハードウェアベースの秘密鍵保護にも対応しており、エンタープライズ環境でのセキュリティ強化に寄与します。
3. セットアップ — Private CA / 既存PKI連携 × Trust Anchor × ロール信頼ポリシー

IAM Roles Anywhereのセットアップは、CAの準備とロール信頼ポリシーの設計が要点です。本セクションでは、Private CA連携・既存PKI連携・Trust Anchor作成・ロール信頼ポリシーの構築を解説します。
3-1. AWS Private CA連携と既存PKI連携
IAM Roles Anywhereは、X.509証明書を発行するCAをTrust Anchorとして登録することで、そのCAが署名した証明書を持つワークロードへ一時認証情報を発行します。CAの準備方法は大きく2つあります。
AWS Private CA(ACM Private CA)の利用
AWS Private CA(旧称 ACM PCA、現在はAWS Private Certificate Authority)は、フルマネージドなプライベートCAサービスです。Root CA→Subordinate CAの階層を持つPKIをAWS上に構築でき、証明書の発行・失効・CRL配布をマネージドで管理できます。
Private CAの作成手順:
- AWSコンソール → AWS Private CA → 「プライベートCAを作成」
- CA種別: Root CAまたはSubordinate CA(本番では2層階層推奨)
- キーアルゴリズム: RSA 2048またはECDSA P-256(ECDSA P-256は発行速度が速くIAM Roles Anywhereと相性が良い)
- 有効期間: ルートCA 10年/中間CA 5年が一般的な設計
- CRL配布: S3バケット + CloudFrontでCRL URLを設定(失効チェックに必須)
# Private CA ARNの確認(作成後)
aws acm-pca list-certificate-authorities \
--query 'CertificateAuthorities[?Status==`ACTIVE`].{ARN:Arn,CN:CertificateAuthorityConfiguration.Subject.CommonName}'
Private CAを使うメリット:
- Trust Anchor作成時にCA証明書ファイルのインポートが不要(ARN直接指定)
- AWSコンソールからのCA管理・証明書発行が可能
- CRL配布がマネージドで提供(ただしIAM Roles AnywhereはOCSP未対応のためCRLのみ有効)
- CloudTrailでのCA操作ログが自動記録
Private CAの料金は、ルートCAまたはSubordinate CA 1基あたり月額約400ドル(2026年6月時点)です。証明書発行費用は追加で発生します。コストを抑えたい場合は、後述の既存PKI連携を検討してください。
既存PKI・自己署名CAの利用
社内にすでにActive Directory証明書サービス(AD CS)・HashiCorp Vault PKI・OpenSSLで構築したCAがある場合は、そのCA証明書(PEM形式)をTrust Anchorに直接インポートして利用できます。Private CAの月額費用が不要なため、既存PKIを持つ組織にとってコスト効率が高い選択肢です。
インポートに必要なもの:
– CA公開証明書(PEM形式 .pem または .crt)
– 証明書チェーン全体(中間CA証明書を含む場合)
自己署名CAでの証明書作成例(開発・テスト環境向け):
# ルートCA鍵と証明書を作成
openssl genrsa -out root-ca-key.pem 2048
openssl req -x509 -new -nodes \
-key root-ca-key.pem \
-sha256 -days 3650 \
-subj "/C=JP/O=MyOrg/CN=MyOrg Root CA" \
-out root-ca-cert.pem
# ワークロード用クライアント証明書の作成
openssl genrsa -out workload-key.pem 2048
openssl req -new \
-key workload-key.pem \
-subj "/C=JP/O=MyOrg/OU=production/CN=app-server-01" \
-out workload.csr
openssl x509 -req -days 365 \
-CA root-ca-cert.pem \
-CAkey root-ca-key.pem \
-CAcreateserial \
-in workload.csr \
-out workload-cert.pem
既存PKI利用時の注意点:
– Trust AnchorにインポートできるのはCA公開証明書のみ(秘密鍵は不要・アップロード不可)
– CRL配布URLは別途Trust AnchorのCRL設定に登録が必要
– 証明書チェーン全体をインポートしないと検証に失敗するケースがある
3-2. Trust Anchor / Profile の作成
CA準備後、Trust AnchorとProfileを作成します。
Trust Anchorの作成
Trust Anchorは、IAM Roles AnywhereがX.509証明書を検証する際に参照する信頼の起点です。1つのTrust Anchorに1つのCAを関連付けます。
AWSコンソールでの作成:
1. IAMコンソール → 「Roles Anywhere」 → 「Trust Anchors」 → 「Create」
2. 名前: 組織・環境を示す名前(例: prod-internal-ca-trust-anchor)
3. CA種別を選択:
– 「AWS Private Certificate Authority」: ARNをプルダウンで選択
– 「External certificate bundle」: CA証明書PEMファイルをアップロード
AWS CLIでの作成(Private CA ARN指定):
aws rolesanywhere create-trust-anchor \
--name "prod-pca-trust-anchor" \
--source \
"sourceType=AWS_ACM_PCA,sourceData={acmPcaArn=arn:aws:acm-pca:ap-northeast-1:123456789012:certificate-authority/example-id}" \
--enabled
AWS CLIでの作成(外部CA証明書インポート):
CERT_B64=$(base64 -w 0 root-ca-cert.pem)
aws rolesanywhere create-trust-anchor \
--name "prod-external-ca-trust-anchor" \
--source \
"sourceType=CERTIFICATE_BUNDLE,sourceData={x509CertificateData=${CERT_B64}}" \
--enabled
Trust Anchorは作成後、有効化(enabled)・無効化(disabled)を即時に切り替え可能です。インシデント発生時にTrust Anchorを無効化すると、そのCAが発行したすべての証明書からの認証を即座に遮断できます。長期アクセスキーの場合はキーを1つずつ削除する作業が必要ですが、Trust Anchor無効化は組織横断で一括対応できる点が大きな利点です。
Profileの作成
Profileは、Trust Anchorと紐付けられた「引受可能なロール + セッションポリシー + セッション時間」のセットです。
AWSコンソールでの作成:
1. 「Roles Anywhere」 → 「Profiles」 → 「Create」
2. 名前: ワークロード・用途を示す名前(例: ci-cd-deploy-profile)
3. Session duration: 最大3600秒(1時間)。短命認証情報の設計では最小限の時間を設定推奨
4. Roles: このProfileで引き受けられるIAMロール(複数選択可)
5. Session policy(任意): Managed PolicyまたはInline Policyで追加制限
AWS CLIでの作成:
aws rolesanywhere create-profile \
--name "ci-cd-deploy-profile" \
--role-arns "arn:aws:iam::123456789012:role/CiCdDeployRole" \
--duration-seconds 3600 \
--session-policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:GetObject","ecr:*"],"Resource":"*"}]}'
Profileの設計ポイント:
– 1つのProfileに複数のRoleを紐付けられますが、実際に引き受けるロールはcredential helperの--role-arn引数で1つを指定します
– セッションポリシーはProfileに設定したものとロールのポリシーのIntersection(積集合)として適用されます
– durationSecondsはロールのMaxSessionDurationを超えることができません(ロール側の設定確認が必要)
3-3. ロール信頼ポリシー設計
IAM Roles AnywhereからロールをAssumeするには、対象IAMロールの信頼ポリシーにrolesanywhere.amazonaws.comサービスプリンシパルを許可する設定が必要です。
最小構成の信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rolesanywhere.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession",
"sts:SetSourceIdentity"
],
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID"
}
}
}
]
}
aws:SourceArn条件にTrust AnchorのARNを指定することで、特定のTrust Anchor経由でのみロールを引き受けられるよう制限できます。この設定がないと、同一AWSアカウント内の別のTrust Anchorから誤ってロールを引き受けるリスクが生じます。
証明書属性による条件付与(ABAC)
IAM Roles Anywhereは、X.509証明書のSubjectフィールドをPrincipalTagとして抽出してセッションに付与します。信頼ポリシーおよびリソースポリシーでこれらのタグを参照することで、証明書属性に基づく属性ベースアクセス制御(ABAC)が実現できます。
利用可能なPrincipalTag(証明書から自動抽出):
– x509Subject/CN:証明書のCommon Name
– x509Subject/OU:Organization Unit
– x509Subject/O:Organization
– x509Issuer/CN:発行元CAのCommon Name
– x509SAN/DNS:Subject Alternative Name(DNS)
– x509SAN/URI:Subject Alternative Name(URI)
条件付き信頼ポリシー例(OU=productionの証明書のみ許可):
{
"Condition": {
"StringEquals": {
"aws:PrincipalTag/x509Subject/OU": "production"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID"
}
}
}
この設定により、OU=productionで発行された証明書を持つワークロードのみがロールを引き受けられます。開発環境(OU=development)の証明書では同じロールを引き受けられないため、環境間の権限分離が証明書属性レベルで実現できます。
credential helperのインストールと動作確認
aws_signing_helper(バージョン1.7.3)はGo製の軽量バイナリです。GitHubリポジトリ(aws/rolesanywhere-credential-helper)の各リリースページからダウンロードし、ワークロードホストに配置します。
Linux x86_64へのインストール例:
# aws_signing_helper v1.7.3 のインストール
curl -LO https://rolesanywhere.amazonaws.com/releases/1.7.3/X86_64/Linux/aws_signing_helper
chmod +x aws_signing_helper
sudo mv aws_signing_helper /usr/local/bin/
# インストール確認
aws_signing_helper --version
一時認証情報の取得テスト:
aws_signing_helper credential-process \
--certificate /path/to/workload-cert.pem \
--private-key /path/to/workload-key.pem \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID \
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/PROFILE-ID \
--role-arn arn:aws:iam::123456789012:role/CiCdDeployRole
正常に動作すると、AccessKeyId・SecretAccessKey・SessionToken・Expirationを含むJSONが出力されます。この出力をAWS SDKのcredential_processとして利用するため、~/.aws/configに以下を設定します:
[profile roles-anywhere-workload]
credential_process = aws_signing_helper credential-process \
--certificate /etc/pki/workload-cert.pem \
--private-key /etc/pki/workload-key.pem \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID \
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/PROFILE-ID \
--role-arn arn:aws:iam::123456789012:role/CiCdDeployRole
region = ap-northeast-1
この設定後、aws s3 ls --profile roles-anywhere-workloadのようにプロファイルを指定すると、aws_signing_helperが自動的に一時認証情報を取得して使用します。SDK・CLI問わずcredential_processに対応したすべてのAWSツールで利用可能です。systemdユニットのEnvironmentFileや、コンテナの環境変数としてAWS_PROFILEを設定することで、アプリケーションコードの変更なしにキーレスアクセスへの移行が完了します。
4. 認証フロー&認可 — credential helper署名 × aws:PrincipalTag

IAM Roles Anywhereの認証は、credential helperによる署名とX.509証明書フィールドの属性化が中核です。本セクションでは、署名フローと属性ベース認可を解説します。
4-1. credential helperの署名フローとCreateSession
aws_signing_helper がCreateSession APIを呼び出す際の署名メカニズムは、標準的なAWS Signature Version 4(SigV4)を非対称鍵で拡張したものです。通常のSigV4がHMAC-SHA256による対称署名を用いるのに対し、IAM Roles AnywhereではX.509証明書に対応する秘密鍵(RSAまたはEC)による非対称署名を使います。
署名アルゴリズムの詳細
処理は4ステップで構成されます。
- Canonical Request生成: HTTPメソッド・URI・クエリパラメータ・ヘッダー・ボディのSHA256ハッシュを正規化して署名対象文字列を生成します。
- String to Sign組み立て:
AWS4-X509-RSA-SHA256(RSAキーの場合)またはAWS4-X509-ECDSA-SHA256(ECキーの場合)のアルゴリズム識別子を先頭に付けた署名文字列を組み立てます。 - 秘密鍵署名: RSAの場合はPKCS#1 v1.5、ECの場合はECDSA-SHA256で署名します。
- Authorizationヘッダー組み込み:
X-Amz-X509ヘッダーにPEM形式の証明書チェーンを含め、署名をAuthorizationヘッダーに付与してリクエストを送信します。
CreateSession APIのレスポンス
署名リクエストがIAM Roles Anywhereエンドポイント(rolesanywhere.{region}.amazonaws.com)に届くと、Trust AnchorのCAを使って証明書チェーンを検証します。検証が成功するとSTSから一時認証情報を取得してJSONで返します。
credential-process サブコマンドを使うと、AWS SDK/CLIが解釈できるフォーマットに変換されたJSONが出力されます。
{
"Version": 1,
"AccessKeyId": "ASIA...",
"SecretAccessKey": "...",
"SessionToken": "...",
"Expiration": "2026-06-11T10:00:00Z"
}
AccessKeyId は ASIA で始まる一時認証情報(STS発行)です。有効期間はProfileの durationSeconds(最大3600秒)で決まります。
証明書チェーンの要件
ワークロードの証明書が中間CAによって署名されている場合、--certificate パラメータに証明書チェーン(エンドエンティティ証明書+中間CA証明書を1ファイルにPEM連結)を指定します。IAM Roles AnywhereはTrust Anchorに登録されたCAまでの検証パスを辿るため、チェーンが不完全だと検証が失敗します。
cat server.pem intermediate-ca.pem > chain.pem
aws_signing_helper credential-process \
--certificate chain.pem \
--private-key server-key.pem \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/{id} \
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/{id} \
--role-arn arn:aws:iam::123456789012:role/MyWorkloadRole
認証情報の自動リフレッシュ
credential-process モードでは、AWS SDK/CLIが期限切れを検知すると自動的にcredential helperを再実行します。update サブコマンドを使うと、バックグラウンドで認証情報ファイルを定期更新できます。
aws_signing_helper update \
--certificate /path/to/chain.pem \
--private-key /path/to/private-key.pem \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/{id} \
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/{id} \
--role-arn arn:aws:iam::123456789012:role/MyWorkloadRole \
--refresh-factor 0.95
--refresh-factor 0.95 は有効期間の95%経過時点で更新を試みる設定です。3600秒セッションなら57分後に更新が走ります。
秘密鍵の保護
credential helperはローカルの秘密鍵ファイルに直接アクセスするため、秘密鍵のパーミッションを 600(所有者のみ読み書き可能)に制限することが重要です。証明書有効期限が切れると認証情報の更新ができなくなるため、有効期限の監視(CloudWatchカスタムメトリクス等)は必須の運用タスクです。
秘密鍵をファイルシステムに置かず、TPM(Trusted Platform Module)やAWS CloudHSMに格納することで、秘密鍵の取り出しを物理・論理的に防止できます。CloudHSMを鍵保護に使う場合は、PKCS#11経由でcredential helperから署名操作を委任する構成が可能です。
4-2. aws:PrincipalTag属性ベース認可
IAM Roles AnywhereはCreateSession時にX.509証明書のSubjectフィールドを解析し、その内容を aws:PrincipalTag としてIAMセッションに付与します。このタグをIAMポリシーの条件に使うことで、証明書の属性に基づいた細かい認可制御(ABAC: Attribute-Based Access Control)が実現できます。
証明書フィールドとaws:PrincipalTagのマッピング
証明書のSubject Distinguished Name(DN)の各フィールドは以下のルールでタグに変換されます。
| X.509 Subjectフィールド | PrincipalTagキー |
|---|---|
| Common Name (CN) | x509Subject:CN |
| Organization (O) | x509Subject:O |
| Organizational Unit (OU) | x509Subject:OU |
| Country (C) | x509Subject:C |
| State/Province (ST) | x509Subject:ST |
| Locality (L) | x509Subject:L |
Issuer DNのフィールドも同様に x509Issuer:CN・x509Issuer:O の形式でタグに変換されます。証明書のシリアル番号(SAN)は x509SAN:serialNumber として利用できます。
プロファイルのタグ設定
ProfileでPrincipalTagの受け入れと attributeMappings を設定することで、証明書フィールドのどれをセッションタグに変換するかをカスタマイズできます。
IAMポリシーでのタグ条件記述
以下は aws:PrincipalTag を使って特定のOUの証明書のみS3バケットへのアクセスを許可するポリシー例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::my-production-bucket/*",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/x509Subject:OU": "production-workloads"
}
}
}
]
}
証明書のOUが production-workloads の場合のみアクセスを許可し、それ以外の証明書(例: staging-workloads OU)は拒否されます。これにより、同じロールを複数環境で共用しながら、環境ごとに権限を分離できます。
CNをリソースパスに埋め込む例
CNとOUを組み合わせることで、さらに細かい認可制御が可能です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::data-bucket/${aws:PrincipalTag/x509Subject:CN}/*",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/x509Subject:OU": "data-pipeline",
"aws:PrincipalTag/x509Subject:O": "MyCompany"
}
}
}
]
}
この例では、証明書のCN値をS3パスに埋め込み、ワークロードごとに専用ディレクトリへのアクセスを分離しています。ポリシーを変更せずに証明書を発行するだけで新しいワークロードを追加できるため、スケーラブルな権限管理が実現できます。
ロール信頼ポリシーでの証明書属性条件
ロール信頼ポリシーでも同様の条件を設定できます。sts:TagSession のAllow漏れには注意が必要です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rolesanywhere.amazonaws.com"
},
"Action": ["sts:AssumeRole", "sts:TagSession"],
"Condition": {
"StringEquals": {
"aws:PrincipalTag/x509Subject:O": "MyCompany",
"aws:PrincipalTag/x509Subject:OU": "production-workloads"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/{id}"
}
}
}
]
}
sts:TagSession を省略すると、PrincipalTagを含むセッションの作成が拒否されます。
ABAC設計のベストプラクティス
ABACポリシーを設計する際には以下のポイントに留意してください。
- 組織名(O)の必須化: CA全体に共通するOrganization名を必須条件にすることで、他組織のCAが侵害されても権限を取れないよう防御します。
- OU階層による環境分離: 環境(prod/staging/dev)や機能(data-pipeline/api-server)をOUで表現し、ポリシー条件に組み込みます。
- CNのワークロード識別子化: CNをワークロード識別子(例:
worker-tokyo-001)として使うと、S3パスのリソース変数${aws:PrincipalTag/x509Subject:CN}でリソースを細分化できます。 - シリアル番号の活用: 証明書シリアル番号を条件に加えると特定の証明書インスタンスのみを許可するピンポイント制御ができます。ただし、証明書ローテーション時にポリシー更新が必要になる運用コストとのバランスを考慮してください。
4-3. SDK・ツール統合
credential-process モードで取得した一時認証情報は、AWS SDK/CLIの外部プロセス認証情報プロバイダーとして機能します。各言語のデフォルトcredential chainに組み込むことで、アプリケーションコードの変更なしにIAM Roles Anywhereを利用できます。
Python(boto3)の統合例
boto3はデフォルトで ~/.aws/config の credential_process を解釈するため、プロファイル指定のみで利用できます。
import boto3
session = boto3.Session(profile_name='roles-anywhere-workload')
s3 = session.client('s3', region_name='ap-northeast-1')
response = s3.list_buckets()
AWS_PROFILE=roles-anywhere-workload を環境変数に設定すれば、プロファイル指定も不要になります。boto3はセッション内でのキャッシュを自動管理し、期限切れを検知すると credential_process を自動再実行します。
Java(AWS SDK for Java v2)の統合例
import software.amazon.awssdk.auth.credentials.ProcessCredentialsProvider;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.regions.Region;
ProcessCredentialsProvider credentialsProvider = ProcessCredentialsProvider.builder()
.command("aws_signing_helper credential-process " +
"--certificate /etc/pki/workload-cert.pem " +
"--private-key /etc/pki/workload-key.pem " +
"--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/id " +
"--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/id " +
"--role-arn arn:aws:iam::123456789012:role/MyWorkloadRole")
.build();
S3Client s3 = S3Client.builder()
.region(Region.AP_NORTHEAST_1)
.credentialsProvider(credentialsProvider)
.build();
ProcessCredentialsProvider は認証情報の期限切れを検知すると自動的にコマンドを再実行します。
Go(AWS SDK for Go v2)の統合例
package main
import (
"context"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithSharedConfigProfile("roles-anywhere-workload"),
)
if err != nil {
panic(err)
}
client := s3.NewFromConfig(cfg)
_ = client
}
systemdサービスユニットの設定例
オンプレサーバーで常駐サービスとして動かす場合は、systemdサービスユニットに AWS_PROFILE 環境変数を設定します。
[Unit]
Description=My Workload Service
After=network.target
[Service]
Type=simple
User=workload
EnvironmentFile=/etc/workload/aws-env
ExecStart=/usr/local/bin/my-workload
Restart=on-failure
[Install]
WantedBy=multi-user.target
/etc/workload/aws-env に AWS_PROFILE=roles-anywhere-workload と AWS_CONFIG_FILE=/etc/workload/aws-config を記述し、証明書・秘密鍵のパーミッションを workload ユーザーが読み取れるよう 640 に設定します。
Kubernetes Podでの運用
KubernetesでcredentialHelperを利用する場合、証明書と秘密鍵をSecretとしてマウントします。etcdの暗号化(Envelope Encryption + KMS)と合わせて設定することが必須です。
apiVersion: v1
kind: Secret
metadata:
name: workload-tls
namespace: production
type: kubernetes.io/tls
data:
tls.crt: <base64エンコード済み証明書チェーン>
tls.key: <base64エンコード済み秘密鍵>
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-workload
spec:
template:
spec:
containers:
- name: app
image: my-app:latest
env:
- name: AWS_PROFILE
value: roles-anywhere-workload
- name: AWS_CONFIG_FILE
value: /etc/aws/config
volumeMounts:
- name: tls
mountPath: /etc/ssl/workload
readOnly: true
volumes:
- name: tls
secret:
secretName: workload-tls
defaultMode: 0400
EKS上のPodについては、IRSA(IAM Roles for Service Accounts)の方が証明書管理の運用コストがなく推奨されます。IAM Roles AnywhereはEKS外のワークロード(オンプレミスサーバーやCI/CDランナー等)向けに特に威力を発揮します。
5. ユースケース別実装 — オンプレ × CI/CD × マルチクラウド × IoT

IAM Roles Anywhereは多様なワークロードに適用できます。本セクションでは、代表的なユースケースごとの実装パターンを解説します。
5-1. オンプレサーバー — 定常アクセスと証明書プロビジョニング
オンプレミスの常駐サーバーは、IAM Roles Anywhereの最もシンプルなユースケースです。サーバーに配布したX.509証明書を使い、credential_processフックを通じてAWS CLIおよびSDKが一時認証情報を自動取得します。
証明書のプロビジョニング自動化
本番環境では、証明書と秘密鍵の配布を手動で行わず、以下のいずれかで自動化します。
| プロビジョニング方法 | 特徴 |
|---|---|
| AWS Systems Manager(Parameter Store) | 秘密鍵をSecureString(KMS暗号化)で格納。SSMエージェントが証明書をサーバーに取得 |
| HashiCorp Vault PKI Secrets Engine | Vaultが動的に有効期限付き証明書を発行。サーバー起動時に自動取得・更新 |
| AWS Private CA + ACM Private CA | AWS管理PKIで発行・CRL配布もマネージド対応 |
| Ansible/Puppet/Chef | 既存Config Management Toolで証明書ファイルを配布・更新 |
AWS CLIでの利用設定
~/.aws/configに以下のプロファイルを設定すると、aws s3 ls --profile roles-anywhereのようにプロファイル指定でAWS CLIを使用できます。credential_processは認証情報の要求のたびに実行され、有効期限1時間の一時認証情報を返します。
[profile roles-anywhere]
credential_process = aws_signing_helper credential-process \
--certificate /etc/ssl/certs/workload.pem \
--private-key /etc/ssl/private/workload.key \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/ANCHOR_ID \
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/PROFILE_ID \
--role-arn arn:aws:iam::123456789012:role/OnPremWorkloadRole
region = ap-northeast-1
systemdサービスから使う場合、AWS_PROFILE=roles-anywhereをEnvironmentFileに設定するだけで、アプリケーションコードの変更なしにキーレスアクセスへの移行が完了します。
Windowsサーバーでの設定
WindowsのCertificate Store(証明書ストア)に証明書を保存している場合、--cert-selectorでストア内の証明書を直接指定できます。これにより、秘密鍵ファイルをディスクに保存する必要がなくなります。
# Windows Certificate StoreのThumbprintを使用
aws_signing_helper credential-process `
--cert-selector "SerialNumber:1A2B3C4D" `
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/ANCHOR_ID `
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/PROFILE_ID `
--role-arn arn:aws:iam::123456789012:role/OnPremWorkloadRole
Active DirectoryのAuto-enrollment(自動登録)と組み合わせると、証明書の新規発行・更新をグループポリシーで管理でき、サーバーへの手動配布が不要になります。
証明書有効期限の監視
証明書の有効期限切れはサービス停止に直結します。以下のスクリプトをcronで定期実行し、期限切れを事前に検知することを推奨します。
#!/bin/bash
# 証明書有効期限チェック(残30日以下でアラート)
CERT=/etc/ssl/certs/workload.pem
EXPIRY=$(openssl x509 -enddate -noout -in "$CERT" | cut -d= -f2)
EXPIRY_TS=$(date -d "$EXPIRY" +%s)
NOW_TS=$(date +%s)
DAYS=$(( (EXPIRY_TS - NOW_TS) / 86400 ))
if [ "$DAYS" -lt 30 ]; then
echo "WARNING: Certificate expires in ${DAYS} days: $CERT"
fi
5-2. CI/CDランナー — 長期キー廃止と証明書プロビジョニング
CI/CDパイプラインにおける長期IAMアクセスキーの配布は、鍵の漏洩・ローテーション管理・棚卸し困難という3つのリスクを抱えています。IAM Roles Anywhereを使うと、セルフホストランナーに紐付けた証明書でジョブごとに一時認証情報を取得でき、長期キーをリポジトリやCI/CDシークレットストアに保存する必要がなくなります。
証明書のランナーへのプロビジョニング
ランナーへの証明書配布は、AWS Systems Managerを使って自動化するのが実践的です。
# Parameter Storeに証明書・秘密鍵を格納
aws ssm put-parameter \
--name "/ci-cd/runner/cert" \
--value "$(cat /tmp/runner.pem)" \
--type SecureString
aws ssm put-parameter \
--name "/ci-cd/runner/key" \
--value "$(cat /tmp/runner.key)" \
--type SecureString
# ランナーサーバーでの証明書取得(起動スクリプト)
aws ssm get-parameter \
--name "/ci-cd/runner/cert" \
--with-decryption \
--query Parameter.Value \
--output text > /etc/ssl/certs/runner.pem
aws ssm get-parameter \
--name "/ci-cd/runner/key" \
--with-decryption \
--query Parameter.Value \
--output text > /etc/ssl/private/runner.key
chmod 600 /etc/ssl/private/runner.key
GitHub Actions セルフホストランナー
ランナーに証明書を配布した後、ジョブ内でcredential helperを実行して一時認証情報を取得します。
# .github/workflows/deploy.yml
jobs:
deploy:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- name: Get AWS credentials
run: |
CREDS=$(aws_signing_helper credential-process \
--certificate /etc/ssl/certs/runner.pem \
--private-key /etc/ssl/private/runner.key \
--trust-anchor-arn "$TRUST_ANCHOR_ARN" \
--profile-arn "$PROFILE_ARN" \
--role-arn "$ROLE_ARN")
echo "AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r .AccessKeyId)" >> $GITHUB_ENV
echo "AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r .SecretAccessKey)" >> $GITHUB_ENV
echo "AWS_SESSION_TOKEN=$(echo $CREDS | jq -r .SessionToken)" >> $GITHUB_ENV
- name: Deploy
run: aws s3 sync ./dist s3://my-deploy-bucket/
Jenkins / GitLab CI
Jenkinsでは~/.aws/configにプロファイルを設定し、JenkinsfileのenvironmentブロックでAWS_PROFILEを指定します。GitLab CI Runnerでも同様に、config.tomlのenvironmentでAWS_PROFILEを設定することで透過的に利用できます。いずれも長期キーをCredentialsに登録する運用から、証明書ベースの自動更新に移行できます。
- ランナーの証明書有効期限切れはパイプライン全停止につながります
- 有効期限90日以内の証明書を使用し、Parameter Storeへの新証明書保存→ランナー側の証明書更新をAWS Systems Manager(Run Command)で自動化してください
- credential_process方式は毎回新規発行されるため、証明書更新後のキャッシュクリアは不要です
5-3. マルチクラウドVM — GCP / Azure からのAWSアクセス
他クラウドのVMからAWSリソースへアクセスする際も、X.509証明書ベースのIAM Roles Anywhereが有効です。各クラウドのCA(GCP Certificate Authority Service / Azure Key Vault)が発行した証明書をTrust Anchorに登録し、credential helperで一時認証情報を取得します。
GCP Compute Engineでの証明書取得
GCP VMでは、Google Certificate Authority Service(CAS)から証明書を発行し、IAM Roles AnywhereのTrust Anchorに登録します。
# GCP VMでの証明書発行(Google CAS利用)
gcloud privateca certificates create gcp-vm-001-cert \
--issuer-pool my-ca-pool \
--generate-key \
--key-output-file /etc/ssl/private/gcp-vm.key \
--cert-output-file /etc/ssl/certs/gcp-vm.pem \
--subject "CN=gcp-vm-001,O=MyOrg,OU=production"
# 動作確認
aws sts get-caller-identity --profile gcp-to-aws
証明書のCNにGCP VMのインスタンスIDまたはホスト名を設定し、IAMロールの信頼ポリシーでaws:PrincipalTag/x509Subject/CN条件を使うと、VM単位のアクセス制御が実現できます。
Azure VMでの証明書取得
Azure VMでは、Azure Key Vaultが管理する証明書をPEM形式でエクスポートして使用します。
# Azure VMでのKey Vault証明書エクスポート
az keyvault certificate download \
--vault-name my-keyvault \
--name azure-vm-cert \
--encoding PEM \
--file /etc/ssl/certs/azure-vm.pem
# 秘密鍵の取得(PFX形式からPEM変換)
az keyvault secret download \
--vault-name my-keyvault \
--name azure-vm-cert \
--file /tmp/azure-vm.pfx
openssl pkcs12 -in /tmp/azure-vm.pfx -nocerts -nodes \
-out /etc/ssl/private/azure-vm.key
rm -f /tmp/azure-vm.pfx
chmod 600 /etc/ssl/private/azure-vm.key
クラウド別のProfile設計
マルチクラウド環境では、クラウド別にProfileを分けて最小権限を設定することが重要です。
| クラウド | Roles Anywhere Profile | IAMロールの許可範囲 |
|---|---|---|
| GCP Compute Engine | GCPWorkloadProfile | GCPワークロード専用S3バケット読み書き |
| Azure VM | AzureWorkloadProfile | DynamoDB特定テーブルの読み取りのみ |
| オンプレサーバー | OnPremProfile | 業務要件に基づく最小権限 |
aws:PrincipalTagにx509Subject/OUでクラウドまたは環境を識別し、IAMポリシーの条件キーでアクセス範囲を絞ることで、各クラウドからの意図しないリソースアクセスを防ぎます。
5-4. IoT・エッジデバイス — 大規模証明書管理とAWS IoT Core連携
エッジサーバーや組み込みデバイスでIAM Roles Anywhereを使う場合、デバイス固有のX.509証明書をTrust Anchorに登録し、aws:PrincipalTagでデバイスIDを識別します。
AWS IoT CoreとのUC比較
IAM Roles AnywhereとAWS IoT Coreはどちらもデバイス認証をサポートしますが、用途が異なります。
| 観点 | IAM Roles Anywhere | AWS IoT Core |
|---|---|---|
| 主な用途 | AWSリソースへのAPI直接呼び出し | MQTT/IoT Data平面のパブサブ |
| デバイス管理機能 | なし(証明書管理のみ) | Things/Fleet Provisioning/Device Shadow |
| 大量デバイス管理 | CRL管理が複雑になる | Fleet Provisioning/Just-in-Time Registration |
| 向いているシーン | エッジサーバー・工場制御機器のS3/DynamoDB直接アクセス | 大量IoTデバイスのデータ収集・コマンド送受信 |
デバイス数が数万台を超える場合、AWS IoT CoreのFleet Provisioningを優先してください。IAM Roles Anywhereは、サイト単位のエッジサーバーや少数の制御機器に向いています。
エッジデバイスへの証明書プロビジョニング
AWS Private CAを使ってデバイスごとに証明書を発行します。
# 1. デバイス上でCSRを生成
openssl req -new -newkey rsa:2048 -nodes \
-keyout /opt/iot/device.key \
-out /opt/iot/device.csr \
-subj "/CN=edge-device-001/O=MyFactory/OU=Line1"
# 2. Private CAで証明書を発行
CERT_ARN=$(aws acm-pca issue-certificate \
--certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:123456789012:certificate-authority/CA_ID \
--csr fileb:///opt/iot/device.csr \
--signing-algorithm SHA256WITHRSA \
--validity Value=365,Type=DAYS \
--query CertificateArn --output text)
# 3. 発行した証明書を取得
aws acm-pca get-certificate \
--certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:123456789012:certificate-authority/CA_ID \
--certificate-arn "$CERT_ARN" \
--query Certificate --output text > /opt/iot/device.pem
Pythonアプリからの一時認証情報取得
エッジデバイス上のPythonアプリケーションから、credential helperを使ってAWS SDKに認証情報を渡します。
import subprocess, json, boto3
def get_aws_session(cert, key, trust_anchor_arn, profile_arn, role_arn):
result = subprocess.run([
'aws_signing_helper', 'credential-process',
'--certificate', cert,
'--private-key', key,
'--trust-anchor-arn', trust_anchor_arn,
'--profile-arn', profile_arn,
'--role-arn', role_arn
], capture_output=True, text=True, check=True)
creds = json.loads(result.stdout)
return boto3.Session(
aws_access_key_id=creds['AccessKeyId'],
aws_secret_access_key=creds['SecretAccessKey'],
aws_session_token=creds['SessionToken'],
region_name='ap-northeast-1'
)
session = get_aws_session(
cert='/opt/iot/device.pem',
key='/opt/iot/device.key',
trust_anchor_arn='arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/ANCHOR_ID',
profile_arn='arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/PROFILE_ID',
role_arn='arn:aws:iam::123456789012:role/EdgeDeviceRole'
)
s3 = session.client('s3')
s3.upload_file('/opt/iot/sensor-data.csv', 'my-factory-bucket', 'line1/sensor.csv')
大規模フリートのCRL管理
デバイス盗難・故障が発生した際、証明書シリアル番号をTrust AnchorのCRLに追加することでAWSアクセスを即座に遮断できます。
# 失効証明書リスト(CRL)の生成
openssl ca -revoke /opt/iot/device-001.pem -config /etc/ssl/openssl.cnf
openssl ca -gencrl -out /tmp/factory-crl.pem -config /etc/ssl/openssl.cnf
# CRLをTrust Anchorに登録
aws rolesanywhere import-crl \
--name "factory-device-crl" \
--crl-data fileb:///tmp/factory-crl.pem \
--trust-anchor-id ANCHOR_ID \
--enabled
- 1デバイス=1証明書を原則とし、フリートで証明書を共有しない
- aws:PrincipalTagにデバイスID・拠点コードを設定し、IAMポリシー条件でリソースレベルの最小権限を実現
- 証明書有効期限は365日以内に設定し、期限30日前にPrivate CAの自動更新スクリプトを実行
- CRLはS3バケットに定期同期し、Trust Anchorで参照することで失効の即時反映が可能
6. セキュリティ・運用・コスト
IAM Roles Anywhereは長期キーを廃止する一方、証明書ライフサイクルの管理が新たな運用責務になります。本セクションでは、証明書失効・ローテーション・監視・コストを解説します。
6-1. 証明書失効(CRL)とローテーション
証明書ベース認証においてインシデント対応の最重要ツールがCRL(Certificate Revocation List・証明書失効リスト)です。IAM Roles AnywhereのCRL登録には重要な制限事項があります。
OCSPは非対応(重要注意点)
IAM Roles AnywhereはOCSP(Online Certificate Status Protocol)によるリアルタイムの証明書ステータスチェックをサポートしていません。失効確認はCRL(PEMファイルのインポート)のみで行われます。OCSPに慣れたPKIエンジニアにとって意外な制限であり、インシデント対応手順を設計する際に必ず考慮が必要です。
OCSP非対応の影響は次のとおりです。
- 即時失効の遅延: CRLに登録した失効情報は次回の
CreateSessionリクエスト時点から適用されます。既存のセッション(最大1時間)には即座に影響しません - CRL更新の自動化: OCSPのようなCAのリアルタイム応答の仕組みは存在しないため、CRLファイルの更新とIAM Roles AnywhereへのインポートをCAのCRLパブリッシュ頻度に合わせて自動化する必要があります
- 緊急遮断にはTrust Anchor無効化を併用: CRLによる失効と並行して、対象Trust Anchorを無効化することで即時遮断が可能です
CRL登録手順
CRLを登録するには ImportCrl API(またはコンソール)を使います。登録できるのはPEM形式のCRLファイルのみです(DER形式は不可)。
# PEM形式CRLをIAM Roles Anywhereへインポート
aws rolesanywhere import-crl \
--name "prod-server-crl" \
--crl-data file://crl.pem \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID \
--enabled
CRLには有効期限(nextUpdate)があります。有効期限切れのCRLを参照すると失効チェックが機能しなくなるため、CRLの更新と再インポートを定期的に自動実行する仕組みが必要です。
# 既存CRLの更新
aws rolesanywhere update-crl \
--crl-id <crl-id> \
--crl-data file://updated-crl.pem
CA側でCRLを自動パブリッシュし、EventBridge Schedulerなどで定期的にIAM Roles AnywhereへのインポートをLambdaで実行するアーキテクチャを推奨します。
証明書ローテーション設計
X.509証明書には有効期限(notAfter)があります。有効期限切れの証明書はIAM Roles Anywhereで拒否されるため、計画的なローテーションが必要です。
| 有効期間 | 推奨用途 | 更新タイミング |
|---|---|---|
| 365日 | オンプレサーバーの定常運用 | 有効期限の30日前 |
| 90日 | セキュリティポリシー強化環境 | 有効期限の14日前 |
| 7-30日 | CI/CDランナーの短命ジョブ | ジョブ開始時に都度発行 |
credential helper(aws_signing_helper)は設定した証明書を自動的に読み込んで一時認証情報を更新するため、認証情報レイヤーのローテーションは自動です。しかし証明書自体の更新・再配布は別途自動化が必要です。
証明書の有効期限が切れる前に自動更新する仕組みを必ず用意してください。AWS Private CAを使う場合はACM Private CA Managed Renewalとの統合が有効ですが、自己管理CAの場合はcron・systemdタイマー・Ansibleなどで定期更新スクリプトを実行する構成が一般的です。証明書更新の失敗を検知するアラーム(有効期限のN日前にCloudWatchアラーム)も合わせて設定することをお勧めします。
6-2. 監視と最小権限
CloudTrailによる監査ログ
IAM Roles AnywhereのすべてのAPIコールはAWS CloudTrailに記録されます。特に CreateSession イベントが証明書ベースの認証情報取得を示す重要なイベントです。
| イベント名 | 内容 |
|---|---|
| CreateSession | credential helperによる一時認証情報の取得 |
| CreateTrustAnchor | Trust Anchorの作成 |
| ImportCrl | CRLのインポート |
| DisableTrustAnchor | Trust Anchorの無効化(緊急遮断時) |
| CreateProfile | Profileの作成 |
CreateSession イベントのログには証明書のシリアル番号・Subjectフィールドが含まれます。これにより「どの証明書を持つサーバーが」「いつ」「どのロールを引き受けたか」を追跡できます。
異常なセッション発行の検知
CloudWatch Logsにエクスポートしたトレイルに対してメトリクスフィルターを設定することで、次の異常を検知できます。
{
"filter_pattern": "{ $.eventName = \"CreateSession\" && $.errorCode = \"AccessDenied\" }",
"metric_name": "RolesAnywhereAccessDenied"
}
認証失敗(AccessDenied)が急増した場合は、証明書の期限切れ・CRL失効・Profileの設定ミスのいずれかである可能性が高く、アラームでエンジニアに通知する設定が有効です。通常の使用時間帯外での CreateSession 増加や、想定外のリージョンからのアクセスも不正利用を示すシグナルになります。
CloudWatch Metricsでは証明書ごとのセッション発行数の傾向を監視し、正常範囲を逸脱した際にアラームを発報する設定を推奨します。
ProfileとセッションポリシーによるPrinciple of Least Privilege
IAM Roles Anywhereでの最小権限設計は、次の二層構造で実現します。
- 第1層: IAMロールのポリシー: 付与するAWSリソースへのアクセス権限を定義します。引き受けるロールには必要最小限のポリシーのみ付与します
- 第2層: Profileのセッションポリシー: IAMロールの権限をProfileレベルでさらに絞り込みます。ワークロードの種類ごとにProfileを分け、それぞれに適切なセッションポリシーを設定することで、同じIAMロールを使い回しながら権限の細分化が可能です
Profile設計の例:
profile-batch-s3readonly: バッチジョブ用・S3読み取り専用profile-deploy-ecr-push: CI/CD用・ECR pushのみprofile-monitoring-readonly: 監視ツール用・CloudWatch読み取りのみ
セッションポリシーはProfileに設定したものとIAMロールのポリシーの積集合(Intersection)として適用されます。ロールに広い権限があっても、Profileのセッションポリシーによって絞り込めば最小権限を実現できます。
Trust Anchorの無効化による緊急遮断
侵害されたワークロードを即座に遮断する最も強力な手段は、Trust Anchorの無効化です。
# Trust Anchorを無効化(緊急遮断)
aws rolesanywhere disable-trust-anchor \
--trust-anchor-id <trust-anchor-id>
Trust Anchorを無効化すると、そのCAで発行されたすべての証明書による CreateSession が即座に失敗します。既存の一時認証情報は有効期限まで有効ですが、新たな認証情報の取得は不可能になります。
CRL失効との使い分けは次のとおりです。
- 特定の証明書のみ失効させたい場合: CRLに証明書シリアル番号を追加してImportCrlで更新します
- そのCA配下の全証明書を即時遮断したい場合: Trust Anchorを無効化します
インシデント対応時は、まずTrust Anchor無効化で全体を遮断し、影響範囲を確認したうえで特定の証明書のみのCRL失効に切り替えるアプローチが安全です。無効化の後に再度有効化する操作も即座に反映されるため、誤遮断時の復旧も迅速に行えます。
6-3. コスト構造
IAM Roles Anywhere本体は無料
IAM Roles Anywhere自体の利用料金はかかりません。Trust Anchor・Profile・CRLの設定・CreateSession APIコール・CloudTrail記録に対して直接の課金はありません。
コストの主因は、IAM Roles Anywhereと組み合わせて使う CA(認証局) です。
AWS Private CAを使う場合のコスト
AWS Private CAは、IAM Roles Anywhereのユースケースで最も推奨されるCA実装です。コストは主に次の2要素で構成されます。
| 費用項目 | 料金(2026年6月時点) |
|---|---|
| Private CA月額稼働費(Generalモード) | 約$400/月 |
| Private CA月額稼働費(Short-livedモード) | 約$75/月 |
| 証明書発行費 | $0.75/件(月間1,000件まで) |
月額約$400は無視できないコストです。特に開発環境や小規模な概念実証(PoC)では過剰な投資になる場合があります。
コスト最適化の選択肢
| 構成 | コスト | 推奨シナリオ |
|---|---|---|
| Private CA(Generalモード) | 高(約$400/月) | 本番・コンプライアンス要件が厳しい環境 |
| Private CA(Short-livedモード) | 中(約$75/月) | CI/CD中心・短命証明書のみ |
| 既存エンタープライズPKI(AD CS等) | なし | AD CSなどの既存PKIがある組織 |
| OSS CA(自己管理) | なし(運用コストあり) | PoC・小規模・コスト優先 |
既存のエンタープライズPKI(Active Directory CS等)がある組織では、そのCA証明書をTrust AnchorにインポートするだけでPrivate CAのコストをゼロにできます。新たなCAコストが発生しない反面、既存PKIのSLAと運用体制がIAM Roles Anywhereの可用性に直結します。
Short-livedモードのPrivate CAはCA階層が制限され(中間CA構成等を利用できない)、この点に注意します。金融・医療・官公庁のようにコンプライアンス要件の厳しい環境では、Generalモード(FIPS 140-2 Level 3保証)の採用が求められる場合もあります。
自己管理のOSSCA(CFSSL・step-ca等)を使う場合もPrivate CAコストはかかりませんが、運用・可用性・監査証跡はすべて自己責任になります。本番環境での採用は、PKI運用の専門知識と体制が整っている組織に限ることを推奨します。
7. 実戦統合パターン — CloudHSM × Private CA × Roles Anywhereの連環

本セクションでは、IAM Roles Anywhereを既存のセキュリティ基盤と組み合わせる統合パターンを、鍵保護からの一貫した連環として解説します。
7-1. CloudHSM保護ルート鍵 → Private CA → Trust Anchorの連環
IAM Roles Anywhereの信頼の起点であるTrust Anchorの価値は、それが参照するCAの鍵がどこまで安全に保護されているかに直結します。CAのルート鍵をCloudHSMで保護することで、ソフトウェアCA(OpenSSLなど)に比べた最高水準の鍵セキュリティを実現できます。
連環の全体像
CloudHSMを使ったルート鍵保護パターンでは、以下の多層セキュリティ連環を構成します:
- CloudHSM: ルートCA鍵を専有HSM内に生成・保存(鍵は物理的にHSM外に出ない)
- AWS Private CA: CloudHSMをバッキングストアとした中間CA構築(FIPS 140-2 Level 3)
- Trust Anchor: Private CAのARNをIAM Roles AnywhereのTrust Anchorに登録
- 証明書発行: Private CAがCloudHSM保護の鍵でワークロード証明書に署名
- Roles Anywhere: Trust Anchorが信頼するCAの署名を検証し、一時認証情報を発行
AWS Private CAはバッキングストアとしてCloudHSMをサポートしています。FIPS_140_2_LEVEL_3_OR_HIGHERを指定することで、CA鍵がCloudHSMまたはAWS管理のFIPS Level 3 HSMに保存されます:
# CloudHSMバッキングストアを使ったPrivate CA作成
aws acm-pca create-certificate-authority \
--certificate-authority-configuration \
"KeyAlgorithm=ECDSA_P256,SigningAlgorithm=SHA256WITHECDSA,\
Subject={Country=JP,Organization=MyOrg,CommonName=MyOrg Intermediate CA}" \
--certificate-authority-type SUBORDINATE \
--key-storage-security-standard FIPS_140_2_LEVEL_3_OR_HIGHER
# 作成したPrivate CAをTrust Anchorに登録
aws rolesanywhere create-trust-anchor \
--name "cloudhsm-backed-ca-trust-anchor" \
--source \
"sourceType=AWS_ACM_PCA,sourceData={acmPcaArn=arn:aws:acm-pca:ap-northeast-1:123456789012:certificate-authority/pca-id}" \
--enabled
セキュリティ連環の価値
この3層構成の強みは以下のとおりです:
- 不正証明書発行の防止: ルート鍵がHSMから出ないため、管理者権限を奪われても鍵の窃取は物理的に不可能
- 証明書失効による即時遮断: CRLまたはTrust Anchor無効化により、そのCA配下の全証明書を即時失効
- コンプライアンス対応: FIPS 140-2 Level 3 / PCI DSS / SOX等の規制要件を満たすCA鍵保護
- 既存CloudHSM記事との連携: 前述のCloudHSM本番運用Vol1で解説したクラスター構成・CO/CU管理がそのまま適用可能
Private CA + CloudHSMの構成では月額コストが増加しますが(Private CA約400ドル + CloudHSMクラスター約1.6ドル/時間)、PCI DSS準拠環境や金融系ワークロードではこのコストが必須の投資として正当化されます。コスト最適化の観点では、CloudHSM上のルートCA鍵で中間CAに署名した後、中間CAは通常のPrivate CA(CloudHSMなし)に移行し、日常的な証明書発行コストを削減する2層設計も有効です。
7-2. CI/CDランナー統合とマルチクラウドVM対応
CI/CDパイプラインは長期IAMアクセスキーの最大の温床でした。IAM Roles Anywhereを使うことで、ランナー固有の証明書を発行してキーレスのAWSアクセスを実現できます。
GitHub Actionsセルフホストランナーへの統合
セルフホスト型ランナーのサーバーに証明書を配置し、credential_processとして設定するパターンです:
# ランナーサーバーでの ~/.aws/config 設定
cat >> ~/.aws/config << 'EOF'
[profile github-actions-deploy]
credential_process = aws_signing_helper credential-process \
--certificate /etc/pki/github-runner-cert.pem \
--private-key /etc/pki/github-runner-key.pem \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID \
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:profile/ci-cd-deploy-profile-id \
--role-arn arn:aws:iam::123456789012:role/GithubActionsDeployRole
region = ap-northeast-1
EOF
GitHub Actionsのワークフローファイルでは、AWS_PROFILE環境変数を設定するだけで使用できます:
jobs:
deploy:
runs-on: self-hosted
steps:
- name: Deploy to S3
run: aws s3 sync ./dist s3://my-bucket/
env:
AWS_PROFILE: github-actions-deploy
証明書の有効期限(例:1年)に合わせて定期更新するだけでよく、長期アクセスキーのローテーション漏れリスクを大幅に低減できます。
Jenkinsへの統合
Jenkinsエージェントサーバーに証明書を配置し、Jenkinsfileのenvironmentブロックでプロファイルを指定します:
pipeline {
agent any
environment {
AWS_PROFILE = 'roles-anywhere-jenkins'
}
stages {
stage('Deploy') {
steps {
sh 'aws s3 cp ./artifact.zip s3://deploy-bucket/'
}
}
}
}
Jenkinsfileに長期アクセスキーをCredentialsとして登録する運用から、証明書ベースの自動更新に移行できます。
GitLab CI/CDランナーへの統合
GitLab Runnerのconfig.tomlで環境変数を設定します:
[[runners]]
name = "aws-deploy-runner"
[runners.docker]
environment = ["AWS_PROFILE=roles-anywhere-gitlab"]
ランナーに証明書・秘密鍵を配置し、~/.aws/configにプロファイルを定義するだけで、GitLab CI/CDのジョブがIAM Roles Anywhereを通じてAWSにアクセスできます。
マルチクラウドVM統合パターン(GCP/Azure VMからのAWSアクセス)
GCPやAzureのVMからAWSにアクセスするマルチクラウドシナリオは、IAM Roles Anywhereの最も強力なユースケースの1つです。クラウドネイティブな証明書管理と組み合わせることで、自動プロビジョニングが実現します。
GCPとの統合例:
- Google Certificate Manager または Vault PKIが証明書をGCP VMにプロビジョニング
- GCP VMに証明書ファイルと秘密鍵を配置
aws_signing_helperをインストールし、~/.aws/configにプロファイルを設定- 既存のAWSクライアントコードをそのまま使用(認証は
credential_processが透過的に処理)
# GCP VM上での設定確認(認証が正常に機能しているかテスト)
aws sts get-caller-identity --profile roles-anywhere-gcp-vm
# 出力例: GCPのVMがIAMロール GcpWorkloadRole として認識される
Azureとの統合では、Azure Key Vault証明書とAzure VM ExtensionによるプロビジョニングをIAM Roles Anywhereと組み合わせることで、Azureのライフサイクル管理と連動した証明書自動更新が実現します。
マルチクラウド統合設計のポイント:
– 各クラウドの証明書CNにVMのリソースID・ホスト名を設定し、IAMロールの信頼ポリシーで識別
– 証明書の有効期限管理は各クラウドの証明書管理基盤(GCP Certificate Manager / Azure Key Vault)に委ねる
– クロスクラウドのネットワーク遅延は通常100ms以内で、credential helperの認証への影響は軽微
7-3. 既存ID基盤との連携ポイント
IAM Roles Anywhereは「マシンのワークロードID」を担当し、既存のIAM Identity Center(人間のSSO)やDirectory Service(AD連携)と役割を分担します。
IAM Identity Centerとの役割分担
| 用途 | 適切なサービス |
|---|---|
| 人間のコンソールアクセス・CLIログイン | IAM Identity Center |
| 社内IdP(Entra ID/Okta)との連携 | IAM Identity Center |
| オンプレサーバー・CI/CDランナーのAWSアクセス | IAM Roles Anywhere |
| AWS外のVMのAPIアクセス | IAM Roles Anywhere |
| AWS内のEC2/Lambda/コンテナ | EC2インスタンスプロファイル / ECSタスクロール |
両者は排他ではなく、同じAWS環境で並立して利用できます。エンジニアが個人プロファイルでAWSコンソールにアクセスし(Identity Center)、同時にCI/CDランナーがRoles Anywhereで自動デプロイを行う構成が標準的な組み合わせです。
Directory Serviceとの連携
AWS Managed Microsoft AD(Directory Service)記事で解説したハイブリッドAD基盤は、IAM Roles Anywhereと以下の点で連携できます:
- AD CSとの統合: Active Directory証明書サービス(AD CS)が発行した証明書をTrust Anchorに登録し、ドメイン参加サーバーに証明書を自動プロビジョニング
- グループポリシーによる証明書配布: GPO経由でドメイン参加サーバーに証明書を自動インストールし、手動配置を不要にする
- IDライフサイクルの一元管理: ADアカウント無効化と証明書失効(CRL)の連動設計によりオフボーディングを確実に実施
AD CS統合での設計ポイント:
– AD CSが発行する証明書のCNにサーバーのFQDNまたはサービス名を設定
– IAMロール信頼ポリシーのaws:PrincipalTag/x509Subject/CN条件でサーバーごとのアクセス制御
– AD CSのCRL配布ポイントURLをTrust AnchorのCRL設定に登録して失効チェックを有効化
統合ID戦略のまとめ
ハイブリッドクラウド環境の統合ID戦略は、以下のレイヤー構成で整理できます:
- ヒューマンアクセス層: IAM Identity Center(人間のSSO/MFA/権限設計)
- マシンアクセス層(AWS外): IAM Roles Anywhere(X.509証明書/一時認証情報)
- マシンアクセス層(AWS内): EC2インスタンスプロファイル・ECSタスクロール
- 鍵保護層: CloudHSM(CA鍵の物理的保護)
- 証明書管理層: AWS Private CA または既存PKI(AD CS/HashiCorp Vault)
この4層アーキテクチャを確立することで、長期アクセスキーをゼロにした「キーレスAWSアクセス」の組織全体への展開が可能になります。IAM Roles Anywhereをゼロトラストセキュリティの基盤として位置づけ、新規プロジェクトでは長期キー配布を禁止するポリシーを設定することが、本番運用の到達点です。
8. 詰まりポイントとアンチパターン・まとめ
IAM Roles Anywhereの本番運用では、X.509証明書ベースの認証特有の落とし穴があります。Trust Anchor・Profile・CRL・PrincipalTagという新しい概念が絡むため、設定ミスのパターンも独特です。本セクションでは、現場で頻出する詰まりポイント7件・アンチパターン5件を整理し、記事全体のまとめを示します。
8-1. よくある詰まりポイント
詰まり1: ロールの信頼ポリシーにsts:TagSessionとsts:SetSourceIdentityがない
症状: credential helperのcredential-processコマンドがAccessDeniedで失敗します。IAMロールのARNは正しく、ProfileにもロールARNを登録しているのに認証が通りません。CloudTrailでrolesanywhere.amazonaws.comのCreateSessionイベントを確認すると、STSの呼び出しが拒否されていることが分かります。
原因: IAMロールの信頼ポリシーにsts:AssumeRoleしか記述していないケースが最多です。IAM Roles AnywhereはCreateSession時にsts:TagSession(X.509属性をPrincipalTagとしてセッションに付与)とsts:SetSourceIdentity(ソースIDの設定)の権限が必須です。この2つが欠けると、証明書の属性変換処理でSTSが権限不足を返します。
対処法: ロールの信頼ポリシーのActionに必ず以下の3つを追加します。
"Action": [
"sts:AssumeRole",
"sts:TagSession",
"sts:SetSourceIdentity"
]
補足として、信頼ポリシーのConditionにaws:SourceArnでTrust AnchorのARNを限定する設定も推奨します。これにより、同一アカウント内の別のTrust Anchorから意図せずロールを引き受けられることを防止できます。
詰まり2: CRL未登録で失効済み証明書が認証を通過し続ける
症状: 廃棄・紛失したサーバー証明書でAWSへのアクセスが引き続き成功します。CA側で証明書を失効させても、IAM Roles Anywhere側へCRLを反映しなければ遮断されず、セキュリティ対応は完結しません。
原因: IAM Roles AnywhereはデフォルトではCRL(証明書失効リスト)を参照しません。CRLをImportCrl APIで登録していない限り、Trust Anchorに登録されたCAが発行した証明書は失効済みでも認証を通過します。IAM Roles AnywhereはOCSPに対応していないため、CRLが唯一の失効管理手段です。CRLを登録しないまま運用することは、失効という概念が機能しない状態であることを意味します。
対処法: PKIのCRL配布ポイントからCRLをダウンロードし、IAM Roles AnywhereにインポートするCI/CDまたはcronジョブを整備します。CRLには有効期限(nextUpdateフィールド)があるため、PKIのCRL更新間隔(通常7〜30日)に合わせた定期更新も必要です。
aws rolesanywhere import-crl \
--name "prod-ca-crl" \
--crl-data fileb://revoked.crl \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:123456789012:trust-anchor/TRUST-ANCHOR-ID \
--enabled
詰まり3: credential helperに中間CA証明書が含まれていない
症状: 中間CAが発行した証明書を使うとAccessDeniedまたは証明書チェーン検証エラーが返ります。同じTrust Anchor・同じProfileでも、ルートCAが直接発行した証明書なら認証は通り、中間CA経由の場合のみ失敗します。
原因: Trust AnchorにルートCAを登録し、中間CAが発行した証明書をワークロードが提示する場合、credential helperのリクエストに中間CA証明書を含めないとチェーン検証が失敗します。IAM Roles Anywhereは提示された証明書からTrust Anchorまでのチェーンを自力で補完しないため、クライアント側でチェーン全体を提供する必要があります。中間CA証明書が信頼ストアにある環境では動作しますが、クリーンな環境ではチェーンが切れます。
対処法: --certificate-bundle-fileオプションに中間CA〜ルートCAまでの証明書を含むPEMファイルを渡します。バンドルファイルにはエンドエンティティ証明書は含めず、中間CA証明書とルートCA証明書のみを記述します。
aws_signing_helper credential-process \
--certificate ./server-cert.pem \
--private-key ./server-key.pem \
--certificate-bundle-file ./ca-chain.pem \
--trust-anchor-arn arn:... --profile-arn arn:... --role-arn arn:...
詰まり4: durationSecondsがロールのMaxSessionDurationを超えている
症状: Profileで43200秒(12時間)を設定したのに、取得できる一時認証情報の有効期間が3600秒(1時間)のまま変わりません。Profileの設定を変更しても改善せず、有効期間を延ばせない原因が分からないケースです。
原因: 一時認証情報の有効期間は、ProfileのdurationSecondsとロールのMaxSessionDuration(デフォルト3600秒/最大43200秒)の小さい方が実際の有効期間として適用されます。IAMロールのMaxSessionDurationはデフォルトで1時間のため、Profileでいくら長く設定しても上限は1時間のままです。
対処法: ロールのMaxSessionDurationを必要な時間に変更します。
aws iam update-role \
--role-name RolesAnywhereProdRole \
--max-session-duration 43200
ロール変更後、ProfileのdurationSecondsもaws rolesanywhere update-profileコマンドで合わせて更新します。
詰まり5: Trust AnchorのリージョンとCredential Helperのリージョン設定のずれ
症状: credential helperのリクエストがEndpointResolutionErrorや接続タイムアウトで失敗します。特に、ワークロードのデフォルトリージョン設定が異なる環境(別リージョンのEC2など)でcredential_processを使う際に発生しやすいです。
原因: IAM Roles AnywhereはリージョナルなAPIです。credential helperは--regionオプションまたはAWS_DEFAULT_REGION環境変数でリクエスト先リージョンを決定します。Trust Anchor・ProfileがTokyoリージョン(ap-northeast-1)にあるのに、credential helperのリージョン指定がus-east-1になっているとエンドポイントが解決できません。credential_process設定に--regionを省略すると環境によって動いたり動かなかったりする不安定な挙動になります。
対処法: credential_processの設定に--regionを明示的に追加します。~/.aws/configのプロファイルにregion = ap-northeast-1を追加することでも対応できます。スクリプト起動時にAWS_DEFAULT_REGIONを明示的に設定する方法も有効です。
詰まり6: aws:PrincipalTagの属性値が証明書フィールドと一致しない
症状: IAMロールの信頼ポリシーやS3バケットポリシーでaws:PrincipalTag/x509Subject/OUによる条件付けを設定したのに、アクセス制御が意図通りに機能しません。StringEquals条件が常に失敗し、正当な証明書でもアクセスが拒否されます。
原因: aws:PrincipalTagに設定されるタグ値は、証明書に記載された通りの文字列です。証明書発行時にOU=Productionと書いた場合とOU=production(小文字)ではPrincipalTagの値が異なります。IAMポリシーのStringEquals条件はタグ値を大文字小文字を区別して比較するため、発行時の命名規則とポリシー条件の文字列が完全に一致しなければなりません。また、空白文字や特殊文字が証明書フィールドに含まれる場合にも同様の問題が発生します。
対処法: 証明書発行前に命名規則(例: OUは常に小文字のproduction/staging/development)をIAMポリシーの条件値と一致させて文書化します。実際のPrincipalTagの値はaws sts get-caller-identityコマンドや、STSのCreateSession CloudTrailイベントのセッションタグで確認できます。証明書のSubjectフィールドに設計した値が正しく反映されているかを事前にopenssl verify等で確認する手順を標準化することを推奨します。
詰まり7: Private CAのコストを事前に見積もっていなかった
症状: IAM Roles Anywhere本体は無料と聞いていたが、AWS Private CAを使い始めてから月額請求が想定外に高くなりました。特に、開発・ステージング・本番でそれぞれPrivate CAを作成した場合、月額コストが数千ドルに達するケースがあります。
原因: IAM Roles Anywhere本体のAPI呼び出し料金はゼロですが、証明書を発行するAWS Private CAには月額約400ドルのCA稼働費用(ルートCA/中間CAそれぞれ)に加え、証明書発行ごとの費用がかかります。本番/ステージング/開発で3つのCAを作成するだけで月額1200ドルの基本費用が発生します。
対処法: コスト最適化の選択肢は以下のとおりです。
- オープンソースCA(HashiCorp Vault PKI、StepCA、OpenSSL自己署名CA)を使い、外部CA証明書としてアップロードする方法(CA稼働費用ゼロ)
- AWS Private CAのShort-Livedモード(有効期間7日以内)は1発行あたりのコストが大幅に削減される(ローテーション頻度は増加)
- 環境ごとにCAを作成せず、1つのCAで発行する証明書のSANやOUで環境を区別し、IAMポリシーで制御する方法
8-2. アンチパターン → 正解
IAM Roles Anywhereの導入プロジェクトでよく見られるアンチパターンを、なぜ問題なのかと正解のアプローチとともに整理します。特に「CRL未登録」と「長期アクセスキー混在」の2つは、IAM Roles Anywhereを導入したのにセキュリティが向上しないという状態を生む代表的な失敗パターンです。
| アンチパターン | 問題点 | 正解 |
|---|---|---|
| 長期IAMアクセスキーをオンプレサーバーやCI/CDランナーの設定ファイルに直接記述する | キーが漏洩しても長期間気づかない・棚卸しが困難・ローテーション漏れが多発する | IAM Roles AnywhereでX.509証明書ベースの一時認証情報に切り替え、長期キーを完全廃止する |
| Trust Anchor1つ(ルートCA)で本番・開発・ステージングを共用する | 開発環境の証明書が本番ロールを引き受けられるリスクがあり、環境間の分離が破られる | 環境ごとに別のTrust Anchor(別のCA)を作成し、ProfileとIAMロールも環境別に分離する |
| Profileにセッションポリシーを設定せずロールのフル権限でワークロードを運用する | ワークロードがロールのすべての権限を取得でき、侵害・誤操作時の影響範囲が最大化する | Profileのセッションポリシーで業務に必要な最小権限(特定S3バケットのGetObjectのみなど)に絞り込む |
| CRLを登録しないままTrust Anchorを運用し、証明書廃棄をCA側のみで実施する | 廃棄・侵害された証明書が失効なく有効のまま使われ続け、セキュリティ対応が不完全になる | CRLをImportCrl APIで登録・定期更新するCI/CDパイプラインを整備し、証明書失効を確実に反映させる |
| 証明書有効期限を3年・5年などに設定して長期放置する | 侵害された証明書が長期間有効であり続け、また大量の証明書が同時期に期限切れする「崖」が生まれる | 有効期限を1年以下に設定し、証明書の自動更新パイプライン(ACME/SCEP等)を整備して定期ローテーションを実施する |
上表のアンチパターンは互いに組み合わさって起きるケースも多くあります。たとえば「Trust Anchorを環境共有しつつCRLも未登録」という状態は、インシデント発生時に開発証明書が本番環境へアクセスし続けるという複合リスクを生みます。導入チェックリストと合わせて定期的にレビューすることを推奨します。
8-3. まとめと次のステップ
IAM Roles Anywhereは、AWS外のワークロードに対してX.509証明書という汎用標準を使い、一時IAM認証情報を安全に発行するサービスです。本記事Vol1では、3つのコアコンセプト(Trust Anchor/Profile/credential helper)・X.509属性とPrincipalTagの連携・セットアップと信頼ポリシー設計・CI/CDランナー/マルチクラウドVM/Directory Service統合パターン・CloudHSMとの連環・詰まりポイントとアンチパターンを解説しました。
本番導入前の確認チェックリスト
IAM Roles Anywhereを本番環境へ導入する前に、以下の項目を確認します。
PKI基盤の準備:
– CAの種別を決定(AWS Private CA / 既存PKI / オープンソースCA)
– 証明書の有効期間設計(1年以下推奨)
– 証明書のSAN/OUなどのSubjectフィールド命名規則の文書化
– CRL配布ポイントの設定とCRL有効期間の確認
AWS設定:
– Trust Anchorの作成(環境別に分離)
– IAMロールの信頼ポリシーにsts:AssumeRole・sts:TagSession・sts:SetSourceIdentityの3アクションを設定
– Profileの作成とセッションポリシーによる最小権限設定
– durationSecondsとMaxSessionDurationの整合確認
– CRLのImportCrlによる登録
運用プロセス:
– CRL定期更新のCI/CDまたはcronジョブの整備
– 証明書有効期限アラームの設定(期限の30日前・7日前など)
– credential helperのバージョン管理と更新手順の整備
– CloudTrailでのCreateSessionイベント監視ルールの設定
– インシデント発生時のTrust Anchor無効化手順書の整備
長期アクセスキー廃止への段階的な移行プラン
組織全体でのキーレスAWSアクセス移行には段階的なアプローチが効果的です。
- フェーズ1(調査): IAMアクセスキーの棚卸しを実施します。IAM Access Analyzerのアクセスキー最終使用日分析や
aws iam get-credential-reportコマンドが有用です。どのワークロードが長期キーを使っているかを洗い出し、移行優先度を判断します。 - フェーズ2(先行導入): credential helperの導入コストが低いCI/CDランナーから移行を始めます。失敗しても影響が限定的で、動作検証しやすい環境から始めることがポイントです。
- フェーズ3(拡大): オンプレサーバー・他クラウドVMへ順次展開します。サーバーの証明書プロビジョニングはAnsible/Puppetなどの構成管理ツールと組み合わせると自動化が容易です。
- フェーズ4(強制): 全ての非人間ワークロードからの長期アクセスキーがゼロになった後、IAMのSCPで新規の長期キー作成を禁止するポリシーを施行し、再発を防止します。
IAM Roles Anywhereが解決する主要課題のまとめ
| 課題 | 長期アクセスキーの問題 | IAM Roles Anywhereによる解決 |
|---|---|---|
| 鍵の漏洩リスク | 漏洩した鍵が明示的に無効化されるまで有効 | 証明書はTrust Anchor無効化またはCRL登録で即時失効 |
| ローテーションの手動作業 | 鍵のローテーションは手動またはスクリプトが必要 | 一時認証情報はライフタイム経過で自動失効し、credential helperが自動取得 |
| 棚卸しの困難 | 組織内の全長期キーの把握が困難 | Trust Anchor・Profile・CloudTrailで認証を集中管理 |
| 環境間の分離 | 同一の長期キーが複数環境で誤用されるリスク | Trust Anchor・Profileの環境別分離で証明書の誤使用を防止 |
監視設計のポイント
IAM Roles Anywhereの本番運用では、以下の監視を整備することで証明書ベース認証の健全性を継続的に確認できます。
CloudTrailとCloudWatchの組み合わせ:
– rolesanywhere.amazonaws.comのCreateSessionイベントを監視し、異常な発行元IP・時間帯・リージョンのアクセスをアラートする
– AccessDeniedイベントの急増を検知することで、証明書期限切れや設定ミスによる認証失敗を早期発見できる
– 1時間あたりのCreateSession呼び出し数をメトリクス化し、異常なアクセス頻度を検知する
証明書有効期限の監視:
– AWS Certificateサービスや組織のPKI管理ツールから証明書の有効期限リストを取得し、30日前・7日前に通知するジョブを整備する
– 証明書の一斉期限切れを避けるため、同一バッチで発行した証明書群の更新スケジュールを分散させる
CRL新鮮度の監視:
– CRLのnextUpdateフィールドを定期チェックし、更新期限の1日前にアラームを発する監視ジョブを設定する
– CRL更新パイプラインの失敗をCI/CDの通知チャンネルへアラートする
CRL運用の重要性
IAM Roles Anywhereの採用後に最も運用上重要なのはCRL管理です。CRLの定期更新を自動化せずに導入すると、証明書失効が機能しない「有名無実の失効機能」になります。CRLの有効期限を過ぎたCRLを登録したままにすると、失効チェックそのものが機能しなくなる場合もあるため注意します。導入時に必ずCRL更新パイプラインを整備し、失効が正しく機能することをテストしてから本番稼働させることを強く推奨します。
Vol2予告
Vol2では、証明書の自動プロビジョニング(ACME/SCEP/EST)・大規模IoTデバイスへの展開・マルチアカウント設計パターン・CRL運用の詳細・コスト最適化の具体的な試算を深掘りします。IAM Roles Anywhereを組織全体のキーレスAWSアクセス基盤として拡大するためのロードマップもVol2で解説します。
本記事Vol1がカバーしたTrust Anchor・Profile・credential helperの基礎概念と典型的なユースケースを理解した上でVol2へ進むと、より高度なトピックをスムーズに吸収できます。