データベースのログイン資格情報(ユーザー/パス)を環境変数に設定すること、またはコマンドラインパラメーターとして渡すことを(セキュリティに関して)許容できるかどうか疑問に思っていますか?
おそらく他の人が環境変数を読み取ったり、実行中のプロセス/履歴を読み取ったり、資格情報がプレーンテキストで表示されたりする可能性があるため、これらの方法はどちらも私には危険なようです(私の理解はここで正しいですか?)
このログインを行うための許容できる方法は何でしょうか?自動化されたジョブ/プロセスの一部としてスクリプトで実行されます。
編集:これはOracleデータベース(11g)です
編集#2:Oracle Walletはある時点で検討されていましたが、私が働いている場所ではまだ使用できません。
私はOracleデータベース(またはそのことについてはデータベース)の経験はあまりありませんが、次のようにOracleウォレットでPerlソリューションが可能であるようです ここ (Google検索用語「Oracleデータベースパスワードなしログイン」)。
コマンドラインパラメータは、/proc/<pid>/cmdline
を介して誰でも読み取ることができます。すぐに終了するプロセスの場合でも、ps
のような監視プログラムを使用している人に表示することができます。
一方、メモリ内のパスワードは問題にはなりません。スーパーユーザー権限がないとメモリにアクセスできません。通常、安全なソフトウェアはメモリ内のパスワードを上書きしてから、他のプロセスに解放します。
最も一般的な方法は、ファイルのアクセス許可を使用することです。パスワードは、誰でも読むことができるはずの人だけが読むことができるファイルに入ります。したがって、ファイルとしての資格情報(キーまたはパスワード)は、一般的なコマンドラインリークから安全です。
DBクライアントを開くコマンドラインとpasswd送信を分離する必要があります。もちろん、RDBMS /クライアントが異なれば動作も異なります。 sqlplus
(デフォルトのORCLコマンドラインユーティリティ)の例を次に示します。
sqlplus /nolog<<!!
connect $USER/$PASSWD@$SID;
...
--some SQL
...
!!
これを行うと、ps
はプロセスのリストにpasswdを表示しません。
ベストプラクティスでは、パスワードをディスクまたはメモリにプレーンテキストで保存しないように指示されています。環境変数にも問題があります。本番システムが、「ps auxwwe」を定期的に実行し、出力をログファイルに書き込む監視プログラムを実行していた場合を想像してみてください。 sqlplusの資格情報が誤ってモニターログに書き込まれ、世界中で読み取れる可能性があります。より一般的なシナリオは、ログがSplunk/ElasticSearch/Hadoop/Logglyに送信されることです。
ここにファイルストリームを介して資格情報を安全に通信するプログラムを作成しました: https://github.com/ryanchapman/safe_sqlplus
資格情報がsqlplusプログラムに送信されると、safe_sqlplusはそれらが格納されていたメモリの部分をゼロにします。