Membuat dan mengelola otorisasi khusus - AWS IoT Core

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

Membuat dan mengelola otorisasi khusus

AWS IoT Core mengimplementasikan otentikasi kustom dan skema otorisasi dengan menggunakan sumber daya otorisasi. Setiap authorizer terdiri dari komponen-komponen berikut:

  • Nama: String unik yang ditentukan pengguna yang mengidentifikasi otorisasi.

  • Fungsi Lambda ARN: Nama Sumber Daya Amazon (ARN) dari fungsi Lambda yang mengimplementasikan logika otorisasi dan otentikasi. 

  • Nama kunci token: Nama kunci yang digunakan untuk mengekstrak token dari HTTP header, parameter kueri, atau nama MQTT CONNECT pengguna untuk melakukan validasi tanda tangan. Nilai ini diperlukan jika penandatanganan diaktifkan di otorisasi Anda.

  • Penandatanganan flag dinonaktifkan (opsional): Nilai Boolean yang menentukan apakah akan menonaktifkan persyaratan penandatanganan pada kredensil. Ini berguna untuk skenario di mana penandatanganan kredensional tidak masuk akal, seperti skema otentikasi yang menggunakan nama MQTT pengguna dan kata sandi. Nilai defaultnya adalahfalse, jadi penandatanganan diaktifkan secara default.

  • Kunci publik penandatanganan token: Kunci publik yang AWS IoT Core digunakan untuk memvalidasi tanda tangan token. Panjang minimumnya adalah 2.048 bit. Nilai ini diperlukan jika penandatanganan diaktifkan di otorisasi Anda. 

Lambda menagih Anda untuk berapa kali fungsi Lambda Anda berjalan dan untuk jumlah waktu yang diperlukan untuk kode dalam fungsi Anda untuk mengeksekusi. Untuk informasi selengkapnya tentang harga Lambda, lihat Harga Lambda. Untuk informasi selengkapnya tentang membuat fungsi Lambda, lihat Panduan Pengembang Lambda.

catatan

Jika Anda membiarkan penandatanganan diaktifkan, Anda dapat mencegah pemicu Lambda yang berlebihan oleh klien yang tidak dikenal. Pertimbangkan ini sebelum Anda menonaktifkan penandatanganan di otorisasi Anda.

catatan

Batas waktu tunggu fungsi Lambda untuk otorisasi khusus adalah 5 detik.

Mendefinisikan fungsi Lambda Anda

Saat AWS IoT Core memanggil otorisasi Anda, itu memicu Lambda terkait yang terkait dengan otorisasi dengan peristiwa yang berisi objek berikut. JSON JSONObjek contoh berisi semua bidang yang mungkin. Bidang apa pun yang tidak relevan dengan permintaan koneksi tidak disertakan.

{     "token" :"aToken",     "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.     "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.     "protocolData": {         "tls" : {             "serverName": "serverName" // The server name indication (SNI) host_name string.         },         "http": {             "headers": {                 "#{name}": "#{value}"             },             "queryString": "?#{name}=#{value}"         },         "mqtt": {             "username": "myUserName",             "password": "myPassword", // A base64-encoded string.             "clientId": "myClientId" // Included in the event only when the device sends the value.         }     },     "connectionMetadata": {         "id": UUID // The connection ID. You can use this for logging.     }, }

Fungsi Lambda harus menggunakan informasi ini untuk mengautentikasi koneksi yang masuk dan memutuskan tindakan apa yang diizinkan dalam koneksi. Fungsi harus mengirim respons yang berisi nilai-nilai berikut.

  • isAuthenticated: Nilai Boolean yang menunjukkan apakah permintaan diautentikasi.

  • principalId: String alfanumerik yang bertindak sebagai pengidentifikasi untuk token yang dikirim oleh permintaan otorisasi kustom. Nilai harus berupa string alfanumerik dengan setidaknya satu, dan tidak lebih dari 128, karakter dan cocok dengan pola ekspresi reguler (regex) ini:. ([a-zA-Z0-9]){1,128} Karakter khusus yang tidak alfanumerik tidak diizinkan untuk digunakan dengan in principalId AWS IoT Core. Lihat dokumentasi untuk yang lain AWS layanan jika karakter khusus non-alfanumerik diizinkan untuk. principalId

  • policyDocuments: Daftar JSON -format AWS IoT Core dokumen kebijakan Untuk informasi lebih lanjut tentang membuat AWS IoT Core kebijakan, lihatAWS IoT Core kebijakan-kebijakan. Jumlah maksimum dokumen kebijakan adalah 10 dokumen kebijakan. Setiap dokumen kebijakan dapat berisi maksimal 2.048 karakter.

  • disconnectAfterInSeconds: Sebuah integer yang menentukan durasi maksimum (dalam detik) dari koneksi ke AWS IoT Core pintu gerbang. Nilai minimum adalah 300 detik, dan nilai maksimum adalah 86.400 detik. Nilai defaultnya adalah 86.400.

    catatan

    Nilai disconnectAfterInSeconds (dikembalikan oleh fungsi Lambda) diatur saat koneksi dibuat. Nilai ini tidak dapat diubah selama pemanggilan Lambda refresh kebijakan berikutnya.

  • refreshAfterInSeconds: Sebuah integer yang menentukan interval antara kebijakan refresh. Ketika interval ini berlalu, AWS IoT Core memanggil fungsi Lambda untuk memungkinkan penyegaran kebijakan. Nilai minimum adalah 300 detik, dan nilai maksimum adalah 86.400 detik.

 JSONObjek berikut berisi contoh respons yang dapat dikirim oleh fungsi Lambda Anda.

{ "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       {         "Version": "2012-10-17",         "Statement": [            {               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your_aws_account_id>:topic/customauthtesting"             }          ]        }     ] }

