Bagikan melalui


Mengonfigurasi otorisasi broker MQTT

Penting

Halaman ini mencakup instruksi pengelolaan komponen Azure IoT Operations menggunakan manifes penyebaran Kubernetes, yang sedang dalam pratinjau. Fitur ini disediakan dengan beberapa batasan, dan tidak boleh digunakan untuk beban kerja produksi.

Lihat Ketentuan Penggunaan Tambahan untuk Pratinjau Microsoft Azure untuk persyaratan hukum yang berlaku untuk fitur Azure yang dalam versi beta, pratinjau, atau belum dirilis ke ketersediaan umum.

Kebijakan otorisasi menentukan tindakan apa yang dapat dilakukan klien pada broker, seperti menyambungkan, menerbitkan, atau berlangganan topik. Konfigurasikan broker MQTT untuk menggunakan satu atau beberapa kebijakan otorisasi dengan sumber daya BrokerAuthorization. Setiap sumber daya BrokerAuthorization berisi daftar aturan yang menentukan prinsipal dan sumber daya untuk kebijakan otorisasi.

Bagaimana aturan dievaluasi

  • Kebijakan hanya diizinkan. Jika tidak ada aturan yang secara eksplisit mengizinkan tindakan pada sumber daya untuk prinsipal, tindakan ditolak.
  • Aturan didefinisikan oleh tiga faktor: prinsipal (aktor), tindakan (Sambungkan/Terbitkan/Berlangganan atau operasi penyimpanan status), dan sumber daya (topik atau kunci).
  • Prinsipal dalam aturan dicocokkan dengan OR logis. Misalnya, kecocokan nama pengguna, clientId, atau atribut yang tercantum memberikan akses ke sumber daya dalam aturan.

Penggantian token dan kartubebas

  • Untuk topik dan kunci, Anda dapat menggunakan substitusi token untuk membangun aturan yang beradaptasi per klien: {principal.username}, , {principal.clientId}dan {principal.attributes.<attributeName>}.
  • Wildcard + topik MQTT dan # didukung di brokerResources.topics.
  • Saat menggunakan substitusi token dalam topik, token harus menjadi satu-satunya teks di segmen jalurnya. Misalnya, clients/{principal.clientId}/# valid, tetapi client-{principal.clientId}/# tidak.
  • Tindakan sambungkan tidak boleh menyertakan topik.

Untuk menautkan sumber daya BrokerListener ke sumber daya BrokerAuthorization, tentukan authorizationRef bidang dalam ports pengaturan sumber daya BrokerListener. Mirip dengan BrokerAuthentication, sumber daya BrokerAuthorization dapat ditautkan ke beberapa port BrokerListener. Kebijakan otorisasi berlaku untuk semua port pendengar yang ditautkan. Ada satu perbedaan utama dibandingkan dengan BrokerAuthentication:

Penting

Agar konfigurasi BrokerAuthorization berlaku untuk port listener, setidaknya satu sumber daya BrokerAuthentication juga harus ditautkan ke port pendengar tersebut.

Untuk mempelajari selengkapnya tentang BrokerListener, lihat Sumber daya BrokerListener.

Aturan Otorisasi

Untuk mengonfigurasi otorisasi, buat sumber daya BrokerAuthorization di kluster Kubernetes Anda. Bagian berikut memberikan contoh cara mengonfigurasi otorisasi untuk klien yang menggunakan nama pengguna, atribut, sertifikat X.509, dan token akun layanan Kubernetes (SAT). Untuk daftar pengaturan yang tersedia, lihat referensi API Otorisasi Broker .

Contoh berikut menunjukkan cara membuat sumber daya BrokerAuthorization dengan menggunakan nama pengguna dan atribut.

  1. Di portal Azure, buka instans Operasi IoT Anda.

  2. Di bawah Komponen, pilih MQTT Broker.

  3. Pilih tab Otorisasi .

  4. Pilih kebijakan autentikasi yang sudah ada atau buat yang baru dengan memilih Buat kebijakan otorisasi.

    Cuplikan layar yang memperlihatkan penggunaan portal Microsoft Azure untuk membuat aturan otorisasi broker.

