本記事は次の記事の続きになります。
Going home pic.twitter.com/gVaLIkcD1v
— Alex Orsholits (@highvis_supply) July 22, 2023
ClockworkPi uConsoleはストラップも付けられるその形状から、どんどん気軽に持ち歩くべきモバイル端末に思えます (上記Tweetの@highvis_supplyさんはモバイルを極めてらっしゃる)。ならば私は、もしもの時の紛失に備えて内部データを暗号化しておきたいし、uConsoleをGUI操作するときにはどこでも、可能ならば大きい画面やキーボードから遠隔操作して楽をしたい。そこで次の条件を満たすよう、uConsole環境を作り直してみることにしました。
今回はこれらを実現するための作業手順をメモします。
項目 | 内容 |
---|---|
機種 | ClockworkPi uConsole Kit RPI-CM4 Lite |
OSイメージ | uConsole_CM4_v1.3g_64bit.img.7z |
microSDカード | これを機会に添付品32GBから手元にあったSanDiskの高耐久な64GBへ交換 |
端末名 | uconsole |
初期ユーザ | user1 |
暗号化作業用の一時的なユーザ | user2 |
SanDisk 【 サンディスク 正規品 】メーカー 2年保証 ドライブレコーダー対応 microSDカード 64GB UHS-I Class10 U3 V30対応 SDSQQNR-064G-GH3IA 新パッケージ
SanDisk
Raspberry Pi (4系?) に「Raspberry Pi OS (bullseye)」を組み合わせた環境で、xrdpを通常通り導入した後、最初に作られている初期ユーザのデスクトップ環境にはRDP接続できない事情?バグ?があるらしい。原因を突き止めようとした私の実験でも、RDP接続を行うユーザがグループrenderに所属しているか否かでRDP接続の動作が異なることまでは分かりました (調査で数時間を溶かしたのは痛かった)。
これ面白いことがわかった。初期ユーザと同じ状態を作ろうとして、別のユーザを「render」グループに追加すると、RDPできなくなる。
— Masahiko OHKUBO (@mah_jp) July 22, 2023
「render」グループから抜くとRDP可能に戻る。
「render」というワードも加えて詳しく検索してみると、ラズパイ界隈では以前からある程度知られた問題らしくシンプルな対策方法も見つけたので、今回の手順にはこれを取り込んでいます。
user1
sudo raspi-config
を実行ssh -l user1 uconsole
sudo apt update; sudo apt install xrdp
/etc/xrdp/key.pem
を読み取れるように、ユーザxrdpをグループssl-certに所属させる:$ id xrdp
uid=116(xrdp) gid=124(xrdp) groups=124(xrdp)
$ sudo adduser xrdp ssl-cert
Adding user `xrdp' to group `ssl-cert' ...
Adding user xrdp to group ssl-cert
Done.
$ id xrdp
uid=116(xrdp) gid=124(xrdp) groups=124(xrdp),118(ssl-cert)
## Ref: https://github.com/neutrinolabs/xrdp/issues/2060#issuecomment-980071431
$ sudo cp -a /etc/X11/xrdp/xorg.conf{,.original}
$ sudo vi /etc/X11/xrdp/xorg.conf
$ diff /etc/X11/xrdp/xorg.conf{.original,}
54c54,55
< Option "DRMDevice" "/dev/dri/renderD128"
---
> #Option "DRMDevice" "/dev/dri/renderD128"
> Option "DRMDevice" ""
sudo raspi-config
を実行してAuto LoginなしのDesktopに切り替え: 1 System Options > S5 Boot / Auto Login > B3 Desktopssh-keygen -t ed25519
sudo update-locale LC_COLLATE=C
eCryptfsという便利な仕組みがあり、ユーザのホーム領域を未使用時には暗号化した状態にして、ユーザがログインするときに復号化状態のホーム領域としてマウントするという動作が簡単に実現できるとのこと。uConsoleの紛失への備えとしては、内部データ全て (microSD領域全体) を暗号化することがセキュリティ的にベターであろうが、今回はeCryptfsを使ったホーム領域の暗号化のみを目標とします。
なお、今回の手順のようにeCryptfsでホーム領域を暗号化した場合、「起動後のuConsoleでホーム領域がまだ復号化されていないときには、uConsoleへのSSHログインで公開鍵認証が利用できない」という弊害が生まれます。ユーザの秘密鍵が通常はホーム領域内 (~/.ssh/
) に保存されているためです。パスワード認証でのSSHログインは従来通り可能です。
上記の弊害と暗号化のメリットのバランスを理解したうえで進めるとして、作業手順は次の通りです。
user1@uconsole:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 60G 5.8G 51G 11% /
devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 760M 1.3M 758M 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/mmcblk0p1 253M 43M 210M 17% /boot
tmpfs 380M 20K 380M 1% /run/user/109
tmpfs 380M 24K 380M 1% /run/user/1000
sudo apt install ecryptfs-utils
sudo adduser user2 && sudo adduser user2 sudo
ssh -l user2 uconsole
## user2がrootになれることの確認
user2@uconsole:~ $ sudo whoami
[sudo] password for user2:
root
## user1が実行しているプロセスがないことの確認
user2@uconsole:~ $ pgrep -u user1
(なにも表示されない)
sudo ecryptfs-migrate-home -u user1
user2@uconsole:~ $ sudo ecryptfs-migrate-home -u user1
INFO: Checking disk space, this may take a few moments. Please be patient.
INFO: Checking for open files in /home/user1
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/109/gvfs
Output information may be incomplete.
Enter your login passphrase [user1]:
************************************************************************
YOU SHOULD RECORD YOUR MOUNT PASSPHRASE AND STORE IT IN A SAFE LOCATION.
ecryptfs-unwrap-passphrase ~/.ecryptfs/wrapped-passphrase
THIS WILL BE REQUIRED IF YOU NEED TO RECOVER YOUR DATA AT A LATER TIME.
************************************************************************
Done configuring.
chown: cannot access '/dev/shm/.ecryptfs-user1': No such file or directory
INFO: Encrypted home has been set up, encrypting files now...this may take a while.
sending incremental file list
./
.Xauthority
110 100% 0.00kB/s 0:00:00 (xfr#1, ir-chk=1025/1027)
.bash_history
1,360 100% 664.06kB/s 0:00:00 (xfr#2, ir-chk=1024/1027)
(途中省略)
Could not unlink the key(s) from your keying. Please use `keyctl unlink` if you wish to remove the key(s). Proceeding with umount.
========================================================================
Some Important Notes!
1. The file encryption appears to have completed successfully, however,
user1 MUST LOGIN IMMEDIATELY, _BEFORE_THE_NEXT_REBOOT_,
TO COMPLETE THE MIGRATION!!!
2. If user1 can log in and read and write their files, then the migration is complete,
and you should remove /home/user1.dDSN7Xlq.
Otherwise, restore /home/user1.dDSN7Xlq back to /home/user1.
3. user1 should also run 'ecryptfs-unwrap-passphrase' and record
their randomly generated mount passphrase as soon as possible.
4. To ensure the integrity of all encrypted data on this system, you
should also encrypt swap space with 'ecryptfs-setup-swap'.
========================================================================
user2@uconsole:~ $
ssh -l user1 uconsole
ecryptfs-unwrap-passphrase
を実行して、表示される32文字の文字列を大切にメモしておくuser2@uconsole:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 60G 5.9G 51G 11% /
devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 760M 1.3M 758M 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/mmcblk0p1 253M 43M 210M 17% /boot
tmpfs 380M 20K 380M 1% /run/user/109
tmpfs 380M 20K 380M 1% /run/user/1001
/home/user1/
にマウントが増えているuser1@uconsole:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 60G 5.9G 51G 11% /
devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs 1.9G 4.0K 1.9G 1% /dev/shm
tmpfs 760M 1.3M 758M 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/mmcblk0p1 253M 43M 210M 17% /boot
tmpfs 380M 20K 380M 1% /run/user/109
tmpfs 380M 20K 380M 1% /run/user/1001
tmpfs 380M 20K 380M 1% /run/user/1000
/home/user1/.Private 60G 5.9G 51G 11% /home/user1
sudo deluser --remove-home --remove-all-files user2
/home/user1.dDSN7Xlq
) を削除するちなみに、eCryptfsで暗号化されたファイルの実体は/home/.ecryptfs/$USER/.Private/
に保存されています。そこを覗いてみると、暗号化がファイル名・ディレクトリ名と中身のデータに対して実行されていることが分かります (ファイルをfileコマンドやhexdumpコマンドにかけると楽しい)。
今回のeCryptfsを使用する方法では、暗号化の対象がユーザのホーム領域のみです。したがってたとえば、Wi-Fi (無線LAN) のパスワードが直に書かれているファイル/etc/wpa_supplicant/wpa_supplicant.conf
は暗号化されないままです (wpa_passphraseというコマンドはあるが、これは人間に対する難読化を行うのみだという認識)。このファイルを暗号化領域に置くうまい方法がないか、一種のパズルを解くような感覚で少し思案中……。