GuardDuty security agent for Amazon EKS clusters が v1.2.0 から Bottlerocket に対応していたので試してみた

EKS 環境のランタイム保護が可能な GuardDuty EKS Runtime Monitoring ですが、発表当時は OS は Amazon Linux 2 のみ、 CPU アーキテクチャは AMD のみをサポートしていました。

しかし、エージェントのバージョンが上がるにつれて、複数の OS, CPU アーキテクチャで利用可能になっています。

v1.2.0: ARM64 サポート、Bottlerocket サポート
v1.3.0: Ubuntu サポート
GuardDuty agent release history

特に Bottlerocket OS はコンテナの実行に必要な必須ソフトウェアのみを含んでいることから、セキュリティを強く意識した際に選択肢に入りやすいのではないでしょうか。
今回は EKS on EC2 を Bottlerocket OS で構築しつつ、 GuardDuty EKS Runtime Monitoring を試してみました。

やってみた

GuardDuty EKS Runtime Monitoring のセットアップ方法については上記ブログに記載されている通りなので飛ばします。
下記設定ファイルを利用して、eksctl create cluster -f cluster.yaml で EKS クラスターを作成します。

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: bottlerocket
  region: ap-northeast-1
  version: "1.27"

availabilityZones: ["ap-northeast-1a", "ap-northeast-1c"]

iam:
  withOIDC: true

nodeGroups:
  - name: ng-bottlerocket
    instanceType: m5.large
    desiredCapacity: 2
    amiFamily: Bottlerocket
    iam:
      attachPolicyARNs:
        - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
        - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
        - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
    bottlerocket:
      settings:
        motd: "Hello from eksctl!"

addons:
  - name: aws-guardduty-agent
    resolveConflicts: overwrite

GuardDuty security agent for Amazon EKS clusters は特にバージョン指定しなかったので、最新の v1.3.1 がインストールされました。
busybox イメージを利用して、 pod 内からテスト用ドメイン (guarddutyc2activityb.com) をクエリします。

kubectl run busybox --image=amd64/busybox --command -- nslookup guarddutyc2activityb.com

正しく検知されました。

インスタンス周りの情報も取れてます。

ドメインやプロセス等の情報も取れました。

EKS on EC2 の Node でも検知させてみた

GuardDuty EKS Runtime Monitoring ですが、エージェントを入れるとコンテナランタイムだけでなく EKS Node のランタイム保護も可能です。
今回は EKS Node に SSM Session Manager で接続して検知させてみました。
Bottlerocket ではインスタンスの設定や管理をコントロールコンテナ経由で行いますが、このコンテナ内で先程のテスト用ドメイン (guarddutyc2activityb.com) にアクセスしてみます。
nslookup や dig はインストールされていなかったので curl で実行しました。

[ssm-user@control]$ curl http://guarddutyc2activityb.com
curl: (6) Could not resolve host: guarddutyc2activityb.com

上記コマンドを実行後、 Pod 内から実行した時同様に検知されました。
Kubernetes リソースが検知対象の場合は Resource type が EKSCluster, Node が検知対象の場合は Resource type が Instance になるようです。

Pod の時同様、クエリ先のドメインや検知されたプロセス名なども確認できます。

まとめ

気づいたら GuardDuty EKS Runtime Monitoring の対象 OS が大分増えてました!
当初はサポート外の OS を利用されていた方も是非活用を検討してみて下さい。