忘れかけのIT備忘録

今まで学んできた知識や小技、なるほど!と思ったことをメモするブログです。

sqlplusの/nologオプション

今さらですが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プロセス確認

【作業ログ】

1. DBユーザおよびパスワードを指定してSQL*Plus起動(DB接続)
[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プロセス状態確認

【作業ログ】

1. /nologを指定してSQL*Plus起動
[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"