こんにちは!インフラやセキュリティの世界へようこそ。
Kubernetes(K8s)って、コンテナをまとめて管理できて本当に便利ですよね。「なんだか魔法のような箱だ!」と感動した方も多いのではないでしょうか。
でも、この便利な魔法の箱、もし中に泥棒が入ってきたらどうなるでしょうか?
今日は、家の一戸建ての防犯にたとえながら、Kubernetesの心臓部である「APIサーバー」の出入り口をしっかり見張る「監査ログ(Audit Logs)」について、一緒に優しく学んでいきましょう!
—
家の鍵をかけただけでは、安心できない理由
みなさんは、家を出るときに玄関の鍵をちゃんと閉めますよね。これと同じように、Kubernetesでも認証(「あなたは誰ですか?」)と認可(「この部屋に入っていい人ですか?」)という鍵をかけています。
しかし、セキュリティのプロとして少し怖いお話をします。
頑丈な鍵をかけていても、「いつ、誰が、どの部屋に入って、何を持ち出したのか」を防犯カメラや記録に残しておかないと、万が一空き巣が入ったときに被害の大きさが分かりません。 さらに、「あいつ、夜中にこっそりキッチンの棚を漁っているぞ…」という不審な動きにも気づけませんよね。
Kubernetesにおける「防犯カメラと侵入者ノート」の役割を果たすのが、今回お話しする「監査ログ(Audit Logs)」なんです。
—
監査ログってなぁに?
監査ログとは、一言で言うと「KubernetesのAPIサーバーに対する、すべてのリクエストとレスポンスの歴史を記録した日記帳」です。
誰かが「新しいサーバー(Pod)を作って!」と命令したときも、「秘密のパスワード(Secret)を覗き見した!」というときも、すべてこのログに記録されます。
「なんだ、じゃあ全部の動きをメモしておけばいいんだね!」と思ったそこのあなた。実はここに大きな罠があります。
KubernetesのAPIサーバーは、常にものすごい数のリクエストを処理しています。すべてを細かく記録すると、あっという間に日記帳がパンクして、サーバーが動かなくなってしまうんです。
そこで登場するのが、「監査ポリシー(Audit Policy)」というルールブックです。
—
どんなルールで記録する?(監査ポリシーの基本)
防犯カメラを家のどこに置くか考えたことはありますか?
玄関やリビングの窓には置くけれど、トイレの中にまでカメラを置いたらプライバシーが大変ですよね。
Kubernetesの監査ポリシーも同じです。
「どのリクエストを、どの程度の細かさ(レベル)で記録するか」を細かく設定できます。
記録の細かさは、主に以下の4つのレベルに分かれています。
1. None: 記録しない(不要な情報)。
2. Metadata: リクエストのメタ情報(誰が、いつ、どのAPIを叩いたか)だけを記録する。
3. Request: メタ情報に加えて、送られてきたデータ(リクエストの中身)も記録する。
4. RequestResponse: リクエストの中身も、サーバーからの返事(レスポンス)も、すべて完璧に記録する!
「じゃあ、全部 RequestResponse にすれば最強じゃん!」と思われがちですが、先ほどお話しした通り容量が爆発します。なので、「重要なお部屋(秘密情報を扱うSecretなど)」はしっかり記録し、「よくある日常のチェック(ヘルスチェックなど)」は軽く流すというメリハリが大切なんです。
—
実践!監査ポリシーファイルを作ってみよう
それでは実際に、安全を守るためのポリシーファイル(YAML形式)を書いてみましょう。
難しく考えず、「こういうルールで記録してね」とKubernetesにお願いする設定ファイルだと思ってください。
以下のコードを audit-policy.yaml という名前で保存してみましょう。
apiVersion: audit.k8s.io/v1 # 監査ポリシーのバージョンを指定します
kind: Policy
rules:
# ルール1: システムのヘルスチェックなど、どうでもいい細かいアクセスはログに残さない(None)
- level: None
resources:
- group: ""
resources: ["endpoints", "services", "services/status"]
# ルール2: パスワードやトークンなどの秘密情報(Secrets)へのアクセスは、誰が何を見たのか厳重に記録する(RequestResponse)
- level: RequestResponse
resources:
- group: ""
resources: ["secrets", "configmaps"]
# ルール3: その他の一般的なリソース(PodやDeploymentなど)の変更操作は、メタ情報とリクエスト内容を記録する
- level: Request
operations: ["create", "update", "patch", "delete"]
# 読み取り(get, list)は量が多すぎるので除外して、変更系のみに絞るのがコツです
# ルール4: 上記のどれにも当てはまらない一般的なアクセスは、最低限のメタ情報だけ残す
- level: Metadata
どうでしょう?日本語のコメントを読むと、「何を大切に記録したいか」が何となく伝わってきますよね。
—
APIサーバーに「防犯カメラ」の設置を命じる
ポリシーファイルができたら、次はKubernetesの心臓部である「APIサーバー」に対して、「このルールに従ってログを記録してね!」と教えてあげます。
APIサーバーの起動オプション(マニフェストファイル、通常は /etc/kubernetes/manifests/kube-apiserver.yaml にあります)に、以下のような設定を追加します。
spec:
containers:
- name: kube-apiserver
# 既存の設定に加えて、以下の引数(command)を追加または編集します
command:
- kube-apiserver
# 監査ポリシーファイルの場所を指定
- --audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml
# ログを出力するファイルの場所を指定
- --audit-log-path=/var/log/kubernetes/audit/audit.log
# ログファイルの最大サイズ(メガバイト)
- --audit-log-maxbackup=10
# 音を鳴らして古いログを自動で消すローテーション設定もここで管理できます
volumeMounts:
- mountPath: /etc/kubernetes/audit
name: audit-policy
readOnly: true
- mountPath: /var/log/kubernetes/audit
name: audit-log
readOnly: false
これで、APIサーバーが動くたびに /var/log/kubernetes/audit/audit.log というファイルに、日々の行動記録がどんどん書き込まれていきます!
—
異常なAPI呼び出しを検知する(防犯の目を持つ)
ログを記録するだけでは、実はまだ「鍵をかけただけで、カメラの映像を見ていない状態」と同じです。
泥棒が入ってきたときに、「おや、変な動きをしているぞ!」と気づくための検知パターン(シグネチャ)をいくつか知っておきましょう。
現場のセキュリティエンジニアがよく見ている、代表的な「怪しい動き」の例を挙げますね。
1. 権限のないユーザーが「権限ちょうだい!」と要求したとき(権限昇格の試み)
- どんなログ?:
user.usernameが見慣れない一般ユーザーであるにもかかわらず、verbs(動作)にcreateやupdateが並び、対象がClusterRoleBinding(K8s全体の偉い権限を配る設定)になっている場合。 - 危険度: マックスです!社内の新人のアカウントが乗っ取られ、勝手に管理者権限を奪おうとしている可能性があります。
2. 誰もが知る秘密情報(Secret)が一気に読み出されたとき
- どんなログ?: 短い時間の間に、大量の
secretsリソースに対するgetリクエストが記録されている場合。 - 危険度: データベースのパスワードや外部APIの鍵がまるごと盗み出されている(情報窃取)真っ最中の可能性があります。
3. 深夜や休日に、普段と違う場所からのアクセス
- どんなログ?: 普段は日本時間の昼間に動いているシステムなのに、真夜中に海外の見たこともないIPアドレスからAPIが叩かれている場合。
こうした不審なログを見つけ出すために、現場では Fluentd や Logstash、あるいは Elasticsearch や Datadog といったツールを使って、ログをリアルタイムに集めて「怪しい動きがあったら Slack に通知する!」という仕組みを作っています。
—
一歩ずつ、安全なインフラを作っていこう
お疲れ様でした!今回は少し専門的な言葉も出てきましたが、要するにこういうことです。
- 「監査ログ」は、Kubernetesの防犯カメラ&行動日記帳である。
- 「監査ポリシー」で、記録する場所と細かさを賢く調整する。
- 記録したログを監視して、泥棒(不正アクセス)の兆候にいち早く気づくことが大切。
セキュリティの対策に「これで完璧!」というゴールはありません。でも、今日学んだ監査ログの設定をひとつ取り入れるだけで、あなたの育てるシステムは確実に「破られにくい要塞」に近づきます。
焦らず、一歩ずつ、安全で強いインフラを作っていきましょうね!応援しています!
コメント