コンテンツにスキップ

「Bubblewrap」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
文字列「http://mupdf.com」を「https://mupdf.com」に置換
Kgx (トーク | 投稿記録)
序文を更新
 
(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 ページで使われている''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 はサンドボックス内の全ての[[ケイパビリティ]]を破棄して子タスクが親以上の権限を得られないようにします。ファイルパスベースのブラックリストやホワイトリストは対応していません。
[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|/}} ディレクトリ全体を読み書き可能でサンドボックスの {{ic|/}} にバインド。
* サンドボックスの {{ic|/var}} と {{ic|/etc}} ディレクトリを読み込み専用バインドする
* サンドボックスの {{ic|/var}} {{ic|/etc}} ディレクトリ読み取り専用で再バイ
* サンドボックスの {{ic|/dev}} に新しい devtmpfs ファイルシステムマウトする。
* 新しい devtmpfs ファイルシステムをサンドボックスの {{ic|/dev}} にマウント。
* サンドボックスの {{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}} に書き込むには {{Ic|--dev /dev}} が必要です}}
{{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}} PATH が通った場所配置てください。例: {{Ic|1=PATH=$PATH:$HOME/bwrap}}}}
{{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|.Xauthority}} をバインドマウントしてから tmpfs ファイルシステムを作成して上書きするとサドボックからは ''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時点における最新版

bubblewrapFlatpak から発展した軽量な setuid サンドボックスアプリケーションです。インストール容量が小さくリソース要件は最小限です。アプリケーションパッケージ自体は bubblewrap と呼ばれますが、実際の実行バイナリや man ページで使われている名前は bwrap(1) です。bubblewrap は将来的に Tor Browser (Linux 版) の サンドボックス機構 として使われることが期待されています。特徴として cgroup/IPC/マウント/ネットワーク/PID/ユーザー/UTS 名前空間seccomp フィルタリングをサポートしています。bubblewrap はサンドボックス内の全てのケイパビリティを破棄して子タスクが親以上の権限を得られないようにします。ファイルパスベースのブラックリストやホワイトリストは対応していません。

警告 Bubblewrap は、名前空間や seccomp フィルターなどのサンドボックス技術を提供するツールです。デフォルトでは、X11 ウィンドウシステムのような弱点を分離する完全なサンドボックスは提供されません (X11 のサンドボックス化 を参照) 信頼できないコードの実行は安全ではなく、サンドボックスではこれを変更できません。

インストール

bubblewrap または bubblewrap-gitAURインストールしてください。

ノート

設定

bubblewrap はコマンドラインから直接起動したり、複雑なラッパー に含まれる シェルスクリプト で呼び出すことができます。サンドボックス内の /var/etc を自動的に読み取り専用に設定する Firejail などのアプリケーションと違って、bubblewrap はそのような操作を行いません。サンドボックス化したいアプリケーションにあわせてどのような設定オプションを指定するかはユーザー次第です。setuid 特権で実行された場合でも bubblewrap は自動的にユーザー名前空間を作成しないので $HOME$USER などの環境変数を利用することが可能です。

strace をダウンロードして、サンドボックス化しようとしているプログラムがどのファイルにアクセスする必要があるかを確認することを強くお勧めします。

bubblewrap の設定マネージャー

引数を手動で設定する代わりに、設定マネージャーを使用して、単純な設定から自動的に bubblewrap を構成できます。

Bubblejail — リソースベースのパーミッションモデルを備えた bubblewrap ベースのサンドボックス (パーミッションを微調整するための GUI を提供)

https://github.com/igo95862/bubblejail || bubblejailAUR, bubblejail-gitAUR

Crabjail — Simple bubblewrap launcher

https://codeberg.org/crabjail/crabjail ||

使用例

bubblewrap の使用例については、Bubblewrap/例 を参照してください。また bubblewrap を一般的なアプリケーションに使用する方法を示すさまざまなプロジェクトがあります。

No-op

以下のように何もせずに bubblewrap を呼び出すことができます:

$ bwrap --dev-bind / / bash

サンドボックスの外のように振る舞う bash プロセスが生成されます。サンドボックス化したプログラムがおかしくなってしまう場合、上記の no-op から段々と設定をセキュアにしていくことができます。

ノート 所有者またはグループが現在のものでない場合、この操作はすべての所有者とグループを nobody に変更します。これは、sudo のようなプログラムを実行すると正しく動作しないことを示唆しています。

Bash

シンプルな Bash のサンドボックスを作成:

  • 利用可能なカーネル名前空間を確認:
$ ls /proc/self/ns 
cgroup  ipc  mnt  net  pid  user uts
ノート user が存在する場合、CONFIG_USER_NS=y によってカーネルのユーザー名前空間のサポートが有効になっています。
  • ホストの / ディレクトリ全体を読み取り専用としてサンドボックスの / にバインド。
  • 新しいユーザー名前空間を作成してユーザー ID256 に、グループ ID512 に設定。
$ 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;
ノート /dev/pty に書き込むには、--dev /dev が必要です
  • mupdf.sh シェルラッパーを組み込んだ MuPDF デスクトップエントリの例:
[Desktop Entry]
Name=MuPDF
Exec=mupdf.sh %f
Icon=application-pdf.svg
Type=Application
MimeType=application/pdf;application/x-pdf;
ノート mupdf.sh が実行可能 PATH 内にあることを確認します (例:PATH=$PATH:$HOME/bwrap)

ファイルシステムの分離

警告 bubblewrap ユーザーは、ファイルシステムツリーを定期的に更新する必要があります。

ファイルシステムの内容 (/var/usr/bin/usr/lib など) をさらに非表示にし、ソフトウェアをインストールすると、pacman に Arch パッケージを分離されたファイルシステムツリーにインストールさせることができます。

pacman を使用してソフトウェアをファイルシステムツリーにインストールするには、fakerootfakechroot をインストールする必要があります。

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 を使用してソフトウェアを実行できるようになります。この場合、commandxterm である必要があります。

$ 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 コンポジタに切り替える方法があります。

また、xpraxephyr を使って新しい X11 環境で実行させるという方法もあります。この方法で bwrap を使うこともできます。

X11 の隔離化をテストするには、xinput test <id> を実行してください (<id> は xinput list で確認できるキーボード ID に置き換えてください)。X11 が分離化されていない場合、X11 にアクセスできるアプリケーションはキーロガーのように他のアプリケーションのキーボード入力を盗聴することができてしまいます。

ポータルの使用

警告 これは、xdg-desktop-poral騙して サンドボックスプログラムを Flatpak であると思わせる回避策を利用しています。サンドボックスやポータルであっても、信頼できないコードの実行は決して安全ではないことに注意してください。

回避策 を使用すると、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 を使ってください:

  1. snapd-xdg-open-gitAUR をインストール
  2. 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] で見ることができます。

参照