Linuxシステムをクラウドプロバイダーで実行しています。LUKSを使用して暗号化されたコンテナーを作成し、個人データを保存しています。
暗号化されたコンテナは手動で/srv
にマウントされます。システムの残りの部分は暗号化されていないため、サーバー、特にsshデーモンはシステムの起動時に自動的に起動します。
現時点で、サーバーが再起動した場合(再起動が必要な更新のため、または液滴が実行されるホストシステムが再起動を必要としたため)、LUKSコンテナーを手動で開き、暗号化されたパーティションにデータを格納するサービスを開始する必要があります( dovecot、mysqlなど)。もちろん、これは暗号化されたパーティションを持つことの論理的な帰結です。しかし、これを安全な方法で自動化できるかどうか疑問に思っていました。
明らかな理由により、パスフレーズをサーバーに保存したくありません。そこで、自宅のRaspberry Piで実行する小さなスクリプトを書きました。サーバーに5分ごとにssh-esし、ループバックデバイスがマウントされているかどうかを確認します。そうでない場合は、コンテナをマウントします(スクリプトの関連する行、これは、/srv
がマウントされていない場合にのみ実行されます)。
# Mount Srv Container
ssh root@<ip> "echo -n '*** my passphrase ***' | cryptsetup luksOpen /root/srv_container_file container -"
ssh root@<ip> "mount -t ext4 /dev/mapper/container /srv"
# Start Services that store data on /srv
# ...
アプローチは機能しますが、非常にハッキーな感じがします。常時接続(別名アクティブチェック)が良い考えであるかどうかわからない。また、パスフレーズをcryptsetup
にエコーすることによって脆弱性に自分自身をさらしているかどうかもわからない。
したがって私の質問:
サーバーにパスフレーズを保存せず、システムを脆弱性にさらすことなく(手動でコンテナーを開くのと比較して)LUKSコンテナーを自動的に開くには、良い/標準的な方法は何ですか?公式ドキュメントへの参照は大歓迎です。
自分を守ろうとしていることは何ですか?
私のディスクイメージが物理ストレージに移動されるかどうかはわかりません(プロバイダーのドキュメントによると、ディスクイメージは重複して保存されています)。そのため、私がこれらのブロックにアクセスできる人がデータを復元できるようにしたくありません。 。
攻撃者が実行中のシステムにシェルアクセスできるようになると、パーティションが開いていてパスフレーズが必要ないため、ゲームオーバーになります。
ローカルマシンで定期的にサーバーにクエリを送信し、必要に応じてキーをサーバーにプッシュするのではなく、逆の方法でローカルマシンからサーバーにキーを取得させることができます。サーバーとクライアントはSSHを使用して相互に認証できるため、ローカルマシンのストレージまたはリモートマシンのストレージにアクセスできるアクティブな攻撃者がキーを盗む必要があります。攻撃者が受動的であり、リモートマシンのディスクの内容のみを読み取ることができ、それに対してアクションを実行できない場合(たとえば、実サーバーにSSHで接続してバックドアすることにより)、パスワードをプルすることは安全です。具体的な実装はあなた次第ですが、次のような場合もあります。
サーバーが起動し、ローカルマシンに接続して、キーを要求します。
サーバーとローカルマシンはSSHを介して相互に認証します。
オプションで、2つのマシンは、もう一方が正しいIPから接続していることを確認できます。
認証後、サーバーはローカルマシンからキーを取得します。
脅威モデルにはリモートサーバーのストレージへの完全なアクセス権を持つ攻撃者が含まれると指定したので、保護できるのはパッシブな敵からのみであり、ストレージを両方読み取ることができる人は保護できないことに注意してくださいand MITM接続、または盗まれた資格情報を使用して直接SSHで接続します。