今さらですがsqlplusで/nologオプションを指定するメリットを知ったので軽く検証しました。
/nologオプション
SQL*Plusを起動する際、データベースに接続しない
メリット
一例として、データベースに接続せずにSQL*Plusを起動するため、UNIX系OSでpsやhistoryを実行した場合、DBユーザ名やパスワードが表示されない
製品バージョンによるかもしれませんが、SQL*Plus起動時にDBユーザ名やパスワードを指定した状態でダイレクトにDB接続すると、DBユーザやパスワードがpsで見れてしまうケースがあるそうです。(sqlplusプロセスの引数の情報もそのまま表示してしまうため)
historyにもコマンド履歴として残ります。
セキュリティ観点からパスワードが見れる(残ってしまう)のは好ましくありません。
SQL*Plus起動時に/nologオプションを指定して(sqlplus /nolog)、SQL*Plus起動後にDB接続(connect)すれば、psやhistoryでも「sqlplus /nolog」という情報しか残らなくなるため、パスワードが見れる(残る)という事象を防げます。
■検証環境
OS:Oracle Linux 6.5
DB/GI:Oracle Database 12c Release 1 (12.1.0.2.0) Enterprise Edition
※2ノードRAC(管理者管理型DB)
■前提
・非CDB
■検証パターン
①/nologオプションなしでDB接続
②/nologオプションありでDB接続
■検証
①/nologオプションなしでDB接続
/nologオプションを指定せず、SQL*Plusを起動してDB接続します
DB接続後、別セッションでpsコマンドでsqlplusプロセスの状態も確認します
【検証手順】
1. DBユーザおよびパスワードを指定してSQL*Plus起動(DB接続)
2. sqlplusプロセス確認
【作業ログ】
[oracle@node1 ~]$ sqlplus system/password
SQL> show user
ユーザーは"SYSTEM"です。
SQL> set lines 200 pages 3000
SQL> set tab off
SQL> select instance_name, status from v$instance;
INSTANCE_NAME STATUS
------------------------------------------------ ------------------------------------
orcl1 OPEN
2. sqlplusプロセス状態確認
SQL> !ps -ef | grep sqlplus | grep -v grep
oracle 4514 4425 0 12:44 pts/0 00:00:00 sqlplus
★psではDBユーザ名とパスワードは見えなかった
予想だがsqlplusプロセス名の右に15文字分の半角スペースがあるので、「system/password」という文字列をマスキングしているのかもしれない
[oracle@node1 ~]$ history | grep sqlplus | grep -v grep
1002 sqlplus system/password
★historyにはDBユーザ名とパスワードが残っている
②/nologオプションありでDB接続
/nologオプションを指定して、SQL*Plusを起動してDB接続します
SQL*Plus起動後・DB接続後、別セッションでpsコマンドでsqlplusプロセスの状態も確認します
【検証手順】
1. /nologを指定してSQL*Plus起動
2. sqlplusプロセス状態確認
3. DBユーザおよびパスワードを指定してDB接続
4. sqlplusプロセス状態確認
【作業ログ】
[oracle@node1 ~]$ sqlplus /nolog
SQL> show user
ユーザーは""です。
SQL> select instance_name, status from v$instance;
SP2-0640: 接続されていません。
2. sqlplusプロセス状態確認
SQL> !ps -ef | grep sqlplus | grep -v grep
oracle 6857 4425 0 12:50 pts/0 00:00:00 sqlplus
★今度はsqlplusプロセス名の右に6文字分の半角スペースがあるので、「/nolog」という文字列をマスキングしているのかもしれない
[oracle@node1 ~]$ history | grep sqlplus | grep -v grep
1008 sqlplus /nolog
★historyには「sqlplus /nolog」という文字列だけ残っている
3. DBユーザおよびパスワードを指定してDB接続
[oracle@node1 ~]$ sqlplus /nolog
SQL> connect system/password
接続されました。
SQL> show user
ユーザーは"SYSTEM"です。
SQL> select instance_name, status from v$instance;
INSTANCE_NAME STATUS
------------------------------------------------ ------------------------------------
orcl1 OPEN
4. sqlplusプロセス状態確認
SQL> !ps -ef | grep sqlplus | grep -v grep
oracle 7680 4425 0 12:53 pts/0 00:00:00 sqlplus
★psではDBユーザ名とパスワードは見えなかった
今回もsqlplusプロセス名の右に6文字分の半角スペースがある
[oracle@node1 ~]$ history | grep sqlplus | grep -v grep
1011 sqlplus /nolog
★historyには「sqlplus /nolog」という文字列だけ残っている
■参考資料
プログラム引数のセキュリティについて
■おわりに
検証した製品のバージョンによるかもしれませんが、12cR1ではsqlplusでDBユーザ名とパスワードを指定しても、psではDBユーザ名とパスワードは表示されませんでした。(スペースに置き換わってるように見えました)
特定の製品バージョンからsqlplusの引数をマスキングするようになったのかもしれません。
ただ、historyには残ってしまうのでセキュリティのことを考慮するなら/nologオプションでSQL*Plus起動後、sqlplus内でDB接続した方が安全だと思います。
なお、rootユーザからoracleユーザへスイッチと同時にDB接続したら、その情報がpsでも見えました。
su - oracle -c "sqlplus system/password"
[root@node1 ~]# su - oracle -c "sqlplus system/password"
SQL> show user
ユーザーは"SYSTEM"です。
SQL> select instance_name, status from v$instance;
INSTANCE_NAME STATUS
------------------------------------------------ ------------------------------------
orcl1 OPEN
SQL> !ps -ef | grep sqlplus | grep -v grep
root 8758 11549 0 12:55 pts/0 00:00:00 su - oracle -c sqlplus system/password
oracle 8759 8758 0 12:55 ? 00:00:00 sqlplus
[root@node1 ~]# history | grep sqlplus | grep -v grep
1025 su - oracle -c "sqlplus system/password"