余白の書きなぐり

aueweのブログ

UNIXの設定ファイル中の平文パスワードを暗号化してセキュアにする方法

UNIX系の設定ファイルの中にパスワードを書くのは、あまりにインセキュアで躊躇われる。 たとえばCUIメーラーの雄 muttGmail を使う場合、~/.muttrc

# ~/.muttrc for Gmail
set imap_user = "YOUR.EMAIL@gmail.com"
set imap_pass = "パスワード"
set smtp_url = "smtp://YOUR.EMAIL@smtp.gmail.com:587/"
set smtp_pass = "パスワード"

といった具合にパスワードを書く必要がある。
参考:
brew - mutt + Gmailを使ってCUIでのメール環境を作る - Qiita

いくらなんでもセキュリティ的にアレすぎるので、平文のパスワードを暗号化してセキュアにしよう。 大抵のUNIXの設定ファイルには、外部ファイルを読み込む source コマンドが実装されている (source できない設定ファイルはクソすぎる)。従って

  1. 設定ファイルのパスワード部分を、外部ファイルの plain.txt に分離
  2. plain.txt を暗号化して pass.rsa にする
  3. アプリケーションの起動時に pass.rsa を復号化しつつ、元の設定ファイルにsourceする

という手続きを踏むことになる。 .muttrc を例に順番に説明しよう。

1. パスワード部分を plain.txt に分離

set imap_pass = "パスワード"
set smtp_pass = "パスワード"

を外部のplain.txtに保存する。

2. plain.txt を暗号化して pass.rsa にする

次に plain.txt を暗号化する。 こういう場合には opensslを使うのが便利だ。 その辺の詳しい事情は以前の記事にまとめてある。

暗号化のやり方だけを抜粋すると、コマンドラインで以下のコマンドを叩けばよい。

# plain.txt というテキストファイルを暗号化して pass.rsa に書き込むコマンド
$ openssl rsautl -encrypt -inkey ~/.ssh/id_rsa -in plain.txt > pass.rsa

これでpass.rsaが作成されるはずだ。 もしエラーが出た場合には、ssh-keygenすれば多分解決する。 詳しい話はシェルスクリプトの平文パスワードをセキュアにする方法 - 余白の書きなぐりを参照。

3 pass.rsa を復号化しつつ、元の設定ファイルにsourceする

最後に pass.rsa を復号化して、.muttrcに読み込む作業が残っている。 これは .muttrc を以下のように書き換えることで実現できる。

# ~/.muttrc for Gmail
set imap_user = "YOUR.EMAIL@gmail.com"
set smtp_url = "smtp://YOUR.EMAIL@smtp.gmail.com:587/"
source "openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in pass.rsa |"

sourceの使用は設定ファイルによってマチマチなので個別に対応せねばならないが、 多くの場合は上記のように source "openssl ... |" で正しく動くと思う。