Redis 認証
パスワード認証の一つの方法として、EMQX Cloud は Redis と連携したパスワード認証をサポートしています。EMQX は Single Node、Redis Sentinel、Redis Cluster の3つの Redis デプロイモードをサポートしています。本節では関連する設定方法を紹介します。
注意事項
Redis 認証は EMQX Serverless のデプロイメントではサポートされていません。
データ構造とクエリコマンド
Redis 認証機能は Redis ハッシュを用いて認証データを保存することをサポートしています。ユーザーはクエリコマンドのテンプレートを提供する必要があり、クエリ結果には以下のフィールドを含める必要があります。
password_hash:必須。データベース内の平文またはハッシュ化されたパスワードのフィールド。salt:任意。空または存在しない場合はソルトなし(salt = "")として扱われます。is_superuser:任意。現在のクライアントがスーパーユーザーかどうかを示します。デフォルトはfalseです。trueに設定すると、そのユーザー名を使用するクライアントは認可制約を受けません。スーパーユーザーの設定は推奨されません。
例えば、ユーザー名 emqx_u、パスワード public、ソルト slat_foo123、sha256 でハッシュ化し、スーパーユーザーフラグを false に設定する場合は以下のようになります。
>redis-cli
127.0.0.1:6379> HSET mqtt_user:emqx_u is_superuser 1 salt slat_foo123 password_hash 44edc2d57cde8d79c98145003e105b90a14f1460b79186ea9cfe83942fc5abb5
(integer) 0対応する設定パラメータは以下の通りです。
- パスワード暗号化方式:
sha256 - ソルトモード:
suffix - クエリコマンド:
HMGET mqtt_user:${username} password_hash salt is_superuser
暗号化ルール
EMQX Cloud の多くの外部認証ではハッシュ化方式を有効にでき、パスワードの暗号文のみをデータソースに保存することでデータの安全性を確保します。ハッシュ化方式を有効にすると、ユーザーは各クライアントに対してソルトを指定し、ソルト付けルールを設定できます。データベース内のパスワードはソルト付けルールとハッシュ化方式に従って処理された暗号文となります。
参考:ソルト付けルールとハッシュ化方式
bashCopy code
## ソルトなし、平文
plain
## ソルトなし、ハッシュ化のみ
sha256
## ソルトを接頭辞として付加:salt + password の文字列を sha256 で暗号化
salt,sha256
## ソルトを接尾辞として付加:password + salt の文字列を sha256 で暗号化
sha256,salt
## pbkdf2 with macfun iterations dklen
## macfun: md4, md5, ripemd160, sha, sha224, sha256, sha384, sha512
pbkdf2, sha256, 1000, 20Redis 認証の設定
デプロイメント画面で Access Control - Extended Authentication をクリックし、Redis Authentication を選択して Configure をクリックします。
Redis Mode:Redis データベースのデプロイモードを選択します。選択肢は
Single、Sentinel、Clusterです。Server:Redis サーバーのアドレス(host:port)を入力します。デプロイモードが Sentinel または Cluster の場合は、関連するすべての Redis サーバーのアドレスをカンマ区切りで host1:port1,host2:port2,... の形式で指定する必要があります。
TIP
- 現在のデプロイメントが Dedicated Flex エディションの場合は、VPC ピアリング接続を作成し、サーバーアドレスには内部ネットワークアドレスを使用してください。
- 現在のデプロイメントが BYOC エディションの場合は、パブリッククラウドコンソールで VPC ピアリング接続を作成してください。詳細は VPC ピアリング接続の作成 を参照し、サーバーアドレスには内部ネットワークアドレスを使用してください。
- 「Init resource failure!」というメッセージが表示された場合は、サーバーアドレスの正確性とセキュリティグループの開放状況を確認してください。
Sentinel Name:デプロイモードが
Sentinelの場合のみ必要です。Redis Sentinel の設定に必要なマスターサーバー名を指定します。Database:Redis データベースのインデックスを整数で指定します。
Username:接続に使用する Redis のユーザー名を指定します。このフィールドは Redis インスタンスが Redis ACL(Redis 6.0 以降)を認証に使用している場合に必須です。Redis サーバーがデフォルトユーザー(ACL 無効または未適用)を使用している場合は空欄のままで構いません。
Password(任意):認証用パスワードを入力します。
Enable TLS:TLS を有効にするかどうかを設定します。
Connection Pool size(任意):EMQX ノードから Redis データベースへの同時接続数を整数で指定します。デフォルト値は
8です。Password Hash:パスワード保存に使用するハッシュアルゴリズムを選択します。例:plain、md5、sha、bcrypt、pbkdf2 など。
plain、md5、sha、sha256、sha512を選択した場合は以下の設定も必要です。- Salting Position:ソルトとパスワードの結合方法を指定します。通常は変更不要ですが、外部ストレージから EMQX 内蔵データベースへアクセス認証情報を移行する場合に設定します。選択肢は suffix(パスワードの後ろにソルトを付加)、prefix(パスワードの前にソルトを付加)、disable(無効)です。なお、
plainを選択した場合はソルト付け方法を disable に設定してください。
- Salting Position:ソルトとパスワードの結合方法を指定します。通常は変更不要ですが、外部ストレージから EMQX 内蔵データベースへアクセス認証情報を移行する場合に設定します。選択肢は suffix(パスワードの後ろにソルトを付加)、prefix(パスワードの前にソルトを付加)、disable(無効)です。なお、
pbkdf2アルゴリズムを選択した場合は以下の設定も必要です。- Pseudorandom function:鍵生成に使用するハッシュ関数を指定します。例:
sha256など。 - Iteration Count:ハッシュ化の繰り返し回数を指定します。デフォルト値は
4096です。 - Derived key length(任意):生成される鍵の長さを指定します。指定しない場合は擬似乱数関数によって決定されます。
- Pseudorandom function:鍵生成に使用するハッシュ関数を指定します。例:
Precondition(任意):1~256 文字の Variform 式を入力し、EMQX がこの認証機能をクライアントに対して呼び出すかどうかを制御します。式が文字列
'true'に評価される場合のみ認証機能が呼び出され、それ以外はスキップされます。このフィールドは EMQX 6.1 以降のデプロイメントで利用可能です。対応するクライアント属性や例は Authenticator Preconditions を参照してください。CMD:Redis クエリコマンド。コマンド内で以下のプレースホルダーを使用できます。
${clientid}:実行時にクライアントIDに置換されます。クライアントIDは通常、クライアントが CONNECT パケットで明示的に指定します。${username}:実行時にユーザー名に置換されます。ユーザー名は CONNECT パケットの Username フィールドから取得されます。${password}:実行時にパスワードに置換されます。パスワードは CONNECT パケットの Password フィールドから取得されます。${client_attrs.<attribute>}:クライアント属性。<attribute>は事前定義された設定に基づき実行時に属性名に置換されます。