Mengontrol akses ke IoT Hub dengan tanda tangan akses bersama

IoT Hub menggunakan token tanda tangan akses bersama (SAS) untuk mengautentikasi perangkat dan layanan untuk menghindari pengiriman kunci pada kawat. Anda menggunakan token SAS untuk memberikan akses berbatas waktu ke perangkat dan layanan ke fungsionalitas tertentu di IoT Hub. Untuk mendapatkan otorisasi untuk tersambung ke IoT Hub, perangkat dan layanan harus mengirim token SAS yang ditandatangani dengan akses bersama atau kunci simetris. Kunci konten disimpan dengan identitas perangkat di registri identitas.

Artikel ini memperkenalkan:

  • Berbagai izin yang dapat Anda berikan kepada klien untuk mengakses IoT hub Anda.
  • Token yang digunakan IoT Hub untuk memverifikasi izin.
  • Cara melingkupi kredensial untuk membatasi akses ke sumber daya tertentu.
  • Mekanisme autentikasi perangkat kustom yang menggunakan registri identitas perangkat atau skema autentikasi yang ada.

Catatan

Beberapa fitur yang disebutkan dalam artikel ini, seperti pesan cloud-ke-perangkat, kembar perangkat, dan manajemen perangkat, hanya tersedia di tingkat standar IoT Hub. Untuk informasi selengkapnya tentang tingkat IoT Hub dasar dan standar/gratis, lihat Memilih tingkat IoT Hub yang tepat untuk solusi Anda.

IoT Hub menggunakan izin untuk memberi akses ke setiap titik akhir hub IoT. Izin membatasi akses ke hub IoT berdasarkan fungsionalitas. Anda harus memiliki izin yang sesuai untuk mengakses salah satu titik akhir IoT Hub. Misalnya, aplikasi backend harus menyertakan token yang berisi info masuk keamanan bersama dengan setiap pesan yang dikirim ke IoT Hub. Namun, kunci penandatanganan, seperti kunci simetris perangkat, tidak pernah dikirim melalui kawat.

Autentikasi dan otorisasi

Autentikasi adalah proses pembuktian bahwa Anda adalah orang yang Anda katakan. Autentikasi memverifikasi identitas pengguna atau perangkat ke IoT Hub. Ini kadang-kadang disingkat menjadi AuthN. Otorisasi adalah proses mengonfirmasi izin untuk pengguna atau perangkat yang diautentikasi di IoT Hub. Ini menentukan sumber daya dan perintah apa yang diizinkan untuk Anda akses, dan apa yang dapat Anda lakukan dengan sumber daya dan perintah tersebut. Otorisasi kadang-kadang disingkat menjadi AuthZ.

Artikel ini menjelaskan autentikasi dan otorisasi menggunakan tanda tangan akses bersama, yang memungkinkan Anda mengelompokkan izin dan memberikannya ke aplikasi menggunakan kunci akses dan token keamanan yang ditandatangani. Anda juga dapat menggunakan kunci konten atau kunci akses bersama untuk mengautentikasi perangkat dengan IoT Hub. Token SAS menyediakan autentikasi untuk setiap panggilan yang dilakukan oleh perangkat ke IoT Hub dengan mengaitkan kunci konten ke setiap panggilan.

Kontrol akses dan izin

Gunakan kebijakan akses bersama untuk akses tingkat IoT hub, dan gunakan kredensial perangkat individual untuk lingkup akses ke perangkat tersebut saja.

Kebijakan akses bersama tingkat IoT hub

Kebijakan akses bersama dapat memberi kombinasi izin apa pun. Anda dapat menentukan kebijakan dalam portal Azure, secara terprogram dengan menggunakan REST API Sumber Daya IoT Hub, atau menggunakan perintah kebijakan azure CLI az iot hub. IoT Hub yang baru dibuat memiliki kebijakan default berikut:

Kebijakan Akses Bersama Izin
iothubowner Semua izin
layanan Izin ServiceConnect
perangkat Izin DeviceConnect
registryRead Izin RegistryRead
registryReadWrite Izin RegistryRead dan RegistryWrite

