※ 本記事は2017年9月21日に公開されたものです。
バッチスクリプトにユーザー名/パスワードを書かないためのOracle Databaseの機能として、外部認証機能があります。これはOSやRADIUSなどデータベースの外部に認証を移譲する機能です。この機能を利用することでたとえば以下のようにユーザー名/パスワードを指定せずにデータベースに接続することができるようになります。
[puku@panca ~]$ sqlplus /@orclpdb SQL*Plus: Release 12.2.0.1.0 Production on 水 9月 20 10:31:15 2017 Copyright (c) 1982, 2016, Oracle. All rights reserved. Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production に接続されました。 SQL>
(2017/12/18追記) SYSユーザーが「/ as sysdba」とパスワードなしで接続できる機能とは別機能です。こちらの機能に関しては第5回「データベース管理者と認証」を参照してください
この方法を利用することでバッチスクリプトにユーザー名/パスワードを書かなくても、バッチを特定のOSユーザーから実行するとデータベースで改めてユーザー名/パスワードを聞かれることなくにログインして処理を実行することができるようになります。ただし、認証をOSに移譲しているだけであって、OSユーザーの管理がより重要になりますので必ずしもデータベースで認証するよりも安全とは限りませんので注意が必要です。バッチスクリプトはパスワード管理機能を持った運用ツールから実行したほうが安全ですが、Oracle Databaseにはこのような機能もあるということで紹介します。
OSで認証されるユーザーを作成するには、データベースユーザー作成時にパスワードを指定する代わりに外部ユーザーであること(identified externally)を指定して作成します。また、作成するユーザー名はOSユーザー名の先頭にOS_AUTHENT_PREFIX初期化パラメータの値を付けたもので作成する必要があります。OS_AUTHENT_PREFIX初期化パラメータのデフォルト値はops$ですので、たとえばOSユーザー名がpukuの場合、ops$pukuという名前でデータベースユーザーを作成する必要があります。ユーザーを作成するCREATE USER文は以下の通りです。
create user ops$puku identified externally;
データベースに接続する権限も併せて必要です。
grant create session to ops$puku;
つぎにOS認証を利用するための設定を確認していきます。
OS認証をおこなうためには、セキュリティの担保のために、リスナー経由のOracle Net接続ではなく、BEQプロトコルを利用する必要があります。なお、マルチテナント環境でないデータベースやマルチテナント環境のCDBの場合には、ORACLE_SID環境変数を設定することで接続先データベースを指定せずにBEQプロトコルで接続できますが、マルチテナント環境のPDBを利用する場合には、BEQプロトコルを利用する接続のための接続エントリをtnsnames.oraに記載する必要があります。tnnames.oraのサンプルは以下の通りです。
ORCLPDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = BEQ) (PROGRAM = oracle) (ARGS = '(DESCRIPTION = (ADDRESS = (PROTOCOL = BEQ)))')) (CONNECT_DATA = (SERVICE_NAME = orclpdb.jp.oracle.com)))
また、データベースの認証方式として、OSでの認証を許可するために、sqlnet.oraファイルのSQLNET.AUTHENTICATION_SERVICESパラメータにWindowsの場合はnts、それ以外のOSの場合にはbeqを含める必要があります。なお、SQLNET.AUTHENTICATION_SERVICESパラメータのデフォルトの値はallでこれはnts、beqを含むすべての認証方式を利用できる値ですので、特に設定しなくても接続可能になります。
それではOSにpukuユーザーで接続して、データベースに接続してみます。
[puku@panca ~]$ id uid=1001(puku) gid=100(users) 所属グループ=100(users) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [puku@panca ~]$ sqlplus /@orclpdb SQL*Plus: Release 12.2.0.1.0 Production on 水 9月 20 13:29:28 2017 Copyright (c) 1982, 2016, Oracle. All rights reserved. 最終正常ログイン時間: 水 9月 20 2017 10:31:15 +09:00 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production に接続されました。 SQL> show user ユーザーは"OPS$PUKU"です。 SQL>
上記のようにOSで認証されている場合には、データベースで再度認証されることなく接続することができます。
今回はバッチスクリプトにユーザー名/パスワードを記載しないように運用する際に利用できるOS認証の機能を紹介しました。ただし、繰り返しになりますがOSに認証を移譲しているだけで、データベースのパスワードの漏えいは防止できますが、OSアカウントをより厳重に管理する必要があり、システム全体のセキュリティを向上するためのものではありません。バッチの実行はパスワード管理機能を持った管理ツールから実行することをお勧めします。
