

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

# 管理伺服器端點的使用者
<a name="create-user"></a>

在下列各節中，您可以找到如何使用 AWS Transfer Family AWS Directory Service for Microsoft Active Directory 或自訂身分提供者新增使用者的相關資訊。

每個使用者的屬性中也要存放該使用者的 Secure Shell (SSH) 公有金鑰。金鑰型身分驗證需要這樣做。私有金鑰存放在您使用者的本機電腦上。當您的使用者使用用戶端傳送身分驗證請求到您的伺服器時，您的伺服器會先確認使用者有權存取相關聯的 SSH 私有金鑰。伺服器接著會成功驗證使用者。

**注意**  
如需具有多個 SSH 金鑰之使用者的自動化部署和管理，請參閱 [Transfer 系列 Terraform 模組](terraform.md)。

此外，您可以指定使用者的主目錄或登陸目錄，並將 AWS Identity and Access Management (IAM) 角色指派給使用者。或者，您可以提供工作階段政策，以限制使用者只能存取 Amazon S3 儲存貯體的主目錄。

**重要**  
AWS Transfer Family 會封鎖從驗證到 SFTP 伺服器長度為 1 或 2 個字元的使用者名稱。此外，我們也封鎖`root`使用者名稱。  
原因在於密碼掃描器嘗試大量惡意登入。

## Amazon EFS 與 Amazon S3
<a name="efs-vs-s3-users"></a>

每個儲存選項的特性：
+ 若要限制存取：Amazon S3 支援工作階段政策；Amazon EFS 支援 POSIX 使用者、群組和次要群組 IDs
+  兩者都支援公有/私有金鑰 
+  兩者都支援主目錄 
+  兩者都支援邏輯目錄 
**注意**  
 對於 Amazon S3，邏輯目錄的大多數支援是透過 API/CLI 提供。您可以使用 主控台中的**受限制**核取方塊，將使用者鎖定至其主目錄，但無法指定虛擬目錄結構。

## 邏輯目錄
<a name="logical-dir-users"></a>

如果您要為使用者指定邏輯目錄值，您使用的 參數取決於使用者的類型。
+ 對於服務受管使用者，請在 中提供邏輯目錄值`HomeDirectoryMappings`。
+ 對於自訂身分提供者使用者，請在 中提供邏輯目錄值`HomeDirectoryDetails`。

AWS Transfer Family 支援在使用 LOGICAL HomeDirectory HomeDirectoryType 值。這適用於回應中提供 HomeDirectoryDetails 的服務受管使用者、Active Directory 存取和自訂身分提供者實作。

**重要**  
使用 LOGICAL HomeDirectory HomeDirectoryType 時，該值必須映射至其中一個邏輯目錄映射。服務會在使用者建立和更新期間驗證這一點，以防止組態無法運作。

### 預設行為
<a name="logical-dir-default"></a>

