メインコンテンツまでスキップ

ビルトイン認証

主要概念

ユーザー

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

ユーザー属性

ユーザー属性はuser_identityではなく、user_nameに直接関連付けられます。これは、user@'192.%'とuser@['domain']が同じユーザー属性のセットを持つことを意味します。これらの属性は、user@'192.%'やuser@['domain']ではなく、userに属します。

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

組み込みユーザー

組み込みユーザーは、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に基づいて1つの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がパスワード'12345'を使用してip1から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のすべての権限を持ちます。