Назад | Перейти на главную страницу

Можно ли отправлять электронную почту через службу smtp amazon ses с учетной записью роли iam?

У меня есть роль IAM со следующей политикой:

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

Как видите, предоставляется полный доступ.

Я использую следующий питон для преобразования учетных данных 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 wt@example.com --to wt@example.com --auth-user <smtp username from script above> --auth-password <smtp password from script above> --tls

Example.com - это, конечно, заполнитель. Настоящий домен был проверен в моей учетной записи AWS SES.

Фактически, если я запускаю тот же код для преобразования от пользователя IAM вместо того, чтобы обнаруживать учетные данные роли из метаданных, я могу использовать имя пользователя и пароль для отправки электронной почты.

AFAICT, это просто недопустимо с учетными данными роли IAM, что хромает, если это правда. Я планировал создать конфигурацию Postfix, чтобы позволить процессам в ящике отправлять почту на localhost и перенаправлять ее в службу SES. Я пытался избежать размещения учетных данных пользователя IAM на серверах. Однако, похоже, сейчас не существует способа избежать этого.

Есть предположения?

Вы можете использовать этот проект для отправки SMTP без учетных данных, используя вместо этого роль IAM. https://github.com/loopingz/aws-smtp-relay

Вы можете попытаться дать своему пользователю следующее разрешение. Это кажется избыточным, поскольку вы уже использовали подстановочные знаки, но здесь работает следующая политика (также с постфиксом) и создается AWS.

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

Почему бы вам не начать с самого простого?

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