Apakah mungkin untuk mengirim email melalui layanan amazon ses smtp dengan akun peran iam?


10

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 wt@example.com --to wt@example.com --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?


1
Saya sudah mencoba hal yang sama dan sampai pada kesimpulan yang sama. Sepertinya saat ini tidak memungkinkan untuk menggunakan Kredensial Peran IAM untuk SES SMTP.
Christian

Jawaban:



1

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.

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

-1

Mengapa Anda tidak mulai dengan yang paling sederhana?

{
    "Version": "2012-10-17",
    "Statement":[{
       "Effect": "Allow",
       "Action": ["ses:*"],
       "Resource":"*"
       }
    ]
 }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.