以下の内容はhttps://nopipi.hatenablog.com/entry/2025/11/17/010121より取得しました。


自己証明書でIAM Roles Anywhereを使いAWS CLIを実行してみた

はじめに

この記事は?

通常IAM Roles Anywhereはセキュリティの観点から、外部認証局またはプライベート認証局を準備して運営する必要があります。
しかし外部認証局やプライベート認証局は金額が比較的高額になるや認証局の運用の手間が高いため、敷居が高いです。
そこでやむなくですが自己証明書を利用してIAM Roles Anywhereを実施しました。この記事では、その手順を説明しています。
またaws_signing_helperとmacOSのキーチェーンストアとの連携や、クライアント証明書の識別子での認証制限方法も説明しています。

この手順で作られるもの

この手順を実行すルト、以下の構成図のものが作られます。
特に証明書周りは複雑で、手順を追うだけで自分が何を作っているかわからなくなりやすいので、この図を参考にそれぞれのコマンドで何を作っているのかを確認しながら進めると良いかと思います。


能書き

IAM Roles Anywhereとは?

IAM Roles Anywhereは、AWSの外側にあるワークロード(オンプレミスサーバー、他のクラウド上の仮想マシンなど)に対して、一時的なAWSリソースへのアクセス権を付与するためのAWSの機能です。

そもそも自己証明書とは?

自己証明書(じこしょめいしょめいしょ、英: Self-signed certificate)とは、その証明書の持ち主自身が、自身の秘密鍵を用いて署名したデジタル証明書のことです。日本では俗に「オレオレ証明書」とも呼ばれます。
通常のデジタル証明書は、信頼できる第三者機関である認証局 (CA) が、その証明書が正当なものであることを保証するために署名を行います。
しかし、自己証明書は第三者の保証がないため、公的な信頼性がない点がセキュリティ上問題とされています。

前提条件

この記事を実行するための、前提条件を以下に書いておきます。

  • 環境の前提
    • AWSアカウントを所有していること
    • そのAWSアカウントに管理者権限(AdministratorAccess)でアクセスできること
    • 端末としてmacOSがあること
    • macOSにはopensslコマンドが入っていること
      • 多分最新のMacOSなら最初から入っているのではと・・・。入ってきるかはコマンドラインopenssl versionと打って判断できる。
  • 知識の前提

作業環境

この記事のために作業した環境は以下のとおりです。

準備

AWS CLIをインストール

最初にAWS CLIをインストールします。最後の動作テスト用に使います。
以下のマニュアルの手順を参照しインストールします。

aws_signing_helperをインストール

IAM Roles Anywhereから一次認証情報を取得するためのツールとしてaws_signing_helperAWSから提供されています。

aws_signing_helper の取得

以下のIAM Roles Anywhereのユーザーガイドのページからaws_signing_helperを取得することができます。以下のページに飛んでダウンロード一覧から実行環境のバイナリファイルをダウンロードします。

macOS(Appleチップ)の場合は、以下のファイルを取得します。

  • Plartform: Darwin
  • Architecture:Aarch64
aws_signing_helper を実行可能にする
  • ダウンロードしたファイルに実行権限を付与する
chmod +x aws_signing_helper
  • 一旦実行確認する
./aws_signing_helper version
  • フォルダを作成しそのフォルダにaws_signing_helperを移動する
mkdir ~/bin
mv aws_signing_helper ~/bin
  • ~/.zshrcに以下を追加して作成したフォルダをパスに追加する
# Add Path
PATH="/Users/n/bin:${PATH}"
  • ターミナルを一度閉じて、再度ターミナルを開く(追加したパスが反映させるため)
  • 以下のコマンドでaws_signing_helperが実行可能かを確認する
aws_signing_helper version

証明書を作成する

自己認証局(CA)の秘密鍵と証明書を作成する

まずは、自己認証局を作成します。具体的には自己認証局として以下の2つを作成します。

  1. 自己認証局(CA)の秘密鍵
  2. 自己認証局(CA)の証明書

自己認証局(CA)の秘密鍵 作成

以下の部分の認証局秘密鍵を最初に作成します。
生成する認証局秘密鍵は 、2048bitのRSA鍵になります。


以下のコマンドで秘密鍵を生成します。

openssl genrsa -out self-signed-ca-private-key.pem 2048
自己認証局(CA)の証明書 作成

次に、自己証明局の証明書を作成します。以下の部分の証明書です。

(a) openssl設定の変更
証明書作成のためにopensslの設定を変更します。具体的には、以下の設定を追加します。

  • プライベート認証局自己署名証明書の拡張フィールド(v3_ca)
  • 発行するクライアント証明書の拡張フィールド(v3_client)

