Slapdash Safeguards

にわか仕込みのセキュリティ

AWSは「ネット上のActive Directory」だ - Trust関係で見る類似点

はじめに

前回の記事で、私は「AWSは別にネット上のADじゃない」と言い切った。

  • グループに入れても安全じゃない
  • メタデータエンドポイントという抜け道がある
  • リソースベースポリシーで全部台無しになる

こういう「罠」にハマらないように、ADの感覚を捨てろって話だった。

でも、実は...

IAM設定を深く掘り下げていくと、「あれ?これってADの〇〇と同じじゃん」という瞬間が何度も訪れる。特にTrust関係権限委譲の仕組みは、Active Directoryの設計思想と驚くほど似ているんだ。

今回は前回と真逆の視点から、「AWSとADが本質的に似ている3つの例」を見ていく。

なぜ「似ていない」と「似ている」が両立するのか

答えは簡単。

  • 表面的な実装 → 全く違う(前回の記事)
  • 根底にある設計思想 → 驚くほど似ている(今回の記事)

では具体的にどこが似ているのか?

驚愕の1対1マッピング

AWS Active Directory 相似度
AssumeRole = Domain Trust + 外部信頼 ★★★★★
iam:PassRole + Condition = Constrained Delegation ★★★★★
Resource-based Policy (S3, SQS, etc.) = オブジェクトのDACL ★★★★☆
Identity Policy ∩ Resource Policy = ユーザー権限 ∩ オブジェクトACL ★★★★★
Service Control Policy (SCP) = Group Policy (GPO) ★★★★☆

1. AssumeRole = クロスドメインTrust

ADの場合

Active Directoryでは、ドメインAがドメインBを「信頼」することで、ドメインAのユーザーがドメインBのリソースにアクセスできる。

[Domain A] ←Trust→ [Domain B]
UserA@DomainA が DomainBのFileServerにアクセス可能

AWSの場合

AWSでも同じ。アカウントAがアカウントBのロールを「信頼」することで、アカウントAのユーザーがそのロールを引き受けられる。

{
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::ACCOUNT-B:root"},
  "Action": "sts:AssumeRole",
  "Resource": "arn:aws:iam::ACCOUNT-A:role/CrossAccountRole"
}

→ これ、まんま「Account A が Account B を信頼」 だよね?
ADで言う Forest Trust や External Trust のクラウド版。

2. PassRole = Constrained Delegation

{
  "Effect": "Allow",
  "Action": "iam:PassRole",
  "Resource": "arn:aws:iam::123:role/LambdaExecRole",
  "Condition": {
    "StringEquals": {"iam:PassedToService": "lambda.amazonaws.com"}
  }
}

→ 「Lambdaだけに委譲OK」
ADの Kerberos Constrained Delegation と完全に同じ発想。

3. Resource-based Policy = オブジェクトACL

S3バケットポリシー例

{
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::456:user/Bob"},
  "Action": "s3:*",
  "Resource": "arn:aws:s3:::my-bucket/*"
}

→ リソース側が「誰に権限を与えるか」を決める
ADで言う NTFSのACE(Access Control Entry)そのもの。

IAMで制限してても、バケットポリシーがこうなってたら

{
  "Effect": "Allow",
  "Principal": "*",  // ❌ 全世界に公開!
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::corporate-secrets/*"
}

これが前回記事で言った「見えない権限」の正体。

何が分かったか

表面は違っても、本質は同じ

  1. 信頼関係の管理 → どちらも明示的な信頼設定が必要
  2. 権限の委譲 → サービス間の権限移譲で攻撃リスク
  3. リソースベースの制御 → オブジェクト単位のACL管理

防御の共通点

前回の記事で挙げた対策は、実はADでも同じことをやってる。

  1. ログ監視が命
    • AD → Security Event Log (4768, 4769, 4776)
    • AWS → CloudTrail (AssumeRole, PassRole, PutBucketPolicy)
  2. MFAは必須(これは前回も言った)
    • 両方の環境で、特権アクセスには必ずMFA
  3. 定期的な権限監査
    • AD: BloodHound、PingCastle
    • AWS: IAM Access Analyzer、Prowler

最後に

AWSはADじゃない」 → 正しい
AWSはADに似てる」 → もっと正しい
「ADを知ってるとAWSが理解しやすい」 → 超正しい

補充

AWS vs AD 對比圖

[AD Forest]                 [AWS Organization]
    │                           │
 ├─ Domain Trust             ├─ AssumeRole (跨帳戶)
 ├─ Constrained Delegation   ├─ PassRole + Condition
 ├─ Object DACL              ├─ Resource-based Policy
 ├─ Group Policy             ├─ SCP (Service Control Policy)

AD脳を「アップデート」せよ

AD脳 AWS
「グループに入れたら安全」 「ポリシー+条件+境界」で安全
ドメイン=境界」 「アカウント=境界」+Organizations
GPOで一括制御」 SCP + Tag Policy
「Kerberosチケット」 AssumeRole + Session Policy

参考

  1. https://www.sdsg.moe/entry/2025/11/11/223257