為什麼我在 Amazon S3 上的靜態網站仍然可以從公有 IP 地址存取,即使我限制了只有特定 Amazon VPC 才可存取?

2 分的閱讀內容
0

我使用 Amazon Simple Storage Service (Amazon S3) 託管我的靜態網站。我附加了一個儲存貯體原則,該原則限制只有來自特定的 Amazon Virtual Private Cloud (Amazon VPC) 才可存取。但是,我仍然可以從公有 IP 地址存取該網站。

解決方法

疑難排解此問題之前,請務必先完成下列步驟:

  • 清除網頁瀏覽器或代理緩存,以便檢視最新的設定。
  • 確認您從中存取儲存貯體的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體與儲存貯體位於相同的 AWS 區域。
  • VPC 端點與您使用的 EC2 執行個體的路由表建立關聯。如此一來,流量就會與儲存貯體原則中參照的 VPC ID 產生關聯。

檢查儲存貯體原則

確認儲存貯體原則允許從 VPC 存取儲存貯體。為了確認這一點,請檢閱儲存貯體原則中的陳述。例如,在請求來自於 vpc-id123456 的情況下,下列儲存貯體原則陳述允許 s3:GetObject

{
  "Version": "2012-10-17",
  "Id": "Policy1",
  "Statement": \[{
    "Sid": "Access-to-Trusted-VPC-only",
    "Effect": "Allow",
    "Principal": "\*",
    "Action": "s3:GetObject\*",
    "Resource": "arn:aws:s3:::awsexamplebucket/\*",
    "Condition": {
      "StringEquals": {
        "aws:sourceVpc": "vpc-id123456"
      }
    }
  }\]
}

**注意:**靜態網站託管允許未經身份驗證 (匿名) 請求。不過,如果使用者進行驗證,則您可以根據使用者的憑證來授予存取權限。例如,假設使用者使用具有 Amazon S3 完整存取權限的 AWS 身分和 Access Management (IAM) 角色進行身份驗證。儘管有以下儲存貯體原則,此使用者仍然可以在 VPC 之外下載物件。如需更嚴格的儲存貯體原則,請參閱僅限特定 VPC 存取。限制僅有來自特定 VPC 才可存取,即使是管理員或 AWS 帳戶根使用者,只要不是來自該特定 VPC 的請求,也會遭到拒絕存取。

檢查物件存取控制清單 (ACL)

確認儲存貯體原則正確後,請檢查是否有任何物件 ACL 允許公開存取。如果某些物件 ACL 允許公共存取,而您想要覆寫該 ACL,請執行下列其中一個動作:

  • 設定個別儲存貯體或 AWS 帳戶的公開存取設定。
  • 在儲存貯體原則中新增明確的拒絕陳述。

若要覆寫物件 ACL,請使用 Amazon S2 主控台設定個別儲存貯體的公開存取設定帳戶的公開存取設定。選取下列選項:

  • 封鎖_新的_存取控制清單 (ACL) 所授權的儲存貯體和物件公開存取權限
  • 封鎖_任何_存取控制清單 (ACL) 所授權的儲存貯體和物件公開存取權限

**注意:**您也可以使用 AWS Command Line Interface (AWS CLI)、AWS SDK 或 Amazon S3 REST API 來設定儲存貯體的公開存取設定。如需詳細資訊,請參閱封鎖對您 Amazon S3 儲存的公開存取

若要使用儲存貯體原則覆寫物件 ACL,請新增陳述,在請求不是來自特定 VPC 時,明確拒絕執行動作。例如,下列儲存貯體原則包含一項陳述,當請求不是來自 vpc-id123456 時,會明確拒絕執行 s3:GetObjectt

**警告:**由於此範例貯體原則包含明確的拒絕陳述,請在保存原則之前,檢閱參數是否明確拒絕存取。如果您不慎遭到封鎖,請參閱我不小心拒絕了所有人存取我的 Amazon S3 儲存貯體。如何重新獲得存取權限?

{
  "Version": "2012-10-17",
  "Id": "Policy1",
  "Statement": \[{
      "Sid": "Access-to-Trusted-VPC-only",
      "Effect": "Allow",
      "Principal": "\*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::awsexamplebucket/\*",
      "Condition": {
        "StringEquals": {
          "aws:sourceVpc": "vpc-id123456"
        }
      }
    },
    {
      "Sid": "Deny-Access-Except-For-Trusted-VPC",
      "Effect": "Deny",
      "Principal": "\*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::awsexamplebucket/\*",
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpc": "vpc-id123456"
        }
      }
    }
  \]
}

相關資訊

AWS 原則產生器

AWS 官方
AWS 官方已更新 1 年前