Microsoft Defender for Containers を使った Azure Kubernetes Service (AKS) のセキュリティ監視 - 入門編

＊2023年1月にスクリーンショットなどを一部更新

# 本記事について

2021年12月9日に、[Microsoft Defender for Cloud](https://docs.microsoft.com/ja-jp/azure/defender-for-cloud/defender-for-cloud-introduction) （旧 Azure Security Center / Azure Defender）の新しいメニューとなる [Microsoft Defender for Containers](https://docs.microsoft.com/ja-jp/azure/defender-for-cloud/defender-for-containers-introduction?tabs=defender-for-container-arch-aks) （以下、Defender for Containers）が[パブリックプレビューリリース](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/introducing-microsoft-defender-for-containers/ba-p/2952317)となりました。もともとあった、Defender for Container Registry および Defender for Kubernetes を統合し、新たに複数の重要機能をリリースしています。2023年時点で多くの機能が一般提供開始済みになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/f6a617a5-db1e-bf1b-5f4d-73981a675773.png)

本記事では、特に、Defender for Containers となってから追加された機能群となる、動いているコンテナーの脆弱性評価機能と Runtime での脅威検知機能を見ていきたいと思います。一方、より Azure のコンテナーのセキュリティの全体感を知りたい方は[こちらの記事](https://qiita.com/YoshiakiOi/items/db44a344357a345baded)をご参照ください。

# Defender for Containers のオンボード

オンボードは、Defender for Cloud の環境設定から行います。コンテナーの欄を明示的に「オン」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/a7f4e88d-15bb-e5bb-a7de-fd9faaaf6d43.png)

加えて 構成の編集で、Defender DaemonSet を有効化します。これにより、AKS のクラスターの各ノードにデーモンセットとして、Defender が利用するポッドがデプロイされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/08a9e5bf-baf0-c33d-2296-589554304f21.png)

この自動オンボードを有効化しない場合、各リソースのインベントリページから 「クラスターで Defender for Containers の Defender プロファイルを有効化する必要がある」を選択し、Fix をクリックすることで個別に Defender のデーモンセットを AKS クラスターにデプロイすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/a00dc6ba-bd6d-468a-21e8-b7a87ee03873.png)

デプロイが完了すると、AKS 側からはそのデーモンセットが確認できます。（もちろん、kubectlなどを使っても確認できます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/a255facc-971c-f8fa-ca2a-f403c3ccda53.png)

# イメージの脆弱性監視

コンテナレジストリ上のイメージや GitHub Actions でビルドされたイメージの脆弱性の検知は、もともとの Defender for Container Registry でもできました。これは、Defender for Containers でも引き続き、利用することができます。

〇 Container Registry 上のイメージの脆弱性評価結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/20718933-46c7-d11c-386d-b3bce7cff02e.png)

〇 GitHub Actions (CI/CD パイプライン）上でビルドされたイメージの脆弱性評価結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/282f9462-27ff-5b54-2d54-afe5a27022f6.png)

