2016-09-23 106 views
0

因此,我的項目在ec2實例上的服務器上運行,並使用SES發送電子郵件。當SES可以被公衆訪問時,我能夠發送電子郵件,但是當我嘗試實施安全性時,它開始給出問題。我已將以下身份策略附加到SES電子郵件地址,其中一個公開阻止訪問,另一個允許ec2訪問SES電子郵件地址。但是,我總是被阻塞,出現錯誤:允許AWS EC2訪問AWS SES(簡單電子郵件服務)並拒絕公衆訪問的身份策略

The email was not sent.Error message: User `arn_of_ec2_role' is not authorized to perform 
`ses:SendEmail' on resource `arn_of_email_address' (Service: AmazonSimpleEmailService; 
Status Code: 403; Error Code: AccessDenied; 
Request ID: b92h2a02-4502-32g8-8334-9504941fdefd4e35) 

我的策略是:

允許EC2:

{ 
    "Version": "2008-10-17", 
    "Statement": [ 
     { 
      "Sid": "stmt8473824324", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn_of_role_used_by_ec2" 
      }, 
      "Action": [ 
       "ses:SendEmail", 
       "ses:SendRawEmail" 
      ], 
      "Resource": "arn_of_email" 
     } 
    ] 
} 

要拒絕公開:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Deny", 
     "Principal": "*", 
     "Action": [ 
       "ses:SendEmail", 
       "ses:SendRawEmail" 
      ], 
     "Resource": "arn_of_email" 
    } 
    ] 
} 

編輯1 : 原來,我只需將封裝{}添加到「AWS」:「arn_of_role_used_by_ec2」。但即使如此,我沒有獲得許可。我仍然遇到同樣的錯誤。爲了驗證,我甚至使用了用戶策略並嘗試使用該用戶訪問它,但即使如此,我也遇到了同樣的錯誤,只是現在不同的arn被拒絕了。我的政策如下:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": "arn_of_role_used_by_ec2" 
      }, 
      "Action": [ 
       "ses:SendEmail", 
       "ses:SendRawEmail" 
      ], 
      "Resource": "arn_of_email" 
     } 
    ] 
} 

EDIT2:

很抱歉這麼晚纔回復,以下是我做的,以按您的更新:

{ 
     "Version": "2008-10-17", 
     "Statement": [ 
      { 
       "Sid": "stmt1476011587135", 
       "Effect": "Allow", 
       "Principal": "*", 
       "Action": [ 
        "ses:SendEmail", 
        "ses:SendRawEmail" 
       ], 
       "Resource": "arn_of_email", 
       "Condition": { 
        "StringEquals": { 
         "aws:SourceArn": "arn_of_ecs_instance" 
        } 
       } 
      } 
     ] 
    } 

{ 
     "Version": "2008-10-17", 
     "Statement": [ 
      { 
       "Sid": "stmt1476011639899", 
       "Effect": "Deny", 
       "Principal": "*", 
       "Action": [ 
        "ses:SendEmail", 
        "ses:SendRawEmail" 
       ], 
       "Resource": "arn_of_email", 
       "Condition": { 
        "StringNotEquals": { 
         "aws:SourceArn": "arn_of_ecs_instance" 
        } 
       } 
      } 
     ] 
    } 

使用arn_of_ecs_instance,因爲我只是用IAM用戶進行驗證,並且只需要訪問ec2實例。但我仍然可以通過Java API發送電子郵件地址,同時使用My IAM用戶憑證發送郵件。

+0

嘗試將所有策略中的資源分配給'*'。 –

+0

@MattHouser我試過了,但出現錯誤 **應用策略時出錯:無效ARN:ARN必須以'arn:'開頭:*(請求ID:4b922926-83e8-11e6-8845-5946c19d3615)** since我將該政策附加到特定的電子郵件地址。我甚至嘗試**「資源」:「arn:aws:ses:us-east-1:453679034254:identity/*」**我應用策略時出現錯誤**錯誤:預期資源爲'arn_of_email',但是'arn:aws:ses:us-east-1:453679034254:identity /*'.** – Mirhawk

回答

0

「拒絕」規則將始終否決「允許」規則。

這就是您的兩個策略發生的情況:拒絕公共規則覆蓋您的IAM角色的允許規則,因爲您的EC2角色屬於兩種策略。

所以,你需要以下條件:

  1. 一個「允許」規則允許要允許誰,
  2. 一個「拒絕」規則,禁止大家要允許誰。

另外美中不足的是,使用IAM角色與這些類型的政策是困難的,因爲無論是IAM角色使用角色的主要需要被列入白名單。

相反,您可以在您的語句中使用條件來允許IAM角色的「用戶ID」。

首先,您需要獲取您的IAM角色的唯一ID。這不會顯示在AWS管理控制檯中。使用AWS CLI,請執行以下操作:

aws iam get-role --role-name my-role

從這個輸出,抓住從RoleId屬性的值。它的價值看起來像這樣:「AROAID2GEXAMPLEROLEID」。

接下來,就像一個政策下,以允許該角色使用的電子郵件地址:

{ 
    "Version": "2008-10-17", 
    "Statement": [ 
     { 
      "Sid": "stmt1474900930602", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": [ 
       "ses:SendEmail", 
       "ses:SendRawEmail" 
      ], 
      "Resource": "arn_of_email", 
      "Condition": { 
       "StringLike": { 
        "aws:userid": "AROAID2GEXAMPLEROLEID:*" 
       } 
      } 
     } 
    ] 
} 

注意,與您的實際RoleId值取代「AROAID2GEXAMPLEROLEID」。

這將允許任何人承擔您的角色從您的電子郵件地址發送。

最後,使用以下策略來拒絕任何人假設你的角色:

{ 
    "Version": "2008-10-17", 
    "Statement": [ 
     { 
      "Sid": "stmt1474900930602", 
      "Effect": "Deny", 
      "Principal": "*", 
      "Action": [ 
       "ses:SendEmail", 
       "ses:SendRawEmail" 
      ], 
      "Resource": "arn:aws:ses:us-east-1:905741729283:identity/[email protected]", 
      "Condition": { 
       "StringNotLike": { 
        "aws:userid": "AROAID2GEXAMPLEROLEID:*" 
       } 
      } 
     } 
    ] 
} 

再次,與您的實際RoleId值替換 「AROAID2GEXAMPLEROLEID」。

一旦你有了這些,你想要的EC2實例將被允許,其他人將被拒絕。

+0

我得到和錯誤 **應用策略時出錯:無法解析策略。 (請求ID:6e95ca8b-824a-11e6-9e43-45832a24323)** 我試圖通過轉到SES控制檯>電子郵件地址>身份策略>自定義策略來附加此策略 – Mirhawk

+0

請檢查我的問題中的edit1。 – Mirhawk

+0

@Mirhawk我已經用經過測試的解決方案更新了我的答案。 –