macOSに乗り換えて感じたLinuxデスクトップの根本的な問題点

Posted on Apr 14, 2024

M2 Miniに乗り換えてなんだかんだ経ちましたが、進学して新しい生活の準備をする中で思ったLinuxデスクトップの欠点をだらだらと書いていこうというだけの話です。

2024年のLinuxデスクトップ

Waylandの導入やらAMDの躍進、Steam Deckの登場などで苦手とされていたゲームやグラフィック周りもだいぶまともになってきてそれなりに使えるようにはなってると思う。
Flatpakやらsnap、AppImageなどのプロジェクトの成果もあってLinuxデスクトップに対応するプロプライエタリなソフトウェアもだいぶ増えている気がします。

分数スケーリングやX vs Waylandの問題

わたしはGnomeのデザインが好きで愛用していたのですが、ディスプレイを1440pのものにしたら問題が発生しました。
分数スケーリングをdconfで有効にしてもWayland非対応のアプリ(JetBrainsのIDEとかTermiusとか)にはスケーリングが適用されずぼやけます。Gnomeのメンテナ曰くこれは「仕様」らしいです。かといってX11のセッションでログインするとそもそもスケーリングが壊れます。
その後あるきっかけからPlasmaをしばらく使っていました。スケーリング自体は快適でしたが、どうしてもUIが馴染まない部分があり微妙に不安定でしっくり来ない感じでした。
作ってる人たちはボランティアなので文句を言う筋合いはありませんが、やっぱりLinuxデスクトップのグラフィック周りはまだ発展途上なんだなあといった感じで、今後もうちょっと安定して使えるようになればいいなと思ってます。

持ち運ぶ時に問題になるセキュリティ機能の不足

モバイル・デスクトップ問わず最近のほぼ全てのOSはハードウェアにある程度安全に保管された鍵を使ったディスク(もしくはファイル)暗号化をシームレスに行えます。
WindowsにはBitLocker、macOSにはFileVault、AndroidやiOSやChromeOSでも何らかの形で「ユーザーが意識せずに使えるディスク暗号化」が備わっています。
Linuxにもdm-cryptを使用したディスク暗号化機能がありますが、残念ながら現状のほぼ全てのディストリビューションは自動復号化に対応していないため、これを行うと基本的に毎回パスワードを入力する必要が出てきます。ログインパスワードと合わせると計2回パスワードを入力しないとログインできません。
これの根本原因はLinuxカーネルやディストリビューションの問題というよりも、Linuxディストリビューションの多くがコミュニティベースであるが故に起動時にシステムの整合性を検証する方法が限られているからだとわたしは思ってます。

ハードウェアベースのディスク暗号化はデスクトップとモバイルで微妙に原理が異なりますが、基本的な理屈は同じです。 そもそも自動で復号化されるということは起動時に何らかの形で復号化に必要な鍵がロードされたシステムに渡されるということです。このロードされたシステムが認証されたユーザー以外は操作できないことを前提として成り立っています。

前提としての留意事項

そもそもセキュリティに「完璧」など存在しません。ハードウェアで保護された鍵を使うディスク暗号化にもどこかしら弱点はあるでしょう。
ただしこれは外国の諜報機関が狙うとかでもない限り問題にならないレベルだと思ってます。“デバイスが盗難された時にデータが漏洩するリスクを減らしたい”、“急死したときに遺品のデバイスを解析されてダウンロードした画像やTwitterやPixivのいいね欄を覗かれて、家族や身内に性癖がバレるのを防止したい” といった目的である限りは十分役立ちます。少なくともディスクを暗号化しない、もしくは4桁のPINでのみ暗号化する場合よりも遥かに強力です。

モバイル

モバイルデバイスではブートローダーが特定の鍵で署名されたファイルしかロードしないことで正規のシステム以外に鍵が渡らないようになっています。
BLUすると暗号化の意味がほぼなくなるのはこれが理由です。Androidデバイスにはハードウェアに格納された鍵で保護されるファイルとユーザーが設定したPINでも保護されるファイルがそれぞれ存在します。しかしブートローダーが任意のファイルを実行してしまう場合、デバイスを盗んだ人がデバイスから鍵を抜き出してハードウェアに格納された鍵で復号化されるファイルを解読できてしまうだけではなく、PINを自動で総当たりするプログラムを動かしてデバイスの事実上全てのファイルを解読できてしまいます。

デスクトップ

