こんにちは!セキュリティの世界へようこそ。
新人のIT担当者や、これからクラウドインフラに触れる開発者の皆さん、「セキュリティ対策」って聞くと、何だか難しそうだな…って身構えてしまいますよね。
大丈夫です。一歩ずつ、身近な例えから紐解いていきましょう!
今回は、クラウド(AWS)の世界で私たちのシステムを守る「AWS CloudTrail(クラウドトレイル)」と「Amazon GuardDuty(ガードデューティ)」という、とっても頼もしい2人の「警備員コンビ」についてお話しします。
—
1. 家の防犯に例えて理解する「CloudTrail」と「GuardDuty」
まずは、私たちが普段暮らしている「家」を想像してみてください。
皆さんは、自宅の玄関に鍵(共通鍵や公開鍵などの暗号技術)をかけますよね。でも、頑丈な鍵をかけただけで安心していませんか? 熟練の空き巣は、あらゆる手口で鍵を開けようとしたり、窓ガラスを破ったりして侵入してきます。
ここで重要になるのが、「誰が、いつ、どこから家に出入りしたか」の記録です。
CloudTrailは「防犯カメラと出入り管理ノート」
AWSの世界では、サーバーやデータベースに対する「誰がどの操作をしたか(API呼び出し)」というすべての動きが記録されます。これが AWS CloudTrail です。
「午前3時に、海外のIPアドレスから、金庫(データベース)の鍵が開けられた」といった履歴を、一言一句漏らさずノートに書き留めてくれる防犯カメラのような存在ですね。
GuardDutyは「怪しい動きを察知する優秀な警備員」
ただ、CloudTrailが記録するノートは膨大です。人間の目で24時間ずっと監視するのは、正直不可能ですよね。そこで登場するのが Amazon GuardDuty です。
GuardDutyは、AWSの膨大なログをAIと最新の脅威インテリジェンス(世界中のサイバー攻撃のデータベース)で常に監視し、「おい、今の動き、絶対に泥棒のやり方だぞ!」と異常を検知して警報を鳴らしてくれる優秀な警備員なんです。
—
2. 攻撃者はどこを狙う? 実録・よくあるクラウドの油断
現場のインシデント(事故)対応で本当によくあるのが、「開発者のうっかりミスによる認証情報の漏洩」です。
例えば、テスト用に作ったプログラムの中に、AWSの合言葉である「アクセスキー」を書き込んだまま、うっかりGitHubなどの公開リポジトリにアップロードしてしまうケースです。
攻撃者は、世界中で常にボット(自動プログラム)を走らせて、インターネット上に公開されたソースコードからこの合言葉を探しています。合言葉を見つけた瞬間、攻撃者はあなたのAWS環境にこっそり侵入し、勝手に高額な仮想通貨マイニング用のサーバーを何台も立ち上げてしまいます。
気づいた時には、翌月に数百万円の請求書が届いている……なんて笑えない話が、実際にゴロゴロ転がっているんです。
こうした脅威をいかに早く見つけ、被害を最小限に食い止めるかが、私たちエンジニアの腕の見せ所になりますよね。
—
3. 自動検知・通知フローの構築をしてみよう!
それでは、GuardDutyが怪しい動きを検知したときに、Slackなどのチャットツールへ自動でアラートを飛ばす仕組みを、実際に作ってみましょう!
全体の流れとしては以下のようになります。
1. Amazon GuardDuty が怪しい振る舞いを検知する
2. Amazon EventBridge(イベントの橋渡し役)がその警報を受け取る
3. AWS Lambda(プログラムを実行する仕組み)に通知を投げる
4. Lambda が加工して Slack にメッセージを送信する
ステップ1:通知用のLambda関数を作成する
まずは、警報を受け取ってSlackにメッセージを届けるためのPythonコード(Lambda用)を見てみましょう。小難しい設定は置いておいて、「こういうコードで動くんだな」と雰囲気を掴んでみてくださいね。
import json
import urllib.request
import os
# SlackのWebhook URL(環境変数から安全に呼び出します)
SLACK_WEBHOOK_URL = os.environ['SLACK_WEBHOOK_URL']
def lambda_handler(event, context):
# GuardDutyから飛んできたイベントの中身を取り出します
detail = event.get('detail', {})
title = detail.get('title', 'GuardDutyからのアラート')
description = detail.get('description', '不審なアクティビティが検知されました。')
severity = detail.get('severity', 0)
# 緊急度(Severity)に応じて色やメッセージを調整すると親切ですね
color = "danger" if severity >= 7.0 else "warning"
# Slackに送るメッセージの組み立て
slack_message = {
"attachments": [
{
"color": color,
"title": f"🚨 [GuardDuty検知] {title}",
"text": description,
"fields": [
{
"title": "緊急度レベル",
"value": str(severity),
"short": True
}
],
"footer": "AWS Security Automation"
}
]
}
# SlackへHTTPリクエストを送信
req = urllib.request.Request(
SLACK_WEBHOOK_URL,
data=json.dumps(slack_message).encode('utf-8'),
headers={'Content-Type': 'application/json'}
)
try:
with urllib.request.urlopen(req) as response:
res_body = response.read()
print("Slackへの通知が成功しました:", res_body.decode('utf-8'))
except Exception as e:
print(f"エラー: Slackへの通知に失敗しました: {e}")
raise e
ステップ2:EventBridgeでルールを設定する
次に、GuardDutyが発したアラートを、先ほどのLambda関数にバトンタッチするための設定を行います。
AWSマネジメントコンソールから「Amazon EventBridge」を開き、ルールを作成します。
- イベントパターン: 「AWSサービス」 -> 「GuardDuty」 -> 「GuardDuty Finding」を指定します。
- ターゲット: 先ほど作成したLambda関数を指定します。
たったこれだけで、GuardDutyが驚異を検知した瞬間に、数秒であなたのチャットに通知が飛ぶ仕組みが完成します!
—
4. インシデント発生時の初動対応(泥臭い実務の知恵)
もし、Slackに「海外からの不審なアクセス」や「ブルートフォース攻撃の検知」といったアラートが飛んできた時、パニックになってはいけません。現場のエンジニアとして、冷静に以下の「3つのステップ」で初動対応を行いましょう。
1. アクセスキーの無効化(即座に鍵を替える)
怪しい動きをしているユーザーや、漏洩した可能性のある アクセスキー(Access Key IDなど)を、迷わず即座に「無効化(Inactive)」または「削除」します。システムを止めるのではなく、泥棒の合言葉だけを無効にするイメージです。
2. CloudTrailで足取りを追う
CloudTrailのログを開き、その合言葉を使って攻撃者が「どのリソース(EC2、S3バケットなど)に触ったか」を徹底的に洗い出します。「データを盗まれていないか」「勝手に怪しいプログラムを動かされていないか」を確認する一番重要な作業です。
3. パスワードやシークレットのローテーション
関連するすべての認証情報を作り直し、安全な状態に戻します。
—
まとめ:セキュリティは「完璧」より「早期発見とリカバリ」
いかがでしたでしょうか?
今回は、CloudTrailとGuardDutyを使った異常検知の仕組みと、インシデント対応の基礎を解説しました。
セキュリティの世界では、「100%絶対に侵入されないシステム」を作ることは不可能です。だからこそ、「侵入されてもすぐに気づき(GuardDuty)、足跡をたどり(CloudTrail)、被害を最小限に食い止める仕組み」をあらかじめ作っておくことが何よりも大切になります。
難しく考えず、まずはご自身のAWS環境でGuardDutyを「ポチッと有効化」してみることから始めてみませんか?
一歩ずつ、安全で強いシステムを一緒に作っていきましょう!
コメント