※ 本記事は2017年9月29日に公開されたものです。
第52回ではバッチファイルにパスワードを記載せずにデータベースに接続する機能としてOS認証を紹介しましたが、Oracle Databaseでは認証時にユーザー名/パスワードを指定せずに接続する機能としてもうひとつ外部パスワードストア機能があります。
外部パスワードストア機能を利用すると下記のようにユーザー名/パスワードを指定せずにデータベースに接続することができます。
[puku@panca ~]$ sqlplus /@orclpdb SQL*Plus: Release 12.2.0.1.0 Production on 木 9月 28 09:26:43 2017 Copyright (c) 1982, 2016, Oracle. All rights reserved. 最終正常ログイン時間: 水 9月 27 2017 21:05:25 +09:00 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production に接続されました。 SQL> show user ユーザーは"APP1_RONLY"です。 SQL>
OS認証と違うのは事前に指定した任意のユーザーで接続でいきることです。また、OS認証と外部パスワードストア機能が両方設定されている場合には、外部パスワードストアによる認証が優先されます。ユーザー名/パスワードを明示的に指定した場合には、OS認証よりも外部パスワードストアによる認証よりも、明示的に指定したユーザー名/パスワードによる認証が優先されます。
外部パスワードストアの実体はWalletと呼ばれる認証情報を暗号化・パスワードで保護して安全に格納するPKCS#12という標準フォーマットのOSファイルです。このWalletの場所をsqlnet.oraに記載するのですが、OSユーザーごとに個別のWalletを利用ために、sqlnet.oraをOSユーザーごとに分ける必要があります。そのためにはOSのTNS_ADMIN環境変数で利用するsqlnet.oraファイルを格納するディレクトリを指定する必要があります。
export TNS_ADMIN=/home/puku/tnsadmin
TNS_ADMIN環境変数を指定すると、いままでデフォルトの$ORACLE_HOME/network/admin以下を参照していたネットワーク関連のファイルを指定したディレクトリを参照するようになりますので、sqlnet.oraファイルだけでなく、tnsnames.oraファイルもこのフォルダに作成する必要があります。
tnsnames.oraファイルに接続したいデータベースの接続情報を、sqlnet.oraファイルに外部パスワードストアの利用のための以下の設定をおこないます。
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /home/puku/wallet))) SQLNET.WALLET_OVERRIDE = TRUE
Walletを配置するディレクトリを指定したら、Walletを作成します。
Walletの操作にはmkstoreコマンドを利用します。Walletを作成するには以下のコマンドを発行します。
mkstore -wrl <Walletを作成するディレクトリ> -create
[puku@panca ~]$ mkstore -wrl /home/puku/wallet -create Oracle Secret Store Tool: バージョン12.2.0.1.0 Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. パスワードの入力: ← Walletのパスワードを入力 パスワードの再入力: ← Walletのパスワードを再入力 [puku@panca ~]$
コマンドが成功すると指定したディレクトリにWallet本体(ewallet.p12)と自動ログインウォレット(cwallet.sso)が自動的に作成されます。
[puku@panca ~]$ ls -l /home/puku/wallet 合計 8 -rw-------. 1 puku users 194 9月 27 20:45 2017 cwallet.sso -rw-------. 1 puku users 0 9月 27 20:45 2017 cwallet.sso.lck -rw-------. 1 puku users 149 9月 27 20:45 2017 ewallet.p12 -rw-------. 1 puku users 0 9月 27 20:45 2017 ewallet.p12.lck [puku@panca ~]$
Walletが作成されたら、Walletにデータベースへの接続情報を追加します。
以下のコマンドを発行します。
mkstore -wrl <Walletを作成したディレクトリ> -createCredential <接続文字列> <DBユーザー名>
[puku@panca ~]$ mkstore -wrl /home/puku/wallet -createCredential orclpdb app1_ronly Oracle Secret Store Tool: バージョン12.2.0.1.0 Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. コマンド・ラインでシークレット/パスワードが欠落しています シークレット/パスワード入力: ← DBユーザーのパスワードを入力 シークレット/パスワード再入力: ← DBユーザーのパスワードを再入力 ウォレット・パスワードを入力してください: ← Walletのパスワードを入力 [puku@panca ~]$
以上で外部パスワードストアを利用する準備は完了です。
あとはデータベースにユーザー名/パスワードを指定せずに接続すると事前に指定したユーザーでデータベースに接続できます。
[puku@panca ~]$ sqlplus /@orclpdb SQL*Plus: Release 12.2.0.1.0 Production on 水 9月 27 21:05:25 2017 Copyright (c) 1982, 2016, Oracle. All rights reserved. 最終正常ログイン時間: 水 9月 27 2017 20:58:03 +09:00 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production に接続されました。 SQL> show user ユーザーは"APP1_RONLY"です。
それぞれのデータベース(接続文字列)ごとに作成できる事前定義の接続設定はひとつですが異なるデータベース(接続文字列)に対しては別のユーザーで接続設定を定義することができます。前回紹介したOS認証と同じくOSにデータベースへの接続の認証を移譲する機能であるため、OSのアカウント管理がより重要になり、かならずしもセキュリティ向上につながるわけではありませんが、バッチスクリプトにデータベースのユーザー名/パスワードを記載しないで済み、かつデータベースユーザー名を自由に指定できるためOS認証よりも使い勝手が良い機能です。バッチスクリプトにパスワードが記載されている場合にはこの機能の利用も検討してみてください。
