OceanBaseデータベースは、複数回のログイン失敗を試みたユーザーをロックします。主な目的は、悪意のあるパスワード攻撃を防ぎ、データベースを保護し、データベースのセキュリティを向上させることです。
OceanBaseデータベースのOracleモードでは、User Profileを利用してユーザーロック機能を実装しています。
適用対象
このドキュメントはOceanBaseデータベースのOracleモードにのみ適用されます。現在、OceanBaseデータベースCommunity EditionはMySQLモードのみを提供しています。MySQLモードでのログイン失敗処理については、ログイン失敗処理を参照してください。
概念
Profileファイルは、データベースユーザーが使用できるリソースを制限する手段です。OceanBaseデータベースのOracleモードでは、Profileファイルは主にユーザーのログイン認証ポリシーを制御するために使用されます。ユーザーのProfileファイルを使用することで、ユーザーロック機能を実現できます。
Profileファイルは、連続したログイン失敗後にユーザーをロックするためのパスワードに関する2つのパラメータを提供します:
- failed_login_attempts:連続したログイン失敗の回数。
- password_lock_time:ロック時間。単位は日です。
ユーザーがロックされた場合、そのロックおよびロック解除のポリシーは以下のとおりです:
- ユーザーロック:パスワードが間違っているためにログイン失敗した場合、失敗回数がしきい値に達すると、ユーザーのロックがトリガーされます。
- ユーザーのロック解除:ログインしたユーザーがロックされている場合、再度ログインする際、システムはロック時間を確認します。ロック時間が経過していれば、システムはロックを解除し、再ログインを試みます。ロック時間が経過していない場合、システムはエラーを返します。SQLステートメントを使用してユーザーをロック解除することもできます。
実装方法
管理者は、Profileを作成してユーザーに適用することで、ユーザーパスワードの失敗処理を実現できます。主に以下の2つのステップが含まれます:
Profileの作成。
CREATE PROFILEステートメントを使用してProfileを作成し、ユーザーの連続ログイン失敗回数および対応するロック時間を指定できます。SQLステートメントは以下のとおりです:
CREATE PROFILE "profile_name" LIMIT { FAILED_LOGIN_ATTEMPTS | PASSWORD_LOCK_TIME | PASSWORD_LIFE_TIME | PASSWORD_GRACE_TIME } { integer | UNLIMITED | DEFAULT };ステートメントの説明:
このステートメントを実行するには、
CREATE PROFILE権限が必要です。FAILED_LOGIN_ATTEMPTS:連続してユーザーのアカウントにログイン失敗する回数を指定するために使用されます。このパラメータを指定しない場合、デフォルトで
DEFAULTProfileの制限が適用されます。デフォルトのDEFAULTProfileでは、このパラメータの値はUNLIMITEDであり、連続してユーザーアカウントへのログインに失敗できる回数に制限がないことを意味します。PASSWORD_LOCK_TIME:連続ログイン失敗回数がしきい値に達した後、ユーザーアカウントがロックされる日数を指定します。このパラメータを指定しない場合、デフォルトで
DEFAULTProfileの制限が適用されます。デフォルトのDEFAULTProfileでは、このパラメータの値はUNLIMITEDであり、ユーザーロックの日数に制限がないことを意味します。PASSWORD_LIFE_TIME:同一パスワードを認証に使用できる有効日数を指定します。このパラメータを指定しない場合、デフォルトで
DEFAULTProfileの制限が適用されます。デフォルトのDEFAULTProfileでは、このパラメータの値はUNLIMITEDであり、同一パスワードを認証に使用できる日数に制限がないことを意味します。PASSWORD_GRACE_TIME:認証の有効日数が満了すると、システムは警告を発します。このパラメータは、警告後もユーザーアカウントのログインを許可する猶予期間の日数を指定します。このパラメータを指定しない場合、デフォルトで
DEFAULTProfileの制限が適用されます。デフォルトのDEFAULTProfileでは、このパラメータの値はUNLIMITEDであり、ユーザーのログイン可能日数に制限がないことを意味します。integer | UNLIMITED | DEFAULT:パラメータ値の取り得る範囲を指定します。ここで:integerは整数を表します。UNLIMITEDは、このパラメータに制限が設定されていないことを表します。DEFAULTはDEFAULTProfileの制限を使用することを表します。
CREATE PROFILEステートメントの詳細については、CREATE PROFILEを参照してください。プロファイルをユーザーに適用します。
プロファイルをユーザーに適用する主なシナリオは以下の2つです:
ユーザー作成時に、既に作成済みのプロファイルファイルを直接指定します。
SQLステートメントは以下のとおりです:
obclient> CREATE USER user_name IDENTIFIED BY password PROFILE {"profile_name" | default};ユーザー作成時にプロファイルを指定しなかった場合、デフォルトで
DEFAULTProfileが使用されます。DEFAULTProfileの設定は、システムビューDBA_PROFILESで確認できます。CREATE USERステートメントの詳細については、CREATE USERを参照してください。ユーザーが既に作成されている場合、ユーザーのプロファイルファイルを変更することで、既に作成されたプロファイルファイルをユーザーに適用できます。
SQLステートメントは以下のとおりです:
obclient> ALTER USER user_name PROFILE {"profile_name" | default};ALTER USERステートメントの詳細については、ALTER USERを参照してください。
手順例
SYSユーザーを使用して、クラスタのOracleテナントにログインします。obclient -usys@oracle -h127.1 -P2881 - P*******Profileを作成し、連続誤ログインポリシーを設定します。
userprof1という名前のProfileを作成します。連続して5回誤ログインすると1日間ロックされます。obclient> CREATE PROFILE "userprof1" LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1;完了後、以下のステートメントを実行して、設定が成功したかどうか確認できます。
obclient> SELECT * FROM DBA_PROFILES; +-----------+--------------------------+---------------+-------------+ | PROFILE | RESOURCE_NAME | RESOURCE_TYPE | LIMIT | +-----------+--------------------------+---------------+-------------+ | DEFAULT | FAILED_LOGIN_ATTEMPTS | PASSWORD | UNLIMITED | | DEFAULT | PASSWORD_GRACE_TIME | PASSWORD | UNLIMITED | | DEFAULT | PASSWORD_LIFE_TIME | PASSWORD | UNLIMITED | | DEFAULT | PASSWORD_LOCK_TIME | PASSWORD | 86400000000 | | DEFAULT | PASSWORD_VERIFY_FUNCTION | PASSWORD | NULL | | userprof1 | FAILED_LOGIN_ATTEMPTS | PASSWORD | 5 | | userprof1 | PASSWORD_GRACE_TIME | PASSWORD | DEFAULT | | userprof1 | PASSWORD_LIFE_TIME | PASSWORD | DEFAULT | | userprof1 | PASSWORD_LOCK_TIME | PASSWORD | 86400000000 | | userprof1 | PASSWORD_VERIFY_FUNCTION | PASSWORD | DEFAULT | +-----------+--------------------------+---------------+-------------+ 10 rows in setユーザーを作成し、Profileを指定します。
obclient> CREATE USER secuser IDENTIFIED BY ****** PROFILE "userprof1"; obclient> GRANT all privileges ON *.* to secuser;設定結果を検証します。
連続して5回誤ったパスワードを入力すると、ユーザーは1日間ロックされます。
$ obclient -h127.1 -P2881 -usecuser@oracle -p*******; obclient: [Warning] Using a password on the command line interface can be insecure. ERROR 5039 (01007): User lockedsysユーザーでデータベースのsysテナントにログインし、失敗したログイン情報を確認します。obclient> SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS; +-------------+-----------------+ | USERHOST | FAILED_ATTEMPTS | +-------------+-----------------+ | 'test'@'%' | 5 | +-------------+-----------------+ 1 row in set (0.005 sec)ユーザーのロックを解除します。
注意
ユーザーのロック解除操作は通常、管理者が実行します。一般ユーザーがロックおよびロック解除操作を実行する必要がある場合は、グローバルな
ALTER USER権限を持っている必要があります。ユーザー権限の確認および権限付与に関する操作については、ユーザー権限の確認および権限の直接付与を参照してください。obclient> ALTER USER secuser ACCOUNT UNLOCK;
ログイン失敗処理ポリシーの変更
既に作成済みのProfileは、ALTER PROFILE ステートメントを使用して変更できます。
ALTER PROFILE ステートメントの詳細については、ALTER PROFILEを参照してください。
注意
既にロックされているユーザーは、ALTER PROFILE ステートメントを使用して FAILED_LOGIN_ATTEMPTS を変更することでロックを解除することはできません。ALTER PROFILE ステートメントによるプロファイルの変更は、その後のセッションにおけるユーザーにのみ影響を及ぼし、現在のセッションにいるユーザーには影響しません。