今日やったこと

  • aws:SourceArnaws:SourceAccount の役割を整理した
  • AWSサービスを Principal に指定するだけでは、許可範囲が広くなる場合があると確認した
  • Condition を使って、呼び出し元のリソースやAWSアカウントを限定する方法を確認した
  • これらの条件が confused deputy 問題への対策になることを知った

学んだこと

AWSサービスをPrincipalにする場合の注意点

AWSサービスにリソースへのアクセスを許可する場合、次のようにサービスを Principal に指定する。

{
  "Principal": {
    "Service": "s3.amazonaws.com"
  }
}

ただし、これだけでは「S3サービスからの呼び出し」という大きな範囲で許可することになる。

そこで Conditionaws:SourceArnaws:SourceAccount を指定し、呼び出し元をさらに限定する。

aws:SourceArnとは

aws:SourceArn は、どのAWSリソースを発生元とする呼び出しなのかを確認する条件キー。

たとえば、特定のS3バケットからSNSトピックへの通知だけを許可したい場合、次のように指定できる。

{
  "Effect": "Allow",
  "Principal": {
    "Service": "s3.amazonaws.com"
  },
  "Action": "sns:Publish",
  "Resource": "arn:aws:sns:ap-northeast-1:123456789012:example-topic",
  "Condition": {
    "ArnEquals": {
      "aws:SourceArn": "arn:aws:s3:::example-bucket"
    }
  }
}

この例では、S3サービス全体ではなく、example-bucket を発生元とする呼び出しに限定している。

aws:SourceAccountとは

aws:SourceAccount は、呼び出し元リソースを所有するAWSアカウントを確認する条件キー。

"Condition": {
  "StringEquals": {
    "aws:SourceAccount": "123456789012"
  }
}

これにより、指定したAWSアカウントが所有するリソースからの呼び出しだけを許可できる。

両方を指定する例

S3バケットのARNにはAWSアカウントIDが含まれないため、aws:SourceArnaws:SourceAccount を組み合わせると、リソースと所有アカウントの両方を確認できる。

{
  "Effect": "Allow",
  "Principal": {
    "Service": "s3.amazonaws.com"
  },
  "Action": "sns:Publish",
  "Resource": "arn:aws:sns:ap-northeast-1:123456789012:example-topic",
  "Condition": {
    "ArnEquals": {
      "aws:SourceArn": "arn:aws:s3:::example-bucket"
    },
    "StringEquals": {
      "aws:SourceAccount": "123456789012"
    }
  }
}

役割を整理すると、次のようになる。

条件キー 確認するもの
aws:SourceArn どのAWSリソースからの呼び出しか
aws:SourceAccount そのリソースを所有するAWSアカウントはどこか

confused deputy問題への対策

AWSサービスにアクセスを委任すると、そのサービスが意図しない第三者の依頼まで処理してしまう可能性がある。

このような問題を confused deputy 問題という。

aws:SourceArnaws:SourceAccount を使うことで、AWSサービスからの呼び出しを、意図したリソースやアカウントに限定できる。

Principal:
  どのAWSサービスを許可するか

aws:SourceArn:
  どのリソースを発生元とする呼び出しか

aws:SourceAccount:
  どのアカウントが所有するリソースか

ただし、これらの条件キーを利用できるかどうかは、AWSサービス間の連携方法によって異なる。

実際にポリシーを書くときは、利用するAWSサービスの公式ドキュメントを確認する必要がある。

次にやること

  • confused deputy問題について詳しく整理する
  • ArnEqualsArnLike の違いを整理する
  • aws sts assume-role を手動で実行する方法を確認する
  • IAM Identity Centerとは何かを整理する