Otorisasi broker ini memungkinkan klien dengan ID temperature-sensor klien atau , atau humidity-sensorklien dengan atribut organization, dengan nilai contoso dan city, dan dengan nilai seattle, untuk:

  • Sambungkan ke broker.
  • Publikasikan pesan ke topik yang dibatasi oleh ID klien dan organisasi mereka. Misalnya:
    • temperature-sensor dapat menerbitkan ke /sensor/temperature-sensor dan /sensor/contoso.
    • humidity-sensor dapat menerbitkan ke /sensor/humidity-sensor dan /sensor/contoso.
    • some-other-username dapat menerbitkan ke /sensor/contoso.
  • Berlangganan /commands/ topik yang dilingkup dengan organisasi mereka. Misalnya:
    • temperature-sensor dapat berlangganan ke /commands/contoso.
    • some-other-username dapat berlangganan ke /commands/contoso.

Menggunakan nama pengguna untuk otorisasi

Untuk menggunakan nama pengguna MQTT untuk otorisasi, tentukan sebagai array di bawah principals.usernames. Bergantung pada metode autentikasi, nama pengguna mungkin tidak diverifikasi:

  • Kubernetes SAT: Nama pengguna tidak boleh digunakan untuk otorisasi karena tidak diverifikasi untuk MQTTv5 dengan autentikasi yang ditingkatkan.
  • X.509: Nama pengguna cocok dengan nama umum (CN) dari sertifikat dan dapat digunakan untuk aturan otorisasi.
  • Kustom: Nama pengguna hanya boleh digunakan untuk aturan otorisasi jika autentikasi kustom memvalidasi nama pengguna.

Untuk mencegah masalah keamanan, gunakan nama pengguna MQTT untuk otorisasi broker hanya ketika dapat diverifikasi.

Petunjuk / Saran

Untuk mengharuskan nama pengguna MQTT cocok dengan ID klien, gunakan substitusi token:

principals:
  usernames:
    - "{principal.clientId}"

Membatasi akses lebih lanjut berdasarkan ID klien

principals Karena bidang adalah logis OR, Anda dapat membatasi akses lebih lanjut berdasarkan ID klien dengan menambahkan clientIds bidang ke brokerResources bidang . Misalnya, untuk memungkinkan klien dengan ID klien yang dimulai dengan nomor gedung mereka dapat terhubung dan menerbitkan ke topik dengan cakupan gedung mereka, gunakan konfigurasi berikut:

Dalam aturan otorisasi broker untuk kebijakan otorisasi Anda, gunakan konfigurasi berikut:

[
  {
    "brokerResources": [
      {
        "clientIds": [
          "{principal.attributes.building}*"
        ],
        "method": "Connect",
        "topics": []
      },
      {
        "clientIds": [],
        "method": "Publish",
        "topics": [
          "sensors/{principal.attributes.building}/{principal.clientId}/sensor"
        ]
      }
    ],
    "principals": {
      "attributes": [
        {
          "building": "building22"
        },
        {
          "building": "building23"
        }
      ]
    }
  }
]

Di sini, jika clientIds tidak diatur di bawah Connect metode , klien dengan ID klien apa pun dapat terhubung selama atribut diatur building ke building22 atau building23. Saat Anda menambahkan clientIds bidang, hanya klien dengan ID klien yang dimulai dengan building22 atau building23 dapat tersambung. Penunjukan ini memastikan bahwa klien memiliki atribut yang benar dan BAHWA ID klien cocok dengan pola yang diharapkan.

Mengotorisasi klien yang menggunakan autentikasi X.509

Anda dapat mengotorisasi klien yang menggunakan sertifikat X.509 untuk autentikasi untuk mengakses sumber daya berdasarkan atribut X.509 yang ada pada sertifikat mereka atau sertifikat penerbit mereka hingga ke tingkat atas dalam rantai.

Atribut file

Untuk membuat aturan berdasarkan properti dari sertifikat klien, CA akarnya, atau CA menengah, tentukan atribut X.509 di sumber daya BrokerAuthorization. Untuk informasi selengkapnya, lihat Atribut sertifikat.

Dengan nama umum subjek sertifikat klien sebagai nama pengguna

Untuk membuat kebijakan otorisasi berdasarkan CN subjek sertifikat klien saja, buat aturan berdasarkan CN.

Misalnya, jika klien memiliki sertifikat dengan subjek CN = smart-lock, nama penggunanya adalah smart-lock. Setelah itu, buat kebijakan otorisasi seperti biasa.

Mengotorisasi klien yang menggunakan token akun layanan Kubernetes

Atribut otorisasi untuk SAT ditetapkan sebagai bagian dari anotasi akun layanan. Misalnya, untuk menambahkan atribut otorisasi bernama group dengan nilai authz-sat, jalankan perintah :

