Linux(Ubuntu / Linux Mint)環境での Squid を使ったプロキシサーバ構築手順 を、初心者でも確実に構築できるように、わかりやすく順を追って説明します。
🧩 目的
Squid を使ってプロキシサーバを構築し、
社内 LAN のインターネットアクセス制御
キャッシュによる通信効率化
アクセスログの取得
を実現します。
🖥️ 動作環境(例)
項目 内容 OS Ubuntu 22.04 / Linux Mint 21.x ホスト名 proxy-server IPアドレス 192.168.123.10 ネットワーク 内部LAN: 192.168.123.0/24 ポート 3128(デフォルト)
⚙️ 1. Squid のインストール
sudo apt update
sudo apt install squid -y
📁 2. 設定ファイルのバックアップと編集
Squid のメイン設定ファイルは/etc/squid/squid.conf です。
まずバックアップ:
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.backup
次に編集:
sudo nano /etc/squid/squid.conf
🧾 3. 基本設定例
以下を参考にしてください。 (既存の http_access deny all の前に追加します)
# ===============================
# Squid basic configuration
# ===============================
# 使用ポート
http_port 3128
# キャッシュディレクトリ設定(デフォルト)
cache_dir ufs /var/spool/squid 100 16 256
# キャッシュサイズ
cache_mem 256 MB
# アクセス制御リスト
acl localnet src 192.168.123.0/24
acl localhost src 127.0.0.1/32
# 許可するアクセス範囲
http_access allow localnet
http_access allow localhost
# 最後に全拒否
http_access deny all
# ログ設定
access_log /var/log/squid/access.log squid
保存して終了(Ctrl+O → Enter → Ctrl+X)
🔁 4. Squid の再起動と有効化
sudo systemctl restart squid
sudo systemctl enable squid
sudo systemctl status squid
🔍 5. ファイアウォール設定(必要に応じて)
ポート3128を開放:
sudo ufw allow 3128/tcp
sudo ufw reload
🧠 6. クライアント側設定
例:Windowsクライアント
「インターネットオプション」→「接続」→「LANの設定」
「プロキシサーバを使用する」にチェック
アドレス:192.168.123.10 ポート:3128
OKで閉じる
🧾 7. 動作確認
クライアントPCでhttp://cachemgr:3128 や任意のサイトを開き、アクセスできればOK。
サーバ側でログ確認:
sudo tail -f /var/log/squid/access.log
🔐 8. 認証を追加する(任意)
社内利用者ごとにID/PASSを設定したい場合:
認証パッケージ追加
sudo apt install apache2-utils
ユーザー作成
sudo htpasswd -c /etc/squid/passwd user1
squid.conf に以下を追記
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm ProxyServer
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
再起動:
sudo systemctl restart squid
ブラウザで接続時、認証ダイアログが出ればOK。
📊 9. ログの確認と解析
ログファイル:
/var/log/squid/access.log
日次で整理したい場合は、logrotate設定を利用可能。
🚀 10. キャッシュの削除(トラブル時)
sudo squid -k shutdown
sudo rm -rf /var/spool/squid/*
sudo squid -z
sudo systemctl start squid
✅ まとめ
機能 設定場所 目的 基本設定 /etc/squid/squid.confポート・ACL 認証設定 /etc/squid/passwdユーザー制御 ログ /var/log/squid/アクセス記録 起動制御 systemctlサービス管理
ご希望があれば、次のような追加構成も作成できます:
🧱 キャッシュサーバ+フィルタ型(URLブロックリスト)
🧩 透過型プロキシ(NAT連携)
🧠 アクセスログの自動レポート化(sarg, goaccessなど)
どの構成を目指されていますか? 例: 1️⃣ 認証付きプロキシ 2️⃣ 社内LANの透過型プロキシ 3️⃣ URLフィルタ付きセキュリティプロキシ
選んでいただければ、その構成に最適な設定例を提示します。
あなた:
基本的な構成は下記のように考えて良いですか インターネット ↓ (219.117.220.120)WAN側 モデム (100.133.145.10) ↓ (100.133.145.11) プロキシサーバ (192.168.123.11) ↓ 各クライアントPC(192.168.123.20)以降 このように考えれば良いですか? 間違っていればどのような設定が良いですか? 宜しくおねがいします。
ChatGPT:
とても良い質問です。 結論から言うと、ほぼ正しい構成ですが、いくつか整理・補足を加えるとより安定して運用できる構成 になります。
✅ あなたの想定構成(再掲)
インターネット
↓
[WAN: 219.117.220.120]
↓
モデム(またはONU)
↓
[モデム内側: 100.133.145.10]
↓
[プロキシサーバ]
├─ 外側NIC: 100.133.145.11(WAN側)
└─ 内側NIC: 192.168.123.11(LAN側)
↓
クライアントPC群(192.168.123.20〜)
🧩 評価:構成としては「◎」です
この構成は「2枚NICを持つプロキシ中継構成 」として理想的です。 つまり:
外側(WAN)…インターネットと通信(上り回線)
内側(LAN)…社内端末と通信(下り回線)
プロキシサーバが中継・フィルタ・キャッシュを担当
🧱 推奨ネットワーク構成の詳細
役割 デバイス IPアドレス 備考 インターネット側 プロバイダ(グローバルIP) 219.117.220.120 ルータまたはモデムに設定 モデム/ルータ内側 ルータLAN側 100.133.145.10 プロキシサーバWAN側と接続 プロキシWAN側 eth0 100.133.145.11 デフォルトゲートウェイ=100.133.145.10 プロキシLAN側 eth1 192.168.123.11 DHCPサーバ or 固定IP配布 クライアントPC NIC 192.168.123.20〜 デフォルトゲートウェイ=192.168.123.11(またはルータ)
⚙️ Linux(Squidサーバ)での設定ポイント
① NICの固定IP設定(例:Ubuntu)
sudo nano /etc/netplan/01-network-manager-all.yaml
例:
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 100.133.145.11/24
gateway4: 100.133.145.10
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
eth1:
addresses:
- 192.168.123.11/24
反映:
sudo netplan apply
② IP転送の有効化(透過型プロキシや中継を想定する場合)
sudo nano /etc/sysctl.conf
以下を有効化:
net.ipv4.ip_forward = 1
反映:
sudo sysctl -p
③ ファイアウォール(ufw)設定
sudo ufw allow 22/tcp # SSH
sudo ufw allow 3128/tcp # Squid
sudo ufw enable
④ クライアント側ブラウザ設定
プロキシ:192.168.123.11
ポート:3128
🚫 よくある誤解(注意点)
項目 誤解 正しい理解 モデムの役割 NATしていると思い込む 実際は「ルータ機能付き」か確認が必要 100.133.145.* プライベートIPではない(キャリアNAT帯) プロバイダがCGNATを使っている可能性あり クライアントのGW設定 プロキシをゲートウェイにしても通信しない 通常は「ブラウザのプロキシ設定」で中継させる
🧠 重要な補足:運用モードを決める
モード 特徴 設定難易度 通常プロキシモード クライアントが明示的にプロキシ設定する(推奨) ★☆☆(簡単) 透過型プロキシモード ルータ側でHTTP通信を自動転送 ★★★(iptables設定必要)
あなたの構成では「通常プロキシモード 」が最も確実でトラブルが少ないです。
✅ まとめ
あなたの設計方針(WAN⇄プロキシ⇄LAN)は正解です。 整理すると下記のようになります👇
[Internet]
│ (219.117.220.120)
[モデム/ルータ]
│ (100.133.145.10)
[eth0: Proxy Server]
│ (100.133.145.11)
[eth1: Proxy Server]
│ (192.168.123.11)
[Client PCs]
│ (192.168.123.20〜)
ブラウザ設定: プロキシ 192.168.123.11:3128
もしよければ次のステップとして:
🧩「クライアントはブラウザに手動設定」なのか 🧠「透過型で自動振り分け」なのか
どちらの方式で運用したいか教えてください。 それに応じて、iptables転送設定 or WPAD自動設定 の具体例を提示します。
あなた:
クライアントはブラウザに手動設定」と「透過型で自動振り分け」の違いを教えてください。
ChatGPT:
とても良い質問です。 「手動設定」と「透過型」の違いは、クライアントがプロキシを意識するかどうか 、つまり「通信経路の設定を誰が行うか」にあります。
🧩 まずはざっくり比較表
項目 手動設定型プロキシ(明示型) 透過型プロキシ(トランスペアレント) クライアント設定 ブラウザなどに「プロキシサーバのIPとポート(例:192.168.123.11:3128)」を手動入力 一切不要(自動でHTTP通信がプロキシ経由になる) 動作原理 クライアントがHTTPリクエストを直接プロキシへ送る ルータまたはプロキシサーバが通信を強制的にプロキシに転送する(iptablesなどで) 導入の簡単さ ◎ とても簡単(Squidだけで完結) △ ルータ設定やiptablesが必要 トラブル発生率 低い(ブラウザ設定を間違えなければ安定) 高い(SSL通信・HTTP/HTTPS判別・転送ルールが複雑) HTTPS(SSL)通信 問題なし 原則不可(証明書割り込みが必要) メリット シンプル・安全・ログが明確 クライアント設定不要・強制的に経由可能 デメリット PC台数が多いと設定が面倒 設定が複雑・SSLの扱いが難しい おすすめ用途 社内LANや開発環境、教育用途など カフェWi-Fi、ホテルネットワークなど「強制的に中継」したい環境
⚙️ 図で見る違い
🧭 手動設定(明示型)
[PCブラウザ設定済み]
↓ (HTTPリクエスト)
[プロキシサーバ(Squid)]
↓
[インターネット]
👉 クライアントが自分で「192.168.123.11:3128」を指定する。 👉 Squidがそのまま通信を中継・キャッシュ。
🔄 透過型(Transparent)
[PC(設定なし)]
↓ (HTTPリクエスト→外部サイト)
[iptables/NATによって強制的にSquidへ転送]
↓
[Squidが代理アクセス]
↓
[インターネット]
👉 クライアントはプロキシの存在を知らない。 👉 ルータ or サーバのiptablesで tcp port 80 をSquidの3128へ転送。 👉 HTTPSは透過できない(暗号化のため)。
🧠 実際の構成での違い(あなたの構成に当てはめると)
項目 手動設定型 透過型 クライアント設定 ブラウザで「192.168.123.11:3128」を指定 何もしない(プロキシを知らなくてもOK) Proxyサーバ SquidだけでOK Squid+iptables転送設定が必要 SSLサイト(https://) 問題なし 通常はスルー(キャッシュ不可) 構成例 開発環境・社内LAN 学校・公共Wi-Fiなど
🧰 透過型を実現するiptables例(参考)
※あくまで仕組みの理解用。HTTPS対応には追加設定が必要です。
# IP転送有効
sudo sysctl -w net.ipv4.ip_forward=1
# NAT設定(eth1: LAN側, eth0: WAN側)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# HTTP(80)をSquidの3128に転送
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
✅ 結論(おすすめ)
環境 おすすめ方式 理由 社内LAN/工場ネットワーク ✅ 手動設定(明示型) 安定・簡単・ログ管理しやすい 公共Wi-Fi/ゲスト用ネットワーク 透過型(Transparent) 設定不要で自動中継可能
💡 実運用アドバイス
まずは 手動設定型で運用開始 (Squid単体でOK)
クライアントの数が多くなったら 自動設定ファイル(WPAD) を導入 → ブラウザが自動でプロキシ設定を取得できます。
もし希望があれば、 📘「WPAD(自動プロキシ設定)の導入方法」 📘「透過型プロキシ構築(iptables込み)」 のどちらかを次に詳しく説明できます。
どちらを詳しく知りたいですか?
あなた:
Squid を使ったプロキシサーバでセキュリティ関連機能を詳しく教えて
ChatGPT:
とても良いテーマです。 Squid は単なるキャッシュサーバではなく、強力なセキュリティ・フィルタリング・アクセス制御機能 を備えています。 ここでは、企業・工場LAN内での安全運用を前提 として、Squid が持つセキュリティ関連機能を体系的に整理して解説します。
🧱 Squid のセキュリティ機能 概要マップ
区分 主な機能 説明 🔐 アクセス制御 ACL / http_access IP・時間帯・URLなどによる通信制御 👤 認証 Basic / NTLM / LDAP / Kerberos 利用者ごとのID認証・ログ紐付け 🌐 フィルタリング URL / ドメイン / MIMEタイプ 危険サイト・不要通信のブロック 🧾 ログ管理 access.log / cache.log 通信監査・トレース・不正検出 🛡️ HTTPS対応 SSL Bump / CONNECT制御 暗号通信の制御や制限 🚫 帯域制限 delay_pools 通信速度・帯域の制御 🧠 キャッシュ制御 refresh_pattern / no_cache 安全なコンテンツの再利用ポリシー 🧩 統合運用 ufdbGuard / SquidGuard URLリスト連携による危険サイトブロック
🔐 1. アクセス制御(ACL: Access Control List)
Squid のセキュリティの基本です。acl で条件を定義し、http_access で許可/拒否を設定します。
例:社内LANのみ許可
acl localnet src 192.168.123.0/24
http_access allow localnet
http_access deny all
例:時間帯制限(昼間のみ許可)
acl office_hours time MTWHF 08:00-18:00
http_access allow localnet office_hours
http_access deny all
例:特定サイトをブロック
acl badsite dstdomain .example.com
http_access deny badsite
👤 2. 利用者認証(ユーザーごとの通信制御)
2-1. Basic認証(最も簡単)
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm ProxyServer
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
ユーザー登録:
sudo apt install apache2-utils
sudo htpasswd -c /etc/squid/passwd user1
ブラウザ接続時に認証ダイアログが表示されます。
2-2. LDAP / Active Directory 連携
Windows ドメイン環境では LDAP/Kerberos 認証が可能。
auth_param basic program /usr/lib/squid/basic_ldap_auth -b "dc=example,dc=local" -D "cn=admin,dc=example,dc=local" -w password -f "uid=%s" -h ldapserver.local
これにより、ドメインアカウントでプロキシ認証 が可能になります。
🌐 3. URL・ドメイン・コンテンツフィルタリング
3-1. 危険ドメインの遮断
acl blocked_sites dstdomain .adult.com .gambling.com
http_access deny blocked_sites
3-2. 拡張子やMIMEタイプで制御
acl exe_download url_regex -i \.exe$ \.bat$ \.scr$
http_access deny exe_download
3-3. 外部ブラックリスト連携(SquidGuard / ufdbGuard)
ufdbGuard連携例:
url_rewrite_program /usr/bin/ufdbgclient
url_rewrite_children 20 startup=5 idle=2
→ ブラックリストDB(例:Shalla List, UT1 Blacklist)と連携可能。
🧾 4. ログ管理と監査
4-1. 標準ログ
/var/log/squid/access.log ← 通信ログ(誰がどこへいつ)
/var/log/squid/cache.log ← サーバ運用ログ
/var/log/squid/store.log ← キャッシュ関連ログ
4-2. ログ例
173.194.121.32 TCP_MISS/200 1570 GET http://www.google.com/ - HIER_DIRECT/142.250.74.196 text/html
構成要素:IP アクション/コード サイズ メソッド URL ユーザー 転送先 サービス種別
4-3. ログ解析ツール
ツール 特徴 sarg HTMLレポート化、ユーザーごとの閲覧履歴 goaccess リアルタイムWebベース解析 ELK Stack 大規模ログの可視化(Elasticsearch + Kibana)
🛡️ 5. HTTPS / SSL 通信の制御
5-1. HTTPSサイトを完全に禁止
acl SSL_ports port 443
http_access deny CONNECT !SSL_ports
5-2. 特定ドメインのみ許可
acl allowed_https dstdomain .trusted.com
http_access allow CONNECT allowed_https
http_access deny CONNECT all
5-3. SSL Bump(内容解析:高度)
MITM技術を使ってHTTPS内部を監視可能。 ただし、証明書発行・信頼設定 が必要で、企業内でのみ推奨されます。
🚫 6. 帯域制限(delay_pools)
ユーザー・グループ単位で通信速度を制限できます。
例:社内LAN全体を1Mbps制限
delay_pools 1
delay_class 1 2
delay_parameters 1 125000/125000 125000/125000
acl localnet src 192.168.123.0/24
delay_access 1 allow localnet
🧠 7. キャッシュポリシー(安全性とパフォーマンスの両立)
例:更新頻度の低いコンテンツだけキャッシュ
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^http: 30 20% 4320
refresh_pattern -i \.(jpg|png|gif)$ 10080 90% 43200
例:機密サイトはキャッシュしない
acl secure_sites dstdomain .bank.com .login.example.com
cache deny secure_sites
🧩 8. 外部セキュリティ連携
組み合わせ 内容 ClamAV + ICAP ダウンロードファイルのウイルススキャン Fail2Ban 不正アクセス試行IPを自動ブロック iptables連携 IPごとに通信ポリシーを統合制御
🔍 9. 管理上のベストプラクティス
項目 推奨設定 管理者ログイン SSH鍵認証+UFW制限 squid.conf 最小権限で明示的にdeny allから始める ログ保存 logrotateを使って自動ローテーション 定期監査 sargレポートを週次メール送信 バージョン管理 /etc/squid/をGitで管理しておく
✅ まとめ
セキュリティ機能カテゴリ Squid機能 効果 アクセス制御 ACL + http_access 不正アクセス防止 認証 Basic / LDAP / NTLM 利用者特定・監査強化 コンテンツ制御 URL・MIMEフィルタ マルウェア・有害サイト遮断 ログ・監査 access.log, sarg トレーサビリティ確保 帯域制御 delay_pools ネットワーク安定化 HTTPS制御 CONNECT / SSL Bump 暗号通信の制御 外部連携 ufdbGuard / ClamAV 高度な脅威防御
ご希望があれば次のようなテンプレートも作成できます:
📘 「セキュリティ強化版 squid.conf(日本語コメント付き)」 📘 「ウイルススキャン+URLフィルタ連携構成図」 📘 「社内LAN向けセキュリティポリシー(Squid運用ガイド)」
どれを作成しましょうか?
あなた:
📘 「セキュリティ強化版 squid.conf(日本語コメント付き)」 📘 「ウイルススキャン+URLフィルタ連携構成図」 📘 「社内LAN向けセキュリティポリシー(Squid運用ガイド)」 をお願いします
ChatGPT:
Squid セキュリティ強化セット(設定・図・運用ガイド)
📘 セキュリティ強化版 squid.conf(日本語コメント付き)
想定OS: Ubuntu / Linux Mint(Squid 5 以降)。設定ファイル: /etc/squid/squid.conf ※ 実運用前に sudo squid -k parse で構文チェック、sudo systemctl restart squid で反映。
########################################
# ssl_bump terminate all
########## 帯域制御(delay_pools) ##########
# 例:部門単位で1Mbpsシェア
# delay_pools 1
# delay_class 1 2
# delay_parameters 1 125000/125000 125000/125000
# delay_access 1 allow localnet
########## キャッシュポリシー ##########
# 動的/機密っぽいサイトはキャッシュしない
acl nocache_sites dstdomain .login. .bank. .auth. .git .github.com
cache deny nocache_sites
# 基本パターン(静的コンテンツ優先)
refresh_pattern -i \.(jpg|jpeg|png|gif|css|js|woff|woff2)$ 10080 90% 43200
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 30 20% 4320
########## ログ拡張・監査 ##########
# ユーザ名やSNIを含むログ形式(必要に応じて)
logformat vhost %ts.%03tu %6tr %>a %ui %>Hs %<st %rm %ru %Sh/%<A %mt SNI:%ssl::>sni
access_log /var/log/squid/access.log vhost
cache_log /var/log/squid/cache.log
# ログローテーションは /etc/logrotate.d/squid を利用
########## 最終アクセス制御 ##########
# 明示許可のみ通し、その他は拒否(デフォルトDeny)
http_access allow localhost
http_access allow localnet office_hours
# 認証運用時は、上記の allow localnet を認証ACLに置換
http_access deny all
########## 透過型(intercept)を使う場合の補足 ##########
# iptables で 80/tcp を REDIRECT → 3129 に転送
# HTTPS 透過は推奨せず(法務/技術要件が厳しい)
########## ICAP(ウイルススキャン等:任意) ##########
# icap_enable on
# icap_send_client_ip on
# icap_send_username on
# icap_service service_req reqmod_precache icap://127.0.0.1:1344/squidclamav bypass=on
# icap_service service_resp respmod_precache icap://127.0.0.1:1344/squidclamav bypass=on
# adaptation_access service_req allow all
# adaptation_access service_resp allow all
########################################
# EOF
########################################
🗺️ ウイルススキャン+URLフィルタ連携 構成図
代表例: Squid + (ICAP/c-icap + ClamAV) + ufdbGuard または SquidGuard
flowchart LR
subgraph Clients[社内クライアント群]
C1[PC/Tablet/Server]
end
C1 — HTTP/HTTPS(明示プロキシ) –> SQ[Squid]
subgraph Filters[フィルタ/検査レイヤ]
UF[URL Filter\n(ufdbGuard / SquidGuard)]
ICAP[ICAP Server\n(c-icap + squidclamav/ClamAV)]
end
SQ — URL照会/書換 –> UF
SQ — REQMOD/RESPMOD –> ICAP
ICAP — OK/Block/Virus –> SQ
UF — Allow/Deny/Rewrite –> SQ
SQ — 直接 or 上流Proxy –> NET[(Internet)]
note over SQ,ICAP:
・URLフィルタは「どこへアクセスするか」を審査
・ICAPは「何をダウンロードするか(中身)」を検査
・どちらかでNGならブロック
導入メモ(パッケージ例)
Squid: sudo apt install squid
URLフィルタ(いずれか)
ufdbGuard: sudo apt install ufdbguard(ディストリにより外部リポジトリ)
SquidGuard: sudo apt install squidguard
ICAP + ClamAV
sudo apt install c-icap squidclamav clamav-daemon
ClamAV定義更新: sudo freshclam
各ミドルの conf は最小ポリシーから段階的に厳格化してください。まず 監査モード(ログのみ) → 段階的ブロック が安全です。
🛡️ 社内LAN向けセキュリティポリシー(Squid運用ガイド)
1. 目的と適用範囲
目的: 社内Web通信の安全性・可用性・追跡性を確保する。
対象: 社内LANに接続する全端末(PC/サーバ/VDI)および来訪者用ネットワーク(分離セグメント)。
2. 役割と責任
運用管理者 : ポリシー設定、ログ監査、障害対応、変更管理。
情報セキュリティ責任者 : 例外承認、監査レポート承認、コンプライアンス確認。
各部門長 : 例外申請・業務要件の明確化、教育徹底。
3. 運用モード
原則: 明示プロキシ (ブラウザに 192.168.123.11:3128)。
例外: 端末制御が困難なゲスト向けのみ 透過型 を検討(HTTPSは除外)。
自動設定: WPAD / PAC によるプロキシ自動配布を推奨(DHCP Option 252 / DNS wpad)。
4. アクセス制御ポリシー
デフォルト Deny 、必要な通信を Allow 。
業務時間の通信のみ許可(例: 平日 08:00–18:00)。
来訪者ネットワークは分離VLANで別ポリシー(帯域制限・ログ分離)。
管理インターフェイス(cachemgr 等)は管理端末からのみ。
5. 認証とトレーサビリティ
ドメイン連携(LDAP/Kerberos)または NCSA 認証を使用。
access.log にユーザー名を記録(後述ログ形式例)。
監査レポートは部門別・ユーザー別で月次作成(SARG/GoAccess/ELK)。
6. コンテンツ/URL フィルタリング
外部ブラックリスト(カテゴリDB)を取り込み、段階的に厳格化。
危険拡張子のダウンロード禁止(exe / js / vbs 等)。
業務必要サイトのホワイトリストを運用(例外申請→承認→期限付き)。
7. マルウェア対策(ICAP+ClamAV)
すべてのHTTPレスポンスを RESPMOD によるスキャン対象。
スキャン失敗時は「bypass=on/off」を要件に応じて選択(原則 off)。
定義ファイルは freshclam を1日複数回更新(プロキシ外部帯域に注意)。
8. HTTPS の扱い
原則、CONNECTは443のみ許可、ドメイン制御(ホワイト/ブラック)。
SSL Bump は法務・社内規程・同意の整備後に限定導入。
バンキング/医療/行政サイトは splice(透過) を徹底。
9. ログと監査
access.log は 1 年以上保管(要件に応じて)。
ログローテーション: 日次で圧縮、異常検知(急増・大量ブロック)。
レポート:
週次: トップドメイン/ブロック件数/ウイルス検出件数
月次: 利用上位ユーザー、例外利用、重大インシデント
10. 帯域と可用性
delay_pools で部門別に帯域制御。バックアップ/更新等の時間帯を避ける。
上流回線障害時のフォールバック(上流プロキシ/複数回線)がある場合は cache_peer を活用。
11. 変更管理
変更種別: ルール追加/削除、例外、アップグレード。
手順: ステージング → squid -k parse → 低トラフィック時間に本番適用。
バックアップ: /etc/squid/ を Git で管理・差分レビュー必須。
12. インシデント対応
兆候: ウイルス検出増、特定端末からの大量接続、認証失敗の急増。
初動: 影響範囲の限定(ACLで一時遮断)、ログ保全、関係部門連絡。
再発防止: ルール強化、端末隔離、教育、パッチ適用。
13. 運用チェックリスト
14. 付録:ログ形式と可視化
logformat vhost ...(テンプレ例は上記 squid.conf を参照)
可視化ツール: SARG(ユーザー単位のHTMLレポート)/ GoAccess(リアルタイムダッシュボード)/ ELK(大規模)
次のステップ(実装順のおすすめ)
監査目的で 明示プロキシ + 認証 + ログ拡張 を先に実装
URLフィルタ を「監査モード(ログのみ)」で導入 → ブロックへ移行
ICAP + ClamAV をレスポンス側から適用(大容量例外を精査)
必要があれば WPAD/PAC 配布でクライアント設定を自動化
定常運用:週次レポートとルール棚卸し、例外は期限付き
用意しました! キャンバスに
セキュリティ強化版 squid.conf(日本語コメント入り)
「ウイルススキャン+URLフィルタ」構成図(Mermaid)
社内LAN向けセキュリティ運用ガイド(チェックリスト付き)
をひとまとめに掲載しています。 このまま導入いただけます。環境に合わせた微調整(IP帯、認証方式、ホワイトリスト等)もすぐ反映できますので、変更点が決まっていれば教えてください。
あなた:
webログインのセキュリティについて教えて 1.ログイン→IDとパスワード入力 2,IDとパスワードが登録されていて合致する 3,登録されている携帯電話番号へログインパスワード4桁を送信 4.4桁ログインパスワード確認後(サイトの表示(有効時間15分) 以上のパターンを考えています、PHPでこのパターンは作れますか? 宜しくおねがいします。
ChatGPT:
思考時間: 10s
結論:PHPで実装できます。 ただし「4桁SMSコード」は推測耐性が低いので、6桁以上&短い有効期限(≤5分)&試行回数制限 を強く推奨します。さらに将来的には TOTP(認証アプリ) や WebAuthn/Passkey へ拡張できる設計にしておくのがベストです。
実装の全体像(推奨仕様)
フロー
ID/パスワード入力 → サーバ側で照合(パスワードは password_hash() でハッシュ)
合致したら、SMSでワンタイムコード(6桁)を発行・送信(有効5分)
ユーザーがコード入力 → 照合OKなら session_regenerate_id(true) し、本ログイン成立
セッションのアイドルタイムアウト :15分(最後の操作から15分で自動失効)
セキュリティ要点
4桁→6桁へ(random_int() で生成)。
OTPは平文保存しない (password_hash() でハッシュ保管)。
OTPは1回限り (成功/期限切れ/規定回数超過で失効)。
送信回数/検証回数のレート制限 (例:5回/時・3回/コード)。
すべてHTTPS 、Cookieは HttpOnly/Secure/SameSite=Strict。
CSRF対策(ログイン・OTP検証フォームにトークン)。
ログイン成功時はセッション固定化攻撃対策 として session_regenerate_id(true)。
認証関連イベントは監査ログ に記録(成功/失敗、IP/UA/時刻)。
データベース例(MySQL/MariaDB)
-- ユーザー
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
phone_e164 VARCHAR(20) NOT NULL, -- +8190... のE.164形式で保存
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- OTP(SMSコード)
CREATE TABLE user_otps (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
otp_hash VARCHAR(255) NOT NULL, -- password_hash()でハッシュ化
expires_at DATETIME NOT NULL, -- 例:作成から5分
attempt_count INT NOT NULL DEFAULT 0, -- 入力ミス回数
max_attempts INT NOT NULL DEFAULT 3,
used_at DATETIME DEFAULT NULL, -- 成功時にタイムスタンプ
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX (user_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- ログイン試行(レート制限用)
CREATE TABLE login_attempts (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) NOT NULL,
ip VARBINARY(16),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
主要PHPコード例(PDO / セキュア実装の骨格)
ここではSMS送信は send_sms($phone, $text) のダミー関数で表現しています。実運用は Twilio / AWS SNS などのSDKに置き換えてください。
1) パスワード認証(login.php)
<?php
session_start();
require 'db.php'; // PDO $pdo
// CSRFチェック(省略可:実装推奨)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$pass = $_POST['password'] ?? '';
// レート制限(例:同一IP/メールに対して5分間にN回など)
rate_limit_check($pdo, $email);
$stmt = $pdo->prepare('SELECT id, password_hash, phone_e164, is_active FROM users WHERE email = ?');
$stmt->execute([$email]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user || !$user['is_active'] || !password_verify($pass, $user['password_hash'])) {
record_login_attempt($pdo, $email);
// エラーメッセージはぼかす
exit('ログイン情報が正しくありません');
}
// OTP生成(6桁推奨)
$otp = str_pad((string)random_int(0, 999999), 6, '0', STR_PAD_LEFT);
$otpHash = password_hash($otp, PASSWORD_DEFAULT);
$pdo->beginTransaction();
$pdo->prepare('DELETE FROM user_otps WHERE user_id = ? AND used_at IS NULL')->execute([$user['id']]);
$pdo->prepare('INSERT INTO user_otps (user_id, otp_hash, expires_at) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 5 MINUTE))')
->execute([$user['id'], $otpHash]);
$pdo->commit();
// SMS送信(実運用はプロバイダSDKで)
send_sms($user['phone_e164'], "Your login code: {$otp} (valid 5 min)");
// 次フェーズ用にuser_idだけ保持(パスは保持しない)
$_SESSION['pending_user_id'] = $user['id'];
$_SESSION['otp_csrf'] = bin2hex(random_bytes(16));
header('Location: /otp_verify.php');
exit;
}
2) OTP検証(otp_verify.php)
<?php
session_start();
require 'db.php';
if (!isset($_SESSION['pending_user_id'])) {
exit('セッションが無効です。最初からやり直してください。');
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['otp_csrf'], $_POST['csrf'] ?? '')) {
exit('不正なリクエストです');
}
$code = preg_replace('/\\D/', '', $_POST['otp'] ?? ''); // 数字のみ
$stmt = $pdo->prepare('SELECT * FROM user_otps WHERE user_id = ? AND used_at IS NULL ORDER BY id DESC LIMIT 1');
$stmt->execute([$_SESSION['pending_user_id']]);
$otpRow = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$otpRow) exit('コードが無効です。再ログインしてください。');
if (strtotime($otpRow['expires_at']) < time()) exit('コードの有効期限が切れています。');
if ($otpRow['attempt_count'] >= $otpRow['max_attempts']) exit('試行回数の上限に達しました。');
// 検証
if (!password_verify($code, $otpRow['otp_hash'])) {
$pdo->prepare('UPDATE user_otps SET attempt_count = attempt_count + 1 WHERE id = ?')->execute([$otpRow['id']]);
exit('コードが違います。');
}
// 成功:使い捨て化 & 本ログインへ
$pdo->beginTransaction();
$pdo->prepare('UPDATE user_otps SET used_at = NOW() WHERE id = ?')->execute([$otpRow['id']]);
$pdo->commit();
// 本ログイン確立:セッション再生成
session_regenerate_id(true);
$_SESSION['user_id'] = $_SESSION['pending_user_id'];
unset($_SESSION['pending_user_id'], $_SESSION['otp_csrf']);
// アイドルタイムアウト用の最終アクティブ時刻
$_SESSION['last_activity'] = time(); // これで15分管理
header('Location: /app/index.php');
exit;
}
3) セッションの15分アイドルタイムアウト(共通ヘッダなどで)
<?php
session_start();
$IDLE_LIMIT = 15 * 60; // 15分
if (!isset($_SESSION['user_id'])) {
header('Location: /login.php'); exit;
}
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $IDLE_LIMIT)) {
session_unset();
session_destroy();
header('Location: /login.php?timeout=1'); exit;
}
$_SESSION['last_activity'] = time();
4) セッションCookieのセキュア設定(php.ini またはブートストラップ)
session.cookie_httponly = 1
session.cookie_secure = 1 ; *HTTPSのみ
session.cookie_samesite = Strict
session.use_strict_mode = 1
session.use_only_cookies = 1
SMS送信について
実運用 は Twilio / AWS SNS / NTT等のSMSゲートウェイを利用。
例:Twilio なら PHP SDK で messages->create($phone, [...]) の1行で送信可能。
送信ログ・到達失敗時の再送導線を用意(ただし再送回数もレート制限 )。
追加の強化ポイント
4桁→6桁以上 、有効5分 、最大3回 、IP単位の試行制限 。
バックアップコード (10個発行・1回使い捨て)。
デバイス認証/信頼済み端末 (クッキーにサイン+端末指紋、要プライバシー配慮)。
**TOTP(Google Authenticator等)**に対応し、SMSは控えめに(SIMスワップリスク)。
WebAuthn/Passkey (将来拡張可能なテーブル設計に)。
まとめ
ご提示の「ID/PW → SMSコード → 15分有効」の流れは PHPで十分実現可能 。
ただし4桁は避けて6桁以上 、平文でOTP保存しない 、レート制限/監査/CSRF/HTTPS/セッション再生成 を必ず実装してください。
将来の拡張として TOTP / WebAuthn を見据えた構成をおすすめします。
必要なら、Twilio(SMS送信)込みの動く最小サンプル や、TOTP/Passkey併用の設計図 まで一気に仕上げます。どちらから行きますか?
あなた:
参考までに教えてください。 現在、事務所と現場が一体のネットワークで結ばれています。 それを事務所側と現場側の2つのネットワークに分けて運用。 (事務所がダウンしても工場の生産を止めない為) 事務所と現場はプロキシサーバを使いセキュリティを上げようと考えています。 このパターンの場合、他によい構築運用方法があれば教えてください。 宜しくおねがいします。
ChatGPT:
思考時間: 9s
いい設計方針です。 「事務所(IT)と現場(OT)を物理/論理で分離し、プロキシで出口を統制」は王道。さらに“止めない工場・守るネットワーク”に寄せるなら、下記の構成が実践的で効果が高いです。
推奨アーキテクチャ(要点)
レイヤ分離(IT/OT/DMZ の3層)
OT LAN(現場) :生産設備、PLC、検査装置、産業PC。
IT LAN(事務所) :業務PC、サーバ、プリンタ等。
DMZ :プロキシ、更新ミラー、履歴DB/ヒストリアン、VPN集中、リバース/ロードバランサ。 → 直接のIT⇔OT通信用途は原則禁止 、必要最小のフローのみDMZ経由。
L3スイッチ+VLAN/ACL
VLANを「部門/機能」単位(例:OT-PLC、OT-検査PC、IT-業務PC、IT-サーバ)で分割。
L3コアでルーティング+ACL(デフォルト拒否) 。必要通信だけピンホール。
二重化・冗長
プロキシ×2台(事務所側/現場側それぞれ) +**VRRP(keepalived)**で仮想IPを提供。
ファイアウォール冗長(HA) 、回線冗長(ISP1/ISP2 or 5G/LTEバックアップ) 。
監視(Zabbix/Prometheus)で経路&サービス死活、フェイルオーバー即検知。
出口統制と名前解決
事務所側は**明示プロキシ(WPAD/PAC配布)**でWeb制御。
現場側は許容最小限のみ (ライセンス認証、時刻同期、アップデート鏡像)をホワイトリスト。
内部DNS でDNSフィルタ (悪性ドメインシンクホール)、DoH/DoTの直行はブロック。
更新は“内側で完結”
APT/YUM/WSUS/コンテナレジストリ をDMZにミラー配置。
OT端末はミラーのみ に出られるようACL。外部直は不可。
これで事務所障害時も工場更新/稼働へ影響最小化。
リモート保守“だけ”の安全化
ベンダ/保守用はVPN集中(DMZ)+MFA +時間制限(Just-In-Time) +踏み台(Jump Server) 。
OTへは**一方向連携(必要ならデータダイオード相当のロジック)**を検討。
操作は録画/記録 、監査ログはSIEMへ。
ゼロトラスト要素の取り込み
802.1X or MABでポート単位NAC 、未認証は隔離VLAN。
エンドポイント健全性(EDR/AV、パッチ、暗号化)を接続要件に。
端末ごと**最小権限(SGT/ポリシーベース)**で横展開を抑止。
可観測性と証跡
プロキシ/ファイアウォール/DNS/EDR のログを集中保管(ELK/Opensearch+S3系) 、1年以上保持。
週次ダッシュボード:ブロック上位、OTの外向き通信、失敗ログ、帯域上位。
参考トポロジ(概念図)
flowchart LR
subgraph ISP[Internet (ISP1/ISP2)]
end
FWHA[FW Cluster (HA)]
PROXY_IT[Proxy Pair (IT側)]
PROXY_OT[Proxy Pair (OT側)]
DNS[DNS Filter]
UPD[Update Mirrors (APT/WSUS/Registry)]
HIST[Hist/BI/Message Broker (OPC UA/MQTT)]
VPN[Vpn Concentrator (MFA)]
LB[Reverse/Load Balancer]
ISP --- FWHA
subgraph DMZ
FWHA --- LB
FWHA --- PROXY_IT
FWHA --- DNS
FWHA --- UPD
FWHA --- HIST
FWHA --- VPN
end
subgraph IT_LAN[IT LAN]
ITPC[Office PCs]
ITSERV[Business Servers]
end
subgraph OT_LAN[OT / Factory LAN]
PLC[PLCs/Equipments]
QC[Inspection PCs]
EDGE[Edge PCs/IPC]
end
PROXY_IT --- ITPC
PROXY_OT --- EDGE
LB --- ITSERV
HIST --- IT_LAN
HIST --- OT_LAN
%% 論理通信の最小化
IT_LAN -. ACL/Least Privilege .- DMZ
OT_LAN -. Strict ACL/Whitelist .- DMZ
具体施策(すぐ効く実装手順)
A. セグメンテーション
例)
VLAN10=IT-PC、VLAN20=IT-SRV、VLAN110=OT-PLC、VLAN120=OT-QC、VLAN130=OT-EDGE
L3コアで deny any をデフォ、IT⇔OTはDMZの特定サービス のみ許可。
B. プロキシ運用(Squid)
IT側 :明示プロキシ+認証、URLカテゴリフィルタ、ICAP+ClamAV、レポート(SARG/GoAccess)。
OT側 :原則外出禁止。例外は
ライセンス/時刻/更新→DMZミラー宛のみ ホワイトリスト。
HTTPのみプロキシ経由、HTTPSはドメイン単位で最小許可。
可用性 :keepalived でVIP付与(例:IT 192.168.10.11/12→VIP .10、OT 192.168.110.11/12→VIP .10)。
(keepalived例・IT側)
vrrp_instance VI_10 {
state BACKUP
interface eth0
virtual_router_id 10
priority 100 # 片方は 90
advert_int 1
authentication { auth_type PASS auth_pass xxxxx }
virtual_ipaddress { 192.168.10.10/24 dev eth0 }
track_script { chk_squid }
}
vrrp_script chk_squid { script "pidof squid" interval 2 fall 3 rise 2 }
C. DNSフィルタ
上位はDNSセキュリティ(RPZ/脅威フィード)かクラウドDNSフィルタ。
端末の外向き53/853/DoHはブロック、内部DNSのみ許可 。
D. 更新ミラー
DMZに APT/YUM/WSUS/Container Registry(Harbor等)を配置。
OT端末はこのミラーFQDN/IPだけ 許可。外部のパッケージサイト直行は禁止。
E. リモート保守
DMZにVPN集中 (MFA必須)。
接続先は踏み台→ジャンプサーバ→対象セグメントの特定ホスト/特定ポートのみ 。
時間制限アカウント、録画/コマンド監査、持込ファイルスキャン 。
F. 運用・監査
週次:ブロック上位、異常トラフィック、OTの外向き試行をレビュー。
月次:例外ホワイトリスト棚卸し(期限切れ削除)、パッチ適用率、バックアップ検証。
ログは改ざん困難なストレージへ転送(WORM相当/オブジェクトロック)。
G. 可用性・BCP
UPS+自動シャットダウン 、NTPは内部時刻サーバ冗長 。
工場継続用に回線デュアル (固定回線+セルラー)と経路優先度 。
事務所ダウン時でもOTは内部NTP/ミラー/履歴DB で自律運転可能に。
事務所ダウン時に “止めない” キモ
OT側は外部依存ゼロ志向 :時刻・更新・ライセンス・履歴は内製/DMZ で完結。
OT→ITへのデータは**キューイング(MQTT/一時保存)**で、復旧後に自動反映。
OTのDNS解決・監視・ログ保全もOT内サブシステム で継続。
まとめ(推奨パターン)
IT/OT/DMZの3層 +プロキシ×二重化 +DNS/更新の内製化 +最小権限ACL 。
リモート保守はDMZで完結 +MFA/録画/時間制限。
ログ集中+定期棚卸し で“動かしながら強くする”。
必要なら、あなたのIPレンジ・機器(L3SW/FW/プロキシ)の型番に合わせて**具体的ACL例・ポリシーシート・移行計画(段階切替手順)**まで落とし込みます。 まずは現状のセグメント(サブネットと機器)を教えていただければ、そのまま貼って使える設定案 を作ります。
あなた:
参考までに教えてください。 ランサムウエア対策にフェイクサーバがあると効きました。 詳細わかれば教えてください。また構築方法があれば教えてください。
ChatGPT:
良い着眼点です — **フェイクサーバ(ハニーポット/デception)はランサムウェア対策において非常に有効です。攻撃者(あるいはワーム/クリプトマルウェア)はネットワーク上の“価値ありそうな”資産を探索します。そこに 本物そっくりの犠牲者(しかし実際は監視用の罠)**を置くと、攻撃の“先読み”や早期検知、感染源特定、IOC(Indicator of Compromise)収集につながります。
以下、概念 → 具体パターン → 構築手順(実用的) → 運用/対応手順 → 注意点、という流れでまとめます。最後に、Samba(SMB)フェイクサーバ を使った現実的な作り方の“すぐ使える”例を載せます。
1) フェイクサーバ(deception)の効果 — なぜ効くか
攻撃者はファイル共有、バックアップサーバ、ドメインコントローラなどを探索対象にする。
攻撃者がフェイクサーバへ接触すると 正規トラフィックとは別にアラートを出せる → 早期検知が可能。
ハイ/ロー相互作用の選択で、詳細なマルウェアサンプルや振る舞いを収集できる(フォレンジックに有益)。
本番資産と分離しているため、アラートがはっきり出やすい(ノイズが少ない)。
2) 代表的なフェイク(ハニーポット)パターン
低相互(Low-interaction) :仕込みファイルや偽ポートだけ応答。軽量・安全。例:Canarytokens、OpenCanary。
良い点:導入が速い、運用負荷小。
欠点:深い分析は不可。
高相互(High-interaction) :本物OSに近い動作を再現し、攻撃者を長く留める。例:HoneyDrive、Dionaea+Cowrie+ELK。
良い点:マルウェア捕獲・解析が可能。
欠点:管理コストとリスク(攻撃者に足場を与える可能性)。
専用の“罠” :
ファイル型トークン(canaryfile) :開くと通知。
サービス偽装(SMB/FTP/SSH/HTTPなど) :接続を検知。
偽ドメインコントローラ / 偽バックアップサーバ :攻撃者の優先ターゲットを模倣。
3) どこに置くか(配置方針)
ネットワークセグメントごとに1台以上 配置:事務所側(IT)と現場側(OT)それぞれに置く。
OT は外部依存を少なくするが、OTセグメント内の不審通信検知用に「OT側フェイク」を置くのが有効。
フェイクは本番から論理的/物理的に分離 し、ログ送信先(SIEM)などへは安全な送信路を用意。
フェイクは「見つかりやすいが捕食されにくい」名前付け(例:\BACKUP1、\FILESERV_VIDEO)で配置。
4) 検知→自動阻止の流れ(理想)
攻撃者がフェイクサーバのファイルへアクセス or サービスへ接続。
フェイクサーバが即座にアラート(Webhook / SIEM / Slack / mail)を送信。
SIEM/監視がトリガーして自動化スクリプト実行:
攻撃元IPをFW/スイッチで一時ブロック、
関連端末のネットワークポートを切断(NAC)、
関連ホストのスナップショット作成(仮想環境)、
SOCにチケット作成。
フェイクサーバのログ/収集物を解析しIOCを生成して全社に配布。
5) 実用的な構築パターン(推奨)
優先度の高い順に:
A. Canarytoken / Canary (低相互)
ファイル(Office/PDF)、URL、DNS、SMTP、S3オブジェクト トークンを配置。
誰かが開く/アクセスすると通知。導入速く効果は高い。
B. OpenCanary(低相互)
SMB、HTTP、FTP、SMTP、SSH など偽サービスを擬似実装してアラート。
軽量で複数のプロトコルを同時に監視可能。
C. Sambaベースの“偽ファイルサーバ” + inotify(簡易だが効果的)
Windowsクライアントが良くアクセスする共有名で偽サーバを作り、共有内に“高価値”ファイル(canaryファイル)を置く。
アクセス(open/read/createtemp)を監視してアラート。
D. 高相互ハニーネット(Dionaea / Cowrie / Malware sandbox)
マルウェア捕獲やC2通信解析が目的。セキュリティチーム or 研究用途向け。
現場(OT)ではCのSamba偽サーバ +Canarytokens が導入のコストと効果のバランスが良いです。
6) リスクと注意点
攻撃者に踏み台にされるリスク(高相互) :外向き通信は最小限に制限し、サンドボックス化する。
プライバシー・法務 :実在する人の個人情報模倣は避ける。ログ保存・通報は社内規程に従う。
誤検知(ノイズ) :実際のユーザーが誤って触る可能性 → 命名や運用周知で対策。
メンテナンス :フェイクもアップデートとログ管理が必要。放置は危険。
7) 具体構築例:Samba(SMB)フェイクサーバ + inotify で即アラート
下は「すぐ導入でき、OT/IT両方で使える」実用例。低相互で安全、かつランサム攻撃(SMB探索→感染)を早期検出できます。
概要
OS: Ubuntu Server(軽量VMで可)
サービス: SambaでWindows共有を作成
監視: inotify-tools の inotifywait で共有内のopen/createを検出 → webhook(Slack/SIEM)へ通知
追加: canaryファイル(例: Payroll_Q4.xlsx.canary)を複数置く
ステップ(大まか)
1) VM準備(Ubuntu 22.04等)
sudo apt update
sudo apt install -y samba inotify-tools curl
2) 共有ディレクトリ作成
sudo mkdir -p /srv/honeypot/share
sudo chown nobody:nogroup /srv/honeypot/share
sudo chmod 0777 /srv/honeypot/share # 誰でもアクセスできるように(フェイク)
※ 実運用では 0777 は“見せかけ”として有効。ただしセキュリティ上の考慮でネットワークACLでアクセス元を制限する(監視対象ネットワークのみ許可等)。
3) Samba 設定(/etc/samba/smb.conf へ追記)
[global]
server string = Honey-SMB
map to guest = Bad User
guest account = nobody
log level = 1
[HR_BACKUP]
path = /srv/honeypot/share
browsable = yes
writable = yes
guest ok = yes
create mask = 0777
directory mask = 0777
再起動:
sudo systemctl restart smbd
4) カナリーファイル配置(本物らしく見せる)
cd /srv/honeypot/share
sudo touch "Payroll_Q4.xlsx.canary"
sudo touch "Backup_DB_2025-09-01.bak.canary"
sudo chmod 666 *.canary
# optional: write some dummy content
echo "CONFIDENTIAL - DO NOT OPEN" > Payroll_Q4.xlsx.canary
ファイル名や中身は現場で本物らしく見えるものを選ぶ(バックアップ名、契約書、設定ファイル名等)。
5) 監視スクリプト(inotifywait を使う:例 /usr/local/bin/honeywatch.sh)
#!/bin/bash
WATCH_DIR="/srv/honeypot/share"
WEBHOOK_URL="https://hooks.example.com/services/XXXXX/XXXXX" # Slack/自社Webhook/SIEMの受信エンドポイント
inotifywait -m -e open -e create --format '%e %w%f %T %:e' --timefmt '%Y-%m-%d %H:%M:%S' "$WATCH_DIR" | while read event file time ev; do
source_ip=$(ss -tnp | grep smbd | awk '{print $5}' | head -n1) # 簡易的: 実環境では接続ログ解析 or smbstatus を使う
message="HONEY-ALERT: ${event} on ${file} at ${time} from ${source_ip}"
echo "$(date '+%Y-%m-%d %H:%M:%S') ${message}" | sudo tee -a /var/log/honeywatch.log
# 例: Slack webhook
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"${message}\"}" $WEBHOOK_URL
# さらに:IPをFWにブロックするAPIコールやSIEMへ送信など自動化
done
実行権限を付けて systemd サービス化しておく:
sudo chmod +x /usr/local/bin/honeywatch.sh
# systemd unit の作成は任意(推奨)
注意:ss -tnp の方法は厳密ではないため、接続元IPはSambaログ(/var/log/samba/log.smbdやsmbstatus)を解析して正確に取得する方法を検討してください。
6) ログ連携
/var/log/honeywatch.log -> Filebeat/Fluentd -> SIEM (Elastic/Graylog/QRadar)
Slack / MS Teams / PagerDuty に直通通知も用意
7) 自動阻止例(オプション)
Webhook 受信側(SIEM または自動化サーバ)で次のアクションを実行:
該当IPをFWブラックリストに追加(REST API or SSHでACL反映)
スイッチのポートを隔離(NAC:RADIUS/API)
該当端末のVMスナップショット作成(仮想環境がある場合)
SOC にチケット & 通知
8) 高度な拡張(ステップアップ)
Canarytokens :ファイル中に埋め込むトークンや短URLを使うと、ファイルが開かれた瞬間に外部のCanaryサービスが通知してくれる(設定が速い)。
OpenCanary :opencanary を使って SMB/FTP/HTTP/SSH の偽サービスを同時に立てられる。アラートを syslog/Elastic/Slack に投げられる。
Dionaea / Cuckoo / VMWare sandbox :マルウェアの収集・解析まで行う場合。高相互で導入は慎重に。
偽ドメインコントローラ :DCを模したサーバやLDAPを置くのは効果大だが、実装と法務の検討が必要(本物の認証情報を受けたりするとリスクあり)。
9) 運用・対応プレイブック(検出時の標準手順)
即時 :フェイクアラート受信 → 自動で該当IPを隔離(短時間ルール)
収集 :フェイクサーバのログ、接続ソースのNetflow、エンドポイントのEDRログを収集
隔離 :当該端末はネットワークから隔離/スイッチポートシャットダウン
スナップショット :VMであれば即スナップショットを取得(証拠保全)
解析 :SOC/IRでマルウェアサンプル、TTPを分析(IOC作成)
展開 :作成IOCをFW/DNS/EDR/プロキシへ投入(ブロック)
復旧 :必要に応じて再イメージ・パッチ・パスワードローテーション
報告 :影響範囲・被害有無の報告、再発防止策の実施
10) 運用上のベストプラクティス / ポイント
フェイク名は本物らしく (例:\\BACKUP-HQ、\\FINANCE-BACKUP)だが、正式手順でスタッフに知られないように する。
フェイクは必ずログ転送 (SIEM)して即時照合。
OT側はアクセス可能なホストを限定 し、ハニーポットへのアクセスは外部からも監視可能にする。
監視アラートは自動阻止+手動確認 の二段構えが理想。
定期的にフェイクの内容を更新 (ファイル名やメタデータ)して、攻撃者に見切られないようにする。
11) 法務・倫理面
フェイクの運用は社内承認を取り、ログの保管期間や通報フロー(個人情報が絡む場合)を明確に。
高相互ハニーポットは攻撃者を長期間止める可能性があり、外部攻撃の踏み台にならないよう通信制限 を必ず行うこと。
まとめ(推奨スタート)
まずは Canarytokens(ファイル+URL) と Sambaフェイク(上の例) をそれぞれ IT と OT の両側に1台ずつ 設置。
ログは即SIEMへ送り、自動ブロックの簡単なルール を入れて効果を検証。
成果が出れば OpenCanary の導入や高相互分析へ拡張する。
もし良ければ、次のどれを詳しく作ります:
上記の Samba フェイク を systemd サービス化して Slack/SIEM に送る完全手順(具体スクリプト付き)
OpenCanary の導入手順 (設定ファイル例・SIEM連携)
Canarytokens の使い方 & 実践テンプレート (どのファイルにどのトークンを置くか具体案)
SOC向けの 自動ブロックPlaybook (FW/スイッチの具体APIコマンド例)
どれを希望しますか?必要ならそのまま手順化して作成します。