Bagikan melalui


Tutorial: TLS, autentikasi klien X.509, dan otorisasi kontrol akses berbasis atribut (ABAC) dengan broker Azure IoT Operations MQTT

Tutorial ini memandu Anda menyiapkan broker Azure IoT Operations MQTT dengan enkripsi TLS dan autentikasi klien X.509. Ini termasuk instruksi langkah demi langkah dan skrip untuk membuat sertifikat untuk broker dan klien. Tutorial ini menjelaskan cara mengonfigurasi broker MQTT dengan otoritas sertifikat akar (CA) yang berbeda untuk klien dan broker. Ini juga mencakup pengaturan kebijakan otorisasi kontrol akses berbasis atribut (ABAC) berdasarkan rantai sertifikat klien. Terakhir, tutorial menggunakan klien Nyamuk untuk menguji berbagai skenario untuk memastikan pengaturan berfungsi dengan benar.

Tutorial ini mensimulasikan lingkungan tempat Azure IoT Operations diinstal di pabrik Contoso, dengan perangkat yang diproduksi oleh Fabrikam. Untuk membuat Autentikasi TLS dan X.509 berfungsi:

  • Broker MQTT Operasi Azure IoT, yang dipasang di pabrik Contoso, harus mempercayai CA akar Fabrikam
  • Sensor Fabrikam, seperti termostat, harus mempercayai OS akar Contoso
  • Setiap entitas harus memiliki sertifikat daun sendiri yang dikeluarkan oleh CA akar yang benar

Diagram memperlihatkan hubungan kepercayaan server dan akar otoritas sertifikat sisi klien.

Prasyarat

Untuk menjalankan tutorial ini, Anda perlu:

  • Kluster Kubernetes dengan penerusan port diaktifkan untuk port 8883.
  • Operasi Azure IoT disebarkan tanpa pendengar load balancer yang ada.
  • Akses Kubectl ke kluster untuk membuat rahasia Kubernetes dan peta konfigurasi.
  • Klien Mosquitto untuk menerbitkan dan berlangganan pesan MQTT yang berjalan pada komputer yang sama dengan kluster Kubernetes untuk localhost akses. Untuk tidak menggunakan localhost, lihat Opsional: Gunakan nama host atau alamat IP nyata alih-alih localhost bagian.
  • Langkah CLI untuk membuat sertifikat.

Petunjuk / Saran

Untuk memenuhi persyaratan ini, gunakan ruang kode mulai cepat. Codespace mulai cepat menyederhanakan proses penyiapan dengan menyediakan komponen ini di luar kotak.

Selain itu, pemahaman tentang kriptografi kunci publik dan istilah-istilah seperti CA akar, kunci privat, dan sertifikat perantara berguna.

Opsional: Gunakan nama host atau alamat IP nyata alih-alih localhost

Agar tutorial ini tetap sederhana, kami menggunakan localhost untuk mengakses broker MQTT. Pendekatan ini memastikan bahwa sertifikat server broker memiliki Subject Alternative Name (SAN) yang cocok dengan nama host yang digunakan untuk mengakses broker. Menggunakan localhost menyederhanakan penyiapan karena SAN sudah diatur dengan benar.

Dalam skenario dunia nyata, Anda akan menggunakan nama host atau IP eksternal broker alih-alih localhost dan menyambungkannya dari perangkat lain di jaringan. Dalam hal ini, Anda perlu menentukan nama host atau alamat IP yang benar dan menggunakannya sebagai SAN saat membuat sertifikat server:

  • Jika nama host atau alamat IP sudah diketahui (misalnya, melalui catatan DNS atau IP statis), gunakan sebagai SAN saat membuat sertifikat server. Kemudian, sambungkan ke broker menggunakan nama host atau IP tersebut alih-alih localhost.
  • Jika nama host atau alamat IP belum diketahui, Anda dapat menggunakan layanan tempat penampung untuk menentukan alamat IP eksternal:
    1. Buat layanan LoadBalancer pada port yang tidak digunakan (seperti 8080):
      kubectl create service loadbalancer placeholder-service --tcp=8080:8080
      
    2. Ambil IP eksternal:
      kubectl get svc placeholder-service
      
    3. Jika IP eksternal:
      • Menampilkan nilai seperti 192.168.X.X - gunakan IP tersebut sebagai SAN saat membuat sertifikat server dan rahasia. Kemudian, sambungkan ke broker menggunakan IP tersebut alih-alih localhost.
      • Show <pending> - distribusi Kubernetes yang Anda gunakan mungkin tidak mendukung penetapan IP eksternal secara otomatis. Untuk menemukan IP eksternal, ikuti langkah-langkah dalam dokumentasi Kubernetes untuk distribusi dan lingkungan host Anda. Anda mungkin juga perlu mengonfigurasi penerusan port atau VPN tergantung pada penyiapan jaringan.
    4. Setelah menentukan IP eksternal, hapus layanan tempat penampung:
      kubectl delete svc placeholder-service
      

