- AWS
GuardDutyの使い方|有効化と検出結果の読み方・通知の設定
Amazon GuardDuty は、CloudTrail の管理イベント・VPC フローログ・DNS ログなどを AWS 側で分析し、不正アクセスや暗号資産のマイニング、認証情報の持ち出しといった脅威を「検出結果(finding)」として知らせるサービスです。 ログの収集やエージェントの設定なしに、有効にした時点から分析が始まります。
# いまのリージョンで有効にする(検出器を作る)
aws guardduty create-detector --enable --finding-publishing-frequency FIFTEEN_MINUTES
# 重要度 7 以上の検出結果を EventBridge でメールに送る
aws events put-rule --name guardduty-high \
--event-pattern '{"source":["aws.guardduty"],"detail-type":["GuardDuty Finding"],"detail":{"severity":[{"numeric":[">=",7]}]}}'
| やること | 要点 |
|---|---|
| 有効化 | リージョンごと。使っていないリージョンも有効にしておく |
| 複数アカウント | Organizations の委任管理者に集め、メンバーは自動で有効化 |
| 検出結果を読む | タイプ名 目的:リソース/脅威の名前 と、重要度(Critical・High・Medium・Low) |
| 通知 | EventBridge のルール → SNS(メール)・Lambda(Slack)など |
| ノイズを減らす | 抑制ルール(条件に合う新しい検出結果を自動でアーカイブ) |
| 料金 | 分析したログの量・イベント数・vCPU などの従量。最初の 30 日は無料 |
確認環境:AWS CLI 1.46.1・boto3 1.43.112・Python 3.11(Linux)。moto 5.2.4 で、create-detector(保護プランの --features 付き)・get-detector・create-filter(抑制ルール)・get-filter・enable-organization-admin-account を動かしました。EventBridge のイベントパターンは、moto でルールと SQS のターゲットを作り、重要度・タイプの違う GuardDuty 形式のイベントを送って、どれが届くかを確かめています。Slack に送る Lambda のコードは、擬似の Webhook を立てて送信内容を確かめました。保護プラン・タイプ名の決まり・重要度・上限・料金は、GuardDuty のドキュメントと料金ページで確認しています(確認日 2026年10月13日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「GuardDutyの使い方|有効化と検出結果の読み方・通知の設定」
GuardDuty が見ているもの
| データ(ドキュメント) | 自分で設定するか | 主な検出 |
|---|---|---|
| CloudTrail の管理イベント | 不要(証跡が無くても分析される) | 不審な API 呼び出し、ルートの利用、CloudTrail の停止 |
| VPC フローログ(EC2) | 不要(フローログを作らなくてよい) | C&C サーバーとの通信、ポートスキャン、総当たり |
| DNS ログ | 不要(AWS の DNS リゾルバーを使っている場合) | マイニング・マルウェアのドメインへの問い合わせ |
この3つが「基本のデータソース」で、有効にすると自動で分析が始まります。追加の保護プランを有効にすると、S3・EKS・RDS・Lambda・実行時の挙動なども対象になります。
保護プランの一覧
| 保護プラン(ドキュメント) | 何を見るか | --features の名前 |
|---|---|---|
| S3 Protection | S3 のデータイベント(持ち出し・削除の試み) | S3_DATA_EVENTS |
| EKS Protection | EKS の監査ログ | EKS_AUDIT_LOGS |
| Runtime Monitoring | EKS・EC2・ECS(Fargate を含む)の OS レベルのイベント(エージェントを使う) | RUNTIME_MONITORING |
| Malware Protection for EC2 | EC2 の EBS ボリュームをスキャン(オンデマンドも可) | EBS_MALWARE_PROTECTION |
| Malware Protection for S3 | S3 に新しく置かれたオブジェクトをスキャン | バケットごとに設定 |
| Malware Protection for AWS Backup | EBS スナップショット・AMI・Backup の復旧ポイント | Backup 側で設定 |
| RDS Protection | Aurora・RDS へのログインの挙動 | RDS_LOGIN_EVENTS |
| Lambda Protection | Lambda のネットワークの記録(VPC フローログから) | LAMBDA_NETWORK_LOGS |
| AI Protection | Bedrock・Bedrock AgentCore・SageMaker AI への脅威 | AI_PROTECTION |
| 決まり(ドキュメント) | 内容 |
|---|---|
| 初めて有効にしたとき | Runtime Monitoring 以外の保護プランが有効になり、30 日の無料期間に入る |
EKS_RUNTIME_MONITORING と RUNTIME_MONITORING |
両方を指定するとエラー。Runtime Monitoring が EKS も含む |
| Extended Threat Detection | 追加料金なしで自動で有効。複数の段階にまたがる攻撃を「攻撃シーケンス」として出す |
有効にする
1つのアカウント(CLI)
aws guardduty create-detector --enable \
--finding-publishing-frequency FIFTEEN_MINUTES \
--features '[
{"Name":"S3_DATA_EVENTS","Status":"ENABLED"},
{"Name":"EKS_AUDIT_LOGS","Status":"ENABLED"},
{"Name":"EBS_MALWARE_PROTECTION","Status":"ENABLED"},
{"Name":"RDS_LOGIN_EVENTS","Status":"ENABLED"},
{"Name":"LAMBDA_NETWORK_LOGS","Status":"ENABLED"},
{"Name":"RUNTIME_MONITORING","Status":"ENABLED",
"AdditionalConfiguration":[{"Name":"ECS_FARGATE_AGENT_MANAGEMENT","Status":"ENABLED"}]}
]'
aws guardduty list-detectors
aws guardduty get-detector --detector-id <検出器ID> \
--query '{Status:Status,Freq:FindingPublishingFrequency,Features:Features[].[Name,Status]}'
moto に向けて動かした get-detector の結果です。
{
"Status": "ENABLED",
"Freq": "FIFTEEN_MINUTES",
"Features": [["S3_DATA_EVENTS", "ENABLED"], ["RUNTIME_MONITORING", "ENABLED"]]
}
--finding-publishing-frequency |
意味(ドキュメント) |
|---|---|
FIFTEEN_MINUTES・ONE_HOUR・SIX_HOURS(既定) |
同じ検出結果が続けて起きたとき、EventBridge に送る更新の間隔。新しい検出結果はほぼすぐ送られる |
更新の通知が 6 時間おきだと、続いている攻撃に気づくのが遅れます。15 分にしておくと、同じ検出結果の count が増えたことを早く知れます。
全リージョンで有効にする
GuardDuty はリージョンごとのサービスです。 普段使っていないリージョンで不正にリソースを作られても気づけるよう、有効なすべてのリージョンで検出器を作ります。
for r in $(aws ec2 describe-regions --query 'Regions[].RegionName' --output text); do
if [ -z "$(aws guardduty list-detectors --region "$r" --query 'DetectorIds[0]' --output text | grep -v None)" ]; then
aws guardduty create-detector --enable --finding-publishing-frequency FIFTEEN_MINUTES --region "$r" \
--query DetectorId --output text | sed "s/^/$r /"
fi
done
検出器は 1 リージョンに 1 つです(上限 1、引き上げ不可)。 上のスクリプトは、すでにあるリージョンを飛ばします。moto 5.2.4 では同じリージョンに2つ目の検出器が作れたため、テストでこの上限は確かめられません。
Organizations で全アカウントに広げる
| 手順 | どのアカウントで | コマンド |
|---|---|---|
| 1. 委任管理者を決める | 管理アカウント(各リージョン) | aws guardduty enable-organization-admin-account --admin-account-id 111122223333 |
| 2. メンバーを自動で有効に | 委任管理者(各リージョン) | aws guardduty update-organization-configuration --detector-id <ID> --auto-enable-organization-members ALL |
| 3. 保護プランも自動で | 委任管理者 | 同じコマンドの --features で AutoEnable を指定 |
| 注意(ドキュメント) | 内容 |
|---|---|
| リージョン | 委任管理者もリージョンごと。使う全リージョンで指定する |
| 同じアカウント | 全リージョンで同じアカウントを委任管理者にする(リージョンごとに変えられない) |
| 管理アカウント | 委任管理者にすることはできるが、最小権限の考え方から勧められていない |
ALL と NEW |
ALL は既存と新規のメンバー。NEW は新しく入るアカウントだけ |
| メンバーの上限 | 委任管理者 1 つで 50,000 アカウント |
セキュリティ専用のアカウント(監査用アカウント)を委任管理者にし、検出結果をそこに集めるのが一般的な形です。Organizations の SCP で GuardDuty を止められないようにする書き方は、関連記事「AWS OrganizationsのSCPの書き方|例文とテンプレート」で扱っています。
検出結果のタイプ名の読み方
タイプ名は ThreatPurpose:ResourceTypeAffected/ThreatFamilyName.DetectionMechanism!Artifact の形です。
CryptoCurrency:EC2/BitcoinTool.B!DNS
└──目的──────┘ └─┘ └─脅威の名前┘└┘└─┘
対象 (BitcoinTool) 変種 DNS で見つかった
| 部分 | 意味(ドキュメント) | 例 |
|---|---|---|
| ThreatPurpose | 脅威の目的・攻撃の段階 | Recon・UnauthorizedAccess・CryptoCurrency |
| ResourceTypeAffected | 狙われたリソースの種類 | EC2・IAMUser・S3・Kubernetes・Runtime・RDS・Lambda |
| ThreatFamilyName | 何が起きたか | PortProbeUnprotectedPort・SSHBruteForce |
| DetectionMechanism | 見つけ方・変種 | .Tcp/.Udp、.Custom(自分の脅威リスト)、.Reputation(ドメインの評判) |
| Artifact | 悪用に使われた道具の資源(無いこともある) | !DNS(ドメインへの問い合わせで見つかった) |
ThreatPurpose の一覧
| ThreatPurpose | 意味(ドキュメントの要約) |
|---|---|
| Backdoor | 乗っ取られ、C&C サーバーと通信できる状態に変えられた |
| Behavior | いつもの基準と違う動き |
| CredentialAccess | 認証情報を盗む動き |
| CryptoCurrency | 暗号資産に関係するソフトが動いている |
| DefenseEvasion | 検出を逃れようとする動き |
| Discovery | システムや内部ネットワークを調べる動き |
| Execution | 悪意のあるコードを動かそうとしている・動かした |
| Exfiltration | データを持ち出そうとしている |
| Impact | システムやデータを壊す・止める・書き換える |
| InitialAccess | 最初の侵入の段階 |
| Pentest | 侵入テストのツールに似た動き |
| Persistence | 侵入経路を断たれても残るための動き(例:新しい IAM ユーザーを作る) |
| Policy | セキュリティのベストプラクティスに反する動き(例:ルートの利用) |
| PrivilegeEscalation | より強い権限を得ようとする動き |
| Recon | 偵察(ポートを探る、ユーザーを一覧する など) |
| Stealth | 動きを隠そうとしている(例:匿名化プロキシ) |
| Trojan | トロイの木馬のプログラム |
| UnauthorizedAccess | 許されていない人の不審な動き |
Extended Threat Detection の検出結果は、AttackSequence:IAM/CompromisedCredentials のように AttackSequence で始まります。
よく見る検出結果と、まずやること
| タイプ(ドキュメントの重要度) | 何が起きたか | まずやること |
|---|---|---|
Recon:EC2/PortProbeUnprotectedPort(Low・状況で変わる) |
開いているポートを外から探られた | 本当に公開が必要なポートか、セキュリティグループを見直す |
UnauthorizedAccess:EC2/SSHBruteForce(Low・状況で変わる) |
SSH の総当たり | SSH を閉じ、Session Manager に切り替える |
Policy:IAMUser/RootCredentialUsage(Low) |
ルートユーザーで API を呼んだ | 本人の操作か確かめ、ルートに MFA |
Stealth:IAMUser/CloudTrailLoggingDisabled(Low) |
CloudTrail の記録が止められた | 誰が止めたか確かめ、元に戻す |
UnauthorizedAccess:IAMUser/ConsoleLoginSuccess.B(Medium) |
いつもと違う場所からのコンソールログイン | 本人に確認、パスワード・MFA |
Policy:S3/BucketBlockPublicAccessDisabled(Low) |
S3 のパブリックアクセスのブロックが外された | 意図した変更か確かめる |
CryptoCurrency:EC2/BitcoinTool.B!DNS(High) |
EC2 がマイニング関係のドメインに問い合わせた | インスタンスを隔離し、作った人と経路を調べる |
Backdoor:EC2/C&CActivity.B!DNS(High) |
C&C サーバーのドメインに問い合わせた | 隔離、スナップショットを取って調査 |
UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS(High・状況で変わる) |
EC2 のロールの認証情報が AWS の外から使われた | ロールのセッションを無効にし、インスタンスを調べる |
Exfiltration:S3/AnomalousBehavior(High) |
S3 からのいつもと違う取り出し | 使われた認証情報を止め、アクセスを調べる |
Execution:Runtime/NewBinaryExecuted(Medium) |
コンテナ・インスタンスで新しい実行ファイルが動いた | 想定したデプロイか確かめる |
AttackSequence:IAM/CompromisedCredentials(Critical) |
盗まれた認証情報を使った一連の攻撃 | 最優先で、関係するリソースと認証情報を止める |
誰がどの操作をしたかは CloudTrail で追います。関連記事「CloudTrailで誰が操作したか調べる|lookup-eventsとAthena」で扱っています。
重要度
| 重要度(ドキュメント) | 値の範囲 | ドキュメントの推奨 |
|---|---|---|
| Critical | 9.0〜10.0 | ランサムウェアの一部の可能性。最優先で調べて対処する |
| High | 7.0〜8.9 | すぐに対処する(インスタンスの隔離・終了、認証情報のローテーション) |
| Medium | 4.0〜6.9 | 早めに調べる。許可された動きか確かめ、分からなければ侵害されたとみなす |
| Low | 1.0〜3.9 | すぐの対応は無いが、弱点を探されている可能性として記録する |
検出結果は 90 日保存されます(上限、変更不可)。それより長く残すなら、S3 へのエクスポート(「検出結果のエクスポート」の設定)を使います。
CLI で検出結果を見る
D=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text)
# 重要度 7 以上、アーカイブしていないもの
IDS=$(aws guardduty list-findings --detector-id "$D" \
--finding-criteria '{"Criterion":{"severity":{"Gte":7},"service.archived":{"Eq":["false"]}}}' \
--query 'FindingIds' --output text)
aws guardduty get-findings --detector-id "$D" --finding-ids $IDS \
--query 'Findings[].[Severity,Type,Resource.ResourceType,Service.Count,UpdatedAt]' --output table
# 重要度ごとの件数
aws guardduty get-findings-statistics --detector-id "$D" --finding-statistic-types COUNT_BY_SEVERITY
# 試しの検出結果を作る(通知のテストに使う)
aws guardduty create-sample-findings --detector-id "$D" \
--finding-types Recon:EC2/PortProbeUnprotectedPort CryptoCurrency:EC2/BitcoinTool.B!DNS
moto 5.2.4 では、list-findings・get-findings-statistics・create-sample-findings は Not yet implemented でした。検出結果を扱うコードのテストには、Stubber などで応答を用意します。
通知:EventBridge でメール・Slack に送る
GuardDuty は検出結果を、そのリージョンの EventBridge(default イベントバス)にイベントとして送ります。source は aws.guardduty、detail-type は GuardDuty Finding です。
イベントパターン:重要度で絞る
{
"source": ["aws.guardduty"],
"detail-type": ["GuardDuty Finding"],
"detail": { "severity": [{ "numeric": [">=", 7] }] }
}
moto でルールを3つ作り、重要度とタイプの違うイベントを6件送ったときに届いたものです。
| パターン | 届いたイベント(重要度:タイプの先頭) |
|---|---|
"severity": [{"numeric": [">=", 7]}] |
7.0:UnauthorizedAccess:IAMUser・8:CryptoCurrency:EC2・9.5:AttackSequence:IAM |
"severity": [5, 8](ドキュメントの例) |
5:Recon:EC2・5.0:Recon:EC2・8:CryptoCurrency:EC2 |
"type": [{"prefix": "CryptoCurrency:"}] |
8:CryptoCurrency:EC2 |
値を並べる書き方は、その値と一致したものだけが届きます。 ドキュメントのコンソール用の例では、4 以上を拾うために 4, 4.0, 4.1, …, 10, 10.0 と値を全部並べています。numeric の範囲を使うと、1行で書けます。
| よく使うパターン | 書き方 |
|---|---|
| Medium 以上 | "severity": [{"numeric": [">=", 4]}] |
| High だけ | "severity": [{"numeric": [">=", 7, "<", 9]}] |
| 特定の目的 | "type": [{"prefix": "UnauthorizedAccess:"}] |
| 本番アカウントだけ | "accountId": ["111122223333"](detail の中) |
| サンプルを除く | "service": {"additionalInfo": {"sample": [{"exists": false}]}} |
メールで受け取る(SNS)
REGION=ap-northeast-1
ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
TOPIC=$(aws sns create-topic --name guardduty-alerts --query TopicArn --output text)
aws sns subscribe --topic-arn "$TOPIC" --protocol email --notification-endpoint security@example.com
# EventBridge からの発行を許すトピックポリシー
aws sns set-topic-attributes --topic-arn "$TOPIC" --attribute-name Policy --attribute-value "{
\"Version\":\"2012-10-17\",
\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},
\"Action\":\"sns:Publish\",\"Resource\":\"$TOPIC\",
\"Condition\":{\"ArnEquals\":{\"aws:SourceArn\":\"arn:aws:events:$REGION:$ACCOUNT:rule/guardduty-high\"}}}]}"
aws events put-rule --name guardduty-high \
--event-pattern '{"source":["aws.guardduty"],"detail-type":["GuardDuty Finding"],"detail":{"severity":[{"numeric":[">=",7]}]}}'
cat > targets.json <<'EOF'
[{
"Id": "sns",
"Arn": "arn:aws:sns:ap-northeast-1:123456789012:guardduty-alerts",
"InputTransformer": {
"InputPathsMap": {
"severity": "$.detail.severity", "Account_ID": "$.detail.accountId",
"Finding_ID": "$.detail.id", "Finding_Type": "$.detail.type",
"region": "$.region", "Finding_Description": "$.detail.description"
},
"InputTemplate": "{\"message\":\"You have a severity <severity> GuardDuty finding type <Finding_Type> in the <region> Region.\\n\\nFinding Description:\\n<Finding_Description>.\\n\\nFor more details open the GuardDuty console at https://console.aws.amazon.com/guardduty/home?region=<region>#/findings?search=id%3D<Finding_ID>\"}"
}
}]
EOF
aws events put-targets --rule guardduty-high --targets file://targets.json
InputTemplate はドキュメントの例です。ドキュメントでは、テンプレートを1行の JSON にし、message のようなキーで包むよう注意されています。 description に改行などの制御文字が入ることがあり、そのまま埋め込むと JSON が壊れて、通知が届かなくなるためです。SNS の使い方は、関連記事「Amazon SNSの使い方 CLI・boto3とSQSファンアウト早見表」で扱っています。
Slack に送る(Lambda)
# slack_notify.py(EventBridge のルールのターゲットにする Lambda)
import json, os, urllib.request
WEBHOOK_URL = os.environ["SLACK_WEBHOOK_URL"]
def level(sev: float) -> str:
if sev >= 9.0: return ":rotating_light: Critical"
if sev >= 7.0: return ":red_circle: High"
if sev >= 4.0: return ":large_orange_circle: Medium"
return ":white_circle: Low"
def lambda_handler(event, context):
d = event["detail"]
region = event["region"]
url = (f"https://console.aws.amazon.com/guardduty/home?region={region}"
f"#/findings?search=id%3D{d['id']}")
text = (f"*GuardDuty {level(float(d['severity']))} ({d['severity']})*\n"
f"*{d['type']}*\n{d.get('title', '')}\n"
f"Account: {d['accountId']} / Region: {region} / Count: {d.get('service', {}).get('count', 1)}\n"
f"<{url}|コンソールで開く>")
req = urllib.request.Request(WEBHOOK_URL, data=json.dumps({"text": text}).encode(),
headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=5) as res:
return {"status": res.status}
擬似の Webhook で受けた本文です(title は試しに入れた値)。
*GuardDuty :red_circle: High (8)*
*UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS*
Credentials for instance role ec2-app-role used from external IP address.
Account: 123456789012 / Region: ap-northeast-1 / Count: 3
<https://console.aws.amazon.com/guardduty/home?region=ap-northeast-1#/findings?search=id%3D16afba5c5c43e07c9e3e5e2e544e95df|コンソールで開く>
aws lambda add-permission --function-name guardduty-slack \
--statement-id events-guardduty-high --action lambda:InvokeFunction \
--principal events.amazonaws.com \
--source-arn arn:aws:events:ap-northeast-1:123456789012:rule/guardduty-high
aws events put-targets --rule guardduty-high \
--targets Id=slack,Arn=arn:aws:lambda:ap-northeast-1:123456789012:function:guardduty-slack
Webhook の URL は秘密の値なので、環境変数より Secrets Manager や SSM パラメータストアに置く方が安全です。Webhook の基本は、関連記事「GASでSlack・Google Chatに通知|Webhookの書き方」でも扱っています。コードを書かずに送るなら、SNS トピックを Amazon Q Developer in chat applications(旧 AWS Chatbot)につなぐ方法もあります。
| 通知の設計 | 理由 |
|---|---|
| 全リージョンにルールを作るか、委任管理者のアカウントに集めてからルールを作る | 検出結果も EventBridge のイベントもリージョンごと |
| Medium 以上をチャット、High 以上はメールや当番の呼び出しにも | Low まで送ると通知が多すぎて見なくなる |
試しの検出結果(create-sample-findings)で通知を確かめる |
本物を待たずに経路を試せる |
抑制ルール:ノイズを減らす
抑制ルールは、条件に合う新しい検出結果を自動でアーカイブするフィルターです。 CLI では create-filter --action ARCHIVE で作ります。
cat > criteria.json <<'EOF'
{"Criterion": {
"type": {"Eq": ["Recon:EC2/PortProbeUnprotectedPort"]},
"resource.instanceDetails.tags.key": {"Eq": ["public-web"]}
}}
EOF
aws guardduty create-filter --detector-id "$D" \
--name suppress-portprobe-public-web --action ARCHIVE --rank 1 \
--description "intentionally public web servers" \
--finding-criteria file://criteria.json
aws guardduty get-filter --detector-id "$D" --filter-name suppress-portprobe-public-web
moto で作った抑制ルールを get-filter した結果です。
{
"Name": "suppress-portprobe-public-web",
"Description": "intentionally public web servers",
"Action": "ARCHIVE",
"Rank": 1,
"FindingCriteria": {"Criterion": {
"type": {"Eq": ["Recon:EC2/PortProbeUnprotectedPort"]},
"resource.instanceDetails.tags.key": {"Eq": ["public-web"]}}}
}
名前を2文字にすると、送る前に Invalid length for parameter Name, value: 2, valid min length: 3 で止まりました(3文字以上)。
| 決まり(ドキュメント) | 内容 |
|---|---|
| 抑えた検出結果 | 作られるが、すぐアーカイブされる。90 日は見られる |
| 送られない先 | Security Hub CSPM・S3・Detective・EventBridge に送られない(通知も来ない) |
| Malware Protection for EC2 | 抑えた検出結果ではスキャンが始まらない |
| 作れる人 | 複数アカウントでは管理者アカウントだけ |
| 上限 | 保存したフィルターは 1 リージョンに 100 |
| 作り方の方針 | 何度も誤検知と確かめたものだけ、後から作る。広すぎる条件は攻撃シーケンスの検出にも影響する |
ドキュメントの例です。
| 場面 | 条件 |
|---|---|
| わざと公開している Web サーバーへのポート探索 | Finding type: Recon:EC2/PortProbeUnprotectedPort + Instance tag key |
| 自社の脆弱性スキャナーによるポートスキャン | Finding type: Recon:EC2/Portscan + スキャナーの Instance image ID |
タイプだけで抑えると、本物の攻撃も見えなくなります。 タグ・AMI・IP など、誤検知の原因を表す条件と組み合わせます。
料金の考え方
GuardDuty の料金は、分析した量に比例します(料金ページ、米国東部の例)。
| 対象 | 課金の単位 | 料金ページの最初の段階の例 |
|---|---|---|
| CloudTrail の管理イベント | 100 万イベントあたり | 4.00 USD |
| VPC フローログ・DNS ログ | GB あたり(量で段階的に安くなる) | 1.00 USD(最初の 500 GB) |
| S3 Protection | S3 データイベント 100 万あたり | 0.80 USD |
| EKS Protection | 監査ログ 100 万あたり | 1.60 USD |
| Runtime Monitoring | 保護する vCPU あたり(月) | 1.50 USD(最初の 500 vCPU) |
| Malware Protection for EC2 | スキャンした GB | 0.03 USD |
| Malware Protection for S3 | スキャンした GB と、評価したオブジェクト数 | 0.09 USD/GB、1,000 オブジェクトで 0.215 USD |
| RDS Protection | 保護するインスタンスの vCPU(Aurora Serverless v2 は ACU) | ログイン 1.00 USD/vCPU |
| Lambda Protection | Lambda のネットワークの記録の GB | 1.00 USD(最初の 500 GB) |
| 料金の決まり | 内容 |
|---|---|
| 無料期間 | 新しいアカウントの各リージョンで 30 日。オンデマンドのマルウェアスキャンと AWS Backup のマルウェア保護は対象外 |
| 見積もり | 無料期間中も、コンソールの「使用状況」に、期間後の見積もり額が出る |
| 増えやすい場面 | API を大量に呼ぶ自動処理(CloudTrail のイベント数)、通信量の多い EC2(フローログ)、S3 の読み書きが多いバケット(S3 Protection) |
無料期間中に「使用状況」で見積もりを見て、保護プランごとに続けるか決める流れが取りやすい方法です。料金の確かめ方は、関連記事「AWSの料金を確認する方法|Cost Explorer・CLI・予算アラート」で扱っています。
よくある質問
Q. CloudTrail の証跡を作っていなくても動きますか。 A. 動きます。ドキュメントでは、GuardDuty を有効にすると、CloudTrail の管理イベント・VPC フローログ・DNS ログを自動で取り込み始めると説明されています。証跡やフローログを自分で作る作業はありません。
Q. Security Hub と何が違いますか。 A. GuardDuty は脅威(攻撃の兆候)を見つけるサービスです。Security Hub は GuardDuty を含む複数のサービスの結果を集め、設定がベストプラクティスに合っているかも調べます。両方を使うと、GuardDuty の検出結果が Security Hub にも集まります。
Q. 検出結果をアーカイブすると、どうなりますか。 A. 一覧の「現在」から消え、「アーカイブ済み」に移ります。対応が終わったものはアーカイブし、同じことが続くなら抑制ルールを考えます。
Q. GuardDuty を止めるとデータはどうなりますか。
A. 「一時停止(suspend)」は分析を止め、検出結果は残ります。「無効化(disable)」は検出器を消し、検出結果も消えます。止められないよう、SCP で guardduty:DeleteDetector などを拒否しておく方法があります。
まとめ
create-detector --enableで有効化。リージョンごとなので、使っていないリージョンも有効にする- 複数アカウントは Organizations の委任管理者(全リージョン同じアカウント)と
--auto-enable-organization-members ALL - タイプ名は
目的:リソース/脅威の名前.見つけ方!資源。重要度は Critical 9.0〜、High 7.0〜、Medium 4.0〜、Low 1.0〜 - 通知は EventBridge の
aws.guardduty/GuardDuty Finding。重要度はnumericで範囲を書く - 抑制ルールは
create-filter --action ARCHIVE。抑えた検出結果は EventBridge に送られないため、条件はタイプ+タグ・AMI などで狭く - 料金は分析した量の従量。30 日の無料期間に「使用状況」で見積もりを見る
参考・出典
確認日はいずれも 2026年10月13日です。
- Amazon GuardDuty ユーザーガイド「What is Amazon GuardDuty?」:https://docs.aws.amazon.com/guardduty/latest/ug/what-is-guardduty.html
- Amazon GuardDuty ユーザーガイド「GuardDuty finding format」:https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-format.html
- Amazon GuardDuty ユーザーガイド「Severity levels of GuardDuty findings」:https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_findings-severity.html
- Amazon GuardDuty ユーザーガイド「GuardDuty active finding types」:https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html
- Amazon GuardDuty ユーザーガイド「Processing GuardDuty findings with Amazon EventBridge」:https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_findings_eventbridge.html
- Amazon GuardDuty ユーザーガイド「Suppression rules」:https://docs.aws.amazon.com/guardduty/latest/ug/findings_suppression-rule.html
- Amazon GuardDuty ユーザーガイド「Managing GuardDuty accounts with AWS Organizations」:https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_organizations.html
- Amazon GuardDuty ユーザーガイド「GuardDuty quotas」:https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_limits.html
- Amazon GuardDuty API リファレンス「DetectorFeatureConfiguration」:https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DetectorFeatureConfiguration.html
- Amazon GuardDuty の料金:https://aws.amazon.com/guardduty/pricing/
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「GuardDutyの使い方|有効化と検出結果の読み方・通知の設定」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。