こんにちは!セキュリティの最前線で日々サイバー攻撃の「裏側」を見つめている、最高セキュリティ責任者の筆者です。
今日は、クラウドをフル活用する上で避けては通れない「Kubernetes(クブネティス/K8s)のオートスケーリング」という魔法のような仕組みに潜む、ちょっぴり怖い落とし穴についてお話しします。
「アクセスが増えたら自動でサーバーが増えるなんて便利!」と思いますよね。でも、その「自動で増える新しいサーバー」が、もし最初から鍵の壊れた泥棒に優しい家だったら……と想像してみてください。
初心者の方でも大丈夫です。家の防犯に例えながら、一歩ずつ「堅牢な(硬い)サーバー」の作り方を学んでいきましょう!
—
1. オートスケーリングは「プレハブ住宅」の増設と同じ
Kubernetesのオートスケーリング(Cluster Autoscalerなど)は、忙しくなると庭に「プレハブ住宅(新しいノード)」をガシャン!と自動で組み立ててくれる仕組みです。
ここで重要なのは、「そのプレハブ、ちゃんと頑丈な設計図で作っていますか?」ということです。
泥棒が狙う「余計な窓」
普通のパソコンや汎用的なサーバーOSには、最初からたくさんの「便利な機能(サービス)」が入っています。しかし、セキュリティの世界では「機能が多い=泥棒が入れる窓が多い」と考えます。
- 不要なサービス: 使っていないのに動き続けているファイル共有機能や、古い通信ポート。
- デフォルトパスワード: 「admin/admin」のような、誰でも思いつく鍵。
これらを放置したままオートスケーリングの設定をすると、「窓が全開の家」が自動で何十軒も量産されることになります。これが一番の恐怖です。
—
2. 対策その1:OSの「断捨離」とイメージの要塞化(ハーデニング)
まずは、増設されるサーバーの「設計図(マシンイメージ)」を徹底的にダイエットさせましょう。これを要塞化(ハーデニング)と呼びます。
最小限のOSを選ぶ
最近では、Kubernetesを動かすため「だけ」に作られた、余計なものが一切入っていないOS(Container-Optimized OSやBottlerocketなど)を使うのが主流です。
もし一般的なLinux(UbuntuやAmazon Linux 2など)を使う場合は、以下の設定を意識しましょう。
# 不要なサービスを停止して、泥棒の侵入経路を塞ぐ例
# (Amazon Linux 2 / RHEL系の例)
# 1. ネットワーク経由でファイルを共有する古いサービスなどを止める
sudo systemctl stop rpcbind
sudo systemctl disable rpcbind
# 2. 使わないネットワークプロトコル(IPv6など)を、必要なければ制限する
# ※環境によって必要なので慎重に!
echo "net.ipv6.conf.all.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf
# 3. 誰でも実行できる「パスワードなしsudo」などは絶対に禁止
# /etc/sudoers の中身をチェックして、特定のユーザー以外は厳しく制限しましょう
このように、「必要最低限のもの以外、すべて捨てる」のが、セキュリティの鉄則です。
—
3. 対策その2:家を建てる時の「合言葉」を守る(ブートストラップの保護)
新しいサーバーが立ち上がるとき、そのサーバーは「私はあなたの仲間です!仲間に入れてください!」とKubernetesの親分(コントロールプレーン)に挨拶に行きます。この工程をブートストラップと呼びます。
このとき、仲間であることを証明するために「秘密の合言葉(認証トークン)」を使います。
泥棒は「合言葉」を盗み聞きしている
もし、この合言葉が誰でも見られる場所に置いてあったらどうでしょう? 悪い人が勝手に自分のサーバーをあなたの仲間に仕立て上げ、データを盗み放題になってしまいます。
AWSなどのクラウドなら「IMDSv2」を強制しよう
クラウド上のサーバーは、自分自身の情報を「メタデータサービス」という窓口から取得します。古い設定(IMDSv1)だと、この窓口が少しガバガバで、攻撃者に合言葉を盗まれるリスクがありました。
最新のIMDSv2を強制することで、合言葉を盗む難易度を格段に上げることができます。
# AWS CLIを使って、ノードがメタデータを取得する際に
# 「セッション認証(IMDSv2)」を必須にする設定の例
aws ec2 modify-instance-metadata-options \
--instance-id i-1234567890abcdef0 \
--http-tokens required \
--http-endpoint enabled
これを設定しておくだけで、「なりすましの泥棒」をシャットアウトできる確率がグンと上がります!
—
4. 対策その3:Kubeletの設定を「鍵付き」にする
サーバーの中で動くKubernetesの門番をkubelet(クブレット)と呼びます。この門番が「誰でも通っていいよー!」と言っていたら、OSをいくら固めても意味がありません。
特に、「匿名ユーザー(Anonymous)のアクセス」は絶対に禁止しましょう。
設定ファイル(kubelet-config.yaml)の書き方例
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
anonymous:
# 匿名ログインを「無効」にします。
# これをfalseにしないと、誰でもあなたのサーバーを操作できる可能性があります!
enabled: false
webhook:
# 認証にWebhook(確認作業)を使うようにします。
enabled: true
authorization:
# 誰でも許可するのではなく、権限を確認(Webhook)するようにします。
mode: Webhook
readOnlyPort: 0 # 読み取り専用ポート(10255)を閉じて、情報の漏洩を防ぎます。
このように、「設定ファイル」一つひとつに鍵をかけていく作業が、インフラエンジニアの腕の見せ所です。
—
まとめ:一歩ずつ、安全な城を築きましょう
オートスケーリングは非常に強力な武器ですが、一歩間違えると「脆弱性の大量生産マシン」になってしまいます。
1. OSはダイエットさせる(不要なサービスは止める!)
2. 合言葉(トークン)を大切に扱う(IMDSv2などの最新機能を使う!)
3. 門番(kubelet)に厳しいルールを課す(匿名アクセス禁止!)
「セキュリティって難しそう……」と感じるかもしれませんが、基本は「家の戸締まり」と同じです。一つひとつの窓(ポートやサービス)を確認し、信頼できる人(認証されたユーザー)だけを通す。
この積み重ねが、あなたの大切なサービスとユーザーを守る最強の盾になります。これからも、少しずつ楽しみながら学んでいきましょう。応援しています!
コメント