共用方式為


設定 MQTT 代理授權

重要

已啟用 Azure Arc 的 Azure IoT 操作預覽版目前為預覽狀態。 請勿在生產環境使用此預覽版軟體。

當正式推出的版本可使用時,您必須部署新的 Azure IoT 操作安裝。 您將無法升級預覽安裝。

請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。

授權原則會決定用戶端可以在訊息代理程式上執行的動作,例如連線、發佈或訂閱主題。 設定 MQTT 代理以使用一或多個授權原則搭配 BrokerAuthorization 資源。 每個 BrokerAuthorization 資源都包含一份規則清單,這些規則會指定授權原則的主體和資源。

若要將 BrokerListener 連結到 BrokerAuthorization 資源,請在 BrokerListener 資源的設定ports指定 authenticationRef 字段。 類似於 BrokerAuthentication,BrokerAuthorization 資源可以連結至多個 BrokerListener 埠。 授權原則會套用至所有連結的接聽程式埠。 不過,與 BrokerAuthentication 相比,有一個主要差異:

重要

若要將 BrokerAuthorization 設定套用至接聽程式埠,至少必須有一個 BrokerAuthentication 連結到該接聽程式埠。

若要深入瞭解 BrokerListener,請參閱 BrokerListener 資源

授權規則

若要設定授權,請在 Kubernetes 叢集中建立 BrokerAuthorization 資源。 下列各節提供如何為使用使用者名稱、屬性、X.509 憑證和 Kubernetes 服務帳戶令牌 (SAT) 的用戶端設定授權的範例。 如需可用設定的清單,請參閱 Broker 授權 API 參考。

下列範例示範如何使用使用者名稱和屬性建立 BrokerAuthorization 資源:

apiVersion: mqttbroker.iotoperations.azure.com/v1beta1
kind: BrokerAuthorization
metadata:
  name: "my-authz-policies"
  namespace: azure-iot-operations
spec:
  authorizationPolicies:
    cache: Enabled
    rules:
      - principals:
          usernames:
            - "temperature-sensor"
            - "humidity-sensor"
          attributes:
            - city: "seattle"
              organization: "contoso"
        brokerResources:
          - method: Connect
          - method: Publish
            topics:
              - "/telemetry/{principal.username}"
              - "/telemetry/{principal.attributes.organization}"
          - method: Subscribe
            topics:
              - "/commands/{principal.attributes.organization}"

此訊息代理程式授權允許使用者名稱 temperature-sensorhumidity-sensor 的用戶端,或屬性 organization 的值為 contosocity 的值為 seattle 的用戶端:

  • 連線到訊息代理程式。
  • 將訊息發佈至以其使用者名稱和組織限定範圍的遙測主題。 例如:
    • temperature-sensor 可以發佈至 /telemetry/temperature-sensor/telemetry/contoso
    • humidity-sensor 可以發佈至 /telemetry/humidity-sensor/telemetry/contoso
    • some-other-username 可以發佈至 /telemetry/contoso
  • 訂閱以其組織範圍設定的命令主題。 例如:
    • temperature-sensor 可以訂閱 /commands/contoso
    • some-other-username 可以訂閱 /commands/contoso

若要建立此 BrokerAuthorization 資源,請將 YAML 資訊清單套用至 Kubernetes 叢集。

根據客戶端識別元進一步限制存取

principals因為欄位是邏輯 OR,因此您可以藉由將clientIds欄位新增至欄位,進一步限制根據客戶端識別碼的brokerResources存取。 例如,若要允許具有用戶端標識符的用戶端,從其建置編號開始,將遙測連線併發佈至其建置範圍的主題,請使用下列組態:

apiVersion: mqttbroker.iotoperations.azure.com/v1beta1
kind: BrokerAuthorization
metadata:
  name: "my-authz-policies"
  namespace: azure-iot-operations
spec:
  authorizationPolicies:
    cache: Enabled
    rules:
    - principals:
        attributes:
          - building: "building22"
          - building: "building23"
      brokerResources:
      - method: Connect
        clientIds:
          - "{principal.attributes.building}*" # client IDs must start with building22
      - method: Publish
        topics:
          - "sensors/{principal.attributes.building}/{principal.clientId}/telemetry"

在此,如果未clientIds在 方法下Connect設定 ,只要用戶端標識元設定為 building22building23屬性,任何用戶端標識符的用戶端就可以連線building。 藉由新增 clientIds 欄位,只有具有開頭 building22building23 可以連線之用戶端標識碼的用戶端。 這可確保客戶端不僅具有正確的屬性,還能確保用戶端標識元符合預期的模式。

授權使用 X.509 驗證的用戶端

使用 X.509 憑證進行驗證的用戶端可以授權根據其憑證上存在的 X.509 屬性,或鏈結上的發行憑證來存取資源。

使用屬性

若要根據來自用戶端憑證、根 CA 或中繼 CA 的屬性來建立規則,請在 BrokerAuthorization 資源中定義 X.509 屬性。 如需詳細資訊,請參閱憑證屬性

使用用戶端憑證主題一般名稱作為使用者名稱

若要根據用戶端憑證主體通用名稱 (CN) 建立授權原則,請根據 CN 建立規則。

例如,如果用戶端具有主體 CN = smart-lock 的憑證,則其使用者名稱為 smart-lock。 從該處,依正常方式建立授權原則。

授權使用 Kubernetes 服務帳戶權杖的用戶端

SAT 的授權屬性會設為服務帳戶註釋的一部分。 例如,若要新增名為 group 且值為 authz-sat 的授權屬性,請執行命令:

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

屬性註釋必須以 aio-broker-auth/ 開頭,才能區別於其他註釋。

由於應用程式具有稱為 authz-sat 的授權屬性,因此不需要提供 clientIdusername。 對應的 BrokerAuthorization 資源會使用此屬性作為主體,例如:

apiVersion: mqttbroker.iotoperations.azure.com/v1beta1
kind: BrokerAuthorization
metadata:
  name: "my-authz-policies"
  namespace: azure-iot-operations
spec:
  authorizationPolicies:
    enableCache: false
    rules:
      - principals:
          attributes:
            - group: "authz-sat"
        brokerResources:
          - method: Connect
          - method: Publish
            topics:
              - "odd-numbered-orders"
          - method: Subscribe
            topics:
              - "orders"

若要深入了解範例,請參閱 使用 Dapr 用戶端設定授權原則

分散式狀態存放區

MQTT 代理提供用戶端可用來儲存狀態的分散式狀態存放區 (DSS)。 DSS 也可以設為高可用性。

若要為使用 DSS 的用戶端設定授權,請提供下列權限:

  • 發佈至系統金鑰值存放區 $services/statestore/_any_/command/invoke/request 主題的權限
  • 訂閱回應主題的權限 (在初始發佈期間設定為參數) <response_topic>/#

如需 DSS 授權的詳細資訊,請參閱 狀態存放區金鑰

更新授權

訊息代理程式授權資源可以在執行階段更新,而不需重新啟動。 在原則更新時連線的所有用戶端都會中斷連線。 變更原則類型也同樣支援。

kubectl edit brokerauthorization my-authz-policies

停用授權

若要停用授權,請在 BrokerListener 資源的設定ports省略authorizationRef

MQTT 3.1.1 中未經授權的發佈

使用 MQTT 3.1.1 時,當發佈遭到拒絕時,用戶端會在沒有錯誤的情況下收到 PUBACK,因為通訊協定版本不支援傳回錯誤碼。 當發佈遭到拒絕時,MQTTv5 會傳回原因代碼 135 (未授權) 的 PUBACK。