Metode ini memastikan bahwa sertifikat server cocok dengan alamat IP eksternal, memungkinkan akses aman ke broker MQTT.

Menyiapkan sertifikat sisi server dan rantai penuh

Pertama, buat CA akar sisi server. CA ini terpisah dari CA akar sisi klien yang dibuat nanti. Agar pemisahan tetap jelas, kami memberi nama semua sisi server "Contoso". Untuk mempermudah langkah-langkah selanjutnya, kami melewati kata sandi untuk mengenkripsi kunci privat. Praktik ini hanya dapat diterima dalam pengaturan tutorial.

step certificate create "Contoso Root CA" \
contoso_root_ca.crt contoso_root_ca.key \
--profile root-ca \
--no-password --insecure

Kemudian, buat CA perantara yang ditandatangani oleh CA akar ini.

step certificate create "Contoso Intermediate CA 1" \
contoso_intermediate_ca.crt contoso_intermediate_ca.key \
--profile intermediate-ca \
--ca ./contoso_root_ca.crt --ca-key ./contoso_root_ca.key \
--no-password --insecure

Terakhir, gunakan OS perantara ini untuk menandatangani sertifikat server untuk frontend broker broker MQTT. Di sini, localhost adalah Nama Alternatif Subjek (SAN) yang digunakan untuk tutorial.

step certificate create mqtts-endpoint \
mqtts-endpoint.crt mqtts-endpoint.key \
--profile leaf \
--ca ./contoso_intermediate_ca.crt --ca-key ./contoso_intermediate_ca.key \
--bundle \
--san localhost \
--not-after 2400h --no-password --insecure

--bundle Dengan bendera, sertifikat server dibundel dengan sertifikat perantara penandatanganan. Jabat tangan TLS memerlukan bundel untuk memverifikasi rantai penuh.

Menyiapkan sertifikat sisi klien dan rantai penuh

Demikian pula, buat CA akar untuk Fabrikam dan CA perantara.

step certificate create --profile root-ca "Fabrikam Root CA" \
fabrikam_root_ca.crt fabrikam_root_ca.key \
--no-password --insecure
step certificate create "Fabrikam Intermediate CA 1" \
fabrikam_intermediate_ca.crt fabrikam_intermediate_ca.key \
--profile intermediate-ca \
--ca ./fabrikam_root_ca.crt --ca-key ./fabrikam_root_ca.key \
--no-password --insecure

Kemudian, hasilkan sertifikat klien untuk termostat, hygrometer, pemanas, dan bola lampu.

# Create a client certificate for the thermostat
step certificate create thermostat thermostat.crt thermostat.key \
--ca ./fabrikam_intermediate_ca.crt --ca-key ./fabrikam_intermediate_ca.key --bundle \
--not-after 2400h --no-password --insecure

# Create a client certificate for the hygrometer
step certificate create hygrometer hygrometer.crt hygrometer.key \
--ca ./fabrikam_intermediate_ca.crt --ca-key ./fabrikam_intermediate_ca.key --bundle \
--not-after 2400h --no-password --insecure

# Create a client certificate for the heater
step certificate create heater heater.crt heater.key \
--ca ./fabrikam_intermediate_ca.crt --ca-key ./fabrikam_intermediate_ca.key --bundle \
--not-after 2400h --no-password --insecure

# Create a client certificate for the lightbulb
step certificate create lightbulb lightbulb.crt lightbulb.key \
--ca ./fabrikam_intermediate_ca.crt --ca-key ./fabrikam_intermediate_ca.key --bundle \
--not-after 2400h --no-password --insecure

Mengonfigurasi Kubernetes

Impor sertifikat server yang baru dibuat dan kunci privat ke dalam rahasia Kubernetes. Rahasia ini digunakan untuk mengonfigurasi pendengar TLS untuk broker MQTT nanti.

kubectl create secret tls broker-server-cert -n azure-iot-operations \
--cert mqtts-endpoint.crt \
--key mqtts-endpoint.key

