WEB制作大量の迷惑メールの実的対策について

大量の迷惑メールの実的対策について

まず、インフラを使ったセキュリティ対策や監視は
いろいろあります。
サーバーに直接インストールしたりクラウドを利用したり…

まずはその代表的なやり方を解説

1. EC2での監視(サーバーに直接導入する方法)

EC2インスタンスに直接監視を導入する場合、一般的な選択肢は以下の通りです。

  • Amazon CloudWatchエージェント
    • CloudWatchエージェントはAmazonの監視サービスであり、EC2のメトリクス(CPU使用率、メモリ、ディスクI/Oなど)を監視できます。
    • 導入方法: CloudWatchエージェントをインストールし、必要なメトリクスやログを収集して、CloudWatchに送信します。/etc/amazon-cloudwatch-agent/config.jsonでメトリクスの設定が可能です。
  • Zabbixエージェント
    • Zabbixはオープンソースの監視ツールで、EC2上にエージェントをインストールして監視を行います。リソース使用量の監視やアラート設定が可能です。
    • 導入方法: EC2にZabbixエージェントをインストールし、Zabbixサーバーと連携して監視を行います。
  • Prometheus + Node Exporter
    • Prometheusはモニタリングおよびアラートツールです。Node Exporterを使用してEC2のシステムメトリクス(CPU、メモリ、ディスクなど)を収集します。
    • 導入方法: Node ExporterをEC2にインストールし、Prometheusサーバーがデータを収集します。

2. Docker環境での監視ツール

EC2内でDockerを利用している場合、コンテナの監視も重要です。以下のツールがよく使われます。

  • Prometheus + cAdvisor
    • cAdvisorはDockerコンテナのリソース使用状況を監視するツールで、Prometheusと組み合わせて使用します。CPU、メモリ、ネットワーク、ストレージなどのメトリクスを収集できます。
    • 導入方法: cAdvisorをDockerコンテナとして実行し、Prometheusで監視を行います。
  • Grafana
    • Grafanaは、Prometheusやその他のデータソースからのデータを可視化するダッシュボードツールです。監視結果をグラフィカルに表示し、アラートも設定できます。
    • 導入方法: Docker上にGrafanaコンテナを立ち上げ、Prometheusや他のデータソースと接続して監視データを表示します。
  • Datadog
    • Datadogは、インフラストラクチャ全体を監視できるSaaS型のサービスで、Dockerコンテナ内のメトリクスやログも追跡可能です。
    • 導入方法: Datadogエージェントをコンテナとしてデプロイし、コンテナ内部のメトリクスをDatadogに送信します。
  • ELKスタック (Elasticsearch, Logstash, Kibana)
    • Dockerコンテナ内のログを収集して可視化・分析できるスタックです。コンテナの稼働状況やエラーログの監視に有用です。
    • 導入方法: DockerでElasticsearchLogstashKibanaをセットアップし、ログデータを集約します。

3. CloudFront (CF) と ELB (Elastic Load Balancer) のセキュリティ対策

CloudFrontのセキュリティ機能

CloudFront(CDN)は、セキュリティを強化しつつ、パフォーマンスを向上させることができます。

  • DDoS対策
    • CloudFrontはAWS Shieldと統合されており、標準でDDoS攻撃を防御します。攻撃をCloudFrontのエッジロケーションで遮断し、オリジンサーバー(EC2など)への負荷を減らします。
  • WAF (Web Application Firewall)
    • CloudFrontにWAFを設定することで、SQLインジェクションやXSS攻撃など、アプリケーションレベルの攻撃を防御します。
    • WAFルールを使用して、特定のIPアドレスやパスに対するアクセス制御を細かく設定可能です。
  • SSL/TLS 暗号化
    • CloudFrontを介してHTTPS通信を強制し、SSL/TLS証明書を設定して、暗号化された通信を実現します。
    • 証明書はACM(AWS Certificate Manager)を利用して簡単に管理できます。
  • キャッシュポリシーの制御
    • キャッシュによるレスポンス高速化の他、セキュリティ向上のためにキャッシュするオブジェクトや条件を細かく設定できます。たとえば、認証が必要なコンテンツにはキャッシュを適用しないように設定できます。

