LinuCレベル3 3SS試験の例題と解説
主題3SS.03堅牢なコンテナ設計
3SS.03.2Rootless モード
LinuCレベル3 SS試験の出題範囲から「3.2_Rootless モード」についての例題を解いてみます。
LinuCレベル3 セキュリティスペシャリスト 3SS試験 出題範囲
例題
一般ユーザー権限で実行する Rootless モードの Docker で以下のコマンドを実行したところ、bind: permission denied エラーが発生した。Rootless モードのセキュリティ利点を維持したまま、この問題を解決する方法は次のうちどれか。
$ docker run -d -p 80:80 --name webapp my-webapp-image- ポートマッピングを 
-p 8080:80に変更する --cgroup-parentオプションを使って cgroups の設定を変更し、ポートの使用範囲を拡張するfirewalldで 80 番ポートの開放設定を行う- コンテナ内で 
sysctl net.ipv4.ip_unprivileged_port_start=80を実行してポート制限を変更する 
※この例題は実際の試験問題とは異なります。
解答と解説
正解は、「1.ポートマッピングを -p 8080:80 に変更する」です。
問題の背景
Rootless モードの Docker では、User namespace により、ホスト上で一般ユーザー権限で動作します。一般ユーザーには特権ポート(1024未満)をバインドする権限がないため、-p 80:80 のようにホスト側で特権ポートを使用しようとすると bind: permission denied エラーが発生します。
各選択肢の解説
選択肢1: ポートマッピングを -p 8080:80 に変更する
-p オプションの形式は -p ホストポート:コンテナポート です。
-p 80:80: ホスト側80番ポート → コンテナ側80番ポート(エラー発生)-p 8080:80: ホスト側8080番ポート → コンテナ側80番ポート(正常動作)
ホスト側のポートを非特権ポート(8080)に変更することで、一般ユーザー権限でもバインドが可能となり、問題が解決します。コンテナ内部では引き続き80番ポートで動作するため、アプリケーション側の変更は不要です。
選択肢2: --cgroup-parent オプションを使って cgroups の設定を変更し、ポートの使用範囲を拡張する
cgroups はコンテナのリソース管理(CPU、メモリ、I/O など)を行う仕組みであり、ポートの使用範囲や特権ポートへのバインド権限とは関係ありません。
選択肢3: firewalld で 80 番ポートの開放設定を行う
firewalld はファイアウォールの設定を管理するツールであり、外部からのアクセス制御を行います。特権ポートへのバインド権限の問題とは無関係です。
選択肢4: コンテナ内で sysctl net.ipv4.ip_unprivileged_port_start=80 を実行してポート制限を変更する
問題はホスト側でdockerdが80番ポートをバインドできないことです。通常、コンテナ内からsysctlでカーネルパラメータを変更することはできません。--privilegedオプションなしでは、ほとんどのsysctl設定は読み取り専用です。また、ホスト側でnet.ipv4.ip_unprivileged_port_start=80を設定できたとしても、これはシステム全体のセキュリティ設定を緩和することになり、「Rootlessモードのセキュリティ利点を維持したまま」という要件に反します。
例題作成者
LinuC 試験開発コミュニティ