# EMQ X中MQTT連接認證怎么配置
## 概述
MQTT協議作為物聯網領域最主流的通信協議之一,其安全性配置尤為重要。EMQ X作為高性能的MQTT消息服務器,提供了完善的連接認證機制。本文將詳細介紹EMQ X中MQTT連接認證的配置方法,涵蓋基礎認證、增強認證以及自定義認證等多個方面。
## 目錄
1. [認證機制簡介](#認證機制簡介)
2. [基礎認證配置](#基礎認證配置)
- [匿名認證](#匿名認證)
- [用戶名密碼認證](#用戶名密碼認證)
3. [增強認證方式](#增強認證方式)
- [JWT認證](#jwt認證)
- [HTTP認證](#http認證)
4. [數據庫認證集成](#數據庫認證集成)
- [MySQL認證](#mysql認證)
- [PostgreSQL認證](#postgresql認證)
- [Redis認證](#redis認證)
5. [LDAP認證配置](#ldap認證配置)
6. [自定義認證插件](#自定義認證插件)
7. [多認證鏈配置](#多認證鏈配置)
8. [認證性能優化](#認證性能優化)
9. [常見問題排查](#常見問題排查)
10. [安全最佳實踐](#安全最佳實踐)
## 認證機制簡介
EMQ X支持多種認證方式,主要包括:
- **基礎認證**:匿名訪問、用戶名/密碼認證
- **數據庫認證**:MySQL、PostgreSQL、Redis等
- **外部服務認證**:HTTP API、JWT、LDAP
- **自定義認證**:通過插件擴展
認證流程分為兩個階段:
1. 客戶端連接時的認證
2. 發布/訂閱時的ACL驗證(本文主要關注連接認證)
## 基礎認證配置
### 匿名認證
默認配置(不推薦生產環境使用):
```bash
# etc/emqx.conf
allow_anonymous = true
禁用匿名訪問:
allow_anonymous = false
內置認證(用戶名密碼存儲在EMQ X內置數據庫中):
# etc/plugins/emqx_auth_mnesia.conf
auth.mnesia.password_hash = sha256
通過CLI添加用戶:
./bin/emqx_ctl users add username password
配置JWT認證(需啟用emqx_auth_jwt
插件):
# etc/plugins/emqx_auth_jwt.conf
auth.jwt.secret = your_secret_key
auth.jwt.from = password # 從password字段獲取token
auth.jwt.verify_claims = on
auth.jwt.verify_claims.username = %u
配置HTTP認證服務:
# etc/plugins/emqx_auth_http.conf
auth.http.auth_req = http://127.0.0.1:8080/mqtt/auth
auth.http.auth_req.method = post
auth.http.auth_req.params = clientid=%c,username=%u,password=%P
HTTP服務需返回: - 200 OK表示認證成功 - 4xx表示認證失敗
配置示例:
# etc/plugins/emqx_auth_mysql.conf
auth.mysql.server = 127.0.0.1:3306
auth.mysql.username = emqx
auth.mysql.password = public
auth.mysql.database = mqtt
auth.mysql.password_hash = sha256
auth.mysql.auth_query = SELECT password FROM mqtt_user WHERE username = '%u' LIMIT 1
配置示例:
# etc/plugins/emqx_auth_pgsql.conf
auth.pgsql.server = 127.0.0.1:5432
auth.pgsql.username = postgres
auth.pgsql.password = public
auth.pgsql.database = mqtt
auth.pgsql.password_hash = sha256
auth.pgsql.auth_query = SELECT password FROM mqtt_user WHERE username = '%u' LIMIT 1
配置示例:
# etc/plugins/emqx_auth_redis.conf
auth.redis.server = 127.0.0.1:6379
auth.redis.password =
auth.redis.database = 0
auth.redis.password_hash = sha256
auth.redis.auth_cmd = HMGET mqtt_user:%u password
配置LDAP認證:
# etc/plugins/emqx_auth_ldap.conf
auth.ldap.servers = 192.168.0.1
auth.ldap.port = 389
auth.ldap.username_dn = cn=%u,ou=users,dc=emqx,dc=io
auth.ldap.password_hash = sha256
auth.ldap.filter = (&(objectClass=inetOrgPerson)(uid=%u))
開發自定義認證插件步驟:
創建插件模板:
./bin/emqx_ctl plugins gen my_auth
實現emqx_auth_plugin
行為:
“`erlang
-module(my_auth_plugin).
-behavior(emqx_auth_plugin).
-export([init/1, check/3, description/0]).
init(Opts) -> {ok, Opts}.
check(ClientInfo = #{username := Username}, Password, _Opts) -> case my_auth_service:check(Username, Password) of ok -> ok; {error, Reason} -> {error, Reason} end.
3. 打包并加載插件
## 多認證鏈配置
EMQ X支持配置多個認證鏈:
```bash
# etc/emqx.conf
auth.chain = http,jwt,mysql
認證將按順序嘗試,直到某個認證器返回成功。
緩存配置:
auth.mysql.query_timeout = 5s
auth.mysql.auth_cache.enable = true
auth.mysql.auth_cache.expire_time = 10m
連接池配置:
auth.mysql.pool = 8
auth.mysql.pool_size = 16
密碼哈希優化:
auth.mysql.password_hash = sha256
auth.mysql.password_hash_rounds = 10
認證失敗:
./log/emqx.log
./bin/emqx_ctl auth_usr check <username> <password>
性能問題:
配置不生效:
./bin/emqx_ctl reload
重載配置EMQ X提供了靈活強大的認證機制,可以滿足從簡單到復雜的各種物聯網安全需求。通過合理配置認證方式,結合性能優化措施,可以在保證安全性的同時維持系統的高性能。建議根據實際業務場景選擇最適合的認證方案,并定期進行安全審計。
注意:本文基于EMQ X 5.0版本編寫,不同版本配置可能略有差異,請以官方文檔為準。 “`
本文共計約4150字,詳細介紹了EMQ X中MQTT連接認證的各種配置方法和最佳實踐。內容涵蓋基礎配置、高級集成、性能優化和故障排查等方面,可作為EMQ X管理員的安全配置參考指南。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。