Selain itu, buat peta konfigurasi untuk berisi CA akar Fabrikam (sisi klien). Peta konfigurasi ini diperlukan agar broker MQTT mempercayainya untuk autentikasi X.509.

kubectl create configmap fabrikam-ca -n azure-iot-operations \
--from-file=client_ca.pem=fabrikam_root_ca.crt

Mengonfigurasi broker MQTT

Langkah selanjutnya mengonfigurasi broker MQTT dengan enkripsi TLS dan autentikasi klien X.509. Tutorial ini menggunakan portal Azure untuk mengonfigurasi broker MQTT.

Autentikasi

Untuk memungkinkan klien mengautentikasi menggunakan sertifikat X.509 yang dikeluarkan oleh CA akar Fabrikam, buat kebijakan autentikasi yang mempercayai sertifikat CA akar Fabrikam dan memetakan sertifikat klien ke atribut otorisasi untuk ABAC.

  1. Di portal Azure, navigasikan ke instans Operasi IoT Anda.

  2. Di bawah Komponen, pilih MQTT Broker.

  3. Pilih tab Autentikasi .

  4. Pilih Buat kebijakan autentikasi.

  5. Untuk Nama kebijakan, masukkan x509-auth.

  6. Tambahkan metode baru dengan memilih Tambahkan metode.

  7. Pilih jenis metode X.509 dari daftar dropdown lalu pilih Tambahkan detail untuk mengonfigurasi metode.

  8. Di panel detail autentikasi X.509, tentukan nama fabrikam-ca ConfigMap sertifikat CA tepercaya Fabrikam dan atributnya.

    {
      "trustedClientCaCert": "fabrikam-ca",
      "authorizationAttributes": {
        "thermostat": {
          "subject": "CN = thermostat",
          "attributes": {
            "group": "thermostat_group"
          }
        },
        "hygrometer": {
          "subject": "CN = hygrometer",
          "attributes": {
            "group": "hygrometer_group"
          }
        },
        "intermediate": {
          "subject": "CN = Fabrikam Intermediate CA 1",
          "attributes": {
            "manufacturer": "fabrikam"
          }
        }
      }
    }
    
  9. Pilih Terapkan lalu Tambahkan untuk menyimpan perubahan.

Cuplikan layar memperlihatkan cara menggunakan portal Azure untuk membuat metode autentikasi MQTT broker X.509.

Pendengar

Dengan kebijakan autentikasi di tempat, buat pendengar yang menggunakan kebijakan autentikasi X.509. Selain itu, karena autentikasi X.509 memerlukan TLS, konfigurasikan pendengar untuk menggunakan sertifikat server Contoso dan kunci privat yang dibuat sebelumnya.

  1. Di portal Azure, navigasikan ke instans Operasi IoT Anda.

  2. Di bawah Komponen, pilih MQTT Broker.

  3. Pilih pendengar broker MQTT untuk LoadBalancer>Create. Masukkan pengaturan berikut:

    Pengaturan Deskripsi
    Nama Memasuki mqtts-endpoint.
    Nama layanan Nama layanan Kubernetes. Biarkan kosong untuk menggunakan nama mqtts-endpoint pendengar sebagai nama layanan.
    Jenis layanan LoadBalancer sudah dipilih.
  4. Di bawah Port, masukkan pengaturan berikut untuk port pertama:

    Pengaturan Deskripsi
    Pelabuhan Masukkan 8883
    Autentikasi Pilih x509-auth
    Otorisasi Pilih Tidak Ada
    Protokol Pilih MQTT
    TLS Pilih Tambahkan
  5. Di panel konfigurasi TLS, masukkan pengaturan berikut:

    Pengaturan Deskripsi
    TLS Mode Pilih Manual
    Nama pengeluar sertifikat Masukkan broker-server-cert
  6. Pilih Terapkan dan Buat pendengar.

Cuplikan layar memperlihatkan metode portal Azure untuk mengatur pendengar dengan port TLS.

Setelah satu atau dua menit, mqtts-endpoint layanan LoadBalancer dibuat.

$ kubectl get service mqtts-endpoint -n azure-iot-operations
NAME             TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
mqtts-endpoint   LoadBalancer   10.43.28.140   XXX.XX.X.X    8883:30988/TCP   104s

Alih-alih menggunakan IP eksternal, kami menggunakan localhost untuk tutorial.

Petunjuk / Saran

