コンテナという「個室」を守る鉄の掟: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 コマンドを叩いてみてください。今、どんなガードマンが動いているかを確認することから、あなたのセキュリティ対策は始まります!
また次回の記事で、より深い「インシデントハンドリングの極意」についてお話ししましょう。それでは、安全なデプロイライフを!
コメント