OracleのDBA_USERSで全ユーザーのアカウント状態を確認する方法|ACCOUNT_STATUSの意味とSQL例を解説

Oracle

Oracle Databaseでユーザーアカウントが利用可能なのか、ロックされているのか、パスワードが期限切れなのかを確認したい場合は、データディクショナリビューのDBA_USERSを利用できます。

Oracle公式ドキュメントでは、DBA_USERSはデータベース内のすべてのユーザーを示すビューと定義されており、その中のACCOUNT_STATUS列でアカウント状態を確認できます。

したがって、権限を持つユーザーからDBA_USERSUSERNAMEACCOUNT_STATUSをSELECTすれば、データベース内のユーザーとそのアカウント状態を一覧で確認できます。

[参照] Oracle Database公式「DBA_USERS」

DBA_USERSで全ユーザーのアカウント状態を確認する基本SQL

最もシンプルな確認方法は、USERNAMEACCOUNT_STATUSを取得するSQLです。

SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS ORDER BY USERNAME;

このSQLを実行すると、ユーザー名と現在のアカウント状態を一覧で確認できます。

たとえば結果は次のようなイメージです。

USERNAME          ACCOUNT_STATUS
----------------  -----------------------
APP_USER          OPEN
BATCH_USER        LOCKED
TEST_USER         EXPIRED
SYS               OPEN
SYSTEM            OPEN

APP_USEROPENならアカウントはオープン状態、BATCH_USERLOCKEDならロック状態、TEST_USEREXPIREDならパスワードが期限切れになっていることが分かります。

ACCOUNT_STATUSにはOPEN以外にも複数の状態がある

ACCOUNT_STATUSは単純な「有効/無効」の2種類ではありません。Oracle Databaseではパスワード期限切れとアカウントロックを区別して管理しているため、複数の状態があります。

Oracle公式のDBA_USERSリファレンスで案内されている代表的な状態を整理すると、次のようになります。

ACCOUNT_STATUS 概要
OPEN アカウントがオープン状態
EXPIRED パスワードが期限切れ
EXPIRED(GRACE) パスワード期限切れ後の猶予期間
LOCKED(TIMED) 一定期間のロック状態
LOCKED アカウントがロックされている
EXPIRED & LOCKED(TIMED) パスワード期限切れかつ一定期間のロック
EXPIRED(GRACE) & LOCKED(TIMED) 期限切れ猶予期間中かつ一定期間のロック
EXPIRED & LOCKED パスワード期限切れかつロック
EXPIRED(GRACE) & LOCKED 期限切れ猶予期間中かつロック

このため「OPENではない=全部同じ理由でログインできない」と判断してはいけません。パスワード期限切れなのか、ロックなのか、両方なのかをACCOUNT_STATUSの値から判断することが重要です。

[参照] Oracle Database日本語公式ドキュメント「DBA_USERS」

OPENとは何を意味する?

OPENは、そのアカウントがオープン状態であることを示します。そのため、アカウントのロック・パスワード期限という観点から一覧確認するときは、まずOPENかどうかを見る方法が分かりやすいでしょう。

ただし、ACCOUNT_STATUS='OPEN'だからといって「そのユーザーが必ず目的のアプリケーションへ正常にログインできる」とまでは断定できません。

実際の接続には認証方式、入力した資格情報、ネットワーク、サービス名、権限、アプリケーション側の設定など別の要因も関係します。ACCOUNT_STATUSはあくまでOracle Database上のアカウント状態を確認するための情報です。

OPEN以外のユーザーだけ抽出するSQL

ユーザー数が多い環境では、全件を表示して目視確認するより、問題になりそうな状態だけ抽出したほうが効率的です。

たとえばOPENではないユーザーだけ確認するなら、次のように検索できます。

SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE ACCOUNT_STATUS <> 'OPEN' ORDER BY USERNAME;

これにより、期限切れやロックなどOPEN以外の状態になっているアカウントをまとめて確認できます。

運用確認で「正常なアカウントを全部見る」のではなく「要確認のアカウントを探す」ことが目的なら、このような絞り込みが便利です。

LOCKEDのユーザーだけ確認する方法

