ビルトイン認証
主要概念
ユーザー
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_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に基づいて1つの
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がパスワード'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を再起動すると、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のすべての権限を持ちます。