Wre*_* T. 11 amazon-ses amazon-iam
我有一个 IAM 角色,附加了以下策略:
{
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如您所见,已授予完全访问权限。
我使用以下 python 将 IAM 凭证转换为 SMTP 凭证:
#!/usr/bin/env python
from __future__ import print_function
import base64
import hashlib
import hmac
import json
import struct
import urllib2
METADATA_BASE = 'http://169.254.169.254/2012-01-12/meta-data'
def main():
access_key_id, secret_access_key = get_access_creds()
username, password = get_smtp_creds(access_key_id, secret_access_key)
print('SMTP Username: %s' % username)
print('SMTP Password: %s' % password)
def get_access_creds():
url_handle = urllib2.urlopen('%s/iam/security-credentials' %
(METADATA_BASE,))
role_name = url_handle.read()
url_handle.close()
url_handle = urllib2.urlopen('%s/iam/security-credentials/%s' %
(METADATA_BASE, role_name))
sec_cred_doc = url_handle.read()
url_handle.close()
sec_cred_data = json.loads(sec_cred_doc)
access_key_id = buffer(sec_cred_data['AccessKeyId'])
secret_access_key = buffer(sec_cred_data['SecretAccessKey'])
return access_key_id, secret_access_key
def get_smtp_creds(access_key_id, secret_access_key):
message = 'SendRawEmail'
version = 0x02
sig= hmac.new(
secret_access_key,
msg=message,
digestmod=hashlib.sha256)
sig_bytes = sig.digest()
sig_and_version_bytes = (struct.pack('B', version) + sig_bytes)
smtp_password = base64.b64encode(sig_and_version_bytes)
return access_key_id, smtp_password
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,会输出一些 SMTP 用户名和密码。例如,当我尝试向那些说 swaks 的人发送消息时,它失败了。这是一个示例命令行:
swaks -s email-smtp.us-east-1.amazonaws.com --from wt@example.com --to wt@example.com --auth-user <smtp username from script above> --auth-password <smtp password from script above> --tls
Run Code Online (Sandbox Code Playgroud)
Example.com 当然是一个占位符。真实域已在我的 AWS SES 账户上验证。
事实上,如果我运行相同的代码来从 IAM 用户转换而不是从元数据中发现角色凭证,我可以使用用户名和密码发送电子邮件就好了。
AFAICT,这在 IAM 角色凭证中是不允许的,如果这是真的,那就太蹩脚了。我计划生成一个 Postfix 配置,以允许盒子上的进程将邮件发送到本地主机并将其路由到 SES 服务。我试图避免将 IAM 用户凭证放在服务器上。但是,现在似乎没有办法避免这种情况。
有什么想法吗?
小智 1
您可以尝试授予您的用户以下权限。这似乎是多余的,因为您已经使用了通配符,但以下策略在这里有效(也适用于 postfix)并且由 AWS 生成。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ses:SendRawEmail",
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3594 次 |
| 最近记录: |