Chienomi

EncFSの自動マウントとKeyring(Gnome Keyring)

Live With Linux::technique

(Dropboxのような)クラウドドライブで日記を共有したい、と考えたのがそもそもの話。

そこまで機密性が高いわけではないが、オープンにできるようなものでもない。 そのため、クラウドドライブ上では暗号化され、システム上では復号化されているようなものにしたい。

そこでEncFSを使うが、ポイントになるのはEncFSにある--extpassオプションである。これによってパスワードプロンプトを外部プログラムにすることができる。

単純には

encfs --extpass="zenity --entry --text='Password for EncFS'" ~/.Private ~/Private

のようにすればGUIプロンプトを作ることができるが、

encfs --extpass="cat $HOME/path/to/private.key" ~/.Private ~/Private

のようにすれば鍵ファイルを用いることも可能だ。

ちなみに、encfsuiは標準入力から読む-Sオプションを使っていたが、あまり良い方法ではないように見える。

GNOME Keyringをコマンドラインで扱う

Manjaroにはpython-keyringというパッケージがあり、このパッケージはkeyringというコマンドを含んでいる。

これによってGNOME KeyringやKwalletを扱うコマンドを得られるのだが、そもそもの話として/usr/bin/keyringが存在している。

だだ、pacman -Qo /usr/bin/keyring としても所属が不明であり、恐らく互換性があることから、上書きしてもよさそうだ。

EncFSをGNOME Keyringでマウントするためのシェルスクリプト

自動起動されることを想定しているため、通知はnotify-sendで行っている。

#!/bin/zsh

typeset -i retry=3

typeset ename="$1"
shift

mount_path="${@[-1]}"

if mount | grep -qF "$mount_path"
then
  notify-send -a openEncfs -t 5 -i lock "$mount_path is already mounted."
  exit 0
fi

if ! keyring get localencfs $ename > /dev/null
then
  notify-send -a openEncfs -t 5 -i lock "$ename doesn't exist in keyring."
  exit 1
fi

while (( retry >= 0 ))
do
  if encfs --extpass="keyring get localencfs $ename" -S "$@" >>| $HOME/.open_encfs.$ename.log 2>&1
  then
    notify-send -a openEncfs -t 5 -i lock "$mount_path is now avilable."
    exit
  fi
  notify-send -a openEncfs -t 5 -i lock "Failed to mount $mount_path, waiting for retry..."
  (( retry-- ))
  sleep 10
done

notify-send -a openEncfs -t 5 -i lock "Failed to mount $ename"

自動起動のための.desktopファイル

コマンドとして実行すれば良いため、別に .desktop ファイルは必要ないが、一応例として

[Desktop Entry]
Type=Application
Terminal=false
Name=EncFS with GNOME Keyring (docs)
Comment=Open EncFS with GNOME Keyring Script (docs)
Exec=open_encfs.zsh docs /home/jrh/.Private/docs /home/jrh/Private/docs
Icon=lock
Categories=Security;Settings;

鍵登録

当然ながら鍵が登録されていなければ意味がないので、

keyring set localencfs foo

のようにして鍵を登録しておく。

アップデートで鍵がない場合はチェックするようになった。