ELBのセキュリティ機能

ELB(Elastic Load Balancer)は、複数のEC2インスタンスへのトラフィックを負荷分散し、可用性とセキュリティを向上させます。

  • SSL/TLS 終端
    • ELBでSSL/TLS終端を行い、暗号化された通信を処理します。これにより、サーバー側での負荷を軽減し、セキュリティを確保します。
    • CloudFrontと同様に、ACMを利用して証明書を簡単に管理できます。
  • セキュリティグループとACL (アクセスコントロールリスト)
    • ELBには、セキュリティグループを設定して、どのIPアドレスやポートからのアクセスを許可するかを制御できます。また、ネットワークACLでVPCレベルでのトラフィック制御も行います。
  • ヘルスチェック
    • ELBは、EC2インスタンスのヘルスチェックを自動的に行い、問題のあるインスタンスへのトラフィックを停止します。これにより、サーバーダウン時のリクエストの無駄を防ぎます。
  • DDoS対策
    • ELBはCloudFrontと同様に、DDoS攻撃に対してAWS Shield Standardを利用して保護されます。

次にELBやCFなどを使ったやり方の場合

リキャプチャを使わずに、大量の決済スパムや問い合わせスパムに対する対策として、コードとインフラの両面でアプローチできます。以下のような方法が考えられます。

1. レートリミット(Rate Limiting)

原理

特定のIPアドレスやユーザーからのリクエスト数を制限し、短時間に大量のリクエストを送信するスパム行為を抑制します。これにより、スパムやボットによる過剰なアクセスを抑えます。

実装方法

  • Laravelの実装例: LaravelにはThrottleRequestsというミドルウェアがあり、特定の時間内に許可されるリクエスト数を制限できます。
Route::middleware('throttle:10,1')->group(function () {
Route::post('/payment', [PaymentController::class, 'process']);
});

上記コードでは、1分間に10回までのリクエストを許可しています。これ以上のリクエストが来た場合、エラーレスポンスを返します。

  • Nginxでのレートリミット: Nginxの設定で、サーバーレベルでリクエストを制限することもできます。
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;

server {
location /payment {
limit_req zone=mylimit;
proxy_pass http://backend_server;
}
}
}

この設定は、1秒あたり1リクエストまで許可し、それ以上は遅延処理を行います。

2. IPアドレスのフィルタリング(IP Filtering)

原理

特定のIPアドレスやIPレンジからのアクセスを拒否することで、スパム行為を行うIPを事前にブロックします。これには、IPホワイトリストやブラックリストの活用も含まれます。

実装方法

  • AWS WAFでのIPブロック: AWS WAFを使い、スパムの可能性が高いIPアドレスや地域のIPをブロックできます。特定のIPレンジや国からのアクセスを制限することが可能です。
  • サーバーレベルでのIPブロック: NginxやApacheで特定のIPアドレスをブロックします。
server {
location /payment {
deny 123.45.67.89; # 特定のIPをブロック
allow all;
}
}

3. Webアプリケーションファイアウォール(WAF)

原理

WAFは、一般的な攻撃パターンやスパムを検知してブロックするフィルタリングシステムです。SQLインジェクションやXSSなどの攻撃からも保護しますが、問い合わせスパムや決済スパムに対しても有効です。

実装方法

  • AWS WAF: WAFを使って、異常なトラフィックを自動的に検出・ブロックします。特定のパターンを持つリクエスト(大量のPOSTリクエストや連続した同一IPからのアクセス)を制限できます。
  • Cloudflare WAF: CloudflareのWAFを使用して、ボットトラフィックやスパムをブロックすることができます。

4. ボット検出のアルゴリズム

原理

ユーザーの行動パターンを分析して、ボットと人間の違いを特定します。たとえば、短時間に同じ動作を繰り返すリクエストはボットと見なされる可能性が高いです。

