皆さん、こんにちは!インシデントレスポンスの現場を渡り歩いているSOCアナリストです。日々の運用、本当にお疲れ様です。
セキュリティのニュースを見ていると、「どこそこの企業で不正アクセスがありました」「パスワードが盗まれました」なんて話が毎日のように流れてきますよね。「うちの会社は大丈夫かな…」と、少し不安になってしまう新人IT担当者の方や、開発の傍らでセキュリティも任されてしまったエンジニアの方も多いのではないでしょうか。
今回は、そんな皆さんに向けて、「VPNログと認証ログの突き合わせによるアカウント侵害の特定」という、実務でめちゃくちゃ使えるフォレンジック(調査)の技術を、身近な例えを交えながら優しく紐解いていきたいと思います。
小難しい専門用語が出てきても置いてけぼりにしませんので、一歩ずつリラックスして学んでいきましょう!
—
1. 家の鍵に例える「VPN」と「認証」の仕組み
まずは、私たちが普段使っているシステムが、現実世界でどうなっているのかをイメージしてみましょう。
会社のリソース(社内サーバーやクラウド上の大事なデータ)にアクセスするとき、皆さんは「VPN(仮想プライベートネットワーク)」という仕組みを使って接続していますよね。これは、いわば「会社の建物につながる専用の地下トンネル」のようなものです。
そして、そのトンネルをくぐった後に待っているのが、Active Directory(AD)などの「認証ログ」の世界です。これは、会社の部屋に入るための「タイムカード付きのICカードリーダー」だと考えてみてください。
- VPN接続ログ:「誰が、どのIPアドレス(どこから)から、何時何分に地下トンネルに入ってきたか」の記録
- 認証ログ:「誰が、社内のどの部屋(サーバー)のドアノブをガチャガチャして、鍵が開いたか(成功したか)失敗したか」の記録
通常、あなたが東京の自宅からVPNをつないで社内システムにアクセスした場合、地下トンネルの入口(VPN)と、部屋のドア(認証)の記録は綺麗に一致します。
しかし、もし「泥棒(攻撃者)」があなたの合鍵(パスワード)をどこかで手に入れていたらどうなるでしょうか?
—
2. 現場で起きた事件:なぜ「突き合わせ」が必要なのか?
攻撃者は、あなたのパスワードを総当たり(ブルートフォース攻撃)で破ったり、どこかのフィッシングサイトで盗み出したりして手に入れます。
ここで、セキュリティ担当者がよくやりがちな罠があります。
「VPNのログだけ」を見て、「おっ、今夜もみんな真面目に残業してVPN繋いでるな」と安心してしまうこと。あるいは、「認証ログだけ」を見て、「エラーが出てるけど、誰かがパスワードを打ち間違えただけだろう」とスルーしてしまうことです。
ここに攻撃者の盲点があります。
攻撃者は、あなたの「合鍵」を持っていますが、あなたの「体(物理的な位置)」を盗むことはできません。つまり、VPNの接続元(国やIPアドレス)と、その後の社内での動きが、どう考えてもおかしい矛盾が生じるのです。
これを暴くのが、「VPNログと認証ログの突き合わせ」という作業になります。
—
3. ログを突き合わせて「不自然さ」を見抜く
では、実際に現場で私たちがどのようにログを突き合わせているのか、その手順を覗いてみましょう。
今回は、Pythonというプログラミング言語を使って、簡単なログ分析スクリプトを動かすイメージで解説します。「プログラミングはちょっと…」という方も、日本語のコメントを読めば何をやっているかすぐに分かりますので安心してくださいね!
実践:ログ突合スクリプトのサンプル
以下のPythonコードは、VPNの接続ログと認証ログのタイムスタンプやユーザー名を突き合わせ、「あれ?この国からのアクセスなのに、数秒後に社内サーバーにログインしてるのはおかしくない?」という不審な動きを検出するイメージです。
import datetime
# 模擬データ:VPN接続ログ(どこから、誰が、何時につないだか)
vpn_logs = [
{"user": "yamada", "ip": "203.0.113.55", "country": "JP", "time": "2023-10-25 21:00:10"},
{"user": "tanaka", "ip": "198.51.100.42", "country": "RU", "time": "2023-10-25 21:05:00"}, # ロシアからの不審なアクセス
]
# 模擬データ:Active Directoryなどの認証ログ(誰が、どのサーバーにアクセスしたか)
auth_logs = [
{"user": "yamada", "target_server": "file-srv-01", "result": "SUCCESS", "time": "2023-10-25 21:00:15"},
{"user": "tanaka", "target_server": "db-srv-03", "result": "SUCCESS", "time": "2023-10-25 21:05:10"}, # 要チェック!
]
def analyze_logs(vpns, auths):
print("=== インシデント調査:ログ突合分析を開始します ==-\n")
for auth in auths:
user = auth["user"]
auth_time = datetime.datetime.strptime(auth["time"], "%Y-%m-%d %H:%M:%S")
# 対応するVPNログを検索
matching_vpn = next((v for v in vpns if v["user"] == user), None)
if matching_vpn:
vpn_time = datetime.datetime.strptime(matching_vpn["time"], "%Y-%m-%d %H:%M:%S")
country = matching_vpn["country"]
# 【ポイント】もし普段と違う国(例: 日本以外)からのアクセスだったらアラート!
if country != "JP":
print(f"[!] 警告: アカウント侵害の疑いがあります!")
print(f" ユーザー名: {user}")
print(f" VPN接続元: 国コード [{country}] (IP: {matching_vpn['ip']})")
print(f" 認証先サーバー: {auth['target_server']} ({auth['result']})")
print(f" -> 物理的に移動不可能な速度でのアクセス、または海外からの不正接続です。\n")
else:
(f"[OK] ユーザー {user} のアクセスは正常範囲内です。")
# 分析を実行
analyze_logs(vpn_logs, auth_logs)
このコードの肝は、「人間が移動できるスピードを超えていないか」「普段と違う場所からのアクセスなのに、重要サーバーの扉が開いていないか」を機械的にチェックしている点です。
—
4. 現場で見つける「攻撃者の足跡」とパラメーター設定のコツ
実務でSIEM(ログを一元管理するツール)やログ分析を行う際、私たちが特に注目しているポイント(パラメーターやイベントID)をいくつかご紹介します。インフラ構築やログ設計の際に、ぜひ参考にしてみてください。
A. Windows Active Directory の重要イベントID
Event ID: 4625(ログオン失敗)- これが短時間に何回も連続している場合は、ブルートフォース攻撃(総当たり攻撃)を受けている証拠です。泥棒がドアノブをガチャガチャと力づくで開けようとしている状態ですね。
Event ID: 4624(ログオン成功)- 失敗の後に突然これが成功した場合、パスワードが突破された可能性が極めて高いです。
B. VPN側の記録項目
- グローバルIPアドレスとジオIP(位置情報)
- 「さっきまで東京にいたはずの社員が、数分後にナイジェリアやロシアからVPN接続している」といった、いわゆる「あり得ない移動(Impossible Travel)」が発生していないかを必ず確認します。
—
5. まとめ:一歩ずつ、確実な防犯を
いかがでしたでしょうか?
「VPNログと認証ログの突き合わせ」と聞くと難しく聞こえますが、要するに「家の外の防犯カメラ(VPN)」と「部屋の鍵の履歴(認証ログ)」を突き合わせて、ジグソーパズルのピースが噛み合っているかを確認する作業なんです。
セキュリティの対策に「これで完璧」というゴールはありません。しかし、今回紹介したようなログの関連性を知るだけでも、怪しい動きに気づくセンサーの感度はグッと上がります。
焦らず、まずは自社のログがどこに保存されていて、どう見れば繋ぎ合わせられるのか、小さな一歩から確認してみましょう。皆さんの日々の地道な守りが、会社の大きなおおもとを守る盾になります。
それでは、また次回のフォレンジック解説でお会いしましょう!安全なネットワーク運用を!
コメント