根據預設，如果未指定，則 LOGICAL 模式的 HomeDirectory 設定為 "/"。此行為保持不變，並保持與現有使用者定義相容。
+ 請務必將您的 HomeDirectory 映射至 *項目*，而非*目標*。如需詳細資訊，請參閱[使用邏輯目錄的規則](logical-dir-mappings.md#logical-dir-rules)。
+ 如需如何建構虛擬目錄的詳細資訊，請參閱 [虛擬目錄結構](implement-log-dirs.md#virtual-dirs)。

### 自訂身分提供者考量事項
<a name="logical-dir-custom-idp"></a>

使用自訂身分提供者時，您現在可以在使用 LOGICAL HomeDirectory HomeDirectoryType。當自訂 IDP 在 LOGICAL 模式中指定 HomeDirectory 時，TestIdentityProvider API 呼叫會產生正確的結果。

HomeDirectory 和 LOGICAL HomeDirectoryType 的自訂 IDP 回應範例：

```
{
  "Role": "arn:aws:iam::123456789012:role/transfer-user-role",
  "HomeDirectoryType": "LOGICAL",
  "HomeDirectory": "/marketing",
  "HomeDirectoryDetails": "[{\"Entry\":\"/\",\"Target\":\"/bucket/home\"},{\"Entry\":\"/marketing\",\"Target\":\"/marketing-bucket/campaigns\"}]"
}
```

## Active Directory 群組配額
<a name="ad-group-quotas"></a>

AWS Transfer Family 預設限制為每個伺服器 100 個 Active Directory 群組。如果您的使用案例需要超過 100 個群組，請考慮使用自訂身分提供者解決方案，如[透過 的自訂身分提供者簡化 Active Directory 身分驗證 AWS Transfer Family](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述。

此限制適用於使用下列身分提供者的伺服器：
+ AWS Directory Service for Microsoft Active Directory
+ AWS 適用於 Entra ID Domain Services 的 Directory Service

如果您需要請求提高服務限制，請參閱 中的[AWS 服務 配額](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)*AWS 一般參考*。如果您的使用案例需要超過 100 個群組，請考慮使用自訂身分提供者解決方案，如[透過 的自訂身分提供者簡化 Active Directory 身分驗證 AWS Transfer Family](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述。

如需 Active Directory 群組限制的疑難排解資訊，請參閱 [超過 Active Directory 群組限制](auth-issues.md#managed-ad-group-limits)。

**Topics**
+ [Amazon EFS 與 Amazon S3](#efs-vs-s3-users)
+ [邏輯目錄](#logical-dir-users)
+ [Active Directory 群組配額](#ad-group-quotas)
+ [使用服務受管使用者](service-managed-users.md)
+ [使用自訂身分提供者](custom-idp-intro.md)
+ [使用 AWS Directory Service for Microsoft Active Directory](directory-services-users.md)
+ [使用 AWS Directory Service for Entra ID Domain Services](azure-sftp.md)

# 使用服務受管使用者
<a name="service-managed-users"></a>

視伺服器的**網域**設定而定，您可以將 Amazon S3 或 Amazon EFS 服務受管使用者新增至您的伺服器。如需詳細資訊，請參閱[設定 SFTP、FTPS 或 FTP 伺服器端點](tf-server-endpoint.md)。

如果您使用服務受管身分類型，您可以將使用者新增至已啟用檔案傳輸通訊協定的伺服器。當您這樣做時，每個使用者名稱在伺服器上都必須是唯一的。

若要以程式設計方式新增服務受管使用者，請參閱 [CreateUser](https://docs.aws.amazon.com/transfer/latest/APIReference/API_CreateUser.html) API [的範例](https://docs.aws.amazon.com/transfer/latest/APIReference/API_CreateUser.html#API_CreateUser_Examples)。

**注意**  
對於服務受管使用者，限制為 2，000 個邏輯目錄項目。如需使用邏輯目錄的詳細資訊，請參閱 [使用邏輯目錄來簡化 Transfer Family 目錄結構](logical-dir-mappings.md)。

**Topics**
+ [新增 Amazon S3 服務受管使用者](#add-s3-user)
+ [新增 Amazon EFS 服務受管使用者](#add-efs-user)
+ [管理服務受管使用者](#managing-service-managed-users)

## 新增 Amazon S3 服務受管使用者
<a name="add-s3-user"></a>

**注意**  
 如果您想要設定跨帳戶 Amazon S3 儲存貯體，請遵循本 知識中心文章中所述的步驟：[如何設定我的 AWS Transfer Family 伺服器以使用另一個 AWS 帳戶中的 Amazon Simple Storage Service 儲存貯體？](https://aws.amazon.com/premiumsupport/knowledge-center/sftp-cross-account-s3-bucket/)。

**將 Amazon S3 服務受管使用者新增至您的伺服器**

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台，然後從導覽窗格中選取**伺服器**。

1. 在**伺服器**頁面上，選取您要新增使用者之伺服器的核取方塊。

1. 選擇**新增使用者**。

1. 在**使用者組態**區段中，針對**使用者名稱**輸入使用者名稱。此使用者名稱必須至少為 3 個字元，最多為 100 個字元。您可以在使用者名稱中使用下列字元：a–z、A-Z、0–9、底線 '\$1'、連字號 '-'、句點 '.' 和符號 '@'。使用者名稱開頭不能是連字號 '-'、句點 '.' 或符號 '@'。

1. 針對 **Access**，選擇您先前建立的 IAM 角色，該角色可讓您存取 Amazon S3 儲存貯體。

   您使用[建立 IAM 角色和政策](requirements-roles.md)的程序建立此 IAM 角色。該 IAM 角色包含 IAM 政策，可讓您存取 Amazon S3 儲存貯體。它還包含與 AWS Transfer Family 服務的信任關係，在另一個 IAM 政策中定義。如果您需要為使用者微調存取控制，請參閱[使用 AWS Transfer Family 和 Amazon S3 增強資料存取控制](https://aws.amazon.com/blogs/storage/enhance-data-access-control-with-aws-transfer-family-and-amazon-s3-access-points/)部落格文章。

1. （選用） 針對**政策**，選取下列其中一項：
   + **無**
   + **現有政策**
   + **從 IAM 選取政策**： 可讓您選擇現有的工作階段政策。選擇**檢視**以查看包含政策詳細資訊的 JSON 物件。
   + **根據主資料夾自動產生政策**： 會為您產生工作階段政策。選擇**檢視**以查看包含政策詳細資訊的 JSON 物件。
**注意**  
如果您選擇**根據主資料夾自動產生政策**，請勿為此使用者選取**限制**。

   若要進一步了解工作階段政策，請參閱 [建立 IAM 角色和政策](requirements-roles.md)、 [為 Amazon S3 儲存貯體建立工作階段政策](users-policies-session.md)或 [動態許可管理方法](dynamic-permission-management.md)。

1. 針對**主目錄**，選擇 Amazon S3 儲存貯體以存放要使用的資料 AWS Transfer Family。輸入使用者使用用戶端登入時所到達`home`目錄的路徑。

   如果您將此參數保留空白，則會使用 Amazon S3 儲存貯體的`root`目錄。在本例中，請確定您的 IAM 角色能夠存取此 `root` 目錄。
**注意**  
我們建議您選擇包含使用者名稱的目錄路徑，這可讓您有效地使用工作階段政策。工作階段政策會將 Amazon S3 儲存貯體中的使用者存取權限制在該使用者的`home`目錄。

1. （選用） 對於**受限**，選取核取方塊，讓您的使用者無法存取該資料夾以外的任何內容，也看不到 Amazon S3 儲存貯體或資料夾名稱。
**注意**  
為使用者指派主目錄，並將使用者限制為該主目錄，應足以鎖定使用者對指定資料夾的存取權。如果您需要套用進一步的控制項，請使用工作階段政策。  
如果您為此使用者選取**限制**，則無法**根據主資料夾選取自動產生政策**，因為主資料夾不是受限制使用者的定義值。

1. 針對 **SSH 公有金鑰**，輸入 SSH 金鑰對的公有 SSH 金鑰部分。

   金鑰要先經服務驗證，您才能新增新使用者。
**注意**  
如需如何產生 SSH 金鑰對的說明，請參閱[為服務受管使用者產生 SSH 金鑰](sshkeygen.md)。

1. （選用） 針對**索引鍵**和**值**，輸入一或多個標籤做為索引鍵/值對，然後選擇**新增標籤**。

1. 選擇 **Add (新增)** 將新使用者新增至您選擇的伺服器。

   新使用者會出現在**伺服器詳細資訊**頁面**的使用者**區段中。

**後續步驟** – 對於下一個步驟，請繼續執行 [使用用戶端透過伺服器端點傳輸檔案](transfer-file.md)。

## 新增 Amazon EFS 服務受管使用者
<a name="add-efs-user"></a>

Amazon EFS 使用可攜式作業系統界面 (POSIX) 檔案許可模型來代表檔案擁有權。
+  如需 Amazon EFS 檔案擁有權的詳細資訊，請參閱 [Amazon EFS 檔案擁有權](configure-storage.md#efs-file-ownership)。
+ 如需為您的 EFS 使用者設定目錄的詳細資訊，請參閱 [為 Transfer 系列設定 Amazon EFS 使用者](configure-storage.md#configure-efs-users-permissions)。

**將 Amazon EFS 服務受管使用者新增至您的伺服器**

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台，然後從導覽窗格中選取**伺服器**。

1. 在**伺服器**頁面上，選取要新增使用者的 Amazon EFS 伺服器。

1. 選擇**新增使用者**以顯示**新增使用者**頁面。

1. 在**使用者組態**區段中，使用下列設定。

   1. **使用者名稱** 必須至少為 3 個字元，最多為 100 個字元。您可以在使用者名稱中使用下列字元：a–z、A-Z、0–9、底線 '\$1'、連字號 '-'、句點 '.' 和符號 "@"。使用者名稱開頭不能是連字號 '-'、句點 '.' 或符號 "@"。

   1.  對於**使用者 ID** 和**群組 ID**，請注意下列事項：
      + 對於您建立的第一個使用者，我們建議您**0**為**群組 ID** 和**使用者 ID** 輸入 的值。這會授予 Amazon EFS 的使用者管理員權限。
      + 對於其他使用者，輸入使用者的 POSIX 使用者 ID 和群組 ID。這些 IDs用於使用者執行的所有 Amazon Elastic File System 操作。
      + 對於**使用者 ID** 和**群組 ID**，請勿使用任何前導零。例如， **12345** 是可接受的， **012345** 是不可接受的。

   1. （選用） 對於**次要群組 IDs**，為每個使用者輸入一或多個額外的 POSIX 群組 IDs，以逗號分隔。

   1. 針對 **Access**，選擇符合下列條件的 IAM 角色：
      + 讓使用者只能存取您希望他們存取的 Amazon EFS 資源 （檔案系統）。
      + 定義使用者可執行和無法執行的檔案系統操作。

      我們建議您使用 IAM 角色來選取 Amazon EFS 檔案系統，以及掛載存取和讀取/寫入許可。例如，以下兩個 AWS 受管政策的組合雖然相當寬鬆，但 會為您的使用者授予必要的許可：
      +  AmazonElasticFileSystemClientFullAccess 
      +  AWSTransferConsoleFullAccess 

      如需詳細資訊，請參閱部落格文章對 [AWS Transfer Family Amazon Elastic File System 的支援](https://aws.amazon.com/blogs/aws/new-aws-transfer-family-support-for-amazon-elastic-file-system/)。

   1. 對於**主目錄**，請執行下列動作：
      + 選擇您要用於儲存資料以使用 傳輸的 Amazon EFS 檔案系統 AWS Transfer Family。
      + 決定是否將主目錄設定為**受限制**。將主目錄設定為**受限制**具有下列效果：
        + Amazon EFS 使用者無法存取該資料夾以外的任何檔案或目錄。
        + Amazon EFS 使用者看不到 Amazon EFS 檔案系統名稱 (**fs-xxxxxxx**)。
**注意**  
當您選取**限制**選項時，不會為 Amazon EFS 使用者解析符號連結。
      + （選用） 輸入您要使用者在使用用戶端登入時所在的主目錄路徑。

        如果您未指定主目錄，則會使用 Amazon EFS 檔案系統的根目錄。在此情況下，請確定您的 IAM 角色提供此根目錄的存取權。

1. 針對 **SSH 公有金鑰**，輸入 SSH 金鑰對的公有 SSH 金鑰部分。

   金鑰要先經服務驗證，您才能新增新使用者。
**注意**  
如需如何產生 SSH 金鑰對的說明，請參閱[為服務受管使用者產生 SSH 金鑰](sshkeygen.md)。

1. （選用） 輸入使用者的任何標籤。針對**索引鍵**和**值**，輸入一或多個標籤做為索引鍵/值對，然後選擇**新增標籤**。

1. 選擇 **Add (新增)** 將新使用者新增至您選擇的伺服器。

   新使用者會出現在**伺服器詳細資訊**頁面**的使用者**區段中。

 第一次將 SFTP 傳送到 Transfer Family 伺服器時可能遇到的問題：
+  如果您執行 `sftp`命令但未出現提示，您可能會遇到下列訊息：

   `Couldn't canonicalize: Permission denied` 

   `Need cwd` 

   在此情況下，您必須增加使用者角色的政策許可。您可以新增 AWS 受管政策，例如 `AmazonElasticFileSystemClientFullAccess`。
+ 如果您在`sftp`提示`pwd`中輸入 以檢視使用者的主目錄，您可能會看到以下訊息，其中 *USER-HOME-DIRECTORY* 是 SFTP 使用者的主目錄：

   `remote readdir("/USER-HOME-DIRECTORY"): No such file or directory` 

  在此情況下，您應該能夠導覽至父目錄 (`cd ..`)，並建立使用者的主目錄 (`mkdir username`)。

**後續步驟** – 對於下一個步驟，請繼續執行 [使用用戶端透過伺服器端點傳輸檔案](transfer-file.md)。

## 管理服務受管使用者
<a name="managing-service-managed-users"></a>

 在本節中，您可以找到如何檢視使用者清單、如何編輯使用者詳細資訊，以及如何新增 SSH 公有金鑰的相關資訊。
+ [檢視使用者清單](#list-users)
+ [檢視或編輯使用者詳細資訊](#view-user-details)
+ [刪除使用者](#delete-user)
+ [新增 SSH 公有金鑰](#add-user-ssh-key)
+ [刪除 SSH 公有金鑰](#delete-user-ssh-key)<a name="list-users"></a>

**尋找您的使用者清單**

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台。

1. 從導覽窗格中選取**伺服器**以顯示**伺服器**頁面。

1. 在**伺服器 ID** 欄中選擇識別符，以查看**伺服器詳細資訊**頁面。

1. 在**使用者**下，檢視使用者清單。<a name="view-user-details"></a>

**檢視或編輯使用者詳細資訊**

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台。

1. 從導覽窗格中選取**伺服器**以顯示**伺服器**頁面。

1. 在**伺服器 ID** 欄中選擇識別符，以查看**伺服器詳細資訊**頁面。

1. 在**使用者**下，選擇使用者名稱以查看**使用者詳細資訊**頁面。

   您可以選擇**編輯**，在此頁面上變更使用者的屬性。

1. 在**使用者詳細資訊**頁面上，選擇**使用者組態**旁的**編輯**。  
![\[顯示編輯使用者組態畫面的影像\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/edit-user-details-page-user-config.png)

1. 在**編輯組態**頁面上，針對**存取**，選擇您先前建立的 IAM 角色，以提供對 Amazon S3 儲存貯體的存取。

   您使用[建立 IAM 角色和政策](requirements-roles.md)的程序建立此 IAM 角色。該 IAM 角色包含 IAM 政策，可讓您存取 Amazon S3 儲存貯體。它還包含與 AWS Transfer Family 服務的信任關係，在另一個 IAM 政策中定義。

1. （選用） 針對**政策**，選擇下列其中一項：
   + **無**
   + **現有政策**
   + **從 IAM 選取政策**以選擇現有的政策。選擇**檢視**以查看包含政策詳細資訊的 JSON 物件。

   若要進一步了解工作階段政策，請參閱 [建立 IAM 角色和政策](requirements-roles.md)。若要進一步了解如何建立工作階段政策，請參閱 [為 Amazon S3 儲存貯體建立工作階段政策](users-policies-session.md)。

1. 針對**主目錄**，選擇 Amazon S3 儲存貯體以存放要使用的資料 AWS Transfer Family。輸入使用者使用用戶端登入時所到達`home`目錄的路徑。

   如果您將此參數保留空白，則會使用 Amazon S3 儲存貯體的`root`目錄。在本例中，請確定您的 IAM 角色能夠存取此 `root` 目錄。
**注意**  
我們建議您選擇包含使用者名稱的目錄路徑，這可讓您有效地使用工作階段政策。工作階段政策會將 Amazon S3 儲存貯體中的使用者存取權限制在該使用者的`home`目錄。

1. （選用） 對於**受限**，選取核取方塊，讓您的使用者無法存取該資料夾以外的任何內容，也看不到 Amazon S3 儲存貯體或資料夾名稱。
**注意**  
將主目錄指派給使用者，並將使用者限制為該主目錄時，這應該足以鎖定使用者對指定資料夾的存取權。當您需要套用進一步的控制項時，請使用工作階段政策。

1. 選擇**儲存**，以儲存變更。<a name="delete-user"></a>

**若要刪除使用者**

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台。

1. 從導覽窗格中選取**伺服器**以顯示**伺服器**頁面。

1. 在**伺服器 ID** 欄中選擇識別符，以查看**伺服器詳細資訊**頁面。

1. 在**使用者**下，選擇使用者名稱以查看**使用者詳細資訊**頁面。

1. 在**使用者詳細資訊**頁面上，選擇使用者名稱右側的**刪除**。

1. 在出現的確認對話方塊中，輸入字詞 **delete**，然後選擇**刪除**以確認您想要刪除使用者。

 使用者會從使用者****清單中刪除。<a name="add-user-ssh-key"></a>

**為使用者新增 SSH 公有金鑰**

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台。

1. 在導覽窗格中，選擇 **Servers (伺服器)**。

1. 在**伺服器 ID** 欄中選擇識別符，以查看**伺服器詳細資訊**頁面。

1. 在**使用者**下，選擇使用者名稱以查看**使用者詳細資訊**頁面。

1. 選擇 **Add SSH public key (新增 SSH 公有金鑰)** 來將新的 SSH 公有金鑰新增至使用者。
**注意**  
SSH 金鑰僅供啟用 Secure Shell (SSH) 檔案傳輸通訊協定 (SFTP) 的伺服器使用。如需如何產生 SSH 金鑰對的資訊，請參閱 [為服務受管使用者產生 SSH 金鑰](sshkeygen.md)。

1. 針對 **SSH public key (SSH 公有金鑰)**，輸入 SSH 金鑰對的 SSH 公有金鑰部分。

   金鑰要先經服務驗證，您才能新增新使用者。SSH 金鑰的格式是 `ssh-rsa string`。若要產生 SSH 金鑰對，請參閱 [為服務受管使用者產生 SSH 金鑰](sshkeygen.md)。

1. 選擇 **Add key (新增金鑰)**。<a name="delete-user-ssh-key"></a>

**刪除使用者的 SSH 公有金鑰**

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台。

1. 在導覽窗格中，選擇 **Servers (伺服器)**。

1. 在**伺服器 ID** 欄中選擇識別符，以查看**伺服器詳細資訊**頁面。

1. 在**使用者**下，選擇使用者名稱以查看**使用者詳細資訊**頁面。

1. 若要刪除公有金鑰，請選取其 SSH 金鑰核取方塊，然後選擇**刪除**。

# 使用自訂身分提供者
<a name="custom-idp-intro"></a>

AWS Transfer Family 為自訂身分提供者提供數種選項，以驗證和授權使用者進行安全的檔案傳輸。以下是主要方法：
+ [自訂身分提供者解決方案](custom-idp-toolkit.md)- 本主題說明 Transfer Family 自訂身分提供者解決方案，使用 GitHub 中託管的工具組。
**注意**  
對於大多數使用案例，這是建議的選項。具體而言，如果您需要支援超過 100 個 Active Directory 群組，自訂身分提供者解決方案會提供可擴展的替代方案，而不會限制群組。此解決方案在部落格文章中描述：[使用自訂身分提供者簡化 Active Directory 身分驗證 AWS Transfer Family](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)。
+ [使用 Amazon API Gateway 整合您的身分提供者](authentication-api-gateway.md)- 本主題說明如何使用 AWS Lambda 函數來支援 Amazon API Gateway 方法。

  您可以使用單一 Amazon API Gateway 方法提供 RESTful 界面。Transfer Family 會呼叫此方法來連線至您的身分提供者，該提供者會驗證並授權您的使用者存取 Amazon S3 或 Amazon EFS。如果您需要 RESTful API 來整合身分提供者，或想要使用 AWS WAF 來利用其功能進行地理封鎖或速率限制請求，請使用此選項。如需詳細資訊，請參閱[使用 Amazon API Gateway 整合您的身分提供者](authentication-api-gateway.md)。
+ [動態許可管理方法](dynamic-permission-management.md)- 本主題說明使用工作階段政策動態管理使用者許可的方法。

  若要驗證您的使用者，您可以將現有的身分提供者與 搭配使用 AWS Transfer Family。您可以使用 函數整合您的身分提供者 AWS Lambda ，該函數會驗證並授權您的使用者存取 Amazon S3 或 Amazon Elastic File System (Amazon EFS)。如需詳細資訊，請參閱[使用 AWS Lambda 整合您的身分提供者](custom-lambda-idp.md)。您也可以存取 CloudWatch 圖形以取得指標，例如在 AWS Transfer Family 管理主控台中傳輸的檔案數和位元組數，讓您使用集中式儀表板來監控檔案傳輸。
+ Transfer Family 提供部落格文章和研討會，引導您建置檔案傳輸解決方案。此解決方案利用 AWS Transfer Family 受管 SFTP/FTPS 端點和 Amazon Cognito 和 DynamoDB 進行使用者管理。

  部落格文章可在[使用 Amazon Cognito 做為 AWS Transfer Family 和 Amazon S3 的身分提供者](https://aws.amazon.com/blogs/storage/using-amazon-cognito-as-an-identity-provider-with-aws-transfer-family-and-amazon-s3/)取得。您可以[在這裡](https://catalog.workshops.aws/transfer-family-sftp/en-US)檢視研討會的詳細資訊。

**注意**  
對於自訂身分提供者，使用者名稱必須至少為 3 個字元，最多為 100 個字元。您可以在使用者名稱中使用下列字元：a–z、A-Z、0–9、底線 '\$1'、連字號 '-'、句點 '.' 和符號 '@'。使用者名稱開頭不能是連字號 '-'、句點 '.' 或符號 '@'。

實作自訂身分提供者時，請考慮下列最佳實務：
+ 在與 Transfer Family 伺服器相同的 AWS 帳戶 和 區域中部署解決方案。
+ 在設定 IAM 角色和政策時，實作最低權限原則。
+ 使用 IP 允許清單和標準化記錄等功能來增強安全性。
+ 在部署之前，在非生產環境中徹底測試您的自訂身分提供者。

**Topics**
+ [自訂身分提供者解決方案](custom-idp-toolkit.md)
+ [使用 AWS Lambda 整合您的身分提供者](custom-lambda-idp.md)
+ [使用 Amazon API Gateway 整合您的身分提供者](authentication-api-gateway.md)
+ [使用多個身分驗證方法](custom-idp-mfa.md)
+ [IPv6 支援自訂身分提供者](custom-idp-ipv6.md)

# 自訂身分提供者解決方案
<a name="custom-idp-toolkit"></a>

 AWS Transfer Family 自訂身分提供者解決方案是一種模組化的自訂身分提供者解決方案，可解決企業在實作服務時有許多常見的身分驗證和授權使用案例。此解決方案為實作具有精細每個使用者工作階段組態的自訂身分提供者提供了可重複使用的基礎，並區隔身分驗證和授權邏輯，為各種使用案例提供了靈活且easy-to-maintain的基礎。

透過 AWS Transfer Family 自訂身分提供者解決方案，您可以解決常見的企業身分驗證和授權使用案例。此模組化解決方案提供：
+ 實作自訂身分提供者的可重複使用基礎 
+ 精細的每位使用者工作階段組態 
+ 分開的身分驗證和授權邏輯 

## 自訂身分工具組的實作詳細資訊
<a name="idp-toolkit-implementation-details"></a>

解決方案為各種使用案例提供靈活且可維護的基礎。若要開始使用，請檢閱位於 https：//[https://github.com/aws-samples/toolkit-for-aws-transfer-family](https://github.com/aws-samples/toolkit-for-aws-transfer-family) 的工具組，然後遵循[入門](https://github.com/aws-samples/toolkit-for-aws-transfer-family/tree/main/solutions/custom-idp#getting-started)區段中的部署說明。

![\[GitHub 中提供的自訂身分提供者工具組架構圖。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/custom-idp-solution-high-level-architecture.png)


**注意**  
如果您之前已使用自訂身分提供者範本和範例，請考慮改用此解決方案。接下來，供應商特定的模組將標準化此解決方案。持續的維護和功能增強功能將套用至此解決方案。

此解決方案包含用於實作自訂提供者的標準模式，其中包含記錄和存放所需其他工作階段中繼資料的位置等詳細資訊 AWS Transfer Family，例如 `HomeDirectoryDetails` 參數。此解決方案為實作具有精細每個使用者工作階段組態的自訂身分提供者提供了可重複使用的基礎，並將身分提供者身分驗證邏輯與建立傳回 Transfer Family 的組態的可重複使用邏輯分離，以完成身分驗證並建立工作階段的設定。

此解決方案的程式碼和支援資源可在 https：//[https://github.com/aws-samples/toolkit-for-aws-transfer-family](https://github.com/aws-samples/toolkit-for-aws-transfer-family) 取得。

工具組包含下列功能：
+ 佈建所需資源的[AWS Serverless Application Model](https://aws.amazon.com/serverless/sam)範本。或者，部署和設定 Amazon API Gateway 以納入 AWS WAF，如使用 [AWS Transfer FamilyAWS Web Application Firewall 和 Amazon API Gateway 保護](https://aws.amazon.com/blogs/storage/securing-aws-transfer-family-with-aws-web-application-firewall-and-amazon-api-gateway/)的部落格文章所述。
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb) 結構描述，用於儲存有關身分提供者的組態中繼資料，包括使用者工作階段設定，例如 `HomeDirectoryDetails`、 `Role`和 `Policy`。
+ 模組化方法，可讓您在未來將新的身分提供者做為模組新增至解決方案。
+ 屬性擷取：選擇性地從支援的身分提供者擷取 IAM 角色和 POSIX 設定檔 (UID 和 GID) 屬性，包括 AD、LDAP 和 Okta。
+ 支援使用相同的解決方案部署連接到單一 Transfer Family 伺服器和多個 Transfer Family 伺服器的多個身分提供者。
+ 內建 IP 允許清單檢查，例如 IP 允許清單，可選擇性地根據每個使用者或每個身分提供者進行設定。
+ 具有可設定日誌層級和追蹤支援的詳細記錄，以協助故障診斷。

開始部署自訂身分提供者解決方案之前，您需要有下列 AWS 資源。
+ 具有私有子網路的 Amazon Virtual Private Cloud (VPC)，可透過 NAT 閘道或 DynamoDB 閘道端點進行網際網路連線。
+ 執行下列任務的適當 IAM 許可：
  + 部署 `custom-idp.yaml` CloudFormation 範本、
  + 建立 AWS CodePipeline 專案
  + 建立 AWS CodeBuild 專案
  + 建立 IAM 角色和政策

**重要**  
您必須將解決方案部署到 AWS 區域 包含目標 Transfer Family 伺服器的相同 AWS 帳戶 和 。

## 支援的身分提供者
<a name="custom-supported-idp"></a>

下列清單包含自訂身分提供者解決方案支援的身分提供者詳細資訊。


| 供應商 | 密碼流程 | 公有金鑰流程 | 多重因素 | 屬性擷取 | 詳細資訊 | 
| --- | --- | --- | --- | --- | --- | 
| Active Directory 和 LDAP | 是 | 是 | 否 | 是 | 使用者驗證可作為公有金鑰驗證流程的一部分執行。 | 
| Argon2 （本機雜湊） | 是 | 否 | 否 | 否 | Argon2 雜湊會存放在「本機」密碼型身分驗證使用案例的使用者記錄中。 | 
| Amazon Cognito | 是 | 否 | 是\$1 | 否 | 僅限以時間為基礎的一次性密碼 (TOTP) 為基礎的多重要素驗證。 \$1不支援以 SMS 為基礎的 MFA。 | 
| Entra ID （先前為 Azure AD) | 是 | 否 | 否 | 否 |  | 
| Okta | 是 | 是 | 是\$1 | 是 | 僅限 TOTP 型 MFA。 | 
| 公有金鑰 | 否 | 是 | 否 | 否 | 公有金鑰存放在 DynamoDB 的使用者記錄中。 | 
| Secrets Manager | 是 | 是 | 否 | 否 |  | 

# 使用 AWS Lambda 整合您的身分提供者
<a name="custom-lambda-idp"></a>

本主題說明如何建立連線至自訂身分提供者的 AWS Lambda 函數。您可以使用任何自訂身分提供者，例如 Okta、Secrets Manager、OneLogin 或包含授權和身分驗證邏輯的自訂資料存放區。

對於大多數使用案例，設定自訂身分提供者的建議方法是使用 [自訂身分提供者解決方案](custom-idp-toolkit.md)。

**注意**  
建立使用 Lambda 做為身分提供者的 Transfer Family 伺服器之前，您必須建立 函數。如需 Lambda 函數的範例，請參閱[Lambda 函數範例](#lambda-auth-examples)。或者，您可以部署使用其中一個 的 CloudFormation 堆疊[Lambda 函數範本](#lambda-idp-templates)。此外，請確定您的 Lambda 函數使用信任 Transfer Family 的資源型政策。如需政策範例，請參閱 [Lambda 資源型政策](#lambda-resource-policy)。

1. 開啟 [AWS Transfer Family 主控台](https://console.aws.amazon.com/transfer/)。

1. 選擇**建立伺服器**以開啟**建立伺服器**頁面。針對**選擇身分提供者**，選擇**自訂身分提供者**，如下列螢幕擷取畫面所示。  
![\[選擇已選取自訂身分提供者的身分提供者主控台區段。也會選取預設值，也就是使用者可以使用其密碼或金鑰進行身分驗證。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/custom-lambda-console.png)
**注意**  
只有在您將 SFTP 啟用為 Transfer Family 伺服器的其中一個通訊協定時，才可選擇身分驗證方法。

1. 請確定已選取預設值，**即 AWS Lambda 使用 來連接您的身分提供者**。

1. 針對**AWS Lambda 函數**，選擇 Lambda 函數的名稱。

1. 填寫剩餘的方塊，然後選擇**建立伺服器**。如需建立伺服器之其餘步驟的詳細資訊，請參閱 [設定 SFTP、FTPS 或 FTP 伺服器端點](tf-server-endpoint.md)。

## Lambda 資源型政策
<a name="lambda-resource-policy"></a>

您必須擁有參考 Transfer Family 伺服器和 Lambda ARNs的政策。例如，您可以將下列政策與連線至身分提供者的 Lambda 函數搭配使用。政策會以字串的形式逸出 JSON。

****  

```
"Policy":
"{\"Version\":\"2012-10-17\",
\"Id\":\"default\",
\"Statement\":[
  {\"Sid\":\"AllowTransferInvocation\",
  \"Effect\":\"Allow\",
  \"Principal\":{\"Service\":\"transfer.amazonaws.com\"},
  \"Action\":\"lambda:InvokeFunction\",
  \"Resource\":\"arn:aws:lambda:region:123456789012:function:my-lambda-auth-function\",
  \"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:transfer:region:123456789012:server/server-id\"}}}
]}"
```

**注意**  
在上述政策範例中，將每個*使用者輸入預留位置*取代為您自己的資訊。

## 事件訊息結構
<a name="event-message-structure"></a>

從 SFTP 伺服器傳送至自訂 IDP 授權方 Lambda 函數的事件訊息結構如下所示。

```
{
    "username": "value",
    "password": "value",
    "protocol": "SFTP",
    "serverId": "s-abcd123456",
    "sourceIp": "192.168.0.100"
}
```

其中 `username`和 `password`是傳送至伺服器的登入憑證值。

例如，您可以輸入下列命令來連線：

```
sftp bobusa@server_hostname
```

然後，系統會提示您輸入密碼：

```
Enter password:
    mysecretpassword
```

您可以從 Lambda 函數內列印傳遞的事件，以從 Lambda 函數檢查此項目。它看起來應該類似於下列文字區塊。

```
{
    "username": "bobusa",
    "password": "mysecretpassword",
    "protocol": "SFTP",
    "serverId": "s-abcd123456",
    "sourceIp": "192.168.0.100"
}
```

FTP 和 FTPS 的事件結構類似：唯一的區別是這些值用於 `protocol` 參數，而不是 SFTP。

## 用於身分驗證的 Lambda 函數
<a name="authentication-lambda-examples"></a>

若要實作不同的身分驗證策略，請編輯 Lambda 函數。為了協助您滿足應用程式的需求，您可以部署 CloudFormation 堆疊。如需 Lambda 的詳細資訊，請參閱[AWS Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)或使用 [ Node.js 建置 Lambda 函數。](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html)

**Topics**
+ [有效的 Lambda 值](#lambda-valid-values)
+ [Lambda 函數範例](#lambda-auth-examples)
+ [測試您的組態](#authentication-test-configuration)
+ [Lambda 函數範本](#lambda-idp-templates)

### 有效的 Lambda 值
<a name="lambda-valid-values"></a>

下表說明 Transfer Family 接受用於自訂身分提供者的 Lambda 函數之值的詳細資訊。


|  Value  |  Description  |  必要  | 
| --- | --- | --- | 
|  `Role`  |  指定控制使用者存取 Amazon S3 儲存貯體或 Amazon EFS 檔案系統的 IAM 角色的 Amazon Resource Name (ARN)。連接到此角色的政策會決定在將檔案傳入和傳出 Amazon S3 或 Amazon EFS 檔案系統時，您要為使用者提供的存取層級。IAM 角色也應包含信任關係，允許伺服器在處理您使用者的傳輸請求時，存取您的資源。 如需建立信任關係的詳細資訊，請參閱 [建立信任關係](requirements-roles.md#establish-trust-transfer)。  |  必要  | 
|  `PosixProfile`  |  完整的 POSIX 身分，包括使用者 ID (`Uid`)、群組 ID (`Gid`) 和控制使用者存取 Amazon EFS 檔案系統的任何次要群組 IDs (`SecondaryGids`)。對檔案系統中的檔案和目錄設定的 POSIX 許可，會決定使用者在 Amazon EFS 檔案系統中傳入和傳出檔案時所取得的存取等級。  |  Amazon EFS 備份儲存的必要項目  | 
|  `PublicKeys`  |  對此使用者有效的 SSH 公有金鑰值清單。空白清單表示這不是有效的登入。密碼身分驗證期間不得傳回 。  |  選用  | 
|  `Policy`  |  您使用者的工作階段政策，讓您可以在多個使用者之間使用相同的 IAM 角色。此政策會將使用者存取的範圍縮小到他們 Amazon S3 儲存貯體的部分。如需搭配自訂身分提供者使用工作階段政策的詳細資訊，請參閱本主題中的工作階段政策範例。  |  選用  | 
|  `HomeDirectoryType`  |  使用者登入伺服器時，您希望的使用者主目錄之登陸目錄 (資料夾) 類型。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/custom-lambda-idp.html)  |  選用  | 
|  `HomeDirectoryDetails`  |  邏輯目錄映射，指定哪些 Amazon S3 或 Amazon EFS 路徑和金鑰應該可供您的使用者查看，以及如何讓它們可見。您必須指定 `Entry`和 `Target`對，其中 `Entry`顯示如何顯示路徑，而 `Target`是實際的 Amazon S3 或 Amazon EFS 路徑。  |  如果 的值`HomeDirectoryType`為 ，則為必要 `LOGICAL`  | 
|  `HomeDirectory`  |  使用者使用 用戶端登入伺服器的登陸目錄。格式取決於您的儲存後端： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/custom-lambda-idp.html)  路徑中必須包含儲存貯體名稱或 Amazon EFS 檔案系統 ID。省略此資訊會導致檔案傳輸期間發生「找不到檔案」錯誤。   |  選用  | 

**注意**  
`HomeDirectoryDetails` 是 JSON 映射的字串表示法。這與 相反`PosixProfile`，這是實際的 JSON 映射物件，`PublicKeys`也是字串的 JSON 陣列。如需特定語言的詳細資訊，請參閱程式碼範例。

**HomeDirectory 格式需求**  
使用 `HomeDirectory` 參數時，請務必包含完整的路徑格式：  
**對於 Amazon S3 儲存：**一律以 格式包含儲存貯體名稱 `/bucket-name/path`
**對於 Amazon EFS 儲存：**一律以 格式包含檔案系統 ID `/fs-12345/path`
「找不到檔案」錯誤的常見原因是從`HomeDirectory`路徑中省略儲存貯體名稱或 EFS 檔案系統 ID。在沒有儲存識別符`/`的情況下`HomeDirectory`將 設定為 將導致身分驗證成功，但檔案操作失敗。

### Lambda 函數範例
<a name="lambda-auth-examples"></a>

本節提供一些範例 Lambda 函數，包括 NodeJS 和 Python。

**注意**  
在這些範例中，使用者、角色、POSIX 設定檔、密碼和主目錄詳細資訊都是範例，必須以您的實際值取代。

------
#### [ Logical home directory, NodeJS ]

下列 NodeJS 範例函數提供具有[邏輯主目錄](https://docs.aws.amazon.com/transfer/latest/userguide/logical-dir-mappings.html)之使用者的詳細資訊。

```
// GetUserConfig Lambda

exports.handler = (event, context, callback) => {
  console.log("Username:", event.username, "ServerId: ", event.serverId);

  var response;
  // Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided.
  if (event.serverId !== "" && event.username == 'example-user') {
    var homeDirectoryDetails = [
      {
        Entry: "/",
        Target: "/fs-faa1a123"
      }
    ];
    response = {
      Role: 'arn:aws:iam::123456789012:role/transfer-access-role', // The user is authenticated if and only if the Role field is not blank
      PosixProfile: {"Gid": 65534, "Uid": 65534}, // Required for EFS access, but not needed for S3
      HomeDirectoryDetails: JSON.stringify(homeDirectoryDetails),
      HomeDirectoryType: "LOGICAL",
    };

    // Check if password is provided
    if (!event.password) {
      // If no password provided, return the user's SSH public key
      response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ];
    // Check if password is correct
    } else if (event.password !== 'Password1234') {
      // Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {};
    }
  } else {
    // Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {};
  }
  callback(null, response);
};
```

------
#### [ Path-based home directory, NodeJS ]

下列 NodeJS 範例函數提供具有路徑型主目錄之使用者的詳細資訊。

```
// GetUserConfig Lambda

exports.handler = (event, context, callback) => {
  console.log("Username:", event.username, "ServerId: ", event.serverId);

  var response;
  // Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided.
  // There is also event.protocol (one of "FTP", "FTPS", "SFTP") and event.sourceIp (e.g., "127.0.0.1") to further restrict logins.
  if (event.serverId !== "" && event.username == 'example-user') {
    response = {
      Role: 'arn:aws:iam::123456789012:role/transfer-access-role', // The user is authenticated if and only if the Role field is not blank
      Policy: '', // Optional, JSON stringified blob to further restrict this user's permissions
      // HomeDirectory format depends on your storage backend:
      // For S3: '/bucket-name/user-home-directory' (e.g., '/my-transfer-bucket/users/john')
      // For EFS: '/fs-12345/user-home-directory' (e.g., '/fs-faa1a123/users/john')
      HomeDirectory: '/my-transfer-bucket/users/example-user' // S3 example - replace with your bucket name
      // HomeDirectory: '/fs-faa1a123/users/example-user' // EFS example - uncomment for EFS
    };
    
    // Check if password is provided
    if (!event.password) {
      // If no password provided, return the user's SSH public key
     response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ];
    // Check if password is correct
    } else if (event.password !== 'Password1234') {
      // Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {};
    } 
  } else {
    // Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {};
  }
  callback(null, response);
};
```

------
#### [ Logical home directory, Python ]

下列 Python 範例函數提供具有[邏輯主目錄](https://docs.aws.amazon.com/transfer/latest/userguide/logical-dir-mappings.html)之使用者的詳細資訊。

```
# GetUserConfig Python Lambda with LOGICAL HomeDirectoryDetails
import json

def lambda_handler(event, context):
  print("Username: {}, ServerId: {}".format(event['username'], event['serverId']))

  response = {}

  # Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided.
  if event['serverId'] != '' and event['username'] == 'example-user':
    homeDirectoryDetails = [
      {
        'Entry': '/',
        'Target': '/fs-faa1a123'
      }
    ]
    response = {
      'Role': 'arn:aws:iam::123456789012:role/transfer-access-role', # The user will be authenticated if and only if the Role field is not blank
      'PosixProfile': {"Gid": 65534, "Uid": 65534}, # Required for EFS access, but not needed for S3
      'HomeDirectoryDetails': json.dumps(homeDirectoryDetails),
      'HomeDirectoryType': "LOGICAL"
    }

    # Check if password is provided
    if event.get('password', '') == '':
      # If no password provided, return the user's SSH public key
     response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ]
    # Check if password is correct
    elif event['password'] != 'Password1234':
      # Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {}
  else:
    # Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {}

  return response
```

------
#### [ Path-based home directory, Python ]

下列 Python 範例函數提供具有路徑型主目錄之使用者的詳細資訊。

```
# GetUserConfig Python Lambda with PATH HomeDirectory

def lambda_handler(event, context):
  print("Username: {}, ServerId: {}".format(event['username'], event['serverId']))

  response = {}

  # Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided.
  # There is also event.protocol (one of "FTP", "FTPS", "SFTP") and event.sourceIp (e.g., "127.0.0.1") to further restrict logins.
  if event['serverId'] != '' and event['username'] == 'example-user':
    response = {
      'Role': 'arn:aws:iam::123456789012:role/transfer-access-role', # The user will be authenticated if and only if the Role field is not blank
      'Policy': '', #  Optional, JSON stringified blob to further restrict this user's permissions
      # HomeDirectory format depends on your storage backend:
      # For S3: '/bucket-name/user-home-directory' (e.g., '/my-transfer-bucket/users/john')
      # For EFS: '/fs-12345/user-home-directory' (e.g., '/fs-faa1a123/users/john')
      'HomeDirectory': '/my-transfer-bucket/users/example-user', # S3 example - replace with your bucket name
      # 'HomeDirectory': '/fs-faa1a123/users/example-user', # EFS example - uncomment for EFS
      'HomeDirectoryType': "PATH" # Not strictly required, defaults to PATH
    }
    
    # Check if password is provided
    if event.get('password', '') == '':
      # If no password provided, return the user's SSH public key
     response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ]
    # Check if password is correct
    elif event['password'] != 'Password1234':
      # Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {}
  else:
    # Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {}

  return response
```

------

### 測試您的組態
<a name="authentication-test-configuration"></a>

建立自訂身分提供者之後，您應該測試您的組態。

------
#### [ Console ]

**使用 AWS Transfer Family 主控台測試您的組態**

1. 開啟 [AWS Transfer Family 主控台](https://console.aws.amazon.com/transfer/)。

1. 在**伺服器**頁面上，選擇您的新伺服器，選擇**動作**，然後選擇**測試**。

1. 輸入****您在部署 CloudFormation 堆疊時設定的**使用者名稱和密碼**文字。如果您保留預設選項，使用者名稱為 `myuser`，密碼為 `MySuperSecretPassword`。

1. 如果您在部署 CloudFormation 堆疊時設定來源 IP，請選擇**伺服器通訊協定**並輸入其 **IP** 地址。

------
#### [ CLI ]

**使用 CLI AWS 測試您的組態**

1. 執行 [test-identity-provider](https://docs.aws.amazon.com/cli/latest/reference/transfer/test-identity-provider.html) 命令。將每個 取代`user input placeholder`為您自己的資訊，如後續步驟所述。

   ```
   aws transfer test-identity-provider --server-id s-1234abcd5678efgh --user-name myuser --user-password MySuperSecretPassword --server-protocol FTP --source-ip 127.0.0.1
   ```

1. 輸入伺服器 ID。

1. 輸入您在部署 CloudFormation 堆疊時設定的使用者名稱和密碼。如果您保留預設選項，使用者名稱為 `myuser`，密碼為 `MySuperSecretPassword`。

1. 如果您在部署 CloudFormation 堆疊時設定伺服器通訊協定和來源 IP 地址，請輸入它們。

------

如果使用者身分驗證成功，測試會傳回 `StatusCode: 200` HTTP 回應、空字串 `Message: ""`（否則會包含失敗原因） 和`Response`欄位。

**注意**  
 在下面的回應範例中， `Response` 欄位是「字串」的 JSON 物件 （轉換為可在程式內使用的平面 JSON 字串），並包含使用者角色和許可的詳細資訊。

```
{
    "Response":"{\"Policy\":\"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"ReadAndListAllBuckets\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":[\\\"s3:ListAllMybuckets\\\",\\\"s3:GetBucketLocation\\\",\\\"s3:ListBucket\\\",\\\"s3:GetObjectVersion\\\",\\\"s3:GetObjectVersion\\\"],\\\"Resource\\\":\\\"*\\\"}]}\",\"Role\":\"arn:aws:iam::000000000000:role/MyUserS3AccessRole\",\"HomeDirectory\":\"/\"}",
    "StatusCode": 200,
    "Message": ""
}
```

### Lambda 函數範本
<a name="lambda-idp-templates"></a>

您可以部署使用 Lambda 函數進行身分驗證的 CloudFormation 堆疊。我們提供多種範本，可使用登入憑證來驗證和授權您的使用者。您可以修改這些範本或 AWS Lambda 程式碼，以進一步自訂使用者存取。

**注意**  
您可以在範本中指定啟用 FIPS 的安全政策 CloudFormation ，透過 建立啟用 FIPS 的 AWS Transfer Family 伺服器。可用的安全政策說明於 [AWS Transfer Family 伺服器的安全政策](security-policies.md) 

**建立用於身分驗證的 CloudFormation 堆疊**

1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 遵循*AWS CloudFormation 《 使用者指南*》中選取 CloudFormation 堆疊範本中從現有範本部署堆疊的指示。 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html)

1. 使用下列其中一個範本來建立 Lambda 函數，以用於 Transfer Family 中的身分驗證。
   + [Classic (Amazon Cognito) 堆疊範本](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-lambda-cognito-s3.template.yml)

     用於建立 AWS Lambda 以用作 中自訂身分提供者的基本範本 AWS Transfer Family。它會對 Amazon Cognito 進行身分驗證，如果使用以公有金鑰為基礎的身分驗證，則會從 Amazon S3 儲存貯體傳回公有金鑰。部署之後，您可以修改 Lambda 函數程式碼，以執行不同的動作。
   + [AWS Secrets Manager 堆疊範本](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-lambda.template.yml)

     使用 AWS Lambda 與 AWS Transfer Family 伺服器整合 Secrets Manager 做為身分提供者的基本範本。它會對 格式 AWS Secrets Manager 中的項目進行身分驗證`aws/transfer/server-id/username`。此外，秘密必須保留傳回 Transfer Family 的所有使用者屬性的鍵/值對。部署之後，您可以修改 Lambda 函數程式碼，以執行不同的動作。
   + [Okta 堆疊範本](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-lambda.template.yml)：使用 AWS Lambda 與 AWS Transfer Family 伺服器整合 Okta 做為自訂身分提供者的基本範本。
   + [Okta-mfa 堆疊範本](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-mfa-lambda.template.yml)：使用 AWS Lambda 與 AWS Transfer Family 伺服器整合 Okta 的基本範本，以及多重要素驗證，做為自訂身分提供者。
   + [ Azure Active Directory 範本](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-lambda-azure-ad.template.yml)：此堆疊的詳細資訊如[AWS Transfer Family 使用 Azure Active Directory 和 驗證 AWS Lambda](https://aws.amazon.com/blogs/storage/authenticating-to-aws-transfer-family-with-azure-active-directory-and-aws-lambda/)的部落格文章所述。

   部署堆疊之後，您可以在 CloudFormation 主控台的**輸出**索引標籤上檢視其詳細資訊。

   部署其中一個堆疊是將自訂身分提供者整合到 Transfer Family 工作流程的最簡單方法。

# 使用 Amazon API Gateway 整合您的身分提供者
<a name="authentication-api-gateway"></a>

本主題說明如何使用 AWS Lambda 函數來支援 API Gateway 方法。如果您需要 RESTful API 來整合身分提供者，或想要使用 AWS WAF 來利用其功能進行地理封鎖或速率限制請求，請使用此選項。

對於大多數使用案例，設定自訂身分提供者的建議方法是使用 [自訂身分提供者解決方案](custom-idp-toolkit.md)。

**使用 API Gateway 整合身分提供者的限制**
+ 此組態不支援自訂網域。
+ 此組態不支援私有 API Gateway URL。

如果您需要這些其中一項，您可以使用 Lambda 做為身分提供者，無需 API Gateway。如需詳細資訊，請參閱[使用 AWS Lambda 整合您的身分提供者](custom-lambda-idp.md)。

## 使用 API Gateway 方法進行驗證
<a name="authentication-custom-ip"></a>

您可以建立 API Gateway 方法，做為 Transfer Family 的身分提供者。此方法為您提供高度安全的方式來建立和提供 APIs。使用 API Gateway，您可以建立 HTTPS 端點，以便以更高的安全性傳輸所有傳入的 API 操作。如需 API Gateway 服務的詳細資訊，請參閱 [API Gateway 開發人員指南](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)。

API Gateway 提供名為 的授權方法`AWS_IAM`，它會根據 AWS Identity and Access Management (IAM) 為您提供與內部 AWS 相同的身分驗證。如果您使用 啟用身分驗證`AWS_IAM`，只有具有明確呼叫 API 許可的呼叫者才能到達該 API 的 API Gateway 方法。

若要使用 API Gateway 方法做為 Transfer Family 的自訂身分提供者，請為您的 API Gateway 方法啟用 IAM。在此程序中，您會為 IAM 角色提供 Transfer Family 使用閘道的許可。

**注意**  
為了提高安全性，您可以設定 Web 應用程式防火牆。 AWS WAF 是一種 Web 應用程式防火牆，可讓您監控轉送至 Amazon API Gateway 的 HTTP 和 HTTPS 請求。如需詳細資訊，請參閱[新增 Web 應用程式防火牆](web-application-firewall.md)。

**請勿啟用 API Gateway 快取**  
將 API Gateway 方法用作 Transfer Family 的自訂身分提供者時，請勿啟用 API Gateway 方法的快取。快取對身分驗證請求不適當且無效，因為：  
每個身分驗證請求都是唯一的，需要即時回應，而不是快取的回應
快取沒有好處，因為 Transfer Family 永遠不會將重複或重複的請求傳送至 API Gateway
啟用快取會導致 API Gateway 以不相符的資料回應，導致身分驗證請求的回應無效

**使用 API Gateway 方法搭配 Transfer Family 進行自訂身分驗證**

1. 建立 CloudFormation 堆疊。若要執行此作業：
**注意**  
堆疊範本已更新為使用 BASE64-encoded密碼：如需詳細資訊，請參閱 [CloudFormation 範本的改進](#base64-templates)。

   1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

   1. 遵循*AWS CloudFormation 《 使用者指南*》中選取 CloudFormation 堆疊範本中從現有範本部署堆疊的指示。 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html)

   1. 使用下列其中一個基本範本來建立 AWS Lambda後端 API Gateway 方法，以做為 Transfer Family 中的自訂身分提供者。
      + [基本堆疊範本](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml)

        根據預設，您的 API Gateway 方法會做為自訂身分提供者使用硬式編碼 SSH （安全殼層） 金鑰或密碼來驗證單一伺服器中的單一使用者。部署之後，您可以修改 Lambda 函數程式碼，以執行不同的動作。
      + [AWS Secrets Manager 堆疊範本](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml)

        根據預設，您的 API Gateway 方法會根據 Secrets Manager 格式 的項目進行驗證`aws/transfer/server-id/username`。此外，秘密必須保留傳回 Transfer Family 的所有使用者屬性的鍵/值對。部署之後，您可以修改 Lambda 函數程式碼，以執行不同的動作。如需詳細資訊，請參閱部落格 [postEnable password authentication for AWS Transfer Family using AWS Secrets Manager](https://aws.amazon.com/blogs/storage/enable-password-authentication-for-aws-transfer-family-using-aws-secrets-manager-updated/)。
      + [Okta 堆疊範本](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-apig.template.yml)

        您的 API Gateway 方法與 Okta 整合，做為 Transfer Family 中的自訂身分提供者。如需詳細資訊，請參閱部落格文章[使用 Okta 做為 的身分提供者 AWS Transfer Family](https://aws.amazon.com/blogs/storage/using-okta-as-an-identity-provider-with-aws-transfer-for-sftp/)。

   部署其中一個堆疊是將自訂身分提供者整合到 Transfer Family 工作流程的最簡單方法。每個堆疊都使用 Lambda 函數來支援以 API Gateway 為基礎的 API 方法。然後，您可以使用 API 方法做為 Transfer Family 中的自訂身分提供者。根據預設，Lambda 函數會使用密碼 `myuser`來驗證名為 的單一使用者`MySuperSecretPassword`。部署之後，您可以編輯這些登入資料或更新 Lambda 函數程式碼，以執行不同的動作。
**重要**  
我們建議您編輯預設使用者和密碼登入資料。

   部署堆疊之後，您可以在 CloudFormation 主控台的**輸出**索引標籤上檢視其詳細資訊。這些詳細資訊包括堆疊的 Amazon Resource Name (ARN)、堆疊建立的 IAM 角色 ARN，以及新閘道的 URL。
**注意**  
如果您使用自訂身分提供者選項為使用者啟用密碼型身分驗證，並啟用 API Gateway 提供的請求和回應記錄，API Gateway 會將使用者的密碼記錄到您的 Amazon CloudWatch Logs。我們不建議您在生產環境中使用此日誌。如需詳細資訊，請參閱[《 API Gateway 開發人員指南》中的在 API Gateway 中設定 CloudWatch API 記錄](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html)。 **

1. 檢查您伺服器的 API Gateway 方法組態。若要執行此作業：

   1. 在以下網址開啟 API Gateway 主控台：[https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/)。

   1. 選擇 CloudFormation 範本產生的 **Transfer Custom Identity Provider 基本範本 API**。您可能需要選取您的區域，才能查看您的閘道。

   1. 在**資源**窗格中，選擇 **GET**。下列螢幕擷取畫面顯示正確的方法組態。  
![\[API 組態詳細資訊，顯示請求路徑的方法組態參數，以及 URL 查詢字串的 。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/apig-config-method-fields.png)

   此時，您的 API 閘道已準備好進行部署。

1. 針對**動作**，選擇**部署 API**。針對**部署階段**，選擇 **prod**，然後選擇**部署**。

   成功部署 API Gateway 方法後，請在**階段 > ****階段詳細資訊**中檢視其效能，如下列螢幕擷取畫面所示。
**注意**  
複製出現在畫面頂端的**調用 URL** 地址。您可能需要它進行下一個步驟。  
![\[反白顯示調用 URL 的階段詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/apig-config-method-invoke.png)

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台。

1. 當您建立堆疊時，應該已為您建立 Transfer Family。如果沒有，請使用下列步驟設定您的伺服器。

   1. 選擇**建立伺服器**以開啟**建立伺服器**頁面。針對**選擇身分提供者**，選擇**自訂**，然後選取**使用 Amazon API Gateway 連線到您的身分提供者**，如下列螢幕擷取畫面所示。  
![\[選取自訂身分提供者的身分提供者畫面，以及選取用於連線至身分提供者的 API Gateway。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/create-server-choose-idp-custom.png)

   1. 在**提供 Amazon API Gateway URL** 文字方塊中，貼上您在此程序的步驟 3 中建立的 API Gateway 端點的**調用 URL** 地址。

   1. 針對**角色**，選擇範本建立的 IAM 角色 CloudFormation 。此角色允許 Transfer Family 調用您的 API 閘道方法。

      調用角色包含您為步驟 1 中建立的 CloudFormation 堆疊選取的堆疊名稱。其格式如下：`CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI`。

   1. 填寫剩餘的方塊，然後選擇**建立伺服器**。如需建立伺服器之其餘步驟的詳細資訊，請參閱 [設定 SFTP、FTPS 或 FTP 伺服器端點](tf-server-endpoint.md)。

## 實作您的 API Gateway 方法
<a name="authentication-api-method"></a>

若要為 Transfer Family 建立自訂身分提供者，您的 API Gateway 方法必須實作資源路徑為 的單一方法`/servers/serverId/users/username/config`。`serverId` 和 `username`值來自 RESTful 資源路徑。此外，請在**方法請求**中將 `sourceIp`和 新增`protocol`為 **URL 查詢字串參數**，如下圖所示。

![\[API Gateway 的資源畫面顯示GET方法詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/apig-config-method-request.png)


**注意**  
使用者名稱必須至少為 3 個字元，最多為 100 個字元。您可以在使用者名稱中使用下列字元：a–z、A-Z、0–9、底線 '\$1'、連字號 '-'、句點 '.' 和符號 '@'。使用者名稱開頭不能是連字號 '-'、句點 '.' 或符號 '@'。

如果 Transfer Family 嘗試為您的使用者進行密碼身分驗證，服務會提供`Password:`標頭欄位。如果沒有 `Password:` 標頭，Transfer Family 會嘗試使用公有金鑰身分驗證來驗證您的使用者。

當您使用身分提供者來驗證和授權最終使用者時，除了驗證其登入資料之外，您還可以根據最終使用者使用的用戶端 IP 地址來允許或拒絕存取請求。您可以使用此功能來確保儲存在 S3 儲存貯體或 Amazon EFS 檔案系統中的資料只能透過您指定為受信任的 IP 地址，透過支援的通訊協定存取。若要啟用此功能，您必須在查詢字串`sourceIp`中包含 。

如果您為伺服器啟用了多個通訊協定，並想要透過多個通訊協定使用相同的使用者名稱提供存取權，只要身分提供者已設定每個通訊協定的特定登入資料，您就可以這麼做。若要啟用此功能，您必須在 RESTful 資源路徑中包含 `protocol`值。

您的 API Gateway 方法應一律傳回 HTTP 狀態碼 `200`。任何其他 HTTP 狀態碼表示存取 API 時發生錯誤。

**Amazon S3 範例回應**  
回應內文範例是 Amazon S3 的 JSON 文件，格式如下。

```
{
 "Role": "IAM role with configured S3 permissions",
 "PublicKeys": [
     "ssh-rsa public-key1",
     "ssh-rsa public-key2"
  ],
 "Policy": "STS Assume role session policy",
 "HomeDirectory": "/amzn-s3-demo-bucket/path/to/home/directory"
}
```

**注意**  
 政策會以字串的形式逸出 JSON。例如：  

****  

```
"Policy":
"{
  \"Version\": \"2012-10-17\",
  \"Statement\":
     [
     {\"Condition\":
        {\"StringLike\":
            {\"s3:prefix\":
               [\"user/*\", \"user/\"]}},
     \"Resource\": \"arn:aws:s3:::amzn-s3-demo-bucket\",
     \"Action\": \"s3:ListBucket\",
     \"Effect\": \"Allow\",
     \"Sid\": \"ListHomeDir\"},
     {\"Resource\": \"arn:aws:s3:::*\",
        \"Action\": [\"s3:PutObject\",
        \"s3:GetObject\",
        \"s3:DeleteObjectVersion\",
        \"s3:DeleteObject\",
        \"s3:GetObjectVersion\",
        \"s3:GetObjectACL\",
        \"s3:PutObjectACL\"],
     \"Effect\": \"Allow\",
     \"Sid\": \"HomeDirObjectAccess\"}]
}"
```

下列範例回應顯示使用者具有邏輯主目錄類型。

```
{
   "Role": "arn:aws:iam::123456789012:role/transfer-access-role-s3",
   "HomeDirectoryType":"LOGICAL",
   "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/amzn-s3-demo-bucket1\"}]",
   "PublicKeys":[""]
}
```

**Amazon EFS 範例回應**  
回應內文範例是 Amazon EFS 的 JSON 文件，格式如下。

```
{
 "Role": "IAM role with configured EFS permissions",
 "PublicKeys": [
     "ssh-rsa public-key1",
     "ssh-rsa public-key2"
  ],
 "PosixProfile": {
   "Uid": "POSIX user ID",
   "Gid": "POSIX group ID",
   "SecondaryGids": [Optional list of secondary Group IDs],
 },
 "HomeDirectory": "/fs-id/path/to/home/directory"
}
```

`Role` 欄位顯示已成功進行身分驗證。執行密碼身分驗證時 （當您提供`Password:`標頭時），您不需要提供 SSH 公有金鑰。如果無法驗證使用者，例如，如果密碼不正確，您的方法應該傳回未`Role`設定的回應。這類回應的範例是空的 JSON 物件。

 下列範例回應顯示具有邏輯主目錄類型的使用者。

```
{
    "Role": "arn:aws:iam::123456789012:role/transfer-access-role-efs",
    "HomeDirectoryType": "LOGICAL",
    "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/faa1a123\"}]",
    "PublicKeys":[""],
    "PosixProfile":{"Uid":65534,"Gid":65534}
}
```

您可以在 Lambda 函數中包含 JSON 格式的使用者政策。如需在 Transfer Family 中設定使用者政策的詳細資訊，請參閱 [管理存取控制](users-policies.md)。

## 預設 Lambda 函數
<a name="authentication-lambda-examples-default"></a>

若要實作不同的身分驗證策略，請編輯閘道使用的 Lambda 函數。為了協助您滿足應用程式的需求，您可以在 Node.js 中使用下列範例 Lambda 函數。如需 Lambda 的詳細資訊，請參閱[AWS Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)或使用 [ Node.js 建置 Lambda 函數。](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html)

下列範例 Lambda 函數會取得您的使用者名稱、密碼 （如果您執行密碼身分驗證）、伺服器 ID、通訊協定和用戶端 IP 地址。您可以使用這些輸入的組合來查詢您的身分提供者，並判斷是否應接受登入。

**注意**  
如果您為伺服器啟用了多個通訊協定，並希望透過多個通訊協定使用相同的使用者名稱提供存取權，只要身分提供者中已設定了通訊協定特定的登入資料，就可以這麼做。  
對於檔案傳輸通訊協定 (FTP)，我們建議您維護與 Secure Shell (SSH) 檔案傳輸通訊協定 (SFTP) 和透過 SSL 的檔案傳輸通訊協定 (FTPS) 不同的登入資料。我們建議您維護個別的 FTP 登入資料，因為與 SFTP 和 FTPS 不同，FTP 會以純文字傳輸登入資料。透過從 SFTP 或 FTPS 隔離 FTP 登入資料，如果共用或公開 FTP 登入資料，則使用 SFTP 或 FTPS 的工作負載會保持安全。

此範例函數會傳回角色和邏輯主目錄詳細資訊，以及公有金鑰 （如果執行公有金鑰身分驗證）。

當您建立服務受管使用者時，您可以設定其主目錄，無論是邏輯或實體。同樣地，我們需要 Lambda 函數結果來傳達所需的使用者實體或邏輯目錄結構。您設定的參數取決於 [https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryType](https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryType) 欄位的值。
+ `HomeDirectoryType` 設定為 `PATH` - 欄位`HomeDirectory`接著必須是使用者可見的絕對 Amazon S3 儲存貯體字首或 Amazon EFS 絕對路徑。
+ `HomeDirectoryType` 設定為 `LOGICAL` – *請勿*設定`HomeDirectory`欄位。相反地，我們會設定一個`HomeDirectoryDetails`欄位，提供所需的 Entry/Target 映射，類似於服務受管使用者 [https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryMappings](https://docs.aws.amazon.com//transfer/latest/APIReference/API_CreateUser.html#TransferFamily-CreateUser-request-HomeDirectoryMappings) 參數中所述的值。

範例函數會列在 中[Lambda 函數範例](custom-lambda-idp.md#lambda-auth-examples)。

## 搭配 使用的 Lambda 函數 AWS Secrets Manager
<a name="authentication-lambda-examples-secrets-mgr"></a>

若要使用 AWS Secrets Manager 做為您的身分提供者，您可以在範例 CloudFormation 範本中使用 Lambda 函數。Lambda 函數會使用您的登入資料查詢 Secrets Manager 服務，如果成功， 會傳回指定的秘密。如需 Secrets Manager 的詳細資訊，請參閱 [AWS Secrets Manager 使用者指南](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)。

若要下載使用此 Lambda 函數的範例 CloudFormation 範本，請前往 [提供的 Amazon S3 儲存貯 AWS Transfer Family](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml)體。

## CloudFormation 範本的改進
<a name="base64-templates"></a>

已改善已發佈的 CloudFormation 範本的 API Gateway 界面。範本現在搭配 API Gateway 使用 BASE64-encoded的密碼。如果沒有此增強功能，您現有的部署會繼續運作，但不允許使用基本 US-ASCII 字元集以外字元的密碼。

範本中啟用此功能的變更如下：
+ `GetUserConfigRequest AWS::ApiGateway::Method` 資源必須具有此`RequestTemplates`程式碼 （斜體行是更新的行）

  ```
  RequestTemplates:
     application/json: |
     {
        "username": "$util.urlDecode($input.params('username'))",
        "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
        "protocol": "$input.params('protocol')",
        "serverId": "$input.params('serverId')",
        "sourceIp": "$input.params('sourceIp')"
  }
  ```
+ 資源`RequestParameters`的 `GetUserConfig` 必須變更 才能使用 `PasswordBase64`標頭 （斜體行是更新的行）：

  ```
  RequestParameters:
     method.request.header.PasswordBase64: false
     method.request.querystring.protocol: false
     method.request.querystring.sourceIp: false
  ```

**檢查堆疊的範本是否為最新的**

1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 從堆疊清單中，選擇您的堆疊。

1. 從詳細資訊面板中，選擇**範本**索引標籤。

1. 尋找下列項目：
   + 搜尋 `RequestTemplates`，並確定您有此行：

     ```
     "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
     ```
   + 搜尋 `RequestParameters`，並確定您有此行：

     ```
     method.request.header.PasswordBase64: false
     ```

如果您沒有看到更新的行，請編輯您的堆疊。如需如何更新 CloudFormation 堆疊的詳細資訊，請參閱《 *AWS CloudFormation使用者指南*》中的[修改堆疊範本](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-get-template.html)。

# 使用多個身分驗證方法
<a name="custom-idp-mfa"></a>

Transfer Family 伺服器會在您使用多種身分驗證方法時控制 AND 邏輯。Transfer Family 會將此視為兩個不同的請求，傳送給您的自訂身分提供者：不過，它們的效果會合併。

這兩個請求都必須成功傳回正確的回應，才能完成身分驗證。Transfer Family 需要兩個回應完成，這表示它們包含所有必要的元素 （角色、主目錄、政策和 POSIX 設定檔，如果您使用 Amazon EFS 進行儲存）。Transfer Family 也要求密碼回應不得包含公有金鑰。

公有金鑰請求必須與身分提供者有不同的回應。使用 **Password OR Key** 或 **Password AND Key** 時，該行為保持不變。

SSH/SFTP 通訊協定會先使用公有金鑰身分驗證來挑戰軟體用戶端，然後請求密碼身分驗證。此操作要求在允許使用者完成身分驗證之前都成功。

對於自訂身分提供者選項，您可以指定下列任何選項，以驗證身分。
+ **密碼 OR 金鑰** – 使用者可以使用其密碼或金鑰進行身分驗證。這是預設值。
+ **僅限密碼** – 使用者必須提供其密碼才能連線。
+ **僅限金鑰** – 使用者必須提供其私有金鑰才能連線。
+ **密碼和金鑰** – 使用者必須提供其私有金鑰和密碼才能連線。伺服器會先檢查金鑰，如果金鑰有效，系統會提示輸入密碼。如果提供的私有金鑰與存放的公有金鑰不相符，身分驗證會失敗。

# IPv6 支援自訂身分提供者
<a name="custom-idp-ipv6"></a>

AWS Transfer Family 自訂身分提供者完全支援 IPv6 連線。實作自訂身分提供者時，您的 Lambda 函數可以接收和處理來自 IPv4 和 IPv6 用戶端的身分驗證請求，而不需要任何額外的組態。Lambda 函數會在請求的 `sourceIp` 欄位中接收用戶端的 IP 地址，可以是 IPv4 地址 （例如 `203.0.113.42`) 或 IPv6 地址 （例如 `2001:db8:85a3:8d3:1319:8a2e:370:7348`)。您的自訂身分提供者實作應適當處理這兩種地址格式。

**重要**  
如果您的自訂身分提供者執行以 IP 為基礎的驗證或記錄，請確保您的實作正確處理 IPv6 地址格式。IPv6 地址比 IPv4 地址長，並使用不同的表示法格式。

**注意**  
在自訂身分提供者中處理 IPv6 地址時，請確定您使用的是適當的 IPv6 地址剖析函數，而不是簡單的字串比較。IPv6 地址可以以各種正式格式表示 （例如 `fd00:b600::ec2`或 `fd00:b600:0:0:0:0:0:ec2`)。在實作語言中使用適當的 IPv6 地址程式庫或函數，以正確驗證和比較 IPv6 地址。

**Example 在自訂身分提供者中同時處理 IPv4 和 IPv6 地址**  

```
def lambda_handler(event, context):
    # Extract the source IP address from the request
    source_ip = event.get('sourceIp', '')
    
    # Log the client IP address (works for both IPv4 and IPv6)
    print(f"Authentication request from: {source_ip}")
    
    # Example of IP-based validation that works with both IPv4 and IPv6
    if is_ip_allowed(source_ip):
        # Continue with authentication
        # ...
    else:
        # Reject the authentication request
        return {
            "Role": "",
            "HomeDirectory": "",
            "Status": "DENIED"
        }
```

如需實作自訂身分提供者的詳細資訊，請參閱 [使用 AWS Lambda 整合您的身分提供者](custom-lambda-idp.md)。

# 使用 AWS Directory Service for Microsoft Active Directory
<a name="directory-services-users"></a>

您可以使用 AWS Transfer Family 來驗證檔案傳輸最終使用者 AWS Directory Service for Microsoft Active Directory。它可以無縫遷移依賴 Active Directory 身分驗證的檔案傳輸工作流程，而無需變更最終使用者的登入資料或需要自訂授權方。

使用 AWS Managed Microsoft AD，您可以安全地透過 SFTP、FTPS 和 FTP 為存放在 Amazon Simple Storage Service (Amazon S3) 或 Amazon Elastic File System (Amazon EFS) 中的資料提供 Directory Service 使用者和群組存取權。如果您使用 Active Directory 來存放使用者的登入資料，您現在可以更輕鬆地為這些使用者啟用檔案傳輸。

您可以使用 Active Directory 連接器， AWS Managed Microsoft AD 在內部部署環境中或在 AWS 雲端中提供 Active Directory 群組的存取權。您可以讓已在 Microsoft Windows 環境中設定的使用者存取 AWS Managed Microsoft AD 用於身分的 AWS Transfer Family 伺服器，無論是在 AWS 雲端或其內部部署網路。 AWS 儲存部落格包含一篇文章，詳細說明將 Active Directory 與 Transfer Family 搭配使用的解決方案：[透過 的自訂身分提供者簡化 Active Directory 身分驗證 AWS Transfer Family](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)。

**注意**  
AWS Transfer Family 不支援 Simple AD。
Transfer Family 不支援跨區域 Active Directory 組態：我們僅支援與 Transfer Family 伺服器位於相同區域的 Active Directory 整合。
Transfer Family 不支援使用 AWS Managed Microsoft AD 或 AD Connector 為現有的 RADIUS 型 MFA 基礎設施啟用多重要素驗證 (MFA)。
AWS Transfer Family 不支援 Managed Active Directory 的複寫區域。

若要使用 AWS Managed Microsoft AD，您必須執行下列步驟：

1. 使用 Directory Service 主控台建立一或多個 AWS Managed Microsoft AD 目錄。

1. 使用 Transfer Family 主控台建立使用 AWS Managed Microsoft AD 做為其身分提供者的伺服器。

1. 使用 Active AWS Directory Connector 設定目錄。

1. 從一或多個 Directory Service 群組新增存取權。

1. 雖然並非必要，但我們建議您測試和驗證使用者存取。

**Topics**
+ [開始使用 之前 AWS Directory Service for Microsoft Active Directory](#managed-ad-prereq)
+ [使用 Active Directory 領域](#managed-ad-realms)
+ [選擇 AWS Managed Microsoft AD 做為您的身分提供者](#managed-ad-identity-provider)
+ [連線至內部部署 Microsoft Active Directory](#on-prem-ad)
+ [授予 群組的存取權](#directory-services-grant-access)
+ [測試使用者](#directory-services-test-user)
+ [刪除群組的伺服器存取權](#directory-services-misc)
+ [使用 SSH 連線至伺服器 （安全殼層）](#directory-services-ssh-procedure)
+ [使用樹系和信任 AWS Transfer Family 連接到自我管理的 Active Directory](#directory-services-ad-trust)

## 開始使用 之前 AWS Directory Service for Microsoft Active Directory
<a name="managed-ad-prereq"></a>

**注意**  
AWS Transfer Family 預設限制為每個伺服器 100 個 Active Directory 群組。如果您的使用案例需要超過 100 個群組，請考慮使用自訂身分提供者解決方案，如[透過 的自訂身分提供者簡化 Active Directory 身分驗證 AWS Transfer Family](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述。

### 為您的 AD 群組提供唯一識別符
<a name="add-identifier-adgroups"></a>

您必須先為 Microsoft AD 目錄中的每個群組提供唯一識別符 AWS Managed Microsoft AD，才能使用 。您可以使用每個群組的安全識別符 (SID) 來執行此操作。您關聯的群組使用者可透過使用 AWS Transfer Family 啟用的通訊協定存取 Amazon S3 或 Amazon EFS 資源。

使用下列 Windows PowerShell 命令來擷取群組的 SID，將 *YourGroupName* 取代為群組的名稱。

```
Get-ADGroup -Filter {samAccountName -like "YourGroupName*"} -Properties * | Select SamAccountName,ObjectSid
```

**注意**  
如果您使用 AWS Directory Service 做為身分提供者，且 `userPrincipalName`和 `SamAccountName`具有不同的值，則 AWS Transfer Family 接受 中的值`SamAccountName`。Transfer Family 不接受 中指定的值`userPrincipalName`。

### 將 Directory Service 許可新增至您的角色
<a name="add-active-directory-permissions"></a>

您也需要 Directory Service API 許可才能使用 AWS Directory Service 做為您的身分提供者。需要或建議下列許可：
+ `ds:DescribeDirectories` Transfer Family 需要 才能查詢目錄
+ `ds:AuthorizeApplication` 需要 才能新增 Transfer Family 的授權
+ `ds:UnauthorizeApplication` 建議移除任何臨時建立的資源，以防伺服器建立過程中發生問題

將這些許可新增至您用來建立 Transfer Family 伺服器的角色。如需這些許可的詳細資訊，請參閱 [Directory Service API 許可：動作、資源和條件參考](https://docs.aws.amazon.com//directoryservice/latest/admin-guide/UsingWithDS_IAM_ResourcePermissions.html)。

## 使用 Active Directory 領域
<a name="managed-ad-realms"></a>

 當您考慮如何讓 Active Directory 使用者存取 AWS Transfer Family 伺服器時，請記住使用者的領域及其群組的領域。理想情況下，使用者的領域及其群組的領域應該相符。也就是說，使用者和群組都位於預設領域，或兩者都位於信任領域。如果不是這種情況，則 Transfer Family 無法驗證使用者。

您可以測試使用者，以確保組態正確。如需詳細資訊，請參閱[測試使用者](#directory-services-test-user)。如果使用者/群組領域發生問題，您會收到錯誤，找不到與使用者群組相關聯的存取權。

## 選擇 AWS Managed Microsoft AD 做為您的身分提供者
<a name="managed-ad-identity-provider"></a>

本節說明如何 AWS Directory Service for Microsoft Active Directory 搭配 伺服器使用 。

**AWS Managed Microsoft AD 搭配 Transfer 系列使用**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/directoryservicev2/](https://console.aws.amazon.com/directoryservicev2/) 開啟 Directory Service 主控台。

   使用 Directory Service 主控台來設定一或多個受管目錄。如需詳細資訊，請參閱《 Directory Service 管理員指南》中的 [AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html)。  
![\[Directory Service 主控台會顯示目錄清單及其詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/directory-services-AD-list.png)

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台，然後選擇**建立伺服器**。

1. 在**選擇通訊協定**頁面上，從清單中選擇一或多個通訊協定。
**注意**  
如果您選取 **FTPS**，則必須提供 AWS Certificate Manager 憑證。

1. 針對**選擇身分提供者**，選擇 **AWS Directory Service**。  
![\[主控台螢幕擷取畫面顯示選擇已選取 Directory Service 的身分提供者區段。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/create-server-choose-idp-directory-services.png)

1. **目錄**清單包含您已設定的所有受管目錄。從清單中選擇目錄，然後選擇**下一步**。
**注意**  
 不支援跨帳戶和共用目錄 AWS Managed Microsoft AD。
若要使用 Directory Service 做為您的身分提供者來設定伺服器，您需要新增一些 Directory Service 許可。如需詳細資訊，請參閱[開始使用 之前 AWS Directory Service for Microsoft Active Directory](#managed-ad-prereq)。

1. 若要完成建立伺服器，請使用下列其中一個程序：
   + [建立啟用 SFTP 的伺服器](create-server-sftp.md)
   + [建立啟用 FTPS 的伺服器](create-server-ftps.md)
   + [建立啟用 FTP 的伺服器](create-server-ftp.md)

   在這些程序中，請繼續執行選擇身分提供者之後的步驟。

**重要**  
 Directory Service 如果您在 Transfer Family 伺服器中使用 Microsoft AD 目錄，則無法刪除 中的 Microsoft AD 目錄。您必須先刪除伺服器，然後才能刪除目錄。

## 連線至內部部署 Microsoft Active Directory
<a name="on-prem-ad"></a>

本節說明如何使用 AD Connector 設定 AWS 目錄

**使用 AD Connector 設定您的 AWS 目錄**

1. 開啟 [Directory Service](https://console.aws.amazon.com/directoryservicev2/) 主控台，然後選取**目錄**。

1. 選取**設定目錄**。

1. 針對目錄類型，選擇 **AD Connector**。

1. 選取目錄大小，選取**下一步**，然後選取您的 VPC 和子網路。

1. 選取**下一步**，然後填寫欄位，如下所示：
   + **目錄 DNS 名稱**：輸入您用於 Microsoft Active Directory 的網域名稱。
   + **DNS IP 地址**：輸入 Microsoft Active Directory IP 地址。
   + **伺服器帳戶使用者名稱和密碼******：輸入要使用之服務帳戶的詳細資訊。

1. 完成畫面以建立目錄服務。

下一個步驟是使用 SFTP 通訊協定和 **AWS Directory Service** 的身分提供者類型來建立 Transfer Family 伺服器。從**目錄**下拉式清單中，選取您在上一個程序中新增的目錄。

## 授予 群組的存取權
<a name="directory-services-grant-access"></a>

 建立伺服器之後，您必須選擇目錄中的哪些群組應該有權透過已啟用的通訊協定上傳和下載檔案 AWS Transfer Family。您可以透過建立 *存取*來執行此操作。

**注意**  
AWS Transfer Family 預設限制為每個伺服器 100 個 Active Directory 群組。如果您的使用案例需要超過 100 個群組，請考慮使用自訂身分提供者解決方案，如[透過 的自訂身分提供者簡化 Active Directory 身分驗證 AWS Transfer Family](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述。

**注意**  
使用者必須*直接*屬於您要授予存取權的群組。例如，假設 Bob 是使用者並屬於 groupA，且 groupA 本身包含在 groupB 中。  
如果您授予對 groupA 的存取權，則會授予 Bob 存取權。
 如果您將存取權授予 groupB （而不是 groupA)，Bob 就無法存取。

**授予群組存取權**

1. 在 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) 開啟 AWS Transfer Family 主控台。

1. 導覽至您的伺服器詳細資訊頁面。

1.  在**存取**區段中，選擇**新增存取**。

1.  輸入您要存取此伺服器的 AWS Managed Microsoft AD 目錄的 SID。
**注意**  
如需如何為您的 群組尋找 SID 的資訊，請參閱 [開始使用 之前 AWS Directory Service for Microsoft Active Directory](#managed-ad-prereq)。

1. 針對 **Access**，選擇群組的 AWS Identity and Access Management (IAM) 角色。

1.  在**政策**區段中，選擇政策。預設設定為**無**。

1. 針對**主目錄**，選擇對應至群組主目錄的 Amazon S3 儲存貯體。
**注意**  
您可以透過建立工作階段政策來限制使用者看到的儲存貯體部分。例如，若要將使用者限制在 `/filetest`目錄下自己的資料夾，請在方塊中輸入下列文字。  

   ```
   /filetest/${transfer:UserName}
   ```
 若要進一步了解如何建立工作階段政策，請參閱 [為 Amazon S3 儲存貯體建立工作階段政策](users-policies-session.md)。

1.  選擇**新增**以建立關聯。

1. 選擇您的伺服器。

1. 選擇**新增存取權**。

   1.  輸入 群組的 SID。
**注意**  
如需如何尋找 SID 的資訊，請參閱 [開始使用 之前 AWS Directory Service for Microsoft Active Directory](#managed-ad-prereq)。

1. 選擇**新增存取權**。

 在**存取**區段中，會列出伺服器的存取。

![\[主控台會顯示存取區段，其中列出伺服器存取。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/accesses-list.png)


## 測試使用者
<a name="directory-services-test-user"></a>

您可以測試使用者是否可以存取您伺服器的 AWS Managed Microsoft AD 目錄。

**注意**  
使用者必須剛好位於**端點組態**頁面的**存取**區段中列出的一個群組 （外部 ID)。如果使用者不在群組中，或位於多個單一群組中，則不會授予該使用者存取權。

**測試特定使用者是否具有存取權**

1. 在伺服器詳細資訊頁面上，選擇**動作**，然後選擇**測試**。

1. 針對**身分提供者測試**，輸入使用者登入憑證，該使用者位於具有存取權的其中一個群組中。

1.  選擇**測試**。

您會看到身分提供者測試成功，顯示選取的使用者已獲授予伺服器存取權。

![\[成功身分提供者測試回應的主控台螢幕擷取畫面。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/identity-provider-test-success.png)


如果使用者屬於多個具有存取權的群組，您會收到下列回應。

```
"Response":"",
"StatusCode":200,
"Message":"More than one associated access found for user's groups."
```

## 刪除群組的伺服器存取權
<a name="directory-services-misc"></a>

**刪除群組的伺服器存取權**

1. 在伺服器詳細資訊頁面上，選擇**動作**，然後選擇**刪除存取**。

1. 在對話方塊中，確認您要移除此群組的存取權。

 當您返回伺服器詳細資訊頁面時，您會看到不再列出此群組的存取權。

## 使用 SSH 連線至伺服器 （安全殼層）
<a name="directory-services-ssh-procedure"></a>

設定伺服器和使用者之後，您可以使用 SSH 連線至伺服器，並為具有存取權的使用者使用完整使用者名稱。

```
sftp user@active-directory-domain@vpc-endpoint
```

例如：`transferuserexample@mycompany.com@vpce-0123456abcdef-789xyz.vpc-svc-987654zyxabc.us-east-1.vpce.amazonaws.com`。

此格式以搜尋聯合身分為目標，限制搜尋潛在的大型 Active Directory。

**注意**  
您可以指定簡單的使用者名稱。不過，在此情況下，Active Directory 程式碼必須搜尋聯合中的所有目錄。這可能會限制搜尋，即使使用者應該有存取權，身分驗證也可能會失敗。

驗證之後，使用者會位於您在設定使用者時指定的主目錄中。

## 使用樹系和信任 AWS Transfer Family 連接到自我管理的 Active Directory
<a name="directory-services-ad-trust"></a>

Directory Service 有下列選項可用於連線至自我管理 Active Directory：
+ 單向樹系信任 （內部部署 Active Directory 的傳出 AWS Managed Microsoft AD 和傳入） 僅適用於根網域。
+ 對於子網域，您可以使用下列其中一項：
  + 在 AWS Managed Microsoft AD 和內部部署 Active Directory 之間使用雙向信任
  + 對每個子網域使用單向外部信任。

使用信任的網域連線至伺服器時，使用者需要指定信任的網域，例如 `transferuserexample@mycompany.com`。

# 使用 AWS Directory Service for Entra ID Domain Services
<a name="azure-sftp"></a>

 對於只需要 SFTP Transfer 且不想管理網域的客戶，有 Simple Active Directory。或者，想要在全受管服務中受益於 Active Directory 和高可用性的客戶可以使用 AWS Managed Microsoft AD。最後，對於想要利用現有 Active Directory 樹系進行 SFTP Transfer 的客戶，有 Active Directory Connector。

注意下列事項：
+ 若要根據 SFTP Transfer 需求利用現有的 Active Directory 樹系，您可以使用 [Active Directory Connector](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_ad_connector.html)。
+ 如果您想要 Active Directory 的優點和全受管服務的高可用性，您可以使用 AWS Directory Service for Microsoft Active Directory。如需詳細資訊，請參閱[使用 AWS Directory Service for Microsoft Active Directory](directory-services-users.md)。

本主題說明如何使用 Active Directory Connector 和 [Entra ID （先前稱為 Azure AD) Domain Services](https://azure.microsoft.com/en-us/services/active-directory-ds/) 來驗證具有 Entra ID 的 SFTP Transfer 使用者。

**Topics**
+ [開始使用 AWS Directory Service for Entra ID Domain Services 之前](#azure-prereq)
+ [步驟 1：新增 Entra ID 網域服務](#azure-add-adds)
+ [步驟 2：建立服務帳戶](#azure-create-service-acct)
+ [步驟 3：使用 AD Connector 設定 AWS 目錄](#azure-setup-directory)
+ [步驟 4：設定 AWS Transfer Family 伺服器](#azure-setup-transfer-server)
+ [步驟 5：授予群組存取權](#azure-grant-access)
+ [步驟 6：測試使用者](#azure-test)

## 開始使用 AWS Directory Service for Entra ID Domain Services 之前
<a name="azure-prereq"></a>

**注意**  
AWS Transfer Family 預設限制為每個伺服器 100 個 Active Directory 群組。如果您的使用案例需要超過 100 個群組，請考慮使用自訂身分提供者解決方案，如[透過 的自訂身分提供者簡化 Active Directory 身分驗證 AWS Transfer Family](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/)中所述。

對於 AWS，您需要下列項目：
+ 您使用 Transfer Family 伺服器的 AWS 區域中的虛擬私有雲端 (VPC)
+ VPC 中至少有兩個私有子網路
+ VPC 必須具備網際網路連線能力
+ 使用 Microsoft Entra site-to-site連線的客戶閘道和虛擬私有閘道

對於 Microsoft Entra，您需要下列項目：
+ Entra ID 和 Active Directory 網域服務
+ Entra 資源群組
+ Entra 虛擬網路
+ Amazon VPC 與 Entra 資源群組之間的 VPN 連線
**注意**  
這可以透過原生 IPSEC 通道或使用 VPN 設備。在本主題中，我們會在 Entra Virtual 網路閘道和本機網路閘道之間使用 IPSEC 通道。通道必須設定為允許 Entra Domain Service 端點與存放 AWS VPC 的子網路之間的流量。
+ 使用 Microsoft Entra site-to-site連線的客戶閘道和虛擬私有閘道

下圖顯示開始之前所需的組態。

![\[Entra/Azure AD 和 AWS Transfer Family 架構圖。透過網際網路連接至 Entra 虛擬網路的 AWS VPC，使用 AWS Directory Service 連接器連接至 Entra Domain Service。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/azure-architecture.png)


## 步驟 1：新增 Entra ID 網域服務
<a name="azure-add-adds"></a>

 根據預設，Entra ID 不支援網域聯結執行個體。若要執行網域聯結等動作，以及使用群組政策等工具，管理員必須啟用 Entra ID Domain Services。如果您尚未新增 Entra DS，或現有的實作未與您希望 SFTP Transfer 伺服器使用的網域建立關聯，則必須新增執行個體。

如需啟用 Entra ID Domain Services 的詳細資訊，請參閱[教學課程：建立和設定 Microsoft Entra Domain Services 受管網域](https://docs.microsoft.com/en-us/azure/active-directory-domain-services/active-directory-ds-getting-started)。

**注意**  
當您啟用 Entra DS 時，請確定已針對您要連接 SFTP Transfer 伺服器的資源群組和 Entra 網域進行設定。

![\[Entra 網域服務畫面顯示資源群組 bob.us 執行中。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/azure-ad-add-instance.png)


## 步驟 2：建立服務帳戶
<a name="azure-create-service-acct"></a>

 Entra 必須有一個服務帳戶，屬於 Entra DS 中的管理員群組。此帳戶會與 AWS Active Directory 連接器搭配使用。請確定此帳戶與 Entra DS 同步。

![\[顯示使用者設定檔的 Entra 畫面。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/azure-service-acct.png)


**提示**  
使用 SFTP 通訊協定的 Transfer Family 伺服器不支援 Entra ID 的多重要素驗證。Transfer Family 伺服器無法在使用者向 SFTP 進行身分驗證後提供 MFA 字符。嘗試連線之前，請務必停用 MFA。  

![\[附加多重要素驗證詳細資訊，顯示兩個使用者的 MFA 狀態為已停用。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/azure-ad-mfa-disable.png)


## 步驟 3：使用 AD Connector 設定 AWS 目錄
<a name="azure-setup-directory"></a>

 設定 Entra DS 並在 AWS VPC 和 Entra Virtual 網路之間建立具有 IPSEC VPN 通道的服務帳戶之後，您可以從任何 AWS EC2 執行個體 ping Entra DS DNS IP 地址來測試連線。

驗證連線是否作用中後，您可以在下面繼續。

**使用 AD Connector 設定您的 AWS 目錄**

1. 開啟 [Directory Service](https://console.aws.amazon.com/directoryservicev2/) 主控台，然後選取**目錄**。

1. 選取**設定目錄**。

1. 針對目錄類型，選擇 **AD Connector**。

1. 選取目錄大小，選取**下一步**，然後選取您的 VPC 和子網路。

1. 選取**下一步**，然後填入欄位，如下所示：
   + **目錄 DNS 名稱**：輸入您用於 Entra DS 的網域名稱。
   + **DNS IP 地址**：輸入您的 Entra DS IP 地址。
   + **伺服器帳戶使用者名稱和密碼******：輸入您在*步驟 2：建立服務帳戶中所建立服務帳戶*的詳細資訊。

1. 完成畫面以建立目錄服務。

現在目錄狀態應為**作用中**，且已準備好與 SFTP Transfer 伺服器搭配使用。

![\[Directory Services 畫面會視需要顯示狀態為 Active 的一個目錄。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/azure-connector-ready.png)


## 步驟 4：設定 AWS Transfer Family 伺服器
<a name="azure-setup-transfer-server"></a>

使用 SFTP 通訊協定和 **AWS Directory Service** 的身分提供者類型來建立 Transfer Family 伺服器。從**目錄**下拉式清單中，選取您在*步驟 3：使用 AD Connector 設定 AWS 目錄中新增的目錄*。

**注意**  
如果您在 Transfer Family 伺服器中使用 Microsoft AD 目錄，則無法刪除 AWS Directory Service 中的 Microsoft AD 目錄。您必須先刪除伺服器，然後才能刪除目錄。

## 步驟 5：授予群組存取權
<a name="azure-grant-access"></a>

 建立伺服器之後，您必須選擇目錄中的哪些群組應該有權透過已啟用的通訊協定上傳和下載檔案 AWS Transfer Family。您可以透過建立 *存取*來執行此操作。

**注意**  
使用者必須*直接*屬於您要授予存取權的群組。例如，假設 Bob 是使用者並屬於 groupA，且 groupA 本身包含在 groupB 中。  
如果您授予對 groupA 的存取權，則會授予 Bob 存取權。
 如果您將存取權授予 groupB （而不是 groupA)，Bob 就無法存取。

 若要授予存取權，您需要擷取群組的 SID。

使用下列 Windows PowerShell 命令擷取群組的 SID，以群組名稱取代 *YourGroupName*。

```
Get-ADGroup -Filter {samAccountName -like "YourGroupName*"} -Properties * | Select SamAccountName,ObjectSid
```

![\[Windows PowerShell 顯示正在擷取的物件 SID。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/azure-grant-access.png)


**授予 群組的存取權**

1. 開啟 https：//[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 導覽至您的伺服器詳細資訊頁面，然後在**存取**區段中，選擇**新增存取**。

1. 輸入您從先前程序的輸出收到的 SID。

1. 針對**存取**，選擇 群組 AWS Identity and Access Management 的角色。

1. 在**政策**區段中，選擇政策。預設值為 **None (無)**。

1. 針對**主目錄**，選擇對應至群組主目錄的 Amazon S3 儲存貯體。

1. 選擇**新增**以建立關聯。

來自 Transfer 伺服器的詳細資訊看起來應該類似以下內容：

![\[Transfer Family 伺服器詳細資訊畫面的一部分，顯示身分提供者的目錄 ID 範例。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/azure-assoc-1.png)


![\[Transfer Family 伺服器詳細資訊畫面的一部分，在畫面的存取部分中顯示作用中目錄的外部 ID。\]](http://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/images/azure-assoc-2.png)


## 步驟 6：測試使用者
<a name="azure-test"></a>

您可以測試 ([測試使用者](directory-services-users.md#directory-services-test-user)) 使用者是否可以存取您伺服器的 AWS Managed Microsoft AD 目錄。使用者必須剛好位於**端點組態**頁面的**存取**區段中列出的一個群組 （外部 ID)。如果使用者不在群組中，或在多個群組中，則不會授予該使用者存取權。