다음 정책이 첨부 된 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 -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은 자리 표시 자입니다. AWS SES 계정에서 실제 도메인이 확인되었습니다.
실제로 메타 데이터에서 역할 자격 증명을 검색하는 대신 동일한 코드를 실행하여 IAM 사용자로부터 변환하면 사용자 이름과 비밀번호를 사용하여 전자 메일을 제대로 보낼 수 있습니다.
AFAICT, IAM 역할 자격 증명으로는 허용되지 않으며, 사실 인 경우에는 절실합니다. 상자의 프로세스가 로컬 호스트로 메일을 보내고 SES 서비스로 라우팅 할 수 있도록 Postfix 구성을 생성 할 계획이었습니다. 서버에 IAM 사용자 자격 증명을 넣지 않으려 고했습니다. 그러나 지금 그것을 피할 수있는 방법이 없을 것 같습니다.
이견있는 사람?