web-dev-qa-db-ja.com

hdd暗号化キーをマシンに保存せずに、起動時にマウントする方法は?

セットアップ:USBHDDを搭載したRaspberryPiを使用しており、Arch Linuxを実行しており、自分の「クラウド」同期に syncthing を使用しています。

問題:HDD piとHDDが盗まれた物理的な侵入の場合、HDD上のファイルの機密性を維持したいと思います。

現在の高レベルのアイデア:HDDを暗号化し、キーをWebサーバーに保存します。起動時に、キーをダウンロードし、復号化してマウントします。 HDD/SDカードにキーを保存しないでください。盗難の場合は、ウェブサーバーからのキーの提供を停止してください。

質問:これを実装するにはどうすればよいですか?

(crypttabはこれを解決できますか?私自身のsystemdユニットを作成する方法はありますか?他のアイデア、あるいは解決策さえも歓迎します)

4
kidmose

これを設定する最も簡単な方法は、クリアテキストのシステムパーティション(SDカード上にあると思います)と暗号化されたデータパーティションを用意することです。 dmcryptを使用して、サーバーからダウンロードしたキーファイルに保存されているキーを使用してデータパーティションを暗号化します。

最初にサーバーインフラストラクチャをセットアップし、次にキーファイルをダウンロードしてcryptsetup luksFormat /dev/sdb1 /run/data.keyfileで暗号化されたボリュームを作成するか、cryptsetup luksAddKey /dev/mapper/encrypted /run/data.keyfileで既存のボリュームにキーを追加します。パスフレーズまたはキーファイルのいずれかを使用してボリュームのロックを解除するように調整できることに注意してください。これは、管理に便利な場合があります(サーバーが使用できない場合でもパスフレーズを入力できます)。

キーファイルは特定の形式である必要はありません。サーバー上でランダムなバイトを生成するだけです。 16バイトで十分です(これ以上の場合はセキュリティが向上しませんが、それ以下の場合はパフォーマンスが向上しません):</dev/urandom head -c 16 >pi.keyfile

キーがスヌープされないように、HTTPSでキーを提供します。 CAによって検証された証明書がない場合は、独自の証明書を作成して/etc/ssl/certsに追加するか、ダウンロードコマンド(wget --ca-certificate /etc/local/my.certまたはcurl --cacert /etc/local/my.cert)に渡します。

暗号化ボリュームをアクティブ化する前に、キーをダウンロードする必要があります。あなたは1つのステップでそれを行うことができます

wget -nv -O - https://myserver.example.com/pi.keyfile | cryptsetup luksOpen /dev/sdb1 --key-file /dev/stdin
curl https://myserver.example.com/pi.keyfile | cryptsetup luksOpen /dev/sdb1 --key-file /dev/stdin

または、キーを一時ファイルにダウンロードしてからボリュームをアクティブ化し、最後に(必須ではありませんが、セキュリティが少し向上する可能性があります)一時ファイルを削除できます。この一時ファイルの自然な場所は/runにあり、これはRAMにあり、rootによってのみ書き込み可能です(永続ストレージにキーをダウンロードしないでください)。ファイルを作成する必要があります。ルートでのみ読み取り可能(ダウンロードする前にumask 700を設定して調整できます)。ただし、起動時に実行されるすべてのコードを制御しない場合にのみ問題になります。

キーを一時ファイルにダウンロードする場合は、キーファイルを/etc/crypttabに配置し、systemdユニットを追加して、暗号化されたボリュームをアクティブ化するキーファイルの前(ただしネットワークが使用可能になった後)に実行されるキーファイルと別のキーファイルをダウンロードできます。後でキーファイルを削除するユニット。 wget … | cryptsetup …/etc/rc.localに入れると、設定が簡単になります。

クライアントがキーをダウンロードするときに、クライアントを認証することをお勧めします。認証トークンは、Piにクリアテキストで保存する必要があります。 SSLクライアント証明書を使用できます。

curl --cert /etc/keyfile.cert https://myserver.example.com/pi.keyfile
wget --certificate /etc/keyfile.cert https://myserver.example.com/pi.keyfile

または、HTTP基本認証を使用したパスワード。 /root/.netrc に保存されます。

curl -n --user=pi https://myserver.example.com/pi.keyfile
wget --user=pi /etc/keyfile.cert https://myserver.example.com/pi.keyfile

基本認証の構成は、サーバー側で設定する方がおそらく簡単です。特殊文字を含まないランダムに生成されたパスワードを使用します(例:</dev/urandom | head -c 16 | base64)。

何をするにしても、Piを盗んだ人はパスワードを取得し、送信者側で最初にブロックしなければ、キーをダウンロードできることに注意してください。また、Piに物理的にアクセスできる人は、SDカードをすばやく引き出し、コピーを作成して、挿入し直すことができます。稼働時間以外を監視しない場合、これは電源障害のように見えます。それを完全に防ぐ方法はありません。キーをスマートカードに入れると、攻撃者はキーを複製できなくなりますが、スマートカードを盗んだり、その場でキーファイルをダウンロードしたりすることはできません。

繰り返しになりますが、物理的にアクセスできる人がキーファイルをすばやくダウンロードし、ディスクを盗んで、暇なときに復号化するのを防ぐことはできません。それから保護したい場合は、異なる価格帯の改ざん防止ハードウェアを調べる必要があります。

少し異なるソリューションを使用して同じ問題に対処しました。ZoLを使用していたため、EcryptFSを使用することを好みました。また、キーにアクセスできるようにしたかったので、暗号化してファイル交換サービス(Dropoboxなど)に保存しました。次に、手順は次のとおりです。

a) A systemd unit connects to the file exchange service, downloads the key and 
   decrypts it.
b) The dependent systemd units wait until the previous has finished and then use 
   the decrypted key to mount the file systems.
c) I have a service that monitors a box switch, so if the server box is opened I 
   receive an alert via pushbullet and the key is deleted from dropbox.

サーバーの物理的な整合性が損なわれたり、サーバーが盗まれたりすると、ドロップボックスからキーが削除され、データが読み取れなくなるという考え方です。

0
flix