スクリプトからecryptfsプライベートディレクトリを復号化できますか?
このタイプのアクティビティの基本的な使用例は、リモートバックアップを実行することです。写真(またはその他の機密情報)を保存する暗号化されたプライベートディレクトリを備えたマシン(privateboxと呼びます)があるとします。ログイン時にのみ復号化されます。また、プライベートボックスにログインし、ディレクトリを復号化して写真を追加し、再暗号化してログアウトするスクリプトをリモートマシンで記述できるようにしたいとします。すべてユーザーのインタラクティブな手順は必要ありません(おそらくcronから実行されます)。プライベートボックスのパスフレーズは、プレーンテキストなどでプライベートボックスに保存されないことに注意してください。また、暗号化されるため(更新時を除く)、誰かがSDカードなどを入手した場合に保護されます。
このようなスクリプトは(私の考えでは)次のように機能します。
Ecryptfsはこれを許可しないように特別に設計されているようです(SSHキーのトリックを使用しても、プライベートディレクトリを手動でマウントする必要があります)。
基本的に、私が探しているのは、「ecryptfs-mount-private」の非対話型バージョン、または誰かが解決策を知っている場合は同様のものです。何かのようなもの:
%ecryptfs-mount-private -p $ PASSPHRASE
パスフレーズを入力する代わりに渡すことができる場所。
Ecryptfsがこれを行うことができない場合、誰かが代替案を知っていますか?ありがとう!
さて、私はこれを理解しました。 Xen2050をご利用いただきありがとうございます。ここでは、(まだ)賛成票を投じるほどの評判はありません。
これが私のために働くbashスクリプトです:
#Set this variable to your mount passphrase. Ideally you'd get this from $1 input so that the actual value isn't stored in bash script. That would defeat the purpose.
mountphrase='YOURMOUNTPASSPHRASE'
#Add tokens into user session keyring
printf "%s" "${mountphrase}" | ecryptfs-add-passphrase > tmp.txt
#Now get the signature from the output of the above command
sig=`tail -1 tmp.txt | awk '{print $6}' | sed 's/\[//g' | sed 's/\]//g'`
rm -f tmp.txt #Remove temp file
#Now perform the mount
Sudo mount -t ecryptfs -o key=passphrase:passphrase_passwd=${mountphrase},no_sig_cache=yes,verbose=no,ecryptfs_sig=${sig},ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=no /home/user/.Private /home/user/Private
これを機能させるには、ファイル名の暗号化を無効にする必要があることに注意してください。ファイル名の暗号化を使用しようとすると、マウント中にライブラリエラーが発生しました。ファイル名を暗号化しないようにするには、Private /ディレクトリを作成するときに次を使用する必要があります。
ecryptfs-setup-private -n
これは今私のために働いています。
「なぜこのようにするのか」と言う人に応えて、私はログインごとに個人データをマウントしたいとは限りません。実際のユーザーログインパスワードを使用せずに、データをすばやくマウントする方法が必要です。データを他の人と共有したいとしますか?私は彼らに私のパスワードを与えなければならないでしょう。マウントパスフレーズを使用すると、基本的に、ログインよりも安全性が低いマウントパスワードを使用できます。これは、データを自動マウントしてフレーズをどこかに保存する場合にも役立ちます(おそらく、データのロックを解除するためのキーとしてUSBスティックに保存します)。ログインパスワードをプレーンテキストのどこにも保存したくありません。ただし、データの内容を知っていて、データ自体が自分のアカウントよりもプライベートでないことがわかっている場合、これは優れたソリューションです。
最初にecryptfs-add-passphrase
を使用して、パスフレーズをカーネルキーリングにパイプする場合のように、パスフレーズをカーネルキーリングに取り込むことができます(パスフレーズをプレーンテキストファイルに残さずに安全に保つことが懸念事項です)。
printf "%s" "passphrase" | ecryptfs-add-passphrase [--fnek] -
次に、mount.ecryptfs_private
を使用しました:
mount.ecryptfs_privateは、root以外のユーザーがプライベートディレクトリ(デフォルトでは〜/ Private)を暗号的にマウントするためのマウントヘルパーユーティリティです。
このプログラムは、オプションで1つの引数ALIASを取ります。 ALIASを省略した場合、プログラムはデフォルトで次を使用して「プライベート」を使用します。-$ HOME /.Privateをソースとして-$ HOME /プライベートを宛先として-$ HOME/.ecryptfs /Private.sig調号。
ALIASが指定されている場合、プログラムは次の場所でfstab(5)スタイルの構成を探します。-$ HOME/.ecryptfs/ALIAS.confおよび次の場所で調号を探します:-$ HOME/.ecryptfs/ALIAS.sig
マウントは、次の場合にのみ続行されます。-必要なパスフレーズがカーネルキーリングにあり、-現在のユーザーがSOURCEマウントポイントとDESTINATIONマウントポイントの両方を所有している-DESTINATIONがまだマウントされていない
このプログラムは次のようになります。
- sOURCEをDESTINATIONにマウントします
- ecryptfsファイルシステムとして
- aES暗号を使用する
- キーの長さが16バイト
- 署名が〜/ .ecryptfs /Private.sigにあるパスフレーズを使用する
または、man ecryptfs
を読み、キーファイルまたはファイル記述子または変数を使用して独自のmount
行を設定し、パスフレーズをmount
コマンドに適切と思われる方法で取得します。 mount -t ecryptfs [SRC DIR] [DST DIR] -o [OPTIONS]
のように、次のようなオプションに注意を払います。
passphrase_passwd=(passphrase)
The actual password is passphrase. Since the password is visible
to utilities (like ps under Unix) this form should only be used
where security is not important.
passphrase_passwd_file=(filename)
The password should be specified in a file with
passwd=(passphrase). It is highly recommended that the file be
stored on a secure medium such as a personal usb key.
passphrase_passwd_fd=(file descriptor)
The password is specified through the specified file descriptor.
openssl_keyfile=(filename)
The filename should be the filename of a file containing an RSA
SSL key.
etc...
しかし、ユーザーがログインするたびに暗号化されたディレクトリが復号化/マウントされている場合は、ログインするだけですよね。