アカウントロックを調査している場合は、ACCOUNT_STATUSLOCKEDを含むユーザーを検索できます。

SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE FROM DBA_USERS WHERE ACCOUNT_STATUS LIKE '%LOCKED%' ORDER BY USERNAME;

DBA_USERSにはLOCK_DATEもあり、Oracle公式リファレンスではアカウントがロックされている場合のロック日時を示す列として説明されています。

単に「現在ロックされている」という情報だけでなく、ロック日時も調査したい場合にはACCOUNT_STATUSLOCK_DATEを一緒に取得すると便利です。

パスワード期限切れのユーザーだけ確認する方法

パスワード期限に関する状態を調査したい場合は、EXPIREDを含む状態を抽出できます。

SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE FROM DBA_USERS WHERE ACCOUNT_STATUS LIKE 'EXPIRED%' ORDER BY USERNAME;

EXPIRY_DATEはパスワードの有効期限を確認するときに役立つ列です。現在の状態だけでなく期限情報も含めて確認したい場合は、次のように全ユーザーを一覧表示することもできます。

SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE FROM DBA_USERS ORDER BY USERNAME;

パスワードの有効期限はユーザーに割り当てられているプロファイルの設定などとも関係するため、期限切れの原因まで調査する場合はPROFILEも合わせて確認すると分かりやすくなります。

PROFILEも一緒に確認すると調査しやすい

DBA_USERSには、そのユーザーに割り当てられているプロファイルを示すPROFILE列もあります。

Oracle公式のSecurity Guideでも、ユーザー情報を調べる例としてUSERNAMEPROFILEACCOUNT_STATUSAUTHENTICATION_TYPEをまとめて取得するSQLが紹介されています。

SELECT USERNAME, PROFILE, ACCOUNT_STATUS, AUTHENTICATION_TYPE FROM DBA_USERS ORDER BY USERNAME;

この形式なら、「誰が」「どのプロファイルを使い」「現在どの状態で」「どの認証方式を使用しているか」をまとめて確認できます。

[参照] Oracle Database Security Guide「Database User and Profile Data Dictionary Views」

DBA_USERSではアカウントの認証方式も確認できる

ユーザー調査ではACCOUNT_STATUSだけでなく、AUTHENTICATION_TYPEも有用です。これはユーザーの認証方式を確認するための列です。

たとえばOracle Databaseのバージョンや構成に応じて、パスワード認証だけでなく外部認証などが利用されている場合があります。

そのため「アカウントはOPENなのに想定した方法で認証できない」というケースでは、次のように確認することができます。

SELECT USERNAME, ACCOUNT_STATUS, AUTHENTICATION_TYPE FROM DBA_USERS WHERE USERNAME = 'APP_USER';

アカウント状態だけで原因を断定せず、認証方式など関連情報まで確認するのがトラブルシューティングのポイントです。

DBA_USERSとALL_USERSの違いに注意

OracleにはDBA_USERSと名前の似たALL_USERSがありますが、役割が異なります。

Oracle公式リファレンスによると、ALL_USERS現在のユーザーから見えるデータベースユーザーを一覧表示するビューです。一方、DBA_USERSはデータベース内のすべてのユーザーを説明し、ALL_USERSより多くの列を持ちます。

[参照] Oracle Database公式「ALL_USERS」

特に重要なのは、ALL_USERSにはACCOUNT_STATUSがありません。そのため、ユーザー名を一覧表示するだけならALL_USERS、アカウントのロックや期限切れまで確認するならDBA_USERSと覚えると分かりやすいでしょう。

USER_USERSとの違いは「誰を確認するか」

もう一つ関連するビューとしてUSER_USERSがあります。こちらは現在接続しているユーザー自身の情報を確認するビューです。

つまり、大まかな使い分けは次のようになります。

ビュー 主な用途 ACCOUNT_STATUS
DBA_USERS データベース内の全ユーザーについて詳細を確認 あり
ALL_USERS 現在のユーザーから見えるユーザーを一覧確認 なし
USER_USERS 現在のユーザー自身の情報を確認 あり

「全ユーザーの状態を管理者として確認したい」という目的なら、基本的にはDBA_USERSが適しています。

