AWS & GCPで実践するクラウドセキュリティ対策:WAF設定・DDoS防御・アクセス制御の最適化

  • aws
    aws
  • cloudflare
    cloudflare
  • azure
    azure
  • gcp
    gcp
  • nginx
    nginx
2024/04/02に公開

はじめに

クラウド環境のセキュリティ対策は、システムの規模や用途に関わらず欠かせない要素です。適切な防御策を講じないと、DDoS攻撃や不正アクセス、ボットトラフィックによる負荷増大、証明書管理の不備による通信の盗聴など、さまざまなリスクにさらされることになります。

本記事では、AWSやGCPを活用するシステムを対象に、実践的なセキュリティ強化策を解説します。具体的には、WAF(Web Application Firewall)の設定、ボット対策、IPアドレス制限、VPCの適切な設計、DDoS対策、ログ監視、TLS証明書の管理、SSHの保護、IAMポリシーの最適化といった項目を取り上げます。これらの施策を適切に実装することで、クラウド環境のセキュリティレベルを大幅に向上させることができます。

「どこから手を付ければよいかわからない」「最低限のセキュリティ対策を知りたい」という方は、ぜひ本記事を参考にしてください。

Web Application Firewall(WAF)の導入と適切なルール設定

WAF とは?

WAF(Web Application Firewall)は、Web アプリケーションを攻撃から保護するためのファイアウォールです。一般的なファイアウォールと異なり、HTTP/HTTPS レベルでのトラフィックを監視・フィルタリングし、SQL インジェクションやクロスサイトスクリプティング(XSS)などの攻撃を防ぎます。

WAF の主な防御対象は以下のような Web 攻撃です。

  • SQL インジェクション(SQLi):悪意のある SQL 文を Web アプリケーションに送り、データベースを不正操作
  • クロスサイトスクリプティング(XSS):スクリプトを埋め込み、ユーザーの情報を盗む
  • クロスサイトリクエストフォージェリ(CSRF):認証済みのユーザーを悪意のあるリクエストに誘導
  • リモートファイルインクルージョン(RFI):外部の悪意あるスクリプトを読み込ませる
  • ディレクトリトラバーサル:不正なパスを指定し、サーバー内の機密ファイルにアクセス
  • ブルートフォース攻撃:ログインフォームに対する総当たり攻撃
  • DoS/DDoS 攻撃:大量のリクエストを送り、サーバーをダウンさせる

WAF の導入方法

WAF の導入には以下の方法があります。

  1. クラウド型 WAF
    クラウドサービスを経由してトラフィックをフィルタリングする WAF です。

    • メリット:
      • 設定が簡単で導入が容易
      • スケーラビリティが高く、大量のトラフィックを処理可能
      • 定期的なシグネチャ更新が提供されるため、運用負担が少ない
    • デメリット:
      • 特定のカスタムルール適用に制限がある場合がある
      • 依存するクラウド事業者の障害リスク
    • 代表的なクラウド型 WAF:
      • Cloudflare WAF
      • AWS WAF
      • Azure WAF
      • Google Cloud Armor

https://www.cloudflare.com/ja-jp/application-services/products/waf/

https://aws.amazon.com/jp/waf/

https://azure.microsoft.com/ja-jp/products/web-application-firewall

https://cloud.google.com/security/products/armor?hl=ja

クラウド型 WAF は手軽に導入でき、スケーラビリティや運用負荷の低減がメリットです。一方で、アプライアンス型やソフトウェア型は、細かいチューニングが可能で、オンプレミス環境でも利用できます。

  1. ソフトウェア型 WAF
    サーバー上で動作するソフトウェアとして導入する WAF です。

    • メリット:
      • オープンソースのものもあり、導入コストが低い
      • 自社の環境に合わせたカスタマイズが可能
    • デメリット:
      • 運用・チューニングの負担が大きい
      • ハードウェアのスペックに依存するため、大量のトラフィック処理には向かない
    • 代表的なソフトウェア型 WAF:
      • ModSecurity(Apache/Nginx で動作)
      • NAXSI(Nginx 用)

適切なルール設定

WAF の効果を最大限発揮するためには、適切なルール設定が必要です。

シグネチャベースのフィルタリング

既知の攻撃パターン(シグネチャ)に基づいてリクエストをブロックします。

ModSecurity の例(SQL インジェクション防止)

