kube-apiserverの監査ログを取ってみる

TL;DR

KubernetesのAPIサーバで監査ログ(Audit)を有効化することでユーザのアクティビティや不正な行為を検知することができるようになる。ただしチューニングや保管先の管理は大変。

どんな情報が取れるか

監査ログはJson形式で指定したファイル、Webhook等で出力が可能。以下はaudit-test-podというPodにkubectl execでログインした際の監査ログ。
誰が・いつ・どのリソースに対して・何をしたかどのレベルで保存するか等が詳細に記録される。

試した環境

クラスタはkubeadmで構築しています。(kube-apiserverがPodとして起動している状態)

監査ログを取り始める前に決めること

  • 監査ログポリシー。何を監査対象にするか(対象のリソース、ステージ)、どれくらいの細かさで出力するか(レベル)。
  • ログの保管先。

今回は動作確認のため保管先はローカルディスクに構成。

ポリシーの内容について詳しく知りたい人は@makocchiさんのCNDT2019発表資料に詳しく載っています。(https://speakerdeck.com/makocchi/cndt2019-kubernetes-audit-log-c4d4c5f6-6058-40f9-a5fc-abbb36073a19)

監査ログを動作させるためにやること

  1. 監査ポリシーを記載したYamlファイルを作成しマスターサーバに配置する。 (後述A)
  2. kube-apiserver のマニフェストに監査設定を行う。kube-apiseverの起動オプション— audit-policy-fileを追加する。当該Yamlファイルへのパスを追加し、監査ログを有効化する。(後述B)
  3. kube-apiserver/etc/kubernetes/auditに当該ファイルをマウントさせるようvolumesvolumeMounts を設定する。
  4. 合わせてログの保存先の設定も同じくkube-apiserverのマニフェストに追記する。(後述C)
  5. kube-apiserverが再起動されるのを待ち、監査ログが出力されていることを確認する。

A:監査ポリシー記述ファイル

ポリシーのサンプルは公式に色々なパターンが載っている。

apiVersion はaudit.k8s.io/v1

omitStages は出力させたくないステージを指定する。

監査ログ収集のルールを rules セクションに記述していく。 level は出力の細かさ(Metadataのみ、ボディも含む等)の指定、resources は監査対象のリソースを指定する。

以下のポリシーは「すべての監査イベントをMetadataレベルで収集する」というルールになる。

B: kube-apiserverでの監査ポリシーを有効化

kube-apiserverの引数には前述の通り最低限audit-policy-fileを追加する。audit-policy.yamlは上記AのYamlファイル。

このaudit-policy-file はパラメータを指定するだけではなく、Podにマウントさせる必要がある。したがって同ファイルをvolumeMounts およびhostPathをつかってkube-apiseverにマウントさせる。

C:ログの保存先

ここではkube-apiserverが動くノードのhostPathに保存するものとする。

ログの保存先を --audit-log-pathで指定する。( -は標準出力となるため既にFluentd等でログ収集をしている場合は集約が可能なものと思われる(未確認))
保存量を制御するパラメータとして --audit-log-maxsize--audit-log-maxage があるため必要に応じて構成する。

kube-apisever起動パラメータの指定例:

Volumeの指定も忘れずに行う:
保存先となるファイルはreadOnlyfalseにしておくこと。

トラブルシューティング

設定反映にはkube-apiserverを再起動させる必要があるためエラーがあったときはkube-apiseverが起動してこない場合がある。その場合は/var/log/pods/ 以下にあるkube-apiserverのログを見て起動しない原因を確認する。自分の場合は大概はaudit-policy.yamlの誤りとかだった。

注意事項

ログの中に表示されるシークレット情報をMetadataより細かいレベルで取得した場合、はbase64のデータそのままの状態で保存されるため、そこから情報を抜き出されるリスクがあります。センシティブな情報のログを取得する場合はログのレベルおよび結果として保存される情報を確かめるようにしましょう。

参考

最後に実際のテストで使った各種ファイルを張り付けしておく。

/etc/kubernetes/audit/policy.yaml

/etc/kubernetes/manifest/kube-apiserver.yaml

Work for Hewlett Packard Enterprise as Solution Architect / Write on IT / Infrastructure / Cloud Native / Kubernetes / OpenShift / Japanese|English

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store