將 Amazon API Gateway 方法設定為自訂身分提供者 - AWS Transfer Family

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 Amazon API Gateway 方法設定為自訂身分提供者

本教學課程說明如何設定 Amazon API Gateway 方法,並將其用作將檔案上傳至 AWS Transfer Family 伺服器的自訂身分提供者。本教學課程僅使用基本堆疊範本和其他基本功能做為範例。

先決條件

在 中建立 Transfer Family 資源之前 CloudFormation,請建立您的儲存體和使用者角色。

指定儲存體並建立使用者角色
  1. 視您使用的儲存體而定,請參閱下列文件:

  2. 若要建立使用者角色,請參閱 建立 IAM 角色和政策

您可以在下一節中建立 CloudFormation 堆疊時,輸入儲存體和使用者角色的詳細資訊。

步驟 1:建立 CloudFormation 堆疊

從提供的範本建立 AWS CloudFormation 堆疊
  1. 在 https://https://console.aws.amazon.com/cloudformation 開啟 CloudFormation 主控台。

  2. 選取建立堆疊,然後選擇使用新資源 (標準)

  3. 先決條件 - 準備範本窗格中,選擇選擇現有範本

  4. 複製此連結、基本堆疊範本,並將其貼入 Amazon S3 URL 欄位。

  5. 按一下 Next (下一步)

  6. 指定參數,包括堆疊的名稱。請務必執行下列動作:

    • 取代 UserNameUserPassword 的預設值。

    • 針對 UserHomeDirectory,輸入您先前建立之儲存體 (Amazon S3 儲存貯體或 Amazon EFS 檔案系統) 的詳細資訊。

    • 將預設 UserRoleArn 取代為您先前建立的使用者角色。 AWS Identity and Access Management (IAM) 角色必須具有適當的許可。如需 IAM 角色和儲存貯體政策的範例,請參閱 步驟 6:限制對儲存貯體的存取

    • 如果您想要使用公有金鑰而非密碼進行身分驗證,請在 UserPublicKey1 欄位中輸入公有金鑰。第一次使用 SFTP 連線到伺服器時,您會提供私有金鑰而非密碼。

  7. 選擇下一步,然後在設定堆疊選項頁面上再次選擇下一步

  8. 檢閱您要建立之堆疊的詳細資訊,然後選擇建立堆疊

    注意

    在頁面底部的功能下,您必須確認 CloudFormation 可能會建立 IAM 資源。

步驟 2:檢查伺服器的 API Gateway 方法組態

注意

為了提高安全性,您可以設定 Web 應用程式防火牆。 AWS WAF 是一種 Web 應用程式防火牆,可讓您監控轉送至 Amazon API Gateway 的 HTTP 和 HTTPS 請求。如需詳細資訊,請參閱新增 Web 應用程式防火牆

請勿啟用 API Gateway 快取

將 API Gateway 方法用作 Transfer Family 的自訂身分提供者時,請勿啟用 API Gateway 方法的快取。快取對身分驗證請求不適當且無效,因為:

  • 每個身分驗證請求都是唯一的,需要即時回應,而不是快取的回應

  • 快取沒有好處,因為 Transfer Family 絕不會將重複或重複的請求傳送至 API Gateway

  • 啟用快取會導致 API Gateway 以不相符的資料回應,導致身分驗證請求的回應無效

檢查伺服器的 API Gateway 方法組態並進行部署
  1. 在以下網址開啟 API Gateway 主控台:https://console.aws.amazon.com/apigateway/

  2. 選擇 CloudFormation 範本產生的 Transfer Custom Identity Provider 基本範本 API

  3. 資源窗格中,選擇 GET,然後選擇方法請求

  4. 針對動作,選擇部署 API。針對部署階段,選擇 prod,然後選擇部署

    成功部署 API Gateway 方法後,請在階段編輯器區段中檢視其效能。

    注意

    複製出現在頁面頂端的調用 URL 地址。下一個步驟將需要它。

步驟 3:檢視 Transfer Family 伺服器詳細資訊

當您使用 範本建立 CloudFormation 堆疊時,會自動建立 Transfer Family 伺服器。

檢視 Transfer Family 伺服器詳細資訊
  1. 在 https://https://console.aws.amazon.com/cloudformation 開啟 CloudFormation 主控台。

  2. 選擇您建立的堆疊。

  3. 選擇 Resources (資源) 標籤。

    畫面顯示建立 CloudFormation 堆疊期間建立的資源清單,並反白顯示 Transfer Family 伺服器的詳細資訊。

    伺服器 ARN 會顯示在 TransferServer 資料列的實體 ID 欄中。伺服器 ID 包含在 ARN 中,例如 s-11112222333344445

  4. 在 https://https://console.aws.amazon.com/transfer/ 開啟 AWS Transfer Family 主控台,然後在伺服器頁面上選擇新的伺服器。

    伺服器 ID 符合 TransferServer 資源顯示的 ID CloudFormation。

步驟 4:測試您的使用者是否可以連線到伺服器

