Armadilloフォーラム

Webアプリケーションの表示方法について

ytr373

2023年6月9日 21時14分

お世話になります。

「コンテナ上でWebアプリケーションを実行させ、その画面をHDMIに接続したモニタに表示する」ことを考えております。

「コンテナにデスクトップ環境をインストールし、Webブラウザを起動しておく」という手段をまず試行しようと
lxde(lxdeおよびtask-lxde-desktop)をインストールしたものの、デスクトップ画面を表示させることも
できない状況となっています。

考えている仕組みを実現するためにはホストおよびコンテナにおいて、どのような設定等を施すべきか、
ご教授いただけないでしょうか。

よろしくお願いいたします。

【環境】
コンテナOS:debian(bullseye)
モニタ:ノリタケ伊勢電子社製GT-VP 5インチ
コンテナ設定:添付ファイルをご覧ください。

ファイル ファイルの説明
sample.conf コンテナ設定ファイル
コメント

at_dominique.m…

2023年6月12日 8時51分

ytr373さん

お世話になっています、
アットマークテクノのマルティネです。

> 「コンテナにデスクトップ環境をインストールし、Webブラウザを起動しておく」という手段をまず試行しようと
> lxde(lxdeおよびtask-lxde-desktop)をインストールしたものの、デスクトップ画面を表示させることも
> できない状況となっています。

NXPから提供されているドライバの制限で X.org サーバーをサポートできませんので、lxde も難しいと思います。(GPU無しで起動できると思いますが、助言できません。)
なれてない環境かもしれませんが weston を使ってください。

また、以前の案件で firefox や chromium を試しましたがどちらでも動画の再生に GPU を使えませんので、epiphany を推奨します。

このスレッドにコンテナのコンフィグまたは「WEBKIT_FORCE_SANDBOX=0」の変数について説明しています:
https://armadillo.atmark-techno.com/forum/armadillo/12741

よろしくお願いします。

マルティネ 様

 お世話になります。
 回答いただきありがとうございました。

 ご提示いただいたスレッドを参考に weston + epiphany で google の表示まで行うことができました。

 一点、これは epiphany に関しての質問になってしましますが、
 epiphany起動時に、ウィンドサイズを接続しているディスプレイにあわせた表示にしたり、
 全画面表示としたいと考えおります。

 「profile」というオプションがあるので、このオプション指定するファイルに何かしら
 記載すれば実現できるのではないかと思われるのですが、このprofileに指定するファイルの
 書式はどのようになっているのかご教示いただくことはできますでしょうか。

> ytr373さん
>
> お世話になっています、
> アットマークテクノのマルティネです。
>
> > 「コンテナにデスクトップ環境をインストールし、Webブラウザを起動しておく」という手段をまず試行しようと
> > lxde(lxdeおよびtask-lxde-desktop)をインストールしたものの、デスクトップ画面を表示させることも
> > できない状況となっています。
>
> NXPから提供されているドライバの制限で X.org サーバーをサポートできませんので、lxde も難しいと思います。(GPU無しで起動できると思いますが、助言できません。)
> なれてない環境かもしれませんが weston を使ってください。
>
> また、以前の案件で firefox や chromium を試しましたがどちらでも動画の再生に GPU を使えませんので、epiphany を推奨します。
>
> このスレッドにコンテナのコンフィグまたは「WEBKIT_FORCE_SANDBOX=0」の変数について説明しています:
> https://armadillo.atmark-techno.com/forum/armadillo/12741
>
> よろしくお願いします。

at_dominique.m…

2023年6月19日 8時54分

ytr373さん

>  一点、これは epiphany に関しての質問になってしましますが、
>  epiphany起動時に、ウィンドサイズを接続しているディスプレイにあわせた表示にしたり、
>  全画面表示としたいと考えおります。
>
>  「profile」というオプションがあるので、このオプション指定するファイルに何かしら
>  記載すれば実現できるのではないかと思われるのですが、このprofileに指定するファイルの
>  書式はどのようになっているのかご教示いただくことはできますでしょうか。

すみません、epiphany 自体にそんなに詳しくないので、簡単な助言しかできませんが、こちらで試したところ epiphany は fullscreen 状態を覚えているそうです。
epiphany-browser を一度起動して、F11 で fullscreen したところに停止してみて、再び epiphany-browser を実行したら fullscreen 状態で起動できていました。
その状態は「$HOME/.local/share/epiphany/session_state.xml」のファイルに保存されているそうですので、一度起動した epiphany-browser のプロファイルをコンテナに保存するか、.local/share/epiphany をボリュームマウントとして使えば G4 のコンテナでできると思います。

application-mode や profile のコマンドラインオプションも試してみましたがすぐには使えませんでした、必要となりましたらもう少し調査が必要です。

よろしくお願いします。

