2017-06-05 146 views
0

我有一個靜態網站在S3上託管,我已經將所有文件設置爲公開。 另外,我有一個nginx的EC2實例,充當反向代理並可以訪問靜態網站,因此S3扮演着原點的角色。只允許EC2實例訪問S3上的靜態網站

現在我想要做的就是將S3上的所有文件設置爲私有,以便網站只能通過來自nginx(EC2)的流量訪問。

到目前爲止,我嘗試了以下內容。我創建並連接一個新的政策作用到EC2實例與

策略授予權限:AmazonS3ReadOnlyAccess

而且已經重新啓動EC2實例。

然後我在我的S3存儲桶控制檯>權限>桶政策

{ 
    "Version": "xxxxx", 
    "Id": "xxxxxxx", 
    "Statement": [ 
     { 
      "Sid": "xxxxxxx", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::XXXXXXXXXX:role/MyROLE" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::XXX-bucket/*" 
     } 
    ] 
} 

爲主要我已當我創建的EC2實例中的作用,我得到了ARN創建的策略。

"Principal": { 
       "AWS": "arn:aws:iam::XXXXXXXXXX:role/MyROLE" 
      }, 

但是,這不起作用,任何幫助表示讚賞。

回答

3

如果nginx的亞馬遜EC2實例僅讓一般的web請求到Amazon S3,那麼問題變成如何識別來自nginx的請求爲「允許」,同時拒絕所有其他請求。

一種方法是使用VPC Endpoint for S3,它允許從VPC直接通信到Amazon S3(而不是通過Internet網關)。

A 存儲桶策略然後可以限制對存儲桶的訪問,以使其只能通過該端點訪問。

下面是Example Bucket Policies for VPC Endpoints for Amazon S3剷鬥政策:

下面是一個S3桶策略,允許訪問特定桶,examplebucket,只從VPC端點ID爲vpce-1a2b3c4d的一個例子。該策略使用條件密鑰aws:sourceVpce限制對指定VPC端點的訪問。

{ 
    "Version": "2012-10-17", 
    "Id": "Policy", 
    "Statement": [ 
    { 
     "Sid": "Access-to-specific-VPCE-only", 
     "Action": "s3:*", 
     "Effect": "Allow", 
     "Resource": ["arn:aws:s3:::examplebucket", 
        "arn:aws:s3:::examplebucket/*"], 
     "Condition": { 
     "StringEquals": { 
      "aws:sourceVpce": "vpce-1a2b3c4d" 
     } 
     }, 
     "Principal": "*" 
    } 
    ] 
} 

所以,完整的設計將是:

  • 對象ACL:只有私人(刪除任何現有的公共許可)
  • 桶政策:如上
  • IAM角色:不需要
  • 爲VPC端點配置的路由表
+0

看起來合法。我沒有測試過VPC端點和託管端點的網站之間的交互,假設這是正在使用的,但它似乎應該起作用。 –

1

權限在亞馬遜S3可以以多種方式被授予:

  • 直接在對象(被稱爲訪問控制列表或ACL)
  • 通過一個桶政策(適用於上整個桶,或目錄)
  • 要將IAM用戶/組/角色

如果上述任何授予訪問權限,則該對象可以被公開訪問。

您的方案需要以下配置:

  • 每個對象上的ACL應該允許公衆訪問
  • 應該有沒有鬥政策
  • 你應該分配權限的政策附加到IAM角色

每當您擁有與用戶/組/角色有關的權限時,最好在IAM而不是在桶中分配權限。使用桶策略可以訪問所有所有用戶

上的作用的政策是:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowBucketAccess", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:GetObject" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::my-bucket/*" 
      ] 
     } 
    ] 
} 

這一政策直接施加到IAM角色,所以沒有必要爲principal場。

請注意,該政策只允許GetObject - 它不允許桶的上市,上傳對象等

您也提到,「我已經將所有的文件是公開的。」如果你通過使每個單獨的對象公開可讀,那麼任何人都可以訪問這些對象。有兩種方法可以防止這種情況發生 - 可以從每個對象中刪除權限,也可以使用拒絕訪問的Deny語句創建桶策略,但仍允許角色獲得訪問權限。

這開始變得有點棘手和難以維護,所以我建議從每個對象中刪除權限。這可以通過管理控制檯通過編輯每個對象的權限來完成,或者通過使用AWS Command-Line Interface (CLI)用如下命令:

aws s3 cp s3://my-bucket s3://my-bucket --recursive --acl private 

此副本就地文件,但改變了訪問設置。

(我不是100%確定是否使用--acl private--acl bucket-owner-full-control,所以周圍有點玩。)

+0

問題在於[靜態網站端點不支持IAM驗證](http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html)。但是,他們確實尊重存儲桶策略的其他方面,因此解決方案是將對象上載爲私有,爲實例分配EIP,然後允許在存儲桶策略中使用該IP:''條件「:{」IpAddress 「:{」aws:SourceIp「:[」203.0.113.200/32「]}}'(假設EIP爲203.0.113.200)。只要您不使用S3 VPC端點(不支持'aws:SourceIp'條件),就可以按預期工作。 –

+0

此外,似乎OP可能期望實例上的IAM角色允許Nginx奇蹟般地能夠從桶中獲取對象,這是因爲Nginx運行在具有IAM角色的實例上,忽略了事實您仍然需要從實例元數據中獲取臨時憑證,並使用它們來簽署和驗證請求...這可以與REST端點一起使用,但不能與網站端點一起使用。 –

+0

啊!是的,我沒有考慮Amazon EC2實例如何從Amazon S3獲取數據。我上面的建議只適用於通過API請求獲取,但如果僅僅是提出Web請求,則不適用。 –