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 [email protected] --to [email protected] --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?
quelle
Antworten:
Sie können dieses Projekt verwenden, um SMTP ohne Anmeldeinformationen mithilfe der IAM-Rolle https://github.com/loopingz/aws-smtp-relay zu senden
quelle
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.
quelle
Warum fängst du nicht mit dem einfachsten an?
quelle