MQTT 5.0 強化認証 - Kerberos
Kerberosは、「チケット」を使用してノード同士が非安全なネットワーク上で安全に自身の身元を証明できるネットワーク認証プロトコルです。秘密鍵暗号方式を用いてクライアント/サーバーアプリケーションに対して強力な認証を提供するよう設計されています。
EMQXはRFC 4422のSASL/GSSAPIメカニズムに従い、Kerberos認証を統合しています。Generic Security Services Application Program Interface(GSSAPI)はKerberosプロトコルの詳細を抽象化した標準化されたAPIを提供し、MQTTクライアントとサーバー間でKerberos認証の詳細をアプリケーションが管理することなく安全な通信を可能にします。
本ページでは、EMQXでのKerberos認証機能の設定方法を紹介します。
TIP
MQTTの強化認証はプロトコルバージョン5以降でのみサポートされています。
メカニズムのネゴシエーションがないため、クライアントは認証メカニズムとして明示的に GSSAPI-KERBEROS を指定する必要があります。
設定の前提条件
EMQXでKerberos認証を設定する前に、必須ライブラリのインストールやKerberosシステムの適切なセットアップなど、環境が要件を満たしていることを確認してください。
Kerberosライブラリのインストール
Kerberos認証機能を設定する前に、EMQXノードにMIT Kerberosライブラリをインストールする必要があります。
Debian/Ubuntuの場合、必要なパッケージは
libsasl2-2とlibsasl2-modules-gssapi-mitです。Redhatの場合、必要なパッケージは
krb5-libsとcyrus-sasl-gssapiです。
Kerberosライブラリの設定
Kerberosライブラリの設定ファイルは /etc/krb5.conf です。このファイルにはKerberosライブラリの設定情報が含まれており、レルムやKey Distribution Center(KDC)に関する情報が記述されています。Kerberosライブラリはこのファイルを参照してKDCやレルムを特定します。
以下は krb5.conf ファイルの例です。
[libdefaults]
default_realm = EXAMPLE.COM
default_keytab_name = /var/lib/emqx/emqx.keytab
[realms]
EXAMPLE.COM = {
kdc = kdc.example.com
admin_server = kdc.example.com
}Keytabファイル
Kerberos認証機能を設定するには、稼働中のKDC(Key Distribution Center)サーバーと、サーバーおよびクライアント双方の有効なkeytabファイルが必要です。keytabファイルはサーバープリンシパルに関連付けられた暗号鍵を保存し、サーバーがパスワードを手動入力することなくKerberos KDCに認証できるようにします。
EMQXはデフォルトの場所にあるkeytabファイルのみをサポートしています。システムのデフォルト値は環境変数 KRB5_KTNAME を使うか、/etc/krb5.conf の default_keytab_name を設定することで変更可能です。
注意
keytabファイルはEMQXノード上に配置し、EMQXサービスを実行するユーザーがファイルの読み取り権限を持っている必要があります。
ダッシュボードからの設定
EMQXダッシュボードの左メニューから アクセス制御 -> 認証 に移動し、認証ページを開きます。
右上の 作成 をクリックし、メカニズムに GSSAPI、バックエンドに Kerberos を選択します。
次へ をクリックして 設定 ステップに進みます。
以下の項目を設定します。
プリンシパル:Kerberos認証システム内でサーバーの身元を定義するためのサーバープリンシパルを設定します。例:
mqtt/cluster1.example.com@EXAMPLE.COM。注意:使用するレルムはEMQXノードの
/etc/krb5.confに設定されている必要があります。前提条件:Variform式で、Kerberos認証機能をクライアント接続に適用するかどうかを制御します。この式はクライアントの属性(
username、clientid、listenerなど)に対して評価され、結果が文字列"true"の場合のみ認証機能が呼び出されます。そうでなければスキップされます。前提条件の詳細は認証の前提条件を参照してください。
作成 をクリックして設定を完了します。
設定ファイルによる設定例
{
mechanism = gssapi
backend = kerberos
principal = "mqtt/cluster1.example.com@EXAMPLE.COM"
}principal はサーバープリンシパルであり、システムのデフォルトkeytabファイルに存在している必要があります。
認証フロー
以下の図は認証プロセスの流れを示しています。
よくある問題とトラブルシューティング
EMQXでKerberos認証を設定する際によく遭遇する問題の解決ガイドです。
Keytab contains no suitable keys for mqtt/cluster1.example.com@EXAMPLE.COM
原因: keytabファイルに指定したプリンシパルの必要な鍵が含まれていません。
対処法:
デフォルトのkeytabファイルが正しく設定されているか確認してください。
klist -kコマンドでkeytabファイルを検査します。例:klist -kte /etc/krb5.keytab。EMQXは現在デフォルトの場所にあるkeytabファイルのみをサポートしています。このエラーが発生した場合、エラーメッセージに現在のデフォルトkeytabファイルのパスが表示されます。
環境変数
KRB5_KTNAMEを使うか、/etc/krb5.confのdefault_keytab_nameを設定してシステムのデフォルトkeytabファイルパスを指定してください。
invalid_server_principal_string
原因: Kerberosプリンシパル文字列の形式が誤っています。
対処法: Kerberosプリンシパル文字列が正しい形式 service/SERVER-FQDN@REALM.NAME になっているか確認してください。
Cannot find KDC for realm "EXAMPLE.COM"
原因: 指定されたKerberosレルム(EXAMPLE.COM)が /etc/krb5.conf の realms セクションに記載されていません。
対処法: /etc/krb5.conf の realms セクションに該当レルムの情報を追加してください。
Cannot contact any KDC for realm "EXAMPLE.COM"
原因: 指定されたレルムのKDCサービスが起動していないか、到達できません。
対処法: KDCサービスが稼働中でアクセス可能か確認し、ネットワーク接続やKDCサーバーの設定を見直してください。
Resource temporarily unavailable
原因: /etc/krb5.conf に設定されたKDCサービスが起動していないか、到達できません。
対処法: KDCサービスが正常に稼働しており、EMQXノードから通信可能であることを確認してください。
Preauthentication failed
原因: サーバーチケットが無効である可能性があり、keytabファイルが古い可能性があります。
対処法: keytabファイルが最新で正しい認証情報を含んでいるか確認してください。