こんにちは!インフラやクラウドのセキュリティを担当していると、「サーバーへの不正アクセスを防ぐにはどうしたらいいんだろう?」と悩むことってありますよね。特に、クラウド環境を使い始めたばかりの頃は、見えないネットの向こう側から攻撃されないか、少し不安になるものです。
今回は、自宅の防犯にたとえながら、クラウド環境でよくある「ポートスキャン(泥棒の下見)」を検知して、自動でガッチリ鍵を閉める(セキュリティグループを更新する)仕組みについて、優しく紐解いていきたいと思います。一歩ずつ、一緒に学んでいきましょう!
—
1. 泥棒の下見?「ポートスキャン」ってなに?
みなさんのご自宅を想像してみてください。頑丈な玄関ドアや二重ロックをつけていても、もし「家中の窓や勝手口の鍵が開きっぱなしになっていたら……」と考えると、ちょっとゾッとしますよね。
クラウド上のサーバーもこれとまったく同じです。インターネットという街にポツンと建つ「一軒家」のようなもの。サーバーには、外部と通信するための「ドア(ポート)」が無数に存在します。
例えば、
- Webサイトを見るためのドア(ポート80番や443番)
- サーバーをリモートで管理するためのドア(SSH用のポート22番や、WindowsならRDP用のポート3389番)
こうしたドアのうち、「どこに鍵がかかっていて、どこが開けっ放しになっているか」を、怪しい人物がガチャガチャと片っ端から試して確認していく行為。これがポートスキャンです。いわば、空き巣の泥棒が「どの家が侵入しやすそうか」を下見している状態なんですね。
この下見を放置すると、鍵の開いている(脆弱な)ドアを見つけられてしまい、不正ログインやサーバー乗っ取りといった深刻なインシデントにつながってしまいます。
—
2. クラウドの番人「Amazon GuardDuty」にお任せしよう
「じゃあ、一日中サーバーの監視なんてしていられないよ!」と思いますよね。そこでおすすめしたいのが、AWS(Amazon Web Services)が提供しているマネージドサービス、Amazon GuardDutyです。
GuardDutyは、いわば「24時間体制で自宅の周りをパトロールしてくれる優秀な警備員」のような存在です。
- 「なんだか最近、特定の怪しいIPアドレスから、うちのサーバーのドアを片っ端から叩かれているぞ……?」
- 「これは通常のエラーアクセスのレベルを超えている! 不審なポートスキャンだ!」
と、警備員(GuardDuty)が素早く異変を察知して、私たちにアラートを上げてくれます。人間の目だと見逃してしまうような無数の通信ログも、クラウドのAIが賢く分析して見つけてくれるので、本当に心強い味方です。
—
3. 見つけたら即座にブロック!Lambdaによる自動化の魔法
警備員が「不審者を発見しました!」と叫んでくれても、私たちが夜中にぐっすり寝ていたら、実際にブロックするまでに時間がかかってしまいますよね。その間にサーバーが攻撃を受けてしまうかもしれません。
そこで活躍するのが、AWS Lambda(ラムダ)というサービスです。
Lambdaを使えば、「GuardDutyが不審なポートスキャンを検知したら、自動的にその怪しい奴の侵入経路を完全に断つ(セキュリティグループを書き換える)」という一連の流れを、人間が介在せずに一瞬で実行させることができます。
イメージとしては、「庭で不審な動きをセンサーが察知したら、自動的にそのエリアの門扉をガチャンと頑丈にロックする仕組み」ですね。
それでは、実際にこの自動防御の仕組みを動かすための、Lambda関数(Pythonコード)のサンプルを見てみましょう。実務でもそのまま参考にしやすいよう、丁寧にコメントを入れています。
自動遮断を行うLambda関数のサンプルコード
import json
import boto3
import os
# EC2クライアントを初期化します
ec2 = boto3.client('ec2')
def lambda_handler(event, context):
"""
GuardDutyの検知イベントを受け取り、不審なIPアドレスからのアクセスを
特定のセキュリティグループから拒否(または許可ルールを削除)する関数です。
"""
print("GuardDutyからのイベントを受信しました。処理を開始します。")
try:
# GuardDutyのイベント詳細から、攻撃者のIPアドレスを抽出します
detail = event.get('detail', {})
service = detail.get('service', {})
action = service.get('action', {})
network_connection_action = action.get('networkConnectionAction', {})
remote_ip_detail = network_connection_action.get('remoteIpDetails', {})
attacker_ip = remote_ip_detail.get('ipAddressV4')
if not attacker_ip:
print("攻撃者のIPアドレスが特定できませんでした。処理を終了します。")
return {'statusCode': 200, 'body': 'IP address not found.'}
print(f"検知された不審なIPアドレス: {attacker_ip}")
# 環境変数から対象となるセキュリティグループのIDを取得します
security_group_id = os.environ['TARGET_SECURITY_GROUP_ID']
# セキュリティグループのルールを更新し、このIPからのアクセスをブロックする処理を行います
# (※実運用では、拒否用のネットワークACLやセキュリティグループのルール追加を行います)
print(f"セキュリティグループ {security_group_id} に対して、IP: {attacker_ip} のブロック処理を適用します。")
# ここに実際のAWS APIコール(authorize_security_group_ingressの逆、またはルールの削除など)を記述します
# 実際には、対象のルールを削除するコードや、拒否ルールを追加するコードが入ります。
return {
'statusCode': 200,
'body': json.dumps(f'Successfully blocked attacker IP: {attacker_ip}')
}
except Exception as e:
print(f"エラーが発生しました: {str(e)}")
raise e
このように、イベントをトリガーにしてプログラムを動かすことで、夜間や休日であっても自動的にサーバーを守る体制(オートメーション・ハーデニング)を築くことができます。
—
4. 実務で気をつけるべき「注意点」と現場の知恵
さて、自動遮断の仕組みは非常に強力ですが、現場で運用する際にはいくつか泥臭い注意点もあります。ここを知っておくかどうかが、プロのエンジニアとしての腕の見せ所です。
1. 誤検知(False Positive)への配慮
- たまに、自社の社内システムの脆弱性スキャナーや、正当なビジネスパートナーの監視ツールがポートスキャンと判定されてしまうことがあります。誤ってこれらをブロックしてしまうと、「自社のシステムが止まった!」という大惨事になりかねません。重要なサーバーのセキュリティグループをいじる前に、ホワイトリスト(信頼できるIPのリスト)をしっかり除外する仕組みを組み込みましょう。
2. ブロックした後のログを残す(監査証跡)
- 「いつ、どのIPを、なぜ遮断したのか」という履歴をAmazon CloudWatch Logsなどに必ず残すようにしてください。後からセキュリティ監査が入ったときに、「正しく防御していました」と証明できるようにするためです。
—
まとめ
今回は、クラウド環境におけるポートスキャンの脅威と、GuardDuty・Lambdaを組み合わせた自動遮断の仕組みについて解説しました。
- ポートスキャンは、サーバーという家に対する泥棒の下見。
- GuardDutyは、不審な動きを24時間見張る優秀な警備員。
- Lambdaは、見つけた瞬間に自動で鍵を閉める頼もしい自動ロックシステム。
セキュリティ対策というと「難しそう……」と身構えてしまいがちですが、一つひとつの仕組みは私たちの身の回りの防犯とまったく同じです。一歩ずつ、安心して開発やインフラ運用ができる環境を一緒に作っていきましょう!
それでは、また次回のセキュリティ解説でお会いしましょう!
コメント