เป็นไปได้ไหมที่จะส่งอีเมลผ่านบริการ amazon ses smtp ด้วยบัญชีบทบาทของ iam


10

ฉันมีบทบาท IAM พร้อมแนบนโยบายต่อไปนี้:

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

อย่างที่คุณเห็นสิทธิ์การเข้าถึงแบบเต็มจะได้รับ

ฉันใช้ไพ ธ อนต่อไปนี้เพื่อรับการแปลงข้อมูลประจำตัวของ IAM เป็นข้อมูลรับรอง 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()

เมื่อฉันเรียกใช้รหัสนี้ชื่อผู้ใช้และรหัสผ่าน SMTP บางส่วนจะถูกส่งออก เมื่อฉันพยายามส่งข้อความกับผู้ที่พูดคำว่า swaks มันล้มเหลว นี่คือตัวอย่างบรรทัดคำสั่ง:

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

ตัวอย่างแน่นอนว่าเป็นตัวยึดตำแหน่ง โดเมนจริงได้รับการยืนยันในบัญชี AWS SES ของฉัน

ในความเป็นจริงถ้าฉันเรียกใช้รหัสเดียวกันเพื่อแปลงจากผู้ใช้ IAM แทนที่จะค้นหาข้อมูลประจำตัวบทบาทจาก meta-data ฉันสามารถใช้ชื่อผู้ใช้และรหัสผ่านเพื่อส่งอีเมลได้

AFAICT สิ่งนี้ไม่ได้รับอนุญาตให้ใช้กับข้อมูลประจำตัวของบทบาทของ IAM ซึ่งจะเป็นประโยชน์หากเป็นจริง ฉันวางแผนที่จะสร้างการตั้งค่า Postfix เพื่อให้กระบวนการในกล่องส่งเมลไปยัง localhost และกำหนดเส้นทางนั้นไปยังบริการ SES ฉันพยายามหลีกเลี่ยงการใส่ข้อมูลประจำตัวผู้ใช้ของ IAM บนเซิร์ฟเวอร์ อย่างไรก็ตามดูเหมือนว่าอาจไม่มีวิธีการหลีกเลี่ยงในตอนนี้

ความคิดใด ๆ


1
ฉันได้ลองสิ่งเดียวกันและได้ข้อสรุปเดียวกัน ดูเหมือนว่าขณะนี้ยังไม่สามารถใช้ข้อมูลรับรองบทบาทของ IAM สำหรับ SES SMTP ได้
คริสเตียน

คำตอบ:



1

คุณสามารถลองอนุญาตให้ผู้ใช้ของคุณได้รับอนุญาตดังต่อไปนี้ ดูเหมือนว่าซ้ำซ้อนเนื่องจากคุณใช้ wildcard อยู่แล้ว แต่นโยบายต่อไปนี้ใช้งานได้ที่นี่ (รวมถึง postfix) และสร้างโดย AWS

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

-1

ทำไมคุณไม่เริ่มด้วยอันที่ง่ายที่สุด?

{
    "Version": "2012-10-17",
    "Statement":[{
       "Effect": "Allow",
       "Action": ["ses:*"],
       "Resource":"*"
       }
    ]
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.