Konfigurasi codespace secara otomatis menyiapkan penerusan port untuk 8883. Untuk menyiapkan lingkungan lain, lihat Menggunakan penerusan port.

Menggunakan satu klien Nyamuk untuk menerbitkan pesan melalui TLS

Dari folder yang sama dengan file sertifikat: contoso_root_ca.crt, , thermostat.crtdan thermostat.key, gunakan klien Nyamuk untuk menerbitkan pesan. --cafile contoso_root_ca.crt Bendera adalah agar Nyamuk melakukan verifikasi sertifikat server.

mosquitto_pub -t "example/topic" -m "example temperature measurement" -i thermostat \
-q 1 -V mqttv5 -d \
-h localhost \
--key thermostat.key \
--cert thermostat.crt \
--cafile contoso_root_ca.crt

Penerbitan berhasil karena Nyamuk menggunakan sertifikat klien yang berakar di fabrikam_root_ca.crt. Broker MQTT mempercayai sertifikat ini karena x509-auth kebijakan autentikasi yang dibuat sebelumnya. Selain itu, broker MQTT saat ini memungkinkan klien terautentikasi untuk menerbitkan ke topik apa pun.

Client thermostat sending CONNECT
Client thermostat received CONNACK (0)
Client thermostat sending PUBLISH (d0, q1, r0, m1, 'example/topic', ... (31 bytes))
Client thermostat received PUBACK (Mid: 1, RC:0)
Client thermostat sending DISCONNECT

Mengonfigurasi otorisasi ke topik MQTT untuk beberapa klien menggunakan X.509

Untuk membatasi akses ke topik MQTT berdasarkan atribut sertifikat klien, buat kebijakan otorisasi yang memetakan atribut sertifikat klien ke tindakan yang diizinkan pada topik tertentu.

  1. Di portal Azure, navigasikan ke instans Operasi IoT Anda.

  2. Di bawah Komponen, pilih MQTT Broker.

  3. PilihtabOtorisasi.

  4. Pilih Buat kebijakan otorisasi.

  5. Untuk Nama kebijakan, masukkan abac-authz.

  6. Di bawah Aturan, masukkan aturan berikut:

    [
      {
        "principals": {
          "attributes": [
            {
              "group": "thermostat_group"
            }
          ]
        },
        "brokerResources": [
          {
            "method": "Connect"
          },
          {
            "method": "Publish",
            "topics": [
              "sensor/temperature"
            ]
          }
        ]
      },
      {
        "principals": {
          "attributes": [
            {
              "group": "hygrometer_group"
            }
          ]
        },
        "brokerResources": [
          {
            "method": "Connect"
          },
          {
            "method": "Publish",
            "topics": [
              "sensor/humidity"
            ]
          }
        ]
      },
      {
        "principals": {
          "attributes": [
            {
              "manufacturer": "fabrikam"
            }
          ]
        },
        "brokerResources": [
          {
            "method": "Connect"
          },
          {
            "method": "Publish",
            "topics": [
              "health/heartbeat"
            ]
          }
        ]
      },
      {
        "principals": {
          "usernames": [
            "heater"
          ]
        },
        "brokerResources": [
          {
            "method": "Connect"
          },
          {
            "method": "Subscribe",
            "topics": [
              "sensor/temperature",
              "sensor/humidity"
            ]
          }
        ]
      }
    ]
    
  7. Pilih Tambah untuk menyimpan perubahan.

Cuplikan layar memperlihatkan portal Azure untuk menyiapkan kebijakan otorisasi.

Kemudian, perbarui pendengar broker MQTT untuk menggunakan kebijakan otorisasi baru.

  1. Pilih tab Listener .
  2. Pilih pendengar mqtts-endpoint .
  3. Di bawah , pilih >
  4. Pilih Simpan.

Cuplikan layar memperlihatkan portal Azure untuk menautkan port ke kebijakan otorisasi.

Menerbitkan pesan ke topik terbatas

Di bagian ini, kami menguji kebijakan otorisasi yang baru diterapkan.

Pertama, sambungkan dengan thermostat dan coba terbitkan pada topik sensor/humidity:

mosquitto_pub -t "sensor/humidity" -m "example temperature measurement" -i thermostat \
-q 1 -V mqttv5 -d \
-h localhost \
--key thermostat.key \
--cert thermostat.crt \
--cafile contoso_root_ca.crt

