Cloudflare(以下、CF)のプロキシを使い始めてから1か月以上経ち、無料版の制限があるながらも(試行錯誤して)「簡易WAF」が出来て効果が見えて来たので、現在の まとめ的なものを簡単に※書く。
※例によって、実際には長くなった。
効果
CFのプロキシと簡易WAFにより、サーバへの不正アクセス率が1/7以下(不正アクセス件数は1/20以下)に減少し、セキュリティが向上出来たように思う。以下に、簡易WAF導入前後での不正アクセス数などの変化を示す。
なお、「不正アクセス」とはサーバへのアクセスから、成功したアクセス(例: HTTP 200)と存在しないけど不正ではないもの(例: 期限切れのブログページなど)による失敗を除いたものとする。
- 導入前
- 2023/3, 4月: 不正アクセス数・率(以下同): 14625 (2.2%), 11659 (1.7%): 約1.3万件/月 (約2%)
- 成功アクセス数: 約68万
- 以前の対策(IPアドレスやURLでのフィルタ)の状態。
- 5月: 22053 (7.1%): 約2.2万件/月 (約7%)
- 成功アクセス数: 約28万
- CFや簡易WAFの導入前にサーバ側での対策を強化した。 (→ 悪質なボットのブロック)
- 2023/3, 4月: 不正アクセス数・率(以下同): 14625 (2.2%), 11659 (1.7%): 約1.3万件/月 (約2%)
- 導入後
- 6月: 13246 (7.7%): 約1.3万件 (約8%)
- 成功アクセス数: 約15万
- 6/20頃にCFのプロキシを導入した程度なので、効果は まだ少ない。
- 7月: 980 (0.99%): 約千件/月 (約1%)
- 成功アクセス数: 約10万
- 簡易WAFを実装・調整しつつ(中頃までに概ね出来た)使っている。
- 6月: 13246 (7.7%): 約1.3万件 (約8%)
参考のため、過去1年間のサーバへのアクセス数のグラフを示す。
- 過去1年間のサーバへのアクセス数
- 同、3月以降の拡大
グラフの設定が悪くて分かりにくいものの、拡大図を見ると、右端の7月頃から それまでの1/2くらいに減っていることが分かる。※ それは、上記の簡易WAFなどで不正アクセスが減ったためではないかと考える。
※これは、上の集計の7月の成功アクセスが6月の1/1.5になっているのに対応するだろう。なお、5月頃に大きく減っているのは、別件の効果(サーバの状態取得用データの転送を改良した)と思われる(そのアクセス数は本節の集計には含まれていない)。
考察
- 5月の対策強化で不正アクセス率が3倍以上に増えたのは、それまで見逃していたものを拒否またはエラー(→ 失敗)にしたためと考えられる。なので、それまでは なかなか危なかったようだ・・・
- また、成功アクセス数が1/2以下に減ったのは、悪質なボットや不正なクライアントの「成功してしまった不正アクセス」が減ったためと考えられる。
- 6月末から7月のCFプロキシと簡易WAFの導入で、不正アクセス率は導入前(5月)の約1/7に、不正アクセス数は導入前(同)の約1/20に激減した。
- 成功アクセス数は3, 4月の約1/7、5月の1/2以下となり、成功した不正アクセスは更に減ったと考えられる。
副次的な効果として、不正アクセス数(≒ ログ中のエラー数)が激減したためにログのチェックが容易になった。※ これは結構重要なことだ。まあ、ログのチェックを目視でするのはアナログ・アナクロだが、そういうチェックが必要な・役立つこともあるのではないか。
※例えば、3月のログサイズは約180MBだったが、7月は約30MBと かなり小さくなった。
これに類似することだが、郵便受けに勝手に突っ込まれる大量のチラシはクソボットや不正アクセスと同じように迷惑で、大嫌いだ。「要らなければ捨てればいい。大した手間じゃない」じゃない! 郵便受けのSNR(≒ 中身が正当な率)を低下させる。: 重要なもの(手紙)がチラシに紛れて なくなる可能性があるので、こちらに被害を与えるのだ。
チラシ問題は今は まだ大きな問題になって居ないが、あと数年経ったら世の中の流れ(常識)が変わる気がする(そうなって欲しい)。
少なくとも、「チラシ投函禁止」と明示してある建物で投函するのは、法的には不法侵入だ。
簡易WAFの構成と機能・動作概要
以下のように多段階のチェック・フィルタリングを行っている。
- CF
- CF自体のフィルタ
- 詳細は公開されていないので不明だが、以下があるようだ。
- 悪質なクライアント・ボットなどの排除
- AS番号, IPアドレス, UAなどのチェックをしているのではないか。
- 異常なアクセスの排除
- HTTP要求のチェック をしているのではないか。
- HTTP 400になるものは ここで排除されるようだ。
- HTTP要求のチェック をしているのではないか。
- 悪質なクライアント・ボットなどの排除
- 詳細は公開されていないので不明だが、以下があるようだ。
- 自作簡易WAF
- 極悪クライアント/ボットへの反撃
- 対象: 脆弱性スキャナ(スキャンしてもフィードバックなし= 攻撃), 不正アクセスを繰り返す/行儀の悪いボットなど, 偽のセキュリティ団体
- 動作: 巨大なファイル(あるISOイメージ)にリダイレクトする。
- 以前の挙動から、悪質なボットはリダイレクト先に行かないようなので※(スキャンの高速化のため?)、実際に反撃効果があるかは不明。
- ※あるいは、悪質なボットは上のCF自体のフィルタで既に排除されているのかも知れない。
- 以前の挙動から、悪質なボットはリダイレクト先に行かないようなので※(スキャンの高速化のため?)、実際に反撃効果があるかは不明。
- ポートスキャンの排除
- 対象: 公開していないポート番号でのアクセス
- 動作: ログ(後述、以下同)に記録して拒否する。
- 悪質クライアント, プロバイダ(AS, アドレス範囲), 団体の排除1
- 対象: 不正アクセスを繰り返す/行儀の悪いボットなど, 不正の温床になっている企業・プロバイダ
- 動作: 鬱陶しいので、ログに記録せずにブロックする。
- ログインのハニーポット
- 対象: 不正ログインの試行
- 動作: ハニーポットにリダイレクトし、ログに記録してブロックする。
- URLのブラック(拒否)リスト
- 対象: 明らかに不正なURL(例: "sign-up")へのアクセス
- 動作: ログに記録してブロックする。
- 悪質クライアント, プロバイダ(AS, アドレス範囲), 団体の排除2
- 対象: 不正アクセスを繰り返す/行儀の悪いボットなど, 大嫌いな企業
- 動作: 証拠の記録と参考のため、ログに記録してブロックする。
- クエリー文字列でのチェック
- 対象: 不正そうなクエリー文字列(例: "register")の送信
- 動作: CFのチャレンジ対象にする。
- 正当なアクセスでも対象のクエリー文字列が送信される可能性があるので、ブロックにはしない。
- チャレンジについては良く理解していないが、人間(ブラウザ)に対してはキャプチャが出る(出ない場合もある)が、それ以外は自動で拒否されるようだ。
- URLのホワイト(許可)リストでのチェック
- 対象: ホワイトリスト※にないURL(パスなど)へのアクセス
- ※自動処理(アプリなど)からアクセスされるURLなどをホワイトリストに入れておく。
- 動作: CFのチャレンジ対象にする。
- 対象: ホワイトリスト※にないURL(パスなど)へのアクセス
- レート制限
- 対象: 通常の正常なアクセス頻度を超えたもの(悪質・出来の悪いボットと思われる)
- 動作: しばらくブロックする。
- 無料版の制限のため、ブロックするのは10秒間固定である。
- ※機能・効果は今一つである。 → 少し改善できた。 (8/4 16:59) (実装メモを参照)
- 極悪クライアント/ボットへの反撃
- CF自体のフィルタ
- サーバ: CFでのフィルタリングと重複しているが、単体動作時の最低限のセキュリティ確保のために行っている。
- IPアドレス範囲でのブロック
- User Agentでのブロック
- URLでのブロック
実装などのメモ
- CF自体のフィルタの機能について
- CFからダウンロードした設定(自作の設定ダウンロードプログラム(後述)で取得した)の中に、CFのフィルタらしきものもある。まだ ちゃんと見ていないので詳細は不明だが、そこから機能・動作が分かるかも知れない。
- ログについて
- CFの無料版ではログ(アクセス, 拒否)が見られない※。それだと不正アクセスの内容・状況や効果が分からず、簡易WAFの作成や調整が難しい。そこで、不正アクセスを別サーバ(「ログ用サーバ」, 概要は後述)に転送することで、ログを記録できるようにした。
- ※限定的にイベントログは見られるが、全部ではなさそうだし見られる期間が限定されている。また、APIで取得することはできない。
- 将来、簡易WAFが完成したらログ用サーバは不要になるが、ログが見られるほうが便利ではある。
- CFの無料版ではログ(アクセス, 拒否)が見られない※。それだと不正アクセスの内容・状況や効果が分からず、簡易WAFの作成や調整が難しい。そこで、不正アクセスを別サーバ(「ログ用サーバ」, 概要は後述)に転送することで、ログを記録できるようにした。
- レート制限について
- 無料版で機能が少なくて設定が難しい。: この稿を書いている時にメディア一覧で制限されてしまったため、かなり緩くした。ちゃんとやるならサーバでやったほうが良さそうだ(が、設定が煩雑な気がする)。
- (8/4 16:59) その後 更に調べたら、WAFの別モジュール(Custom rules)でレート制限をスキップできる※ことが分かり、メディア一覧が制限される問題を どうにか回避できた(実際には今一つ いい加減である)。
- ※スキップ対象の条件を設定し、動作("Then take action…")を"Skip"にし、レート制限をスキップするようにする("WAF components to skip"で"All rate limiting rules"にチェック)。
- それで上限を下げて試しているが、画像の多いページを速くスクロールすると引っ掛かるかも知れないので、様子を見ている。
- CFの設定の保存について
- 上を見ると分かるように、CFの設定の種類と量が かなり多い*ため、ダウンロードして手元で保存したくなった※が、管理ページには そういう機能はなく、そういうプログラムも提供されていない@ので、設定のダウンロードプログラムを作り(概要は後述)、定期的に自動保存するようにしている。
- *例えば、リダイレクトのルールの最大サイズは4096バイトだが、そのギリギリになっているものがある。
- ※設定のバックアップ以外に、変更点のチェックにも使える。
- @外部のサービス?(Terraforming)を使うものはあるが、分かりにくく面倒そうだったので止めた。
- 上を見ると分かるように、CFの設定の種類と量が かなり多い*ため、ダウンロードして手元で保存したくなった※が、管理ページには そういう機能はなく、そういうプログラムも提供されていない@ので、設定のダウンロードプログラムを作り(概要は後述)、定期的に自動保存するようにしている。
感想など
- 簡易WAFの設定(特にブラック/ホワイトリスト)は なかなか難しい。
- サイト固有の要素(例: 許可・不許可URL)が多い。
- 結果を見ながら丹念な調整(チューニング)が必要。
- 判定に使える条件が限られるため、完璧にはできない。
- 例えば、WPのログインを判定条件にしたいが できない。
- CFの無料版の機能制限のために実装が難しくなることが多い。
- 正規表現が使えないのが かなり痛い・・・
- でも、絶妙な切り方だと思う。無料では全然使えない訳ではないから納得できる。
- サイト固有の要素(例: 許可・不許可URL)が多い。
- ログ用サーバ(別名「ゴミ箱」、「ネズミ捕り」、ハニーポット)へのリダイレクトは便利
- ひどい不正アクセスボット(本物の悪者)は この時点で止める(リダイレクト先には行かない)ようだ。
- あるいは、CFやログ用サーバのFWで拒否されるのかも知れない。
- ボットをテキトーに扱える。
- クソボットのアクセスは無駄に多いが、それらのログを分離できるため、他の重要なイベントを見逃しにくくなる。
- ちょっと間抜けな奴が引っ掛かるようだ。
- ログを見れば、どういう不正アクセスが来たかが分かるようにしている。
- 始めた頃、偶然、某押し売り放送のアクセスがログに記録できた。その後は不明だが、二度と来ないで欲しい。
- ハニーポットの偽ログインページには「本当の馬鹿以外は以下に進まないこと。」と書いてあるのに入力する馬鹿ばかりだ(実際には全部ボットだろう)。
- ひどい不正アクセスボット(本物の悪者)は この時点で止める(リダイレクト先には行かない)ようだ。
- 今までに分かった、不正アクセスの温床のプロバイダ(AS)やセキュリティ調査の名目で不正アクセスを行っている団体など (いずれも僕の経験からの印象)
- DigitalOcean, ColoCrossing, ColocationX, Tencent, MS, internet-measurement.com, Expanse, Censysなどは不正アクセスの数が多くてログを見るのも鬱陶しいので、記録せずに(「静かに」)破棄することにした。
- プロバイダの数社はハッカー支援してそうな勢いだが、一般ユーザも居るのだろうか?
- 不正アクセスをしてもペナルティがないために悪者が多いのかも知れない。
- MSは全く いいことがない。 → 全部ブロックにした。
- 不正アクセスが多い。
- Bingボットはアクセス回数が多い割に馬鹿なアクセスが多いし、ヒット数が少ない(Yahoo!の1/8くらい)ので無意味。
- プロバイダの数社はハッカー支援してそうな勢いだが、一般ユーザも居るのだろうか?
- ただ、上より怖いのは、別々のアドレス(AS)・国から同じ時間帯に同じような不正アクセスをしてくる連中だ。そういうのは どこかに黒幕が居て、全世界に数多くの支店(ハックしたクライアント?)を持っているのだろう。
- DigitalOcean, ColoCrossing, ColocationX, Tencent, MS, internet-measurement.com, Expanse, Censysなどは不正アクセスの数が多くてログを見るのも鬱陶しいので、記録せずに(「静かに」)破棄することにした。
- クソボット(robots.txtを読まない・読んでも無視する, マナーがない, 馬鹿・無駄なアクセスをする)は本当に迷惑!
- 一応、ネズミ捕り(上記のログ用サーバ)で、robots.txt兼用の「二度と来るな!」ページを出しているが、読んでも すぐにまた来る馬鹿がほとんど。
- AIのボット(Spawning-AI)は、robots.txtはスルーし、AI関係だけ(/ai.txt, /.well-known/tdmrep.json)チェックするが、そういうものが充分に浸透しているとは思えず、自分勝手だと思う。そういうことするから反感を買うのではないか?
- それでも、それらのファイルがなければクロールしないようなので、良心的だ。 → 近頃、下のようなクソが居ることが分かり、それよりはずっと マトモなことが分かった。
- 近頃出て来たanthropic-aiは かなりひどい。: Spawning-AIと違ってルールなしで、高頻度に無駄なアクセス(例: 同じファイルのクエリー文字列を変えて何度もアクセスする)をする。人工無能?
- 次に来たら「反撃」にしようと思っている。せいぜい、人間の そういう対応も学習してくれ。
- 簡易WAFに引っ掛かった悪質なボット・クライアントなどを自動でブロックできるようにすると便利だが、上に書いたように設定が難しいので、簡単ではなさそうだ。
ログ用サーバについて
ログ記録用に使う無料ホスティングサービスを いろいろ比較したところ、x10hostingが なかなか良いが、調べたり使うと欠点も見付かった。
- アクセスログが見られる。
- メール, FTP, PHP, MySQLが使える(ただし、セキュリティのため使っていない)。
- 無料メールにも使えそうだが、継続性が不安。
- 設定が結構いろいろできる。
- 自分のドメインも使えたはず。
- DNSレコード
- Let's EncryptのSSL証明書が使える(取得してくれる)。
- (2FA対応: 近頃見ないので、別のサービスだったかも。)
- ディスク: 512MB
- Webのファイルマネージャは まあまあ使いやすい。
- ただし・・・
- いろいろ制限がある感じ。
- 1か月くらいログインしないとアカウントが削除される。
- ログイン間隔が短いので面倒。
- メールで通知が来る。
- 他も同様だが、ログイン情報が2種類(大本とサイト用?)あって煩雑。
- 1か月ログイン制限は大本なので誤解していた。
- アクセスログが毎日更新のようで、古いものがなくなる。 → 自分でログ機能を作った。
- サイト(ページ)作成直後にFB(facebookexternalhit)からアクセスがあったのは不審。
- 新しいユーザーをFBに投稿している??
- 他のボットなどからもあった。 → DNSをスキャンしている?
- サーバのタイムゾーンがカナダ(UTC -0400)で変えられない。
- たまにHTTP 503になったりして慌てるが、待てば回復するようだ。
- サポートはフォーラムだけ。
- 検索すると悪い評判も多い。 (→ 参照1, 参照2)
x10hostingの他にはPHPの制限が緩い(例: system()も可能)ところ(AwardSpace)もあったが、ちょっと怖いので止めた。
なお、この用途はホスティング本来の用途では なさそうなので、いつかアカウントが削除される可能性がある。その場合はPHPが使える別のところに移れば良い。
Cloudflareの設定ダウンロードプログラム(cf-get-config.php)について
CF APIを使って以下の設定を取得し、JSONで出力する。僕がCFの管理ページ(web)で設定して居る すべてと追加情報が取得できる。APIに対応する管理ページは"Web:"の行に書く。
- ゾーンのルールセット一覧 (List zone rulesets)
- ゾーンのルールセット(下記)を取得するために必要なルールセットIDなどが取得できる。
- ゾーンのルールセット (Get a zone ruleset)
- Web: Security: WAF: Custom rules, Rate limiting rules
- Web: Rules: Configuration Rules, Transform Rules(Managed Transformsを除く), Redirect Rules, Origin Rules, Settings
- ゾーンのIPアクセスルール (List IP Access rules)
- Web: Security: WAF: Tools: IP Access rules
- ゾーンのUAブロックルール (List User Agent Blocking rules)
- Web: Security: WAF: Tools: User Agent Blocking
- ゾーンの設定 (Get all Zone settings)
- Web: (他に記載のないゾーンの設定全般)
- ゾーンの その他の設定
- CFからサーバ(オリジンサーバ)への最大HTTPバージョン (Get Origin Max HTTP Version setting)
- Web: Speed: Optimization: Protocol Optimization: HTTP/2 to Origin
- DNSSECの設定 (DNSSEC Details)
- Web: DNS: Settings: DNSSEC
- Bot Fight Mode
- Web: Security: Bots: Bot Fight Mode
- HTTPヘッダ: "X-Powered-By"の削除, セキュリティヘッダの追加 (List Managed Transforms)
- Web: Rules: Transform Rules: Managed Transforms: HTTP response headers: Remove "X-Powered-By" headers
- URLの正規化設定 (Get URL normalization settings)
- Web: Rules: Settings: Normalize URLs to origin
- Crawler Hints (Zone flags)
- Web: Caching: Configuration: Crawler Hints
- CFからサーバ(オリジンサーバ)への最大HTTPバージョン (Get Origin Max HTTP Version setting)
実装などのメモ
- CF APIの資料が分かりにくい(書いてないものもある)のと、CFの管理ページの構成とAPIの構成が異なる(管理ページは使いやすくなるように再構成している?)ため、対応させるのに苦労した。
- 設定とAPIの対応は管理ページの"API"を押せば出るものもあるが、それが ないものが多い。
- CF APIにアクセスするためのAPIトークンはGnome Keyringに格納しておき、実行時に取得するようにした。
- Gnome Keyringはデスクトップのログイン時にアンロックする。
- ゾーンの設定を取得するにはゾーンIDを指定する必要があるが、最初に自分のゾーン一覧を取得し、(複数ある場合は順に)その設定を取得するようにした。
- たまに(1日に1回程度)APIが失敗することがあるが、少し待ってからリトライすると成功する。
- 待ち時間は1.5秒にした。
- APIのレート制限(1200回/5分)があるが、それとは関係ないようだ。
- 念のため、API実行後に0.5秒待つようにした。
※設定ダウンロードプログラムは要望があれば公開するが、今までの経験から なさそうだ。ニッチ過ぎるだろう。
PS. 作業中に気付いた、本題とは直接関係のない話
- WPのプラグインReally Simple SSLがクソになった。 → Really stupid SSL?
- セキュリティチェックのため、/wp-content/uploads/code-execution.php を勝手に作って時々実行しようとする。
- もうsimpleでない。別のを探すか止めたい。
- セキュリティチェックのため、/wp-content/uploads/code-execution.php を勝手に作って時々実行しようとする。
- プライベートなサービスの簡易な保護
- 不正アクセスのログを見ていると、"/private"や"/owa"(Outlook on the web?)のような、推測しやすい・広く知られた名前でアクセスして来る場合がある。
- 例えば、サーバのプライベートな(非公開だが自分では使う)サービスのトップディレクトリを そういう名前にすると、そういう機能があることが分かり、挑戦(例: brute force attack)されてしまう可能性がある。
- もちろん認証は あっても、サービスがあることが知られないのが一番良い。
- そこで、トップディレクトリ名をパスワードジェネレータで作って類推されにくくし、そういう機能があることが発覚しにくくした。
- 例: "/owa" → "/rsTZ8JKlUuhkjArA"
- 逆に、(存在しない)分かりやすいディレクトリ名(上に挙げたようなもの)を簡易WAFのブラックリストに載せて、試行の時点で検出できるようにした(疑似餌?)。
- Oracleの無料サービス(OCI Cloud free tier)は撒き餌か詐欺?
- 先日、ある記事で無料サービスがあるのを知って登録しようとしたが、住所、氏名、クレジットカード番号まで入れてクレジットは仮決済・返金できているにも関わらず、試用開始ボタンを押すと決済失敗になってしまった。
- 氏名・住所の言語や使うカードなどを変えて何度か試したが駄目だった。
- サポートに問い合わせると、数日後に やっと来た返事は決済失敗以外は何の情報も出せないとのことだった。
- 結局、撒き餌だった気がする。優良顧客にだけ使わせるのではないか?
- 僕だけでなく、多くの人が同じ目に遭って怒っている。
- 何かの掲示板に それを連想させることが書いてあった。
- 個人情報をどう使うのか気になるが、何の情報も出せないで終わりにされたらどうしようもない。
- Java, MySQL, VirtualBoxに続くOracleへの不信感・蔑み・憎しみが追加された。
(18:40 細かい修正・加筆など; 8/4 9:25 cf-get-config.phpのAPIとWebの対応を加筆・修正, 16:59 レート制限の改良を追記, 22:11 わずかに補足)