Oracle SQL Developer から OS 認証で SYSDBA 接続する

SQL Developer については、こちらの記事で Oracle Instant Client を使った環境の導入方法をご紹介しました。その環境を使って、OS認証で SYSDBA 接続(sqlplus で言うところの as sysdba)してみます。
尚、OS は Windows10 で、Oracle 19c を利用しています。

SYSDBA 権限

Oracle では ロール等を用いた一般ユーザに対する権限管理とは別に、管理者用の特別な権限があります。それはシステム権限と呼ばれ SYSDBA 権限もそのひとつです。SYSDBA 以外にも、SYSPOER等いくつかあります。詳細は「データベース管理者ガイド 1.6.1 管理権限」 にありますが、これらはシステム固定になります。少し考えればわかることですが、ユーザを作成したり、そのユーザに grant 文で権限を与えたりするのが管理者なので、その管理者ユーザそのものや権限はどうしてもシステム固定になってきます。
つまり「システム権限」というものはデータベースで管理されていない(ロール等で定義されていない)特殊な権限ということになります。
では DBA ロールとは何が違うんだという疑問が沸く方もいらっしゃると思いますが、DBA ロールはあくまでもロールです。権限を追加したり、削除したりできるロールのひとつに過ぎません。ただデフォルトで存在する一番強い権限を持つロールということです。ちなみにDBA権限ではデータベースを停止したりできません。そういう意味では最強の権限ってわけでもないのです。
尚、SYSDBA 権限を持つ唯一のユーザは SYS になります。パスワードはインストール時に設定しますね。sqlplus で SYSDBA 権限で接続する場合は以下のように接続します。

sqlplus sys/*******@orcl as sysdba
sqlplus による sysdba 権限で接続

では、SYSDBA権限で接続するためには、SYS ユーザでログインするしかないかというとそういうわけではなく、所定の認証方式であれば可能です。

・オペレーティング・システム(OS)認証
・パスワード・ファイル(KerberosおよびSSL認証サービスを含む)
・Oracle Internet Directoryなどのディレクトリ・ベースの認証サービスによる強力な認証

データベース管理者ガイド 1.6.3.1 データベース管理者の認証方法について

今回はこの中の「オペレーティング・システム(OS)認証」で接続してみます。

Windowsユーザの登録

OS認証ですから、まずはOSであるWindowsにユーザ登録します。視覚的にわかりやすいように GUI でやってみます。ドメイン参加しているのであれば、ドメインユーザでも問題ありません。

OSユーザ登録

次にそのユーザを「ORA_DBA」グループに所属させます。ORA_DBA グループは、Oracle インストール時に自動で作成されており、この設定がまさにユーザに対して「SYSDBA 権限を与える」という行為となります。

ORA_DBAグループに所属

この組み込みのグループには色々と種類があります。詳細は「管理者リファレンス 複数のデータベースに対する管理者権限、オペレータ権限およびタスク固有の権限の手動による付与の概要」を参照ください。

sqlnet.ora の作成

関連記事 では説明を端折っていますが、sqldeveloper.bat 内に記載する環境変数 TNS_ADMIN に記載したフォルダに “sqlnet.ora" を配置してください。中身は以下の通りです。

SQLNET.AUTHENTICATION_SERVICES= (NTS)

これが、Oracle に接続する際にOS認証をしますよ、という設定になります。

追加したWindows ユーザで SQL Developer を起動する

Oracle にも SQL Developer にも、最初に登録した Windows ユーザである “testuser" は設定していません。OS 認証とは、認証行為そのものを OS に任せる、という意味になります。つまり、OSに対して該当するユーザでログインする行為が「認証」となるということになります。
Windows そのものに"testuser" でログインしても良いのですが、SQL Developer を「別ユーザで実行」することで模擬してみましょう。SQL Developer の実行ファイル(sqldeveloper.bat)を選択して「シフト(Shift)」を押しながら右クリックしてみてください。「別のユーザとして実行」というメニューが出てくると思いますので、これを選択します。

シフト(Shift)+右クリック

ユーザIDとパスワードを聞いてきますから、ここで最初に登録したWindowsユーザとパスワードを入力してください。

ユーザID・パスワードの入力

すると、これまでと別のユーザでの実行になるので、初回実行のときと同じダイアログが表示されます。設定情報は完全にユーザ単位となっていますので、Oracle Instant Client の設定を関連記事を参照して行っておいてください。

OS 認証で SYSDBA 接続

サンプルのデータベースORCL に対して、OS ユーザで接続する設定を追加します。ここでのポイントは、認証タイプを「OS」(=OS認証)として「ユーザ名を設定しない」です。
「テスト」ボタンで「成功」と表示されればOK です。

OS 認証 SYSDBA 接続を追加

例えば、本記事の最初のステップで、このユーザ("testuser")を ORA_DBA グループに所属させるのを忘れていたり、sqlnet.ora の作成ができていないと、テストボタンでは以下のように「ORA-01017」のエラーになります。

ORA_DBAグループに所属しないユーザの場合

SYSDBA 接続されたときのユーザ

これでデータベースには接続できるわけですが、ORACLE 上ではどのユーザとしてログインされているのかを確認してみます。接続後に以下のSQLでカレントユーザを確認してみます。

SELECT SYS_CONTEXT('USERENV','CURRENT_USER') FROM DUAL;
カレントユーザの確認

なんと「SYS」ユーザですね。OS 認証で SYSDBA 接続するのは、SYS ユーザでログインするのと同等というこです。マニュアルに記載されてる通りでした。

管理権限で接続すると、通常ユーザー名に関連付けられていない現行スキーマで接続が確立されます。SYSDBAの場合、現行スキーマはSYSですSYSOPERの場合、現行スキーマはPUBLICです。SYSBACKUPSYSDGおよびSYSRACの場合、現行スキーマは名前解決のためのSYSです。ただし、SYSKMの現行スキーマはSYSKMです。

データベース管理者ガイド 1.6.2 管理権限で許可されている動作

このように OS 認証させるユーザは自由ですが、接続した先の ORACLE でのユーザは、そのシステム権限に応じて固定となるわけです。SYSOPER 権限の場合は「PUBLIC」ユーザです。