🔥

IAM Roles Anywhere + 自己署名証明書 を爆速で作ってみた

2023/01/29に公開

背景

去年7月にIAM Roles Anywhereがリリースされ、アクセスキー管理が不要でAWSの外部のリソースに対してIAMロールを割り当てるできるようになりました。

しかし公式のドキュメントには自己署名証明書を作成する方法が記載されていませんし、現在ネット上に上がっている記事では手順も複雑でなかなか容易に作成できないものが多いと感じました。

なので今回はIAM Roles Anywhere + 自己署名証明書を爆速で作成する方法を紹介します。

また、GitHub上にIAM Roles Anywhere作成のスクリプトも公開していますので、良かったらご活用ください。
https://github.com/the-exile-110/fast-create-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」のことろに「管理」をクリックします。
IAM Roles Anywhere-管理

「信頼アンカーを作成する」をクリックします。
IAM Roles Anywhere-信頼アンカーを作成する-1

「信頼アンカーの作成」画面が開くので、下記のように入力し、「信頼アンカーを作成する」をクリックします。

  • 信頼アンカー名:任意の名前
  • 外部証明書バンドル:ステップ3で作成したca.pemの内容をコピペする
  • タグ:任意
    IAM Roles Anywhere-信頼アンカーを作成する-2

無事に登録できました。
IAM Roles Anywhere

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で設定した「組織単位名」と一致させる
                }
            }
        }
    ]
}

IAMロールの作成-1

続いて、許可ポリシーの追加及びロール名の設定を行い、「ロールの作成」をクリックします。
今回はAmazonS3FullAccessを付与してみます。

IAMロールの作成-2

4-3. IAM Roles Anywhere プロファイルの作成

続いて、IAM Roles Anywhereのコンソールに戻って、
下部にある「プロファイル」のところに「作成」をクリックし、下記のように入力してプロフィールを作成します。

  • プロファイル名:任意の名前
  • ロール:ステップ4-2で作成したロール

IAM Roles Anywhere-プロファイルの作成-1
IAM Roles Anywhere-プロファイルの作成-2
無事に作成できました。
IAM Roles Anywhere-プロファイルの作成-3

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. 検証

すべての前準備が完了したので、早速検証してみましょう。

6.1 aws_signing_helperのインストール

まずは、公式のドキュメントにて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