SecRule ARGS "@rx select.*from" "id:'1001',msg:'SQL Injection Attempt',deny,status:403"

このルールでは、リクエストパラメータ(ARGS)に select ... from という SQL クエリが含まれている場合、403 エラーを返します。

IP ホワイトリスト / ブラックリスト

特定の IP アドレスからのアクセスを許可・拒否します。

AWS WAF の IP ブラックリストルール

{
  "IPSetDescriptors": [
    {
      "Type": "IPV4",
      "Value": "192.168.1.100/32"
    }
  ]
}

この設定では、192.168.1.100 からのアクセスをブロックします。

レートリミット(Rate Limit)

大量のリクエストを送る DoS 攻撃を防ぐため、一定時間内のリクエスト数を制限します。

Cloudflare WAF のレートリミット設定

{
  "action": "block",
  "match": {
    "request": {
      "rate_limit": {
        "threshold": 100,
        "period": 60
      }
    }
  }
}

この設定では、60 秒間に 100 件以上のリクエストを送信するクライアントをブロックします。

ロギングとモニタリング

WAF のログを監視し、不審なアクセスを分析することで、適宜ルールを更新します。

AWS WAF の CloudWatch ロギング設定

{
  "LoggingConfiguration": {
    "LogDestinationConfigs": [
      "arn:aws:logs:us-east-1:123456789012:log-group:waf-logs"
    ]
  }
}

この設定により、WAF のログが AWS CloudWatch に保存され、分析可能になります。

ボットトラフィックのフィルタリング(reCAPTCHA / Cloudflare Turnstile)

ボットトラフィックは、スパムや不正アクセスの原因となるため、適切にフィルタリングすることが重要です。特にフォーム送信やログイン認証の場面でボットの影響を受けることが多いため、GoogleのreCAPTCHA や Cloudflare Turnstile などのソリューションが利用されます。

reCAPTCHA v2

画像認証を用いた方式で、ユーザーが「信号機を選択してください」などの質問に答えることでボット判定を行います。

  • 特徴
    • 明示的なユーザー操作(クリック・選択)が必要
    • 「私はロボットではありません」チェックボックスの形式が一般的
    • 誤検知が少ないが、ユーザー負担が大きい
  • 導入手順(Next.js の例)
    • Google reCAPTCHA に登録し、site key と secret key を取得
    • フロントエンドに reCAPTCHA ウィジェットを追加
    • バックエンドで reCAPTCHA の検証を行う

フロントエンド

components/contact.tsx
import { useState } from "react";

export default function ContactForm() {
  const [recaptchaToken, setRecaptchaToken] = useState("");

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    const response = await fetch("/api/verify-recaptcha", {
      method: "POST",
      body: JSON.stringify({ token: recaptchaToken }),
      headers: { "Content-Type": "application/json" },
    });
    const data = await response.json();
    alert(data.success ? "送信成功" : "reCAPTCHA 失敗");
  };

  return (
    <form onSubmit={handleSubmit}>
      <div
        className="g-recaptcha"
        data-sitekey="YOUR_SITE_KEY"
        data-callback={(token: string) => setRecaptchaToken(token)}
      ></div>
      <button type="submit">送信</button>
    </form>
  );
}

バックエンド

app/api//verify-recaptcha.ts
export default async function handler(req, res) {
  const { token } = req.body;
  const secretKey = "YOUR_SECRET_KEY";
  const response = await fetch(
    `https://www.google.com/recaptcha/api/siteverify?secret=${secretKey}&response=${token}`,
    { method: "POST" }
  );
  const data = await response.json();

  if (data.success) {
    res.json({ success: true });
  } else {
    res.status(400).json({ success: false });
  }
}

reCAPTCHA v3

スコアベースの判定を行い、ユーザー操作なし でボットを判別します。

特徴

  • スコア(0.0〜1.0)を用いたボット判定
  • フォーム送信時やログイン時にシームレスに適用可能
  • action を指定して異なる動作に対応可能

フロントエンド

components/contact.tsx
import { useEffect, useState } from "react";

export default function ContactForm() {
  const [recaptchaToken, setRecaptchaToken] = useState("");

  useEffect(() => {
    grecaptcha.ready(async () => {
      const token = await grecaptcha.execute("YOUR_SITE_KEY", { action: "submit" });
      setRecaptchaToken(token);
    });
  }, []);

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    const response = await fetch("/api/verify-recaptcha", {
      method: "POST",
      body: JSON.stringify({ token: recaptchaToken }),
      headers: { "Content-Type": "application/json" },
    });
    const data = await response.json();
    alert(data.success ? "送信成功" : "reCAPTCHA 失敗");
  };

  return (
    <form onSubmit={handleSubmit}>
      <button type="submit">送信</button>
    </form>
  );
}

