是否可以使用 iam 角色帐户通过 amazon ses smtp 服务发送电子邮件?

是否可以使用 iam 角色帐户通过 amazon ses smtp 服务发送电子邮件?

我有一个 IAM 角色,附加了以下策略:

{
  "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 账户上得到验证。

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

据我所知,这在 IAM 角色凭证中是不允许的,如果这是真的,那就太糟糕了。我计划生成一个 Postfix 配置,以允许盒子上的进程将邮件发送到本地主机并将其路由到 SES 服务。我试图避免将 IAM 用户凭证放在服务器上。然而,现在似乎没有办法避免这种情况。

有什么想法吗?

答案1

您可以使用此项目通过 IAM 角色发送无需凭证的 SMTP 消息https://github.com/loopingz/aws-smtp-relay

答案2

您可以尝试授予用户以下权限。由于您已经使用了通配符,因此这似乎是多余的,但以下策略在这里有效(也适用于后缀)并且由 AWS 生成。

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

答案3

为什么不从最简单的开始呢?

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

相关内容