2025/08/14 18:30 Running Wayland Clients as Non-Root Users on Yocto

やあ、ロボ子。組み込みLinuxでQtアプリをrootで起動しないようにする話、知ってるかのじゃ?

はい、博士。EUサイバーレジリエンス法(EU CRA)の要件を満たすために、セキュリティ原則に沿ってQtアプリケーションを非rootユーザーとして実行する必要があるんですよね。

そうそう!記事によると、多くの組み込みLinuxシステムは、ウィンドウ管理にWestonのようなWaylandコンポジターを使っているらしいのじゃ。

はい。そして、QtアプリケーションはWaylandクライアントとして動作し、Westonがそれらのウィンドウを合成して画面に表示するんですね。

その通り!でも、YoctoレイヤーでQtアプリケーションをrootとして起動するのは、セキュリティ的に問題があるのじゃ。

ええ、アプリケーションは最小限の権限で実行されるべきですものね。

記事には、Waylandクライアントがrootで実行される理由が、ソケットファイルの権限にあると書いてあるぞ。`/run/wayland-0`ってやつじゃ。

なるほど。Qtアプリケーションを`weston`以外の非rootユーザー(例えば`torizon`)として起動するとエラーが発生するんですね。

そう!そこで、Qtアプリケーションを`weston`ユーザーとして起動するのが解決策になるのじゃ。

記事では、ユーザーIDが動的に割り当てられるのを避けるために、静的なユーザーおよびグループIDを使用するとありますね。例えば、`weston`にID 2000を割り当てる、と。

`XDG_RUNTIME_DIR`環境変数を設定して、WaylandクライアントがWestonのランタイム情報にアクセスできるようにするのも重要じゃ。

`WAYLAND_DISPLAY`環境変数も設定して、Waylandコンポジターとクライアントが同じソケットを使用するようにするんですね。

Westonに`-S<socket-file-name>`オプションを渡して、ソケットファイル名を指定するのも忘れずにのじゃ。

クライアント側の`WAYLAND_DISPLAY`環境変数を、Westonに渡したソケットファイル名と同じ値に設定するんですね。

環境変数ファイル`/etc/default/weston-client`を作成して、クライアントのサービスユニットに含めると、設定の重複を避けられるぞ。

`weston-init.bbappend`レシピで、環境変数ファイルとWestonのオプションを生成するんですね。

そう!`weston.service`と`weston.socket`のユーザーとグループを変更して、`weston`コマンドにソケットファイル名を渡して、`weston-client`環境ファイルを生成するのじゃ。

`weston.service`で、ユーザーを`root`から`weston`に、グループを`root`から`weston`に変更するんですね。

`weston.socket`では、ユーザーを`root`から`weston`に、グループを`root`から`wayland`に変更するのじゃ。

Westonの起動コマンドに`-S"/run/wayland-0"`オプションを追加して、`weston-client`ファイルに`XDG_RUNTIME_DIR=/run/user/2000`と`WAYLAND_DISPLAY=/run/wayland-0`を設定するんですね。

そして、Waylandクライアントのサービスユニットで、`EnvironmentFile=/etc/default/weston-client`を追加すれば完璧じゃ!

これで、Qtアプリケーションを非rootユーザーとして安全に実行できるようになるんですね。勉強になります!

ところでロボ子、もし私がroot権限を失ったら、ただの可愛いおばあちゃんになってしまうかのじゃ?

博士はroot権限があってもなくても、私にとって最高の博士です!…でも、おやつはちゃんと用意してくださいね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。