バックエンド

app/api/verify-recaptcha.ts
export default async function handler(req, res) {
  const { token } = req.body;
  const secretKey = "YOUR_SECRET_KEY";

  // Googleの reCAPTCHA サイト検証 API を呼び出す
  const response = await fetch(
    `https://www.google.com/recaptcha/api/siteverify?secret=${secretKey}&response=${token}`,
    { method: "POST" }
  );

  const data = await response.json();

  if (!data.success) {
    return res.status(400).json({ success: false, message: "reCAPTCHA 検証失敗" });
  }

  const score = data.score; // 取得したスコア
  console.log("reCAPTCHA スコア:", score); // デバッグ用

  // しきい値を設定し、ボットかどうかを判定
  if (score >= 0.5) {
    res.json({ success: true, message: "人間と判断", score });
  } else {
    res.status(403).json({ success: false, message: "ボットの可能性あり", score });
  }
}

Cloudflare Turnstile

components/contact.tsx
import { useState } from "react";

export default function ContactForm() {
  const [turnstileToken, setTurnstileToken] = useState("");

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    const response = await fetch("/api/verify-turnstile", {
      method: "POST",
      body: JSON.stringify({ token: turnstileToken }),
      headers: { "Content-Type": "application/json" },
    });
    const data = await response.json();
    alert(data.success ? "送信成功" : "Turnstile 失敗");
  };

  return (
    <form onSubmit={handleSubmit}>
      <div
        className="cf-turnstile"
        data-sitekey="YOUR_SITE_KEY"
        data-callback={(token: string) => setTurnstileToken(token)}
      ></div>
      <button type="submit">送信</button>
    </form>
  );
}
app/api/verify-turnstile.ts
export default async function handler(req, res) {
  const { token } = req.body;
  const secretKey = "YOUR_SECRET_KEY";

  const response = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ secret: secretKey, response: token }),
  });

  const data = await response.json();

  if (data.success) {
    res.json({ success: true });
  } else {
    res.status(400).json({ success: false });
  }
}

reCAPTCHA vs. Cloudflare Turnstile の比較

reCAPTCHA v2 reCAPTCHA v3 Cloudflare Turnstile
ユーザー操作 必要(画像選択) 不要(スコア判定) 不要
プライバシー Google 依存 Google 依存 Cloudflare 依存(プライバシー優先)
処理速度 遅め 普通 高速
実装の簡単さ 簡単 やや難しい(スコア調整) 簡単

IP アドレス制限(管理画面や管理 API へのアクセス制限)

IP アドレス制限とは、特定の IP アドレス(または範囲)からのみアクセスを許可し、それ以外の IP アドレスからのアクセスを拒否する仕組みです。
主に以下のようなケースで利用されます。

  • 管理画面(例:Web アプリの管理ダッシュボード)
  • 管理 API(例:社内向けの API や外部サービス向けの API)
  • データベース(例:リモートアクセスを制限)
  • クラウドサービス(例:AWS, GCP, Azure などの管理コンソール)

IP アドレス制限を適用することで、許可された IP アドレスからのみシステムにアクセスできるため、不正アクセスのリスクを最小限に抑えることができます。

IP ホワイトリストの設定

IP ホワイトリストを設定することで、許可された IP アドレスからのみアクセスできるようになります。

  • Web アプリの管理画面や API に適用
    • AWS WAF、Cloudflare、Azure WAF などを使用
    • Nginx や Apache の設定で制限
    • VPC(Virtual Private Cloud)のセキュリティグループで制限

例:AWS WAF を使った IP 制限

{
  "IPSet": {
    "Name": "AllowedIPs",
    "Scope": "REGIONAL",
    "Addresses": ["203.0.113.1/32", "198.51.100.2/32"]
  }
}

例:Nginx で IP 制限

location /admin {
    allow 203.0.113.1;
    allow 198.51.100.2;
    deny all;
}

VPN / Zero Trust ソリューションの活用

VPN や Zero Trust ソリューションを利用することで、社内ネットワーク経由のみアクセスを許可する方法もあります。

  • AWS Client VPN
  • OpenVPN
  • WireGuard などを利用

