コマンドライン版パスワード・ロッカーの作り方

 ご多分に漏れず、私もパスワードが多すぎて覚えきれない。そこで、dialogGnuPG(GNU Privacy Guard)を使って、パスワードを整理・保管するための簡易パスワード・ロッカー・スクリプトを作ってみた。はじめにマスター・パスワードを尋ねるダイアログ・ボックスを表示し、そこで入力されたパスワードを使ってパスワード・ファイルを復号しテキスト・エディターで開く。ユーザーがエディターを閉じたらパスワード・ファイルを再び暗号化する、というスクリプトだ。

 dialogというのはテキスト・ベースのメッセージと入力ボックスを表示するncursesベースのユーティリティーだ。GnuPGはOpenPGP規格のフリー実装で、どちらもDebianベース・システム上でバイナリー・パッケージとして入手可能である。

 さて、何はともあれ、暗号化キーがなければ始まらない。そこで、コマンド「gpg --gen-key」を実行すると、生成するキーの種類を尋ねるプロンプトが表示された。選択肢には「sign only」(署名のみ)という注記のあるものもあるが、今はデータを暗号化するためのキーが必要なので「DSA and Elgamal」(「sign only」の注記はない)を選んだ。この後、質問がいくつか続いたが、重要なのは「Real Name」に対する入力だ。これは暗号化する際に使うので、覚えておくこと。

 暗号化キーの準備ができたので、次にパスワード・ファイルを暗号化する。そこで、URLとパスワードを含むファイルを作って「paswords」という名前で保存し、コマンド「gpg -e -r "Duane Odom" passwords」を実行した。このコマンドは、パスワード・ファイルを「Duane Odom」(暗号化キーを生成する際に「Real Name」として入力したもの)宛に暗号化し、passwords.gpgというファイルを作る。そして忘れずに、平文のパスワード・ファイルを削除した。

 これで、GnuPGキーと暗号化パスワード・ファイルの用意ができたので、いよいよパスワード・ロッカー・スクリプトの作成に取りかかる。下のコードはその冒頭部分だ。1行目はtempfileコマンドを使って適切な一時ファイル名を生成している。2行目は、スクリプトの終了の仕方に関わらず、この一時ファイルが必ず削除されるようにする仕掛けだ。3行目は、dialogコマンドを使ってユーザーにGnuPGパスワードを尋ね、その入力を標準エラー出力にリダイレクトして、先ほど作っておいた一時ファイルに書き出す。ユーザーが「Ok」ボタンまたは「Cancel」ボタンのいずれを押したか、あるいは異常が発生したかは、戻り値で判断できる。「0」は「Ok」ボタンの押下、「1」は「Cancel」ボタンの押下、「-1」は異常の発生または「Esc」キーの押下を意味する(dialogコマンドのmanページにあるように、ほとんどのシェル・スクリプトは-1と255を区別しない。そこで、このスクリプトでは「-1」ではなく、より標準的な「255」を使っている)。

TEMPFILE=`tempfile 2>/dev/null` || TEMPFILE=/tmp/`basename $0`.tmp
trap "rm -f $TEMPFILE" 0 1 2 5 15
dialog --backtitle "Password Database" --title "Master Password" --clear --insecure --passwordbox "Enter the Password Database master password." 10 51 2> $TEMPFILE

 次に重要なのはパスワード・ファイルを復号するところで、コードは次の通り。catコマンドを使って、ファイル中のパスワードをgpgに流し込んでいる。パラメーター--passphrase-fd 0は、パスワードが標準入力で与えられることを意味する。

cat $TEMPFILE | gpg -d -r "$KEY_RECIPIENT_NAME" -o $PASSWD_LIST_UNENCRYPTED --passphrase-fd 0 $PASSWD_LIST &> /dev/null

 最後に、復号したパスワード・ファイルをユーザーのデフォルト・エディターで開く。そして、エディターが終了する(用が済んでユーザーがエディターを閉じる)のを待ち、終了したらパスワードを再度暗号化し、平文のファイルを削除する。

$EDITOR $PASSWD_LIST_UNENCRYPTED 2> /dev/null; gpg -e -r "$KEY_RECIPIENT_NAME" -o $PASSWD_LIST $PASSWD_LIST_UNENCRYPTED; rm $PASSWD_LIST_UNENCRYPTED;;

 このスクリプトは便利に使える。というのは、(ちょっと変更すれば)文書や画像やスライドショーなどを暗号化して保存しつつ、編集も簡単にできるからだ。暗号化したいファイルがたくさんある場合は、Truecrypt翻訳記事)を使ってファイル内に仮想暗号化ディスクを作り、本当のディスクとしてマウントする方法もある。

 ところで、他人が作ったスクリプトを盲目的に信用してはならない。それがセキュリティーに関するスクリプトなら、なおさらだ。いつもやっているように、gpgコマンドとdialogコマンドのmanページを読み確認すること。

NewsForge.com 原文