👺

IAM Roles Anywhereハンズオンをやってみた

2023/11/21に公開

概要

本内容は以下に2023年11月21日時点のマネジメントコンソール画面を添えたものとなります。

https://github.com/harunobukameda/AWS-IAM-Roles-Anywhere-AWS-Certificate-Manager/blob/main/IAM Roles Anywhere.docx

【オリジナルコンテンツとの差異】

・プライベート認証期間(CA)を作成時、モードオプションの選択肢が追加 etc..

【経緯】
上記ハンズオンに参加させていただいた当時の私のレベル感では、残念ながら手は動かしていながらも自分が何をやっているか理解出来ていないまま完走してしまいました。

復習・備忘録の意味と合わせ、他に同機能について良いハンズオンが多く見当たらなかった為、オリジナルのコンテンツが皆様の目に止まればという思いもあり、手順を残してます。


注意点(※必読)

本ハンズオンはAWS PCAの作成を含みます。
本記事作成時点では30日の無料期間が存在していますが、削除し忘れるとかなり高い料金を取られてしまいます。(必ずご自身でもその時点で無料期間の有無を確認ください。)

https://aws.amazon.com/jp/private-ca/pricing/

※削除を忘れなければ微々たる料金ですがcloud9の料金も発生します。

※必ず片付けまで完遂ください。また恐縮ながら本記事内の手順や内容の解釈に相違・間違いがあった事で発生した料金その他につき当方は一切責任を負いません。自己責任にご理解の上、オリジナルコンテンツを進める参考程度にお考えください。


プライベートCAを作成

AWS Private Certificate Authorityコンソールにアクセスします。

「プライベートCAを作成」をクリックします。


モードオプションは「汎用」のままとします。

公式ドキュメントによると

汎用 — 任意の有効期限を設定できる証明書を発行します。これがデフォルトです。

短期証明書 — 最大有効期間が 7 日間の証明書を発行します。有効期間を短くすることで失効メカニズムの代わりになる場合もあります。


CAタイプのオプションは「ルート」のままとします。


共通名(CN)にMMDDを入力し、(MMDDは日付)


・キーアルゴリズムのオプション
・証明書執行のオプション
はデフォルトのままとします。

IAM Roles AnywhereはCRLに対応しており、有効期間中であっても失効された電子証明書用いた認証を拒否することが可能ですので商用環境では[CRLのディストリビューション]にチェックをつけることをお勧めします。公式ドキュメント



赤枠記載内容をよく理解した上、[CAを作成]をおします。


「正常にリクエストされました。」と表示されました。
「アクション」をクリックします。


「CA証明書をインストール」をクリックします。


「確認してインストール」をクリックします。


アクティブになった事を確認します。


信頼アンカーの作成

IAMコンソールにアクセスします。

左サイドカラムから「ロール」をクリックします。
ロールが複数表示されているブロックより更に下にスクロールして「Roles Anyware」ブロック内の「管理」をクリックします。


「信頼アンカーを作成する」をクリックします。


任意の名前を入力し、AWS証明書管理プライベートCAに先ほど作成したCAが表示されています選択状態である事を確認します。

(※この時点でここが表示されていない場合、恐らく右上のリージョンがヴァージニアになっている事が考えられます。/これはIAMがグローバルリソースになる為、コンソール上ヴァージニアが選択された状態で開かれる事が要因となります。一方で証明書はリージョナルですので東京を選択する必要があります。)


「信頼アンカーを作成する」をクリックします。


「Trust anchor: test の作成に成功しました。最初にRoles Anywhere信頼ポリシーでlAMロールを設定し、セッションを設定する手順に従ってください。」との事です。


ロールを作成する

一段階上の階層に戻る為に、左サイドカラムからサイド「ロール」をクリックし、「ロールを作成」をクリックします。


「カスタム信頼ポリシー」を選択します。


以下をコピーします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "rolesanywhere.amazonaws.com"
                ]
            },
            "Action": [
              "sts:AssumeRole",
              "sts:TagSession",
              "sts:SetSourceIdentity"
            ]
        }
    ]
}


枠内に貼付し「次へ」をクリックします。


検索欄に"AmazonEC2FullAccess"と入力し、下部でチェックをつけ、「次へ」をクリックします。


任意のロール名を入力します。


「ロールを作成する」をクリックします。


無事作成されたようです。


プロファイルを作成

プロファイルは、Roles Anywhere で正常に認証された後に適用される事前定義された許可のセットです。

こちらも東京リージョンで実行している事を必ず確認してください。