Anda dapat menggunakan izin berikut untuk mengontrol akses ke hub IoT Anda:

  • Izin Layanan Koneksi digunakan oleh layanan cloud back-end dan memberikan akses berikut:

    • Akses ke titik akhir komunikasi dan pemantauan yang menghadap layanan cloud.
    • Terima pesan perangkat ke cloud, kirim pesan cloud-ke-perangkat, dan ambil pengakuan pengiriman yang sesuai.
    • Ambil pengakuan pengiriman untuk unggahan file.
    • Akses kembar untuk memperbarui tag dan properti yang diinginkan, mengambil properti yang dilaporkan, dan menjalankan kueri.
  • Izin Perangkat Koneksi digunakan oleh perangkat dan memberikan akses berikut:

    • Akses ke titik akhir yang menghadap perangkat.
    • Kirim pesan perangkat ke cloud dan terima pesan cloud-ke-perangkat.
    • Lakukan unggahan file.
    • Terima pemberitahuan properti yang diinginkan kembar perangkat dan perbarui properti yang dilaporkan kembar perangkat.
  • Izin RegistryRead digunakan oleh layanan cloud back-end dan memberikan akses berikut:

    • Membaca akses ke registri identitas. Untuk informasi selengkapnya, lihat Registri identitas.
  • Izin RegistryReadWrite digunakan oleh layanan cloud back-end dan memberikan akses berikut:

    • Membaca dan menulis akses ke registri identitas. Untuk informasi selengkapnya, lihat Registri identitas.

Informasi masuk keamanan per perangkat

Setiap IoT hub memiliki registri identitas yang menyimpan informasi tentang perangkat dan modul yang diizinkan untuk terhubung ke IoT hub tersebut. Sebelum perangkat atau modul dapat terhubung, harus ada entri untuk perangkat atau modul tersebut di registri identitas IoT hub. Perangkat atau modul mengautentikasi dengan IoT hub berdasarkan info masuk yang disimpan dalam registri identitas.

Saat Anda mendaftarkan perangkat untuk menggunakan autentikasi token SAS, perangkat tersebut mendapatkan dua kunci konten. Kunci konten memberikan izin Perangkat Koneksi untuk identitas perangkat terkait.

Menggunakan token SAS dari layanan

Layanan dapat menghasilkan token SAS dengan menggunakan kebijakan akses bersama yang menentukan izin yang sesuai seperti yang dijelaskan sebelumnya di bagian Kontrol akses dan izin .

Sebagai contoh, layanan yang menggunakan kebijakan akses bersama yang dibuat sebelumnya yang disebut registryRead akan membuat token dengan parameter berikut:

  • URI sumber daya: {IoT hub name}.azure-devices.net,
  • kunci penandatanganan: salah satu kunci kebijakan registryRead,
  • nama Kebijakan: registryRead,
  • waktu kedaluwarsa apa pun.

Misalnya, kode berikut membuat token SAS di Node.js:

var endpoint = "myhub.azure-devices.net";
var policyName = 'registryRead';
var policyKey = '...';

var token = generateSasToken(endpoint, policyKey, policyName, 60);

Hasilnya, yang memberikan akses untuk membaca semua identitas perangkat dalam registri identitas, adalah:

SharedAccessSignature sr=myhub.azure-devices.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=registryRead

Untuk contoh selengkapnya, lihat Membuat token SAS.

Untuk layanan, token SAS hanya memberikan izin di tingkat IoT Hub. Artinya, layanan yang mengautentikasi dengan token berdasarkan kebijakan layanan akan dapat melakukan semua operasi yang diberikan oleh Layanan Koneksi izin. Operasi ini termasuk menerima pesan dari perangkat ke cloud, mengirim pesan dari cloud ke perangkat, dan seterusnya. Jika Anda ingin memberikan akses yang lebih terperinci ke layanan Anda, misalnya, membatasi layanan untuk hanya mengirim pesan cloud-ke-perangkat, Anda dapat menggunakan ID Microsoft Entra. Untuk mempelajari selengkapnya, lihat Mengautentikasi dengan MICROSOFT Entra ID.

Menggunakan token SAS dari perangkat

Ada dua cara untuk mendapatkan izin DeviceConnect dengan IoT Hub dengan token SAS: gunakan kunci perangkat simetris dari registri identitas, atau gunakan kunci akses bersama.

Semua fungsionalitas yang dapat diakses dari perangkat diekspos berdasarkan desain pada titik akhir dengan awalan /devices/{deviceId}.

Titik akhir yang menghadap perangkat (terlepas dari protokol):

Titik akhir Fungsi
{iot hub name}/devices/{deviceId}/messages/events Mengirim pesan perangkat-ke- cloud.
{iot hub name}/devices/{deviceId}/messages/devicebound Menerima pesan cloud-ke-perangkat.

Menggunakan kunci simetris dalam registri identitas

