こんにちは!インフラやセキュリティの世界へようこそ。
初めてサーバーを触ったり、コンテナ(Dockerなど)を使ったアプリ開発を始めたりすると、覚えることが山ほどあって圧倒されてしまいますよね。「セキュリティを高めましょう」と言われても、なんだか難しそうな専門用語ばかりで、どこから手を付ければいいか悩んでしまうのは当然のことです。
今回は、そんなセキュリティの基本でありながら、現場のプロも絶対に外さない重要テーマ「AppArmor/SELinuxによるコンテナの強制アクセス制御(MAC)」について、身近な防犯の仕組みに例えながら、一歩ずつ優しく紐解いていきたいと思います。
肩の力を抜いて、一緒に見ていきましょう!
—
1. 「コンテナは安全」って本当? 家の鍵に例えて考えてみよう
皆さんは「コンテナ技術(Dockerなど)」を使ったことがありますか?
アプリを動かすためのプログラムや設定をひとまとめにして、どこでも同じように動かせる便利な仕組みですよね。よく「コンテナは仮想的な箱に入っているから、外の世界とは隔離されていて安全」と言われます。
これを、「シェアハウスの個室」に例えてみましょう。
- コンテナ = シェアハウスの個室
- ホストOS(大元のサーバー) = 家全体(リビングや管理人室)
「自分の個室(コンテナ)の鍵を閉めておけば、他の人(外部の攻撃者)に入られることはないだろう」と思いますよね。確かに、それは通常のアクセス制御(DAC:自主的アクセス制御と呼ばれる、おなじみのファイルの読み書き権限)の考え方です。
しかし、もしあなたの部屋の合鍵を持った悪意ある訪問者が現れたり、窓の鍵が壊されて部屋の中に侵入されてしまったらどうなるでしょうか?
個室のなかにいる間はまだいいものの、その人がもしリビング(ホストOS)への扉をこじ開けて、家全体の権利を奪ってしまったら……。シェアハウス全体が大混乱に陥ってしまいますよね。
コンテナの世界でも全く同じことが起き得ます。万が一、コンテナで動いているWebアプリに脆弱性が見つかり、攻撃者に侵入されてしまったとき、「コンテナの中だけで被害をとどめる(外の世界に手を伸ばさせない)」ための強力な防犯ロックが、今回紹介するAppArmorやSELinuxという技術なのです。
—
2. 強制アクセス制御(MAC)ってなに? 身の回りの「警備員」の仕組み
ここで登場するのが、強制アクセス制御(MAC:Mandatory Access Control)という言葉です。なんだか厳めしい名前ですが、仕組みはとてもシンプルです。
先ほどのシェアハウスの例えをもう少し進めてみましょう。
- 通常のアクセス制御(DAC):
住人が「この部屋の鍵は誰に貸そうかな」と自分で自由に決められる状態です。もし住人がうっかり全員に合鍵を配ってしまったり、セキュリティ意識が低くて鍵をかけ忘れたりすると、簡単に泥棒に入られてしまいます。
- 強制アクセス制御(MAC):
マンションの管理会社(あるいは警察)がガチガチにルールを決めていて、住人の意思に関わらず、「この人はリビングに入ってはいけない」「この人はこの棚のファイルに触ってはいけない」とシステムが強制的に制限する仕組みです。
AppArmorやSELinuxは、まさにこの「厳格な警備員」の役割を果たしてくれます。
たとえアプリ(コンテナ)が乗っ取りにあってハッカーに操作されたとしても、警備員が後ろで目を光らせており、「おい、お前はそのファイルに触る権限がないからダメだ!」と、バシッと強制的にブロックしてくれるわけです。
—
3. AppArmorとSELinuxの違いは? どっちを使えばいいの?
Linuxの世界には、この強制アクセス制御を行う有名な仕組みが2つあります。それが AppArmor と SELinux です。
ざっくりとしたキャラクターの違いはこんなイメージです。
- AppArmor(アップアーマー):
- 特徴: 比較的シンプルで、設定ファイル(プロファイル)が人間にとって読みやすい。UbuntuやDebianなどのOSでよく標準採用されています。
- 向いている人: 「まずは分かりやすく、手堅くコンテナをガードしたい!」という初心者の方。
- SELinux(エスイーリナックス):
- 特徴: セキュリティの要件が非常に厳格で、ラベル(色分けのようなもの)を使って細かく制御する。Red Hat Enterprise Linux (RHEL)やCentOSなどで標準採用されています。
- 向いている人: 金融機関や政府系など、絶対に破られてはならない堅牢なシステムを構築するプロフェッショナル。
どちらも「コンテナの行動範囲をルールブック(プロファイル)で制限する」という目的は同じです。今回は、より直感的に分かりやすいAppArmorを例に、実際の動きを覗いてみましょう!
—
4. 実践!AppArmorでコンテナの行動を制限してみよう
それでは、実際にDockerなどのコンテナ環境で、AppArmorがどのように動いているのか見ていきましょう。
実は、最近の主要なLinuxディストリビューションやDocker環境では、コンテナを起動した瞬間にデフォルトのAppArmorプロファイル(ルールブック)が自動的に適用されています。これにより、コンテナの中のプロセスが、ホストOSの重要なシステムファイル(例えば /proc/ や /sys/ の一部など)を勝手に書き換えられないよう、すでに守られているのです。
しかし、より安全性を高めるために、特定のコンテナ専用の「特製ルール」を作って適用することもできます。
ステップ1:独自のプロファイルを書く(例)
以下は、「このコンテナは特定のログファイル以外への書き込みを一切禁止する」というルール(プロファイル)の簡単なサンプルです。
# プロファイルの定義開始(コンテナ用の厳格なルール)
#include <tunables/global>
profile docker-restricted-container flags=(attach_disconnected,mediate_deleted) {
# 基本的なシステムコマンドの読み込み許可(最低限動くようにする)
/bin/bash ixr,
/bin/cat ixr,
/bin/ls ixr,
# ホストの重要なシステムディレクトリへのアクセスは全面的に禁止(拒否)
deny /etc/shadow r,
deny /etc/passwd r,
# アプリケーションが読み書きしてよい専用ディレクトリの指定
/app/data/ rw,
/app/data/** rwk,
}
このルールブックを眺めてみると、「何が許可されていて(r, w, x など)、何が deny(拒否)されているか」が何となく分かりますよね。
もし、このコンテナに侵入した攻撃者が /etc/shadow(パスワードのハッシュ値が保存されている超重要ファイル)を盗み出そうとしても、AppArmorのプロファイルに deny と書かれているため、システムが強制的にアクセスを遮断し、ログに警告を残してくれます。
ステップ2:コンテナにプロファイルを適用して起動する
作成したルールブック(例として名前を docker-restricted-container とします)をシステムに読み込ませた後、Dockerコンテナを起動する際に以下のように指定します。
# --security-opt オプションを使って、AppArmorのルールをコンテナに紐づける
docker run --rm -it \
--security-opt apparmor=docker-restricted-container \
ubuntu:latest \
/bin/bash
このように起動することで、このコンテナ内で万が一ゼロデイ脆弱性などが突かれても、プロファイルの外側の世界(ホストOSや他のアプリ領域)へは一歩も足を踏み出すことができなくなります。これが「侵害時の被害範囲を限定する」という防御の真髄です。
—
5. まとめ:一歩ずつ、確実にセキュリティの盾を厚くしよう
今回は、AppArmorやSELinuxによるコンテナの強制アクセス制御(MAC)について、シェアハウスの防犯や警備員に例えて解説しました。
- コンテナの「個室の鍵(通常のアクセス制御)」だけでは、破られたときに家全体が危険になる。
- AppArmorやSELinuxという「強制的な警備員(MAC)」を置くことで、侵入されても行動範囲をガッチリ制限できる。
- プロファイル(ルールブック)を使って、「何ができて、何をしてはいけないか」を明確にする。
最初は難しく感じるかもしれませんが、インフラやセキュリティの基本は「もし破られたらどうなるか?」を想像し、何重もの防壁(多層防御)を張っていくことに尽きます。
焦る必要はありません。まずはご自身の開発環境や検証環境で、コンテナがどんなセキュリティオプションで動いているかを確認することから、一歩ずつ進めてみましょう。あなたの手掛けるシステムが、より安全で信頼できるものになるよう、これからも一緒に学んでいきましょうね!
コメント