[ModSecurity] 特定のルールだけを適用するには

Mod Securityをオンにしてみたいのだけど、一度に全部適用すると偽判定される可能性があるので、特定のルールだけ適用してMod Securityをしばらくテスト運用してみる。

デフォルトでは、ルールは以下ディレクトリに格納されている。

  • modsecurity.d/*.conf
    – modsecurity_crs_10_config.conf
  • modsecurity.d/activated_rules/*.conf
    – modsecurity_crs_20_protocol_violations.conf
    – modsecurity_crs_21_protocol_anomalies.conf
    – modsecurity_crs_23_request_limits.conf
    – modsecurity_crs_30_http_policy.conf
    – modsecurity_crs_35_bad_robots.conf
    – modsecurity_crs_40_generic_attacks.conf
    – modsecurity_crs_41_sql_injection_attacks.conf
    – modsecurity_crs_41_xss_attacks.conf
    – modsecurity_crs_42_tight_security.conf
    – modsecurity_crs_45_trojans.conf
    – modsecurity_crs_47_common_exceptions.conf
    – modsecurity_crs_48_local_exceptions.conf.example
    – modsecurity_crs_49_inbound_blocking.conf
    – modsecurity_crs_50_outbound.conf
    – modsecurity_crs_59_outbound_blocking.conf
    – modsecurity_crs_60_correlation.conf
  • modsecurity.d/local_rules/*.conf
    – modsecurity_localrules.conf

この中から、分かりやすいところでSQLインジェクションだけ適用してテスト運用する。

ログをクリアしておく。

Apacheを再起動して設定を適用。

サイトが正しく表示されることを確認したら、テスト運用開始。

[ModSecurity] インストール手順

Mod SecurityはオープンソースのWAF (Web Application Fireworks)。WordPressサイトへの攻撃対策として試しにインストールしてみる。

Mod Securityのインストール

Mod Securityのプログラムと攻撃パターンのルールを定義したCore Rule Set (CRS)の両方をインストールする。

検知のみとする設定

いきなりオンにすると、予想しない誤検知によってサイトが遮断される危険性があるので、まずは検知のみモードでテスト運用する。検知のみモードでは検知内容がログファイルに出力されるだけでサイトは遮断されない。

ModSecurityを有効にする

ログを監視

/var/log/httpd/modsec_audit.log

参考サイト

オープンソースのWAF「Mod Security」のメリットとその導入方法について | セキュリティ対策 | CyberSecurityTIMES
https://www.shadan-kun.com/blog/measure/2939/

Apache×Mod SecurityでカンタンWAF構築 – Qiita
https://qiita.com/m0nch1/items/ac7255399366fb113a82

Apache HTTP Server向けのWebアプリケーションファイアウォール(WAF)「ModSecurity」を使ってみよう | さくらのナレッジ
https://knowledge.sakura.ad.jp/10648/

オープンソースWAF「ModSecurity」で学ぶサーバーの防御 | パーソルテクノロジースタッフ株式会社
https://persol-tech-s.co.jp/corporate/security/article.html?id=2

[C#] .NET Core/Framework 違い

新しくアプリを開発する際に.NETのどのエディションを使うべきか。それを判断するためには .NET Core/Framework の違いをきちんと理解しておきたい。

というわけで、そのあたりを解説している参考サイトを覚え書きリンク。

.NET Standard – .NET Core と .NET Standard の分かりやすい解説 | Microsoft Docs
https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2017/september/net-standard-demystifying-net-core-and-net-standard

サーバー アプリ用 .NET Core と .NET Framework の選択 | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/standard/choosing-core-framework-server

.NET Framework / .NET Standard / .NET Core とは何か? | HIROs.NET Blog
https://blog.hiros-dot.net/?p=9086

.NET XXXの違いについて、ざっくりまとめてみた。 – Qiita
https://qiita.com/TowaOnohara/items/e202a2fcfa87d8a42ded

[OpenCV] OpenCvSharpでIplImageをBitmapへ変換する

ファイルを介して変換するのも一方法。

だけど、いちいちファイルを作るのは無駄だ。調べたら、BitmapConverterという変換処理を集めたクラスがあったのでそれを使う。

参考サイト

BitmapConverter Class
https://shimat.github.io/opencvsharp_docs/html/cba415e7-fa73-8ff3-772b-3c9e583143b1.htm

OpenCvSharpでのIplImageとBitmapの相互変換 – そこに部品があるから
http://nc30mtd.oops.jp/blog/2015/01/opencvsharpiplimagebitmap.html

[Laravel] Routeキャッシュをクリアする

新しいrouteを定義したのに、アクセスしたら404になるときには、routeのキャッシュを疑おう。

[MySQL] バイナリデータのダンプ方法

blobなどバイナリデータを持つテーブルをダンプすると、バイナリデータは文字化けしてしまう。当たり前だけど。

対策としては、バイナリデータを持つテーブルをダンプするときは –hex-blob を指定する。バイナリデータが16進文字列に変換されてダンプされる。こうして作成したダンプをインポートするときは普通通りで良し。

参考サイト

mysqldump で default-character-set とか hex-blob とか – ngyukiの日記
https://ngyuki.hatenablog.com/entry/2018/06/21/220624

[MySQL] ログの日時のタイムゾーンを設定する

MySQLを5.6から5.7にアップグレードしたら、ログに記録される日時のタイムゾーンが日本時間からUTCに変わった。おそらく規定値が変わったのだろう。MySQLのドキュメントを調べたら、ログのタイムゾーンを設定するシステム変数が見つかった。システムのタイムゾーンを使うように設定しておく。

/etc/my.cnf

参考サイト

MySQL :: MySQL 5.7 Reference Manual :: 5.1.7 Server System Variables
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

MySQLのバージョンをあげたら、ログ出力される時間がおかしくなった – Qiita
https://qiita.com/tachitechi/items/768b6f63112a8ddf34c9

[MySQL] ログに「Access denied for user ‘UNKNOWN_MYSQL_USER’@’localhost’」と記録される理由

MySQLを5.6から5.7にアップグレードしたら、MySQLを起動する度にログに以下が記録される。

/var/log/mysqld.log

2020-07-21T17:17:56.704754Z 2 [Note] Access denied for user ‘UNKNOWN_MYSQL_USER’@’localhost’ (using password: NO)

ネットを検索すると以下の記事がヒット。

Access denied for user ‘UNKNOWN_MYSQL_USER’@’localhost’ (using password: NO)
https://blog.trippyboy.com/2011/mysql/access-denied-for-user-unknown_mysql_userlocalhost-using-password-no/

記事には「MySQLが起動する時に自身が起動済みかどうかを確認するためにMySQLサーバーに接続を試すため」とある。起動スクリプトを眺めてみると、確かにそのような目的でログインを試みているようだ。

しかし、調べてみるとMySQL5.6でも同様の処理を実行している。どうしてMySQL5.6だとログに出てこないのか?5.7になってログレベルの規定値が変わってログに現れるようになっただけ?まあ大勢に影響無さそうなので、調査は打ち切る。

参考サイト

MySQL 5.7.17 startup log showing [Note] Access denied for user ‘UNKNOWN_MYSQL_USER’ – Stack Overflow
https://stackoverflow.com/questions/42329432/mysql-5-7-17-startup-log-showing-note-access-denied-for-user-unknown-mysql-us

日々の覚書: 何も考えずに真っ新なCentOS 6.6にMySQL 5.7をyumで叩き込むメモ
https://yoku0825.blogspot.com/2015/06/centos-66mysql-57yum.html

[MySQL] zombie dump threads対処法

MySQLを5.6から5.7にアップデートしたら、MySQLログに以下のメッセージが記録されるようになった。レプリケーションしているマスター側のログのみに記録されている。

/var/log/mysqld.log

2020-07-24T03:39:03.790695+09:00 363 [Note] Start binlog_dump to master_thread_id(363) slave_server(369034799), pos(mysql-bin.000018, 70234)
2020-07-24T03:40:03.896291+09:00 366 [Note] While initializing dump thread for slave with UUID <be434b09-3c76-11ea-b276-0e1a567dc58c>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(363).
2020-07-24T03:40:03.896398+09:00 366 [Note] Start binlog_dump to master_thread_id(366) slave_server(369034799), pos(mysql-bin.000018, 70234)
2020-07-24T03:41:04.019671+09:00 369 [Note] While initializing dump thread for slave with UUID <be434b09-3c76-11ea-b276-0e1a567dc58c>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(366).

ネットを検索すると同じ現象がヒットした。

replication – MySQL Zombie Dump threads – Stack Overflow
https://stackoverflow.com/questions/38500713/mysql-zombie-dump-threads

MySQL :: MySQL Zombie Dump threads.
https://forums.mysql.com/read.php?26,648406,648406#msg-648406

記事によれば、slave_net_timeオプション(スレーブがマスターからのデータを待機する時間)の規定値が、MySQL 5.6では3600秒だったのが、MySQL 5.7では60秒に変更されているらしい。

おそらくウチの構成だと60秒では短すぎるのだろう。スレーブ側でMySQL 5.6の規定値だった3600に設定しなおしたら解決。とりあえずこれでしばらく様子を見る。

参考サイト

第75回 MySQLのさまざまなタイムアウトオプションについて:MySQL道普請便り|gihyo.jp … 技術評論社
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0075

[MySQL] ユーザパスワードを変更する

前任者がWebアプリ用にMySQLユーザを作成らしいけど、Webアプリの設定を見るとrootでMySQLに接続している。せっかく作成したユーザが使われていないのは無駄だし、権限何でもアリのrootでMySQLに接続しているのは危険なので、そのユーザを使いたいのだけどパスワードがわからない。

調べてみると、ユーザのパスワード設定は簡単にできた。

ログインできるか確認する。

ログインできた。

以上覚え書き。