ビルトイン認証
主要概念
ユーザー
Dorisでは、user_identityがユーザーを一意に識別します。user_identityは2つの部分から構成されます:user_nameとhost。user_nameはユーザー名です。hostはユーザーが接続するホストアドレスを識別します。host部分は曖昧マッチングに%を使用できます。hostが指定されていない場合、デフォルトは%で、ユーザーが任意のホストからDorisに接続できることを意味します。
ユーザー属性
ユーザー属性はuser_identityではなくuser_nameに直接関連付けられます。つまり、user@'192.%'とuser@['domain']は同じユーザー属性セットを共有します。これらの属性はユーザーに属し、user@'192.%'やuser@['domain']に属しません。
ユーザー属性には、ユーザーの最大接続数、インポートクラスター設定などが含まれますが、これらに限定されません。
ビルトインユーザー
ビルトインユーザーは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がパスワード'12345'を使用して192.168.1.1から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は現在のユーザーが認証システムを通過するために使用するIDを示し、userは現在のユーザーの実際のUser Identityです。例:
user1@'192.%'が作成され、その後user1という名前のユーザーが192.168.10.1からシステムにログインしたとします。この時、current_userはuser1@'192.%'で、userはuser1@'192.168.10.1'です。すべての権限は特定の
current_userに付与され、実際のユーザーは対応するcurrent_userのすべての権限を持ちます。