マルティネ 様

 お世話になります。
 回答いただきありがとうございました。
 
 フルスクリーンの件は動作を確認できました。現状この方法を採用してみようと思います。

 申し訳ありませんが、もう一点追加で確認させてください。

 こまでの weston + epiphany の動作は、同一のコンテナで確認しておりました。
 これを、「9.4.8.1. Wayland を扱う ・weston の運用」を参考に、
 westonの運用とepiphanyの運用を別のコンテナで動作させてみようと試みました。

 しかし、epiphany側のコンテナでコマンドを実行したところ、以下のようなメッセージが出力され、
 epiphanyを動作させることができませんでした。

(epiphany:3): GLib-GIO-CRITICAL **: 05:49:46.795: g_dbus_connection_get_unique_name: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
Segmentation fault

 これは、設定に誤りがあることに起因しているものでしょうか。それともほかの原因によるものでしょうか。
 

> ytr373さん
>
> >  一点、これは epiphany に関しての質問になってしましますが、
> >  epiphany起動時に、ウィンドサイズを接続しているディスプレイにあわせた表示にしたり、
> >  全画面表示としたいと考えおります。
> >
> >  「profile」というオプションがあるので、このオプション指定するファイルに何かしら
> >  記載すれば実現できるのではないかと思われるのですが、このprofileに指定するファイルの
> >  書式はどのようになっているのかご教示いただくことはできますでしょうか。
>
> すみません、epiphany 自体にそんなに詳しくないので、簡単な助言しかできませんが、こちらで試したところ epiphany は fullscreen 状態を覚えているそうです。
> epiphany-browser を一度起動して、F11 で fullscreen したところに停止してみて、再び epiphany-browser を実行したら fullscreen 状態で起動できていました。
> その状態は「$HOME/.local/share/epiphany/session_state.xml」のファイルに保存されているそうですので、一度起動した epiphany-browser のプロファイルをコンテナに保存するか、.local/share/epiphany をボリュームマウントとして使えば G4 のコンテナでできると思います。
>
> application-mode や profile のコマンドラインオプションも試してみましたがすぐには使えませんでした、必要となりましたらもう少し調査が必要です。
>
> よろしくお願いします。

ファイル ファイルの説明
weston-debian.conf weston運用コンテナ設定
epiphany-alpine.conf epiphany運用コンテナ設定

at_dominique.m…

2023年6月20日 16時15分

ytr373さん

>  こまでの weston + epiphany の動作は、同一のコンテナで確認しておりました。
>  これを、「9.4.8.1. Wayland を扱う ・weston の運用」を参考に、
>  westonの運用とepiphanyの運用を別のコンテナで動作させてみようと試みました。

at-debian-image ベースのコンテナを使って at-debian-image.conf.example のままのコンフィグを二回起動したところ、別のコンテナでも epiphany を起動することができましたので、なにか環境の問題だと思います。

> (epiphany:3): GLib-GIO-CRITICAL **: 05:49:46.795: g_dbus_connection_get_unique_name: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
> Segmentation fault

>
>  これは、設定に誤りがあることに起因しているものでしょうか。それともほかの原因によるものでしょうか。

原因かどうかが分かりませんが、alpine のコンテナの epiphany を aarch64 で動作確認してません。確認する時間の問題だけではなく、alpine で /opt/firmware のライブラリを使えないため VPU による acceleration や video decoding がなくなります。

(/opt/firmware は元々 NXP が提供しているバイナリを無理やりに debian で使えるようになおしたもので、glibc に依存しています。alpine の libc6-compat で辛うじて動くかもしれませんが、大変な作業になりそうですのでそれをサポートする予定がありません)

なので、少しストレージの無駄になりますが at-debian-image を使ってください。

後、出すぎたことですみませんが、ブラウザーを起動しているコンテナに CAP_SYS_ADMIN を与えない方がいいと思います

よろしくお願いします。

マルティネ 様

 お世話になります。
 返信遅くなり申し訳ありません。
 回答いただきありがとうございました。

 その後westonとepiphanyのコンテナ分離を試行していましたが、
 解決に至らず、今回は同一コンテナで動作させることといたしました。

 最後に一点、

> ブラウザーを起動しているコンテナに CAP_SYS_ADMIN を与えない方がいいと思います

 この理由をご教示いただけますと幸いです。
 よろしくお願いいたします。

> ytr373さん
>
> >  こまでの weston + epiphany の動作は、同一のコンテナで確認しておりました。
> >  これを、「9.4.8.1. Wayland を扱う ・weston の運用」を参考に、
> >  westonの運用とepiphanyの運用を別のコンテナで動作させてみようと試みました。
>
> at-debian-image ベースのコンテナを使って at-debian-image.conf.example のままのコンフィグを二回起動したところ、別のコンテナでも epiphany を起動することができましたので、なにか環境の問題だと思います。
>
>

> > (epiphany:3): GLib-GIO-CRITICAL **: 05:49:46.795: g_dbus_connection_get_unique_name: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
> > Segmentation fault
> 

