Posts tagged ‘encrypt sensitive data with gpg and secret-tool’

自分謹製とは言えカードリーダーが今一つ不安なものになってしまったmicro SDの代わりに、非常時のために財布の中に入れておこうとして買ったカード型USBメモリも駄目だったので別のものを探しているうちに、まず、非常用メディア(USBメモリやmicro SD)をどうする(何をどうやって所持するか、データをどう格納するか)のが一番いいのかを考えるほうが重要なことに気付いて、そうした。

そして、当初は財布の中なら いつも持ち歩くから効果的だと考えて居たが、紛失した場合を考えると、その中に入れる情報によっては事態を更に悪化させることに気付いた。

具体的には、財布には免許証、クレジットカード、健康保険証などを入れているので、それだけでも大変なリスクだが(何とかしたいが、利便性を取って危ないままにして居る)、更に非常用データ(例: サーバのssh鍵)が一緒になったら、それこそ「何でもできそう」ではないか。

実際にはssh鍵にはパスフレーズを設定しているので、紛失しても直ちに危険にはならないが、繰り返せば当たる可能性もあるし、sshの設定など、その他のいろいろな情報を合わせると攻撃のヒントになるだろうから、油断はできない。

そこで、非常用メディアを部屋の鍵と一緒に持ち歩くことを考えた。こちらのリスクは、メディアに住所の書かれたデータが入っていた場合、部屋に泥棒に入られる可能性がある程度と考えた。

比較した当初は、財布のほうが住所・氏名が分かるから戻って来る可能性が高い(鍵だと何も分からないから、まず返って来ない)と考えたが、甘過ぎる想定なので却下した。もちろん戻らず、悪用されることを前提にしなければいけない。

そういう訳で、非常用USBメモリを部屋の鍵のキーホルダーに付けて持ち歩くことにした。鍵は財布同様かそれ以上に いつも持つだろうから有効そうだ。そして、格納するファイルには住所を書かない(書く場合は暗号化する)ことにした。同様に、サーバのssh鍵のように流出するとマズいものは暗号化して格納することにした。

キーホルダーに付けるのなら、大抵の(本体が丈夫でストラップ穴があれば良い)USBメモリが使えるようになって選択肢が増える。そして、たまたま(?)、昔 展示会でもらって、micro SDの前に非常用にしていたものがあるので、当面は それで試してみることにした。そして、(今更ながら、)先日のカード型USBメモリのような轍を踏まないように、メディア全体に書き込みと読み出しを行ってチェックしたところ、当然というか意外というか、全く問題がなかった。

このUSBメモリは通販で すごく良く見る、ちょっと柔らかいプラの本体に回転する金属のカバーが付いたもの(→ 。ただし、僕のは容量2GBでアクセスランプはない)で、いかにもいい加減なものだが、中身はちゃんとしていた。が、外見が同じでも中身が違う場合があるので、同じものを買っても大丈夫な保証は なさそうだ。

データの暗号化の方法については詳しくないので、なるべく安全そうで手軽なものを探した。ただ、Linux以外に(その気になれば)Androidでも復号できるようなオープンな仕様のものが良いので、gpgコマンドを使った。gpgは かなりいろいろなことができるが、(初歩的な?)パスフレーズ(パスワード)での暗号化(gpgの-cオプション, symmetric cipher)にした。GPGのキーを一緒に持ち歩いて別のシステムに再設定しなくても、パスフレーズを覚えていれば復号できるからだ。

暗号化アプリなんて山ほどあるだろうが、大抵は自分のことしか考えてない(例: 独自フォーマット)ため、上記のように、全く別のOSで復号するのが不可能なものが多そうだ。あと、アプリの寿命も重要で、知らないうちに消滅してしまって、いざという時に手に入らなかったら目も当てられない。

gpg以外では暗号化ZIPファイルでも同様なことが可能だが、Windowsが起源なのと、使い勝手が(UNIX的でなくて)好きでないので却下した。詳しくはないが、(総当り以外で)ZIPの暗号が破られたという話は聞かないから、実際には ZIPのほうがずっと手軽であろう。"PPAP"と叩かれたけど、使い方が誤っていただけで 仕組み自体に悪いことはない。

