メインコンテンツまでスキップ
バージョン: 2.1

組み込み認証

主要概念

ユーザー

Dorisでは、user_identityがユーザーを一意に識別します。user_identityは2つの部分で構成されます:user_nameとhostです。usernameはユーザー名で、hostはユーザークライアント接続が位置するホストアドレスを識別します。host部分では%を使用してファジーマッチングを行うことができます。hostが指定されていない場合、デフォルトは'%'となり、これはユーザーが任意のホストからDorisに接続できることを意味します。

ユーザー属性

ユーザー属性はuser_nameに直接アタッチされ、user_identityにはアタッチされません。これは、user@'192.%'とuser@['domain']が同じユーザー属性のセットを持つことを意味します。これらの属性はuserに属し、user@'192.%'やuser@['domain']に属するものではありません。

ユーザー属性には以下が含まれますが、これらに限定されません:ユーザーの最大接続数、インポートクラスター設定など。

組み込みユーザー

組み込みユーザーは、Dorisでデフォルトで作成されるユーザーで、rootやadminを含む特定のデフォルト権限を持ちます。初期パスワードは空です。FEが開始された後、パスワード変更コマンドを使用してそれらを変更できます。組み込みユーザーは削除できません。

  • root@'%': rootユーザー、任意のノードからのログインが許可され、operatorロールを持ちます。
  • admin@'%': adminユーザー、任意のノードからのログインが許可され、adminロールを持ちます。

パスワード

ユーザーログイン認証情報で、ユーザー作成時に管理者によって設定されるか、作成後にユーザー自身が変更することができます。

パスワードポリシー

Dorisは、ユーザーがパスワードをより適切に管理できるよう、以下のパスワードポリシーをサポートしています。

  • PASSWORD_HISTORY

    パスワードをリセットする際に、現在のユーザーが履歴パスワードを使用することを許可するかどうか。例えば、PASSWORD_HISTORY 10は、過去10個のパスワードを新しいパスワードとして使用することを禁止することを意味します。PASSWORD_HISTORY DEFAULTに設定された場合、グローバル変数password_historyの値を使用します。0はこの機能が無効であることを意味します。デフォルトは0です。

    例:

    • グローバル変数を設定: SET GLOBAL password_history = 10
    • ユーザーに設定: ALTER USER user1@'ip' PASSWORD_HISTORY 10
  • PASSWORD_EXPIRE

    現在のユーザーのパスワードの有効期限を設定します。例えば、PASSWORD_EXPIRE INTERVAL 10 DAYはパスワードが10日で期限切れになることを意味します。PASSWORD_EXPIRE NEVERはパスワードが期限切れにならないことを意味します。PASSWORD_EXPIRE DEFAULTに設定された場合、グローバル変数default_password_lifetime(日単位)の値を使用します。デフォルトはNEVER(または0)で、期限切れにならないことを意味します。

    例:

    • グローバル変数を設定: SET GLOBAL default_password_lifetime = 1
    • ユーザーに設定: ALTER USER user1@'ip' PASSWORD_EXPIRE INTERVAL 10 DAY
  • FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME

    現在のユーザーが間違ったパスワードでn回ログインした場合、アカウントがロックされ、ロック時間を設定します。例えば、FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1 DAYは、3回間違ったログインがあった場合、アカウントが1日間ロックされることを意味します。管理者はALTER USER文を通じてロックされたアカウントを能動的にロック解除できます。

    例:

    • ユーザーに設定: ALTER USER user1@'ip' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1 DAY
  • パスワード強度

    この機能は、グローバル変数validate_password_policyによって制御されます。デフォルトはNONE/0で、パスワード強度がチェックされないことを意味します。STRONG/2に設定された場合、パスワードは以下のうち3つを含む必要があります:「大文字」、「小文字」、「数字」、「特殊文字」で、長さは8以上である必要があります。

    例:

    • SET validate_password_policy=STRONG

上記のポリシーを設定した後、以下のコマンドでそれらを表示できます:

SHOW PROC "/auth/'<user>'@'<host>'";

