スクリプトから Oracle Database に接続して何かしらの処理を実行させる際、パスワードをスクリプト内に記載したり、外部定義にパスワードをそのまま書いたりしていませんか?
平文でパスワードを記載するのはセキュリティの観点から非常に危険です。
そこで、パスワードを外部に保存し、安全に接続することのできる Oracle Wallet 機能を紹介します。
Oracle Walletとは
パスワードを外部ファイル(ウォレット)に保存しておき、ユーザー名/パスワードを指定せずにデータベースに接続することができます。
ウォレットは暗号化され、パスワードで保護されています。(パスワードがないと保存した情報が参照できません)
Oracle Wallet 使用方法
tnsnames.oraの作成
まずはDBアクセスに使用するために、tnsnames.oraを作成します。
ネットサービス名を”hogehoge”、接続するDBサービス名を”hoge”として作成します。
$ mkdir /home/oracle/wallet
※DB接続するスクリプト専用として作成するので、$ORACLE_HOME/network/admin 配下にあるtnsnames.oraとは別で作成します
$ vi /home/oracle/wallet/tnsnames.ora
hogehoge =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = hoge)
)
)
$
sqlnet.oraの作成
sqlnet.oraにWalletで必要になるパラメータを記載します。
$ vi /home/oracle/wallet/sqlnet.ora
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/home/oracle/wallet)))
SQLNET.WALLET_OVERRIDE=TRUE
$
Oracle Walletの作成
書式: mkstore -wrl <Walletファイルを保存するディレクトリ> -create
$ mkstore -wrl /home/oracle/wallet -create
Enter password: Wallet本体のパスワードを入力
Enter password again: Wallet本体のパスワードを入力(確認用)
$
以下のファイルが作成されます。
$ ls -l /home/oracle/wallet/
-rw------- 1 oracle oinstall 120 Jul 9 23:33 cwallet.sso
-rw-rw-rw- 1 oracle oinstall 0 Jul 9 23:33 cwallet.sso.lck
-rw------- 1 oracle oinstall 75 Jul 9 23:33 ewallet.p12
-rw-rw-rw- 1 oracle oinstall 0 Jul 9 23:33 ewallet.p12.lck$
Oracle Walletに接続DBユーザとパスワードを登録
書式: mkstore -wrl <Walletファイルディレクトリ> -createCredential <ネットサービス名> <接続DBユーザ名>
今回はdbsnmpユーザに対してwalletを作成してみます。
$ mkstore -wrl //home/oracle/wallet -createCredential hogehoge dbsnmp
Your secret/Password is missing in the command line
Enter your secret/Password: 接続DBユーザ(dbsnmp)のパスワード
Re-enter your secret/Password: 接続DBユーザ(dbsnmp)のパスワード
Enter wallet password: Wallet本体のパスワード
Create credential oracle.security.client.connect_string1
$
Oracle Walletの内容確認
Wallet内に登録されている情報を表示します。
書式: mkstore -wrl <Walletファイルディレクトリ> -listCredential
$ mkstore -wrl /home/oracle/wallet -listCredential
Enter wallet password: Wallet本体のパスワード
List credential (index: connect_string username)
1: hogehoge dbsnmp ←登録したネットサービス名と接続DBユーザが表示される
$
DB接続確認
$ export TNS_ADMIN=/home/oracle/wallet
$ sqlplus /@hogehoge
SQL> show user
USER is "DBSNMP"
SQL>
最後に
Oracle Database に接続するスクリプトにパスワードをハードコードしている場合は、セキュリティ向上のため Oracle Wallet によるパスワード隠蔽化をオススメします。
今回はOracle Walletを使用したセキュリティ対策を紹介しましたが、Oracle データベースのセキュリティ観点はたくさん存在します。
私は以下の書籍で学習しました。データベースは重要なデータを扱うことが多いと思いますので、堅いシステム構築の参考になればと思います。