LoginSignup
0
0

More than 1 year has passed since last update.

クロスアカウントで認証情報レポートを取得

Posted at

はじめに

AWSアカウントでマルチアカウントの導入が進んでいくと監査や管理を目的として、1つのAWSアカウント(管理アカウント)から複数のメンバーアカウントへクロスアカウントアクセスが必要になってきます。

当記事では自動化までは行わずに管理アカウントからIAMの認証情報レポートをクロスアカウントアクセスで生成、取得、結合をローカルからAWS CLIを利用しIAMユーザーの棚卸しを行います。

前提条件

  • 当記事のように利用するIAMユーザーのMFA保護が有効となっている
  • クロスアカウントアクセスを行うためのIAMロールがメンバーアカウントに作成されている必要がある

Require

  • AWS CLI
  • ローカル端末でクロスアカウントで実行するため、以下が必要
    • 管理アカウントのIAMユーザーの認証情報
    • メンバーアカウントのAWS CLIプロファイルの設定

流れ

  • ~/.aws/configの設定
  • 環境変数へ一時認証情報を払い出す
  • 認証情報レポートの生成
  • 認証情報レポートの取得
  • 認証情報レポートの結合

~/.aws/configの設定

事前にクロスアカウントアクセスを行うためにプロファイルの設定を行います。
クロスアカウントアクセスを行うためのIAMロールがメンバーアカウントに作成されている必要があります。(当記事では手順を割愛しています)

~/.aws/config
[profile credential-report-account-a]
region = us-east-1
output = json
role_arn = arn:aws:iam::123456789012:role/credential-report-role
credential_source = Environment

[profile credential-report-account-b]
region = us-east-1
output = json
role_arn = arn:aws:iam::123456789012:role/credential-report-role
credential_source = Environment

環境変数へ一時認証情報を払い出す

以下の記事を参考に管理アカウントのMFA保護されたIAMユーザーの一時認証情報を環境変数へ設定してください。

認証情報レポートの生成

コード

#!/bin/bash

# --------------------------------------------------------------------------------
# 認証情報レポート生成
# --------------------------------------------------------------------------------

PROFILE_NAMES=(\
    "credential-report-account-a"\
    "credential-report-account-b"\
)

for profile_name in ${PROFILE_NAMES[@]}
do
    TARGET_AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --profile ${profile_name} --output text)

    aws iam generate-credential-report \
        --region us-east-1 \
        --profile ${profile_name} \
        --output text \
        --query '[State, Description]' | sed "s/^/${TARGET_AWS_ACCOUNT_ID}\t/"
done

認証情報レポートの取得

コード

#!/bin/bash

# --------------------------------------------------------------------------------
# 認証情報レポート取得
# --------------------------------------------------------------------------------

PROFILE_NAMES=(\
    "credential-report-account-a"\
    "credential-report-account-b"\
)

for profile_name in ${PROFILE_NAMES[@]}
do
    TARGET_AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --profile ${profile_name} --output text)

    aws iam get-credential-report \
        --region us-east-1 \
        --profile ${profile_name} \
        --output text \
        --query 'Content' | base64 -D > ./dest/credential_report-${TARGET_AWS_ACCOUNT_ID}.csv

    if [ $? -eq 0 ]; then
        echo -e "${TARGET_AWS_ACCOUNT_ID}\t認証情報レポート取得"
    else
        echo -e "${TARGET_AWS_ACCOUNT_ID}\t認証情報レポート取得[NG]"
    fi
done

認証情報レポートの結合

最後に取得したCSVファイルをすべて結合します。

コード

#!/bin/bash

# --------------------------------------------------------------------------------
# 認証情報レポート結合
# --------------------------------------------------------------------------------

# ヘッダ行削除、ソート
cat ./dest/credential_report-*.csv \
| sed '/user,arn,user_creation_time,password_enabled,password_last_used,password_last_changed,password_next_rotation,mfa_active,access_key_1_active,access_key_1_last_rotated,access_key_1_last_used_date,access_key_1_last_used_region,access_key_1_last_used_service,access_key_2_active,access_key_2_last_rotated,access_key_2_last_used_date,access_key_2_last_used_region,access_key_2_last_used_service,cert_1_active,cert_1_last_rotated,cert_2_active,cert_2_last_rotated/d' \
| sort -t , -k1 -u \
| sed '1s/^/user,arn,user_creation_time,password_enabled,password_last_used,password_last_changed,password_next_rotation,mfa_active,access_key_1_active,access_key_1_last_rotated,access_key_1_last_used_date,access_key_1_last_used_region,access_key_1_last_used_service,access_key_2_active,access_key_2_last_rotated,access_key_2_last_used_date,access_key_2_last_used_region,access_key_2_last_used_service,cert_1_active,cert_1_last_rotated,cert_2_active,cert_2_last_rotated\n/' > ./dest/all.csv
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0