ユーザー部分とホスト部分をそれぞれ単一引用符で囲む必要があることに注意してください。例えば:

SHOW PROC "/auth/'root'@'%'";
SHOW PROC "/auth/'user1'@'127.0.0.1'";

認証メカニズム

  1. クライアント認証情報送信:クライアントはユーザー情報(ユーザー名、パスワード、データベースなど)をパッケージ化してDorisサーバーに送信します。この情報はクライアントのアイデンティティを証明し、データベースへのアクセスを要求するために使用されます。

  2. サーバー認証:Dorisがクライアントの認証情報を受信した後、検証を実行します。ユーザー名、パスワード、およびクライアントIPが正しく、ユーザーが選択されたデータベースにアクセスする権限を持っている場合、認証が成功し、DorisはユーザーをシステムのUser Identityにマッピングします。それ以外の場合、認証は失敗し、対応するエラーメッセージをクライアントに返します。

ブラックリストとホワイトリスト

Doris自体はブラックリストをサポートしておらず、ホワイトリスト機能のみをサポートしていますが、特定の方法でブラックリストをシミュレートできます。まずuser@'192.%'という名前のユーザーを作成し、192.*からのユーザーのログインを許可するとします。192.168.10.1からのユーザーのログインを禁止したい場合、別のユーザーcmy@'192.168.10.1'を作成し、新しいパスワードを設定できます。192.168.10.1192.%より高い優先度を持つため、192.168.10.1からのユーザーは古いパスワードを使用してログインできなくなります。

関連コマンド

その他の注意事項

  1. ログイン時のuser_identityの優先選択

    前述のように、user_identityuser_namehostで構成されますが、ユーザーがログインする際はuser_nameのみを入力すればよいため、DorisはクライアントのIPに基づいて対応するhostをマッチングし、ログインに使用するuser_identityを決定します。

    クライアントIPに基づいて一つのuser_identityのみがマッチングできる場合、このuser_identityが間違いなくマッチングされます。しかし、複数のuser_identityがマッチングできる場合、以下の優先度の問題が発生します。

    1. ドメインとIPの間の優先度:

      以下のユーザーが作成されたとします:

      CREATE USER user1@['domain1'] IDENTIFIED BY "12345";
      CREATE USER user1@'ip1'IDENTIFIED BY "abcde";

domain1は2つのIP(ip1とip2)に解決されます。

    優先度の観点では、IPはドメインより優先されるため、ユーザーuser1がip1からパスワード'12345'を使用してDorisにログインしようとすると、拒否されます。

2. 特定のIPとIP範囲の優先度:

以下のユーザーが作成されたとします:

```sql
CREATE USER user1@'%' IDENTIFIED BY "12345";
CREATE USER user1@'192.%' IDENTIFIED BY "abcde";
```

優先度の観点では、'192.%'が'%'よりも優先されるため、ユーザーuser1が192.168.1.1からパスワード'12345'を使用してDorisにログインしようとすると、拒否されます。

  1. パスワードを忘れた場合

    パスワードを忘れてDorisにログインできない場合は、FE設定ファイルにskip_localhost_auth_check=trueパラメータを追加してFEを再起動することで、FEローカルマシン上でパスワードなしでrootとしてDorisにログインできます。

    ログイン後、SET PASSWORDコマンドを使用してパスワードをリセットできます。

  2. rootユーザー自身以外は、rootユーザーのパスワードをリセットできません。

  3. current_user()user()

    ユーザーはSELECT current_user()SELECT user()を通じて、それぞれcurrent_useruserを表示できます。current_userは現在のユーザーが認証システムを通過したアイデンティティを表し、userはユーザーの実際のUser Identityです。

    例:

    ユーザーuser1@'192.%'を作成し、192.168.10.1からユーザーuser1がシステムにログインしたとします。この場合、current_useruser1@'192.%'となり、useruser1@'192.168.10.1'となります。

    すべての権限は特定のcurrent_userに付与され、実際のユーザーは対応するcurrent_userのすべての権限を持ちます。