如何创建默认全拒仅放行指定列表的AWS SES授权策略
问题根因
你的配置有三个关键错误,完全不符合IAM策略评估规则和SES条件键的使用规范:
- 第一条Deny策略的
Condition为空,属于无条件显式拒绝。IAM策略评估时显式拒绝优先级最高,会直接覆盖所有后续Allow规则,你看到的“只有第一个地址能发”属于异常匹配结果,不是规则正常生效的表现。 - 条件运算符用错了:
ses:FromAddress是单值字符串条件键,单次发信请求只会传入一个发件地址,根本不需要加ForAnyValue前缀——这个前缀只给请求中会传入多个值的条件键用。单值条件键匹配数组类型的条件值时,默认就是OR逻辑,只要传入值和数组里任意一项相等就算条件命中。 - 权限逻辑搞反了:SES已验证身份的默认规则是,同账号下有SES发信权限的IAM实体默认可以用该身份发信,跨账号请求默认拒绝,你根本不需要单独写Allow规则放通权限,只要写Deny规则拦住不在允许列表的发信请求就行。
正确配置
直接用下面的策略替换你原来的配置即可,不需要额外写Allow语句,就能实现仅指定发件地址可发信的效果:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "BlockUnapprovedSenders", "Effect": "Deny", "Principal": "*", "Action": [ "ses:SendEmail", "ses:SendRawEmail", "ses:SendTemplatedEmail", "ses:SendBulkTemplatedEmail" ], "Resource": "替换为你自己的SES身份ARN", "Condition": { "StringNotEquals": { "ses:FromAddress": [ "example1@domain.com", "example2@domain.com", "example3@domain.com", "example4@domain.com", "example5@domain.com" ] } } } ] }
注意事项
- 这个策略的逻辑很直接:只要发信请求里的
FromAddress不在你列的允许列表里,就直接拒绝,列表内的地址发信不受任何影响。 - 如果你只需要允许指定平台、指定IAM角色/账号发信,把
Principal里的*替换成对应的主体ARN即可,用通配符会把权限放开给所有能访问到该SES资源的主体,存在安全风险。 - 配置完可以用SES控制台自带的策略测试工具,分别用列表内、列表外的地址模拟发信,确认规则生效后再正式上线。
内容的提问来源于stack exchange,提问作者Charlie Bleisch
相关产品推荐
相关产品推荐

