組み込み認証
主要概念
ユーザー
Dorisでは、user_identityがユーザーを一意に識別します。user_identityはuser_nameとhostの2つの部分で構成され、user_nameはユーザー名です。hostはユーザーが接続する元のホストアドレスを識別します。host部分では、あいまい一致に%を使用できます。hostが指定されていない場合、デフォルトは%となり、ユーザーは任意のホストからDorisに接続できることを意味します。
ユーザー属性
ユーザー属性はuser_identityではなくuser_nameに直接付加されます。つまり、user@'192.%'とuser@['domain']は同じユーザー属性のセットを共有します。これらの属性はuser@'192.%'やuser@['domain']ではなく、ユーザーに属します。
ユーザー属性には、ユーザーの最大接続数、importクラスター構成などが含まれますが、これらに限定されません。
組み込みユーザー
組み込みユーザーは、Dorisでデフォルトで作成されるユーザーで、デフォルトで一定の権限を持ちます。rootとadminが含まれます。初期パスワードは空で、フロントエンド開始後にパスワード変更コマンドを使用して変更できます。デフォルトユーザーは削除できません。
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_ATTEMPTSとPASSWORD_LOCK_TIMEアカウントがロックされるまでの間違ったパスワード試行回数とロック時間を設定します。例えば、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
認証メカニズム
- クライアント認証情報送信:クライアントはユーザー情報(ユーザー名、パスワード、データベースなど)をパッケージ化してDorisサーバーに送信します。この情報は、クライアントの身元を証明し、データベースへのアクセスを要求するために使用されます。
- サーバー認証:クライアントの認証情報を受信後、Dorisはそれを検証します。ユーザー名、パスワード、クライアントIPが正しく、ユーザーが選択したデータベースにアクセスする権限を持っている場合、認証が成功し、Dorisはユーザーエンティティをシステムのユーザーアイデンティティにマップします。そうでなければ、認証は失敗し、クライアントにエラーメッセージが返されます。
許可リストとブロックリスト
Doris自体はブロックリストをサポートせず、許可リスト機能のみですが、いくつかの方法でブロックリストをシミュレートできます。user@'192.%'という名前のユーザーが作成され、192.*からのユーザーのログインが許可されているとします。192.168.10.1からのユーザーのログインを禁止したい場合、別のユーザーcmy@'192.168.10.1'を作成し、新しいパスワードを設定できます。192.168.10.1は192.%より高い優先度を持つため、192.168.10.1からのユーザーは古いパスワードを使用してログインできなくなります。
関連コマンド
- ユーザー作成:CREATE USER
- ユーザー表示:SHOW ALL GRANTS
- ユーザー変更:ALTER USER
- パスワード変更:SET PASSWORD
- ユーザー削除:DROP USER
- ユーザー属性設定:SET PROPERTY
- ユーザー属性表示:SHOW PROPERTY
その他の説明
-
ログイン時のユーザーアイデンティティ優先度選択の問題
上記で紹介したように、
user_identityはuser_nameとhostで構成されますが、ログイン時にユーザーはuser_nameのみを入力すればよいため、DorisはクライアントのIPに基づいて、ログインに使用するuser_identityを決定します。クライアントのIPに基づいて1つの
user_identityのみがマッチする場合、それがログインに使用され、問題はありません。しかし、複数のuser_identityがマッチする場合、優先度の問題が発生します。-
ドメイン名と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にログインしようとした場合、ログインは拒否されます。
-
パスワード忘れ
パスワードを忘れてDorisにログインできない場合、FEの設定ファイルに
skip_localhost_auth_check=trueパラメータを追加してFEを再起動できます。これにより、rootユーザーを使用してFEマシンからパスワードなしでDorisにログインできます。ログイン後、
SET PASSWORDコマンドを使用してパスワードをリセットできます。 -
rootユーザー自身を除き、どのユーザーもrootユーザーのパスワードをリセットすることはできません。 -
current_user()とuser()ユーザーは
SELECT current_user()とSELECT user()を使用して、それぞれcurrent_userとuserを確認できます。current_userは現在のユーザーが認証システムを通過するために使用された身元を示し、userは現在のユーザーの実際のUser Identityです。例:
user1@'192.%'が作成され、その後user1という名前のユーザーが192.168.10.1からシステムにログインするとします。この時、current_userはuser1@'192.%'で、userはuser1@'192.168.10.1'です。すべての権限は特定の
current_userに付与され、実際のユーザーは対応するcurrent_userのすべての権限を持ちます。