Saya memiliki peran IAM dengan kebijakan berikut terlampir:
{
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
Seperti yang Anda lihat, akses penuh diberikan.
Saya menggunakan python berikut untuk mendapatkan konversi kredensial IAM ke kredensial 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()
Ketika saya menjalankan kode ini, beberapa nama pengguna dan kata sandi SMTP adalah output. Ketika saya mencoba mengirim pesan dengan mereka yang mengatakan swap, misalnya, gagal. Berikut contoh perintah:
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, tentu saja, adalah penampung. Domain sebenarnya telah diverifikasi di akun AWS SES saya.
Bahkan, jika saya menjalankan kode yang sama untuk mengkonversi dari pengguna IAM alih-alih menemukan kredensial peran dari meta-data, saya dapat menggunakan nama pengguna dan kata sandi untuk mengirim email dengan baik.
AFAICT, ini tidak diperbolehkan dengan kredensial peran IAM, yang lumpuh jika itu benar. Saya berencana membuat konfigurasi Postfix untuk mengizinkan proses pada kotak untuk mengirim email ke localhost dan memilikinya dialihkan ke layanan SES. Saya mencoba untuk menghindari menempatkan kredensial pengguna IAM di server. Namun, sepertinya tidak ada cara untuk menghindarinya sekarang.
Adakah pikiran?
sumber
Jawaban:
Anda dapat menggunakan proyek ini untuk mengirim SMTP tanpa kredensial menggunakan peran IAM sebagai gantinya https://github.com/loopingz/aws-smtp-relay
sumber
Anda dapat mencoba memberi izin kepada pengguna Anda. Tampaknya berlebihan karena Anda sudah menggunakan wildcard, tetapi kebijakan berikut ini berfungsi di sini (juga dengan postfix) dan dihasilkan oleh AWS.
sumber
Mengapa Anda tidak mulai dengan yang paling sederhana?
sumber