Ist es möglich, E-Mails über den Amazon SES SMTP-Dienst mit einem iam-Rollenkonto zu senden?


10

Ich habe eine IAM-Rolle mit der folgenden Richtlinie:

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

Wie Sie sehen, wird der vollständige Zugriff gewährt.

Ich verwende die folgende Python, um die IAM-Anmeldeinformationen in SMTP-Anmeldeinformationen zu konvertieren:

#!/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()

Wenn ich diesen Code ausführe, werden einige SMTP-Benutzernamen und -Kennwörter ausgegeben. Wenn ich zum Beispiel versuche, eine Nachricht mit Personen mit beispielsweise Swaks zu senden, schlägt dies fehl. Hier ist ein Beispiel für eine Befehlszeile:

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 ist natürlich ein Platzhalter. Die reale Domain wurde in meinem AWS SES-Konto überprüft.

Wenn ich denselben Code zum Konvertieren von einem IAM-Benutzer ausführe, anstatt die Rollenanmeldeinformationen aus den Metadaten zu ermitteln, kann ich den Benutzernamen und das Kennwort zum Senden von E-Mails verwenden.

AFAICT, dies ist mit IAM-Rollenanmeldeinformationen einfach nicht zulässig, was lahm ist, wenn es wahr ist. Ich hatte vor, eine Postfix-Konfiguration zu generieren, damit Prozesse auf der Box E-Mails an localhost senden und diese an den SES-Dienst weiterleiten können. Ich habe versucht zu vermeiden, dass IAM-Benutzeranmeldeinformationen auf den Servern gespeichert werden. Es sieht jedoch so aus, als gäbe es derzeit keinen Weg, dies zu vermeiden.

Irgendwelche Gedanken?


1
Ich habe das Gleiche versucht und bin zu dem gleichen Schluss gekommen. Es sieht so aus, als ob es derzeit nicht möglich ist, IAM-Rollenanmeldeinformationen für SES SMTP zu verwenden.
Christian

Antworten:



1

Sie können versuchen, Ihrem Benutzer die folgende Berechtigung zu erteilen. Es scheint redundant zu sein, da Sie bereits Platzhalter verwendet haben, aber die folgende Richtlinie funktioniert hier (auch mit Postfix) und wird von AWS generiert.

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

-1

Warum fängst du nicht mit dem einfachsten an?

{
    "Version": "2012-10-17",
    "Statement":[{
       "Effect": "Allow",
       "Action": ["ses:*"],
       "Resource":"*"
       }
    ]
 }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.