AWS CDK で GuardDuty のランタイムモニタリングを有効化する
こんにちは、製造ビジネステクノロジー部の若槻です。
Amazon GuardDuty のランタイムモニタリング (Runtime Monitoring) を利用すると、Amazon ECS on Fargate、Amazon EKS、Amazon EC2 のランタイムアクティビティをエージェントを介して監視することができます。
ランタイムモニタリングを有効化しない場合は Security Hub で下記の MEDIUM レベルのコンプライアンス違反が検出されるため、有効化することが推奨されています。
- [GuardDuty.7] GuardDuty EKS ランタイムモニタリングを有効にする必要があります
- [GuardDuty.11] GuardDuty Runtime Monitoring を有効にする必要があります
- [GuardDuty.12] GuardDuty ECS Runtime Monitoring を有効にする必要があります
- [GuardDuty.13] GuardDuty EC2 Runtime Monitoring を有効にする必要があります
今回は、AWS GuardDuty のランタイムモニタリングを AWS CDK で有効化する方法を確認してみました。
実装
エージェント管理オプションには次の2つがあります。
- 自動管理:GuardDuty が自動でエージェントをインストール・更新
- 手動管理:ユーザーが自身でエージェントをインストール・更新
それぞれで構成方法が異なりますが、ECS on Fargate は自動管理のみとなります。
エージェント自動管理によるランタイムモニタリングを有効化する場合
RUNTIME_MONITORING
でランタイムモニタリング自体を有効化し、EKS_ADDON_MANAGEMENT
と ECS_FARGATE_AGENT_MANAGEMENT
と EC2_AGENT_MANAGEMENT
で各サービスに対するエージェント自動管理を有効化できます。
import * as guardDuty from "aws-cdk-lib/aws-guardduty";
import { Construct } from "constructs";
export class GuardDutyConstruct extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
// GuardDuty を有効化
new guardDuty.CfnDetector(this, "Default", {
enable: true,
features: [
{
name: "RUNTIME_MONITORING",
status: "ENABLED",
additionalConfiguration: [
{
name: "EKS_ADDON_MANAGEMENT",
status: "ENABLED", // EKS エージェント自動管理
},
{
name: "ECS_FARGATE_AGENT_MANAGEMENT",
status: "ENABLED", // ECS on Fargate エージェント自動管理
},
{
name: "EC2_AGENT_MANAGEMENT",
status: "ENABLED", // EC2 エージェント自動管理
},
],
},
],
});
}
}
上記をデプロイします。マネジメントコンソールのランタイムモニタリングの設定画面で、すべてのエージェント自動管理が有効化されていることが確認できました。
エージェント手動管理によるランタイムモニタリングを有効化する場合
エージェント手動管理を有効化する場合は、RUNTIME_MONITORING
を ENABLED
に設定し、各サービスに対しては DISABLED
を指定します。
import * as guardDuty from "aws-cdk-lib/aws-guardduty";
import { Construct } from "constructs";
export class GuardDutyConstruct extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
// GuardDuty を有効化
new guardDuty.CfnDetector(this, "Default", {
enable: true,
features: [
{
name: "RUNTIME_MONITORING",
status: "ENABLED",
additionalConfiguration: [
{
name: "EKS_ADDON_MANAGEMENT",
status: "DISABLED", // EKS エージェント手動管理
},
{
name: "ECS_FARGATE_AGENT_MANAGEMENT",
status: "ENABLED", // ECS on Fargate エージェントは ENABLED/DISABLED に関わらず自動管理のみ
},
{
name: "EC2_AGENT_MANAGEMENT",
status: "DISABLED", // EC2 エージェント手動管理
},
],
},
],
});
}
}
上記をデプロイします。マネジメントコンソールのランタイムモニタリングの設定画面で、EKS および EC2 のエージェント自動管理が無効化され、手動管理になっていることが確認できました。
ここで注意点として、デフォルトではランタイムモニタリングは無効 (DISABLE) であるため、利用するためには明示的に有効化 (ENABLE) する必要がありますが、一度有効化した機能は明示的に DISABLE
を指定しない限り無効化されない挙動となりました。なんだか気持ち悪い動作ですが、明示的に DISABLED
または ENABLED
を指定すると無難です。
その他
EKS_RUNTIME_MONITORING は従来の別機能
3サービスに対する「ランタイムモニタリング」が提供される以前は「EKS ランタイムモニタリング」が別機能として提供されていました。現在も下記のように EKS_RUNTIME_MONITORING
により EKS ランタイムモニタリングの有効化は可能ですが、新バージョンの機能である「ランタイムモニタリング」への移行が推奨されています。
import * as guardDuty from "aws-cdk-lib/aws-guardduty";
import { Construct } from "constructs";
export class GuardDutyConstruct extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
// GuardDuty を有効化
new guardDuty.CfnDetector(this, "Default", {
enable: true,
features: [
{
name: "EKS_RUNTIME_MONITORING",
status: "ENABLED",
additionalConfiguration: [
{
name: "EKS_ADDON_MANAGEMENT",
status: "ENABLED",
},
],
},
],
});
}
}
よって新しい環境では EKS_RUNTIME_MONITORING
は使用しないようにしましょう。
EKS_RUNTIME_MONITORING と RUNTIME_MONITORING は同時に指定できない
下記のように EKS_RUNTIME_MONITORING
と RUNTIME_MONITORING
を同時に指定することはできません。
import * as guardDuty from "aws-cdk-lib/aws-guardduty";
import { Construct } from "constructs";
export class GuardDutyConstruct extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
// GuardDuty を有効化
new guardDuty.CfnDetector(this, "Default", {
enable: true,
features: [
{
name: "EKS_RUNTIME_MONITORING",
status: "ENABLED",
additionalConfiguration: [
{
name: "EKS_ADDON_MANAGEMENT",
status: "ENABLED",
},
],
},
{
name: "RUNTIME_MONITORING",
status: "ENABLED",
additionalConfiguration: [
{
name: "ECS_FARGATE_AGENT_MANAGEMENT",
status: "DISABLED",
},
{
name: "EC2_AGENT_MANAGEMENT",
status: "DISABLED",
},
],
},
],
});
}
}
デプロイ時に The request was rejected because EKS_RUNTIME_MONITORING and RUNTIME_MONITORING cannot be provided in the same request.
というエラーが発生します。
Security | 9:45:24 PM | UPDATE_FAILED | AWS::GuardDuty::Detector | GuardDuty/Default (GuardDuty) Resource handler returned message: "The request was rejected because EKS_RUNTIME_MONITORING and RUNTIME_MONITORING cannot be provided in the same request. (Service: GuardDuty, Status Code: 400, Request ID: eff37135-f1e6-478d-944a-f7d2b19b5ce2)" (RequestToken: 0d3ec38c-92ac-b433-372d-460f89fbfee5, HandlerErrorCode: InvalidRequest)
新バージョンの機能である「ランタイムモニタリング」 を使うように RUNTIME_MONITORING
のみを指定するようにしましょう。
おわりに
AWS CDK で GuardDuty のランタイムモニタリングを有効化する方法を確認しました。
今回の対応を行うことで Security Hub のコントロール失敗のアラートを解消しつつ、セキュアな環境構築を行っていきましょう。
参考
以上