基於 PostgreSQL 的 EMQ X Auth & ACL

在閱讀本教程之前,假定你已經瞭解 MQTTMQTT 5 以及 EMQ X 的簡單知識。

emqx-auth-pgsql 它通過檢查每個終端接入的 usernamepassword 是否與用戶指定 的 PostgreSQL 數據庫中存儲的信息一致來實現對終端的訪問控制。其功能邏輯如下:

圖片描述

本文假設 PostgreSQL 已經安裝在您的機器上,並且您可以連接到 PostgreSQL 服務器。

插件配置項說明

配置項 說明
auth.pgsql.server 配置需要連接的 PostgreSQL Server 的 host 與 port,格式爲:host[:port],省略後面的 port 時表示使用默認的 5432 端口
auth.pgsql.username 用於登錄 PostgreSQL 的用戶名
auth.pgsql.password 用於登錄 PostgreSQL 的密碼
auth.pgsql.database 配置要訪問的數據庫
auth.pgsql.ssl 配置是否使用 SSL 連接數據庫,默認爲否
auth.pgsql.auth_query 配置從數據庫中查找用戶名對應密碼的 SQL 語句
auth.pgsql.password_hash 表示存儲在數據表中的 encrypted password 使用的加密算法和加鹽方式
auth.pgsql.super_query 驗證用戶是否爲超級用戶時使用的 SQL 語句 注:超級用戶可以發佈訂閱任何主題
auth.pgsql.acl_query ACL 檢查時使用的 SQL 語句

mqtt.sql

`emqx-auth-pgsql 提供了 mqtt.sql 文件幫助用戶快速建立數據庫環境,mqtt.sql 將在 auth.pgsql.database 指定的數據庫下創建 mqtt_usermqtt_acl 兩張表,併爲 mqtt_acl 添加以下默認規則:

mqtt=# select * from mqtt_acl;
 id | allow |  ipaddr   | username  | clientid | access | topic  
----+-------+-----------+-----------+----------+--------+--------
  1 |     1 |           | $all      |          |      2 | #
  2 |     0 |           | $all      |          |      1 | $SYS/#
  3 |     0 |           | $all      |          |      1 | eq #
  4 |     1 | 127.0.0.1 |           |          |      2 | $SYS/#
  5 |     1 | 127.0.0.1 |           |          |      2 | #
  6 |     1 |           | dashboard |          |      1 | $SYS/#
(6 rows)

以上規則含義可參考: [《基於 MySQL 的 EMQ X Auth & ACL》]()。

Auth 與 ACL 功能驗證

1.Mac 環境安裝 mosquitto

brew install mosquitto

2.導入 mqtt.sql 後,手動插入以下兩條數據

mqtt=# insert into mqtt_user (id, is_superuser, username, password, salt) values (1, false, 'test', 'password', 'salt');
mqtt=# insert into mqtt_acl (id, allow, ipaddr, username, clientid, access, topic) values (7, 0, NULL, 'test', NULL, 1, 'mytopic');

3.修改配置文件

禁止匿名訪問:

## .../etc/emqx.conf
allow_anonymous = false

配置數據庫中密碼的加密方式爲 plain,既不加密:

## .../etc/plugins/emqx_auth_pgsql.conf
auth.pgsql.password_hash = plain

配置要訪問的數據庫以及用戶名密碼:

## .../etc/plugins/emqx_auth_pgsql.conf
auth.pgsql.username = root
auth.pgsql.password = public
auth.pgsql.database = mqtt

4.啓動 EMQ X 與 emqx-auth-pgsql

$ ./_rel/emqx/bin/emqx start
emqx 3.1 is started successfully!
$ ./_rel/emqx/bin/emqx_ctl plugins load emqx_auth_pgsql

5.測試

a.使用正確的用戶名和密碼進行連接,並訂閱 "topic" 主題

$ mosquitto_sub -p 1883 -u test -P password -t 'topic' -d
Client mosqsub|4119-zhouzibode sending CONNECT
Client mosqsub|4119-zhouzibode received CONNACK
Client mosqsub|4119-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: topic, QoS: 0)
Client mosqsub|4119-zh
ouzibode received SUBACK
Subscribed (mid: 1): 0

現象:連接並訂閱成功

b.使用錯誤的用戶名或密碼進行連接,並訂閱 "topic" 主題

$ mosquitto_sub -p 1883 -u bad_user -P password -t 'topic' -d 
Client mosqsub|4363-zhouzibode sending CONNECT
Client mosqsub|4363-zhouzibode received CONNACK
Connection Refused: not authorised.

現象:連接被拒絕

c.使用正確的用戶名和密碼進行連接,並訂閱 "#" 主題

$ mosquitto_sub -p 1883 -u test -P password -t '#' -d
Client mosqsub|4392-zhouzibode sending CONNECT
Client mosqsub|4392-zhouzibode received CONNACK
Client mosqsub|4392-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: #, QoS: 0)
Client mosqsub|4392-zhouzibode received SUBACK
Subscribed (mid: 1): 128

現象:連接成功,訂閱失敗,原因碼128

d.使用正確的用戶名和密碼進行連接,並訂閱 "mytopic" 主題

$ mosquitto_sub -p 1883 -u test -P password -t 'mytopic' -d
Client mosqsub|4428-zhouzibode sending CONNECT
Client mosqsub|4428-zhouzibode received CONNACK
Client mosqsub|4428-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: mytopic, QoS: 0)
Client mosqsub|4428-zhouzibode received SUBACK
Subscribed (mid: 1): 128

現象:連接成功,訂閱失敗,原因碼128


更多信息請訪問我們的官網 emqx.io,或關注我們的開源項目 github.com/emqx/emqx ,詳細文檔請訪問 官方文檔
圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章