組み込み認証
主要概念
ユーザー
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_HISTORY10は、過去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現在のユーザーが間違ったパスワードで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'";
認証メカニズム
-
クライアント認証情報送信:クライアントはユーザー情報(ユーザー名、パスワード、データベースなど)をパッケージ化してDorisサーバーに送信します。この情報はクライアントのアイデンティティを証明し、データベースへのアクセスを要求するために使用されます。
-
サーバー認証:Dorisがクライアントの認証情報を受信した後、検証を実行します。ユーザー名、パスワード、およびクライアントIPが正しく、ユーザーが選択されたデータベースにアクセスする権限を持っている場合、認証が成功し、DorisはユーザーをシステムのUser Identityにマッピングします。それ以外の場合、認証は失敗し、対応するエラーメッセージをクライアントに返します。
ブラックリストとホワイトリスト
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_identityはuser_nameとhostで構成されますが、ユーザーがログインする際はuser_nameのみを入力すればよいため、DorisはクライアントのIPに基づいて対応するhostをマッチングし、ログインに使用するuser_identityを決定します。クライアントIPに基づいて一つの
user_identityのみがマッチングできる場合、この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が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にログインしようとすると、拒否されます。
-
パスワードを忘れた場合
パスワードを忘れてDorisにログインできない場合は、FE設定ファイルにskip_localhost_auth_check=trueパラメータを追加してFEを再起動することで、FEローカルマシン上でパスワードなしでrootとしてDorisにログインできます。
ログイン後、SET PASSWORDコマンドを使用してパスワードをリセットできます。
-
rootユーザー自身以外は、rootユーザーのパスワードをリセットできません。
-
current_user()とuser()ユーザーは
SELECT current_user()とSELECT user()を通じて、それぞれcurrent_userとuserを表示できます。current_userは現在のユーザーが認証システムを通過したアイデンティティを表し、userはユーザーの実際のUser Identityです。例:
ユーザー
user1@'192.%'を作成し、192.168.10.1からユーザーuser1がシステムにログインしたとします。この場合、current_userはuser1@'192.%'となり、userはuser1@'192.168.10.1'となります。すべての権限は特定の
current_userに付与され、実際のユーザーは対応するcurrent_userのすべての権限を持ちます。