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?