認証および認識機能は、データベースにログインしてデータにアクセスするユーザーの身元を確認し、そのユーザーが特定のデータベースユーザーと関連付けられるかどうかを検証します。また、関連付けられたデータベースユーザーの権限に基づいて、そのユーザーのデータベース内でのデータアクセス活動を制御します。OceanBaseは、MySQLモードとOracleモードの両方で認証機能をサポートしています。
MySQLモード
認証
MySQLでは、ユーザーはuser_nameとhostの組み合わせで構成されます。以下のステートメントを使用して、同じユーザー名を持つ3人のユーザーを作成する例を示します:
create user 'u1'@'%' identified by '***';
create user 'u1'@'1.1.1.1' identified by '***';
create user 'u1'@'2.2.2.2' identified by '***';
ユーザーがログインする際、OBServerノードはuser_name、client_ip、passwordの一致をチェックして、ユーザーのログインを制御します。
認証プラグイン
OceanBaseデータベースは、MySQLモードで認証プラグイン(Authentication Plugin)を通じてパスワードのハッシュ計算と検証方法を制御することをサポートしています。現在、以下の2種類の認証プラグインをサポートしています:
- mysql_native_password:従来のパスワード認証プラグインで、SHA-1ハッシュアルゴリズムを使用します。
- caching_sha2_password:SHA-256に基づくパスワード認証プラグインで、より高いセキュリティレベルを提供します。このプラグインはV4.4.2 BP2バージョンからサポートされており、以下の特徴を備えています:
- SHA-256ハッシュアルゴリズム:より強力なSHA-256アルゴリズムをSHA-1に代わって使用し、ハッシュ値の生成時にランダム値を追加します。
- ダブル認証モード:高速認証(ハッシュキャッシュに基づく)と完全認証(ストレージ層のハッシュに基づき、複数ラウンドのSHA-256計算を使用する)をサポートします。
- セキュリティトランスミッション:SSLおよびRSA暗号化をサポートし、ユーザーパスワードを保護します。
- パスワードキャッシュ:サーバー側が認証済みユーザーのハッシュ値をキャッシュし、以降の認証パフォーマンスを向上させます。
パスワードの複雑さ
悪意のあるパスワード攻撃を防ぐため、OceanBaseデータベースでは、必要に応じてユーザーが設定できるパスワードの複雑さ関数を用いてユーザーのログイン認証を行い、データベースのセキュリティを強化できます。
MySQLモードでは、一連のシステム変数を設定することでパスワードの複雑さルールを規定できます。これらの設定はテナントレベルです。ユーザー作成時やユーザーのパスワード変更時にシステム変数の設定に基づいてパスワードが検証され、検証に失敗するとエラーが表示されます。関連するシステム変数は以下の表のとおりです:
変数名 |
機能 |
使用説明 |
|---|---|---|
| validate_password_check_user_name | ユーザーパスワードがユーザー名と同じであるかどうかをチェックします | onの場合、ユーザーパスワードはユーザー名と同じであってはなりません。 |
| validate_password_length | ユーザーパスワードの最小長を設定 | - |
| validate_password_mixed_case_count | ユーザーパスワードに含まれる大文字と小文字の最小数を設定 | - |
| validate_password_number_count | ユーザーパスワードに含まれる数字の最小数を設定 | - |
| validate_password_policy | パスワードチェックポリシーを設定 |
|
| validate_password_special_char_count | ユーザーパスワードに含まれる特殊文字の最小数 | - |
ログイン失敗処理
OceanBaseデータベースは、複数回のログイン失敗を試みたユーザーをロックします。主な目的は、悪意のあるパスワード攻撃を防ぎ、データベースを保護し、データベースのセキュリティを向上させることです。
MySQLモードでは、システム変数connection_control_failed_connections_thresholdを使用して、ユーザーの誤ログイン試行のしきい値を指定します。この変数はテナントレベルで、整数型であり、取り得る範囲は[0,2147483647]、デフォルト値は0です。ユーザーがこのパラメータを0に設定した場合、この機能は無効になり、ユーザーの誤ログイン試行は処理されません。ユーザーの誤ログイン回数がこの変数で定義された値を超えると、アカウントはロックされます。ロック時間は以下の2つのパラメータの設定に基づきます。
connection_control_min_connection_delay:誤ログイン回数のしきい値を超えた後の、最初の誤ログインによるアカウントロック時間を指定します。その後の2回目の誤ログインのロック時間はmin ( connection_control_min_connection_delay+1000,1000* trunc ( connection_control_min_connection_delay/1000,0 ))となります。それ以降の誤ログインごとに、ロック時間は前回の時間に1000ミリ秒(1秒)ずつ加算されます。connection_control_max_connection_delay:誤ログインロック時間の最大値を指定します。時間がこの最大値に達すると、それ以上増加しません。
Oracleモード
身分認証
Oracleモードでは、テナント内でのユーザー名は一意ですが、異なるテナントのユーザーは同名であっても構いません。そのため、ユーザー名@テナント名の形式でシステム全体でユニークにユーザーを特定できます。
認証プラグイン
OceanBaseデータベースは、OracleモードのV4.4.2 BP2バージョンから、パスワード認証プラグインメカニズムをサポートしています。ユーザーはユーザー作成時または変更時に、caching_sha2_password(SHA-256ベース)認証プラグインの使用を明示的に指定でき、これによりより高いセキュリティレベルを実現できます。
パスワードの複雑さ
悪意のあるパスワード攻撃を防ぐため、OceanBaseデータベースではユーザーが必要に応じてパスワードの複雑さ関数を設定し、ユーザーのログイン身元を検証することで、データベースのセキュリティを向上させることができます。
Oracleモードでは、ユーザーはProfileのPASSWORD_VERIFY_FUNCTION属性を使用して、パスワードの複雑さが要件を満たしているかどうかを検証できます。ユーザーはまず、パスワードの複雑さを検証するためのPL Functionを作成する必要があります。このFunctionは以下のインターフェースを満たす必要があります:
FUNCTION verify_function (username IN VARCHAR2,
password IN VARCHAR2,
old_password IN VARCHAR2)
RETURN BOOLEAN;
ユーザー作成時やパスワード変更時に、この検証Functionが呼び出され、Functionの実行結果に基づいて新しいパスワードが複雑さ要件を満たしているかどうか判断されます。
ログイン失敗処理
OceanBaseデータベースは、複数回のログイン失敗を試みたユーザーをロックします。主な目的は、悪意のあるパスワード攻撃を防ぎ、データベースを保護し、データベースのセキュリティを向上させることです。
Oracleモードでは、User Profileを利用してユーザーロック機能を実装しています。User Profileのパスワードには、連続ログイン失敗後にユーザーをロックするための2つのパラメータが提供されています:
failed_login_attempts:連続ログイン失敗の回数。
password_lock_time:ロック時間。単位は日です。