以前、Raspberry Pi を使用して安全な「使い捨てハック ボックス」を作成する方法について説明しましたが、もう一度戻ってそのプロセスを見てみましょう。前回これを取り上げたときからすべての新しい Raspberry Pi モデルと Kali が変更されたため、古いプロセスを更新する必要があることがわかりました。
レビューとして、私たちが達成しようとしているのは、発見されたときに、あなたが何をしていたかを簡単に把握できないスタンドアロンの「置き去り」デバイスを作成することです.そのため、LUKS フルディスク暗号化と LUKS Nuke 機能を組み合わせて使用します。 Raspberry Pi 3 Model B+、またはその他のモデルや同様のデバイスをお持ちの場合は、以下の手順を使用して独自の安全なシステムをセットアップしてください。この更新されたプロセスは、以前のドキュメントに基づいており、いくつかのコミュニティの提案で更新されています。
プロセスの概要
達成しようとしている技術に飛び込む前に、Raspberry Pi 3 Model B+ (以降「RPi」と呼びます) のセットアップに関する目標を簡単に見てみましょう。
<オール>これは多くのように思えるかもしれませんが、非常に単純で、完了すると、RPi が起動し、DHCP から IP を取得し、Dropbear が SSH 経由で接続して LUKS キーを提供できるようになります。これにより、RPi をヘッドレスで実行しながら、データを安全に保つことができます。その後、処理が完了したら、LUKS NUKE を使用してデータを取得するか、リモート インしてデータを破棄できます。
ベース システムの準備
まず、RPi イメージを SD カードに書き出す必要があります。ここでは詳しく説明しませんが、ドキュメントでその方法に関する情報を見つけることができます。
それが邪魔にならないように、SDカードをRPiに挿入して起動させます。最初の起動時に、SD カードのサイズを変更して再起動すると、使用できるようになります。次に、SSH 経由で接続し、Kali を更新して、必要ないくつかのパッケージをインストールします。
apt update
apt dist-upgrade
apt install cryptsetup lvm2 busybox dropbear
マジックフーをする
RPi はすべてセットアップされ、準備ができているので、手を汚して物事に飛び込みましょう。このプロセスを開始すると、RPi インストールのいくつかの重要なファイルが変更されることに注意してください。準備が整うまで、デバイスを再起動したり、システムをシャットダウンしたりしないことが重要です。そうしないと、システムが起動しなくなります。
まず、/boot/config.txt に行を追加する必要があります :
echo initramfs initramfs.gz followkernel >> /boot/config.txt
次に、実際のルート ファイルシステム デバイスがどこにあるかを検証します。
[email protected]:~# cat /etc/fstab
# proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
ルート ファイルシステムが /dev/mmcblk0p2 にあることに特に注意してください .これは今後の例で使用するものなので、システムで受け取った値で指示を更新してください。
ルート ファイルシステムの場所がわかったので、/boot/cmdline.txt を編集します。 .デフォルトでは、以下が含まれます:
[email protected]:~# cat /boot/cmdline.txt
dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0
root=/dev/mmcblk0p2 というエントリに注意してください . cryptdevice で更新します 値:
root=/dev/mapper/crypt cryptdevice=/dev/mmcblk0p2:crypt
変更を加えると、ファイルは次のようになります。
[email protected]:~# cat /boot/cmdline.txt
dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mapper/crypt cryptdevice=/dev/mmcblk0p2:crypt rootfstype=ext4 rootwait rootflags=noload net.ifnames=0
/etc/fstab も編集する必要があります ルートファイルシステムが現在 /dev/mapper/crypt であるデバイスを置き換えます :
[email protected]:~# cat /etc/fstab
# proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mapper/crypt / ext4 defaults,noatime 0 1
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
次に、/etc/crypttab を作成する必要があります 以下を含むファイル:
crypt /dev/mmcblk0p2 none luks
ここでは特に注意してください。エントリ間のセパレータは タブでなければなりません 、スペースではありません。ここで、initramsfs の作成を開始する前に、cryptsetup を強制的に含めるためのちょっとしたハックを行う必要があります。これを行うために、偽の LUKS ファイルシステムを作成します。私たちは追加します 空のファイルを LUKS としてフォーマットし、マウントして、ファイルシステムを配置します。
dd if=/dev/zero of=/tmp/fakeroot.img bs=1M count=20
cryptsetup luksFormat /tmp/fakeroot.img
cryptsetup luksOpen /tmp/fakeroot.img crypt
mkfs.ext4 /dev/mapper/crypt
この例でのみ使用されるため、この fakeroot に強力なパスワードを設定することについてあまり心配する必要はありません。
SSH と Initramfs のセットアップ
今、私たちはホームストレッチをしています。通常、LUKS を実行しているシステムが起動すると、起動プロセスが一時停止して、LUKS キーで HDD のロックを解除できるようになるため、この部分は非常に優れています。ヘッドレス システムを実行している場合、これは特に便利ではありません。
これを回避するために、Dropbear を設定して起動し、SSH で認証できるようにしてから、接続して LUKS パスワードを提供します。すべてリモートからです!
まず、/etc/dropbear-initramfs/authorized_keys にファイルを作成します。 以下を含む:
command="export PATH='/sbin:/bin/:/usr/sbin:/usr/bin'; /scripts/local-top/cryptroot && kill -9 \`ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3\` && exit"
注意することが重要です。これはすべて 1 行で行う必要があります。そこに改行はまったくありません。この設定が正しく行われている場合、次のようになります:
[email protected]:~# cat /etc/dropbear-initramfs/authorized_keys
command="export PATH='/sbin:/bin/:/usr/sbin:/usr/bin'; /scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3` && exit" ssh-rsa AAAAB3NzaC... [email protected]
次に、/usr/share/initramfs-tools/scripts/init-premount/dropbear に小さな変更を加えます .この変更は、Dropbear が起動する前にネットワークが設定されていることを確認するために、Dropbear を遅くする必要があるという事実によるものです。
# On NFS mounts, wait until the network is configured. On local mounts,
# configure the network in the background (in run_dropbear()) so someone
# with console access can enter the passphrase immediately. (With the
# default ip=dhcp, configure_networking hangs for 5mins or so when the
# network is unavailable, for instance.)
[ "$BOOT" != nfs ] || configure_networking
run_dropbear &
echo $! >/run/dropbear.pid
シンプルな睡眠を追加したい 次のようなステートメント:
[ "$BOOT" != nfs ] || configure_networking
sleep 5
run_dropbear &
echo $! >/run/dropbear.pid
これで、initramfs を作成する準備が整いました!
mkinitramfs -o /boot/initramfs.gz
続行する前に、カスタマイズした変更が新しい initramfs に反映されていることを確認します:
lsinitramfs /boot/initramfs.gz | grep cryptsetup
lsinitramfs /boot/initramfs.gz | grep authorized
それが検証されたら、すべての変更がディスクに書き込まれ、RPi がシャットダウンされることを確認します。
sync && sync
init 0
バックアップと復元
RPi から SD カードを取り外し、最初に SD カードの書き込みに使用したシステムに戻ります。環境を準備しましょう:
ls -al /mnt/{chroot,backup,encrypted}
# Please make sure there is nothing here first before you move on, otherwise you will have a bad day.
rm -rf /mnt/{chroot,backup,encrypted}
mkdir -p /mnt/{chroot,backup,encrypted}
SD カードを挿入し、デバイス ID を検証します。この場合、デバイスは /dev/sdc2 です しかし、あなたのものは異なるかもしれないので、システムで必要に応じて調整してください。デバイスをマウントし、ファイルシステムのバックアップを作成します:
mount /dev/sdc2 /mnt/chroot/
rsync -avh /mnt/chroot/* /mnt/backup/
umount /mnt/chroot
それが完了したら、SD カードの既存の 2 番目のパーティションを削除し、LUKS 暗号化用に設定した空のパーティションを再作成します。
echo -e "d\n2\nw" | fdisk /dev/sdc
echo -e "n\np\n2\n\n\nw" | fdisk /dev/sdc
パーティションが更新されたら、partprobe を実行して再読み込みします 次に、新しいパーティションで LUKS を構成します:
cryptsetup -v -y --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sdc2
cryptsetup -v luksOpen /dev/sdc2 crypt
mkfs.ext4 /dev/mapper/crypt
ルートファイルシステムのバックアップを暗号化されたパーティションに復元します。
mount /dev/mapper/crypt /mnt/encrypted/
rsync -avh /mnt/backup/* /mnt/encrypted/
sync
umount /mnt/encrypted/
cryptsetup luksClose /dev/mapper/crypt
テスト中
SD カードを RPi に戻して起動できます。ブートを見ると、Dropbear が起動していることがわかります。その時点で、システムに SSH 接続してドライブのロックを解除できるはずです。
[email protected]:~# ssh -o "UserKnownHostsFile /dev/null" [email protected]
The authenticity of host '10.42.42.94 (10.42.42.94)' can't be established.
ECDSA key fingerprint is SHA256:L+QVP+OmncGDleuEoj77OlRGuCji2gp0c1gMYjUupU0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.42.42.94' (ECDSA) to the list of known hosts.
Please unlock disk /dev/mmcblk0p2 (crypt):
cryptsetup (crypt): set up successfully
Connection to 10.42.42.94 closed.
カーリーの力と組み合わされたこれらの小さなデバイスの多様性は、私たちを驚かせることを決して止めません.これで、比較的自信を持って操作できる優れたヘッドレス システムが残されました。たとえそれが発見されたとしても、簡単に侵入することはできません。
しかし、まだ終わりではありません。 LUKS NUKE 機能をいくつか追加しましょう:
cryptsetup luksDump /dev/mmcblk0p2
cryptsetup luksAddNuke /dev/mmcblk0p2
SSH 接続すると、SD カードのロックを解除して起動プロセスを続行できるようにするために入力できるパスワードと、LUKS ヘッダーを破壊してデータにアクセスできなくする別のパスワードがあります。デバイスを取得できない状況に陥った場合、デバイスを焼き付けるこのオプションは非常に役立ちます。あなたが本当に派手にしたい場合は、これをRPiをワイヤレスアクセスポイントにすることと組み合わせることもできます.これは、RPi が接続されるネットワークに継続的に直接アクセスできない場合に非常に便利です。