policyDocumentNilai harus berisi yang valid AWS IoT Core dokumen kebijakan. Untuk informasi lebih lanjut tentang AWS IoT Core kebijakan, lihatAWS IoT Core kebijakan-kebijakan. Dalam WebSockets koneksi MQTT TLS MQTT berulang-ulang, AWS IoT Core cache kebijakan ini untuk interval yang ditentukan dalam nilai refreshAfterInSeconds bidang. Dalam kasus HTTP koneksi, fungsi Lambda dipanggil untuk setiap permintaan otorisasi kecuali perangkat Anda menggunakan koneksi HTTP persisten (juga disebut HTTP keep-alive atau penggunaan kembali HTTP koneksi), Anda dapat memilih untuk mengaktifkan caching saat mengonfigurasi otorisasi. Selama interval ini, AWS IoT Core mengotorisasi tindakan dalam koneksi yang dibuat terhadap kebijakan cache ini tanpa memicu fungsi Lambda Anda lagi. Jika terjadi kegagalan selama otentikasi kustom, AWS IoT Core mengakhiri koneksi. AWS IoT Core juga mengakhiri koneksi jika telah terbuka lebih lama dari nilai yang ditentukan dalam disconnectAfterInSeconds parameter.

Berikut ini JavaScript berisi contoh fungsi Lambda Node.js yang mencari kata sandi dalam pesan MQTT Connect dengan nilai test dan mengembalikan kebijakan yang memberikan izin untuk terhubung AWS IoT Core dengan klien bernama myClientName dan mempublikasikan ke topik yang berisi nama klien yang sama. Jika tidak menemukan kata sandi yang diharapkan, ia mengembalikan kebijakan yang menyangkal kedua tindakan tersebut.

// A simple Lambda function for an authorizer. It demonstrates // how to parse an MQTT password and generate a response. exports.handler = function(event, context, callback) {     var uname = event.protocolData.mqtt.username;     var pwd = event.protocolData.mqtt.password;     var buff = new Buffer(pwd, 'base64');     var passwd = buff.toString('ascii');     switch (passwd) {         case 'test':             callback(null, generateAuthResponse(passwd, 'Allow')); break;         default:             callback(null, generateAuthResponse(passwd, 'Deny'));       } }; // Helper function to generate the authorization response. var generateAuthResponse = function(token, effect) { var authResponse = {}; authResponse.isAuthenticated = true; authResponse.principalId = 'TEST123'; var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var publishStatement = {}; var connectStatement = {}; connectStatement.Action = ["iot:Connect"]; connectStatement.Effect = effect; connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"]; publishStatement.Action = ["iot:Publish"]; publishStatement.Effect = effect; publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; policyDocument.Statement[0] = connectStatement; policyDocument.Statement[1] = publishStatement; authResponse.policyDocuments = [policyDocument]; authResponse.disconnectAfterInSeconds = 3600; authResponse.refreshAfterInSeconds = 300; return authResponse; }

Fungsi Lambda sebelumnya mengembalikan berikut ini JSON ketika menerima kata sandi yang diharapkan dari dalam test pesan Connect. MQTT Nilai password dan principalId properti akan menjadi nilai dari pesan MQTT Connect.

{ "password": "password", "isAuthenticated": true, "principalId": "principalId", "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Connect", "Effect": "Allow", "Resource": "*" }, { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}" }, { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}" }, { "Action": "iot:Receive", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}" } ] } ], "disconnectAfterInSeconds": 3600, "refreshAfterInSeconds": 300 }

