非特権プロセスによるユーザー名前空間の利用制限
「Ubuntu 23.10」で非特権プロセスによるユーザー名前空間の利用に制限が加わります。セキュリティーリスクを軽減するため
非特権プロセスによるユーザー名前空間の利用に制限が加えられるのは、ユーザー名前空間の利用におけるセキュリティーリスクを軽減するためです。非特権プロセスによるユーザー名前空間
非特権プロセスによるユーザー名前空間は異なるユーザーID(setuid)とグループID(setguid)を設定できるようにするカーネルの機能です。この機能を活用することでアプリはより安全なサンドボックス環境を構築できます。
しかしこの機能は特権(root)を持つプロセスのみに利用を制限されるカーネルのインターフェースを非特権プロセスに公開することになります。
必要以上に非特権プロセスにカーネルインターフェースを公開すると、新たなセキュリティーリスクが生まれます。
つまりそのカーネルインターフェースを対象に攻撃を仕掛ける悪意あるソフトウェアの標的になりかねませんし、また実際にその脆弱性が報告されています。
ユーザー名前空間を無効化する方法もある
このセキュリティーリスクを軽減するためにユーザー名前空間を無効化する方法もあります。しかしこの方法はユーザー名前空間を利用しているアプリが動作しなくなる可能性もあります。
一般的に悪意あるソフトウェアは特定のアプリを標的にしており、システム全体でユーザー名前空間を無効化しなくても、そのアプリでユーザー名前空間を無効化すれば、このセキュリティーリスクを軽減できるでしょう。
Ubuntuの対応方針
というわけで「Ubuntu 23.10」でユーザー名前空間の利用に制限が導入されます。この利用制限は「AppArmor」を利用して導入されます。
AppArmor
「AppArmor」は「Ubuntu」で導入されている「Linux Security Modules(LSM)」です。「AppArmor」の役割はプロセスの振る舞い(出来ること)に制限をかけることです。
ちなみに同じ役割を持つ「LSM」に「SELinux」があります。
選択的無効化
「AppArmor」により選択的にユーザー名前空間の利用を許可もしくは禁止できます。この設定の定義はAppArmorプロファイルで行い、アプリごとAppArmorプロファイルを作成します。
AppArmorプロファイルで明示的に「Confined」モードかつ「userns」ルールが指定されているアプリのみ、ユーザー名前空間を利用できます。
言い換えればAppArmorプロファイルを作成しない限り、そのアプリはデフォルトでユーザー名前空間を作成できなくなります。
AppArmorプロファイルの作成は大変
AppArmorプロファイルにはアプリに許可すべき権限を指定するのですが、それぞれのアプリごとに完璧なAppArmorプロファイルを作成するのは現実的ではありません。特にカジュアルユーザーには非常に難しい作業になるでしょう。
Unconfinedプロファイルモード
そこで「AppArmor」に新しい「Unconfined」プロファイルモードが導入されました。このモードではアプリは「Unconfined」のままになりますが、ユーザー名前空間の利用を許可する「userns」ルールが導入され、このルールを利用してユーザー名前空間を許可できるようになりました。
例えば「Google Chrome」にユーザー名前空間の利用を許可するAppArmorプロファイルを作成する場合、「/etc/apparmor.d/opt.google.chrome.chrome」ファイルに以下の名用を記述します。
abi <abi/4.0>,
include <tunables/global>
/opt/google/chrome/chrome flags=(unconfined) {
userns,
# Site-specific additions and overrides. See local/README for details.
include if exists <local/opt.google.chrome.chrome>
}
include <tunables/global>
/opt/google/chrome/chrome flags=(unconfined) {
userns,
# Site-specific additions and overrides. See local/README for details.
include if exists <local/opt.google.chrome.chrome>
}
補足
リンク先では「default_allow」と紹介されていますが、リリースノートや実際に「Ubuntu 23.10」にインストールされるAppArmorプロファイルを見ると「unconfined」になっているため、ここでも「unconfined」で紹介しています。そうは言ってもカジュアルユーザーが困る
ユーザーから見た場合今回の制限は、「Firefox」や「Google Chrome」などサンドボックスを利用するソフトウェアも影響を受けます。そこで「Ubuntu」開発チームは、「Ubuntu」が提供するアプリの内、本件に影響を受けるアプリをリストアップして、これらのアプリに対応したAppArmorプロファイルを作成しています。
サードパーティー製のアプリもカバーしたい
加えて「apparmor」のバイナリーパッケージ(ユーザーがインストールするパッケージ)にAppArmorプロファイルを同梱する計画も立てられています。これは「apparmor-profiles」パッケージやアプリのパッケージの中身を比較及び確認しながら、影響を受けるアプリのAppArmorプロファイルを同梱する予定です。
これにより例えば「Ubuntu」が提供していない「Google Chrome」でも、「/opt/google
/chrome/chrome」に対応したAppArmorプロファイルを提供できるようになります。
それでも漏れるアプリもある
世の中には多数のアプリがあります。例え「Ubuntu」側が特定のアプリに対応したAppArmorプロファイルを提供したとしても、必ずそこから漏れてしまうアプリもあります。
その場合そのアプリは前述したとおりユーザー名前空間の利用を拒否されます。
またAppArmorプロファイルはアプリのバイナリーを完全なパスも含め認識するため、もし仮に「Google Chrome」が「/opt/google/chrome/chrome」以外の場所にインストールされた場合、「Ubuntu」が提供するAppArmorプロファイルは機能しなくなります。
最善の方法は
本件に関する最善の方法は、アプリの開発者自身がAppArmorプロファイルを提供することです。制限の導入と開始時期
制限自体の導入は「Ubuntu 23.10」で行われますが、デフォルトでは無効になっており、ユーザーが任意に有効化できます。つまり従来どおり利用に制限が加えられておらず、アプリはユーザー名前空間を利用できます。
しかし多くのユーザーからこの制限によるフィードバックを得るため、「Ubuntu 23.10」リリースした週数間後にアップデートを通じてユーザー名前空間の利用制限がデフォルトで有効になります。
システム全体で制限を制御するには
システム全体でユーザー名前空間の利用制限を有効にするには、以下のコマンドを実行します。sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=1
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=1
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=1
システム全体でユーザー名前空間の利用制限を無効にするには、以下のコマンドを実行します。
sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
ただしこの方法を利用して「Ubuntu」を日常的に運用することは推奨されません。
今回の制限とLinux kernel 6.5の関係について
今回の制限は「AppArmor」で制御される制限であり、「Ubuntu 23.10」で採用される「Linux kernel 6.5」で直接的な制御を行う制限ではありません。今後リリース予定の「Ubuntu 22.04.4 LTS」で「Ubuntu 23.10」の「Linux kernel 6.5」が導入されますが、「Ubuntu 22.04.4 LTS」で本件による制限を受けることはありません。