コンテナが「店ごと乗っ取られる」のを防ぐ!リソース制限で守るサーバーの要塞化
こんにちは。現場で泥臭いインシデント対応を続けてきた身として、今日は「コンテナ」と「リソース制限」のお話をします。
新人の皆さん、あるいは開発を始めたばかりの皆さん。皆さんが作ったアプリケーションが動く場所(コンテナ)を、「無制限に何でもできる無法地帯」にしてしまっていませんか?
実は、ここを放置すると、悪意ある攻撃者に「お店の食材を全部買い占められて、他のお客さんが何も注文できなくなる」という、いわゆるDoS(サービス拒否)攻撃をいとも簡単に許してしまうんです。今日は、なぜリソース制限が必要なのか、どうやって守ればいいのかを、一緒に紐解いていきましょう。
—
1. コンテナの「暴走」は、なぜ起きるのか?
身近な例えでお話ししますね。あなたは小さなお店を経営しています。そこへ、たった一人のお客さんがやってきて、「メニューにあるもの全部!在庫がなくなるまで全部注文して!」と叫んだらどうなるでしょう?
当然、お店の在庫は一瞬で尽き、他のお客さんは何も買えなくなりますよね。これと同じことが、サーバーの世界でも起きます。
コンテナは本来、独立した環境ですが、物理的なサーバーの「CPU」や「メモリ」という資源を共有しています。もし、あるコンテナがバグや攻撃によって「メモリを限界まで使い尽くす」という命令を受け取ったら、同じサーバー内で動いている他のコンテナや、OSそのものが動けなくなってしまいます。これがリソース枯渇によるDoS攻撃の正体です。
—
2. 「これ以上はダメ!」という防波堤を築く
この事態を防ぐための最も基本的な対策が、リソース制限(ハーデニング)です。
Kubernetesの世界では、大きく分けて2つの「防波堤」を用意します。
① LimitRange(コンテナの個室ルール)
「この部屋(コンテナ)に入れるのは、せいぜいこれくらいまでね」という、個々のコンテナに対する制限です。
apiVersion: v1
kind: LimitRange
metadata:
name: limit-my-app
spec:
limits:
- default:
memory: 512Mi # 最大ここまで使っていいよ(上限)
cpu: 500m # CPUもこれ以上は使わせない
defaultRequest:
memory: 256Mi # 最低限これくらいは用意するね(予約分)
cpu: 250m
type: Container
② ResourceQuota(お店全体の在庫制限)
「お店全体で使えるCPUとメモリの合計はここまで!」という、エリア単位の制限です。これがあれば、仮に1つのコンテナが暴走しても、影響を一定範囲内に閉じ込めることができます。
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
spec:
hard:
requests.cpu: "2" # 合計でCPUを2つ分まで
requests.memory: 2Gi # 合計でメモリを2GBまで
limits.cpu: "4" # バーストしても4つ分まで
limits.memory: 4Gi # バーストしても4GBまで
—
3. なぜ「制限」が最強の防犯対策なのか?
「制限をかけると、アプリが動かなくなるんじゃないの?」と心配になるかもしれません。でも、考えてみてください。
もし、あなたが「どんなに暴れても、店全体には100個までしか注文できないよ」というルールを設けておけば、たとえ悪意ある人が入り込んでも、お店を全滅させることはできません。「被害を最小限に抑え、他のお客さんを守る」ことこそが、セキュリティの神髄です。
運用で心がけるべき「3つのステップ」
1. まずは「計測」する: 普段、自分のアプリがどれくらいリソースを食っているか把握しましょう。kubectl top pod コマンドを使えば、今の使用量が見えます。
2. 余裕を持たせて「設定」する: 最初からカツカツに制限せず、使用量の1.5倍〜2倍程度から始めて、徐々に絞り込んでいくのがコツです。
3. 監視で「気づく」: 制限に達した瞬間、サーバーは悲鳴を上げます。PrometheusやGrafanaといったツールで、リソース使用率が急上昇したときにアラートが飛ぶ仕組みを作っておきましょう。
—
最後に:セキュリティは「一歩ずつ」の積み重ね
セキュリティと聞くと、何か特別なツールや難しい呪文が必要だと思われがちです。ですが、今日学んだ「リソース制限」のように、「何がどこまで使われてもいいのか、境界線を引く」という行為は、家の鍵をかけるのと同じくらい基本で、かつ非常に強力な防犯対策です。
いきなり完璧を目指さなくて大丈夫です。まずは今動いているコンテナが、どれくらいのメモリを使っているか確認するところから始めてみませんか?
その小さな一歩が、将来の大きなインシデントを未然に防ぐ「最強の盾」になります。また次回、現場の知恵でお会いしましょう!
コメント