DBA_USERSをSELECTできない場合は権限を確認する

DBA_USERSは管理情報を含むデータディクショナリビューです。そのため、どの一般ユーザーからでも無条件に参照できるとは限りません。

SQLを実行して権限不足のエラーになる場合は、使用しているユーザーに必要なデータディクショナリ参照権限があるか、DBAへ確認してください。

本番環境では、単にSQLを実行したいという理由だけで強力な権限を付与するのは適切ではありません。組織の権限管理方針に従い、必要最小限の権限で運用することが重要です。

CDB・PDB環境では「どのコンテナで実行しているか」に注意

Oracle Database 12c以降のマルチテナント環境では、CDBとPDBという概念があります。そのため、DBA_USERSを確認するときは、現在どのコンテナへ接続しているかも重要です。

DBA_USERSを単純に「Oracleサーバー全体のあらゆるPDBを横断した絶対的な全ユーザー一覧」と考えると誤解につながることがあります。マルチテナント環境ではコンテナを意識してデータディクショナリビューを利用する必要があります。

現在のコンテナは、環境に応じて次のようなSQLで確認できます。

SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS CON_NAME FROM DUAL;

複数のPDBを運用している環境で「全ユーザー」という言葉を使う場合は、現在のPDB内の全ユーザーなのか、CDB全体を対象にしたいのかを最初に明確にすると調査ミスを防げます。

Oracle管理ユーザーとアプリ用ユーザーを区別したい場合

実際にDBA_USERSをSELECTすると、自分で作成した覚えのないユーザーが多数表示される場合があります。Oracle Database自身が利用・管理するアカウントも存在するためです。

比較的新しいOracle Databaseでは、ORACLE_MAINTAINED列を使ってOracle提供スクリプトによって作成・管理されるユーザーかどうかを判断できます。

たとえば次のように確認できます。

SELECT USERNAME, ACCOUNT_STATUS, ORACLE_MAINTAINED FROM DBA_USERS ORDER BY USERNAME;

Oracle公式Security Guideでは、ORACLE_MAINTAINEDYのアカウントについて、Oracle提供スクリプトによって作成・管理されているものとして説明しています。このようなユーザーを通常のアプリケーションユーザーと同じ感覚で変更しないことが重要です。

[参照] Oracle Database Security Guide「Managing Security for Oracle Database Users」

アプリケーション用ユーザーだけを調べたい場合の例

環境によってはOracle管理アカウントを除外し、自分たちで作成したユーザーを中心に確認したいことがあります。

ORACLE_MAINTAINEDを利用できるバージョンなら、たとえば次のような検索が考えられます。

SELECT USERNAME, ACCOUNT_STATUS, PROFILE FROM DBA_USERS WHERE ORACLE_MAINTAINED = 'N' ORDER BY USERNAME;

これにより、Oracle管理アカウントを除いたユーザーの状態を確認しやすくなります。

ただし、「ORACLE_MAINTAINED='N'ならすべて業務アプリケーション用」という意味ではありません。組織独自の管理ユーザーや検証ユーザーなども含まれる可能性があるため、実際のユーザー用途は自社の設計・管理情報と照合してください。

ロックされているからといってすぐ解除しない

DBA_USERSを調べてLOCKEDのアカウントを見つけても、理由を確認せずすぐロック解除するのは避けるべきです。

Oracleが提供するアカウントには、セキュリティ上の理由から初期状態でロックされているものがあります。また、アプリケーション用アカウントでも、運用上意図的に停止している可能性があります。

さらにログイン失敗の繰り返しによってロックされた場合は、アプリケーションやバッチに古いパスワードが設定されているなど、別の原因が存在する可能性があります。解除だけすると再びロックされることがあります。

ACCOUNT_STATUSは「変更するための情報」ではなく、まず現状と原因を調査するための情報として使うのが安全です。

アカウント状態を定期確認するSQL例

運用監視などで確認する場合は、ユーザー名だけでなく状態、ロック日時、期限、プロファイルなどを一緒に表示すると便利です。

SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE, PROFILE, AUTHENTICATION_TYPE FROM DBA_USERS ORDER BY USERNAME;