多要素認証(MFA)との併用

MFA を導入することで、さらにセキュリティを強化できます。

  • Google Authenticator(TOTP ベースの MFA)
  • Duo Security(企業向けの MFA ソリューション)
  • Okta MFA(クラウド ID 管理と組み合わせ)

例:AWS IAM の MFA 設定例

{
  "Effect": "Deny",
  "Action": "*",
  "Resource": "*",
  "Condition": {
    "BoolIfExists": {
      "aws:MultiFactorAuthPresent": "false"
    }
  }
}

上記のようなポリシーを IAM ユーザーに適用することで、MFA を有効にしていないユーザーのアクセスを制限できます。

IP アドレス制限のメリットとデメリット

メリット

  • 不正アクセスを防止
  • 特定の拠点やネットワークからのみアクセス可能にできる
  • WAF や VPN を組み合わせることでセキュリティを強化できる

デメリット

  • 許可リストにない IP からはアクセスできないため、リモートワークなどで不便になる
  • IP アドレスが変動する環境では管理が大変(ISP の変更、動的 IP など)
  • 誤って許可リストを設定すると、管理者がログインできなくなる可能性がある

VPC(仮想ネットワーク)の適切な設計とサブネット分離

VPC(Virtual Private Cloud)は、クラウド環境における仮想ネットワークです。適切なネットワーク設計により、セキュリティリスクを最小限に抑えることができます。

パブリックサブネットとプライベートサブネットの分離

  • パブリックサブネット
    • インターネットゲートウェイ(IGW)を介して外部と通信可能
    • 主な用途:ロードバランサー(ALB)、Webサーバー
  • プライベートサブネット
    • インターネットから直接アクセスできない
    • 主な用途:データベース、アプリケーションサーバー
  • NAT ゲートウェイ
    • プライベートサブネットのリソースが外部 API にアクセスするために利用

VPC とサブネットの設計例

サブネット名 CIDR 範囲 役割 ルートテーブル
Public-1 10.0.1.0/24 ロードバランサー, Bastion IGW 経由でインターネット可
Public-2 10.0.2.0/24 ロードバランサー, Bastion IGW 経由でインターネット可
Private-1 10.0.3.0/24 アプリケーションサーバー NAT GW 経由で外部アクセス
Private-2 10.0.4.0/24 データベース 外部アクセス不可

セキュリティグループとネットワーク ACL の適用

セキュリティグループ(SG)

  • ステートフル(戻りの通信を自動許可)
  • サーバーごとに適用
  • 例:
    • Web サーバー: 80, 443 のみ許可
    • DB サーバー: 3306(MySQL)をアプリサーバーのみに許可

ネットワーク ACL(NACL)

  • ステートレス(戻りの通信も明示的に許可が必要)
  • サブネット単位で適用
  • 例:
    • 80, 443 のみ許可(パブリックサブネット)
    • 3306 をアプリサーバーのサブネットからのみ許可

ステートレスとステートフルの比較

機能 ネットワーク ACL(NACL) セキュリティグループ(SG)
ステート ステートレス ステートフル
リクエストの許可 必要 必要
レスポンスの許可 明示的に許可が必要 自動で許可
適用範囲 サブネット単位 インスタンス単位

NAT ゲートウェイの活用

プライベートサブネット内のリソースが外部 API にアクセスするために使用。

  • NAT ゲートウェイは パブリックサブネットに配置
  • プライベートサブネットのリソースは NAT ゲートウェイ経由で外部に通信
  • 外部からの 直接の接続は不可

DDoS 攻撃への対策(AWS Shield / Cloud Armor の導入)

DDoS(分散型サービス拒否)攻撃は、悪意のある攻撃者が大量のリクエストを特定のシステムやネットワークに送りつけ、サービスをダウンさせるサイバー攻撃の一種です。特にクラウド環境では、DDoS 攻撃によるサービス障害を防ぐために、専用のセキュリティ対策を講じることが重要です。AWS や GCP では、以下のような DDoS 保護サービスが提供されています。

AWS Shield

AWS Shield は、AWS が提供するマネージド DDoS 保護サービスで、DDoS 攻撃から AWS リソースを防御します。Standard(無料)と Advanced(有料)の 2 種類があります。

