是否有可能通过亚马逊的smtp服务与IAMangular色帐户发送电子邮件?

我有一个IAMangular色,附带以下策略:

{ "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ] } 

正如你所看到的,完全访问被授予。

我使用下面的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() 

当我运行这个代码时,会输出一些SMTP用户名和密码。 例如,当我尝试发送带有swaks的消息时,就会失败。 以下是一个示例命令行:

 swaks -s email-smtp.us-east-1.amazonaws.com --from [email protected] --to [email protected] --auth-user <smtp username from script above> --auth-password <smtp password from script above> --tls 

Example.com当然是一个占位符。 我的AWS SES帐户已经validation了真实的域名。

事实上,如果我运行相同的代码来从IAM用户转换而不是从元数据中发现angular色凭据,那么我可以使用用户名和密码来发送电子邮件。

AFAICT,这只是IAMangular色凭据不允许的,如果是真的,这是不合适的。 我正在计划生成一个Postfix的configuration,以允许在框上的进程发送邮件到本地主机,并有路由到SES服务。 我试图避免将IAM用户凭据放在服务器上。 但是,现在看起来似乎没有办法避免这种情况。

有什么想法吗?

您可以尝试给您的用户以下权限。 这似乎是多余的,因为你已经使用通配符,但是下面的策略在这里工作(也适用于后缀),并由AWS生成。

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ses:SendRawEmail", "Resource": "*" } ] } 

你为什么不从最简单的一个开始?

 { "Version": "2012-10-17", "Statement":[{ "Effect": "Allow", "Action": ["ses:*"], "Resource":"*" } ] }