これなら「現在の状態」「ロックされた日時」「パスワード期限」「適用プロファイル」「認証方式」を一度に確認できます。

さらに異常候補だけ確認したければ、次のようにOPEN以外へ絞り込めます。

SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE, PROFILE FROM DBA_USERS WHERE ACCOUNT_STATUS <> 'OPEN' ORDER BY ACCOUNT_STATUS, USERNAME;

ただし、Oracleが意図的にロックしている標準アカウントもあるため、OPEN以外が存在すること自体を直ちに障害と判断しないよう注意してください。

特定ユーザーだけ確認する場合

ログイン障害などで対象ユーザーが決まっているなら、全件を表示する必要はありません。Oracle公式の認証ドキュメントでも、特定ユーザーのACCOUNT_STATUSDBA_USERSから確認する方法が案内されています。

SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = 'APP_USER';

さらに原因調査まで行うなら、次のように関連情報を追加できます。

SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE, PROFILE, AUTHENTICATION_TYPE FROM DBA_USERS WHERE USERNAME = 'APP_USER';

[参照] Oracle Database Security Guide「Checking the Status of a User Account」

Oracleでは引用符を使わずに作成した一般的なユーザー名は大文字として扱われるため、検索条件も'APP_USER'のように大文字で指定するケースが基本です。ユーザー名の作成方法によっては例外があるため、実際のUSERNAMEを確認して検索してください。

DBA_USERSで確認できるのは「現在ログイン中か」ではない

ここは混同しやすいポイントです。DBA_USERS.ACCOUNT_STATUSが示しているのは、アカウントがオープン、ロック、期限切れなどのどの状態にあるかです。

そのユーザーが現在データベースへ接続中かどうかを示す列ではありません。

現在のセッションを調査する場合はV$SESSIONなど、セッション情報を扱う別の動的パフォーマンスビューを使用します。「アカウントが利用可能か」と「現在接続しているか」は別の問題として考える必要があります。

DBA_USERSで分かること・分からないこと

DBA_USERSはユーザー管理の調査に非常に便利ですが、何でも分かるビューではありません。目的に応じて他のビューと組み合わせることが重要です。

確認したいこと 主な確認先
全ユーザーのアカウント状態 DBA_USERS.ACCOUNT_STATUS
ロック日時 DBA_USERS.LOCK_DATE
パスワード期限 DBA_USERS.EXPIRY_DATE
適用プロファイル DBA_USERS.PROFILE
認証方式 DBA_USERS.AUTHENTICATION_TYPE
Oracle管理ユーザーか ORACLE_MAINTAINED
現在ログイン中か V$SESSIONなど
プロファイルの具体的な制限値 DBA_PROFILES

「ユーザーについて調べたい」という目的をさらに細分化してから適切なビューを選ぶと、不要なSQLを実行せず効率よく調査できます。

まとめ:全ユーザーの状態確認ならDBA_USERSのACCOUNT_STATUSを見る

Oracle Databaseで全ユーザーのアカウント状態を確認する場合は、DBA_USERSACCOUNT_STATUSを利用できます。Oracle公式ドキュメントでも、DBA_USERSはデータベース内のすべてのユーザーを示し、ACCOUNT_STATUSでアカウント状態を確認できるとされています。

基本SQLは非常にシンプルです。

SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS ORDER BY USERNAME;

これにより、OPEN、EXPIRED、LOCKEDなどの状態をユーザーごとに一覧確認できます。ロック原因やパスワード期限まで調べる場合は、LOCK_DATEEXPIRY_DATEPROFILEAUTHENTICATION_TYPEなども一緒に取得すると便利です。

一方、ALL_USERSはユーザー一覧には利用できますがACCOUNT_STATUSを持たないため、アカウント状態の確認にはDBA_USERSが適しています。また、マルチテナント環境では現在接続しているコンテナを意識し、Oracle管理ユーザーがロックされていても安易に解除しないことが重要です。

実運用では、まずDBA_USERSで状態を確認し、異常と思われるユーザーについてロック日時、期限、プロファイル、認証方式などを追加調査する、という順序で進めると安全かつ効率的です。

コメント

タイトルとURLをコピーしました