AWS Shield Standard(無料)

  • 基本的な DDoS 保護を提供
  • すべての AWS ユーザーに無料で適用される。
  • レイヤー 3(ネットワーク層)とレイヤー 4(トランスポート層)の攻撃に対して自動防御。
  • AWS のグローバルインフラストラクチャと統合されており、DDoS トラフィックを自動でフィルタリング。

AWS Shield Advanced(有料)

  • 高度な DDoS 保護とサポート
  • AWS WAF や AWS Firewall Manager と統合し、DDoS に特化したカスタムルールの適用が可能。
  • 24/7 の AWS DDoS Response Team(DRT)によるサポート。
  • リアルタイムな攻撃検知と詳細なレポートを提供。
  • DDoS 攻撃による追加の AWS リソース消費に対して 経済的補償(DDoS 保護保険) を適用可能。

AWS Shield のカスタムルールを AWS WAF に適用

AWS Shield は AWS WAF と統合し、カスタムルールを適用できます。

AWS WAFの設定例

{
  "Name": "DDoSProtectionRule",
  "Priority": 1,
  "Action": {
    "Block": {}
  },
  "Statement": {
    "RateBasedStatement": {
      "Limit": 1000,
      "AggregateKeyType": "IP"
    }
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "DDoSRateLimitRule"
  }
}

ポイント

  • RateBasedStatement: 1,000 リクエスト/5分を超えた IP をブロック。
  • VisibilityConfig: ルールに一致したリクエストをログに記録
  • AWS WAF と連携: AWS Shield だけでなく、WAF でより細かい制御を可能にする。

Cloud Armor(Google Cloud)

Cloud Armor は、Google Cloud が提供する DDoS 保護 & Web アプリケーションファイアウォール(WAF) で、Google のグローバルエッジネットワークを活用して DDoS 攻撃を緩和します。

特徴

  • レイヤー 3 / 4(ネットワーク・トランスポート層)とレイヤー 7(アプリケーション層)の DDoS 攻撃を防御。
  • 事前定義ルール(Preconfigured WAF ルール)を使用可能。
  • Google Cloud Load Balancer(GCLB)と統合し、攻撃トラフィックを自動フィルタリング。
  • Adaptive Protection(適応型防御) により、異常なトラフィックパターンを自動検出。

ログ監視と不正アクセス検知の自動化(SIEM ツールの活用)

クラウド環境におけるセキュリティ対策の一環として、ログ監視と不正アクセス検知の自動化は不可欠です。特に、SIEM(Security Information and Event Management)ツールを活用することで、大量のログを効率的に分析し、異常を即座に検知・対応できる仕組みを構築できます。

主な機能

  • ログの統合管理
    クラウドサービスやオンプレミス環境のログを一元管理
  • リアルタイム監視・異常検知
    事前に設定したルールや機械学習を用いて異常を検出
  • インシデント対応の自動化
    検知した脅威に対してアラートを発し、自動で対応策を実施
  • コンプライアンス対応
    規制(GDPR, ISO 27001, PCI-DSS など)に基づいたログの保持・分析

AWS Security Hub

特長:

  • AWS の各種サービス(CloudTrail, GuardDuty, Inspector など)と統合
  • 異常検知とコンプライアンス評価を自動化
  • AWS Organizations と連携し、複数アカウントの監視が可能
    適用例:
  • CloudTrail のログをもとに、不審な API 呼び出しを検知
  • IAM の異常な権限昇格を検出し、自動でアラートを発生

Google Chronicle

特長:

  • 大規模データの超高速分析(Google Cloud のスケーラビリティを活用)
  • Threat Intelligence(脅威インテリジェンス)を標準搭載
  • クエリ言語「YARA-L」を活用したカスタムルール作成が可能
    適用例:
  • GCP Cloud Audit Logs を分析し、異常な権限変更を検出
  • 既知の攻撃パターン(MITRE ATT&CK)と突き合わせて異常を特定

自動化のポイント

  • クラウドログ(AWS CloudTrail, GCP Cloud Audit Logs)を SIEM に送信。
  • 機械学習を活用し、異常トラフィックをリアルタイムで検知。
  • アラートを設定し、検出後すぐに対策が取れる仕組みを構築。