先ほどと同じく、「Roles Anyware」ブロック内の「管理」をクリックします。


最下部プロファイルブロックから「プロファイルを作成」をクリックします。


プロファイル名に任意の名前を入力し、先ほど作成されたロールを選択します。


下までスクロールし、「プロファイルを作成」をクリックします。


無事に作成されたようです。


Cloud9環境でcredential_helperツールをダウンロード

Cloud9コンソールにアクセスします。

「環境を作成」をクリックします。


任意の名前を入力します。


他の設定は全てデフォルトのまま「作成」をクリックします。



数分待ちます。


正常に作成されたようです。


「開く」をクリックします。


枠内がターミナル部分となります。

以下コマンドを実行し、credential_helperツールというRoles Anywhere用のツールをダウンロードします。

$ sudo curl https://s3.amazonaws.com/roles-anywhere-credential-helper/CredentialHelper/latest/linux_amd64/aws_signing_helper --output aws_signing_helper

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10.7M  100 10.7M    0     0  3859k      0  0:00:02  0:00:02 --:--:-- 3858k


次に実行権限を付与します。

$ sudo chmod +x aws_signing_helper 

ACMコンソールでプライベート証明書をリクエスト

ACMコンソールにアクセスします。

「証明書をリクエスト」をクリックします。


「プライベート証明書をリクエスト」を選択し「次へ」をクリックします。


「証明機関」から先ほど作成したPCAを選択し、「完全修飾ドメイン名」に任意のドメイン名を入力します。(今回は適当でいいです。)


「私は、ACM に必要な許可がなければ、この認証機関からのプライベート証明書の発行を更新できないことを理解しています。」にチェックをいれ、「リクエスト」をクリックします。


正常にリクエストされたようです。「証明書を表示」をクリックします。


「エクスポート」をクリックします。


適当なパスフレーズを入力し、「この証明書を初めてエクスポートする場合、自分のアカウントに ACM より料金が請求されることを理解しています。この請求により、証明書の更新 (13 か月) がリセットされます。」にチェックを入れ、[PEMエンコーディングを作成]をクリックします。


3つの「ダウンロード」をクリックし、
・private_key.txt
・certificate_chain.txt
・certificate.txt
がダウンロードされた事を確認し「完了」をクリックします。


以下ファイルの内、

・Private_key.txt
・Certificate_key.txt

の拡張子をpemに変更します。

private_key.pem に対してかかっているパスフレーズを以下のコマンドで外します 。

$ sudo openssl rsa -in private_key.pem -out private_key_nopass.pem
Enter pass phrase for private_key.pem:
writing RSA key


右上の歯車のアイコン→「AWS Settings」→「AWS managed temporary credential」トグルをオフにします。


<>としてある値×3をコンソールから取得して書き換え、入力します。

$ ./aws_signing_helper credential-process \
      --certificate ./certificate.pem \
      --private-key ./private_key_nopass.pem \
      --trust-anchor-arn <トラストアンカーARN> \
      --profile-arn <プロファイルARN> \
      --role-arn <IAMRロールARN> \
      > file1q:q1


以下のようなjsonが返ります。

{"Version":1,"AccessKeyId":(※中略),"Expiration":"2023-11-21T11:48:38Z"}


返ってきた値をそれぞれ以下に埋めて実行します。

$ export AWS_ACCESS_KEY_ID=xxxx
$ export AWS_SECRET_ACCESS_KEY=xxxx
$ export AWS_SESSION_TOKEN=xxxx


以下を実行してみます。

$aws ec2 describe-instances --region ap-northeast-1


結果が確り返ってきているようであれば成功です。
失敗している時は以下が返ってきます。

$ An error occurred (AuthFailure) when calling the DescribeVolumes operation: AWS was not able to validate the provided access credentials

Cloud Trailコンソールから結果を確認

Cloud Trailコンソールに移動します。

CloudTrailのイベント履歴を見るとRolesAnywareから実行された履歴が確認出来ます。

最後に以下のコマンドを実行すると、今日作成したIAMロールから正しくassumeRoleされていることがわかります。

$ aws sts get-caller-identity
{
    "UserId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "Account": "xxxxxxxxxxx",
    "Arn": "arn:aws:sts::xxxxxxxxxxxx:assumed-role/test_iam_roles_anyware_role/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

お片付け

・Cloud9の削除
・プライベート証明書の削除(ACM)
・プライベートCAの削除(復元可能期間は7日にして削除)
・IAMロールの削除


以上でした

有難うございました。

Discussion