Saat menggunakan kunci simetris identitas perangkat untuk menghasilkan token, elemen policyName (skn) dari token dihilangkan.

Misalnya, token yang dibuat untuk mengakses semua fungsionalitas perangkat harus memiliki parameter berikut:

  • URI sumber daya: {IoT hub name}.azure-devices.net/devices/{device id},
  • kunci penandatanganan: kunci simetris apa pun untuk identitas {device id},
  • tanpa nama kebijakan,
  • waktu kedaluwarsa apa pun.

Misalnya, kode berikut membuat token SAS di Node.js:

var endpoint ="myhub.azure-devices.net/devices/device1";
var deviceKey ="...";

var token = generateSasToken(endpoint, deviceKey, null, 60);

Hasilnya, yang memberi akses ke semua fungsionalitas untuk perangkat1, adalah:

SharedAccessSignature sr=myhub.azure-devices.net%2fdevices%2fdevice1&sig=13y8ejUk2z7PLmvtwR5RqlGBOVwiq7rQR3WZ5xZX3N4%3D&se=1456971697

Untuk contoh selengkapnya, lihat Membuat token SAS.

Menggunakan kebijakan akses bersama untuk mengakses atas nama perangkat

Saat Anda membuat token dari kebijakan akses bersama, atur bidang skn ke nama kebijakan. Kebijakan ini harus memberi izin DeviceConnect.

Dua skenario utama untuk menggunakan kebijakan akses bersama untuk mengakses fungsionalitas perangkat adalah:

Karena kebijakan akses bersama berpotensi memberikan akses untuk tersambung sebagai perangkat apa pun, penting untuk menggunakan URI sumber daya yang benar saat membuat token SAS. Pengaturan ini sangat penting untuk layanan token, yang harus melingkupi token ke perangkat tertentu menggunakan URI sumber daya. Poin ini kurang relevan untuk gateway protokol karena sudah memediasi lalu lintas untuk semua perangkat.

Sebagai contoh, layanan token yang menggunakan kebijakan akses bersama yang dibuat sebelumnya yang disebut perangkat akan membuat token dengan parameter berikut:

  • URI sumber daya: {IoT hub name}.azure-devices.net/devices/{device id},
  • kunci penandatanganan: salah satu kunci kebijakan device,
  • nama Kebijakan: device,
  • waktu kedaluwarsa apa pun.

Misalnya, kode berikut membuat token SAS di Node.js:

var endpoint ="myhub.azure-devices.net/devices/device1";
var policyName = 'device';
var policyKey = '...';

var token = generateSasToken(endpoint, policyKey, policyName, 60);

Hasilnya, yang memberi akses ke semua fungsionalitas untuk perangkat1, adalah:

SharedAccessSignature sr=myhub.azure-devices.net%2fdevices%2fdevice1&sig=13y8ejUk2z7PLmvtwR5RqlGBOVwiq7rQR3WZ5xZX3N4%3D&se=1456971697&skn=device

Gateway protokol dapat menggunakan token yang sama untuk semua perangkat dengan mengatur URI sumber daya ke myhub.azure-devices.net/devices.

Untuk contoh selengkapnya, lihat Membuat token SAS.

Membuat layanan token untuk mengintegrasikan perangkat yang ada

Anda dapat menggunakan registri identitas IoT Hub untuk mengonfigurasi info masuk keamanan per perangkat atau per modul dan kontrol akses menggunakan token. Jika solusi IoT sudah memiliki registri identitas kustom dan/atau skema autentikasi, pertimbangkan untuk membuat layanan token untuk mengintegrasikan infrastruktur ini dengan IoT Hub. Dengan cara ini, Anda dapat menggunakan fitur IoT lain dalam solusi Anda.

Layanan token adalah layanan cloud khusus. Layanan ini menggunakan kebijakan akses bersama IoT Hub dengan izin DeviceConnect untuk membuat token device-scoped atau module-scoped. Token ini memungkinkan perangkat atau modul untuk terhubung ke hub IoT Anda.

Diagram yang memperlihatkan langkah-langkah pola layanan token.

