Menggunakan AWS Lambda untuk mengintegrasikan penyedia identitas Anda - AWS Transfer Family

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

Menggunakan AWS Lambda untuk mengintegrasikan penyedia identitas Anda

Buat 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.

catatan

Sebelum membuat server Transfer Family yang menggunakan Lambda sebagai penyedia identitas, Anda harus membuat fungsinya. Untuk contoh fungsi Lambda, lihat. Contoh fungsi Lambda Atau, Anda dapat menerapkan CloudFormation tumpukan yang menggunakan salah satu. Template fungsi Lambda Selain itu, pastikan fungsi Lambda Anda menggunakan kebijakan berbasis sumber daya yang mempercayai Transfer Family. Untuk contoh kebijakan, lihat Kebijakan berbasis sumber daya Lambda.

  1. Buka konsol AWS Transfer Family.

  2. 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 khusus dipilih. Juga memiliki nilai default yang dipilih, yaitu bahwa pengguna dapat mengautentikasi menggunakan kata sandi atau kunci mereka.
    catatan

    Pilihan metode otentikasi hanya tersedia jika Anda mengaktifkan SFTP sebagai salah satu protokol untuk server Transfer Family Anda.

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

  4. Untuk AWS Lambda fungsi, pilih nama fungsi Lambda Anda.

  5. Isi kotak yang tersisa, lalu pilih Buat server. Untuk detail tentang langkah-langkah yang tersisa untuk membuat server, lihatMengkonfigurasi titik SFTP akhir,FTPS, atau FTP server.

Kebijakan berbasis sumber daya Lambda

Anda harus memiliki kebijakan yang mereferensikan server Transfer Family dan LambdaARNs. Misalnya, Anda dapat menggunakan kebijakan berikut dengan fungsi Lambda yang terhubung ke penyedia identitas Anda. Kebijakan ini diloloskan 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:transfer:region:account-id:function:my-lambda-auth-function", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:transfer:region:account-id:server/server-id" } } } ] }"
catatan

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

Struktur pesan peristiwa

Struktur pesan acara dari SFTP server 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 kredenal 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 danFTPS: satu-satunya perbedaan adalah nilai-nilai tersebut digunakan untuk protocol parameter, bukanSFTP.

Fungsi Lambda untuk otentikasi

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 atau Membangun fungsi Lambda dengan Node.js.

Template fungsi Lambda

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

catatan

Anda dapat membuat FIPS AWS Transfer Family server yang diaktifkan AWS CloudFormation dengan menentukan kebijakan keamanan FIPS yang diaktifkan di template Anda. Kebijakan keamanan yang tersedia dijelaskan dalam Kebijakan keamanan untuk AWS Transfer Family

Untuk membuat AWS CloudFormation tumpukan yang akan digunakan untuk otentikasi
  1. Buka AWS CloudFormation konsol di https://console.aws.amazon.com/cloudformation.

  2. Ikuti petunjuk untuk menerapkan AWS CloudFormation tumpukan dari template yang ada di Memilih template tumpukan di Panduan AWS CloudFormation Pengguna.

  3. Gunakan salah satu templat berikut untuk membuat fungsi Lambda yang akan digunakan untuk otentikasi di Transfer Family.

    • Templat tumpukan klasik (Amazon Cognito)

      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

      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 formataws/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: Template dasar yang digunakan AWS Lambda dengan AWS Transfer Family server untuk mengintegrasikan Okta sebagai penyedia identitas khusus.

    • Template tumpukan Okta-MFA: Template dasar yang digunakan AWS Lambda dengan AWS Transfer Family server untuk mengintegrasikan Okta, dengan MultiFactor Otentikasi, sebagai penyedia identitas khusus.

    • Template Azure Active Directory: detail untuk tumpukan ini dijelaskan dalam posting blog Mengautentikasi AWS Transfer Family dengan Azure Active Directory dan. AWS Lambda

    Setelah tumpukan digunakan, 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.

Nilai Lambda yang valid

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) IAM peran yang mengontrol akses pengguna ke bucket Amazon S3 atau sistem file AmazonEFS. 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 EFS Amazon Anda. IAMPeran tersebut juga harus berisi hubungan kepercayaan yang memungkinkan server mengakses sumber daya Anda saat melayani permintaan transfer pengguna Anda.

Untuk detail tentang membangun hubungan kepercayaan, lihatUntuk membangun hubungan kepercayaan.

Diperlukan

PosixProfile

POSIXIdentitas lengkap, termasuk ID pengguna (Uid), ID grup (Gid), dan grup sekunder IDs (SecondaryGids) apa pun, yang mengontrol akses pengguna ke sistem EFS file Amazon Anda. POSIXIzin yang ditetapkan pada file dan direktori di sistem file Anda menentukan tingkat akses yang didapat pengguna saat mentransfer file masuk dan keluar dari sistem file Amazon EFS Anda.

Diperlukan untuk penyimpanan EFS dukungan Amazon

PublicKeys

Daftar nilai kunci SSH publik 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 IAM peran yang sama di beberapa pengguna. Kebijakan ini mencakup bawah akses pengguna ke bagian dari bucket Amazon S3 mereka.

Opsional

HomeDirectoryType

Jenis direktori pendaratan (folder) yang Anda inginkan direktori home pengguna Anda ketika mereka masuk ke server.

  • Jika Anda mengaturnyaPATH, pengguna akan melihat bucket Amazon S3 absolut atau EFS jalur Amazon seperti pada klien protokol transfer file mereka.

  • Jika Anda menyetelnyaLOGICAL, Anda harus menyediakan pemetaan dalam HomeDirectoryDetails parameter agar jalur Amazon S3 atau EFS Amazon terlihat oleh pengguna Anda.

Opsional

HomeDirectoryDetails

Pemetaan direktori logis yang menentukan jalur dan kunci Amazon S3 atau EFS Amazon 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 yang sebenarnya. EFS

Diperlukan jika HomeDirectoryType memiliki nilai LOGICAL

HomeDirectory

Direktori pendaratan untuk pengguna ketika mereka masuk ke server menggunakan klien.

Opsional

catatan

HomeDirectoryDetailsadalah representasi string dari JSON peta. Ini berbeda denganPosixProfile, yang merupakan objek JSON peta yang sebenarnya, dan PublicKeys yang merupakan JSON array string. Lihat contoh kode untuk detail khusus bahasa.

Contoh fungsi Lambda

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

catatan

Dalam contoh ini, detail direktori pengguna, peran, POSIX profil, kata sandi, dan home semuanya 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.

// 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: '/fs-faa1a123' // Not required, defaults to '/' }; // 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.

# 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': '/fs-fs-faa1a123', '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

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.

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

  3. Masukkan teks untuk Nama Pengguna dan Kata Sandi yang Anda atur saat Anda menerapkan AWS CloudFormation tumpukan. Jika Anda menyimpan opsi default, nama pengguna adalah myuser dan kata sandinyaMySuperSecretPassword.

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

CLI
Untuk menguji konfigurasi Anda dengan menggunakan AWS CLI
  1. Jalankan perintah test-identity-provider. 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
  2. Masukkan ID server.

  3. Masukkan nama pengguna dan kata sandi yang Anda tetapkan saat Anda menerapkan AWS CloudFormation tumpukan. Jika Anda menyimpan opsi default, nama pengguna adalah myuser dan kata sandinyaMySuperSecretPassword.

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

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

catatan

Dalam contoh respons di bawah ini, Response bidang adalah JSON objek yang telah “dirangkai” (diubah menjadi JSON string 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": "" }