【入門編】 Kubernetes API Serverの監査ログ(Audit Logs)設定と監視 – インフラ・ネットワーク & クラウドセキュリティ防御ガイド

こんにちは!インフラやセキュリティの世界へようこそ。
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の防犯カメラ&行動日記帳である。
  • 「監査ポリシー」で、記録する場所と細かさを賢く調整する。
  • 記録したログを監視して、泥棒(不正アクセス)の兆候にいち早く気づくことが大切。

セキュリティの対策に「これで完璧!」というゴールはありません。でも、今日学んだ監査ログの設定をひとつ取り入れるだけで、あなたの育てるシステムは確実に「破られにくい要塞」に近づきます。

焦らず、一歩ずつ、安全で強いインフラを作っていきましょうね!応援しています!

コメント

タイトルとURLをコピーしました