設定はMacOS全体に影響する大元のファイルを壊さないよう、作業ディレクトリにopensslの設定ファイルをコピーして追加します。

  • openssl.cnfをコピーする
cp /etc/ssl/openssl.cnf .
  • コピーしたopenssl.cnfに以下のセッションを追加する
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
keyUsage = cRLSign, keyCertSign

[ v3_client ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth

(b) 自己認証局(CA)の証明書作成
秘密鍵を利用し、自己認証局(CA)の証明書を作成します。
証明書の有効期間は1年としています。
また証明書に設定する認証局の識別情報は以下の設定にしています。

要素 説明 CAの設定値 備考
C (Country) 国名コード JP
ST (State/Province) 都道府県名 Tokyo
L (Locality) 市区町村名 Hoge-Ku
O (Organization) 組織名 NoppyCA
OU (Organizational Unit) 組織の部署名 なし 現在は非推奨らしい*1
CN (Common Name) コモンネーム なし

上記設定の自己認証局(CA)の証明書を以下のコマンドで生成します。

openssl req -x509 -new -sha256 -days 365 -extensions v3_ca \
    -config ./openssl.cnf \
    -key self-signed-ca-private-key.pem \
    -out self-signed-ca-cert.pem \
    -subj "/C=JP/ST=Tokyo/L=Hoge-Ku/O=NoppyCA/"

作成した証明書は以下のコマンドで内容を確認することができます。

openssl x509 -in self-signed-ca-cert.pem -text -noout

確認すると以下のような内容が出力されます。Issuerの設定や、Validityの起源が設定通りか確認します。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            df:f2:xx:xx:xx:xx:xx:xx
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, ST=Tokyo, L=Hoge-Ku, O=NoppyCA
        Validity
            Not Before: Nov 16 10:52:37 2025 GMT
            Not After : Nov 14 10:52:37 2035 GMT
        Subject: C=JP, ST=Tokyo, L=Hoge-Ku, O=NoppyCA
        Subject Public Key Info:
以下略

クライアント証明書発行のためのCSR(証明書署名要求)作成

次に、クライアント側でクライアント証明書の発行を認証局(CA)に依頼するための、証明書署名要求(CSR: Certificate Signing Request)を作成します。
したの図の赤枠の部分になります。

クライアントの秘密鍵作成

最初にクライアント用の2048bitのRSA秘密鍵を作成します。

以下のコマンドで秘密鍵を生成します。

openssl genrsa -out mac-client-private-key.pem 2048
CSR(証明書署名要求)の作成

作成したクライアント用の秘密鍵を利用して、CSRを作成します。



クライアントを特定するための識別情報は、以下の内容にしました。

要素 説明 CAの設定値 備考
C (Country) 国名コード JP
ST (State/Province) 都道府県名 Tokyo
L (Locality) 市区町村名 Hoge-Ku
O (Organization) 組織名 NoppyOrg
OU (Organizational Unit) 組織の部署名 なし 現在は非推奨らしい
CN (Common Name) コモンネーム noppymacbookair クライアント証明書を識別するために入力

上記設定のCSR作成のため、以下のコマンドを実行します。

openssl req -new \
    -key mac-client-private-key.pem \
    -out client-csr.pem \
    -subj "/C=JP/ST=Tokyo/L=Hoge-Ku/O=NoppyOrg/CN=noppymacbookair"

以下のコマンドで作成したCSRを確認します。

openssl req -in client-csr.pem -text -noout

CSR(証明書署名要求)を元に自己認証局(CA)でクライアント証明書を発行

ユーザーから渡された(というテイで)CSRの申請内容を元に、認証局(CA)の秘密鍵と証明書を使ってクライアント証明書を発行します。

コマンドは以下になります。
クライアント証明書は、有効期限 1年で作っています。

openssl x509 -req -CAcreateserial -days 365 -extensions v3_client \
    -extfile ./openssl.cnf \
    -in client-csr.pem \
    -CA self-signed-ca-cert.pem \
    -CAkey self-signed-ca-private-key.pem \
    -out mac-client-cert.pem

作成したクライアント証明書は以下のコマンドで確認します。

openssl x509 -in mac-client-cert.pem -text -noout

AWS IAMの設定

ここからはAWS側の設定になります。
手順は、(1)最初にIAM Roles Anywhereの信頼アンカーを設定し、(2)IAMロールを作成、(3)最後にプロファイルを作成、の順番になります。
また今回はマネージメントコンソールで手動作業する手順を記載します。これは、AWS CLIをアクセスキー/シークレットキーを利用して実行することが、セキュリティの観点から非推奨となっており、その代替えとしてRole Anywhereを利用するというシナリオを想定した場合、初期セットアップは手動操作にならざるを得ないという観点からの判断です。

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

最初に、IAM Roles Anywhereの信頼アンカーを設定して、自己認証局(CA)とIAM Roles Anywhereの間の信頼関係を築きます。
具体的には、自己認証局(CA)の証明書を登録した新しい信頼アンカーを作成します。

以下、マネージメントコンソールの操作画面で説明します。

  • IAMロールの画面から、Roles Anywhereの管理画面に遷移する


  • 信頼アンカーを作成するボタンからアンカー作成を行う


  • 信頼アンカーの作成
    • 以下の内容で信頼アンカーを作成する
      • 信頼アンカー名: noppy-self-signed-ca-anchor
      • 認証機関 (CA) ソース: 外部証明書バンドルを選択(ACMを利用する場合は、AWS証明書管理プライベートCAを選ぶ)
      • 外部証明書バンドル: 認証局の証明書(self-signed-ca-cert.pem)の中身を貼り付ける
      • 入力が完了したら、ページ右下の信頼アンカーを作成するボタンを押して作成する。

  • 信頼アンカーのARNを記録する
    • 作成した信頼アンカーをクリックすると、信頼アンカーの詳細が表示される。
    • その中のARNをメモ帳か何かに控えておく
    • 信頼アンカーのARNは、IAMロールの信頼関係の設定で利用する

ロールを作成する

IAM Roles Anywhareで実行するIAMロールを作成します。
IAMロールは以下の設定を行う前提です。

  • IAMロール名: noppy-mac-admin-role
  • 許可ポリシー: AdministratorAccess

マネージメントコンソールのIAMロールの画面から操作を説明します。

  • ロールを作成を実行する

  • 信頼されたエンティティの選択
    • 信頼されたエンティティタイプ: AWSのサービスを選択
    • ユースケース: Roles Anywhereを選択

[w500]

  • 許可を追加
    • AdministratorAccessポリシーを選択
  • 名前、確認、および作成
    • ロール名に、noppy-mac-admin-roleを設定する。
    • ロールを作成でロールを作成する
  • 作成したロールのARNをメモ帳などに控える
    • ロール一覧から作成したロールをクリックし詳細に移動する
    • ロール詳細画面のARN情報を控えておく

ロールの信頼関係に信頼アンカーのCondition句を追加する

特定の信頼アンカーの場合のみ許可するよう、作成したIAMロールの信頼関係にcondition句を追加します。

  • ロール画面から今作成したnoppy-mac-admin-roleをクリックする
  • 信頼関係のタブをおし、信頼ポリシーを編集で編集画面に移動する
  • 信頼ポリシーに以下のように、Condition, ArnEquals, aws:SourceArn句を追加する
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "rolesanywhere.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:SetSourceIdentity",
        "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/x509Issuer/O": "NoppyCA"  <== 自己認証局(CA)の証明書に設定した組織名
        },
        "ArnEquals": {
          "aws:SourceArn": "<作成した信頼アンカーのARN>"
        }
      }
    }
  ]
}

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