若要測試您的使用者是否可以連線至伺服器,請使用 Transfer Family 主控台
  1. 在 https://https://console.aws.amazon.com/transfer/ 開啟 AWS Transfer Family 主控台。

  2. 伺服器頁面上,選擇您的新伺服器,選擇動作,然後選擇測試

  3. 使用者名稱欄位中輸入登入資料的文字,然後在密碼欄位中輸入。這些是您部署 CloudFormation 堆疊時設定的值。

  4. 針對伺服器通訊協定,選取 SFTP,針對來源 IP,輸入 127.0.0.1

  5. 選擇測試

    如果使用者身分驗證成功,測試會傳回 StatusCode: 200 HTML 回應和 JSON 物件,其中包含使用者角色和許可的詳細資訊。例如:

    { "Response": "{\"Role\": \"arn:aws:iam::123456789012:role/my-user-role\",\"HomeDirectory\": \"/${transfer:HomeBucket}/\"}", "StatusCode": 200, "Message": "", "Url": "https://1a2b3c4d5e.execute-api.us-east-2.amazonaws.com/prod/servers/s-1234abcd5678efgh0/users/myuser/config" }

    如果測試失敗,請將其中一個 API Gateway AWS 受管政策新增至您用於 API 的角色。

步驟 5:測試 SFTP 連線和檔案傳輸

測試 SFTP 連線
  1. 在 Linux 或 macOS 裝置上,開啟命令終端機。

  2. 輸入下列其中一個命令,取決於您使用密碼或金鑰對進行身分驗證。

    • 如果您使用的是密碼,請輸入此命令:

      sftp -o PubkeyAuthentication=no myuser@server-ID.server.transfer.region-code.amazonaws.com

      出現提示時,輸入您的密碼。

    • 如果您使用的是金鑰對,請輸入此命令:

      sftp -i private-key-file myuser@server-ID.server.transfer.region-code.amazonaws.com

    注意

    對於這些sftp命令,請插入 Transfer Family 伺服器所在的 AWS 區域 程式碼。例如,如果您的伺服器位於美國東部 (俄亥俄),請輸入 us-east-2

  3. 出現sftp>提示時,請確定您可以上傳 (put)、下載 (get) 和檢視目錄和檔案 (pwdls)。

步驟 6:限制對儲存貯體的存取

您可以限制可存取特定 Amazon S3 儲存貯體的人員。下列範例顯示要在 CloudFormation 堆疊和您為使用者選取的政策中使用的設定。

在此範例中,我們為 CloudFormation 堆疊設定下列參數:

  • CreateServertrue

  • UserHomeDirectory/amzn-s3-demo-bucket1

  • UserNamemyuser

  • UserPasswordMySuperSecretPassword

    重要

    這是範例密碼。當您設定 API Gateway 方法時,請務必輸入強式密碼。

  • UserPublicKey1your-public-key

  • UserRoleArnarn:aws:iam::role-id:role/myuser-api-gateway-role

UserPublicKey1 是您作為公有/私有金鑰對的一部分產生的公有金鑰。

對於您建立的使用者角色而言, role-id是唯一的。連接到 的政策myuser-api-gateway-role如下:

{ "Version":"2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObjectAcl", "s3:GetObject", "s3:DeleteObjectVersion", "s3:DeleteObject", "s3:PutObjectAcl", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*" } ] }

若要使用 SFTP 連線至伺服器,請在提示中輸入下列其中一個命令。

  • 如果您使用密碼進行身分驗證,請執行下列命令:

    sftp -o PubkeyAuthentication=no myuser@transfer-server-ID.server.transfer.region-id.amazonaws.com

    出現提示時,輸入您的密碼。

  • 如果您使用金鑰對進行身分驗證,請執行下列命令:

    sftp -i private-key-file myuser@transfer-server-ID.server.transfer.region-id.amazonaws.com

注意

對於這些sftp命令,請使用 AWS 區域 Transfer Family 伺服器所在的 的 ID。例如,如果您的伺服器位於美國東部 (俄亥俄),請使用 us-east-2

出現sftp提示時,系統會將您導向主目錄,您可以透過執行 pwd命令來檢視主目錄。例如:

sftp> pwd Remote working directory: /amzn-s3-demo-bucket1

使用者無法檢視主目錄上方的任何目錄。例如:

sftp> pwd Remote working directory: /amzn-s3-demo-bucket1 sftp> cd .. sftp> ls Couldn't read directory: Permission denied

如果使用 Amazon EFS,請更新 Lambda

如果您選取 Amazon EFS 做為 Transfer Family 伺服器的儲存選項,則需要編輯堆疊的 lambda 函數。

將 Posix 設定檔新增至 Lambda 函數
  1. 開啟位於 https://https://console.aws.amazon.com/lambda/ 的 Lambda 主控台。

  2. 選取您先前建立的 Lambda 函數。Lambda 函數的格式為 stack-name-GetUserConfigLambda-lambda-identifier,其中 stack-name 是 CloudFormation 堆疊名稱,lambda-identifier 是函數的識別符。

  3. 程式碼索引標籤中,選取 index.js 以顯示函數的程式碼。

  4. 在 中response,在 Policy和 之間新增下列行HomeDirectory

    PosixProfile: {"Uid": uid-value, "Gid": gid-value},

    其中 uid-valuegid-value 是整數 0 或更高,分別代表使用者 ID 和群組 ID。

    例如,在您新增 Posix 設定檔之後,回應欄位可能如下所示:

    response = { Role: 'arn:aws:iam::123456789012:role/api-gateway-transfer-efs-role', // The user will be authenticated if and only if the Role field is not blank Policy: '', // Optional JSON blob to further restrict this user's permissions PosixProfile: {"Gid": 65534, "Uid": 65534}, HomeDirectory: '/fs-fab2c234' // Not required, defaults to '/' };