加えて、今回可能になったのが、実行中のコンテナーの脆弱性評価です。ここでは、[DVWA](https://dvwa.co.uk/)のイメージを使って試してみます。Azure Container Registry に自分のレジストリを作り、DVWA のイメージをプッシュします。（ここの手順については、こちらの[ブログ記事](https://techcommunity.microsoft.com/t5/microsoft-defender-for-cloud/how-to-demonstrate-the-new-containers-features-in-azure-security/ba-p/1011270)も参考になります。）

```
docker pull vulnerables/web-dvwa 
Docker tag  vulnerables/web-dvwa:latest  <ACRのレジストリ名>.azurecr.io/vulnerables/web-dvwa:v1
Docker push  <ACRのレジストリ名>.azurecr.io/vulnerables/web-dvwa:v1
```

次に自分の AKS のクラスターにこのイメージからポッドとロードバランサーを作ります。

〇 dvwa.yml

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dvwa
  namespace: dvwa
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dvwa
  template:
    metadata:
      labels:
        app: dvwa
    spec:
      containers:
        - name: dvwa
          image: yooacr.azurecr.io/vulnerables/web-dvwa:v1
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          ports:
            - containerPort: 80
              name: http
```

〇dvwa-lb.yml

```yaml
apiVersion: v1
kind: Service
metadata:
  name: dvwa-lb
  namespace: dvwa
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: dvwa
```

名前空間を作り、上記の YAML ファイルでポッドとロードバランサーをデプロイしてみます。

```
kubectl create namespace dvwa
kubectl apply -f dvwa.yml
kubectl apply -f dvwa-lb.yml
```

すると、ロードバランサーの外部 IP アドレスを取得すると、DVWA がちゃんと動いていることを確認できます。

```
kubectl get services -n dvwa
```

〇 ブラウザでのアクセス結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/33428c54-0b6a-45f1-a227-77899f3ba0f5.png)

少し時間がかかることがありますが、その後 Azure Portal で Defender for Cloud へ進み、インベントリページで該当の AKS のクラスターを選択すると、「実行中のイメージの脆弱性を修復する必要があります (Qualys を利用)」という推奨事項が出てくるのでクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/b4ebf5af-58f8-790d-df37-0d37aa335acf.png)

すると、上述のレジストリ上での脆弱性評価と似たような画面で、実行中のコンテナーの脆弱性スキャン結果を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/674fc2bb-edb1-a5c2-16a7-a9f3ef2a6f4c.png)

この機能により、デプロイする前にレジストリ上のイメージを確認するだけでなく、今 AKS 上で動いているコンテナーに脆弱性が無いかを見ていくことができるようになりました。

# Runtime での脅威検知

デーモンセットを活用した AKS の各ノード上での脅威検知も、Defender for Cloud になり新しく導入された機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/592a43ae-174d-9e95-6e87-7f159c55557e.png)

今までの Defender for Kubernetes では、AKS のコントロールプレーンのログを中心に分析し脅威を見つけていましたが、それに加えデーモンセットからの情報を分析して解析するようになりました。これにより、見つけられる脅威の数が大幅に増加しております。（2021年12月現在で78種類。）
検知可能な脅威のリストは[こちら](https://docs.microsoft.com/ja-jp/azure/defender-for-cloud/alerts-reference#alerts-k8scluster)に展開されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/4e020f16-c388-1687-96da-6bb392790ddf.png)

こちらも、さきほど AKS クラスターに展開したコンテナーを利用して試してみたいと思います。

まず、DVWA のポッドの中に入ります。

```
kubectl get pods -n dvwa
kubectl exec --stdin --tty -n dvwa <ポッド名> -- /bin/bash 
```

そしてその中で、下記のコマンドを実施します。コマンド自体は失敗するかもしれませんが、いったんここではそのままで大丈夫です。

```
apt update
apt install armitage
```

数分後、Defender for Cloud のアラート画面に以下のようなアラートが上がってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/b6ea0c9e-acec-3c40-c63a-a8a9e73764fc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/744e59bd-4029-5751-39ad-3325c975b8b7.png)

ポッドに攻撃用ツールがインストールされようとしていることが Defender for Containers によって捉えられています。デーモンセットから情報を取れるようになったことで、このようなポッドやノード側の動きが掴めるようになりました！

また、今回の記事では触れませんでしたが、Defender for Containers では、[Defender for Kubernetes の頃から利用できる Azure Policy for Kubernetes 連携](https://docs.microsoft.com/ja-jp/azure/defender-for-cloud/kubernetes-workload-protections)を利用し、クラスター上での不正な操作のブロックや監査を行うこともできます。（上記ダイアグラムの Gatekeeper, Azure Policy を利用。）

こちらでは、[17種類のプリセットされたルール](https://docs.microsoft.com/ja-jp/azure/defender-for-cloud/kubernetes-workload-protections#step-2-view-and-configure-the-bundle-of-recommendations)を使って監査やブロックを有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/e80af219-6eb7-8a29-30c3-ab23703de2e1.png)

# Azure Kubernetes Service (AKS) 利用時のセキュリティアーキテクチャについて

マイクロソフト社の Azure の GitHub Repository にて [Azure Kubernetes Service: セキュリティの脅威への対策ガイド](https://github.com/Azure/jp-akssecurity)が公開されていますので、こちらもご参照ください。

# 最後に

本稿では Defender for Cloud の新メニューとなる Defender for Containers の新機能である、実行中のコンテナーの脆弱性評価や Runtime での脅威検知機能を見てきました。昨今、Azure Kubernetes Service (AKS) を利用してシステム構築を行われることが増えてきておりますが、その際に Defender for Containers を利用してセキュリティ監視をしていただく一助となれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。