余白の書きなぐり

aueweのブログ

シェルスクリプトの平文パスワードをセキュアにする方法(続き)

この記事は、一年前に書いた シェルスクリプトの平文パスワードをセキュアにする方法 という記事の続きです。 なぜか今頃になって大量のはてブが付き、戦慄している次第です。 ブックマーカーのコメントには

  • chmod 700 の平文パスワードファイルを読み込むのと大差なくね。
  • 秘密鍵を使う方法は環境固定なのがイヤ。
  • GitHubシェルスクリプト共有するときに便利そう。

といった指摘が並んでいました。せっかくなので、少し補足します。

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秘密鍵をペアで管理する訳ですが、このペアは環境に依存しないので、各環境に配布することが可能です。 便利な使い方としては、例えばcronrsyncでパスワードファイルを各環境に同期すれば、Dropbox + KeePassのコマンドライン版を手軽に実装できます*3

GitHubシェルスクリプト共有するときに便利そう。

まさにそういう目的で前回の記事を執筆しました。 他人とシェルスクリプトを共有する際、スクリプトに自分専用の平文パスワードをべた書きするのは論外です。 対策として、パスワードを外部に保存してスクリプトから読みこめば、スクリプトを共有できると考えました。 しかし外部に平文のパスワードファイルを置くのも気持ち悪いと思い至り、前回記事の着想を得ました。

まとめ

要点は以下に集約されます。

  • opensslを使うことで、パスワードファイルのセキュリティコストをssh秘密鍵に負わせることが可能。
  • ssh秘密鍵にはパスワードが設定できる。
  • opensslは大抵の環境に入っているので、ソフトのインストールが制限されている環境でも使用可能。

こういう特性をうまく使って、各人にあった運用方法を探してね~

*1:そもそもsshログイン用の秘密鍵にパスワードを設定しないのは、かなり危険だと思う。もし秘密鍵が漏れた場合、その公開鍵が登録されてる全環境にログインされるので、二次被害が半端ない

*2:パスワードを保存したファイルを開くために、また別のパスワードが必要なのはナンセンスでは?という質問については、「パスワード管理ソフト」でググるのが教育的だと思う

*3:こういう秘密鍵の使い方は、公開鍵暗号システムの本質から外れていると思う。もっと良い方法がないものか