

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Bekerja dengan penyedia identitas khusus
<a name="custom-idp-intro"></a>

AWS Transfer Family menawarkan beberapa opsi bagi penyedia identitas khusus untuk mengautentikasi dan mengotorisasi pengguna untuk transfer file yang aman. Berikut adalah pendekatan utama:
+ [Solusi penyedia identitas khusus](custom-idp-toolkit.md)—Topik ini menjelaskan solusi penyedia identitas kustom Transfer Family, menggunakan toolkit yang dihosting. GitHub
**catatan**  
Untuk sebagian besar kasus penggunaan, ini adalah opsi yang disarankan. Secara khusus, jika Anda perlu mendukung lebih dari 100 grup Active Directory, solusi penyedia identitas kustom menawarkan alternatif yang dapat diskalakan tanpa batasan grup. Solusi ini dijelaskan dalam posting blog, [Sederhanakan otentikasi Active Directory dengan penyedia identitas khusus](https://aws.amazon.com/blogs/storage/simplify-active-directory-authentication-with-a-custom-identity-provider-for-aws-transfer-family/) untuk. AWS Transfer Family
+ [Menggunakan Amazon API Gateway untuk mengintegrasikan penyedia identitas Anda](authentication-api-gateway.md)—Topik ini menjelaskan cara menggunakan AWS Lambda fungsi untuk mendukung metode Amazon API Gateway.

  Anda dapat menyediakan RESTful antarmuka dengan satu metode Amazon API Gateway. Transfer Family memanggil metode ini untuk terhubung ke penyedia identitas Anda, yang mengautentikasi dan memberi wewenang kepada pengguna Anda untuk mengakses Amazon S3 atau Amazon EFS. Gunakan opsi ini jika Anda memerlukan RESTful API untuk mengintegrasikan penyedia identitas Anda atau jika Anda ingin menggunakannya untuk memanfaatkan kemampuannya AWS WAF untuk permintaan pemblokiran geografis atau pembatasan kecepatan. Lihat perinciannya di [Menggunakan Amazon API Gateway untuk mengintegrasikan penyedia identitas Anda](authentication-api-gateway.md).
+ [Pendekatan manajemen izin dinamis](dynamic-permission-management.md)—Topik ini menjelaskan pendekatan untuk mengelola izin pengguna secara dinamis menggunakan kebijakan sesi.

  Untuk mengautentikasi pengguna, Anda dapat menggunakan penyedia identitas yang ada dengan AWS Transfer Family. Anda mengintegrasikan penyedia identitas Anda menggunakan AWS Lambda fungsi, yang mengautentikasi dan memberi wewenang kepada pengguna Anda untuk mengakses Amazon S3 atau Amazon Elastic File System (Amazon EFS). Lihat perinciannya di [Menggunakan AWS Lambda untuk mengintegrasikan penyedia identitas Anda](custom-lambda-idp.md). Anda juga dapat mengakses CloudWatch grafik untuk metrik seperti jumlah file dan byte yang ditransfer di AWS Transfer Family Management Console, memberi Anda satu panel kaca untuk memantau transfer file menggunakan dasbor terpusat.
+ Transfer Family menyediakan posting blog dan lokakarya yang memandu Anda membangun solusi transfer file. Solusi ini memanfaatkan AWS Transfer Family SFTP/FTPS endpoint terkelola dan Amazon Cognito dan DynamoDB untuk manajemen pengguna. 

  Posting blog tersedia di [Menggunakan Amazon Cognito sebagai penyedia identitas dengan AWS Transfer Family dan Amazon S3](https://aws.amazon.com/blogs/storage/using-amazon-cognito-as-an-identity-provider-with-aws-transfer-family-and-amazon-s3/). Anda dapat melihat detail untuk lokakarya [di sini](https://catalog.workshops.aws/transfer-family-sftp/en-US). 

**catatan**  
Untuk penyedia identitas khusus, nama pengguna harus minimal 3 dan maksimal 100 karakter. Anda dapat menggunakan karakter berikut dalam nama pengguna: a—z, A-Z, 0—9, garis bawah '\$1', tanda hubung '-', titik '.' dan di tanda '@'. Nama pengguna tidak dapat dimulai dengan tanda hubung '-', titik '.' atau di tanda '@'.

Saat menerapkan penyedia identitas khusus, pertimbangkan praktik terbaik berikut:
+ Terapkan solusi di wilayah yang sama dengan Akun AWS server Transfer Family Anda.
+ Menerapkan prinsip hak istimewa paling sedikit saat mengonfigurasi peran dan kebijakan IAM.
+ Gunakan fitur seperti daftar izin IP dan pencatatan standar untuk keamanan yang ditingkatkan.
+ Uji penyedia identitas kustom Anda secara menyeluruh di lingkungan non-produksi sebelum penerapan.

**Topics**
+ [Solusi penyedia identitas khusus](custom-idp-toolkit.md)
+ [Menggunakan AWS Lambda untuk mengintegrasikan penyedia identitas Anda](custom-lambda-idp.md)
+ [Menggunakan Amazon API Gateway untuk mengintegrasikan penyedia identitas Anda](authentication-api-gateway.md)
+ [Menggunakan beberapa metode otentikasi](custom-idp-mfa.md)
+ [IPv6 dukungan untuk penyedia identitas khusus](custom-idp-ipv6.md)

# Solusi penyedia identitas khusus
<a name="custom-idp-toolkit"></a>

Solusi penyedia identitas AWS Transfer Family kustom adalah solusi penyedia identitas kustom modular yang memecahkan banyak kasus penggunaan otentikasi dan otorisasi umum yang dimiliki perusahaan saat menerapkan layanan. Solusi ini memberikan fondasi yang dapat digunakan kembali untuk menerapkan penyedia identitas khusus dengan konfigurasi sesi per pengguna terperinci dan memisahkan logika otentikasi dan otorisasi, menawarkan fleksibilitas dan fondasi untuk berbagai kasus penggunaan. easy-to-maintain 

Dengan solusi penyedia identitas AWS Transfer Family khusus, Anda dapat mengatasi kasus penggunaan otentikasi dan otorisasi perusahaan umum. Solusi modular ini menawarkan:
+ Fondasi yang dapat digunakan kembali untuk menerapkan penyedia identitas khusus 
+ Konfigurasi sesi per pengguna granular 
+ Otentikasi terpisah dan logika otorisasi 

## Detail implementasi untuk toolkit identitas kustom
<a name="idp-toolkit-implementation-details"></a>

Solusinya menyediakan basis yang fleksibel dan dapat dipelihara untuk berbagai kasus penggunaan. Untuk memulai, tinjau toolkit di [https://github.com/aws-samples/toolkit-for-aws-transfer-family](https://github.com/aws-samples/toolkit-for-aws-transfer-family), lalu ikuti petunjuk penerapan di bagian [Memulai](https://github.com/aws-samples/toolkit-for-aws-transfer-family/tree/main/solutions/custom-idp#getting-started).

![\[Diagram arsitektur untuk toolkit penyedia identitas kustom yang tersedia di GitHub.\]](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/images/custom-idp-solution-high-level-architecture.png)


**catatan**  
Jika sebelumnya Anda telah menggunakan templat dan contoh penyedia identitas kustom, pertimbangkan untuk mengadopsi solusi ini sebagai gantinya. Ke depan, modul khusus penyedia akan menstandarisasi solusi ini. Pemeliharaan berkelanjutan dan peningkatan fitur akan diterapkan pada solusi ini.

Solusi ini berisi pola standar untuk menerapkan penyedia kustom yang memperhitungkan detail termasuk pencatatan dan tempat menyimpan metadata sesi tambahan yang diperlukan AWS Transfer Family, seperti parameter. `HomeDirectoryDetails` Solusi ini memberikan fondasi yang dapat digunakan kembali untuk mengimplementasikan penyedia identitas kustom dengan konfigurasi sesi per pengguna granular, dan memisahkan logika otentikasi penyedia identitas dari logika yang dapat digunakan kembali yang membangun konfigurasi yang dikembalikan ke Transfer Family untuk menyelesaikan otentikasi dan menetapkan pengaturan untuk sesi tersebut. 

Kode dan sumber daya pendukung untuk solusi ini tersedia di [https://github.com/aws-samples/toolkit-for-aws-transfer-family](https://github.com/aws-samples/toolkit-for-aws-transfer-family).

Toolkit berisi fitur-fitur berikut:
+ [AWS Serverless Application Model](https://aws.amazon.com/serverless/sam)Template yang menyediakan sumber daya yang dibutuhkan. Secara opsional, terapkan dan konfigurasikan Amazon API Gateway untuk digabungkan AWS WAF, seperti yang dijelaskan dalam posting blog [Mengamankan AWS Transfer Family dengan Firewall Aplikasi AWS Web dan Amazon](https://aws.amazon.com/blogs/storage/securing-aws-transfer-family-with-aws-web-application-firewall-and-amazon-api-gateway/) API Gateway.
+ Skema [Amazon DynamoDB](https://aws.amazon.com/dynamodb) untuk menyimpan metadata konfigurasi tentang penyedia identitas, termasuk setelan sesi pengguna seperti,, dan. `HomeDirectoryDetails` `Role` `Policy`
+ Pendekatan modular yang memungkinkan Anda menambahkan penyedia identitas baru ke solusi di masa depan, sebagai modul.
+ Pengambilan atribut: Secara opsional mengambil peran IAM dan atribut Profil POSIX (UID dan GID) dari penyedia identitas yang didukung, termasuk AD, LDAP, dan Okta.
+ Support untuk beberapa penyedia identitas yang terhubung ke satu server Transfer Family dan beberapa server Transfer Family menggunakan penerapan solusi yang sama.
+ Pemeriksaan daftar izin IP bawaan seperti IP mengizinkan daftar yang secara opsional dapat dikonfigurasi berdasarkan penyedia per-pengguna atau per-identitas.
+ Pencatatan terperinci dengan tingkat log yang dapat dikonfigurasi dan dukungan penelusuran untuk membantu pemecahan masalah.

Sebelum Anda mulai menerapkan solusi penyedia identitas kustom, Anda harus memiliki AWS sumber daya berikut.
+ Amazon Virtual Private Cloud (VPC) dengan subnet pribadi, dengan konektivitas internet melalui gateway NAT atau titik akhir gateway DynamoDB.
+ Izin IAM yang sesuai untuk melakukan tugas-tugas berikut:
  + Menyebarkan `custom-idp.yaml` CloudFormation template,
  + Buat AWS CodePipeline proyek
  + Buat AWS CodeBuild proyek
  + Buat peran dan kebijakan IAM

**penting**  
Anda harus menerapkan solusi yang sama Akun AWS dan Wilayah AWS yang berisi server Transfer Family target Anda.

## Penyedia identitas yang didukung
<a name="custom-supported-idp"></a>

Daftar berikut berisi detail untuk penyedia identitas yang didukung untuk solusi penyedia identitas kustom.


| Penyedia | Alur kata sandi | Arus kunci publik | Multi-faktor | Pengambilan atribut | Detail | 
| --- | --- | --- | --- | --- | --- | 
| Direktori Aktif dan LDAP | Ya | Ya | Tidak | Ya | Verifikasi pengguna dapat dilakukan sebagai bagian dari alur otentikasi kunci publik. | 
| Argon2 (hash lokal) | Ya | Tidak | Tidak | Tidak | Hash Argon2 disimpan dalam catatan pengguna untuk kasus penggunaan otentikasi berbasis kata sandi 'lokal'. | 
| Amazon Cognito | Ya | Tidak | Ya\$1 | Tidak | Hanya otentikasi multi-faktor berbasis One-Time Password (TOTP) berbasis waktu. \$1 MFA berbasis SMS tidak didukung. | 
| Entra ID (sebelumnya Azure AD) | Ya | Tidak | Tidak | Tidak |  | 
| Okta | Ya | Ya | Ya\$1 | Ya | MFA berbasis TOTP saja. | 
| Kunci publik | Tidak | Ya | Tidak | Tidak | Kunci publik disimpan dalam catatan pengguna di DynamoDB. | 
| Secrets Manager | Ya | Ya | Tidak | Tidak |  | 

# Menggunakan AWS Lambda untuk mengintegrasikan penyedia identitas Anda
<a name="custom-lambda-idp"></a>

Topik ini menjelaskan cara membuat AWS Lambda fungsi yang terhubung ke penyedia identitas kustom Anda. Anda dapat menggunakan penyedia identitas kustom apa pun, seperti Okta, Secrets Manager OneLogin, atau penyimpanan data khusus yang menyertakan logika otorisasi dan otentikasi.

Untuk sebagian besar kasus penggunaan, cara yang disarankan untuk mengonfigurasi penyedia identitas khusus adalah dengan menggunakan[Solusi penyedia identitas khusus](custom-idp-toolkit.md).

**catatan**  
Sebelum membuat server Transfer Family yang menggunakan Lambda sebagai penyedia identitas, Anda harus membuat fungsinya. Untuk contoh fungsi Lambda, lihat. [Contoh fungsi Lambda](#lambda-auth-examples) Atau, Anda dapat menerapkan CloudFormation tumpukan yang menggunakan salah satu. [Template fungsi Lambda](#lambda-idp-templates) Selain itu, pastikan fungsi Lambda Anda menggunakan kebijakan berbasis sumber daya yang mempercayai Transfer Family. Untuk contoh kebijakan, lihat [Kebijakan berbasis sumber daya Lambda](#lambda-resource-policy).

1. Buka [konsol AWS Transfer Family](https://console.aws.amazon.com/transfer/).

1. Pilih **Buat server** untuk membuka halaman **Buat server**. Untuk **Pilih penyedia identitas**, pilih **Penyedia Identitas Kustom**, seperti yang ditunjukkan pada gambar berikut.  
![\[Bagian Pilih konsol penyedia identitas dengan Penyedia identitas kustom dipilih. Juga memiliki nilai default yang dipilih, yaitu bahwa pengguna dapat mengautentikasi menggunakan kata sandi atau kunci mereka.\]](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/images/custom-lambda-console.png)
**catatan**  
Pilihan metode otentikasi hanya tersedia jika Anda mengaktifkan SFTP sebagai salah satu protokol untuk server Transfer Family Anda.

1. Pastikan nilai default, **Gunakan AWS Lambda untuk menghubungkan penyedia identitas Anda**, dipilih.

1. Untuk **AWS Lambda fungsi**, pilih nama fungsi Lambda Anda.

1. Isi kotak yang tersisa, lalu pilih **Buat server**. Untuk detail tentang langkah-langkah yang tersisa untuk membuat server, lihat[Mengkonfigurasi titik akhir server SFTP, FTPS, atau FTP](tf-server-endpoint.md).

## Kebijakan berbasis sumber daya Lambda
<a name="lambda-resource-policy"></a>

Anda harus memiliki kebijakan yang mereferensikan server Transfer Family dan Lambda ARNs. Misalnya, Anda dapat menggunakan kebijakan berikut dengan fungsi Lambda yang terhubung ke penyedia identitas Anda. Kebijakan ini lolos dari JSON sebagai string.

****  

```
"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\"}}}
]}"
```

**catatan**  
Dalam contoh kebijakan di atas, ganti masing-masing *user input placeholder* dengan informasi Anda sendiri.

## Struktur pesan peristiwa
<a name="event-message-structure"></a>

Struktur pesan acara dari server SFTP yang dikirim ke fungsi Lambda otorisasi untuk IDP kustom adalah sebagai berikut.

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

Di mana `username` dan `password` merupakan nilai untuk kredensyal masuk yang dikirim ke server.

Misalnya, Anda memasukkan perintah berikut untuk menghubungkan:

```
sftp bobusa@server_hostname
```

Anda kemudian diminta untuk memasukkan kata sandi Anda:

```
Enter password:
    mysecretpassword
```

Anda dapat memeriksa ini dari fungsi Lambda Anda dengan mencetak peristiwa yang diteruskan dari dalam fungsi Lambda. Seharusnya terlihat mirip dengan blok teks berikut.

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

Struktur acara serupa untuk FTP dan FTPS: satu-satunya perbedaan adalah nilai-nilai tersebut digunakan untuk `protocol` parameter, bukan SFTP.

## Fungsi Lambda untuk otentikasi
<a name="authentication-lambda-examples"></a>

Untuk menerapkan strategi otentikasi yang berbeda, edit fungsi Lambda. Untuk membantu Anda memenuhi kebutuhan aplikasi Anda, Anda dapat menerapkan CloudFormation tumpukan. Untuk informasi selengkapnya tentang Lambda, lihat [Panduan AWS Lambda Pengembang](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) atau Membangun fungsi [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) dengan Node.js.

**Topics**
+ [Nilai Lambda yang valid](#lambda-valid-values)
+ [Contoh fungsi Lambda](#lambda-auth-examples)
+ [Menguji konfigurasi Anda](#authentication-test-configuration)
+ [Template fungsi Lambda](#lambda-idp-templates)

### Nilai Lambda yang valid
<a name="lambda-valid-values"></a>

Tabel berikut menjelaskan detail nilai yang diterima Transfer Family untuk fungsi Lambda yang digunakan untuk penyedia identitas kustom.


|  Nilai  |  Deskripsi  |  Diperlukan  | 
| --- | --- | --- | 
|  `Role`  |  Menentukan Nama Sumber Daya Amazon (ARN) dari peran IAM yang mengontrol akses pengguna ke bucket Amazon S3 atau sistem file Amazon EFS. Kebijakan yang dilampirkan pada peran ini menentukan tingkat akses yang ingin Anda berikan kepada pengguna saat mentransfer file masuk dan keluar dari sistem file Amazon S3 atau Amazon EFS Anda. IAM role juga harus berisi hubungan kepercayaan yang mengizinkan server untuk mengakses sumber daya Anda saat melayani permintaan transfer pengguna. Untuk detail tentang membangun hubungan kepercayaan, lihat[Untuk membangun hubungan kepercayaan](requirements-roles.md#establish-trust-transfer).  |  Diperlukan  | 
|  `PosixProfile`  |  Identitas POSIX lengkap, termasuk ID pengguna (`Uid`), ID grup (`Gid`), dan grup sekunder IDs (`SecondaryGids`) apa pun, yang mengontrol akses pengguna ke sistem file Amazon EFS Anda. POSIX izin yang ditetapkan pada file dan direktori dalam sistem file Anda menentukan tingkat akses pengguna Anda mendapatkan ketika mentransfer file ke dalam dan keluar dari sistem file Amazon EFS Anda.  |  Diperlukan untuk penyimpanan dukungan Amazon EFS  | 
|  `PublicKeys`  |  Daftar nilai kunci publik SSH yang valid untuk pengguna ini. Daftar kosong menyiratkan bahwa ini bukan login yang valid. Tidak boleh dikembalikan selama otentikasi kata sandi.  |  Opsional  | 
|  `Policy`  |  Kebijakan sesi untuk pengguna Anda sehingga Anda dapat menggunakan peran IAM yang sama di beberapa pengguna. Kebijakan ini mencakup bawah akses pengguna ke bagian dari bucket Amazon S3 mereka. Untuk informasi selengkapnya tentang penggunaan kebijakan sesi dengan penyedia identitas kustom, lihat contoh kebijakan sesi dalam topik ini.  |  Opsional  | 
|  `HomeDirectoryType`  |  Jenis direktori pendaratan (folder) yang Anda inginkan direktori home pengguna Anda ketika mereka masuk ke server. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/custom-lambda-idp.html)  |  Opsional  | 
|  `HomeDirectoryDetails`  |  Pemetaan direktori logis yang menentukan jalur dan kunci Amazon S3 atau Amazon EFS mana yang harus terlihat oleh pengguna Anda dan bagaimana Anda ingin membuatnya terlihat. Anda harus menentukan `Entry` dan `Target` memasangkan, di mana `Entry` menunjukkan bagaimana jalur dibuat terlihat dan `Target` merupakan jalur Amazon S3 atau Amazon EFS yang sebenarnya.  |  Diperlukan jika `HomeDirectoryType` memiliki nilai `LOGICAL`  | 
|  `HomeDirectory`  |  Direktori pendaratan untuk pengguna ketika mereka masuk ke server menggunakan klien. Formatnya tergantung pada backend penyimpanan Anda: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/custom-lambda-idp.html)  Nama bucket atau ID sistem file Amazon EFS harus disertakan dalam path. Menghilangkan informasi ini akan mengakibatkan kesalahan “File tidak ditemukan” selama transfer file.   |  Opsional  | 

**catatan**  
`HomeDirectoryDetails`adalah representasi string dari peta JSON. Hal ini berbeda dengan`PosixProfile`, yang merupakan objek peta JSON yang sebenarnya, dan `PublicKeys` yang merupakan array JSON string. Lihat contoh kode untuk detail khusus bahasa.

**HomeDirectory Persyaratan Format**  
Saat menggunakan `HomeDirectory` parameter, pastikan Anda menyertakan format jalur lengkap:  
**Untuk penyimpanan Amazon S3:** Selalu sertakan nama bucket dalam format `/bucket-name/path`
**Untuk penyimpanan Amazon EFS:** Selalu sertakan ID sistem file dalam format `/fs-12345/path`
Penyebab umum kesalahan “File tidak ditemukan” adalah menghilangkan nama bucket atau ID sistem file EFS dari `HomeDirectory` jalur. Pengaturan `HomeDirectory` ke hanya `/` tanpa pengenal penyimpanan akan menyebabkan otentikasi berhasil tetapi operasi file gagal.

### Contoh fungsi Lambda
<a name="lambda-auth-examples"></a>

Bagian ini menyajikan beberapa contoh fungsi Lambda, baik di NodeJS maupun Python.

**catatan**  
Dalam contoh ini, detail direktori pengguna, peran, profil POSIX, kata sandi, dan home directory adalah contoh, dan harus diganti dengan nilai aktual Anda.

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

[Fungsi contoh NodeJS berikut memberikan rincian untuk pengguna yang memiliki direktori home logis.](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 ]

Fungsi contoh NodeJS berikut memberikan rincian untuk pengguna yang memiliki direktori home berbasis jalur. 

```
// 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 ]

Contoh fungsi Python berikut memberikan rincian untuk pengguna yang memiliki direktori [home logis](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 ]

Contoh fungsi Python berikut memberikan rincian untuk pengguna yang memiliki direktori home berbasis jalur. 

```
# 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
```

------

### Menguji konfigurasi Anda
<a name="authentication-test-configuration"></a>

Setelah Anda membuat penyedia identitas kustom Anda, Anda harus menguji konfigurasi Anda.

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

**Untuk menguji konfigurasi Anda dengan menggunakan AWS Transfer Family konsol**

1. Buka [konsol AWS Transfer Family](https://console.aws.amazon.com/transfer/). 

1. Pada halaman **Server**, pilih server baru Anda, pilih **Tindakan**, lalu pilih **Uji**.

1. Masukkan teks untuk **Nama Pengguna** dan **Kata Sandi** yang Anda atur saat Anda menerapkan CloudFormation tumpukan. Jika Anda menyimpan opsi default, nama pengguna adalah `myuser` dan kata sandinya`MySuperSecretPassword`.

1. Pilih **protokol Server** dan masukkan alamat IP untuk **IP Sumber**, jika Anda mengaturnya saat Anda menerapkan CloudFormation tumpukan.

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

**Untuk menguji konfigurasi Anda dengan menggunakan AWS CLI**

1. Jalankan perintah [test-identity-provider](https://docs.aws.amazon.com/cli/latest/reference/transfer/test-identity-provider.html). Ganti masing-masing `user input placeholder` dengan informasi Anda sendiri, seperti yang dijelaskan dalam langkah-langkah selanjutnya.

   ```
   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. Masukkan ID server.

1. Masukkan nama pengguna dan kata sandi yang Anda tetapkan saat Anda menerapkan CloudFormation tumpukan. Jika Anda menyimpan opsi default, nama pengguna adalah `myuser` dan kata sandinya`MySuperSecretPassword`.

1. Masukkan protokol server dan alamat IP sumber, jika Anda mengaturnya saat Anda menerapkan CloudFormation tumpukan.

------

Jika otentikasi pengguna berhasil, pengujian mengembalikan respons `StatusCode: 200` HTTP, string kosong `Message: ""` (yang akan berisi alasan kegagalan jika tidak), dan bidang. `Response`

**catatan**  
 Dalam contoh respons di bawah ini, `Response` bidang adalah objek JSON yang telah “dirangkai” (diubah menjadi string JSON datar yang dapat digunakan di dalam program), dan berisi rincian peran dan izin pengguna.

```
{
    "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": ""
}
```

### Template fungsi Lambda
<a name="lambda-idp-templates"></a>

Anda dapat menerapkan CloudFormation tumpukan yang menggunakan fungsi Lambda untuk otentikasi. Kami menyediakan beberapa templat yang mengautentikasi dan mengotorisasi pengguna Anda menggunakan kredensyal masuk. Anda dapat memodifikasi template atau AWS Lambda kode ini untuk lebih menyesuaikan akses pengguna.

**catatan**  
Anda dapat membuat AWS Transfer Family server berkemampuan FIPS CloudFormation dengan menentukan kebijakan keamanan berkemampuan FIPS di template Anda. Kebijakan keamanan yang tersedia dijelaskan dalam [Kebijakan keamanan untuk AWS Transfer Family server](security-policies.md) 

**Untuk membuat CloudFormation tumpukan yang akan digunakan untuk otentikasi**

1. Buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Ikuti petunjuk untuk menerapkan CloudFormation tumpukan dari template yang ada di [Memilih template tumpukan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html) di *Panduan AWS CloudFormation Pengguna*.

1. Gunakan salah satu templat berikut untuk membuat fungsi Lambda yang akan digunakan untuk otentikasi di Transfer Family. 
   + [Templat tumpukan klasik (Amazon Cognito)](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-lambda-cognito-s3.template.yml)

     Template dasar untuk membuat AWS Lambda untuk digunakan sebagai penyedia identitas kustom di AWS Transfer Family. Ini mengautentikasi terhadap Amazon Cognito untuk otentikasi berbasis kata sandi dan kunci publik dikembalikan dari bucket Amazon S3 jika otentikasi berbasis kunci publik digunakan. Setelah penerapan, Anda dapat memodifikasi kode fungsi Lambda untuk melakukan sesuatu yang berbeda.
   + [AWS Secrets Manager template tumpukan](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-lambda.template.yml)

     Template dasar yang digunakan AWS Lambda dengan AWS Transfer Family server untuk mengintegrasikan Secrets Manager sebagai penyedia identitas. Ini mengotentikasi terhadap entri dalam AWS Secrets Manager format`aws/transfer/server-id/username`. Selain itu, secret harus menyimpan pasangan kunci-nilai untuk semua properti pengguna yang dikembalikan ke Transfer Family. Setelah penerapan, Anda dapat memodifikasi kode fungsi Lambda untuk melakukan sesuatu yang berbeda.
   + [Template tumpukan Okta](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-lambda.template.yml): Template dasar yang digunakan AWS Lambda dengan AWS Transfer Family server untuk mengintegrasikan Okta sebagai penyedia identitas khusus.
   + [Template tumpukan Okta-MFA: Template](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-mfa-lambda.template.yml) dasar yang digunakan AWS Lambda dengan AWS Transfer Family server untuk mengintegrasikan Okta, dengan Multi Factor Authentication, sebagai penyedia identitas khusus.
   + [Template Azure Active Directory](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-lambda-azure-ad.template.yml): detail untuk tumpukan ini dijelaskan dalam posting blog [Mengautentikasi AWS Transfer Family dengan Azure Active](https://aws.amazon.com/blogs/storage/authenticating-to-aws-transfer-family-with-azure-active-directory-and-aws-lambda/) Directory dan. AWS Lambda

   Setelah tumpukan dikerahkan, Anda dapat melihat detailnya di tab **Output** di CloudFormation konsol.

   Menerapkan salah satu tumpukan ini adalah cara termudah untuk mengintegrasikan penyedia identitas kustom ke dalam alur kerja Transfer Family.

# Menggunakan Amazon API Gateway untuk mengintegrasikan penyedia identitas Anda
<a name="authentication-api-gateway"></a>

Topik ini menjelaskan cara menggunakan AWS Lambda fungsi untuk mendukung metode API Gateway. Gunakan opsi ini jika Anda memerlukan RESTful API untuk mengintegrasikan penyedia identitas Anda atau jika Anda ingin menggunakannya untuk memanfaatkan kemampuannya AWS WAF untuk permintaan pemblokiran geografis atau pembatasan kecepatan.

Untuk sebagian besar kasus penggunaan, cara yang disarankan untuk mengonfigurasi penyedia identitas khusus adalah dengan menggunakan[Solusi penyedia identitas khusus](custom-idp-toolkit.md).

**Batasan jika menggunakan API Gateway untuk mengintegrasikan penyedia identitas Anda**
+ Konfigurasi ini tidak mendukung domain kustom.
+ Konfigurasi ini tidak mendukung URL API Gateway pribadi.

Jika Anda membutuhkan salah satu dari ini, Anda dapat menggunakan Lambda sebagai penyedia identitas, tanpa API Gateway. Lihat perinciannya di [Menggunakan AWS Lambda untuk mengintegrasikan penyedia identitas Anda](custom-lambda-idp.md).

## Mengautentikasi menggunakan metode API Gateway
<a name="authentication-custom-ip"></a>

Anda dapat membuat metode API Gateway untuk digunakan sebagai penyedia identitas untuk Transfer Family. Pendekatan ini memberikan cara yang sangat aman bagi Anda untuk membuat dan menyediakan APIs. Dengan API Gateway, Anda dapat membuat titik akhir HTTPS sehingga semua operasi API yang masuk ditransmisikan dengan keamanan yang lebih besar. Untuk detail selengkapnya tentang layanan API Gateway, lihat [Panduan Pengembang API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html).

API Gateway menawarkan metode otorisasi bernama`AWS_IAM`, yang memberi Anda autentikasi yang sama berdasarkan AWS Identity and Access Management (IAM) yang AWS digunakan secara internal. Jika Anda mengaktifkan autentikasi`AWS_IAM`, hanya penelepon dengan izin eksplisit untuk memanggil API yang dapat mencapai metode API Gateway API tersebut.

Untuk menggunakan metode API Gateway Anda sebagai penyedia identitas khusus untuk Transfer Family, aktifkan IAM untuk metode API Gateway Anda. Sebagai bagian dari proses ini, Anda memberikan peran IAM dengan izin untuk Transfer Family untuk menggunakan gateway Anda.

**catatan**  
Untuk meningkatkan keamanan, Anda dapat mengkonfigurasi firewall aplikasi web. AWS WAF adalah firewall aplikasi web yang memungkinkan Anda memantau permintaan HTTP dan HTTPS yang diteruskan ke Amazon API Gateway. Lihat perinciannya di [Tambahkan firewall aplikasi web](web-application-firewall.md).

**Jangan aktifkan caching API Gateway**  
Jangan aktifkan caching untuk metode API Gateway Anda saat menggunakannya sebagai penyedia identitas khusus untuk Transfer Family. Caching tidak pantas dan tidak valid untuk permintaan otentikasi karena:  
Setiap permintaan otentikasi unik dan memerlukan respons langsung, bukan respons yang di-cache
Caching tidak memberikan manfaat karena Transfer Family tidak pernah mengirimkan permintaan duplikat atau berulang ke API Gateway
Mengaktifkan caching akan menyebabkan API Gateway merespons dengan data yang tidak cocok, sehingga respons yang tidak valid terhadap permintaan otentikasi

**Untuk menggunakan metode API Gateway Anda untuk autentikasi kustom dengan Transfer Family**

1. Buat CloudFormation tumpukan. Untuk melakukannya:
**catatan**  
Templat tumpukan telah diperbarui untuk menggunakan kata sandi yang BASE64 dienkode: untuk detailnya, lihat. [Perbaikan CloudFormation template](#base64-templates)

   1. Buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

   1. Ikuti petunjuk untuk menerapkan CloudFormation tumpukan dari template yang ada di [Memilih template tumpukan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html) di *Panduan AWS CloudFormation Pengguna*.

   1. Gunakan salah satu templat dasar berikut untuk membuat metode API Gateway yang AWS Lambda didukung untuk digunakan sebagai penyedia identitas kustom di Transfer Family.
      + [Template tumpukan dasar](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml)

        Secara default, metode API Gateway Anda digunakan sebagai penyedia identitas khusus untuk mengautentikasi satu pengguna dalam satu server menggunakan kunci atau kata sandi SSH (Secure Shell) dengan kode keras. Setelah penerapan, Anda dapat memodifikasi kode fungsi Lambda untuk melakukan sesuatu yang berbeda.
      + [AWS Secrets Manager template tumpukan](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml)

        Secara default, metode API Gateway Anda melakukan autentikasi terhadap entri di Secrets Manager format`aws/transfer/server-id/username`. Selain itu, secret harus menyimpan pasangan kunci-nilai untuk semua properti pengguna yang dikembalikan ke Transfer Family. Setelah penerapan, Anda dapat memodifikasi kode fungsi Lambda untuk melakukan sesuatu yang berbeda. Untuk informasi selengkapnya, lihat posting blog [Aktifkan otentikasi kata sandi untuk AWS Transfer Family digunakan AWS Secrets Manager](https://aws.amazon.com/blogs/storage/enable-password-authentication-for-aws-transfer-family-using-aws-secrets-manager-updated/).
      + [Templat tumpukan Okta](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-apig.template.yml)

        Metode API Gateway Anda terintegrasi dengan Okta sebagai penyedia identitas khusus di Transfer Family. Untuk informasi lebih lanjut, lihat posting blog [Menggunakan Okta sebagai penyedia identitas dengan AWS Transfer Family](https://aws.amazon.com/blogs/storage/using-okta-as-an-identity-provider-with-aws-transfer-for-sftp/).

   Menerapkan salah satu tumpukan ini adalah cara termudah untuk mengintegrasikan penyedia identitas kustom ke dalam alur kerja Transfer Family. Setiap tumpukan menggunakan fungsi Lambda untuk mendukung metode API Anda berdasarkan API Gateway. Anda kemudian dapat menggunakan metode API sebagai penyedia identitas kustom di Transfer Family. Secara default, fungsi Lambda mengautentikasi satu pengguna yang dipanggil `myuser` dengan kata sandi. `MySuperSecretPassword` Setelah penerapan, Anda dapat mengedit kredensyal ini atau memperbarui kode fungsi Lambda untuk melakukan sesuatu yang berbeda.
**penting**  
Kami menyarankan Anda mengedit kredensi pengguna dan kata sandi default.

   Setelah tumpukan dikerahkan, Anda dapat melihat detailnya di tab **Output** di CloudFormation konsol. Detail ini termasuk Amazon Resource Name (ARN) stack, ARN dari peran IAM yang dibuat stack, dan URL untuk gateway baru Anda.
**catatan**  
Jika Anda menggunakan opsi penyedia identitas khusus untuk mengaktifkan autentikasi berbasis kata sandi bagi pengguna Anda, dan Anda mengaktifkan pencatatan permintaan dan respons yang disediakan oleh API Gateway, API Gateway mencatat kata sandi pengguna Anda ke Log Amazon Anda. CloudWatch Kami tidak menyarankan menggunakan log ini di lingkungan produksi Anda. Untuk informasi selengkapnya, lihat [Menyiapkan pencatatan CloudWatch API di API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html) di *Panduan Pengembang API Gateway*.

1. Periksa konfigurasi metode API Gateway untuk server Anda. Untuk melakukannya:

   1. Buka konsol API Gateway di [https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/). 

   1. Pilih **API template dasar Transfer Custom Identity Provider** yang dihasilkan CloudFormation template. Anda mungkin perlu memilih wilayah Anda untuk melihat gateway Anda.

   1. Di panel **Resources**, pilih **GET**. Tangkapan layar berikut menunjukkan konfigurasi metode yang benar.  
![\[Detail konfigurasi API, menampilkan parameter konfigurasi metode untuk Jalur Permintaan dan String Kueri URL.\]](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/images/apig-config-method-fields.png)

   Pada titik ini, gateway API Anda siap digunakan.

1. Untuk **Tindakan**, pilih **Deploy API**. **Untuk **tahap Deployment**, pilih **prod**, lalu pilih Deploy.**

   Setelah metode API Gateway berhasil diterapkan, lihat kinerjanya di **Tahapan>** **Detail tahap**, seperti yang ditunjukkan pada gambar berikut.
**catatan**  
Salin alamat **URL Invoke** yang muncul di bagian atas layar. Anda mungkin membutuhkannya untuk langkah selanjutnya.  
![\[Detail tahap dengan URL Invoke disorot.\]](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/images/apig-config-method-invoke.png)

1. Buka AWS Transfer Family konsol di [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/).

1. Transfer Family seharusnya dibuat untuk Anda, saat Anda membuat tumpukan. Jika tidak, konfigurasikan server Anda menggunakan langkah-langkah ini.

   1. Pilih **Buat server** untuk membuka halaman **Buat server**. Untuk **Pilih penyedia identitas**, pilih **Kustom**, lalu pilih **Gunakan Amazon API Gateway untuk terhubung ke penyedia identitas Anda**, seperti yang ditunjukkan pada gambar berikut.  
![\[Layar penyedia identitas dengan Penyedia Identitas Kustom dipilih, dan dengan API Gateway dipilih untuk terhubung ke penyedia identitas Anda.\]](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/images/create-server-choose-idp-custom.png)

   1. Di kotak teks **Berikan URL Amazon API Gateway**, tempelkan **alamat URL Panggilan** titik akhir API Gateway yang Anda buat di langkah 3 prosedur ini.

   1. Untuk **Peran**, pilih peran IAM yang dibuat oleh CloudFormation template. Peran ini memungkinkan Transfer Family untuk menjalankan metode gateway API Anda.

      Peran pemanggilan berisi nama CloudFormation tumpukan yang Anda pilih untuk tumpukan yang Anda buat di langkah 1. Ini memiliki format berikut:`CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI`.

   1. Isi kotak yang tersisa, lalu pilih **Buat server**. Untuk detail tentang langkah-langkah yang tersisa untuk membuat server, lihat[Mengkonfigurasi titik akhir server SFTP, FTPS, atau FTP](tf-server-endpoint.md).

## Menerapkan metode API Gateway
<a name="authentication-api-method"></a>

Untuk membuat penyedia identitas khusus untuk Transfer Family, metode API Gateway Anda harus mengimplementasikan satu metode yang memiliki jalur sumber daya`/servers/serverId/users/username/config`. `username`Nilai `serverId` dan berasal dari jalur RESTful sumber daya. Juga, tambahkan `sourceIp` dan `protocol` sebagai **Parameter String Kueri URL** dalam **Permintaan Metode**, seperti yang ditunjukkan pada gambar berikut.

![\[Layar Sumber Daya API Gateway yang menampilkan detail GET metode.\]](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/images/apig-config-method-request.png)


**catatan**  
Nama pengguna harus minimal 3 dan maksimal 100 karakter. Anda dapat menggunakan karakter berikut dalam nama pengguna: a—z, A-Z, 0—9, garis bawah '\$1', tanda hubung '-', titik '.' dan di tanda '@'. Nama pengguna tidak dapat dimulai dengan tanda hubung '-', titik '.' atau di tanda '@'.

Jika Transfer Family mencoba otentikasi kata sandi untuk pengguna Anda, layanan akan menyediakan bidang `Password:` header. Jika tidak ada `Password:` header, Transfer Family mencoba otentikasi kunci publik untuk mengautentikasi pengguna Anda.

Saat Anda menggunakan penyedia identitas untuk mengautentikasi dan mengotorisasi pengguna akhir, selain memvalidasi kredensialnya, Anda dapat mengizinkan atau menolak permintaan akses berdasarkan alamat IP klien yang digunakan oleh pengguna akhir Anda. Anda dapat menggunakan fitur ini untuk memastikan bahwa data yang disimpan di bucket S3 atau sistem file Amazon EFS Anda dapat diakses melalui protokol yang didukung hanya dari alamat IP yang telah Anda tentukan sebagai tepercaya. Untuk mengaktifkan fitur ini, Anda harus menyertakan `sourceIp` dalam string Query.

Jika Anda memiliki beberapa protokol yang diaktifkan untuk server Anda dan ingin memberikan akses menggunakan nama pengguna yang sama melalui beberapa protokol, Anda dapat melakukannya selama kredensyal khusus untuk setiap protokol telah diatur di penyedia identitas Anda. Untuk mengaktifkan fitur ini, Anda harus menyertakan `protocol` nilai di jalur RESTful sumber daya.

Metode API Gateway Anda harus selalu menampilkan kode status HTTP`200`. Kode status HTTP lainnya berarti ada kesalahan saat mengakses API.

**Contoh respons Amazon S3**  
Contoh badan respons adalah dokumen JSON dari formulir berikut untuk Amazon S3.

```
{
 "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"
}
```

**catatan**  
 Kebijakan ini lolos dari JSON sebagai string. Contoh:   

****  

```
"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\"}]
}"
```

Contoh respon berikut menunjukkan bahwa pengguna memiliki tipe direktori home logis.

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

**Contoh respons Amazon EFS**  
Contoh badan respons adalah dokumen JSON dari formulir berikut untuk Amazon EFS.

```
{
 "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`Bidang menunjukkan bahwa otentikasi berhasil terjadi. Saat melakukan otentikasi kata sandi (saat Anda menyediakan `Password:` header), Anda tidak perlu memberikan kunci publik SSH. Jika pengguna tidak dapat diautentikasi, misalnya, jika kata sandi salah, metode Anda harus mengembalikan respons tanpa `Role` disetel. Contoh respon tersebut adalah objek JSON kosong.

 Contoh respon berikut menunjukkan pengguna yang memiliki tipe direktori home logis. 

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

Anda dapat menyertakan kebijakan pengguna dalam fungsi Lambda dalam format JSON. Untuk informasi selengkapnya tentang mengonfigurasi kebijakan pengguna di Transfer Family, lihat[Mengelola kontrol akses](users-policies.md).

## Fungsi Lambda default
<a name="authentication-lambda-examples-default"></a>

Untuk menerapkan strategi otentikasi yang berbeda, edit fungsi Lambda yang digunakan gateway Anda. Untuk membantu Anda memenuhi kebutuhan aplikasi Anda, Anda dapat menggunakan contoh fungsi Lambda berikut di Node.js. Untuk informasi selengkapnya tentang Lambda, lihat [Panduan AWS Lambda Pengembang](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) atau Membangun fungsi [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) dengan Node.js.

Contoh fungsi Lambda berikut mengambil nama pengguna, kata sandi (jika Anda melakukan otentikasi kata sandi), ID server, protokol, dan alamat IP klien. Anda dapat menggunakan kombinasi input ini untuk mencari penyedia identitas Anda dan menentukan apakah login harus diterima.

**catatan**  
Jika Anda memiliki beberapa protokol yang diaktifkan untuk server Anda dan ingin memberikan akses menggunakan nama pengguna yang sama melalui beberapa protokol, Anda dapat melakukannya selama kredensyal khusus untuk protokol telah diatur di penyedia identitas Anda.  
Untuk File Transfer Protocol (FTP), kami sarankan untuk mempertahankan kredensyal terpisah dari Secure Shell (SSH) File Transfer Protocol (SFTP) dan File Transfer Protocol melalui SSL (FTPS). Sebaiknya pertahankan kredensyal terpisah untuk FTP karena, tidak seperti SFTP dan FTPS, FTP mentransmisikan kredensyal dalam teks yang jelas. Dengan mengisolasi kredensyal FTP dari SFTP atau FTPS, jika kredensyal FTP dibagikan atau diekspos, beban kerja Anda menggunakan SFTP atau FTPS tetap aman.

Fungsi contoh ini mengembalikan peran dan rincian direktori home logis, bersama dengan kunci publik (jika melakukan otentikasi kunci publik).

Saat Anda membuat pengguna yang dikelola layanan, Anda mengatur direktori home mereka, baik logis maupun fisik. Demikian pula, kita membutuhkan hasil fungsi Lambda untuk menyampaikan struktur direktori fisik atau logis pengguna yang diinginkan. Parameter yang Anda tetapkan bergantung pada nilai untuk [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)bidang tersebut.
+ `HomeDirectoryType`disetel ke `PATH` — `HomeDirectory` bidang tersebut kemudian harus berupa awalan bucket Amazon S3 absolut atau jalur absolut Amazon EFS yang dapat dilihat oleh pengguna Anda.
+ `HomeDirectoryType`set ke `LOGICAL` - *Jangan* mengatur `HomeDirectory` bidang. Sebagai gantinya, kami menetapkan `HomeDirectoryDetails` bidang yang menyediakan Entry/Target pemetaan yang diinginkan, mirip dengan nilai yang dijelaskan dalam [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)parameter untuk pengguna yang dikelola layanan.

Contoh fungsi tercantum dalam[Contoh fungsi Lambda](custom-lambda-idp.md#lambda-auth-examples).

## Fungsi Lambda untuk digunakan dengan AWS Secrets Manager
<a name="authentication-lambda-examples-secrets-mgr"></a>

Untuk digunakan AWS Secrets Manager sebagai penyedia identitas Anda, Anda dapat bekerja dengan fungsi Lambda di template sampel CloudFormation . Fungsi Lambda menanyakan layanan Secrets Manager dengan kredensyal Anda dan, jika berhasil, mengembalikan rahasia yang ditunjuk. Untuk informasi selengkapnya tentang Secrets Manager, lihat [Panduan Pengguna AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html).

Untuk mengunduh contoh CloudFormation template yang menggunakan fungsi Lambda ini, buka bucket [Amazon S3](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-apig.template.yml) yang disediakan oleh. AWS Transfer Family

## Perbaikan CloudFormation template
<a name="base64-templates"></a>

Perbaikan antarmuka API Gateway telah dilakukan pada CloudFormation template yang diterbitkan. Template sekarang menggunakan BASE64 -encoded password dengan API Gateway. Penerapan Anda yang ada terus berfungsi tanpa peningkatan ini, tetapi jangan izinkan kata sandi dengan karakter di luar set karakter AS-ASCII dasar.

Perubahan dalam template yang mengaktifkan kemampuan ini adalah sebagai berikut:
+ `GetUserConfigRequest AWS::ApiGateway::Method`Sumber daya harus memiliki `RequestTemplates` kode ini (baris miring adalah baris yang diperbarui)

  ```
  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')"
  }
  ```
+ `GetUserConfig`Sumber daya harus diubah untuk menggunakan `PasswordBase64` header (baris miring adalah baris yang diperbarui): `RequestParameters`

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

**Untuk memeriksa apakah template untuk tumpukan Anda adalah yang terbaru**

1. Buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Dari daftar tumpukan, pilih tumpukan Anda.

1. Dari panel detail, pilih tab **Template**.

1. Cari yang berikut ini:
   + Cari`RequestTemplates`, dan pastikan Anda memiliki baris ini:

     ```
     "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
     ```
   + Cari`RequestParameters`, dan pastikan Anda memiliki baris ini:

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

Jika Anda tidak melihat baris yang diperbarui, edit tumpukan Anda. Untuk detail tentang cara memperbarui CloudFormation tumpukan Anda, lihat [Memodifikasi template tumpukan](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-get-template.html) di *AWS CloudFormation; Panduan Pengguna*.

# Menggunakan beberapa metode otentikasi
<a name="custom-idp-mfa"></a>

Server Transfer Family mengontrol logika AND saat Anda menggunakan beberapa metode otentikasi. Transfer Family memperlakukan ini sebagai dua permintaan terpisah ke penyedia identitas kustom Anda: namun, efeknya digabungkan.

Kedua permintaan harus berhasil dikembalikan dengan respons yang benar untuk memungkinkan otentikasi selesai. Transfer Family mengharuskan dua tanggapan lengkap, artinya berisi semua elemen yang diperlukan (peran, direktori beranda, kebijakan, dan profil POSIX jika Anda menggunakan Amazon EFS untuk penyimpanan). Transfer Family juga mensyaratkan bahwa respons kata sandi tidak boleh menyertakan kunci publik.

Permintaan kunci publik harus memiliki respons terpisah dari penyedia identitas. Perilaku itu tidak berubah saat menggunakan **Kata Sandi ATAU Kunci atau** **Kata Sandi DAN Kunci**.

Protokol SSH/SFTP menantang klien perangkat lunak terlebih dahulu dengan otentikasi kunci publik, kemudian meminta otentikasi kata sandi. Operasi ini mengamanatkan keduanya berhasil sebelum pengguna diizinkan untuk menyelesaikan otentikasi.

Untuk opsi penyedia identitas kustom, Anda dapat menentukan salah satu opsi berikut untuk cara mengautentikasi.
+ **Kata Sandi ATAU Kunci** — pengguna dapat mengautentikasi dengan kata sandi atau kunci mereka. Ini adalah nilai default.
+ **Hanya kata sandi** — pengguna harus memberikan kata sandi mereka untuk terhubung.
+ **Hanya kunci** — pengguna harus menyediakan kunci pribadi mereka untuk terhubung.
+ **Kata Sandi dan Kunci** — pengguna harus memberikan kunci pribadi dan kata sandi mereka untuk terhubung. Server memeriksa kunci terlebih dahulu, dan kemudian jika kuncinya valid, sistem meminta kata sandi. Jika kunci pribadi yang disediakan tidak cocok dengan kunci publik yang disimpan, otentikasi gagal.

# IPv6 dukungan untuk penyedia identitas khusus
<a name="custom-idp-ipv6"></a>

AWS Transfer Family penyedia identitas khusus sepenuhnya mendukung IPv6 koneksi. Saat menerapkan penyedia identitas khusus, fungsi Lambda Anda dapat menerima dan memproses permintaan otentikasi dari keduanya IPv4 dan IPv6 klien tanpa konfigurasi tambahan apa pun. Fungsi Lambda menerima alamat IP klien di `sourceIp` bidang permintaan, yang dapat berupa IPv4 alamat (misalnya,`203.0.113.42`) atau IPv6 alamat (misalnya,`2001:db8:85a3:8d3:1319:8a2e:370:7348`). Implementasi penyedia identitas kustom Anda harus menangani kedua format alamat dengan tepat.

**penting**  
Jika penyedia identitas kustom Anda melakukan validasi atau pencatatan berbasis IP, pastikan implementasi Anda menangani format IPv6 alamat dengan benar. IPv6 alamat lebih panjang dari IPv4 alamat dan menggunakan format notasi yang berbeda.

**catatan**  
Saat menangani IPv6 alamat di penyedia identitas kustom Anda, pastikan Anda menggunakan fungsi penguraian IPv6 alamat yang tepat daripada perbandingan string sederhana. IPv6alamat dapat direpresentasikan dalam berbagai format kanonik (misalnya `fd00:b600::ec2` atau`fd00:b600:0:0:0:0:0:ec2`). Gunakan pustaka IPv6 alamat atau fungsi yang sesuai dalam bahasa implementasi Anda untuk memvalidasi dan membandingkan IPv6 alamat dengan benar.

**Example Menangani keduanya IPv4 dan IPv6 alamat di penyedia identitas khusus**  

```
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"
        }
```

Untuk informasi selengkapnya tentang penerapan penyedia identitas kustom, lihat[Menggunakan AWS Lambda untuk mengintegrasikan penyedia identitas Anda](custom-lambda-idp.md).