最後に、Roles Anywhareのプロファイルを作成します。
プロファイルでは、以下を設定します。

  • プロファイル名: noppy-noppy-mac-admin-profile
  • ロール: noppy-mac-admin-role
  • Session duration: 1 hour ※デフォルト設定

マネージメントコンソールのRoles Anywhereの画面から操作を説明します。

  • プロファイルを作成ボタンから作成を行う

  • 以下を入力してプロファイルを作成する。
    • プロファイル名: noppy-noppy-mac-admin-profile
    • ロール: noppy-mac-admin-role

aws_signing_helperでの設定

aws_signing_helperでの動作確認

まずは、aws_signing_helperを単独で実行して一時認証情報が取得できるか確認します。

必要な情報は以下になります。

  • クライアント証明書のファイルパス: ./mac-client-cert.pem
  • クライアントの秘密鍵のファイルパス: ./mac-client-private-key.pem
  • 信頼アンカーのARN
  • プロファイルのARN
  • IAMロールのARN

実行例は以下のとおりです。実行して画面に一時認証情報としてAccessKeyIdSecretAccessKeySessionTokenが表示されれば認証は成功です。

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

クライアントの秘密鍵と証明書をmacOSのキーチェーンに保管して安全に利用する

秘密鍵やクライアント証明書は、フォルダのなかに格納したままにせず、macOSのキーチェーンに保管するのがセキュリティ上望ましいです。
ここでは以下のユーザーガイドに記載されているmacOSキーチェーンと統合してaws_signing_helper を利用する手順を説明します。

