本連載では、コンテナ/Kubernetesを活用した業務システムを開発・運用するエンジニアに向けて、Kubernetesセキュリティの基礎知識、「Microsoft Azure」を使ったクラウドでのKubernetesセキュリティ対策のポイントを紹介しています。前回に引き続き今回も、Kubernetesの監視と監査について説明します。

Azure Policy による Kubernetes クラスタの制御

これまで紹介してきた監視は、クラスタが出力するログやメトリックを取得・チェックしアクションを取れる状態にする、いわゆるリアクティブな方法でした。一方で、クラスタとしてあるべき姿を定義し、それに対して異なった状態を検知しアクションする方法が監査です。

AKS では、Azure Policy による監査が利用できます。Azure Policy は、Kubernetes の機能である Admission Controller とそれを活用した オープンソースプロダクトの Open Policy Agent(gatekeeper) を組み合わせて、簡単なポリシーの展開と一元的な監査結果の確認方法を提供します。

Admission Controller

まずは、ポリシーによる監査を実現するために利用されている Admission Controller を紹介します。Admission Controller は Kubernetes のビルトインの機能として提供されています。この機能は、Kubernetes の API の実行から etcd へのオブジェクトの書き込みの間において、認証・認可の後に実行されるしくみです。

以下の Kubernetes のブログ記事に、その仕組みが詳しく説明されています。

A Guide to Kubernetes Admission Controllers

  • Admission Controllerの仕組み 引用:A Guide to Kubernetes Admission Controllers

Admission Controller には、30種類以上のコントローラーがありますが、その中でも特に柔軟なコントローラーの一つに、ValidatingAdmissionWebhook があります。このコントローラーは、API Server からオブジェクトに関するリクエストを受け取ることができ、そのリクエストを評価したうえでリクエストの許可・拒否を判断します。評価は、API による外部のプログラムの呼び出しを使用します。このプログラムは HTTP で呼び出されるため、同じ Kubernetes クラスタ上にある必要はありません。

Adminssion Controller を利用するには、以下の流れで展開します。

  1. 外部のプログラムの展開
  2. Admission Controller の ValidatingAdmissionWebhook 設定を展開

外部のプログラムは、API Server からのリクエストを JSON で受け取り、評価の結果をレスポンスとして JSON を返す必要があります。送られてくるリクエスト、返すべきレスポンスの内容は以下のドキュメントに記載があります。リクエストには、kind や name 等のオブジェクトの情報が含まれます。

Webhook request and response

以下は、拒否する際のレスポンスの例です。


json
{
  "apiVersion": "admission.k8s.io/v1",
  "kind": "AdmissionReview",
  "response": {
    "uid": "",
    "allowed": false
  }
}

ValidatingAdmissionWebhook も上記ドキュメント内にサンプルがあります。以下の例では、Pod の作成時にフックされ、呼び出されるプログラムは、example-namespace にある example-service として公開されています。


yaml
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: "pod-policy.example.com"
webhooks:
- name: "pod-policy.example.com"
  rules:
  - apiGroups:   [""]
    apiVersions: ["v1"]
    operations:  ["CREATE"]
    resources:   ["pods"]
    scope:       "Namespaced"
  clientConfig:
    service:
      namespace: "example-namespace"
      name: "example-service"
    caBundle: 
  admissionReviewVersions: ["v1"]
  sideEffects: None
  timeoutSeconds: 5

以下は、展開から実行までの流れを示したものです。

  • Admission Controllerの展開から実行までの流れ