Karena thermostat merupakan bagian thermostat_groupdari , yang tidak diizinkan untuk menerbitkan ke topik kelembaban, penerbitan gagal.

Client thermostat sending CONNECT
Client thermostat received CONNACK (0)
Client thermostat sending PUBLISH (d0, q1, r0, m1, 'sensor/humidity', ... (6 bytes))
Client thermostat received PUBACK (Mid: 1, RC:135)
Warning: Publish 1 failed: Not authorized.

Ubah untuk menerbitkan ke sensor/temperature, yang diizinkan dan penerbitan berhasil. Biarkan perintah berjalan.

mosquitto_pub -t "sensor/temperature" -m "example temperature measurement" -i thermostat \
-q 1 -V mqttv5 -d \
-h localhost \
--repeat 10000 \
--repeat-delay 3 \
--key thermostat.key \
--cert thermostat.crt \
--cafile contoso_root_ca.crt

Berlangganan pesan tentang topik terbatas

Dalam sesi terminal terpisah, sambungkan dengan heater untuk berlangganan health/heartbeat.

mosquitto_sub -q 1 -t "health/heartbeat" -d -V mqttv5 \
-i heater \
-h localhost \
--key heater.key \
--cert heater.crt \
--cafile contoso_root_ca.crt

Karena heater tidak berwenang untuk berlangganan topik heartbeat, langganan gagal. Di sini, kode 135 berarti tidak diotorisasi.

Client heater sending CONNECT
Client heater received CONNACK (0)
Client heater sending SUBSCRIBE (Mid: 1, Topic: health/heartbeat, QoS: 1, Options: 0x00)
Client heater received SUBACK
Subscribed (mid: 1): 135

Alihkan topik langganan ke sensor/temperature, yang thermostat masih mengirim pesan.

mosquitto_sub -q 1 -t "sensor/temperature" -d -V mqttv5 \
-i heater \
-h localhost \
--key heater.key \
--cert heater.crt \
--cafile contoso_root_ca.crt

Sekarang heater mulai menerima pesan karena diotorisasi dengan nama penggunanya.

Dalam sesi terminal terpisah lainnya , terbitkan pesan ke health/heartbeat dengan lightbulb:

mosquitto_pub -q 1 -t "health/heartbeat" -m "example heartbeat" -d -V mqttv5 \
-i lightbulb \
-h localhost \
--repeat 100 \
--repeat-delay 3 \
--key lightbulb.key \
--cert lightbulb.crt \
--cafile contoso_root_ca.crt

Penerbitan berhasil karena lightbulb memiliki sertifikat perantara dengan CN = Fabrikam Intermediate CA 1, yang dipetakan ke atribut manufacturer=fabrikam. Klien dengan atribut tersebut dapat menerbitkan di health/heartbeat. Ketika klien mulai mengirim pesan, heater dimulai sebelumnya tidak menerima apa pun.

Membersihkan sumber daya

Untuk membersihkan sumber daya yang dibuat dalam tutorial ini, hapus listener dan kebijakan autentikasi dan otorisasi.

  1. Di portal Azure, navigasikan ke instans Operasi IoT Anda.
  2. Di bawah Komponen, pilih MQTT Broker.
  3. Pilih tab Listener .
  4. Pilih kotak centang di samping pendengar mqtts-endpoint .
  5. Pilih Hapus.
  6. Konfirmasikan Penghapusan.
  7. Pilih tab Autentikasi .
  8. Pilih kotak centang di samping x509-auth.
  9. Pilih Hapus.
  10. Konfirmasikan Penghapusan.
  11. PilihtabOtorisasi.
  12. Pilih kotak centang di samping abac-authz.
  13. Pilih Hapus.
  14. Konfirmasikan Penghapusan.

Selain itu, hapus peta rahasia dan konfigurasi Kubernetes.

kubectl delete secret broker-server-cert -n azure-iot-operations
kubectl delete configmap fabrikam-ca -n azure-iot-operations

Terakhir, hapus sertifikat dan kunci yang dihasilkan sebelumnya.

rm contoso_root_ca.crt contoso_root_ca.key contoso_intermediate_ca.crt contoso_intermediate_ca.key mqtts-endpoint.crt mqtts-endpoint.key
rm fabrikam_root_ca.crt fabrikam_root_ca.key fabrikam_intermediate_ca.crt fabrikam_intermediate_ca.key thermostat.crt thermostat.key hygrometer.crt hygrometer.key heater.crt heater.key lightbulb.crt lightbulb.key