シェルスクリプトの平文パスワードをセキュアにする方法(続き)
この記事は、一年前に書いた シェルスクリプトの平文パスワードをセキュアにする方法 という記事の続きです。 なぜか今頃になって大量のはてブが付き、戦慄している次第です。 ブックマーカーのコメントには
といった指摘が並んでいました。せっかくなので、少し補足します。
chmod 700 の平文パスワードファイルを読み込むのと大差なくね。
確かにその通りですね。 暗号化したパスワードファイルが盗まれる状況では、sshの秘密鍵も一緒に盗まれそうです。 そう考えると、平文のパスワードを外部ファイルに保存してパーミションを700に設定するのと、本質的に同程度のセキュリティしか担保されていません。
この問題を解決するのは簡単です。
ssh-keygen
で秘密鍵を作成する際にパスワードを設定すればよろしい*1。
こうしておけば、もし秘密鍵と暗号化したパスワードファイルの両方が盗まれたとしても、秘密鍵のパスワードが破られない限り複合できません。
もう少し具体的に書くと、まず
$ ssh-keygen -f pasu_tuki_rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): # パスワードを入力 Enter same passphrase again: # パスワードを再入力 Your identification has been saved in pasu_tuki_rsa. Your public key has been saved in pasu_tuki_rsa.pub. The key fingerprint is: ...
としてpasu_tuki_rsa
というパスワード付きの秘密鍵を作成します。
後は前回の記事に書いたのと同じ手順で暗号化や複合が可能ですが、その時にpasu_tuki_rsa
のパスワードを問われます*2。
秘密鍵を使う方法は環境固定なのがイヤ。
この問題については、パスワードファイル専用のssh秘密鍵を作ることで解決します。
パスワードファイルと(パスワード付きの)ssh秘密鍵をペアで管理する訳ですが、このペアは環境に依存しないので、各環境に配布することが可能です。
便利な使い方としては、例えばcron
とrsync
でパスワードファイルを各環境に同期すれば、Dropbox + KeePassのコマンドライン版を手軽に実装できます*3。
GitHub でシェルスクリプト共有するときに便利そう。
まさにそういう目的で前回の記事を執筆しました。 他人とシェルスクリプトを共有する際、スクリプトに自分専用の平文パスワードをべた書きするのは論外です。 対策として、パスワードを外部に保存してスクリプトから読みこめば、スクリプトを共有できると考えました。 しかし外部に平文のパスワードファイルを置くのも気持ち悪いと思い至り、前回記事の着想を得ました。
まとめ
要点は以下に集約されます。
- opensslを使うことで、パスワードファイルのセキュリティコストをsshの秘密鍵に負わせることが可能。
- sshの秘密鍵にはパスワードが設定できる。
- opensslは大抵の環境に入っているので、ソフトのインストールが制限されている環境でも使用可能。
こういう特性をうまく使って、各人にあった運用方法を探してね~