ADCS(Active Directory 証明書サービス)で自動発行したクライアント証明書でIAM Roles Anywhereを使ってみた

非AWS環境のWindowsクライアントからAWS環境にアクセスする際の手間が減らせるかも?
2022.07.09

MADグループ@大阪の岩田です。先日リリースされた新機能IAM Roles AnywhereのPKIとしてADCS(Active Directory 証明書サービス)を使うとAD内のコンピューター/ユーザーにクライアント証明書を自動発行しつつ、自動発行されたクライアント証明書を使って簡単にAWS環境にアクセスできるのでは?と思ったので、試しにやってみました。

環境

今回検証に利用した環境です

  • OS: Windows Server2019
    • フォレストの機能レベル:Windows Server2016
    • ドメインの機能レベル:Windows Server2016
  • aws_signing_helper.exe: 1.0.0
  • AWS CLI: 2.7.13

ADCSの構築と証明書自動発行の設定

まずADDS・ADCSを構築してクライアント証明書が自動発行されるまでの設定を行います。設定手順は以下のサイトを参考にさせて頂きました。

注意点として証明書テンプレートを設定する際に秘密鍵のエクスポートを許可しておきましょう

IAM Roles Anywhereの設定

ADCSの設定ができたらIAM Roles Anywhereの設定を行います。設定手順は以下ブログの通りですが、信頼アンカー作成のためにCA証明書を登録する必要があるので、その部分だけ補足します。

ADCSのCA証明書エクスポートは証明書マネージャー ツール等から実施できます。certlm.mscでスナップインを起動したらADCSのCA証明書を探し、右クリック→ALL Tasks→Exportを選択します。

Nextをクリック後、ファイル形式にBase-64 encoded X.509を選択してエクスポート処理を実行していきます。

出力されたファイルを開くと-----BEGIN CERTIFICATE-----から始まり-----END CERTIFICATE-----で終わるテキストが出力されています。このテキストをIAM Roles Anywhereのマネコンに貼り付けましょう。

証明書と秘密鍵の準備

ここからはIAM Roles Anywhereを使ってAWSにアクセスするクライアント側の設定を行います。以下の操作は今回構築したADに参加した適当なコンピューターで実施します。

IAM Roles Anywhereを利用するためのクレデンシャルヘルパー(aws_signing_helper.exe)にはクライアント証明書&秘密鍵が必要になります。少し面倒ですが、証明書ストアからPFX形式でクライアント証明書&秘密鍵をエクスポートし、PFX形式からPEM形式に変換します。

今回はユーザー向けのクライアント証明書でやってみます。まずcertmgr.mscで証明書のスナップインを起動し、ドメインユーザー向けに発行された証明書のエクスポート処理を起動します。

秘密鍵をエクスポートするオプションを選択します

ファイル形式に.PFXを選択してそのままエクスポート処理を完了させます。

これでPFX形式の秘密鍵が出力されたのでOpenSSLを使ってPEM形式に変換します。

$ openssl pkcs12 -in <PFX形式のクライアント証明書> -nocerts -nodes -out <PEM形式に変換した後の秘密鍵のファイル名>
$ openssl pkcs12 -in <PFX形式のクライアント証明書> -clcerts -out <PEM形式に変換した後のクライアント証明書のファイル名>

※ 2022/7/13追記 いちいち手動で証明書ストアから出力した証明書をPEMに変換するのが面倒だったので、.NET Coreのプログラムでエクスポートできないか以下のブログで挑戦してみました

クレデンシャルヘルパー関連の設定準備

秘密鍵と証明書が準備できたので、クレデンシャルヘルパーで取得した一時クレデンシャルを利用してAWS CLIを叩けるように設定していきます。まずWindows向けのクレデンシャルヘルパーであるaws_signing_helper.exeを以下のリンクからダウンロードします。

https://s3.amazonaws.com/roles-anywhere-credential-helper/CredentialHelper/latest/windows_amd64/aws_signing_helper.exe

ダウンロードしたaws_signing_helper.exe%USERPROFILE%\.aws に保存しておきます。

ここまでできたら、まずはaws_signing_helper.exe単体で動作確認します。

C:> cd %USERPROFILE%\.aws
C:\Users\iwata\.aws>aws_signing_helper.exe credential-process --certificate <PEM形式の証明書> --private-key <PEM形式の秘密鍵> --trust-anchor-arn <信頼アンカーのARN>  --profile-arn <プロファイルのARN> --role-arn <IAMロールのARN>

{"Version":1,"AccessKeyId":"...","SecretAccessKey":"...","SessionToken":"...","Expiration":"2022-07-..."}

正常に実行完了し、一時クレデンシャル情報が取得できればOKです。

続いてAWS CLIがクレデンシャルヘルパーを利用するように%USERPROFILE%\.aws\config を設定します。ここではiwataというプロファイルを作成しています。

[profile iwata]
    credential_process = ./aws_signing_helper credential-process --certificate <PEM形式の証明書> --private-key <PEM形式の秘密鍵> --trust-anchor-arn <信頼アンカーのARN>  --profile-arn <プロファイルのARN> --role-arn <IAMロールのARN>

準備ができたので適当なコマンドを叩いてみましょう。ここではaws s3 lsでS3バケットの一覧でも表示してみます。

無事に表示できました!めでたくアクセスキーを発行することなくADCSで自動発行した証明書を利用してAWS CLIが叩けています。

まとめ

ADCSで自動発行したクライアント証明書でAWS環境にアクセスできるとAWS外のAD環境からAWS環境へのアクセスを簡素化できるのでは?と思って試してみました。

  • クレデンシャルヘルパーを利用するためにはPFX形式ではなくPEM形式のクライアント証明書&秘密鍵が必要
  • 証明書ストア上のクライアント証明書がファイルシステム上のどこに保存されているか良く分からなかった

という問題があったので、今回はひと手間かませて証明書ストアからPFXでエクスポートしたクライアント証明書&秘密鍵をOpenSSLでPEM形式に変換してから利用しました。PowerShell等でクレデンシャルヘルパーを自作し、証明書ストアから適切な証明書を取得してPEM形式のクライアント証明書&秘密鍵を抽出する処理が書ければこれらの手間は省略できるかもしれません。できれば今後挑戦してみたいと思います。

参考