kubectl annotate serviceaccount mqtt-client aio-broker-auth/group=authz-sat

Anotasi atribut harus dimulai dengan aio-broker-auth/ untuk membedakannya dari anotasi lain.

Karena aplikasi memiliki atribut otorisasi yang disebut authz-sat, tidak perlu memberikan clientId nilai atau username . Sumber daya BrokerAuthorization yang sesuai menggunakan atribut ini sebagai prinsipal, misalnya:

Dalam aturan otorisasi broker untuk kebijakan otorisasi Anda, gunakan konfigurasi berikut:

[
  {
    "brokerResources": [
      {
        "clientIds": [],
        "method": "Connect",
        "topics": []
      },
      {
        "clientIds": [],
        "method": "Publish",
        "topics": [
          "odd-numbered-orders"
        ]
      },
      {
        "clientIds": [],
        "method": "Subscribe",
        "topics": [
          "orders"
        ]
      }
    ],
    "principals": {
      "attributes": [
        {
          "group": "authz-sat"
        }
      ]
    }
  }
]

Untuk mempelajari selengkapnya dengan contoh, lihat Menyiapkan Kebijakan Otorisasi dengan Klien Dapr.

Penyimpanan status

Broker MQTT menyediakan penyimpanan status yang dapat digunakan klien untuk menyimpan status. Anda juga dapat mengonfigurasi penyimpanan status agar sangat tersedia.

Untuk menyiapkan otorisasi untuk klien yang menggunakan penyimpanan status, berikan izin untuk topik protokol dan kunci:

  • Terbitkan permintaan ke: statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke.
  • Berlangganan topik respons yang Anda tetapkan di publikasikan, umumnya: clients/{principal.clientId}/services/statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke/response/#.
  • Berikan akses stateStoreResources kunci sesuai panduan di bawah ini.

Kunci penyimpanan status

Penyimpanan status diakses melalui broker MQTT tentang topik statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke. Karena klien memiliki akses ke topik ini, Anda dapat menentukan kunci dan tingkat akses di bawah stateStoreResources bagian konfigurasi broker brokerResources MQTT.

stateStoreResources Format bagian terdiri dari tingkat akses, indikator pola, dan pola.

Sertakan bagian stateStoreResources dalam aturan untuk kebijakan otorisasi Anda.

"stateStoreResources": [
  {
    "method": "", // Values: read, write, readwrite 
    "keyType": "", //Values: string, pattern, binary. Default is pattern
    "keys": [
      // List of patterns to match
    ]
  },
]

Bidang method menentukan tingkat akses:

  • Akses baca ditentukan dengan read. Akses tulis ditentukan dengan write. Akses baca dan tulis ditentukan dengan readwrite.
  • Tingkat akses diperlukan.
  • Tingkat akses baca menyiratkan tindakan get dan keynotify.
  • Tingkat akses tulis menyiratkan tindakan set, , deldan vdel.

Bidang keyType menentukan jenis pencocokan kunci:

  • pattern: Digunakan untuk pencocokan pola gaya glob.
  • string: Digunakan untuk melakukan kecocokan persis, misalnya, ketika kunci berisi karakter yang mungkin dicocokkan sebagai pola (*, ?, [0-9]).
  • binary: Digunakan untuk mencocokkan kunci biner.