デスクトップやPCでは少し話が変わります。モバイルデバイスとは異なり一般的に市販されているPCはOSを入れ替えることができます。
PCでのセキュアブートはモバイルデバイスほど強力ではありません。仮にセキュアブートが有効になっていたとしてもMicrosoftの鍵で署名されたブートローダーであれば読み込まれてしまいます。つまりモバイルデバイスのようにセキュアブートで検証されたシステム全てに鍵を渡してしまうというのは危険です。ではBitlockerは危険なのかというとそんなことは決してありません。
現代のほぼ全てのPCにはTPMと呼ばれるセキュリティチップが備わっています。システムが起動する時にどの構成、ファイルやパラメーターで起動したかがTPMのPCRと呼ばれる層に保存されます。例えは一般的なLinuxシステムでのPCRの値はこんな感じで設定されます。TPMのPCRについてはこの辺のページでも詳しく説明されています。

Bitlockerは復号化に必要な鍵を保存する時にどのPCR値が同じなら鍵を渡すかをあらかじめ設定しておきます。こうすれば改ざんされたOSや外部のOSがロードされても鍵が渡る心配はありません。

LinuxシステムでもClevisというツールを使えばPCRに紐付けて鍵を保存し、LUKSで保護されたドライブを起動時に自動で復号化させることができます。
ただしこれはあまり実用的ではなく、そもそもLinuxシステムでは肝心のPCRがBIOSやUEFIの設定を変えるほどの変更を行わなければ変化しないもの(PCR7とか)かアップデートの度に変化するようなもの(PCR9とか)しかありません。(少なくとも実際にわたしの環境でやった限りはそうでした)
つまり前者のみに紐付けるとカーネルパラメーターのinit/bin/shにすれば簡単に突破できるようなもはやセキュリティでも何でもない雑魚暗号化となってしまい、かといって後者に紐付けるとカーネルやブートローダーのアップデートの度にパスワードを入力しなくてはならないという何とも不便な有様になってしまいます。
Ubuntu23.10で実験的にTPMを使ったLUKSに対応したり、Ubuntu Coreではsnapdを使ってカーネルを管理することでいい感じの自動復号化を実現したりとそれなりに進歩は見られますが残念ながら一般的なLinuxシステム(デスクトップ・ラップトップ・サーバー)で安定して使えるものではありません。

アプリケーション間の分離がない

macOSやAndroidには同一ユーザーが実行しているアプリでも別のアプリやユーザーファイルに過度に干渉できないようにする仕組みが備わっています。例えばmacOSではアプリがドキュメントディレクトリにアクセスしたり画面録画をしたりしようとするとユーザーに許可を求めるダイアログが表示されます。AndroidやiOSでのサンドボックスはさらに強力で、ユーザーが作成したファイルを除いて基本的に全てのアプリのデータは他のアプリからはアクセスできないようになっています。このおかげで悪意のあるアプリがインストールされても各種ウェブサイトのセッショントークンが格納されているブラウザのCookieのDBなどにアクセスされる心配がありません。

一方、一般的なWindows環境にはそのようなセキュリティ機構は存在しません。サンドボックスがないどころかカーネルレベルで動作するアンチチートすら一般的になっています。 Microsoftが署名したやつしかロードされないためこれはそこまで問題ないらしいです。アンチチート以外でもVPN用の各種ドライバーとかがカーネルレベルで動作するものらしい。
Linuxデスクトップを常用する人は現状それなりに知識がある人に限られているためあまり問題とされていませんが、現状のLinuxデスクトップもWindowsと同様アプリを分離する仕組みが普及しているとは言えません。Flatpakやsnapdが「サンドボックス」として取り上げられがちですが、デフォルトの権限設定がザルだったりXのソケット経由で抜けられたりとあまり意味がないのが現状です。
使う層に知識があるか否かに関わらず、「ユーザーが悪意のあるコードを実行してしまった時に防御線となる仕組み」は必須だと思っています。xzの件を見ても分かる通り最近の攻撃はますます巧妙になっていて、npmの依存関係に悪意のあるコードを含むパッケージが混入するというのも珍しいことではなくなっています。オープンソースだから大丈夫とか知識がある人が使えば大丈夫とか、そういう話ではありません。

macOSに乗り換えて

macOSは今のところとても安定していて、まだシェルがクラッシュして作業が飛んだとかドライバをアップデートしたら壊れたとかの厄介なトラブルには遭遇していません。ターミナルアプリの権限を制限してFirefoxのプロファイルディレクトリをACLが適用されるドキュメントディレクトリに設定しておけば、npm経由で悪意のあるコードを走らせてしまってもある程度防御してくれます。
セキュリティと利便性のバランスがいい感じに保たれているという感想で個人的には満足です。

まとめ

Linuxカーネル自体は非常に優秀なカーネルだと思っていますが、Linuxデスクトップで必須になるその上で動く様々なソフトや仕組みは近代化されているとは言えません。仮に近代化する技術が開発されても、コミュニティの風潮からしてそれが普及するには相当な時間がかかると思います。
ただの愚痴のような記事になってしまいましたが、この怪文書の内容を動機にしてラズパイで暗号化機能搭載のNASを作ってみようと色々計画しています。
まとまったらそのうち記事にします。