まず、インフラを使ったセキュリティ対策や監視は
いろいろあります。
サーバーに直接インストールしたりクラウドを利用したり…
まずはその代表的なやり方を解説
EC2インスタンスに直接監視を導入する場合、一般的な選択肢は以下の通りです。
/etc/amazon-cloudwatch-agent/config.json
でメトリクスの設定が可能です。Node Exporter
を使用してEC2のシステムメトリクス(CPU、メモリ、ディスクなど)を収集します。Node Exporter
をEC2にインストールし、Prometheusサーバーがデータを収集します。EC2内でDockerを利用している場合、コンテナの監視も重要です。以下のツールがよく使われます。
cAdvisor
はDockerコンテナのリソース使用状況を監視するツールで、Prometheusと組み合わせて使用します。CPU、メモリ、ネットワーク、ストレージなどのメトリクスを収集できます。cAdvisor
をDockerコンテナとして実行し、Prometheusで監視を行います。Elasticsearch
、Logstash
、Kibana
をセットアップし、ログデータを集約します。CloudFront(CDN)は、セキュリティを強化しつつ、パフォーマンスを向上させることができます。
ELB(Elastic Load Balancer)は、複数のEC2インスタンスへのトラフィックを負荷分散し、可用性とセキュリティを向上させます。
リキャプチャを使わずに、大量の決済スパムや問い合わせスパムに対する対策として、コードとインフラの両面でアプローチできます。以下のような方法が考えられます。
特定のIPアドレスやユーザーからのリクエスト数を制限し、短時間に大量のリクエストを送信するスパム行為を抑制します。これにより、スパムやボットによる過剰なアクセスを抑えます。
ThrottleRequests
というミドルウェアがあり、特定の時間内に許可されるリクエスト数を制限できます。Route::middleware('throttle:10,1')->group(function () {
Route::post('/payment', [PaymentController::class, 'process']);
});
上記コードでは、1分間に10回までのリクエストを許可しています。これ以上のリクエストが来た場合、エラーレスポンスを返します。
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リクエストまで許可し、それ以上は遅延処理を行います。
特定のIPアドレスやIPレンジからのアクセスを拒否することで、スパム行為を行うIPを事前にブロックします。これには、IPホワイトリストやブラックリストの活用も含まれます。
server {
location /payment {
deny 123.45.67.89; # 特定のIPをブロック
allow all;
}
}
WAFは、一般的な攻撃パターンやスパムを検知してブロックするフィルタリングシステムです。SQLインジェクションやXSSなどの攻撃からも保護しますが、問い合わせスパムや決済スパムに対しても有効です。
ユーザーの行動パターンを分析して、ボットと人間の違いを特定します。たとえば、短時間に同じ動作を繰り返すリクエストはボットと見なされる可能性が高いです。
// フォームロード時のタイムスタンプをセッションに保存
session(['form_load_time' => now()]);
// フォーム送信時にチェック
if (now()->diffInSeconds(session('form_load_time')) < 5) {
return response('Bot detected', 403);
}
ハニーポットフィールドは、ユーザーには見えないが、ボットには認識できる隠しフィールドをフォームに追加します。ボットはこの隠しフィールドを入力してしまうため、そのようなリクエストはスパムとして判定できます。
<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);
}
大量のスパムリクエストは、サーバーへの負荷を急激に高める可能性があります。そのため、負荷を分散することでサーバーダウンを防ぐことが重要です。
これらのツールとサービスを活用することで、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になり
さまざまな詐欺がくるようになりますので
ヒューマンエラーも注意しましょう