Ho un ruolo IAM con la seguente politica allegata:
{
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
Come puoi vedere, è garantito l'accesso completo.
Uso il seguente python per ottenere la conversione delle credenziali IAM in credenziali 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 eseguo questo codice, vengono emessi un nome utente e una password SMTP. Quando provo ad inviare un messaggio con quelli con say swaks, ad esempio, non riesce. Ecco un esempio di riga di comando:
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 è, ovviamente, un segnaposto. Il dominio reale è stato verificato sul mio account AWS SES.
In effetti, se eseguo lo stesso codice per convertire da un utente IAM invece di scoprire le credenziali del ruolo dai metadati, posso usare il nome utente e la password per inviare e-mail bene.
AFAICT, questo non è consentito con le credenziali del ruolo IAM, che è zoppo se è vero. Stavo progettando di generare una configurazione Postfix per consentire ai processi sulla scatola di inviare posta a localhost e di inviarli al servizio SES. Stavo cercando di evitare di inserire le credenziali utente IAM sui server. Tuttavia, sembra che non ci possa essere un modo per evitarlo adesso.
qualche idea?