Bidang keys menentukan kunci yang cocok. Anda dapat menentukan kunci sebagai pola gaya glob, substitusi token, atau string yang tepat.

  • Contoh gaya glob:

    • colors/*: Semua kunci di bawah awalan "warna/"
    • number[0-9]: Kunci apa pun dari "number0" hingga "number9"
    • char?: Kunci apa pun dengan awalan "char" dan akhiran satu digit, seperti "charA"
    • *: Akses penuh ke semua kunci
  • Kunci penyimpanan status juga mendukung penggantian token ketika jenis kunci adalah pattern dan kurung kurawal dicadangkan untuk tujuan ini. Contoh penggantian token:

    • clients/{principal.clientId}/*
    • usernames/{principal.username}/*
    • rooms/{principal.attributes.room}/*

Berikut adalah contoh bagaimana Anda dapat menulis sumber daya penyimpanan status Anda.

Dalam aturan otorisasi broker untuk kebijakan otorisasi Anda, tambahkan konfigurasi serupa:

[
  {
    "brokerResources": [
      {
        "clientIds": [
          "{principal.attributes.building}*"
        ],
        "method": "Connect"
      },
      {
        "method": "Publish",
        "topics": [
          "sensors/{principal.attributes.building}/{principal.clientId}/sensor/*"
        ]
      },
      {
        "method": "Subscribe",
        "topics": [
          "commands/{principal.attributes.organization}"
        ]
      }
    ],
    "principals": {
      "attributes": [
        {
          "building": "17",
          "organization": "contoso"
        }
      ],
      "usernames": [
        "temperature-sensor",
        "humidity-sensor"
      ]
    },
    "stateStoreResources": [
      {
        "method": "Read",
        "keyType": "Pattern",
        "keys": [
          "myreadkey",
          "myotherkey?",
          "mynumerickeysuffix[0-9]",
          "clients/{principal.clientId}/*"
        ]
      },
      {
        "method": "ReadWrite",
        "keyType": "Binary",
        "keys": [
          "xxxxxxxxxxxxxxxxxxxx"
        ]
      }
    ]
  }
]

Memperbarui otorisasi

Anda dapat memperbarui sumber daya otorisasi broker saat runtime tanpa menghidupkan ulang. Semua klien yang terhubung pada saat pembaruan kebijakan terputus. Mengubah jenis kebijakan juga didukung.

kubectl edit brokerauthorization my-authz-policies

Perilaku penembolokan

Untuk mengurangi overhead otorisasi pada topik throughput tinggi, aktifkan penembolokan dalam memori dengan authorizationPolicies.cache: Enabled.

  • Keputusan di-cache per tuple klien, tindakan, dan sumber daya. Operasi berulang mencapai cache.
  • Sumber daya yang sangat bervariasi (misalnya, segmen topik unik per pesan) tingkat hit cache yang lebih rendah.
  • Cache tumbuh dengan jumlah tuple unik. Pantau memori untuk pola churn yang sangat tinggi.

Menonaktifkan otorisasi

  1. Di portal Azure, buka instans Operasi IoT Anda.
  2. Di bawah Komponen, pilih MQTT Broker.
  3. Pilih pendengar broker yang ingin Anda edit dari daftar.
  4. Pada port tempat Anda ingin menonaktifkan otorisasi, pilih Tidak Ada di menu dropdown otorisasi.

Publikasi tidak sah di MQTT 3.1.1

Dengan MQTT 3.1.1, ketika penerbitan ditolak, klien menerima PUBACK tanpa kesalahan karena versi protokol tidak mendukung pengembalian kode kesalahan. MQTTv5 mengembalikan PUBACK dengan kode alasan 135 (Tidak diotorisasi) saat penerbitan ditolak.

Troubleshooting

Memvalidasi aturan

  1. Tinjau BrokerAuthorization YAML/JSON Anda untuk masalah skema.
  2. Periksa output saat menerapkan konfigurasi; kesalahan skema dilaporkan oleh server API.
  3. Atur log pod frontend ke debug atau trace, hidupkan ulang pod, dan periksa entri yang ditandai dengan authz yang menunjukkan aturan yang diurai dan efektif.

Contoh log sehat (abridged):

<7>2025-02-10T16:28:31.986Z aio-broker-frontend-0 [mq@311 tid="1" module="authz"] - adding broker config ... and store config ...
<6>2025-02-10T16:28:31.986Z aio-broker-frontend-0 [mq@311 tid="1"] - starting broker authorization engine with basic rules. Cache enabled: true
<7>2025-02-10T16:28:31.987Z aio-broker-frontend-0 [mq@311 tid="1" module="authz"] - set broker authorization engine data: {"rules":[{...}]}

Operasi broker MQTT

Contoh publikasi yang ditolak:

<7>2025-02-10T16:32:19.398Z aio-broker-frontend-0 [mq@311 tid="15" module="authz"] - checking authorization for {"action":"publish","clientId":"test-publisher","topic":"test"}
<7>2025-02-10T16:32:19.411Z aio-broker-frontend-0 [mq@311 tid="15" module="authz"] - publish from client 'test-publisher' was denied ... reason_code: NotAuthorized

Operasi penyimpanan status

Ditolak mendapatkan contoh:

<7>2025-02-10T16:41:31.314Z aio-broker-frontend-0 [mq@311 tid="8" module="authz"] - checking authorization for {"action":"get","clientId":"statestore-cli","key":"dGVzdA=="}
<7>2025-02-10T16:41:31.322Z aio-broker-frontend-0 [mq@311 tid="8" module="authz"] - cached new authorization result ...: Denied("no rule matched")

Langkah selanjutnya