メインコンテンツまでスキップ

IAM Roles Anywhereで証明書の失効確認までちゃんとやる(家に帰るまでが遠足スタイル)

· 約9分
moritalous

前回、IAM Roles Anywhereを試す投稿をしました。

発行した証明書が不要になったときどうしたらいいんだろうと思い追加で調査しました。

想定としては、このようなケースです。

  • プロジェクトに参画していた人が会社を異動したりやめた
  • 開発環境のパソコンを紛失した

細々した手順も前回と異なりますが、上から順番に実行すればOKにしています。

環境

Docker環境を用意しました。

Dockerfile
FROM ubuntu:22.04

RUN apt-get update && \
apt-get install -y openssl sudo ca-certificates && \
adduser ubuntu --disabled-password && \
echo "ubuntu ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

USER ubuntu
WORKDIR /home/ubuntu
  • Dockerビルド
Shell
docker build -t ca .
  • Docker起動
Shell
mkdir ubuntu
docker run -it --rm -v $PWD/ubuntu:/home/ubuntu ca

プライベート認証局を構築する

  1. ルートCAのパスフレーズをファイルに保存

    Ubuntu Container
    echo "rootCA" >> .rootca.passphrase
  2. OpenSSLの設定ファイルをコピーする

    一部設定を変更するため、設定ファイルを手元にコピーします。

    Ubuntu Container
    cp /etc/ssl/openssl.cnf ./
  3. OpenSSLの設定ファイルを変更する

    変更するのは2箇所です。

    • usr_certセクションのkeyUsageのコメントアウトを解除
    • v3_caセクションのkeyUsageのコメントアウトを解除し、digitalSignatureを追加
    ~/openssl.cnf
        [ usr_cert ]

    # These extensions are added when 'ca' signs a request.

    # This goes against PKIX guidelines but some CAs do it and some software
    # requires this to avoid interpreting an end user certificate as a CA.

    basicConstraints=CA:FALSE

    # This is typical in keyUsage for a client certificate.
    - # keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    + keyUsage = nonRepudiation, digitalSignature, keyEncipherment

    # PKIX recommendations harmless if included in all certificates.
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer

    # This stuff is for subjectAltName and issuerAltname.
    # Import the email address.
    # subjectAltName=email:copy
    # An alternative to produce certificates that aren't
    # deprecated according to PKIX.
    # subjectAltName=email:move

    # Copy subject details
    # issuerAltName=issuer:copy

    # This is required for TSA certificates.
    # extendedKeyUsage = critical,timeStamping

    ---

    [ v3_ca ]


    # Extensions for a typical CA


    # PKIX recommendation.

    subjectKeyIdentifier=hash

    authorityKeyIdentifier=keyid:always,issuer

    basicConstraints = critical,CA:true

    # Key usage: this is typical for a CA certificate. However since it will
    # prevent it being used as an test self-signed certificate it is best
    # left out by default.
    - # keyUsage = cRLSign, keyCertSign
    + keyUsage = cRLSign, keyCertSign, digitalSignature

    # Include email address in subject alt name: another PKIX recommendation
    # subjectAltName=email:copy
    # Copy issuer details
    # issuerAltName=issuer:copy

    # DER hex encoding of an extension: beware experts only!
    # obj=DER:02:03
    # Where 'obj' is a standard or added object
    # You can even override a supported extension:
    # basicConstraints= critical, DER:30:03:01:01:FF
  4. 設定ファイルを参照するように環境変数をセットする

    Ubuntu Container
    export OPENSSL_CONFIG="-config ./openssl.cnf"
  5. プライベートCAを作成する

    Ubuntu Container
    /usr/lib/ssl/misc/CA.pl -newca \
    -extra-req "-passout file:./.rootca.passphrase" \
    -extra-req "-subj /C=JP/ST=Tokyo/O=Organization/CN=rootCA"

    途中でパスフレーズの入力を求められますので、.rootca.passphraseの内容を入力してください。

    Enter pass phrase for ./demoCA/private/cakey.pem:

    💡:passoutの指定はうまく行ったのですがpassinの指定ができず、このような形態になっています。。

    成功するとこのようなディレクトリが作成されます。

    tree
    demoCA
    |-- cacert.pem
    |-- careq.pem
    |-- certs
    |-- crl
    |-- crlnumber
    |-- index.txt
    |-- index.txt.attr
    |-- index.txt.old
    |-- newcerts
    | `-- 703350FF039DE361CD8516452379AE3E2F386DBA.pem
    |-- private
    | `-- cakey.pem
    `-- serial

    4 directories, 9 files

クライアント証明書を作成する

  1. クライアント証明書用のパスフレーズをファイルに保存

    Ubuntu Container
    echo client_pass >> .client.passphrase
  2. CSRを作成

    Ubuntu Container
    /usr/lib/ssl/misc/CA.pl -newreq \
    -extra-req "-passout file:./.client.passphrase" \
    -extra-req "-subj /C=JP/ST=Tokyo/O=Organization/CN=Client1"

    newreq.pemnewkey.pemが生成されます。

  3. 署名を要求

    Ubuntu Container
    /usr/lib/ssl/misc/CA.pl -sign

    ルートCAのパスフレーズを入力します。

    Enter pass phrase for ./demoCA/private/cakey.pem:

    newcert.pemが生成されます。

  4. パスフレーズを解除したプライベートキーを生成

    Ubuntu Container
    openssl rsa \
    -in newkey.pem \
    -out decryptkey.pem \
    -passin file:./.client.passphrase

    decryptkey.pemが生成されます。

  5. PKCS#12を生成

    Ubuntu Container
        /usr/lib/ssl/misc/CA.pl -pkcs12 \
    -extra-pkcs12 "-passin file:./.client.passphrase"

    newcert.p12が生成されます。

マネジメントコンソールでIAM Roles Anywhereを設定する

  1. IAM Roles Anywhereの管理画面を表示し、信頼アンカーを作成するボタンをクリックします。

    image.png

  2. 認証機関 (CA) ソースで外部証明書バンドルを選択し、外部証明書バンドルにdemoCA/cacert.pemの値を貼り付けます。信頼アンカーを作成するボタンをクリックします。

    image.png

  3. [IAMロール]の管理画面に遷移し、ロールを作成ボタンをクリックします。

  4. 信頼されたエンティティタイプをAWSのサービスとし、ユースケースはRoles Anywhereを選択します。

    image.png

  5. 任意のポリシーを追加します。

    image.png

  6. ロールに名前をつけ、ロールを作成ボタンをクリックします。

    image.png

  7. IAM Roles Anywhereの管理画面に戻り、プロファイルを作成ボタンをクリックします。

    image.png

  8. プロファイルの名称を入力し、ロールに先程作成したIAMロールを選択し、プロファイルを作成ボタンをクリックします。

    image.png

  9. 以下のARNをメモします。

    • 信頼アンカーのARN
    • プロファイルのARN
    • IAMロールのARN

クレデンシャルヘルパーツールをダウンロードする

こちらにOSごとのヘルパーツールが用意されているので、OSに合わせてダウンロードします。

💡:コンテナ内にはcurlもwgetも存在しないのでホストOS側で入手し、/usr/local/bin/ディレクトリ内に配置してください。実行権限の付与も忘れずに。

一時認証情報を生成する

Ubuntu Container
export TRUST_ANCHOR_ARN=arn:aws:rolesanywhere:ap-northeast-1:...
export PROFILE_ARN=arn:aws:rolesanywhere:ap-northeast-1:...
export ROLE_ARN=arn:aws:iam::...

aws_signing_helper credential-process \
--certificate newcert.pem \
--private-key decryptkey.pem \
--trust-anchor-arn $TRUST_ANCHOR_ARN \
--profile-arn $PROFILE_ARN \
--role-arn $ROLE_ARN
{"Version":1,"AccessKeyId":"...","SecretAccessKey":"...","SessionToken":"...","Expiration":"2023-10-25T12:08:26Z"}

一時認証情報の取得がうまくいきました。

~/.aws/configに記述するとAWS CLIやSDKからも利用できます。

~/.aws/config
[default]
credential_process = aws_signing_helper credential-process
--certificate <<client-cert.pemの絶対パス>>
--private-key <<client-key.pemの絶対パス>>
--trust-anchor-arn <<信頼アンカーのARN>>
--profile-arn <<プロファイルのARN>>
--role-arn <<ロールのARN>>

証明書を失効させる

それでは本題の証明書の失効を試します。

  1. 証明書を失効

    Ubuntu Container
    /usr/lib/ssl/misc/CA.pl -revoke newcert.pem 

    ルートCAのパスフレーズを入力します。

    Enter pass phrase for ./demoCA/private/cakey.pem:

    これでプライベートCA内の情報としては失効されました。

    demoCA/index.txt
    V   261024102847Z       703350FF039DE361CD8516452379AE3E2F386DBA    unknown /C=JP/ST=Tokyo/O=Organization/CN=rootCA
    R 241024103344Z 231025111311Z 703350FF039DE361CD8516452379AE3E2F386DBC unknown /C=JP/ST=Tokyo/O=Organization/CN=Client1

    2行目の先頭がRでRevokeの意味です。

  2. CRL(証明書失効リスト)を作成

    Ubuntu Container
    openssl ca -gencrl -crldays 365 -out crl.pem 

    ルートCAのパスフレーズを入力します。

    Enter pass phrase for ./demoCA/private/cakey.pem:

    crl.pemが生成されます。

  3. CRLをroles Anywhereにインポートする

    Ubuntu Container
    aws rolesanywhere import-crl \
    --crl-data "`base64 crl.pem`" \
    --name crl \
    --trust-anchor-arn ${TRUST_ANCHOR_ARN}
    Response
    {
    "crl": {
    "createdAt": "2023-10-24T13:41:35.502802+00:00",
    "crlArn": "arn:aws:rolesanywhere:ap-northeast-1:...",
    "crlData": "...",
    "crlId": "d3340be6-7d99-4607-9a76-c9be1b0ca18b",
    "enabled": false,
    "name": "crl",
    "trustAnchorArn": "arn:aws:rolesanywhere:ap-northeast-1:...",
    "updatedAt": "2023-10-24T13:41:35.502802+00:00"
    }
    }

    CRLのインポートができました。

  4. CRLを有効化する

    Ubuntu Container
    aws rolesanywhere enable-crl --crl-id <<前のコマンドのResponseにあるCRL ID>>

    これで失効が有効になりました。

失効後、ほんとにアクセスできないか確認

Ubuntu Container
aws_signing_helper credential-process \
--certificate newcert.pem \
--private-key decryptkey.pem \
--trust-anchor-arn $TRUST_ANCHOR_ARN \
--profile-arn $PROFILE_ARN \
--role-arn $ROLE_ARN
AccessDeniedException: Certificate revoked

やりました。

参考