Membuat Authorizer

Anda dapat membuat otorisasi dengan menggunakan. CreateAuthorizerAPI Contoh berikut menjelaskan perintah.

aws iot create-authorizer --authorizer-name MyAuthorizer --authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function. [--token-key-name MyAuthorizerToken //The key used to extract the token from headers. [--token-signing-public-keys FirstKey= "-----BEGIN PUBLIC KEY-----   [...insert your public key here...]   -----END PUBLIC KEY-----" [--status ACTIVE] [--tags <value>] [--signing-disabled | --no-signing-disabled]

Anda dapat menggunakan signing-disabled parameter untuk memilih keluar dari validasi tanda tangan untuk setiap pemanggilan otorisasi Anda. Kami sangat menyarankan agar Anda tidak menonaktifkan penandatanganan kecuali Anda harus melakukannya. Validasi tanda tangan melindungi Anda dari pemanggilan berlebihan fungsi Lambda Anda dari perangkat yang tidak dikenal. Anda tidak dapat memperbarui signing-disabled status otorisasi setelah Anda membuatnya. Untuk mengubah perilaku ini, Anda harus membuat otorisasi khusus lain dengan nilai signing-disabled parameter yang berbeda.

Nilai untuk tokenSigningPublicKeys parameter tokenKeyName dan bersifat opsional jika Anda menonaktifkan penandatanganan. Mereka adalah nilai yang diperlukan jika penandatanganan diaktifkan.

Setelah Anda membuat fungsi Lambda dan otorisasi khusus, Anda harus secara eksplisit memberikan AWS IoT Core izin layanan untuk menjalankan fungsi atas nama Anda. Anda dapat melakukan ini dengan perintah berikut.

aws lambda add-permission --function-name <lambda_function_name> --principal iot.amazonaws.com --source-arn <authorizer_arn> --statement-id Id-123 --action "lambda:InvokeFunction"

Menguji otorisasi Anda

Anda dapat menggunakan TestInvokeAuthorizerAPIuntuk menguji pemanggilan dan mengembalikan nilai otorisasi Anda. Ini API memungkinkan Anda untuk menentukan metadata protokol dan menguji validasi tanda tangan di otorisasi Anda.  

Tab berikut menunjukkan cara menggunakan AWS CLI untuk menguji otorisasi Anda.

Unix-like
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \ --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
Windows CMD
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^ --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
Windows PowerShell
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ` --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE

Nilai token-signature parameter adalah token yang ditandatangani. Untuk mempelajari cara mendapatkan nilai ini, lihatMenandatangani token.

Jika otorisasi Anda mengambil nama pengguna dan kata sandi, Anda dapat meneruskan informasi ini dengan menggunakan --mqtt-context parameter. Tab berikut menunjukkan cara menggunakan TestInvokeAuthorizer API untuk mengirim JSON objek yang berisi nama pengguna, kata sandi, dan nama klien ke otorisasi kustom Anda.

Unix-like
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \ --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
Windows CMD
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^ --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
Windows PowerShell
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ` --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'

Kata sandi harus dikodekan base64. Contoh berikut menunjukkan cara menyandikan kata sandi di lingkungan mirip Unix.

echo -n PASSWORD | base64

Mengelola otorisasi khusus

Anda dapat mengelola otorisasi Anda dengan menggunakan yang berikut APIs ini.

  • ListAuthorizers: Tampilkan semua otorisasi di akun Anda.

  • DescribeAuthorizer: Menampilkan properti dari authorizer yang ditentukan. Nilai-nilai ini termasuk tanggal pembuatan, tanggal modifikasi terakhir, dan atribut lainnya.

  • SetDefaultAuthorizer: Menentukan authorizer default untuk AWS IoT Core titik akhir data. AWS IoT Core menggunakan otorisasi ini jika perangkat tidak lulus AWS IoT Core kredensyal dan tidak menentukan otorisasi. Untuk informasi lebih lanjut tentang penggunaan AWS IoT Core kredensialnya, lihat. Autentikasi Klien

  • UpdateAuthorizer: Mengubah status, nama kunci token, atau kunci publik untuk otorisasi yang ditentukan.

  • DeleteAuthorizer: Menghapus otorisasi yang ditentukan.

catatan

Anda tidak dapat memperbarui persyaratan penandatanganan otorisasi. Ini berarti Anda tidak dapat menonaktifkan penandatanganan di otorisasi yang sudah ada yang memerlukannya. Anda juga tidak dapat meminta masuk ke otorisasi yang sudah ada yang tidak memerlukannya.