如何將 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 如何授權請求