※ 本記事は2016年12月1日に公開されたものです。
Oracle Databaseにおけるデータベース管理者には以下の3つの種類があります。
- DBAロールを持つユーザー
- SYSDBA管理権限を持つユーザー
- OSのDBAグループに所属するユーザー
1. DBAロールを持つユーザー
DBAロールは、さまざまなシステム権限を含んだロールです。DBAロールの中にはSELECT ANY TABLE権限のようにすべてのスキーマのオブジェクトを操作する事ができるANYシステム権限や、ALTER SYSTEMのようにデータベース自体を管理するシステム権限が含まれます。事前定義のSYSTEMユーザーはこのDBAロールを割り当てられている管理用のアカウントになります。DBAロールは他のアカウントにも付与することができますので、DBAロールを付与することで簡単にデータベースの管理者アカウントを作成できます。ただし、DBAロールに具体的に含まれる権限はバージョンによって変わります (新機能用のロールが追加されたりします) ので注意が必要です。また、SYSスキーマの一部のオブジェクトに対する権限は無く、全ての操作ができるわけではありません。たとえば、DBAロールを持つSYSTEMユーザーであっても、監査証跡表(SYS.AUD$表)の削除はできません。
SQL> show user ユーザーは"SYSTEM"です。 SQL> delete from sys.aud$; delete from sys.aud$ * 行1でエラーが発生しました。: ORA-01031: 権限が不足しています。
DBAロールは非常に強力なロールです。DBAロールを割り当てる際には、誰がこのロールを持っているのかを明確にするためにも、別のロール経由で割り当てるのではなく、直接ユーザーに割り当てることを考慮して下さい。
2. SYSDBA管理権限を持つユーザー
SYSDBA管理権限はデータベースを管理するための特権です。他の権限と同じようにGRANT文でSYSDBA管理権限を割り当てられます。
SQL> show user ユーザーは"SYS"です。 SQL> grant sysdba to puku; 権限付与が成功しました。
SYSDBA権限が割り当てられたユーザーは、V$PWFILE_USERS動的パフォーマンスビューから確認できます。
DBSATのレポートでは「Privileges and Roles」セクションの「Users with Administrative Privileges」から確認できます。レポートを「PRIV.ADMIN」で検索すると簡単に探すことができます。
SYSDBA管理権限を割り当てられたユーザーはふたつの方法でデータベースに接続できるようになります。
ひとつ目は通常の接続です。
SQL> connect puku/oracle@localhost/appdb 接続されました。 SQL> show user ユーザーは"PUKU"です。
通常通り接続した場合には、SYSDBA管理権限は利用できず、アカウントに割り当てられているその他の権限を利用したデータベースアクセスができます。
ふたつ目がSYSDBAとしての接続です。
SQL> connect puku/oracle@localhost/appdb as sysdba 接続されました。 SQL> show user ユーザーは"SYS"です。
SYSDBAとして接続すると、接続したユーザーはSYSとなり、SYSユーザーとしてデータベースの管理をおこなう事ができます。SYSユーザーですのでもちろん監査証跡表(SYS.AUD$表)の削除もできます。
SQL> delete from sys.aud$; 84行が削除されました。
SYSDBA管理権限をユーザーに割り当てると、そのユーザーはSYSユーザーとして全ての操作ができることになります。SYSDBA権限のユーザーへの割り当てはおこなわず業務上必要最小限の権限のみを付与することを考慮して下さい。
なお、REMOTE_LOGIN_PASSWORD_FILE初期化パラメータとパスワードファイル(UNIXとLinuxでは$ORACLE_HOME/dbs/orapw<SID>ファイル、Windowsでは%ORACLE_HOME%\database\ORAPW<SID>.oraファイル)の設定により、SYSDBA管理権限を割り当てられたユーザーのログインを制御できます。
REMOTE_LOGIN_PASSWORD_FILE初期化パラメータはnone、exclusive、sharedに設定することができます。デフォルト値はexclusiveです。
noneパスワードファイルは無視されます。ユーザー名とパスワードを指定したSYSDBAとしての接続はできず、SYSDBAとして接続するためには、OSで認証される必要があります。exclusiveパスワードファイルを利用します。パスワードファイルが存在しない場合にはnoneに設定した時と同じ動作になります。パスワードファイルは複数のデータベースで共有できません。sharedパスワードファイルを利用します。この初期化パラメータが設定されている場合、パスワードファイルに記録されているユーザー(SYSなど)のパスワードをALTER USER文を利用してデータベースから変更することはできません。またユーザーに対して新たにSYSDBA管理権限を割り当てたり、はく奪することはできません。パスワードファイルが存在しない場合にはnoneに設定した時と同じ動作になります。1つ以上のデータベースでパスワードファイルを共有することができます。
3. OSのDBAグループに所属するユーザー
インストール時にDB管理者用のグループとして指定したOSグループ(一般的にはUNIXとLinuxではdba、WindowsではORA_DBA)に所属しているユーザーは、データベースで認証されずにデータベース管理者として接続できます。この機能を管理者のOS認証と呼びます。
$ id uid=600(oracle) gid=601(oinstall) 所属グループ=601(oinstall),600(dba),602(kmdba) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 $ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on 木 11月 24 17:34:08 2016 Copyright (c) 1982, 2014, Oracle. All rights reserved. Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options に接続されました。 SQL> show user ユーザーは"SYS"です。
なお、OS認証ではユーザー名やパスワードに何を指定しても(パスワードが間違っていても、存在しないユーザー名を指定しても)、OSで既に認証されているため管理者として接続できます。
SQL> connect sys/wrong_password as sysdba 接続されました。 SQL> show user ユーザーは"SYS"です。 SQL> connect system/wrong_password as sysdba 接続されました。 SQL> show user ユーザーは"SYS"です。 SQL> connect no_such_user/wrong_password as sysdba 接続されました。 SQL> show user ユーザーは"SYS"です。
OS DBAグループのユーザーは、UNIXやLinuxでは/etc/groupファイルから確認できます。
DBSATのレポートでは「Operationg System」セクションの「OS Authentication」から確認できます。レポートを「OS.AUTH」で検索すると簡単に探すことができます。
ただし、OS DBAグループが/etc/passwdファイルでプライマリグループとして指定されていると上記からは確認しきれません。プライマリグループにOS DBAグループが指定されているかどうかは、/etc/passwdファイルも併せて参照する必要があります。
Windowsでは「管理ツール」→「コンピューターの管理」の「ローカルユーザーとグループ」やActive Directoryなどで確認して下さい。Windowsの場合、DBSATはOSの情報を取得しません。
なお、sqlnet.oraファイルのSQLNET.AUTHENTICATION_SERVICESパラメータにより、管理者のOS認証でのログインを制御することができます。具体的には値をnoneに設定すると、OS認証を利用しようとしても以下のエラーで接続できず、パスワードファイルを利用した認証を強制できます。
SQL> connect / as sysdba ERROR: ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
また、マルチテナント環境ではCDBへの接続には管理者のOS認証機能が利用できますが、PDBへの接続では管理者のOS認証はできず、パスワードファイルを利用した認証が必須となります。
SQL> connect / as sysdba ← CDBへの接続 接続されました。 SQL> connect /@appdb as sysdba ← PDBへの接続 ERROR: ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。 警告: Oracleにはもう接続されていません。
ただし、以下のように一度CDBにOS接続した後に、ALTER SESSION文を発行することでデータベースへの接続時にパスワードを入力することなくPDBに管理者として接続できます。
SQL> connect / as sysdba 接続されました。 SQL> alter session set container=appdb; セッションが変更されました。 SQL> show user ユーザーは"SYS"です。
SYSDBAとしての接続に関しては以下のマニュアルも併せてご参照ください。
- DBAの認証 (「管理者ガイド」マニュアル)
- REMOTE_LOGIN_PASSWORDFILE (「リファレンス」マニュアル)
- SQLNET.AUTHENTICATION_SERVICES (「Net Services リファレンス」マニュアル)
Oracle Databaseでは、データベース管理者として接続するさまざまな方法があります。
DBA OSグループに関してはデータベースに閉じていない部分もありますので、業務上不要な人がデータベースに管理者として接続できないように、セキュリティ上の穴ができないように設計、運用をおこなってください。



