IAM Roles Anywhere + 自己署名証明書 を爆速で作ってみた
背景
去年7月にIAM Roles Anywhereがリリースされ、アクセスキー管理が不要でAWSの外部のリソースに対してIAMロールを割り当てるできるようになりました。
しかし公式のドキュメントには自己署名証明書を作成する方法が記載されていませんし、現在ネット上に上がっている記事では手順も複雑でなかなか容易に作成できないものが多いと感じました。
なので今回はIAM Roles Anywhere + 自己署名証明書を爆速で作成する方法を紹介します。
また、GitHub上にIAM Roles Anywhere作成のスクリプトも公開していますので、良かったらご活用ください。
1. cfsslのインストール
まずはcfsslをインストールします。cfsslは簡単にCSR、秘密鍵を作成できるツールです。
opensslですといろんなオプションを指定しないといけないし、アルゴリズムを間違えたら信頼アンカーに登録できないなどの問題がるので今回はやめます。
brew install cfssl
2. CA情報のJSONファイル作成
証明書を生成するため、下記のようにca.json
という設定ファイルを作成します。
{
"hosts":[
"ドメイン名"
],
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"国コード",
"ST":"都道府県",
"L":"市区町村",
"O":"組織名",
"OU":"組織単位名"
}
]
}
例:
{
"hosts":[
"example.com"
],
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"JP",
"ST":"Tokyo",
"L":"Shinjuku",
"O":"Example",
"OU":"Example"
}
]
}
3. CSR、秘密鍵の作成
下記のコマンドでCSR、秘密鍵を作成します。
❯ cfssl gencert -initca ca.json | cfssljson -bare ca
---
2023/01/29 04:05:02 [INFO] generating a new CA key and certificate from CSR
2023/01/29 04:05:02 [INFO] generate received request
2023/01/29 04:05:02 [INFO] received CSR
2023/01/29 04:05:02 [INFO] generating key: rsa-2048
2023/01/29 04:05:02 [INFO] encoded CSR
2023/01/29 04:05:02 [INFO] signed certificate with serial number 283091034192127804232277989744244500642103511771
---
❯ ls
ca-key.pem ca.csr ca.json ca.pem
4. IAM Roles Anywhereのセットアップ
続いて、IAM Roles Anywhereまわりのセットアップを行います。
4-1. 信頼アンカーの登録
AWS IAMコンソールを開き、下部にある「Roles Anywhere」のことろに「管理」をクリックします。
「信頼アンカーを作成する」をクリックします。
「信頼アンカーの作成」画面が開くので、下記のように入力し、「信頼アンカーを作成する」をクリックします。
- 信頼アンカー名:任意の名前
- 外部証明書バンドル:ステップ3で作成した
ca.pem
の内容をコピペする - タグ:任意
無事に登録できました。
4-2. IAMロールの作成
IAMコンソールの「ロール」をクリックし、「ロールを作成」をクリックします。
「信頼されたエンティティを選択」のところで「カスタム信頼ポリシー」を選択し、下記のように入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rolesanywhere.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession",
"sts:SetSourceIdentity"
],
"Condition": {
"StringEquals": {
"aws:PrincipalTag/x509Subject/OU": "Example" // ここをステップ3で設定した「組織単位名」と一致させる
}
}
}
]
}
続いて、許可ポリシーの追加及びロール名の設定を行い、「ロールの作成」をクリックします。
今回はAmazonS3FullAccess
を付与してみます。
4-3. IAM Roles Anywhere プロファイルの作成
続いて、IAM Roles Anywhereのコンソールに戻って、
下部にある「プロファイル」のところに「作成」をクリックし、下記のように入力してプロフィールを作成します。
- プロファイル名:任意の名前
- ロール:ステップ4-2で作成したロール
無事に作成できました。
5. 認証用の証明書を生成
続いて、下記のコマンドで認証用の設定ファイル及び証明書を生成します。
5-1. csr.jsonの作成
{
"CN": "サブドメイン名",
"names":[
{
"C":"国コード",
"ST":"都道府県名",
"L":"市区町村名",
"O":"組織名",
"OU":"組織単位名"
}
]
}
例:
{
"CN": "test-user.example.com",
"names":[
{
"C":"JP",
"ST":"Tokyo",
"L":"Shinjuku",
"O":"Example",
"OU":"Example"
}
]
}
5-2. 証明書の作成
下記のコマンドで証明書を生成します。
cfssl gencert -ca ca.pem -ca-key ca-key.pem csr.json| cfssljson -bare <サブドメイン名>
---
❯ cfssl gencert -ca ca.pem -ca-key ca-key.pem csr.json| cfssljson -bare test-user.example.com
2023/01/29 05:17:30 [INFO] generate received request
2023/01/29 05:17:30 [INFO] received CSR
2023/01/29 05:17:30 [INFO] generating key: ecdsa-256
2023/01/29 05:17:30 [INFO] encoded CSR
2023/01/29 05:17:30 [INFO] signed certificate with serial number 159099496015773154592019475546289297138038316974
2023/01/29 05:17:30 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
---
❯ ls
ca-key.pem ca.csr ca.json ca.pem csr.json test-user.example.com-key.pem test-user.example.com.csr test-user.example.com.pem
以上で証明書の作成は完了でしました。
6. 検証
すべての前準備が完了したので、早速検証してみましょう。
aws_signing_helper
のインストール
6.1 まずは、公式のドキュメントにてaws_signing_helperをインストールします。
wget https://rolesanywhere.amazonaws.com/releases/1.0.4/X86_64/Linux/aws_signing_helper -O /usr/local/bin/aws_signing_helper
chmod 755 /usr/local/bin/aws_signing_helper
6.2 AWS credentials情報を取得する
次に、aws_signing_helper
でAWS credentials情報を取得します。
-
--certificate
:<サブドメイン名>.pem -
--private-key
:<サブドメイン名>-key.pem -
--trust-anchor-arn
:信頼アンカーのARN -
--profile-arn
:プロファイルのARN -
--role-arn
:ロールのARN
aws_signing_helper credential-process \
--certificate <サブドメイン名>.pem \
--private-key <サブドメイン名>-key.pem \
--trust-anchor-arn <信頼アンカーのARN> \
--profile-arn <プロファイルのARN> \
--role-arn <ロールのARN>
検証の例:
❯ aws s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".
---
❯ output=$(aws_signing_helper credential-process \
--certificate test-user.example.com.pem \
--private-key test-user.example.com-key.pem \
--trust-anchor-arn arn:aws:rolesanywhere:ap-northeast-1:1234567890:trust-anchor/470df497-59be-47dc-82c0-f199e5e83850 \
--profile-arn arn:aws:rolesanywhere:ap-northeast-1:1234567890:profile/d3f02402-1eda-4c62-a51c-f1d5cf020c44 \
--role-arn arn:aws:iam::1234567890:role/test-role)
export AWS_ACCESS_KEY_ID=$(echo $output | jq -r '.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo $output | jq -r '.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo $output | jq -r '.SessionToken')
---
❯ aws s3 ls
2021-01-29 05:29:00 test-bucket
以上で、Roles Anywhereを利用した認証ができることが確認できました。
Discussion