如何將 AWS Transfer Family 伺服器設定為使用另一個 AWS 帳戶中的 Amazon S3 儲存貯體?

2 分的閱讀內容
0

我希望帳戶 A 中的 AWS Transfer Family 伺服器能夠存取另一個帳戶中的 Amazon Simple Storage Service (Amazon S3) 儲存貯體,即帳戶 B。我想透過對跨帳戶存取儲存貯體來設定我的伺服器。

簡短說明

請遵循下列步驟:

  1. 在可存取儲存貯體的帳戶 A 中建立 AWS Identity 和 Access Management (IAM) 角色。
  2. 更新儲存貯體政策以授予帳戶 B 中 IAM 角色的跨帳戶存取權。
  3. 在帳戶 A 中建立通過 IAM 角色設定的 Transfer Family 伺服器使用者。
  4. 確認帳戶 A 中的 Transfer Family 伺服器使用者可以存取帳戶 B 中的 S3 儲存貯體。
  5. (選用) 將 S3 Object Ownership 設為帳戶 B 中偏好的儲存貯體擁有者。

**注意:**AWS Transfer Family 主控台只會顯示同一帳戶中的 Amazon S3 儲存貯體。若要將您的 Transfer Family 伺服器與其他帳戶中的儲存貯體搭配使用,您必須使用 AWS Command Line Interface (AWS CLI) 或 AWS SDK。

解決方法

在帳戶 A 中建立可存取儲存貯體的 IAM 角色

為您的伺服器使用者建立 IAM 角色。對於角色的 IAM 政策,請使用以下內容:

**注意:**將 destination-DOC-EXAMPLE-BUCKET 取代為您希望伺服器存取的 S3 儲存貯體名稱。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingBucketReadandWriteandDelete",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
      ]
    }
  ]
}

**注意:**Transfer Family 需要 s3:PutObjectAcl 的權限才能進行跨帳戶 S3 上傳。

建立 IAM 角色之後,請執行 get-role 命令來取得角色的 ID,如下所示:

$ aws iam get-role --role-name "ROLE_NAME"

您需要角色 ID 才能進行下一個步驟。

更新儲存貯體政策以授予帳戶 B 中 IAM 角色的跨帳戶存取權

修改目的地儲存貯體的政策,以授予您建立的 IAM 角色存取權。您可以使用類似下列內容的儲存貯體政策:

**注意:**將 arn:aws:iam::123456789012:root 取代為您伺服器所屬帳戶的 Amazon Resource Name (ARN)。將 destination-DOC-EXAMPLE-BUCKET 取代為儲存貯體的名稱。將 AROA1234567890 取代為您建立的 IAM 角色的角色 ID。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "BucketPolicyForTransferFamily",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringLike": {
          "aws:userId": "AROA1234567890:*"
        }
      }
    }
  ]
}

此範例政策中的條件元素為選用。包括條件元素,以僅將儲存貯體存取權授予您指定的 IAM 角色。或者,移除元素,將存取權授予伺服器所屬帳戶中的所有 IAM 角色和使用者。

在帳戶 A 中建立使用 IAM 角色設定的 Transfer Family 伺服器使用者

1.    為您的 Transfer Family 伺服器產生 SSH 金鑰

2.    獲取伺服器的伺服器 ID

3.    使用 AWS CLI 執行 create-user 命令。對於 --server-id,輸入伺服器的 ID。對於 --role,輸入您建立的 IAM 角色的 ARN。對於 --ssh-public-key-body,輸入建立 SSH 金鑰時所產生的 **.pub ** 檔案內容。

$ aws transfer create-user --user-name "MY_SERVER_USER_NAME" --server-id "MY_SERVER_ID"  --role "MY_IAM_ROLE_ARN" --home-directory "/destination-DOC-EXAMPLE-BUCKET/MY_SERVER_USER_NAME" --ssh-public-key-body "CONTENTS_OF_MY_SSH_.PUB_FILE"

**注意:**如果您在執行 AWS CLI 命令時收到錯誤訊息,請確定您使用的是最新版本的 AWS CLI

該命令會傳回伺服器 ID 和您建立的使用者:

{
  "ServerId": "MY_SERVER_ID",
  "UserName": "MY_SERVER_USER_NAME"
}

**重要事項:**若要限制伺服器使用者只能存取其主目錄,請在 IAM 中建立縮小範圍政策。然後,編輯伺服器使用者的屬性,以套用您建立的縮小範圍政策。

確認帳戶 A 中的 Transfer Family 伺服器使用者可以存取帳戶 B 中的儲存貯體

1.    以您建立的使用者身分連線至您的伺服器。例如,該 OpenSSH 指令會連線到一個 SFTP 伺服器:

$ sftp -i myserveruser MY_SERVER_USER_NAME@MY_SERVER_ID.server.transfer.us-east-1.amazonaws.com

2.    作為測試,請列出儲存貯體的主目錄。如果您正在使用 OpenSSH,請執行以下命令:

$ ls

如果命令傳回主目錄,則您的伺服器使用者可以跨帳戶存取儲存貯體。

(選用) 將 S3 物件擁有權設定為帳戶 B 中偏好的儲存貯體擁有者

根據預設,Amazon S3 物件由上傳物件的 AWS 帳戶擁有。這表示根據預設,上傳至目的地儲存貯體的物件由來源伺服器帳戶所擁有。

若要啟用目標帳戶以自動擁有跨帳戶上傳的物件,請將目的地儲存貯體的 S3 物件擁有權設定為偏好的儲存貯體擁有者。執行此操作之後,透過 AWS Transfer Family 伺服器上傳的所有新物件都會自動歸目的地儲存貯體的帳戶擁有。


相關資訊

建立使用者 (AWS Transfer Family 使用者指南)

新增使用者 (AWS Transfer Family 使用者指南)

Amazon S3 如何授權請求

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