É possível enviar email por meio do serviço amazon ses smtp com uma conta de função iam?

10

Eu tenho uma função do IAM com a seguinte política anexada:

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

Como você pode ver, o acesso total é concedido.

Eu uso o seguinte python para obter as credenciais do IAM para converter em credenciais 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()

Quando executo esse código, alguns nomes de usuário e senha SMTP são gerados. Quando tento enviar uma mensagem com pessoas com digamos swaks, por exemplo, ele falha. Aqui está um exemplo de linha de comando:

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 é, obviamente, um espaço reservado. O domínio real foi verificado na minha conta AWS SES.

De fato, se eu executar o mesmo código para converter de um usuário do IAM em vez de descobrir as credenciais da função nos metadados, posso usar o nome de usuário e a senha para enviar um email.

AFAICT, isso não é permitido com credenciais de função do IAM, o que é ruim, se for verdade. Eu estava planejando gerar uma configuração do Postfix para permitir que os processos na caixa enviem email para o host local e que sejam roteados para o serviço SES. Eu estava tentando evitar colocar credenciais de usuário do IAM nos servidores. No entanto, parece que talvez não haja uma maneira de evitar isso agora.

Alguma ideia?

Wren T.
fonte
1
Eu tentei a mesma coisa e cheguei à mesma conclusão. Parece que atualmente não é possível usar credenciais de função do IAM para SES SMTP.
Christian

Respostas:

1

Você pode tentar dar ao usuário a seguinte permissão. Parece redundante, pois você já usa caracteres curinga, mas a política a seguir funciona aqui (também com postfix) e é gerada pela AWS.

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

Por que você não começa com o mais simples?

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