[23ai] 廃止されたリモートOS認証に対応する！（Wallet認証）

## 確認したこと
Oracle Database 23ai でのWallet認証を行った。

SQL*Plus から sqlplus /@p23 のようにして、
ID/PASSWORDなしで、特定のDBユーザでログイン可能になります。

##### <なぜ確認した>
・パスワードなしで接続可能となるリモートOS認証は、セキュリティ強化のため
　Oracle Database 11.1 で非推奨になりました。
　21cではサポート終了し、使用不可となりました。

　しかし、以前リモートOS認証を使用していたシステムからのリプレイスで
　ID/PASSWORDなしでのログインを継続して行いたいという要望があり、代替機能を調査しました。

## Wallet認証とはなにか？
sqlplus /@p23 のようなコマンドで別のサーバにあるDBにログインできます。
ID/PASSWORDは不要です。


```
★19cのデータベースサーバから、23aiのデータベースサーバへWallet認証で接続する例★

[oracle@host01 ~]$ sqlplus /@p23

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jul 21 11:02:54 2024
Version 19.3.0.0.0

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

Last Successful login time: Fri Jul 21 2024 10:41:54 +09:00

Connected to:
Oracle Database 23ai Free, Release 23.0.0.0.0 - Developer-Release
Version 23.4.0.24.05

★接続できた
SQL>
```

## 設定方法
・23ai（サーバ側）　　　：DBユーザの作成（Wallet認証したいDBユーザがすでに存在すれば、本手順は不要）
・19c（クライアント側）：Wallet作成、sqlnet.ora変更、tnsnames.ora変更


### 23ai：接続用DBユーザ作成
PDB「FREEPDB1」に、DBユーザ「test」を作成します。パスワードは「test」です。


```
[oracle@host01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on 木 7月 20 23:34:33 2024
Version 23.4.0.24.05

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



Oracle Database 23ai Free, Release 23.0.0.0.0 - Developer-Release
Version 23.4.0.24.05
に接続されました。
SQL> alter session set container=freepdb1;

セッションが変更されました。

SQL> create user test identified by test;

ユーザーが作成されました。

SQL> grant create session to test;

権限付与が成功しました。

SQL> exit
Oracle Database 23ai Free, Release 23.0.0.0.0 - Developer-Release
Version 23.4.0.24.05との接続が切断されました。
[oracle@host01 ~]$
```

### 19c（クライアント側）の操作　全3手順

#### 19c：①tnsnames.oraに23aiへの接続を追記
接続文字列「p23」として、23aiのDBサーバへの接続を作成します。
HOST=のIPアドレスや、SERVICE_NAMEは実際の環境にあわせて変更してください。

ファイル場所の例：/u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora
```
p23 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 111.222.333.444)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = dedicated)
      (SERVICE_NAME =freepdb1)
    )
  )
```



#### 19c：②Wallet作成
Wallet（DBユーザのID/PASSと、関連する接続文字列を設定する）

最初にWalletをといういれものを作成します。それを次の手順でsqlnet.oraで読み込むようにします。
また①で作成した接続文字列に対して、WalletにDBユーザ情報を追加します。

```
★★Wallet作成（初回のみ）
[oracle@host01 admin]$ cd /u01/app/oracle/product/19.3.0/dbhome_1/network/admin
[oracle@host01 admin]$ mkstore -wrl wallet -create
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

★8文字以上 英数字のものを指定。これがウォレット・パスワードとなる。
パスワードの入力: 
パスワードの再入力:

★Walletが作成されたことを確認
[oracle@host01 admin]$ ls -lt wallet/
合計 8
-rw-------. 1 oracle oinstall 573  7月 21 12:58 cwallet.sso
-rw-------. 1 oracle oinstall 528  7月 21 12:58 ewallet.p12
-rw-------. 1 oracle oinstall   0  7月 21 12:57 cwallet.sso.lck
-rw-------. 1 oracle oinstall   0  7月 21 12:57 ewallet.p12.lck

★Wallet内のDBユーザ表示（最初は何もなし）
[oracle@host01 admin]$ mkstore -wrl wallet -listCredential
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

★Wallet作成時に入力した、ウォレットパスワードを入力
ウォレット・パスワードを入力してください:
List credential (index: connect_string username)


★★WalletにDBユーザ認証情報を追加
★接続識別子「p23」、DBユーザ名「test」に関する情報を追加

[oracle@host01 admin]$ mkstore -wrl wallet -createCredential p23 'test'
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

コマンド・ラインでシークレット/パスワードが欠落しています
★DBユーザのパスワードを入力
シークレット/パスワード入力:
シークレット/パスワード再入力:

★Wallet作成時に入力した、ウォレットパスワードを入力
ウォレット・パスワードを入力してください:


★★Walletに認証情報が追加されたことを確認
[oracle@host01 admin]$ mkstore -wrl wallet -listCredential
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

★Wallet作成時に入力した、ウォレットパスワードを入力
ウォレット・パスワードを入力してください:
List credential (index: connect_string username)
1: p23 test　★接続文字列 p23 を使ったときに、DBユーザ test で接続しにいくという設定がはいった
[oracle@host01 admin]$
```



#### 19c：③sqlnet.oraにWallet配置場所を追加
sqlnet.oraファイルにWalletに関する情報を追加します。
手順②で作成したWalletの場所を指定しています。

ファイル場所の例：/u01/app/oracle/product/19.3.0/dbhome_1/network/admin/sqlnet.ora

```
WALLET_LOCATION =
 (SOURCE =
 (METHOD = FILE)
 (METHOD_DATA =
 (DIRECTORY = /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/wallet)
 )
)

SQLNET.WALLET_OVERRIDE = TRUE
```


## 設定後の接続確認

ID/PASSWORDなしで接続できることを確認します。
p23という接続文字列にDBユーザ名とパスワードが紐づいているため
DBユーザごとに、接続文字列が必要になります。

```
[oracle@host01 admin]$ sqlplus /@p23

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jul 21 13:10:30 2024
Version 19.3.0.0.0

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


Connected to:
Oracle Database 23ai Free, Release 23.0.0.0.0 - Developer-Release
Version 23.4.0.24.05

SQL>
```