Skip to content

Redis 認証

パスワード認証の一つの方法として、EMQX Cloud は Redis との連携によるパスワード認証をサポートしています。EMQX は Single Node、Redis Sentinel、Redis Cluster の3つの Redis デプロイモードをサポートしています。本節では関連する設定方法を紹介します。

注意

Redis 認証は EMQX サーバレスのデプロイメントではサポートされていません。

データ構造とクエリコマンド

Redis 認証機能は Redis ハッシュを使用して認証データを格納することをサポートしています。ユーザーはクエリコマンドのテンプレートを提供する必要があり、クエリ結果には以下のフィールドが含まれている必要があります。

  • password_hash:必須。データベース内の平文またはハッシュ化されたパスワードのフィールド。
  • salt:任意。空または存在しない場合はソルトなし(salt = "")とみなされます。
  • is_superuser:任意。現在のクライアントがスーパーユーザーかどうかを示します。デフォルトは false です。true に設定すると、そのユーザー名を使用するクライアントは認可制約を受けません。スーパーユーザーの設定は推奨されません。

例として、ユーザー名 emqx_u、パスワード public、ソルト slat_foo123sha256 でハッシュ化、スーパーユーザーフラグ false のユーザーを追加する場合:

bash
>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, 20

Redis 認証の設定

デプロイメント画面で アクセス制御 - 拡張認証 をクリックし、Redis 認証 を選択して 設定 をクリックします。

  • Redis モード:Redis データベースのデプロイモードを選択します。選択肢は SingleSentinelCluster です。

  • サーバー:Redis サーバーのアドレス(host:port)を入力します。デプロイモードが Sentinel または Cluster の場合は、関連するすべての Redis サーバーのアドレスをカンマ区切りで host1:port1,host2:port2,... の形式で指定する必要があります。

    TIP

    • 現在のデプロイメントが Dedicated Flex エディションの場合は、VPC ピアリング接続を作成し、内部ネットワークアドレスをサーバーアドレスとして使用してください。
    • 現在のデプロイメントが BYOC エディションの場合は、パブリッククラウドコンソールで VPC ピアリング接続を作成してください。詳細は VPC ピアリング接続の作成 を参照し、内部ネットワークアドレスをサーバーアドレスとして使用してください。
    • 「Init resource failure!」というメッセージが表示された場合は、サーバーアドレスが正しいか、セキュリティグループが開放されているかを確認してください。
  • Sentinel 名:デプロイモードが Sentinel の場合にのみ必要です。Redis Sentinel の設定で必要なマスターサーバー名を指定します。

  • データベース:Redis データベースのインデックスを整数で指定します。

  • ユーザー名:接続に使用する Redis のユーザー名を指定します。Redis 6.0 以降の Redis ACL を使用している場合は必須です。デフォルトユーザー(ACL 無効または適用されていない)を使用している場合は空欄にできます。

  • パスワード(任意):認証用パスワードを入力します。

  • TLS 有効化:TLS を有効にするかどうかを設定します。

  • コネクションプールサイズ(任意):EMQX ノードから Redis データベースへの同時接続数を整数で指定します。デフォルト値は 8 です。

  • パスワードハッシュ:パスワード保存に使用するハッシュアルゴリズムを選択します。例:plain、md5、sha、bcrypt、pbkdf2 など。

    • plainmd5shasha256sha512 のアルゴリズムを選択した場合は、以下の設定も必要です。
      • ソルト位置:ソルトとパスワードの結合方法を指定します。通常は変更不要ですが、外部ストレージから EMQX 内蔵データベースへアクセス認証情報を移行する場合に設定します。選択肢は suffix(パスワードの末尾にソルトを追加)、prefix(パスワードの先頭にソルトを追加)、disable(無効)。なお、plain を選択した場合はソルト方式を disable に設定してください。
    • pbkdf2 アルゴリズムを選択した場合は、以下の設定も必要です。
      • 疑似乱数関数:キー生成に使用するハッシュ関数を指定します(例:sha256)。
      • 反復回数:ハッシュ化の反復回数を指定します。デフォルトは 4096
      • 派生鍵長(任意):生成する鍵の長さを指定します。未指定の場合は疑似乱数関数により決定されます。
  • CMD:Redis クエリコマンド。以下のプレースホルダーを含めることができます。

    • ${clientid}:実行時にクライアントIDに置き換えられます。クライアントIDは通常、クライアントが CONNECT パケットで明示的に指定します。
    • ${username}:実行時にユーザー名に置き換えられます。ユーザー名は CONNECT パケットの Username フィールドから取得されます。
    • ${password}:実行時にパスワードに置き換えられます。パスワードは CONNECT パケットの Password フィールドから取得されます。
    • ${client_attrs.<attribute>}:クライアント属性。<attribute> は事前設定された属性名に実行時に置き換えられます。