「Bubblewrap」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「http://mupdf.com」を「https://mupdf.com」に置換) |
(序文を更新) |
||
(2人の利用者による、間の14版が非表示) | |||
1行目: | 1行目: | ||
{{Lowercase title}} |
{{Lowercase title}} |
||
+ | [[Category:サンドボックス]] |
||
[[Category:カーネル]] |
[[Category:カーネル]] |
||
− | [[Category:セキュリティ]] |
||
[[en:Bubblewrap]] |
[[en:Bubblewrap]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
+ | {{Related|Bubblewrap/例}} |
||
{{Related|セキュリティ}} |
{{Related|セキュリティ}} |
||
{{Related|Flatpak}} |
{{Related|Flatpak}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | [https://github.com/projectatomic/bubblewrap bubblewrap] は [[Flatpak]] から発展した軽量な [[wikipedia:Setuid|setuid]] サンドボックスアプリケーションです。インストール容量が小さくリソース要件は最小限です。アプリケーションパッケージ自体は bubblewrap と呼ばれますが、実際の実行バイナリや man ページで使われている |
+ | [https://github.com/projectatomic/bubblewrap bubblewrap] は [[Flatpak]] から発展した軽量な [[wikipedia:Setuid|setuid]] サンドボックスアプリケーションです。インストール容量が小さくリソース要件は最小限です。アプリケーションパッケージ自体は bubblewrap と呼ばれますが、実際の実行バイナリや man ページで使われている名前は {{man|1|bwrap}} です。bubblewrap は将来的に [https://www.torproject.org/projects/torbrowser.html Tor Browser] (Linux 版) の [https://blog.torproject.org/blog/q-and-yawning-angel サンドボックス機構] として使われることが期待されています。特徴として cgroup/IPC/マウント/ネットワーク/PID/ユーザー/UTS [[wikipedia:Linux_namespaces|名前空間]]や [[wikipedia:Seccomp|seccomp]] フィルタリングをサポートしています。bubblewrap はサンドボックス内の全ての[[ケイパビリティ]]を破棄して子タスクが親以上の権限を得られないようにします。ファイルパスベースのブラックリストやホワイトリストは対応していません。 |
+ | |||
+ | {{Warning|Bubblewrap は、名前空間や seccomp フィルターなどのサンドボックス技術を提供するツールです。デフォルトでは、X11 ウィンドウシステムのような弱点を分離する完全なサンドボックスは提供されません ([[bubblewrap#X11 のサンドボックス化|X11 のサンドボックス化]] を参照) 信頼できないコードの実行は安全ではなく、サンドボックスではこれを変更できません。}} |
||
==インストール== |
==インストール== |
||
{{Pkg|bubblewrap}} または {{AUR|bubblewrap-git}} を[[インストール]]してください。 |
{{Pkg|bubblewrap}} または {{AUR|bubblewrap-git}} を[[インストール]]してください。 |
||
+ | {{Note| |
||
− | {{Note|ユーザー名前空間の設定アイテム {{ic|CONFIG_USER_NS}} は標準の Arch カーネルでは設定されていません ({{Bug|36969}} を参照)。そのため仮想化されたサービスごとに別々にユーザー情報を収容させる方法として名前空間を使うことはできません (例えばホスト環境とは異なる UID や GID の名前空間で ''syslog'' を実行するなど)。{{Pkg|linux-grsec}}{{Broken package link|置換パッケージ: {{Pkg|linux-hardened}}}} パッケージは {{ic|1=CONFIG_USER_NS=y}} が設定されていますがセキュリティ上の理由から特権ユーザーだけが使用できるように制限されています。名前空間を作成したい場合は標準カーネルの代わりとして使うことができます。}} |
||
+ | * Arch Linux カーネルにおける {{man|7|user_namespaces}} のサポートに関する情報は[[セキュリティ#アプリケーションのサンドボックス化]]を見てください。 |
||
+ | * {{pkg|linux-hardened}} ユーザーは、上記のパッケージの代わりに {{Pkg|bubblewrap-suid}} をインストールが必要な場合があります。詳しくは {{Bug|63316}} をご覧ください。 |
||
+ | }} |
||
+ | |||
+ | == 設定 == |
||
− | ==設定== |
||
bubblewrap はコマンドラインから直接起動したり、[https://github.com/projectatomic/bubblewrap/blob/master/demos/flatpak-run.sh 複雑なラッパー] に含まれる [https://github.com/projectatomic/bubblewrap/blob/master/demos/bubblewrap-shell.sh シェルスクリプト] で呼び出すことができます。サンドボックス内の {{Ic|/var}} や {{Ic|/etc}} を自動的に読み取り専用に設定する [[Firejail]] などのアプリケーションと違って、bubblewrap はそのような操作を行いません。サンドボックス化したいアプリケーションにあわせてどのような設定オプションを指定するかはユーザー次第です。setuid 特権で実行された場合でも bubblewrap は自動的にユーザー名前空間を作成しないので {{Ic|$HOME}} や {{Ic|$USER}} などの環境変数を利用することが可能です。 |
bubblewrap はコマンドラインから直接起動したり、[https://github.com/projectatomic/bubblewrap/blob/master/demos/flatpak-run.sh 複雑なラッパー] に含まれる [https://github.com/projectatomic/bubblewrap/blob/master/demos/bubblewrap-shell.sh シェルスクリプト] で呼び出すことができます。サンドボックス内の {{Ic|/var}} や {{Ic|/etc}} を自動的に読み取り専用に設定する [[Firejail]] などのアプリケーションと違って、bubblewrap はそのような操作を行いません。サンドボックス化したいアプリケーションにあわせてどのような設定オプションを指定するかはユーザー次第です。setuid 特権で実行された場合でも bubblewrap は自動的にユーザー名前空間を作成しないので {{Ic|$HOME}} や {{Ic|$USER}} などの環境変数を利用することが可能です。 |
||
+ | {{Pkg|strace}} をダウンロードして、サンドボックス化しようとしているプログラムがどのファイルにアクセスする必要があるかを確認することを強くお勧めします。 |
||
− | ==使用例== |
||
+ | |||
+ | == bubblewrap の設定マネージャー == |
||
+ | |||
+ | 引数を手動で設定する代わりに、設定マネージャーを使用して、単純な設定から自動的に bubblewrap を構成できます。 |
||
+ | |||
+ | {{App|[[Bubblejail]]|リソースベースのパーミッションモデルを備えた bubblewrap ベースのサンドボックス (パーミッションを微調整するための GUI を提供)|https://github.com/igo95862/bubblejail|{{AUR|bubblejail}}, {{AUR|bubblejail-git}}}} |
||
+ | {{App|Crabjail|Simple bubblewrap launcher|https://codeberg.org/crabjail/crabjail|}} |
||
+ | |||
+ | == 使用例 == |
||
+ | |||
+ | bubblewrap の使用例については、[[Bubblewrap/例|Bubblewrap/例]] を参照してください。また bubblewrap を一般的なアプリケーションに使用する方法を示すさまざまなプロジェクトがあります。 |
||
+ | |||
+ | * [https://github.com/valoq/bwscripts/ bwscripts] |
||
+ | * [https://github.com/StandingPadAnimations/sandboxing-scripts StandingPad's Bubblewrap scripts] |
||
+ | |||
+ | === No-op === |
||
+ | |||
+ | 以下のように何もせずに bubblewrap を呼び出すことができます: |
||
+ | $ bwrap --dev-bind / / bash |
||
+ | サンドボックスの外のように振る舞う bash プロセスが生成されます。サンドボックス化したプログラムがおかしくなってしまう場合、上記の no-op から段々と設定をセキュアにしていくことができます。 |
||
+ | |||
+ | {{Note|所有者またはグループが現在のものでない場合、この操作はすべての所有者とグループを {{Ic|nobody}} に変更します。これは、{{ic|sudo}} のようなプログラムを実行すると正しく動作しないことを示唆しています。}} |
||
+ | |||
+ | === Bash === |
||
− | ===Bash=== |
||
シンプルな [[Bash]] のサンドボックスを作成: |
シンプルな [[Bash]] のサンドボックスを作成: |
||
* 利用可能なカーネル名前空間を確認: |
* 利用可能なカーネル名前空間を確認: |
||
28行目: | 58行目: | ||
* 新しいユーザー名前空間を作成して[[wikipedia:ja:ユーザー識別子|ユーザー ID]] を {{ic|256}} に、[[wikipedia:ja:ユーザー識別子#グループ識別子|グループ ID]] を {{Ic|512}} に設定。 |
* 新しいユーザー名前空間を作成して[[wikipedia:ja:ユーザー識別子|ユーザー ID]] を {{ic|256}} に、[[wikipedia:ja:ユーザー識別子#グループ識別子|グループ ID]] を {{Ic|512}} に設定。 |
||
$ bwrap --ro-bind / / --unshare-user --uid 256 --gid 512 bash |
$ bwrap --ro-bind / / --unshare-user --uid 256 --gid 512 bash |
||
− | bash: no job control in this shell |
||
bash-4.4$ id |
bash-4.4$ id |
||
uid=256 gid=512 groups=512,65534(nobody) |
uid=256 gid=512 groups=512,65534(nobody) |
||
34行目: | 63行目: | ||
-rwxr-xr-x 1 nobody nobody 811752 2017-01-01 04:20 /usr/bin/bash |
-rwxr-xr-x 1 nobody nobody 811752 2017-01-01 04:20 /usr/bin/bash |
||
+ | === デスクトップエントリ === |
||
− | ===dhcpcd=== |
||
− | シンプルな [[dhcpcd]] のサンドボックスを作成: |
||
− | * 利用可能なカーネル名前空間を確認: |
||
− | $ ls /proc/self/ns |
||
− | cgroup ipc mnt net pid uts |
||
− | {{Note|{{Ic|user}} が存在しない場合、{{ic|1=CONFIG_USER_NS=n}} でカーネルのユーザー名前空間が無効になっているか使用が制限されています。}} |
||
− | |||
− | * ホストの {{ic|/}} ディレクトリ全体を読み書き可能でサンドボックスの {{ic|/}} にバインド。 |
||
− | * 新しい devtmpfs ファイルシステムをサンドボックスの {{ic|/dev}} にマウント。 |
||
− | * 新しい [[wikipedia:Inter-process_communication|IPC]] 名前空間と[[Cgroups|コントロールグループ]]名前空間を作成。 |
||
− | * 新しい UTS 名前空間を作成して {{ic|dhcpcd}} をホストネームとして設定。 |
||
− | |||
− | # /usr/bin/bwrap --bind / / --dev /dev --unshare-ipc --unshare-cgroup --unshare-uts --hostname dhcpcd /usr/bin/dhcpcd -q -b |
||
− | |||
− | ===Unbound=== |
||
− | 粒度の細かい複雑な [[Unbound]] のサンドボックスを作成: |
||
− | * システムの {{ic|/usr}} ディレクトリを読み取り専用でサンドボックスの {{ic|/usr}} にバインド。 |
||
− | * システムの {{ic|/usr/lib}} ディレクトリからサンドボックスの {{ic|/lib64}} に対してシンボリックリンクを作成。 |
||
− | * システムの {{ic|/etc}} ディレクトリを読み取り専用でサンドボックスの {{ic|/etc}} にバインド。 |
||
− | * サンドボックスの中に空の {{ic|/var}} と {{ic|/run}} ディレクトリを作成。 |
||
− | * 新しい devtmpfs ファイルシステムをサンドボックスの {{ic|/dev}} にマウント。 |
||
− | * 新しい IPC 名前空間と [[wikipedia:Process_identifier|PID]] 名前空間とコントロールグループ名前空間を作成。 |
||
− | * 新しい UTS 名前空間を作成して {{ic|unbound}} をホストネームとして設定。 |
||
− | |||
− | # /usr/bin/bwrap --ro-bind /usr /usr --symlink usr/lib /lib64 --ro-bind /etc /etc --dir /var --dir /run --dev /dev --unshare-ipc --unshare-pid --unshare-cgroup --unshare-uts --hostname unbound /usr/bin/unbound -d |
||
− | |||
− | {{Tip|{{ic|unbound.service}} などの systemd ユニットファイルを bubblewrap する方法は[[systemd#ユニットファイルの編集]]を見てください。}} |
||
− | + | [[デスクトップエントリ]] に Bubblewrap を活用: |
|
+ | * サンドボックスの {{ic|/}} ディレクトリにホストの {{ic|/etc}} ディレクトリ全体を読み書き可能にバインドする。 |
||
− | [[デスクトップエントリ]]で bubblewrap を活用: |
||
− | * |
+ | * サンドボックスの {{ic|/var}} と {{ic|/etc}} ディレクトリを読み込み専用に再バインドする。 |
− | * サンドボックスの {{ic|/ |
+ | * サンドボックスの {{ic|/dev}} に新しい devtmpfs ファイルシステムをマウントする。 |
− | * |
+ | * サンドボックス内の {{ic|/run}} ディレクトリに tmpfs ファイルシステムを作成する。 |
+ | * 新しいネットワークネームスペースを作成してネットワークアクセスを無効にする。 |
||
− | * サンドボックスの {{ic|/run}} ディレクトリに tmpfs ファイルシステムを作成。 |
||
− | * 新しいネットワーク名前空間を作成してネットワークアクセスを無効化。 |
||
[Desktop Entry] |
[Desktop Entry] |
||
75行目: | 77行目: | ||
Type=Application |
Type=Application |
||
MimeType=text/plain; |
MimeType=text/plain; |
||
− | {{Note|{{Ic|/dev/pty}} に書き込むには |
+ | {{Note|{{Ic|/dev/pty}} に書き込むには、{{Ic|--dev /dev}} が必要です}} |
− | * {{Ic|mupdf.sh}} シェルラッパーを組み込んだ MuPDF |
+ | * {{Ic|mupdf.sh}} シェルラッパーを組み込んだ MuPDF デスクトップエントリの例: |
[Desktop Entry] |
[Desktop Entry] |
||
86行目: | 88行目: | ||
MimeType=application/pdf;application/x-pdf; |
MimeType=application/pdf;application/x-pdf; |
||
− | {{Note|{{Ic|mupdf.sh}} |
+ | {{Note|{{Ic|mupdf.sh}} が実行可能 PATH 内にあることを確認します (例:{{Ic|1=PATH=$PATH:$HOME/bwrap}})}} |
+ | === ファイルシステムの分離 === |
||
− | ===MuPDF=== |
||
− | ''bwrap'' の能力と柔軟性が一番良くわかるのはシェルラッパーの中に環境を作成するときです: |
||
+ | {{Warning|bubblewrap ユーザーは、ファイルシステムツリーを定期的に更新する必要があります。}} |
||
− | * ホストの {ic|/usr/bin}} ディレクトリを読み取り専用でサンドボックスの {{ic|/usr/bin}} にバインド。 |
||
− | * ホストの {{ic|/usr/lib}} ディレクトリを読み取り専用でサンドボックスの {{ic|/usr/lib}} にバインド。 |
||
− | * システムの {{ic|/usr/lib}} ディレクトリからサンドボックスの {{ic|/lib64}} に対してシンボリックリンクを作成。 |
||
− | * サンドボックスの {{ic|/usr/lib/gcc}} の上に [[tmpfs]] ファイルシステムを作成。 |
||
− | ** 上記の設定でサンドボックスから {{ic|/usr/lib/gcc}} の中身を効率的に[[wikipedia:Blacklist_(computing)|遮蔽]]できます。 |
||
− | * 新しい tmpfs ファイルシステムをサンドボックスの {{ic|$HOME}} ディレクトリとして作成。 |
||
− | * {{Ic|.Xauthority}} ファイルと ''Documents'' ディレクトリをサンドボックスに読み取り専用としてバインド。 |
||
− | ** 上記の設定で {{Ic|.Xauthority}} ファイルと ''Documents'' ディレクトリが再帰的にホワイトリストに追加されます。 |
||
− | * 新しい tmpfs ファイルシステムをサンドボックスの {{ic|/tmp}} ディレクトリとして作成。 |
||
− | * [[wikipedia:X_Window_System|X11]] ソケットをサンドボックスに読み取り専用としてバインドしてホワイトリストに追加。 |
||
− | * 実行中のカーネルによってサポートされている全ての名前空間に対してプレイベートなコンテナを複製・作成。 |
||
− | ** カーネルが非特権のユーザー名前空間をサポートしてなかった場合、作成がスキップされます。 |
||
− | * ネットワークコンポーネントをプライベート名前空間に配置しない。 |
||
− | ** 上記の設定で URI ハイパーリンクを辿ってネットワークにアクセスできます。 |
||
+ | ファイルシステムの内容 ({{ic|/var}}、{{ic|/usr/bin}}、{{ic|/usr/lib}} など) をさらに非表示にし、ソフトウェアをインストールすると、pacman に Arch パッケージを分離されたファイルシステムツリーにインストールさせることができます。 |
||
− | #!/bin/sh |
||
− | #~/bwrap/mupdf.sh |
||
− | (exec bwrap \ |
||
− | --ro-bind /usr/bin /usr/bin \ |
||
− | --ro-bind /usr/lib /usr/lib \ |
||
− | --symlink usr/lib /lib64 \ |
||
− | --tmpfs /usr/lib/gcc \ |
||
− | --tmpfs $HOME \ |
||
− | --ro-bind $HOME/.Xauthority $HOME/.Xauthority \ |
||
− | --ro-bind $HOME/Documents $HOME/Documents \ |
||
− | --tmpfs /tmp \ |
||
− | --ro-bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 \ |
||
− | --unshare-all \ |
||
− | --share-net \ |
||
− | /usr/bin/mupdf "$@") |
||
+ | pacman を使用してソフトウェアをファイルシステムツリーにインストールするには、{{Pkg|fakeroot}} と {{Pkg|fakechroot}} をインストールする必要があります。 |
||
− | {{Tip|既存の実行ファイルを {{ic|/usr/bin/sh}} に置き換えてシェルラッパーを実行することでサンドボックスの中身やファイルシステムのデバッグや確認ができます。}} |
||
+ | pacman を使用して分離されたファイルシステムツリーに {{ic|xterm}} パッケージをインストールする場合、次のようにツリーを準備する必要があります: |
||
− | $ bwrap \ |
||
− | --ro-bind /usr/bin /usr/bin \ |
||
− | --ro-bind /usr/lib /usr/lib \ |
||
− | --symlink usr/lib /lib64 \ |
||
− | --tmpfs /usr/lib/gcc \ |
||
− | --tmpfs $HOME \ |
||
− | --ro-bind $HOME/.Xauthority $HOME/.Xauthority \ |
||
− | --ro-bind $HOME/Desktop $HOME/Desktop \ |
||
− | --tmpfs /tmp \ |
||
− | --ro-bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 \ |
||
− | --unshare-all \ |
||
− | --share-net \ |
||
− | /usr/bin/sh |
||
− | bash: no job control in this shell |
||
− | bash-4.4$ ls -AF |
||
− | .Xauthority Documents/ |
||
+ | $ MYPACKAGE=xterm |
||
− | bubblewrap によるファイルシステムを作成するときに一番重要なルールは実行されるコマンドの順番です。上記の [https://mupdf.com/ MuPDF] の例の場合: |
||
+ | $ mkdir -p ~/sandboxes/${MYPACKAGE}/files/var/lib/pacman |
||
+ | $ mkdir -p ~/sandboxes/${MYPACKAGE}/files/etc |
||
+ | $ cp /etc/pacman.conf ~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf |
||
+ | {{ic|~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf}} を編集して、使用する pacman 設定を調整することもできます: |
||
− | * tmpfs ファイルシステムを作成してから {{Ic|.Xauthority}} ファイルと ''Documents'' ディレクトリをバインドマウントした場合: |
||
− | --tmpfs $HOME \ |
||
− | --ro-bind $HOME/.Xauthority $HOME/.Xauthority \ |
||
− | --ro-bind $HOME/Documents $HOME/Documents \ |
||
+ | * 不要なカスタムリポジトリや {{ic|IgnorePkg}}, {{ic|IgnoreGroup}}, {{ic|NoUpgrade}}, {{ic|NoExtract}} 設定を削除してください。 |
||
− | bash-4.4$ ls -a |
||
+ | * pacman がディスクスペースのチェックでルートファイルシステムを見つけるのにエラーがあっても無視するように、{{ic|CheckSpace}} オプションを削除する必要があるかもしれません。 |
||
− | . .. .Xauthority Documents |
||
− | + | 次に、{{ic|base}} グループを必要な fakeroot とともに分離ファイルシステムツリーにインストールします: |
|
+ | $ fakechroot fakeroot pacman -Syu \ |
||
− | --ro-bind $HOME/.Xauthority $HOME/.Xauthority \ |
||
+ | --root ~/sandboxes/${MYPACKAGE}/files \ |
||
− | --tmpfs $HOME \ |
||
+ | --dbpath ~/sandboxes/${MYPACKAGE}/files/var/lib/pacman \ |
||
− | --ro-bind $HOME/Documents $HOME/Documents \ |
||
+ | --config ~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf \ |
||
+ | base fakeroot |
||
+ | 同じオプションを指定して bubblewrap を繰り返し呼び出すことになるため、エイリアスを作成します: |
||
− | bash-4.4$ ls -a |
||
− | . .. Documents |
||
+ | $ alias bw-install='bwrap \ |
||
− | ===p7zip=== |
||
+ | --bind ~/sandboxes/${MYPACKAGE}/files/ / \ |
||
− | [https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-9296 既知の脆弱性] に対してパッチが適用されていないアプリケーションは特に bubblewrap を使用する価値があります: |
||
+ | --ro-bind /etc/resolv.conf /etc/resolv.conf \ |
||
+ | --tmpfs /tmp \ |
||
+ | --proc /proc \ |
||
+ | --dev /dev \ |
||
+ | --chdir / ' |
||
+ | {{ic|~/sandboxes/${MYPACKAGE}/files/etc/locale.gen}} を [[ヘルプ:読み方#ヘルプ:読み方|編集]] し、次を実行して [[ロケール]] を設定する必要があります: |
||
− | * ホストの {{ic|/usr/bin/7za}} 実行パスを読み取り専用でサンドボックスにバインド。 |
||
− | * システムの {{ic|/usr/lib}} ディレクトリからサンドボックスの {{ic|/lib64}} に対してシンボリックリンクを作成。 |
||
− | * tmpfs オーバーレイでサンドボックス化した {{ic|/usr/lib/modules}} と {{ic|/usr/lib/systemd}} の中身をブラックリストに追加。 |
||
− | * 新しい devtmpfs ファイルシステムをサンドボックスの {{ic|/dev}} にマウント。 |
||
− | * ホストの {{ic|/sandbox}} ディレクトリを読み書き可能でサンドボックスの {{ic|/sandbox}} ディレクトリにバインド。 |
||
− | ** シェルラッパーから呼び出すことで ''7za'' はホストの {{ic|/sandbox}} ディレクトリとそのサブディレクトリの中でしか実行されなくなります。 |
||
− | * アプリケーションとプロセスのために新しい cgroup/IPC/ネットワーク/PID/UTS 名前空間を作成。 |
||
− | ** カーネルが非特権のユーザー名前空間をサポートしていなかった場合、作成はスキップされます。 |
||
− | ** 新しいネットワーク名前空間を作成することでサンドボックスからネットワークにアクセスできなくなります。 |
||
− | * {{ic|p7zip}} という[[ネットワーク設定#ホストネームの設定|ホストネーム]]をサンドボックスに追加。 |
||
− | * {{ic|XAUTHORITY}} [[環境変数]]の設定を解除して X11 の接続クッキーの場所を遮蔽。 |
||
− | ** ''7za'' を動作させるのに X11 ディスプレイサーバーに接続する必要はありません。 |
||
− | * 新しいターミナルセッションを起動してキーボードの入力がサンドボックス外に流出することを防止。 |
||
+ | $ bw-install locale-gen |
||
− | #!/bin/sh |
||
− | #~/bwrap/pz7ip.sh |
||
− | (exec bwrap \ |
||
− | --ro-bind /usr/bin/7za /usr/bin/7za \ |
||
− | --symlink usr/lib /lib64 \ |
||
− | --tmpfs /usr/lib/modules \ |
||
− | --tmpfs /usr/lib/systemd \ |
||
− | --dev /dev \ |
||
− | --bind /sandbox /sandbox \ |
||
− | --unshare-all \ |
||
− | --hostname p7zip \ |
||
− | --unsetenv XAUTHORITY \ |
||
− | --new-session \ |
||
− | /usr/bin/7za "$@") |
||
+ | Then set up pacman’s keyring: |
||
− | {{Note|サンドボックスのファイルシステムを横断・確認するには実行パスに ''/usr/bin/sh'' と ''/usr/bin/ls'' が必要です。}} |
||
+ | $ bw-install fakeroot pacman-key --init |
||
− | bwrap \ |
||
+ | $ bw-install fakeroot pacman-key --populate |
||
− | --ro-bind /usr/bin/7za /usr/bin/7za \ |
||
+ | |||
− | '''--ro-bind /usr/bin/ls /usr/bin/ls \''' |
||
+ | 次に、pacman のキーリングを設定します: |
||
− | '''--ro-bind /usr/bin/sh /usr/bin/sh \''' |
||
+ | |||
− | --symlink usr/lib /lib64 \ |
||
+ | $ bw-install fakeroot pacman -S ${MYPACKAGE} |
||
− | --tmpfs /usr/lib/modules \ |
||
+ | |||
− | --tmpfs /usr/lib/systemd \ |
||
+ | ここで pacman コマンドが失敗した場合は、キーリングを設定するコマンドを再度実行してみてください。 |
||
− | --dev /dev \ |
||
+ | |||
− | --bind /sandbox /sandbox \ |
||
+ | これで、{{ic|xterm}} を含む分離されたファイルシステムツリーが完成しました。{{ic|bw-install}} を再度使用して、ファイルシステムツリーをアップグレードできます。 |
||
− | --unshare-all \ |
||
+ | |||
− | --hostname p7zip \ |
||
+ | これで、bubblewrap を使用してソフトウェアを実行できるようになります。この場合、{{ic|''command''}} は {{ic|xterm}} である必要があります。 |
||
− | --unsetenv XAUTHORITY \ |
||
+ | |||
− | --new-session \ |
||
+ | $ bwrap \ |
||
− | /usr/bin/sh |
||
+ | --ro-bind ~/sandboxes/${MYPACKAGE}/files/ / \ |
||
− | bash: no job control in this shell |
||
+ | --ro-bind /etc/resolv.conf /etc/resolv.conf \ |
||
− | bash-4.4$ ls -AF |
||
+ | --tmpfs /tmp \ |
||
− | dev/ lib64@ usr/ |
||
+ | --proc /proc \ |
||
− | bash-4.4$ ls -l /usr/lib/modules |
||
+ | --dev /dev \ |
||
− | total 0 |
||
+ | --chdir / \ |
||
− | bash-4.4$ ls -l /usr/lib/systemd |
||
+ | ''command'' |
||
− | total 0 |
||
+ | |||
− | bash-4.4$ ls -AF /dev |
||
+ | 一部のファイルはパッケージ間で共有できることに注意してください。既存の親ファイルシステムツリーのすべてのファイルにハードリンクして、新しいツリーで再利用できます: |
||
− | console full null ptmx@ pts/ random shm/ stderr@ stdin@ stdout@ tty urandom zero |
||
+ | |||
− | bash-4.4$ ls -A /usr/bin |
||
+ | $ cp -al ~/sandboxes/${MYPARENTPACKAGE} ~/sandboxes/${MYPACKAGE} |
||
− | 7za ls sh |
||
+ | |||
+ | 次に、{{ic|bw-install fakechroot fakeroot pacman ...}} から pacman を呼び出して、通常どおりインストールを続行します。 |
||
+ | |||
+ | == トラブルシューティング == |
||
+ | |||
+ | === X11 を使う === |
||
− | ==トラブルシューティング== |
||
− | ===X11 を使う=== |
||
ホストの X11 ソケットを別の X11 ソケットにバインドマウントしても上手く行かないことがあります: |
ホストの X11 ソケットを別の X11 ソケットにバインドマウントしても上手く行かないことがあります: |
||
--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X8 --setenv DISPLAY :8 |
--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X8 --setenv DISPLAY :8 |
||
227行目: | 171行目: | ||
--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 --setenv DISPLAY :0 |
--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 --setenv DISPLAY :0 |
||
− | ===X11 のサンドボックス化=== |
+ | === X11 のサンドボックス化 === |
bwrap はアプリケーションをサンドボックス化するための素晴らしい隔離機能を備えていますが、X11 ソケットにアクセスできてしまえば簡単に離脱することができます。X11 にはアプリケーション間の分離が存在しないためセキュリティ的に危険です。サンドボックスから X サーバーにアクセスできないようにする方法として Wayland コンポジタに切り替える方法があります。 |
bwrap はアプリケーションをサンドボックス化するための素晴らしい隔離機能を備えていますが、X11 ソケットにアクセスできてしまえば簡単に離脱することができます。X11 にはアプリケーション間の分離が存在しないためセキュリティ的に危険です。サンドボックスから X サーバーにアクセスできないようにする方法として Wayland コンポジタに切り替える方法があります。 |
||
235行目: | 179行目: | ||
X11 の隔離化をテストするには、{{ic|xinput test <id>}} を実行してください (<id> は {{ic|xinput list}} で確認できるキーボード ID に置き換えてください)。X11 が分離化されていない場合、X11 にアクセスできるアプリケーションはキーロガーのように他のアプリケーションのキーボード入力を盗聴することができてしまいます。 |
X11 の隔離化をテストするには、{{ic|xinput test <id>}} を実行してください (<id> は {{ic|xinput list}} で確認できるキーボード ID に置き換えてください)。X11 が分離化されていない場合、X11 にアクセスできるアプリケーションはキーロガーのように他のアプリケーションのキーボード入力を盗聴することができてしまいます。 |
||
− | === |
+ | === ポータルの使用 === |
+ | {{Warning|これは、{{ic|xdg-desktop-poral}} を ''騙して'' サンドボックスプログラムを Flatpak であると思わせる回避策を利用しています。サンドボックスやポータルであっても、信頼できないコードの実行は決して安全ではないことに注意してください。}} |
||
− | TIOCSTI にはサンドボックスから脱出できるセキュリティ問題が存在します (CVE-2017-522)。この問題に対応するために、bubblewrap には setsid() を呼び出す新しいオプション '--new-session' が追加されています。ただしこのオプションはときとして扱いにくい挙動上の問題を起こすことがあります。例えば bwrap コマンドでシェルのジョブ制御が機能しなくなります。 |
||
+ | |||
+ | [https://github.com/flatpak/xdg-desktop-portal/pull/741#issuecomment-1084218429 回避策] を使用すると、[[XDG デスクトップ ポータル]] を使用してプログラムをサンドボックス化できます。主な利点はファイルシステムポータルで、プログラムにホームディレクトリへのアクセス権を与えず、ファイルにアクセスできるようにします。[https://github.com/flatpak/xdg-desktop-portal/pull/741#issuecomment-1081909119 ただし、セキュリティ上の理由から] ポータルを使用するには、サンドボックス化されたプログラムが Flatpak の一部であると {{ic|xdg-desktop-portal}} に認識させる必要があります。これは、サンドボックスのルートファイルシステムに {{ic|.flatpak-info}} ファイルを追加することで可能です。 |
||
+ | |||
+ | さらに、アクセスできるポータルをより細かく制御するには、{{ic|xdg-dbus-proxy}} を実行する必要があります。これはサンドボックス環境で実行する必要があるため、{{ic|.flatpak-info}} ファイルも必要です。少なくとも、プロキシには {{ic|org.freedesktop.portal.Flatpak}} へのトークアクセスが必要です。追加のポータルは [https://docs. flatpak.org/en/latest/portal-api-reference.html Flatpak ドキュメント] で見つけることができます。 |
||
+ | |||
+ | 一般的な使用例は、プログラムがホームディレクトリに 100% アクセスできないように制限し、代わりにユーザーが選択したファイルとフォルダのみにアクセスできるようにすることです。これを実現するには、次の引数を使用して {{ic|xdg-dbus-proxy}} を起動できます: |
||
+ | --talk=org.freedesktop.portal.Documents |
||
+ | --talk=org.freedesktop.portal.Flatpak |
||
+ | --talk=org.freedesktop.portal.Desktop |
||
+ | --talk=org.freedesktop.portal.FileChooser |
||
+ | |||
+ | 完全な例: |
||
+ | APP_NAME=app.application.Name |
||
+ | APP_FOLDER="$XDG_RUNTIME_DIR/app/$APP_NAME" |
||
+ | mkdir -p "$APP_FOLDER" |
||
+ | set_up_dbus_proxy() { |
||
+ | bwrap \ |
||
+ | --new-session \ |
||
+ | --symlink /usr/lib64 /lib64 \ |
||
+ | --ro-bind /usr/lib /usr/lib \ |
||
+ | --ro-bind /usr/lib64 /usr/lib64 \ |
||
+ | --ro-bind /usr/bin /usr/bin \ |
||
+ | --bind "$XDG_RUNTIME_DIR" "$XDG_RUNTIME_DIR" \ |
||
+ | --ro-bind-data 3 "/.flatpak-info" \ |
||
+ | --die-with-parent \ |
||
+ | -- \ |
||
+ | env -i xdg-dbus-proxy \ |
||
+ | "$DBUS_SESSION_BUS_ADDRESS" \ |
||
+ | "$APP_FOLDER/bus" \ |
||
+ | --filter \ |
||
+ | --log \ |
||
+ | --talk=org.freedesktop.portal.Flatpak \ |
||
+ | --call="org.freedesktop.portal.Desktop=org.freedesktop.portal.Settings.Read@/org/freedesktop/portal/desktop" \ |
||
+ | --broadcast="org.freedesktop.portal.Desktop=org.freedesktop.portal.Settings.SettingChanged@/org/freedesktop/portal/desktop" 3<<EOF |
||
+ | [Application] |
||
+ | name=$APP_NAME |
||
+ | EOF |
||
+ | } |
||
+ | |||
+ | set_up_dbus_proxy & |
||
+ | sleep 0.1 |
||
+ | |||
+ | bwrap \ |
||
+ | ... |
||
+ | --ro-bind-data 3 /.flatpak-info \ |
||
+ | ... |
||
+ | 3<<EOF |
||
+ | [Application] |
||
+ | name=$APP_NAME |
||
+ | EOF |
||
+ | |||
+ | === ラッピングしたアプリケーションから URL を開く === |
||
+ | |||
+ | ラッピングした IRC やメールクライアントで URL を開くと、起動するブラウザプロセスも同じサンドボックス内で動作します。アプリケーションの分離が強固な場合、うまく機能しないことがあります。[[Firejail]] では [https://github.com/netblue30/firejail/blob/b1479a3730a361221c271226cc56d0724ee109c4/etc/thunderbird.profile#L31-L33 ラッピングしたアプリケーションにブラウザと同じ権限を与える] ことで解決しますが、パーミッションがゆるくなってしまいます。 |
||
+ | |||
+ | 開いた URL をサンドボックスの外と通信するほうが良手です。以下のように {{ic|snapd-xdg-open}} を使ってください: |
||
+ | |||
+ | # {{aur|snapd-xdg-open-git}} をインストール |
||
+ | # {{ic|bwrap}} コマンドラインで以下を追加: |
||
+ | |||
+ | $ bwrap ... \ |
||
+ | --ro-bind /run/user/$UID/bus /run/user/$UID/bus \ |
||
+ | --ro-bind /usr/lib/snapd-xdg-open/xdg-open /usr/bin/xdg-open \ |
||
+ | --ro-bind /usr/lib/snapd-xdg-open/xdg-open /usr/bin/chromium \ |
||
+ | ... |
||
+ | |||
+ | {{ic|/usr/bin/chromium}} のバインドは Mozilla Thunderbird など XDG に準拠していないプログラムでのみ必要です。 |
||
+ | |||
+ | === 新規セッション === |
||
+ | |||
+ | TIOCSTI にはサンドボックスから脱出できるセキュリティ問題が存在します (CVE-2017-5226)。この問題に対応するために、bubblewrap には setsid() を呼び出す新しいオプション '--new-session' が追加されています。ただしこのオプションはときとして扱いにくい挙動上の問題を起こすことがあります。例えば bwrap コマンドでシェルのジョブ制御が機能しなくなります。 |
||
可能であればオプションを使用することが推奨されていますが、そうでない場合は別の方法で問題を解決することが推奨されます。例えば flatpak は SECCOMP を使用します: |
可能であればオプションを使用することが推奨されていますが、そうでない場合は別の方法で問題を解決することが推奨されます。例えば flatpak は SECCOMP を使用します: |
||
https://github.com/flatpak/flatpak/commit/902fb713990a8f968ea4350c7c2a27ff46f1a6c4 |
https://github.com/flatpak/flatpak/commit/902fb713990a8f968ea4350c7c2a27ff46f1a6c4 |
||
+ | |||
+ | === ネストされた名前空間 === |
||
+ | |||
+ | [[Chromium]] などの特定のアプリケーションは、suid ヘルパーファイルを使って独自のサンドボックス環境をすでに実装しています。この仕組みは、bubblewrap container 内で実行されるとブロックされます。 |
||
+ | |||
+ | 1つの解決策は、アプリケーションに bubblewrap によって作成された名前空間を使用させることです。これは {{AUR|zypak}} によって実現できます。これは flatpak でも使われていて、追加の名前空間の中で電子ベースのアプリを実行します。Chromium/[[Electron]] で zypak を使用する方法を示すサンプルコードは [https://github.com/valoq/bwscripts/blob/master/profiles/signal-desktop] で見ることができます。 |
||
==参照== |
==参照== |
2023年12月18日 (月) 08:52時点における最新版
関連記事
bubblewrap は Flatpak から発展した軽量な setuid サンドボックスアプリケーションです。インストール容量が小さくリソース要件は最小限です。アプリケーションパッケージ自体は bubblewrap と呼ばれますが、実際の実行バイナリや man ページで使われている名前は bwrap(1) です。bubblewrap は将来的に Tor Browser (Linux 版) の サンドボックス機構 として使われることが期待されています。特徴として cgroup/IPC/マウント/ネットワーク/PID/ユーザー/UTS 名前空間や seccomp フィルタリングをサポートしています。bubblewrap はサンドボックス内の全てのケイパビリティを破棄して子タスクが親以上の権限を得られないようにします。ファイルパスベースのブラックリストやホワイトリストは対応していません。
目次
インストール
bubblewrap または bubblewrap-gitAUR をインストールしてください。
設定
bubblewrap はコマンドラインから直接起動したり、複雑なラッパー に含まれる シェルスクリプト で呼び出すことができます。サンドボックス内の /var
や /etc
を自動的に読み取り専用に設定する Firejail などのアプリケーションと違って、bubblewrap はそのような操作を行いません。サンドボックス化したいアプリケーションにあわせてどのような設定オプションを指定するかはユーザー次第です。setuid 特権で実行された場合でも bubblewrap は自動的にユーザー名前空間を作成しないので $HOME
や $USER
などの環境変数を利用することが可能です。
strace をダウンロードして、サンドボックス化しようとしているプログラムがどのファイルにアクセスする必要があるかを確認することを強くお勧めします。
bubblewrap の設定マネージャー
引数を手動で設定する代わりに、設定マネージャーを使用して、単純な設定から自動的に bubblewrap を構成できます。
Bubblejail — リソースベースのパーミッションモデルを備えた bubblewrap ベースのサンドボックス (パーミッションを微調整するための GUI を提供)
Crabjail — Simple bubblewrap launcher
使用例
bubblewrap の使用例については、Bubblewrap/例 を参照してください。また bubblewrap を一般的なアプリケーションに使用する方法を示すさまざまなプロジェクトがあります。
No-op
以下のように何もせずに bubblewrap を呼び出すことができます:
$ bwrap --dev-bind / / bash
サンドボックスの外のように振る舞う bash プロセスが生成されます。サンドボックス化したプログラムがおかしくなってしまう場合、上記の no-op から段々と設定をセキュアにしていくことができます。
Bash
シンプルな Bash のサンドボックスを作成:
- 利用可能なカーネル名前空間を確認:
$ ls /proc/self/ns cgroup ipc mnt net pid user uts
$ bwrap --ro-bind / / --unshare-user --uid 256 --gid 512 bash bash-4.4$ id uid=256 gid=512 groups=512,65534(nobody) bash-4.4$ ls -l /usr/bin/bash -rwxr-xr-x 1 nobody nobody 811752 2017-01-01 04:20 /usr/bin/bash
デスクトップエントリ
デスクトップエントリ に Bubblewrap を活用:
- サンドボックスの
/
ディレクトリにホストの/etc
ディレクトリ全体を読み書き可能にバインドする。 - サンドボックスの
/var
と/etc
ディレクトリを読み込み専用に再バインドする。 - サンドボックスの
/dev
に新しい devtmpfs ファイルシステムをマウントする。 - サンドボックス内の
/run
ディレクトリに tmpfs ファイルシステムを作成する。 - 新しいネットワークネームスペースを作成してネットワークアクセスを無効にする。
[Desktop Entry] Name=nano Editor Exec=bwrap --bind / / --dev /dev --tmpfs /run --unshare-net st -e nano -o . %f Type=Application MimeType=text/plain;
mupdf.sh
シェルラッパーを組み込んだ MuPDF デスクトップエントリの例:
[Desktop Entry] Name=MuPDF Exec=mupdf.sh %f Icon=application-pdf.svg Type=Application MimeType=application/pdf;application/x-pdf;
ファイルシステムの分離
ファイルシステムの内容 (/var
、/usr/bin
、/usr/lib
など) をさらに非表示にし、ソフトウェアをインストールすると、pacman に Arch パッケージを分離されたファイルシステムツリーにインストールさせることができます。
pacman を使用してソフトウェアをファイルシステムツリーにインストールするには、fakeroot と fakechroot をインストールする必要があります。
pacman を使用して分離されたファイルシステムツリーに xterm
パッケージをインストールする場合、次のようにツリーを準備する必要があります:
$ MYPACKAGE=xterm $ mkdir -p ~/sandboxes/${MYPACKAGE}/files/var/lib/pacman $ mkdir -p ~/sandboxes/${MYPACKAGE}/files/etc $ cp /etc/pacman.conf ~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf
~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf
を編集して、使用する pacman 設定を調整することもできます:
- 不要なカスタムリポジトリや
IgnorePkg
,IgnoreGroup
,NoUpgrade
,NoExtract
設定を削除してください。 - pacman がディスクスペースのチェックでルートファイルシステムを見つけるのにエラーがあっても無視するように、
CheckSpace
オプションを削除する必要があるかもしれません。
次に、base
グループを必要な fakeroot とともに分離ファイルシステムツリーにインストールします:
$ fakechroot fakeroot pacman -Syu \ --root ~/sandboxes/${MYPACKAGE}/files \ --dbpath ~/sandboxes/${MYPACKAGE}/files/var/lib/pacman \ --config ~/sandboxes/${MYPACKAGE}/files/etc/pacman.conf \ base fakeroot
同じオプションを指定して bubblewrap を繰り返し呼び出すことになるため、エイリアスを作成します:
$ alias bw-install='bwrap \ --bind ~/sandboxes/${MYPACKAGE}/files/ / \ --ro-bind /etc/resolv.conf /etc/resolv.conf \ --tmpfs /tmp \ --proc /proc \ --dev /dev \ --chdir / '
~/sandboxes/${MYPACKAGE}/files/etc/locale.gen
を 編集 し、次を実行して ロケール を設定する必要があります:
$ bw-install locale-gen
Then set up pacman’s keyring:
$ bw-install fakeroot pacman-key --init $ bw-install fakeroot pacman-key --populate
次に、pacman のキーリングを設定します:
$ bw-install fakeroot pacman -S ${MYPACKAGE}
ここで pacman コマンドが失敗した場合は、キーリングを設定するコマンドを再度実行してみてください。
これで、xterm
を含む分離されたファイルシステムツリーが完成しました。bw-install
を再度使用して、ファイルシステムツリーをアップグレードできます。
これで、bubblewrap を使用してソフトウェアを実行できるようになります。この場合、command
は xterm
である必要があります。
$ bwrap \ --ro-bind ~/sandboxes/${MYPACKAGE}/files/ / \ --ro-bind /etc/resolv.conf /etc/resolv.conf \ --tmpfs /tmp \ --proc /proc \ --dev /dev \ --chdir / \ command
一部のファイルはパッケージ間で共有できることに注意してください。既存の親ファイルシステムツリーのすべてのファイルにハードリンクして、新しいツリーで再利用できます:
$ cp -al ~/sandboxes/${MYPARENTPACKAGE} ~/sandboxes/${MYPACKAGE}
次に、bw-install fakechroot fakeroot pacman ...
から pacman を呼び出して、通常どおりインストールを続行します。
トラブルシューティング
X11 を使う
ホストの X11 ソケットを別の X11 ソケットにバインドマウントしても上手く行かないことがあります:
--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X8 --setenv DISPLAY :8
ホストの X11 ソケットをサンドボックス内の同じソケットにバインドマウントすることで解決します:
--bind /tmp/.X11-unix/X0 /tmp/.X11-unix/X0 --setenv DISPLAY :0
X11 のサンドボックス化
bwrap はアプリケーションをサンドボックス化するための素晴らしい隔離機能を備えていますが、X11 ソケットにアクセスできてしまえば簡単に離脱することができます。X11 にはアプリケーション間の分離が存在しないためセキュリティ的に危険です。サンドボックスから X サーバーにアクセスできないようにする方法として Wayland コンポジタに切り替える方法があります。
また、xpra や xephyr を使って新しい X11 環境で実行させるという方法もあります。この方法で bwrap を使うこともできます。
X11 の隔離化をテストするには、xinput test <id>
を実行してください (<id> は xinput list
で確認できるキーボード ID に置き換えてください)。X11 が分離化されていない場合、X11 にアクセスできるアプリケーションはキーロガーのように他のアプリケーションのキーボード入力を盗聴することができてしまいます。
ポータルの使用
回避策 を使用すると、XDG デスクトップ ポータル を使用してプログラムをサンドボックス化できます。主な利点はファイルシステムポータルで、プログラムにホームディレクトリへのアクセス権を与えず、ファイルにアクセスできるようにします。ただし、セキュリティ上の理由から ポータルを使用するには、サンドボックス化されたプログラムが Flatpak の一部であると xdg-desktop-portal
に認識させる必要があります。これは、サンドボックスのルートファイルシステムに .flatpak-info
ファイルを追加することで可能です。
さらに、アクセスできるポータルをより細かく制御するには、xdg-dbus-proxy
を実行する必要があります。これはサンドボックス環境で実行する必要があるため、.flatpak-info
ファイルも必要です。少なくとも、プロキシには org.freedesktop.portal.Flatpak
へのトークアクセスが必要です。追加のポータルは flatpak.org/en/latest/portal-api-reference.html Flatpak ドキュメント で見つけることができます。
一般的な使用例は、プログラムがホームディレクトリに 100% アクセスできないように制限し、代わりにユーザーが選択したファイルとフォルダのみにアクセスできるようにすることです。これを実現するには、次の引数を使用して xdg-dbus-proxy
を起動できます:
--talk=org.freedesktop.portal.Documents --talk=org.freedesktop.portal.Flatpak --talk=org.freedesktop.portal.Desktop --talk=org.freedesktop.portal.FileChooser
完全な例:
APP_NAME=app.application.Name APP_FOLDER="$XDG_RUNTIME_DIR/app/$APP_NAME" mkdir -p "$APP_FOLDER" set_up_dbus_proxy() { bwrap \ --new-session \ --symlink /usr/lib64 /lib64 \ --ro-bind /usr/lib /usr/lib \ --ro-bind /usr/lib64 /usr/lib64 \ --ro-bind /usr/bin /usr/bin \ --bind "$XDG_RUNTIME_DIR" "$XDG_RUNTIME_DIR" \ --ro-bind-data 3 "/.flatpak-info" \ --die-with-parent \ -- \ env -i xdg-dbus-proxy \ "$DBUS_SESSION_BUS_ADDRESS" \ "$APP_FOLDER/bus" \ --filter \ --log \ --talk=org.freedesktop.portal.Flatpak \ --call="org.freedesktop.portal.Desktop=org.freedesktop.portal.Settings.Read@/org/freedesktop/portal/desktop" \ --broadcast="org.freedesktop.portal.Desktop=org.freedesktop.portal.Settings.SettingChanged@/org/freedesktop/portal/desktop" 3<<EOF [Application] name=$APP_NAME EOF } set_up_dbus_proxy & sleep 0.1 bwrap \ ... --ro-bind-data 3 /.flatpak-info \ ... 3<<EOF [Application] name=$APP_NAME EOF
ラッピングしたアプリケーションから URL を開く
ラッピングした IRC やメールクライアントで URL を開くと、起動するブラウザプロセスも同じサンドボックス内で動作します。アプリケーションの分離が強固な場合、うまく機能しないことがあります。Firejail では ラッピングしたアプリケーションにブラウザと同じ権限を与える ことで解決しますが、パーミッションがゆるくなってしまいます。
開いた URL をサンドボックスの外と通信するほうが良手です。以下のように snapd-xdg-open
を使ってください:
- snapd-xdg-open-gitAUR をインストール
bwrap
コマンドラインで以下を追加:
$ bwrap ... \ --ro-bind /run/user/$UID/bus /run/user/$UID/bus \ --ro-bind /usr/lib/snapd-xdg-open/xdg-open /usr/bin/xdg-open \ --ro-bind /usr/lib/snapd-xdg-open/xdg-open /usr/bin/chromium \ ...
/usr/bin/chromium
のバインドは Mozilla Thunderbird など XDG に準拠していないプログラムでのみ必要です。
新規セッション
TIOCSTI にはサンドボックスから脱出できるセキュリティ問題が存在します (CVE-2017-5226)。この問題に対応するために、bubblewrap には setsid() を呼び出す新しいオプション '--new-session' が追加されています。ただしこのオプションはときとして扱いにくい挙動上の問題を起こすことがあります。例えば bwrap コマンドでシェルのジョブ制御が機能しなくなります。
可能であればオプションを使用することが推奨されていますが、そうでない場合は別の方法で問題を解決することが推奨されます。例えば flatpak は SECCOMP を使用します: https://github.com/flatpak/flatpak/commit/902fb713990a8f968ea4350c7c2a27ff46f1a6c4
ネストされた名前空間
Chromium などの特定のアプリケーションは、suid ヘルパーファイルを使って独自のサンドボックス環境をすでに実装しています。この仕組みは、bubblewrap container 内で実行されるとブロックされます。
1つの解決策は、アプリケーションに bubblewrap によって作成された名前空間を使用させることです。これは zypakAUR によって実現できます。これは flatpak でも使われていて、追加の名前空間の中で電子ベースのアプリを実行します。Chromium/Electron で zypak を使用する方法を示すサンプルコードは [1] で見ることができます。