Berikut adalah langkah-langkah utama dari pola layanan token:

  1. Buat kebijakan akses bersama IoT Hub dengan izin DeviceConnect untuk hub IoT Anda. Anda dapat membuat kebijakan ini di portal Azure atau secara terprogram. Layanan token menggunakan kebijakan ini untuk menandatangani token yang dibuatnya.

  2. Saat perangkat atau modul perlu mengakses hub IoT Anda, perangkat atau modul meminta token yang ditandatangani dari layanan token Anda. Perangkat dapat mengautentikasi dengan skema registri/autentikasi identitas kustom Anda untuk menentukan identitas perangkat/modul yang digunakan layanan token untuk membuat token.

  3. Layanan token mengembalikan token. Token dibuat dengan menggunakan atau sebagai , dengan deviceId sebagai perangkat yang diautentikasi dan moduleId sebagai modul yang diautentikasi.resourceURI/devices/{deviceId}/modules/{moduleId}/devices/{deviceId} Layanan token menggunakan kebijakan akses bersama untuk membuat token.

  4. Perangkat/modul menggunakan token secara langsung dengan IoT hub.

Catatan

Anda dapat menggunakan kelas .NET SharedAccessSignatureBuilder atau kelas Java IotHubServiceSasToken untuk membuat token di layanan token Anda.

Layanan token dapat mengatur kedaluwarsa token sesuai keinginan. Saat token kedaluwarsa, IoT hub memutuskan sambungan perangkat/modul. Lalu, perangkat/modul harus meminta token baru dari layanan token. Waktu kedaluwarsa yang singkat meningkatkan beban pada perangkat/modul dan layanan token.

Agar perangkat/modul tersambung ke hub, Anda masih harus menambahkannya ke registri identitas IoT Hub—meskipun menggunakan token dan bukan kunci untuk terhubung. Oleh karena itu, Anda dapat terus menggunakan kontrol akses per perangkat/per modul dengan mengaktifkan atau menonaktifkan identitas perangkat/modul dalam registri identitas. Pendekatan ini mengurangi risiko penggunaan token dengan waktu kedaluwarsa yang lama.

Perbandingan dengan gateway kustom

Pola layanan token adalah cara yang disarankan untuk menerapkan skema registri/autentikasi identitas kustom dengan IoT Hub. Pola ini direkomendasikan karena IoT Hub terus menangani sebagian besar lalu lintas solusi. Namun, jika skema autentikasi kustom begitu terkait dengan protokol, Anda mungkin memerlukan gateway kustom untuk memproses semua lalu lintas. Contoh skenario seperti itu adalah menggunakan Keamanan Lapisan Transportasi (TLS) dan kunci yang dibagikan sebelumnya (PSK). Untuk mengetahui informasi selengkapnya, lihat Bagaimana perangkat IoT Edge dapat digunakan sebagai gateway.

Membuat token SAS

Azure IoT SDK secara otomatis menghasilkan token, tetapi beberapa skenario mengharuskan Anda untuk membuat dan menggunakan token SAS secara langsung, termasuk:

  • Penggunaan langsung permukaan MQTT, AMQP, atau HTTPS.

  • Implementasi pola layanan token, seperti yang dijelaskan di bagian Buat layanan token.

Token yang ditandatangani dengan kunci akses bersama memberi akses ke semua fungsionalitas yang terkait dengan izin kebijakan akses bersama. Token yang ditandatangani dengan kunci simetris identitas perangkat hanya memberi izin DeviceConnect untuk identitas perangkat terkait.

Bagian ini menyediakan contoh pembuatan token SAS dalam bahasa kode yang berbeda. Anda juga dapat membuat token SAS dengan perintah ekstensi CLI az iot hub generate-sas-token, atau ekstensi Azure IoT Hub untuk Visual Studio Code.

Struktur token SAS

Token SAS memiliki format berikut:

SharedAccessSignature sig={signature-string}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}

Berikut adalah nilai yang diharapkan:

Nilai Deskripsi
{signature} Untai (karakter) tanda tangan HMAC-SHA256 formulir: {URL-encoded-resourceURI} + "\n" + expiry. Penting: Kunci didekodekan dari base64 dan digunakan sebagai kunci untuk melakukan perhitungan HMAC-SHA256.
{resourceURI} Awalan URI (berdasarkan segmen) dari titik akhir yang dapat diakses dengan token ini, dimulai dengan nama host IoT Hub (tanpa protokol). Token SAS yang diberikan ke layanan backend dilingkup ke tingkat hub IoT; misalnya, myHub.azure-devices.net. Token SAS yang diberikan ke perangkat harus dicakupkan ke perangkat individual; misalnya, myHub.azure-devices.net/devices/device1.
{kedaluwarsa} String UTF8 untuk jumlah detik sejak masa 00:00:00 UTC pada 1 Januari 1970.
{URL-encoded-resourceURI} Pengodean URL huruf kecil pada URI sumber daya huruf kecil
{policyName} Nama kebijakan akses bersama yang menjadi rujukan token ini. Tidak ada jika token mengacu pada informasi masuk registri perangkat.

