Có thể gửi email qua dịch vụ amazon ses smtp bằng tài khoản vai trò iam không?


10

Tôi có vai trò IAM với chính sách sau đây kèm theo:

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

Như bạn có thể thấy, truy cập đầy đủ được cấp.

Tôi sử dụng python sau đây để chuyển đổi thông tin đăng nhập IAM sang thông tin đăng nhập 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()

Khi tôi chạy mã này, một số tên người dùng và mật khẩu SMTP được xuất ra. Ví dụ, khi tôi cố gắng gửi một tin nhắn với những người nói swaks, nó đã thất bại. Đây là một dòng lệnh ví dụ:

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

Ví dụ.com là một giữ chỗ. Tên miền thực đã được xác minh trên tài khoản AWS SES của tôi.

Trên thực tế, nếu tôi chạy cùng một mã để chuyển đổi từ người dùng IAM thay vì khám phá thông tin xác thực vai trò từ siêu dữ liệu, tôi có thể sử dụng tên người dùng và mật khẩu để gửi email tốt.

AFAICT, điều này chỉ không được phép với thông tin vai trò IAM, điều này là khập khiễng nếu nó đúng. Tôi đã lên kế hoạch tạo một cấu hình Postfix để cho phép các quy trình trên hộp gửi thư đến localhost và được chuyển đến dịch vụ SES. Tôi đã cố gắng tránh đưa thông tin người dùng IAM lên máy chủ. Tuy nhiên, có vẻ như có thể không có cách nào để tránh điều đó bây giờ.

Có suy nghĩ gì không?


1
Tôi đã thử điều tương tự và đi đến kết luận tương tự. Có vẻ như hiện tại không thể sử dụng Thông tin vai trò IAM cho SES SMTP.
Christian

Câu trả lời:



1

Bạn có thể thử cung cấp cho người dùng của bạn quyền sau đây. Có vẻ dư thừa vì bạn đã sử dụng ký tự đại diện, nhưng chính sách sau hoạt động ở đây (cũng với hậu tố) và được tạo bởi AWS.

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

-1

Tại sao bạn không bắt đầu với cái đơn giản nhất?

{
    "Version": "2012-10-17",
    "Statement":[{
       "Effect": "Allow",
       "Action": ["ses:*"],
       "Resource":"*"
       }
    ]
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.