É possível enviar e-mail através 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 converter as credenciais do IAM em credenciais de 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 senhas SMTP são gerados. Quando tento enviar uma mensagem para aqueles que dizem swaks, por exemplo, ela 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 do AWS SES.

Na verdade, se eu executar o mesmo código para converter de um usuário do IAM em vez de descobrir as credenciais de função dos metadados, posso usar o nome de usuário e a senha para enviar e-mails.

AFAICT, isso simplesmente não é permitido com credenciais de função do IAM, o que é ruim se for verdadeiro. Eu estava planejando gerar uma configuração do Postfix para permitir que os processos na caixa enviassem e-mails para o host local e tivessem isso roteado para o serviço SES. Eu estava tentando evitar colocar credenciais de usuário do IAM nos servidores. No entanto, parece que pode não haver uma maneira de evitar isso agora.

Alguma opinião?

    
por Wren T. 27.03.2014 / 00:05

3 respostas

2

Você pode usar este projeto para enviar SMTP sem credenciais usando a função do IAM, em vez de link

    
por 09.03.2018 / 23:47
1

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

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ses:SendRawEmail",
      "Resource": "*"
    }
  ]
}
    
por 11.08.2014 / 15:22
-1

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

{
    "Version": "2012-10-17",
    "Statement":[{
       "Effect": "Allow",
       "Action": ["ses:*"],
       "Resource":"*"
       }
    ]
 }
    
por 30.12.2015 / 14:27