TLS / SSL 証明書の適切な管理(Let's Encrypt の更新自動化)

TLS(Transport Layer Security)/ SSL(Secure Sockets Layer)証明書は、インターネット上でのデータ通信を暗号化し、セキュリティを強化するために不可欠です。特に無料の Let's Encrypt は、多くのサイトで利用されており、適切に管理・更新することが重要です。

Let's Encrypt は 無料の SSL / TLS 証明書を発行 する認証局(CA)であり、以下のようなメリットがあります。

  • 無料で利用可能
  • ACME(Automated Certificate Management Environment)プロトコルを使用し、証明書の自動発行・更新が可能
  • Certbot などのツールで簡単に導入できる
  • 信頼性が高く、多くのブラウザで認識される

Let's Encrypt を用いた証明書の取得

Let's Encrypt の証明書を取得するには、Certbot というツールを使用するのが一般的です。
Certbot は、Let's Encrypt の公式クライアントであり、証明書の発行・更新を自動化できます。

Certbot のインストール

sudo apt update
sudo apt install certbot python3-certbot-nginx

証明書の取得

sudo certbot --nginx -d example.com -d www.example.com

証明書の確認

sudo certbot certificates

証明書の更新自動化

Let's Encrypt の証明書は 90日間 で有効期限が切れるため、定期的に更新が必要です。Certbot を使用することで、自動更新の設定 が可能です。

Certbot の自動更新テスト

sudo certbot renew --dry-run

自動更新の設定

0 2 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
  • cron にジョブを追加します。
  • 毎日 2:00 に更新を試行
  • certbot renew: 証明書の有効期限が 30日以上残っている場合は何もせず終了
  • --post-hook "systemctl reload nginx": 証明書更新後に Nginx をリロードして新しい証明書を適用

クラウドサービスを活用した証明書管理

AWS や GCP では、SSL 証明書の管理を自動化するサービスも提供されています。

  1. AWS Certificate Manager(ACM)
    AWS の ACM を利用すると、ロードバランサー(ALB / ELB)や CloudFront で証明書を自動管理できます。

    • 証明書は 自動更新
    • EC2 や Lambda では 利用できない(ALB / CloudFront 経由のみ)
    • aws acm request-certificate コマンドで証明書をリクエスト可能
  2. GCP Managed SSL Certificates
    GCP の Managed SSL Certificates を利用すると、Google Cloud Load Balancer で証明書の管理ができます。

    • 証明書の取得・更新が 完全自動
    • Cloud Load Balancer にアタッチして利用可能
    • gcloud compute ssl-certificates create コマンドで作成可能

Fail2Ban を利用した SSH アクセスの保護

Fail2Ban は、サーバーのセキュリティを強化するためのツールで、不正なアクセス試行を検出し、特定の IP アドレスを自動的にブロックする機能を提供します。特に、SSH のブルートフォース攻撃を防ぐために広く利用されています。

Fail2Ban の基本機能

  1. 不正アクセスの検出とブロック
    • 指定した回数以上のログイン失敗を検出し、該当 IP を一定時間または永久にブロック。
    • /var/log/auth.log(Ubuntu、Debian)や /var/log/secure(CentOS、RHEL)を監視。
  2. ファイアウォールとの連携
    • iptables や nftables などのファイアウォールと統合し、不正 IP をブロック。
    • firewalld との連携も可能。
  3. 柔軟なルール設定
    • bantime(ブロック時間)、findtime(違反判定時間)、maxretry(最大試行回数)を設定可能。
    • 各サービス(SSH、HTTP、FTP など)ごとにカスタムルールを作成可能。

設定手順

  1. Fail2Ban をインストール

    sudo apt update
    sudo apt install fail2ban -y
    
  2. SSH 用のルールを追加。
    Fail2Ban の設定は /etc/fail2ban/jail.conf にありますが、このファイルは直接編集せず、/etc/fail2ban/jail.local を作成し、カスタマイズを行います。

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    
    [sshd]
    enabled = true
    port = ssh
    filter = sshd
    logpath = /var/log/auth.log 
    maxretry = 5
    findtime = 600
    bantime = 3600
    ignoreip = 192.168.1.0/24  # 信頼する IP を指定
    

設定項目の解説

  • enabled = true:Fail2Ban の SSH 監視を有効化。
  • port = ssh:監視するポート(デフォルトの 22 またはカスタムポート)。
  • filter = sshd:SSH に適用するフィルター(デフォルトで提供される sshd.conf を使用)。
  • logpath:SSH のログファイルのパス(Ubuntu は /var/log/auth.log、CentOS は /var/log/secure)。
  • maxretry = 5:5 回ログイン失敗でブロック。
  • findtime = 600:過去 600 秒(10 分間)の間に maxretry 回の失敗があればブロック。
  • bantime = 3600:1 時間(3600 秒)IP をブロック。
  • ignoreip:指定した IP をブロック対象外にする(信頼できるネットワークを除外)。

追加設定とチューニング

  1. 永久にブロックする
    bantime = -1 にすると、対象 IP を永久にブロックできます。
    bantime = -1
    
  2. Fail2Ban のログを有効化
    Fail2Ban のログを /var/log/fail2ban.log に記録する設定。
    logtarget = /var/log/fail2ban.log
    
  3. メール通知を有効化
    SSH への不正アクセスを検知した際にメール通知を受け取る場合、jail.local に以下を追加。
    destemail = your@email.com
    sender = fail2ban@example.com
    mta = sendmail
    action = %(action_mwl)s
    
    この設定には sendmail のインストールが必要
    sudo apt install sendmail -y  # Ubuntu/Debian
    

クラウド環境での IAM ポリシーの最適化(最小権限の原則)

IAM(Identity and Access Management)の適切な設定は、クラウド環境のセキュリティを維持する上で重要な要素です。特に 最小権限の原則(PoLP: Principle of Least Privilege) を実践することで、不要な権限によるリスクを低減できます。

  • 内部不正の防止: 不必要な権限を持つアカウントが誤って重要リソースを削除したり、不正利用されるリスクを低減。
  • 攻撃の影響範囲を最小化: 侵害されたアカウントの権限が最低限なら、被害範囲も限定される。
  • 監査・コンプライアンスの向上: 企業のセキュリティガイドラインや法規制(ISO 27001, SOC 2, GDPR など)を遵守しやすくなる。

IAM ロールを活用する

❌ 悪い例(IAM ユーザーに直接権限を付与)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

✅ 良い例(IAM ロールを活用) IAM ユーザーではなく、 IAM ロール を利用し、サービス単位でアクセス権を制御します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-secure-bucket",
        "arn:aws:s3:::my-secure-bucket/*"
      ]
    }
  ]
}
  • S3 の指定されたバケットのリスト取得(ListBucket)とファイル取得(GetObject)のみ許可 します。

