Organizations 中央集中型 root アクセス管理 運用手順書
作成日: 2026-09-11 担当チーム: SRE 関連ドキュメント:
目次
- 概要
- 前提条件
- 特権タスクの実行(sts:AssumeRoot)
- root ログインが必要な場合(password recovery)
- 新規メンバーアカウントの対応
- マネジメントアカウントへのログイン
- root 資格情報の定期監査
- トラブルシューティング
概要
Organizations の中央集中型 root アクセス管理を有効化し、全メンバーアカウントの root 資格情報を削除済み。 メンバーアカウントの特権タスクはマネジメントアカウントまたは委任管理者(security-tooling)から sts:AssumeRoot で実行する。
構成
| 項目 | 値 |
|---|---|
| マネジメントアカウント | awscloud.jp43(703480710002) |
| 委任管理者 | fd-security-tooling(860801568046) |
| 実行元 | security-tooling(860801568046)の管理者権限 |
前提条件
- AWS CLI がインストールされていること
- security-tooling(860801568046)の管理者権限を持つ IAM ユーザー/ロールであること
sts:AssumeRoot権限が付与されていること
特権タスクの実行(sts:AssumeRoot)
S3 バケットポリシー・SQS ポリシーの誤設定修正など、root ログインなしで実行できる特権タスク。
利用可能なタスクポリシー
| タスクポリシー | 用途 |
|---|---|
S3UnlockBucketPolicy | 誤設定された S3 バケットポリシーの削除 |
SQSUnlockQueuePolicy | 誤設定された SQS キューポリシーの削除 |
IAMDeleteRootUserCredentials | root 資格情報の削除 |
IAMCreateRootUserPassword | root パスワードリカバリの許可 |
IAMAuditRootUserCredentials | root 資格情報の状態確認 |
手順(例: S3 バケットポリシー削除)
# 1. セッション取得
CREDS=$(aws sts assume-root \
--target-principal <アカウントID> \
--task-policy-arn arn=arn:aws:iam::aws:policy/root-task/S3UnlockBucketPolicy \
--duration-seconds 900 \
--profile <security-toolingのプロファイル> \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
--output text)
export AWS_ACCESS_KEY_ID=$(echo "$CREDS" | awk '{print $1}')
export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | awk '{print $2}')
export AWS_SESSION_TOKEN=$(echo "$CREDS" | awk '{print $3}')
# 2. 特権タスク実行
aws s3api delete-bucket-policy --bucket <バケット名>
# 3. 環境変数クリア(必須)
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKENNote: セッションの有効期限は最大15分(900秒)。タスク完了後は必ず環境変数をクリアすること。
root ログインが必要な場合(password recovery)
sts:AssumeRoot では代替できないタスク(Billing の一部、IAM 管理者の権限復旧など)で必要。
手順
Step 1: パスワードリカバリを許可
コンソールから実行(マネジメントアカウントまたは security-tooling):
- IAM コンソール → Root access management
- 対象アカウントを選択 → 特権的なアクションを実行する
- パスワード回復を許可 を選択して実行
Note: コンソールからの実行を推奨。CLI での password recovery は動作未検証。
Step 2: root パスワードリセット
- AWS ログイン画面 → root ユーザー を選択
- メールアドレスに対象アカウントの root メールアドレスを入力(
fdt-sre+<アカウントID>@fastdoctor.jp) - パスワードをお忘れですか? をクリック
- SRE メーリングリストにリセットメールが届く
- パスワードを設定して root でログイン
Note: ログイン時に MFA 設定を求められる。一時的な作業のため個人デバイスの Authenticator アプリで設定して問題ない。
Step 3: 作業完了後の後片付け
作業完了後、再度 root 資格情報を削除すること。
コンソールから: IAM → Root access management → 対象アカウント → 特権的なアクションを実行する → ルートユーザー認証情報を削除
CLI から:
# 一括削除スクリプト(対象アカウントIDを指定)
ACCT=<アカウントID>
CREDS=$(aws sts assume-root \
--target-principal "$ACCT" \
--task-policy-arn arn=arn:aws:iam::aws:policy/root-task/IAMDeleteRootUserCredentials \
--duration-seconds 900 \
--profile <security-toolingのプロファイル> \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
--output text)
export AWS_ACCESS_KEY_ID=$(echo "$CREDS" | awk '{print $1}')
export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | awk '{print $2}')
export AWS_SESSION_TOKEN=$(echo "$CREDS" | awk '{print $3}')
aws iam delete-login-profile 2>/dev/null
KEYS=$(aws iam list-access-keys --query 'AccessKeyMetadata[].AccessKeyId' --output text 2>/dev/null)
for KEY in $KEYS; do aws iam delete-access-key --access-key-id "$KEY"; done
MFAS=$(aws iam list-mfa-devices --query 'MFADevices[].SerialNumber' --output text 2>/dev/null)
for MFA in $MFAS; do aws iam deactivate-mfa-device --serial-number "$MFA"; done
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN新規メンバーアカウントの対応
中央集中型 root アクセス管理を有効化した後に作成されたアカウントは、デフォルトで root 資格情報が存在しない。追加の対応は不要。
マネジメントアカウントへのログイン
Note: マネジメントアカウントでの作業はできる限り避け、security-tooling(860801568046)から
sts:AssumeRoot等で実施すること。マネジメントアカウントへの直接ログインは、Organizations の設定変更など security-tooling からは実行できない作業に限定する。
マネジメントアカウントの root ユーザーは Megazone(代理店)が管理している。 自社では Megazone が払い出した特権 IAM ユーザー mz-fastdoctor-admin を使用する。
前提
oathtoolがインストール済み(brew install oath-toolkit)gcloud auth loginで GCP 認証済みfd-secrets-managementプロジェクトのroles/secretmanager.secretAccessor権限を持つこと- 初回セットアップが完了していること(
/root-access-setupで確認可能)
ログイン手順
- AWS コンソールのログイン画面を開く
- IAM ユーザー を選択し、アカウント ID
703480710002を入力 - ユーザー名
mz-fastdoctor-admin、パスワードを入力 - MFA コードの入力を求められたら、以下のコマンドで OTP を生成して入力:
oathtool --totp -b $(gcloud secrets versions access latest \
--secret=mz-fastdoctor-admin-mfa \
--project=fd-secrets-management)- ログイン完了
Note: OTP は 30 秒ごとに変わる。コマンド実行後すぐに入力すること。
root 資格情報の定期監査
全メンバーアカウントの root 資格情報の状態を一括確認する。
# 全メンバーアカウントの root 資格情報状態を確認
MGMT_ID=$(aws organizations describe-organization --query 'Organization.MasterAccountId' --output text)
ACCOUNTS=$(aws organizations list-accounts --query "Accounts[?Id!='${MGMT_ID}' && Status=='ACTIVE'].Id" --output text)
for ACCT in $ACCOUNTS; do
echo -n "$ACCT: "
CREDS=$(aws sts assume-root \
--target-principal "$ACCT" \
--task-policy-arn arn=arn:aws:iam::aws:policy/root-task/IAMAuditRootUserCredentials \
--duration-seconds 900 \
--profile <security-toolingのプロファイル> \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
--output text 2>&1)
if [ $? -ne 0 ]; then
echo "ERROR: assume-root failed"
continue
fi
export AWS_ACCESS_KEY_ID=$(echo "$CREDS" | awk '{print $1}')
export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | awk '{print $2}')
export AWS_SESSION_TOKEN=$(echo "$CREDS" | awk '{print $3}')
LOGIN=$(aws iam get-login-profile 2>&1 | grep -c "LoginProfile")
KEYS=$(aws iam list-access-keys --query 'length(AccessKeyMetadata)' --output text 2>/dev/null)
MFAS=$(aws iam list-mfa-devices --query 'length(MFADevices)' --output text 2>/dev/null)
if [ "$LOGIN" = "0" ] && [ "$KEYS" = "0" ] && [ "$MFAS" = "0" ]; then
echo "✅ 資格情報なし"
else
echo "⚠️ login=$LOGIN, keys=$KEYS, mfa=$MFAS"
fi
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
done全アカウントが「✅ 資格情報なし」であれば正常。「⚠️」が出た場合は root 資格情報の削除を実施すること。
Note: 四半期に1回程度の実施を推奨。
トラブルシューティング
sts:AssumeRoot が失敗する
| 原因 | 対処 |
|---|---|
sts:AssumeRoot 権限がない | IAM ポリシーを確認。security-tooling の管理者ロールに権限が付与されているか |
| 中央集中型管理が無効化されている | マネジメントアカウントで aws iam list-organizations-features を実行して確認 |
| リージョナルエンドポイント未使用 | sts:AssumeRoot はグローバルエンドポイント非対応。リージョナル STS エンドポイントを使用すること |
mz-fastdoctor-admin の MFA が使えない
| 状況 | 復旧方法 |
|---|---|
| GCP 認証切れ | gcloud auth login を再実行 |
| GCP Secret Manager にアクセスできない(GCP 障害等) | Megazone に連絡し、mz-fastdoctor-admin の MFA リセットを依頼 |
| MFA リセット後 | 新しい MFA デバイスを設定し、TOTP シードを GCP Secret Manager に再保存 |
MFA 再設定手順:
- Megazone に MFA リセットを依頼、または既存 MFA を解除
mz-fastdoctor-adminでログイン(MFA なし状態)- セキュリティ認証情報 → MFA デバイスの割り当て → 仮想 MFA デバイスを選択
- 「シークレットキーを表示」→ TOTP シードを取得
- シードを GCP Secret Manager に保存:
echo -n "<TOTPシード>" | gcloud secrets versions add mz-fastdoctor-admin-mfa \
--data-file=- \
--project=fd-secrets-managementoathtoolで OTP を2回生成(30秒間隔)して MFA を有効化- ローカルのシードを削除
password recovery 後にパスワードリセットメールが届かない
- root メールアドレスが SRE メーリングリスト(
fdt-sre+<アカウントID>@fastdoctor.jp)であることを確認 - 迷惑メールフォルダを確認
- Allow password recovery を実行してからリセットを試みているか確認(先に recovery を許可しないとリセット不可)