È possibile inviare e-mail tramite il servizio Amazon ses smtp con un account con ruolo iam?


10

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?


1
Ho provato la stessa cosa e sono giunto alla stessa conclusione. Sembra che al momento non sia possibile utilizzare le credenziali del ruolo IAM per SES SMTP.
Christian,

Risposte:



1

Puoi provare a dare al tuo utente la seguente autorizzazione. Sembra ridondante poiché hai già usato i caratteri jolly, ma la seguente politica funziona qui (anche con Postfix) ed è generata da AWS.

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

-1

Perché non inizi con quello più semplice?

{
    "Version": "2012-10-17",
    "Statement":[{
       "Effect": "Allow",
       "Action": ["ses:*"],
       "Resource":"*"
       }
    ]
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.