実装方法

  • タイムベースのフィルタリング: 特定のフォームに対して、ページロードから送信までの時間を計測します。人間の場合、通常は数秒から数十秒がかかるはずですが、ボットは数ミリ秒以内に送信することが多いです。
// フォームロード時のタイムスタンプをセッションに保存
session(['form_load_time' => now()]);

// フォーム送信時にチェック
if (now()->diffInSeconds(session('form_load_time')) < 5) {
return response('Bot detected', 403);
}
  • JavaScriptベースの検出: ボットは通常JavaScriptを実行しないため、JavaScriptが有効かどうかを確認し、無効な場合にはスパムリクエストと見なします。

5. ハニーポット技術

原理

ハニーポットフィールドは、ユーザーには見えないが、ボットには認識できる隠しフィールドをフォームに追加します。ボットはこの隠しフィールドを入力してしまうため、そのようなリクエストはスパムとして判定できます。

実装方法

  • Laravelでの実装例 Bladeテンプレートに隠しフィールドを追加し、これに値が入力された場合、スパムリクエストとして処理します。
<form method="POST" action="/contact">
@csrf
<input type="text" name="hidden_field" style="display:none;">
<!-- 他のフォームフィールド -->
<button type="submit">送信</button>
</form>

コントローラーでこのフィールドをチェックし、値が存在する場合はスパムと判定します。

if ($request->input('hidden_field') !== null) {
return response('Spam detected', 403);
}

6. インフラでのスケーリングと分散(CloudFront, ELB)

原理

大量のスパムリクエストは、サーバーへの負荷を急激に高める可能性があります。そのため、負荷を分散することでサーバーダウンを防ぐことが重要です。

実装方法

  • CloudFrontとWAFの組み合わせ: CloudFrontでキャッシュを使い、動的な決済ページへのアクセスを減らす。さらにWAFで悪意のあるトラフィックを自動的にブロックします。
  • ELB(Elastic Load Balancer): 大量のリクエストが発生した際、ELBを使用して負荷を複数のEC2インスタンスに分散させます。これにより、サーバーが過負荷状態になるのを防ぎます。

ここまでのまとめ

  • コードベースの対策としては、レートリミット、IPフィルタリング、ハニーポット、ボット検出などの手法が有効です。
  • インフラレベルの対策では、CloudFrontやELBを活用して負荷分散を行い、WAFで攻撃やスパムをブロックします。
  • EC2の監視では、CloudWatch、Zabbix、Prometheusを利用して、サーバーのリソースやメトリクスをリアルタイムで監視します。
  • Docker環境の監視には、cAdvisorやDatadogなどのツールを使い、コンテナ内のメトリクスを可視化します。
  • CloudFrontとELBを使うことで、DDoS対策やSSL/TLSの暗号化、WAFによるアプリケーション層の保護など、セキュリティと負荷分散を効果的に実現できます。

これらのツールとサービスを活用することで、Webインフラのセキュリティとパフォーマンスを最大化でき、スパム攻撃に対する効果的な防御とサーバー負荷の軽減が実現できます。

というけど、それでもくるよね?スパム。

これ、有効ですよ↓

function is_span($text) {
    // 本文が英語のみかを判定する正規表現(アルファベットとスペースのみ許可)
    if (!preg_match('/^[A-Za-z0-9\s.,!?]+$/', $text)) {
        return false;
    }

    // 本文にリンクが含まれているかを判定する正規表現(httpまたはhttpsで始まるURL)
    if (preg_match('/https?:\/\/[^\s]+/', $text)) {
        return true;
    }

    return false;
}

// テスト例
$text = "This is an example of an English email with a link: https://example.com";
var_dump(is_span($text));  // trueを返す

全部英語でリンクがあったらもうスパムにします。

このようなわかりにくい例も

完全にスパムです。

QRは読み込んだらアウトです。(絶対に読み込まないように)
送信元がアメックスじゃないですよね。
このようなわかりにくいスパムもあります。
情弱だと読み込んだり返信したりしてしまい
あなたのメールアドレスの「騙されやすい人status」が2になり
さまざまな詐欺がくるようになりますので
ヒューマンエラーも注意しましょう