クライアント証明書と秘密鍵をPFXファイル形式に変換する

キーチェーンに登録するには、クライアントの秘密鍵と証明書をPFX形式でパックする必要があります。
PFXファイルは、秘密鍵や証明書(公開鍵証明書、中間証明書など)をまとめて一つのパスワードで保護されたファイルに格納するための形式です。
このPFXファイルはopensslコマンドで以下のように作成することができます。
実行時にPFXファイルのパスワードを求められるので任意のパスワードを設定します。このパスワードはキーチェーンへのインポート時に利用します。

openssl pkcs12 -export \
    -inkey ./mac-client-private-key.pem \
    -in ./mac-client-cert.pem \
    -out mac-client.pfx
カスタムキーチェーンを作成する

ユーザーガイドの説明にしたがってカスタムキーチェーンを作成します。

CREDENTIAL_HELPER_KEYCHAIN_PASSWORD="<ログインパスワード>"

security create-keychain -p ${CREDENTIAL_HELPER_KEYCHAIN_PASSWORD} credential-helper.keychain
security unlock-keychain -p ${CREDENTIAL_HELPER_KEYCHAIN_PASSWORD} credential-helper.keychain
EXISTING_KEYCHAINS=$(security list-keychains | cut -d '"' -f2) security list-keychains -s credential-helper.keychain $(echo ${EXISTING_KEYCHAINS} | awk -v ORS=" " '{print $1}')

command + スペースで、キーチェーンで検索し、「キーチェーンアクセス」を開くと作成したcredential-helperが表示されているのが確認できると思います。


PFXファイルをインポートする

以下のコマンドで作成したPFXファイルから秘密鍵とクライアント証明書をキーチェーンにインポートします。
インポートすると「キーチェーンアクセス」に証明書と鍵が追加されたことが確認できると思います。

UNWRAPPING_PASSWORD="<PFXファイル作成時に指定したパスワード>"

security import ./mac-client.pfx -T ~/bin/aws_signing_helper -P ${UNWRAPPING_PASSWORD} -k credential-helper.keychain
aws_signing_helperで実行確認する

先ほどのaws_signing_helperのコマンドから、秘密鍵とクライアント証明書の指定オプションを削除して実施し、一時認証情報が取得できるか確認します。

aws_signing_helper credential-process \
    --trust-anchor-arn "<信頼アンカーのARN>" \
    --profile-arn "<プロファイルのARN>" \
    --role-arn "<IAMロールのARN>"

AWS CLIから実行する

AWS CLIからaws_signing_helperを利用しRoles Anywhereを利用した一時認証情報を利用できるようにする。

  • 以下のコマンドでAWS CLIの設定を編集する
vi ~/.aws/config
  • configの設定例(先ほど動作確認した aws_signing_helperのコマンドほぼそのまま記載)
[default]
credential_process = aws_signing_helper credential-process
    --trust-anchor-arn <信頼アンカーのARN>
    --profile-arn <プロファイルのARN>
    --role-arn <ロールのARN>
region = ap-northeast-1
output = json
  • 動作テスト
aws sts get-caller-identity

(アドバンスド)特定のクライアント証明書のみ許可する

現状の設定では、設定した信頼アンカーの認証局が発行したクライアント証明書は全て許可されてしまいます。
そこで、特定のクライアント証明書、正確にはクライアント証明書で設定されている識別情報を元に特定の識別情報の証明書のみ許可するようにします。

ユーザーガイドでは以下のページに説明が記載されています。

今回は、クライアント証明書のサブジェクトのCNの文字列が特定の文字列(noppymacbookair)の時のみ許可するようにします。

IAMロールの信頼関係ポリシーのCondition句の変更

IAMロール(noppy-mac-admin-role)の信頼関係設定のConditionStringEqualsに、以下の要素を追加します。

  • "aws:PrincipalTag/x509Subject/CN": "noppymacbookair"

信頼関係ポリシー全体は以下の通りになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "rolesanywhere.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:SetSourceIdentity",
        "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/x509Issuer/O": "NoppyCA",
          "aws:PrincipalTag/x509Subject/CN": "noppymacbookair" <==追加した行
        },
        "ArnEquals": {
          "aws:SourceArn": "<作成した信頼アンカーのARN>"
        }
      }
    }
  ]
}
  • noppymacbookairを任意の文字に変更すると、aws_signing_helperやAWS CLIが失敗することが確認できると思います。



以上の内容はhttps://nopipi.hatenablog.com/entry/2025/11/17/010121より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14