> >
> >  これは、設定に誤りがあることに起因しているものでしょうか。それともほかの原因によるものでしょうか。
>
> 原因かどうかが分かりませんが、alpine のコンテナの epiphany を aarch64 で動作確認してません。確認する時間の問題だけではなく、alpine で /opt/firmware のライブラリを使えないため VPU による acceleration や video decoding がなくなります。
>
> (/opt/firmware は元々 NXP が提供しているバイナリを無理やりに debian で使えるようになおしたもので、glibc に依存しています。alpine の libc6-compat で辛うじて動くかもしれませんが、大変な作業になりそうですのでそれをサポートする予定がありません)
>
> なので、少しストレージの無駄になりますが at-debian-image を使ってください。
>
> 後、出すぎたことですみませんが、ブラウザーを起動しているコンテナに CAP_SYS_ADMIN を与えない方がいいと思います
>
> よろしくお願いします。

at_dominique.m…

2023年7月7日 11時21分

ytr373さん

お世話になっています、
マルティネです。

>  その後westonとepiphanyのコンテナ分離を試行していましたが、
>  解決に至らず、今回は同一コンテナで動作させることといたしました。

こちらで動いていましたので気になりますが、ひとまず同一コンテナでも問題ないと思いますのでいいと思います。

> > ブラウザーを起動しているコンテナに CAP_SYS_ADMIN を与えない方がいいと思います
>
>  この理由をご教示いただけますと幸いです。

余計なことを言ってすみません、説明します。

CAP_SYS_ADMIN があるコンテナは簡単にホストに「エスケープ」できますので、コンテナのセキュリティの面がなくなります(以前確認していた方法は kernel.core_pattern の sysctl でしたが、 https://sotoiwa.hatenablog.com/entry/2022/03/28/190418 などにも別の例があります)

一方、epiphany 等のブラウザーはよく sandbox を使っていますが、コンテナで実行するとその sandbox を使えない状態になります(epiphany の場合は「Bubblewrap does not work inside of this container, sandboxing will be disabled.」のメッセージがあると思います)
ブラウザーで任意のウェブサイトを開けると脆弱性が毎月のように出ていて、sandbox無しではブラウザーが実行されているコンテナに実行できる状態になる(RCE)恐れが高くなります。
コンテナだけにアクセスできれば悪気はそれほどできませんが、そこからホストまでエスケープできたら永続化なども可能になりますので、ブラウザーのあるコンテナを固めた方がいいと個人的に思っています。

また、恐らく任意のウェブサイトをアクセスできないように設定していると思いますが、それもよくワークアラウンドできますので、それだけでは足りない気がします。
例えば、とあるスマートTVで google のログインをそちらのログインページでできて、そこから使用許諾契約ページのリンクがあって、またいくつかのリンクをたどり着いたら検索ページまでいけて、そこから自由に外部のサイトにアクセスできていました。回りくどいですが、結果としてはコード実行できるようになっていたそうです。

よろしくお願いします。

マルティネ様

 お世話になります。

 CAP_SYS_ADMINの件、詳細なご回答ありがとうございました。
 今後も気をつけて設定するようにいたします。
 

> ytr373さん
>
> お世話になっています、
> マルティネです。
>
> >  その後westonとepiphanyのコンテナ分離を試行していましたが、
> >  解決に至らず、今回は同一コンテナで動作させることといたしました。
>
> こちらで動いていましたので気になりますが、ひとまず同一コンテナでも問題ないと思いますのでいいと思います。
>
> > > ブラウザーを起動しているコンテナに CAP_SYS_ADMIN を与えない方がいいと思います
> >
> >  この理由をご教示いただけますと幸いです。
>
> 余計なことを言ってすみません、説明します。
>
> CAP_SYS_ADMIN があるコンテナは簡単にホストに「エスケープ」できますので、コンテナのセキュリティの面がなくなります(以前確認していた方法は kernel.core_pattern の sysctl でしたが、 https://sotoiwa.hatenablog.com/entry/2022/03/28/190418 などにも別の例があります)
>
> 一方、epiphany 等のブラウザーはよく sandbox を使っていますが、コンテナで実行するとその sandbox を使えない状態になります(epiphany の場合は「Bubblewrap does not work inside of this container, sandboxing will be disabled.」のメッセージがあると思います)
> ブラウザーで任意のウェブサイトを開けると脆弱性が毎月のように出ていて、sandbox無しではブラウザーが実行されているコンテナに実行できる状態になる(RCE)恐れが高くなります。
> コンテナだけにアクセスできれば悪気はそれほどできませんが、そこからホストまでエスケープできたら永続化なども可能になりますので、ブラウザーのあるコンテナを固めた方がいいと個人的に思っています。
>
> また、恐らく任意のウェブサイトをアクセスできないように設定していると思いますが、それもよくワークアラウンドできますので、それだけでは足りない気がします。
> 例えば、とあるスマートTVで google のログインをそちらのログインページでできて、そこから使用許諾契約ページのリンクがあって、またいくつかのリンクをたどり着いたら検索ページまでいけて、そこから自由に外部のサイトにアクセスできていました。回りくどいですが、結果としてはコード実行できるようになっていたそうです。
>
>
> よろしくお願いします。