なお、gpg(symmetric cipher)で暗号化する時(非常用メディアにファイルを格納する時)にはパスフレーズを入力する必要があるが、定期的な更新時に毎回手で打ち込むのは面倒なので、GNOME keyringに格納しておき(seahorseやsecret-toolコマンドを使う)*、メディアの更新時にsecret-toolで取得してgpgに設定するようにした。※

*secret-toolは初めて使ったのだが、他の鍵(パスワード)と同様に格納するには、attributeとして"service"で種類を、"username"でその種類内の鍵の名前を指定すれいいようだ。以下に実行例を示す。

secret-tool store --label="非常用メディア" service "EmgData" username "ekey"

上を実行すると、パスフレーズを入力するダイアログが出て来る。

格納したパスフレーズを取得するのは簡単で、以下のようにすれば良い。

secret-tool lookup service "EmgData" username "ekey"

※具体的には、以下のようにしてgpgにパスフレーズ($pass_phrase)と圧縮アーカイブ($cmp_arch)を入力している。

( cat << /EOF/
$pass_phrase
/EOF/
cat "$cmp_arch" ) | gpg -c --batch --pinentry-mode loopback --passphrase-fd 0

パスフレーズをechoやgpgの引数で指定するとpsコマンドで見えてしまうので、避けた。ファイルディスクリプタ(--passphrase-fd)を9とかにすれば もっと分かりやすそうだが、すぐには できなかったので0(stdin)にした。

ファイルディスクリプタを変えるのでなく、FIFOを使って渡すのがいいのかも知れないが、煩雑だし、FIFOはファイルだから逆に脆弱になるのかも知れない。

厳密に見れば弱いところがあるが、デスクトップに侵入されて(、自分のメモリ空間を見られまくられて)いる状態を想定し出すと何もできなくなってしまうので、今のところは これで良しとした。

gpgでファイル単位で暗号化することもできるが、煩雑に思えたので、暗号化するディレクトリ全体のアーカイブを圧縮したもの(例: tar+gz)を暗号化するようにした。

この用途にはgpgtarというコマンドがあって便利だが、下記の更新チェックをするために使っていない。

それから、無駄にメディアに書き込まないよう(寿命を延ばすためと、安物のせいか、たまに書き込みが すごく遅いことがあるため)、更新していないファイルを書き込まないようにした。暗号化してないものはrsyncでできるが、暗号化したものは難しい(煩雑な)ので、圧縮したアーカイブ全体のハッシュ(例: MD5)で判定するようにした。メディアを更新した時に そのハッシュも保存し、次回の比較に使う。

なお、gpgで暗号化すると全く同じデータでも毎回中身が異なるので(全然分からないが、時刻でパラメタ(シード?)が変わる?)、暗号化前のハッシュを使うことにした。

 

以上のような処理(+その他細かい いろいろ)をする同期(転送)スクリプトを作り、定期的に非常用メディアを更新するようにし、使い勝手やメディアが壊れないかやその他の問題の有無を見て行こうと思っている。

まあ、このメディアを使うことがないのが一番だがね・・・

 

PS. その後、(上のプログラムを作る時からやろうと思って居たのだが、)スマフォにも非常用データを同期するようにした。

元々、スマフォからカメラなどの画像を自動取得するプログラムがあるので、その「ついで」に非常用データを転送するようにした。転送する部分は、上のUSBメモリへの転送スクリプトを ほとんどそのまま使えた(転送先を指定できるようにしただけ)。

自動取得するプログラムは、カメラ情報に追加同期コマンドを設定できるようにし、それが設定されていたら定期的(例: 8時間)に実行するようにした。その時、転送先として画像取得用にマウントしているスマフォのディレクトリを指定する。

これで、仮に非常用USBメモリがなくても、スマフォがあれば何とかなるようになった(はず)。 (4/26 11:31)

  •  1
  •  0
Keys: , ,