広範な権限を避け、スコープを狭める

❌ 悪い例(広範な権限を持つ)

{
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": "*"
}
  • このポリシーでは、S3 に関するすべての操作が許可されてしまいます。

✅ 良い例(必要な操作に限定)

{
  "Effect": "Allow",
  "Action": [
    "s3:PutObject",
    "s3:GetObject"
  ],
  "Resource": "arn:aws:s3:::my-secure-bucket/*"
}
  • 特定の操作のみ許可 することで、不要な権限の付与を防げます。

定期的なアクセス権限の見直し

IAM ユーザーやロールの権限は、一度設定するとそのままになりがちです。定期的に 未使用の権限を削除 することが推奨されます。

  • AWS Access Analyzer: IAM ポリシーが最小権限の原則を満たしているかを分析できる。
  • IAM アクセスアドバイザー: 未使用の IAM ポリシーを特定し、削除または制限を推奨。

さいごに

クラウド環境のセキュリティ対策は、一度設定すれば終わりではなく、継続的な監視とメンテナンスが求められます。攻撃手法は日々進化しており、それに対応するためにログ監視やアクセス制御の見直し、WAFルールのチューニング、DDoS対策の強化などを継続的に実施することが重要です。

また、セキュリティ対策の最大の課題は「適切なバランスを取ること」です。過度なアクセス制限をかけると正規ユーザーの利便性が損なわれるため、利便性とセキュリティの最適なバランスを見極めることが求められます。

本記事で紹介した施策を参考にしながら、自社のシステムに最適なセキュリティ戦略を設計し、安全なクラウド運用を実現してください。

Xでシェア
Facebookでシェア
LinkedInでシェア

記事に関するお問い合わせ📝

記事の内容に関するご質問、ご意見などは、下記よりお気軽にお問い合わせください。
ご質問フォームへ

技術支援などお仕事に関するお問い合わせ📄

技術支援やお仕事のご依頼に関するお問い合わせは、下記よりお気軽にお問い合わせください。
お問い合わせフォームへ

関連する技術ブログ

弊社の技術支援サービス

お問い合わせ

経営と現場をつなぐ“共創型”の技術支援。
成果に直結するチーム・技術・プロセスを共に整えます。

お問い合わせ