Awalan URI dihitung berdasarkan segmen dan bukan berdasarkan karakter. Misalnya, /a/b adalah awalan untuk /a/b/c tetapi tidak untuk /a/bc.

Kode berikut menghasilkan token SAS menggunakan URI sumber daya, kunci penandatanganan, nama kebijakan, dan periode kedaluwarsa. Bagian berikutnya menjelaskan cara menginisialisasi input yang berbeda untuk kasus penggunaan token yang berbeda.

var generateSasToken = function(resourceUri, signingKey, policyName, expiresInMins) {
    resourceUri = encodeURIComponent(resourceUri);

    // Set expiration in seconds
    var expires = (Date.now() / 1000) + expiresInMins * 60;
    expires = Math.ceil(expires);
    var toSign = resourceUri + '\n' + expires;

    // Use crypto
    var hmac = crypto.createHmac('sha256', Buffer.from(signingKey, 'base64'));
    hmac.update(toSign);
    var base64UriEncoded = encodeURIComponent(hmac.digest('base64'));

    // Construct authorization string
    var token = "SharedAccessSignature sr=" + resourceUri + "&sig="
    + base64UriEncoded + "&se=" + expires;
    if (policyName) token += "&skn="+policyName;
    return token;
};

Protokol spesifik

Setiap protokol yang didukung, seperti MQTT, AMQP, dan HTTPS, membawa token dengan cara yang berbeda.

Saat menggunakan MQTT, paket CONNECT memiliki deviceId sebagai ClientId, {iothubhostname}/{deviceId} di bidang Nama Pengguna, dan token SAS di bidang Kata Sandi. {iothubhostname} harus menjadi CName lengkap hub IoT (misalnya, myhub.azure-devices.net).

Saat menggunakan AMQP, IoT Hub mendukung SASL PLAIN dan AMQP Claims-Based-Security.

Jika Anda menggunakan AMQP claims-based-security, standar menentukan cara mengirim token ini.

Untuk SASL PLAIN, nama pengguna dapat berupa:

  • {policyName}@sas.root.{iothubName} jika menggunakan token tingkat IoT hub.
  • {deviceId}@sas.{iothubname} jika menggunakan token yang tercakup perangkat.

Dalam kedua kasus, bidang kata sandi berisi token, seperti yang dijelaskan dalam struktur token SAS.

HTTPS menerapkan autentikasi dengan menyertakan token yang valid di header permintaan Otorisasi.

Misalnya, Nama Pengguna (DeviceId peka huruf besar/kecil): iothubname.azure-devices.net/DeviceId

Kata sandi (Anda dapat membuat token SAS dengan perintah ekstensi CLI az iot hub generate-sas-token, atau ekstensi Azure IoT Hub untuk Visual Studio Code):

SharedAccessSignature sr=iothubname.azure-devices.net%2fdevices%2fDeviceId&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501

Catatan

Azure IoT SDK secara otomatis menghasilkan token saat menyambungkan ke layanan. Dalam beberapa kasus, Azure IoT SDK tidak mendukung semua protokol atau semua metode autentikasi.

Pertimbangan khusus untuk SASL PLAIN

Saat menggunakan SASL PLAIN dengan AMQP, klien yang terhubung ke IoT hub dapat menggunakan token tunggal untuk setiap sambungan TCP. Ketika token kedaluwarsa, sambungan TCP terputus dari layanan dan memicu sambungan ulang. Perilaku ini, meskipun tidak bermasalah untuk aplikasi back-end, merusak aplikasi perangkat karena alasan berikut:

  • Gateway biasanya terhubung atas nama banyak perangkat. Saat menggunakan SASL PLAIN, mereka harus membuat sambungan TCP yang berbeda untuk setiap perangkat yang terhubung ke IoT hub. Skenario ini sangat meningkatkan konsumsi daya dan sumber daya jaringan, dan meningkatkan latensi setiap sambungan perangkat.

  • Perangkat yang dibatasi sumber daya terpengaruh peningkatan penggunaan sumber daya untuk terhubung kembali setelah setiap token kedaluwarsa.

Langkah berikutnya

Sekarang setelah Anda mempelajari cara mengontrol akses IoT Hub, Anda mungkin tertarik dengan topik panduan pengembang IoT Hub berikut ini: