【入門編】 AppArmor/SELinuxによるコンテナの強制アクセス制御(MAC) – インフラ・ネットワーク & クラウドセキュリティ防御ガイド

コンテナという「個室」を守る鉄の掟:AppArmorとSELinuxで脱獄を防ごう

こんにちは!セキュリティの世界へようこそ。

皆さんは普段、DockerやKubernetesでコンテナを動かしていることと思います。コンテナって本当に便利ですよね。でも、ちょっと想像してみてください。もしその「便利なコンテナ」が、泥棒にこじ開けられたとしたら……。

多くの人は「コンテナがあるから大丈夫」と油断していますが、実はコンテナは「魔法の箱」ではありません。 攻撃者は、コンテナという個室の壁を突き破って、あなたの家の本宅(ホストOS)に侵入しようと手ぐすねを引いています。

今日は、そんな「コンテナ脱獄(Escape)」を防ぐための最後の砦、AppArmorとSELinuxについて、泥臭い現場の視点からお話しします。

—

1. コンテナの壁は意外と薄い?「脱獄」の正体

まず、イメージしてみてください。コンテナは「鍵のかかったアパートの部屋」です。でも、もしその部屋の住人(プロセス)が、実は「部屋の鍵を複製する能力」を持っていたらどうでしょう?

攻撃者は、コンテナの中で動いているアプリの脆弱性を突き、コンテナを乗っ取ります。そして、コンテナとホストOSの隙間を探して、「ここからなら外に出られる!」という穴を見つけて脱獄してくるのです。これが「コンテナ脱獄」です。

これを防ぐのが、今回紹介する強制アクセス制御(MAC)です。

—

2. AppArmor / SELinux は「最強のガードマン」

MAC(Mandatory Access Control)を一言で言うと、「たとえ住人(プロセス)が管理人室の鍵を持っていても、管理人室には絶対に入らせない」というルールを強制する仕組みです。

  • AppArmor: プロファイルという「行動リスト」を読み込ませて、「お前はこれとこれしか触っちゃダメだよ」と具体的に指図するガードマン。
  • SELinux: すべてのファイルやプロセスに「ラベル」を貼り、ラベル同士の相性が悪いものは一切通信させない、厳格な役人さん。

どちらも強力ですが、今回は初心者でも比較的扱いやすい「AppArmor」を例に、具体的な防御の仕組みを見ていきましょう。

—

3. 実践!AppArmorでコンテナを縛り上げる

例えば、Webサーバーのコンテナが「設定ファイル以外」を触れないように設定するプロファイルは、こんな雰囲気になります。

# プロファイルの設定例(/etc/apparmor.d/docker-nginx)
profile docker-nginx flags=(attach_disconnected,mediate_deleted) {
  # 基本的に何も許可しない
  deny /** w,  # すべての書き込みを拒否

  # 特定の場所だけ読み込みを許可
  /etc/nginx/** r, 
  /var/log/nginx/** w, # ログの書き込みだけはOKにする
  
  # ネットワークは許可しない(Webサーバーならここを調整)
  deny network,
}

このように、「何ができるか」ではなく、「何をやってはいけないか」を極限まで絞り込むのがセキュリティの鉄則です。

どうやって適用するの?

Dockerを使う場合、--security-optオプションを使うだけで、このガードマンを配備できます。

# 「docker-nginx」というプロファイルを適用してコンテナを起動
docker run --security-opt "apparmor=docker-nginx" nginx:latest

これだけで、コンテナが万が一乗っ取られても、怪しいコマンドを打たれた瞬間にガードマンが「それは許可されていません!」とピシャリと止めてくれるようになります。

—

4. なぜ「面倒」なことをするのか?

正直に言います。これらの設定は、開発の初期段階では「面倒」です。動かなければならない機能がガードマンに止められて、エラーログを読み漁る夜を過ごすこともあるでしょう。

でも、考えてみてください。
もしあなたのサーバーが乗っ取られて、顧客の個人情報が流出したら?あるいは、あなたのサーバーが闇のネットワークの踏み台にされて、世界中に攻撃を撒き散らしてしまったら?

その時の代償は、ガードマンを設定する手間に比べて、あまりにも大きすぎます。

—

最後に:一歩ずつ、強固なインフラへ

セキュリティは「完成」がありません。昨日までの安全が、今日の脆弱性で崩れることもあります。だからこそ、こうした「多層防御」の考え方が大切なんです。

  • まずはコンテナを最新の状態に保つこと。
  • 次に、不要な権限を削ぎ落とすこと。
  • そして最後に、AppArmorやSELinuxで、万が一の時の「保険」をかけておくこと。

この「一歩ずつ」の積み重ねが、あなたを、そしてあなたの作るサービスを守る最強の武器になります。

まずは、自分の環境で aa-status コマンドを叩いてみてください。今、どんなガードマンが動いているかを確認することから、あなたのセキュリティ対策は始まります!

また次回の記事で、より深い「インシデントハンドリングの極意」についてお話ししましょう。それでは、安全なデプロイライフを!

コメント

タイトルとURLをコピーしました