Skip to content

Organizations 中央集中型 root アクセス管理 運用手順書

作成日: 2026-09-11 担当チーム: SRE 関連ドキュメント:


目次

  1. 概要
  2. 前提条件
  3. 特権タスクの実行(sts:AssumeRoot)
  4. root ログインが必要な場合(password recovery)
  5. 新規メンバーアカウントの対応
  6. マネジメントアカウントへのログイン
  7. root 資格情報の定期監査
  8. トラブルシューティング

概要

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 キューポリシーの削除
IAMDeleteRootUserCredentialsroot 資格情報の削除
IAMCreateRootUserPasswordroot パスワードリカバリの許可
IAMAuditRootUserCredentialsroot 資格情報の状態確認

手順(例: S3 バケットポリシー削除)

bash
# 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_TOKEN

Note: セッションの有効期限は最大15分(900秒)。タスク完了後は必ず環境変数をクリアすること。


root ログインが必要な場合(password recovery)

sts:AssumeRoot では代替できないタスク(Billing の一部、IAM 管理者の権限復旧など)で必要。

手順

Step 1: パスワードリカバリを許可

コンソールから実行(マネジメントアカウントまたは security-tooling):

  1. IAM コンソール → Root access management
  2. 対象アカウントを選択 → 特権的なアクションを実行する
  3. パスワード回復を許可 を選択して実行

Note: コンソールからの実行を推奨。CLI での password recovery は動作未検証。

Step 2: root パスワードリセット

  1. AWS ログイン画面 → root ユーザー を選択
  2. メールアドレスに対象アカウントの root メールアドレスを入力(fdt-sre+<アカウントID>@fastdoctor.jp
  3. パスワードをお忘れですか? をクリック
  4. SRE メーリングリストにリセットメールが届く
  5. パスワードを設定して root でログイン

Note: ログイン時に MFA 設定を求められる。一時的な作業のため個人デバイスの Authenticator アプリで設定して問題ない。

Step 3: 作業完了後の後片付け

作業完了後、再度 root 資格情報を削除すること。

コンソールから: IAM → Root access management → 対象アカウント → 特権的なアクションを実行する → ルートユーザー認証情報を削除

CLI から:

bash
# 一括削除スクリプト(対象アカウント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 で確認可能)

ログイン手順

  1. AWS コンソールのログイン画面を開く
  2. IAM ユーザー を選択し、アカウント ID 703480710002 を入力
  3. ユーザー名 mz-fastdoctor-admin、パスワードを入力
  4. MFA コードの入力を求められたら、以下のコマンドで OTP を生成して入力:
bash
oathtool --totp -b $(gcloud secrets versions access latest \
  --secret=mz-fastdoctor-admin-mfa \
  --project=fd-secrets-management)
  1. ログイン完了

Note: OTP は 30 秒ごとに変わる。コマンド実行後すぐに入力すること。


root 資格情報の定期監査

全メンバーアカウントの root 資格情報の状態を一括確認する。

bash
# 全メンバーアカウントの 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 再設定手順:

  1. Megazone に MFA リセットを依頼、または既存 MFA を解除
  2. mz-fastdoctor-admin でログイン(MFA なし状態)
  3. セキュリティ認証情報 → MFA デバイスの割り当て → 仮想 MFA デバイスを選択
  4. 「シークレットキーを表示」→ TOTP シードを取得
  5. シードを GCP Secret Manager に保存:
bash
echo -n "<TOTPシード>" | gcloud secrets versions add mz-fastdoctor-admin-mfa \
  --data-file=- \
  --project=fd-secrets-management
  1. oathtool で OTP を2回生成(30秒間隔)して MFA を有効化
  2. ローカルのシードを削除

password recovery 後にパスワードリセットメールが届かない

  • root メールアドレスが SRE メーリングリスト(fdt-sre+<アカウントID>@fastdoctor.jp)であることを確認
  • 迷惑メールフォルダを確認
  • Allow password recovery を実行してからリセットを試みているか確認(先に recovery を許可しないとリセット不可)