クライアント用 Wallet を作成する（Oracle Database 19c / mkstore)

# Walletの必要性
　クライアント・アプリケーションの認証には一般的にはパスワードを使用します。しかし自動的に定期実行されるバッチ・プログラムの場合、パスワード入力ができない場合がほとんどです。このためデータベース管理者権限を使って OS 認証（OSDBA）を使ったり、パスワードをスクリプトに直接埋め込むなどの手法がとられます。
　しかしこれらの手法はセキュリティ上好ましくないため、パスワードを安全に保存するための仕組みが必要です。ここでは Wallet と呼ばれる Oracle Database の機能を使って、特定のユーザー権限で接続するためにパスワードの入力を不要にする設定を検証します。

# Wallet の作成
Walletの実体は特定のディレクトリに保存された複数のファイルです。Walletの作成には mkstore コマンド($ORACLE_HOME/bin/mkstore) にディレクトリを指定します。以下の例では oracle ユーザーのホーム・ディレクトリに wallet1 ディレクトリを作成し、そこに Wallet を作成しています。Wallet 管理のためのパスワードを２回入力します。-wrl オプションがディレクトリの指定、-create オプションが Wallet の作成を指定しています。

```shell:
$ mkdir wallet1
$ mkstore -wrl $HOME/wallet1 -create
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.

Enter password: **Wallet管理パスワード**
Enter password again: **Wallet管理パスワード**
$
$ ls -l wallet1/
total 8
-rw------- 1 oracle oinstall 194 Jun 29 16:20 cwallet.sso
-rw------- 1 oracle oinstall   0 Jun 29 16:20 cwallet.sso.lck
-rw------- 1 oracle oinstall 149 Jun 29 16:20 ewallet.p12
-rw------- 1 oracle oinstall   0 Jun 29 16:20 ewallet.p12.lck
```

Wallet作成直後にディレクトリを確認すると、複数のファイルが作成されていることがわかります。

# Wallet に認証資格を格納
Wallet に認証情報を格納します。mkstore コマンドに -createCredential オプションを指定します。
このオプションには接続名とユーザー名を指定します。下記の例では接続名として o19a 、接続ユーザー名として scott を指定しています。データベース接続パスワードと、Wallet管理パスワードを入力します。

```shell:
$ mkstore -wrl $HOME/wallet1 -createCredential o19a scott
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.

Your secret/Password is missing in the command line
Enter your secret/Password: **データベース接続パスワード**
Re-enter your secret/Password: **データベース接続パスワード**
Enter wallet password: **Wallet管理パスワードパスワード**
$
```

# 認証資格の確認
Wallet に保存された認証資格を確認します。-listCredential オプションを指定します。Wallet 管理パスワードの入力が必要です。

```shell:
$ mkstore -wrl $HOME/wallet1 -listCredential
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.

Enter wallet password: **Wallet管理パスワードパスワード**
List credential (index: connect_string username)
1: o19u scott

```

# Wallet の場所を指定
　Oracle Database Client に Wallet の場所を知らせる必要があります。Wallet の場所は sqlnet.ora ファイルで指定します。下記の例では環境変数 TNS_ADMIN を Wallet 用ディレクトリに指定して、sqlnet.ora ファイルと Wallet ファイルを同居させています。
　Wallet の場所は WALLET_LOCATION パラメーターを指定します。SQLNET.WALLET_OVERRIDE パラメーターは、Wallet の資格証明を優先する設定です。

```shell:
$ export TNS_ADMIN=$HOME/wallet1
$ cat $HOME/wallet1/sqlnet.ora
WALLET_LOCATION =
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
  (DIRECTORY = /home/oracle/wallet1)
  )
 )
SQLNET.WALLET_OVERRIDE = TRUE
```

# 接続情報の格納
Wallet に保存した接続名と対応する名前を tnsnames.ora ファイルに格納します。

```shell:
$ cat $HOME/wallet1/tnsnames.ora
o19a =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.131)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = o19u)
    )
  )
$
```

# Wallet を使った接続
Wallet を使った認証を行う場合はユーザー名、パスワードを指定せずに tnsnames.ora の接続名のみで接続します。下記の例ではユーザー名とパスワードを指定していませんが、SCOTT ユーザーとして接続できていることがわかります。

```shell:
$ sqlplus /@o19u

SQL*Plus: Release 19.0.0.0.0 - Production on 木 6月 29 22:49:17 2023
Version 19.14.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

最終正常ログイン時間: 木 6月  29 2023 16:36:42 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
に接続されました。
SQL> SELECT USER FROM DUAL;

USER
--------------------------------------------------------------------------------
SCOTT

SQL>
```

# 複数の認証資格を保存
Walletには複数の認証情報を格納できます。下記の例では接続名として o19b を、ユーザ名に SCOTT2 を指定して２つ目の認証情報を保存しています。認証情報の一覧を表示すると、２つ目の接続情報が出力されます。

```shell:
$ mkstore -wrl $HOME/wallet1 -createCredential o19b scott2
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.

Your secret/Password is missing in the command line
Enter your secret/Password: **データベース接続パスワード**
Re-enter your secret/Password: **データベース接続パスワード**
Enter wallet password: **Wallet管理パスワードパスワード**
$
$ mkstore -wrl $HOME/wallet1 -listCredential
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.

Enter wallet password: **Wallet管理パスワードパスワード**
List credential (index: connect_string username)
2: o19b scott2
1: o19u scott
$
```

接続先としてユーザー名とパスワードを省略し、接続名 o19b を指定します（tnsnames.ora ファイルも修正します）。SCOTT2 ユーザーで接続が成功していることがわかります。

```shell:
$ sqlplus /@o19b

SQL*Plus: Release 19.0.0.0.0 - Production on 木 6月 29 23:35:14 2023
Version 19.14.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

最終正常ログイン時間: 木 6月  29 2023 23:33:16 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
に接続されました。
SQL> SELECT USER FROM DUAL;

USER
--------------------------------------------------------------------------------
SCOTT2

SQL>
```
Author: Noriyoshi Shinoda / Date: Jun 29, 2023