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
  1. ポートマッピングを -p 8080:80 に変更する
  2. --cgroup-parent オプションを使って cgroups の設定を変更し、ポートの使用範囲を拡張する
  3. firewalld で 80 番ポートの開放設定を行う
  4. コンテナ内で 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 など)を行う仕組みであり、ポートの使用範囲や特権ポートへのバインド権限とは関係ありません。

選択肢3firewalld で 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 試験開発コミュニティ

ページトップへ