Sysdig × GKE でコンテナの振る舞い検知を試してみる

Sysdig Secure のエージェントを利用してGKEにデプロイしたコンテナの振る舞い検知を試してみます(DevOps・セキュリティ Advent Calendar 2023 12/25記事)。
2023.12.25

先日、Sysdig様とGoogle Cloud様主催の「Sysdig + Google Cloudワークショップ」に参加して参りました。
GKE上のコンテナの脅威に対する検知や対処について様々なデモをハンズオンで体験できる貴重なワークショップでした。ハンズオンで体験したSysdigの数あるコンテナセキュリティ機能の中でも本記事では「エージェントによる振る舞い検知」の機能について試してみた結果を記しますので、コンテナセキュリティの重要性を理解し総合的な脅威対策を検討されている皆様のご参考になれば幸いです。

本記事はクラスメソッド DevOps・セキュリティ Advent Calendar 2023 の12/25記事になります!


本検証について

本記事では「Sysdig Secure」の検証を行います。Sysdig Secure はコンテナ・ Kubernetes環境のセキュリティプラットフォームであり、脅威の検出や対処など様々な機能があります。Sysdig Secureについては以下ブログでも説明していますのでご参考にしてみてください。

Google Cloud の GKEクラスタに対しSysdig Agentをインストールし、コンテナ上の脆弱なアプリケーションに対する攻撃に対して振る舞い検知を行い、Sysdig Secureのコンソール上で攻撃のイベントを確認する一連の手順について試してみます。

GKE環境準備

まずはGKE環境を準備し、コンテナをデプロイします。
今回デプロイするワークロードは、Sysdig社が公開しているシミュレーション用のWebサーバを利用します。このシミュレーション用のアプリケーションはリモートからファイルの読み書き、コマンド実行が可能である脆弱性が内在しているものとなっています。
※注意:本アプリケーションの利用は本番環境とは隔離された環境でお試しください。また、検証後は環境の削除を忘れないようにしてください。


なお、Google CloudのオペレーションはCloud Shellにて行い、オーナー権限を持つユーザーで実行しています。


GKE Standardクラスタ「security-playground-cluster」を作成(時間がかかるため先に作成)

gcloud container clusters create security-playground-cluster \
--region asia-northeast1 \
--machine-type n2-standard-2 \
--enable-autoscaling \
--min-nodes 1 \
--max-nodes 12 \
--async

リポジトリのコピー

git clone https://github.com/sysdiglabs/security-playground && cd security-playground

Dockerfileを利用してアプリケーションからDockerイメージをビルド(PROJECT IDは書き換えてください。)

docker build -t asia-northeast1-docker.pkg.dev/PROJECT ID/my-repo/security-playground .

Artifact Registory のリポジトリ「my-repo」を作成

gcloud artifacts repositories create my-repo \
--repository-format=docker \
--location=asia-northeast1

ビルドしたDockerイメージをArtifact Registryにプッシュ(PROJECT IDは書き換えてください。)

docker push asia-northeast1-docker.pkg.dev/PROJECT ID/my-repo/security-playground

最初の手順で作成したGKEクラスタがRUNNINGになっていることを確認

gcloud container clusters list

作成したGKEクラスタに接続

gcloud container clusters get-credentials security-playground-cluster --location=asia-northeast1

以下の内容で「deployment.yaml」を作成(PROJECT IDは書き換えてください。)

deployment.yaml

apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "security-playground"
  namespace: "default"
  labels:
    app: "security-playground"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "security-playground"
  template:
    metadata:
      labels:
        app: "security-playground"
    spec:
      containers:
      - name: "security-playground-image"
        image: "asia-northeast1-docker.pkg.dev/PROJECT ID/my-repo/security-playground:latest"
        env:
        - name: "PORT"
          value: "8080"

「deployment.yaml」をデプロイ

kubectl apply -f deployment.yaml

以下の内容で「service.yaml」を作成

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-lb-service
spec:
  type: LoadBalancer
  selector:
    app: security-playground
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

「service.yaml」をデプロイ

kubectl apply -f service.yaml

Sysdig環境準備

今回は無料トライアルのSysdig Secure環境を利用しました。初回Sysdig Secureアクセス時の作業とエージェントインストール手順を以下より説明します。

初回アクセス時に以下から[GCP Project]を選択します。

[Deploy with Terraform] の [Region of your GCP Project] に対象Google Cloud GKEクラスタのリージョン、[Project ID] に対象Google CloudプロジェクトのIDを入力し、[Next]をクリックします。

[Get into Sysdig] をクリックします。

初期設定が完了したのでGKE環境へのエージェントインストールを進めていきます。
なお、エージェントをインストールすることにより Sysdig Secure では以下のことができるようになります。

- ランタイム脅威検知
- 脆弱性ホストスキャン
- ランタイムイメージスキャン
- KSPM(Kubernetes Security Posture Management)


Sysdig の Webコンソールより[Integrations] → [Data Sources] → [Sysdig Agent] をクリックし、[Connect a Kubernetes cluster]をクリックします。

[Cluster Name] に 「security-playground-cluster」と記入し、自動生成されたhelmコマンドをコピーします。

コピーしたhelmコマンドをGoogle CloudのCloud Shellで実行し、エージェントをインストールします。
エージェントのステータスは以下にて確認ができます。

kubectl get pods -n sysdig-agent

エージェントが問題なくインストールされるとSysdig SecureのWebコンソールから[Integrations] → [Data Sources] → [Sysdig Agent]でエージェントのインストール状況が確認できます。

なお、GKE Autopilot環境へのインストール方法やその他オプションの設定については以下をご参照ください。

攻撃を仕掛けてみる

ではデプロイしたWebアプリケーションに攻撃を仕掛けてみます。Google CloudのCloud Shell からcurlコマンドを使いアクセスし、コマンド実行でnmapをインストールさせ、nmapでOpen Portを調べます。

まずは、アクセス先のIPアドレスとポート番号を環境変数に設定しておきます。

LOAD_BALANCER_URL=$(kubectl get svc my-lb-service -n default -o json | jq -r .status.loadBalancer.ingress[].ip)
PORT=80

nmapをインストールさせます。

curl -X POST $LOAD_BALANCER_URL:$PORT/exec -d 'command=apt-get update; apt-get -y install nmap'

nmapを実行し、Open Portを調べます。

curl -X POST $LOAD_BALANCER_URL:$PORT/exec -d 'command=nmap -v scanme.nmap.org'

これらの攻撃が Sysdig Secure でどのように見えるか確認します。左のメニューから[Events]をクリックすると、検知したランタイム脅威の一覧が確認できます。

「Possible Backdoor using BPF」をクリックしてみます。検知対象の詳細が確認できます。[Process Tree]や[Process]を確認するとnmapが実行されていることがわかります。

[Vulnerabilities] → [All Vulnerabilities]をクリックすると、CVE、CVSSなどアプリケーションに内在する脆弱性の様々な情報が確認できます。

最後に

Sysdig Secureのエージェントによって、外部から攻撃が行われたことを検知してリアルタイムでイベントを確認できることがわかりました。
本記事で検証したエージェントによる振る舞い検知以外にもSysdigには様々なコンテナセキュリティ機能がありますので、今後本ブログでも検証結果を取り上げていきたいと思います。