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?
fonte
Respostas:
Você pode usar este projeto para enviar SMTP sem credenciais usando a função IAM https://github.com/loopingz/aws-smtp-relay
fonte
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.
fonte
Por que você não começa com o mais simples?
fonte