設定 MQTT 代理授權
重要
已啟用 Azure Arc 的 Azure IoT 操作預覽版目前為預覽狀態。 請勿在生產環境使用此預覽版軟體。
當正式推出的版本可使用時,您必須部署新的 Azure IoT 操作安裝。 您將無法升級預覽安裝。
請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。
授權原則會決定用戶端可以在訊息代理程式上執行的動作,例如連線、發佈或訂閱主題。 設定 MQTT 代理以使用一或多個授權原則搭配 BrokerAuthorization 資源。 每個 BrokerAuthorization 資源都包含一份規則清單,這些規則會指定授權原則的主體和資源。
將 BrokerAuthorization 連結至 BrokerListener
若要將 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-sensor
或 humidity-sensor
的用戶端,或屬性 organization
的值為 contoso
和 city
的值為 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
設定 ,只要用戶端標識元設定為 building22
或 building23
屬性,任何用戶端標識符的用戶端就可以連線building
。 藉由新增 clientIds
欄位,只有具有開頭 building22
或 building23
可以連線之用戶端標識碼的用戶端。 這可確保客戶端不僅具有正確的屬性,還能確保用戶端標識元符合預期的模式。
授權使用 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
的授權屬性,因此不需要提供 clientId
或 username
。 對應的 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。