前回 ModSecurity を設定したサーバでは、Nextcloud を動かしています。
- Ubuntu 22.04
- Apache 2.4.52
- ModSecurity (libapache2-mod-security2) 2.9.5-1
- OWASP ModSecurity Core Rule Set 3.3.2
- Nextcloud Hub 6 (27.1.2)
ModSecurity が初期設定のままだと Nextcloud の様々な動作がブロックされてしまうので、適切に動作するように設定してみました。
まずは crs-setup.conf を編集。
350行目あたりに、以下のような記述があります。
# Modify and uncomment this rule to select which application: # #SecAction \ # "id:900130,\ # phase:1,\ # nolog,\ # pass,\ # t:none,\ # setvar:tx.crs_exclusions_cpanel=1,\ # setvar:tx.crs_exclusions_drupal=1,\ # setvar:tx.crs_exclusions_dokuwiki=1,\ # setvar:tx.crs_exclusions_nextcloud=1,\ # setvar:tx.crs_exclusions_wordpress=1,\ # setvar:tx.crs_exclusions_xenforo=1"
"これらのアプリケーションを利用している場合は、このルールをアンコメントして修正してね" ということなので、そうする。Nextcloud向けの例外ルールを有効にする設定です。
SecAction \ "id:900130,\ phase:1,\ nolog,\ pass,\ t:none,\ setvar:tx.crs_exclusions_nextcloud=1"
上記のように修正。これで、Nextcloud向けのルール (/usr/share/modsecurity-crs/rules/REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf) がアクティブになり、Nextcloudの各種動作がModSecurityに引っかからなくなります。
※ 同一サーバ上で Nextcloud 以外のDAVを動かしていない場合は、上記の設定を行っておけば、以下の377行目あたりからの設定は不要です。
REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf 内で
SecRule REQUEST_FILENAME "@rx /(?:remote|index|public)\.php/" \ "id:9003130,\ phase:2,\ pass,\ t:none,\ nolog,\ ver:'OWASP_CRS/3.3.5',\ setvar:'tx.allowed_methods=%{tx.allowed_methods} PUT PATCH CHECKOUT COPY DELETE LOCK MERGE MKACTIVITY MKCOL MOVE PROPFIND PROPPATCH UNLOCK REPORT TRACE jsonp'"
…というルールが有効になるためです。このルール(PUTなどのメソッドを許可する)が効く場所を限定している分、こちらのほうが安全です。
続いて、377行目あたり。
# HTTP methods that a client is allowed to use. # Default: GET HEAD POST OPTIONS # Example: for RESTful APIs, add the following methods: PUT PATCH DELETE # Example: for WebDAV, add the following methods: CHECKOUT COPY DELETE LOCK # MERGE MKACTIVITY MKCOL MOVE PROPFIND PROPPATCH PUT UNLOCK # Uncomment this rule to change the default. #SecAction \ # "id:900200,\ # phase:1,\ # nolog,\ # pass,\ # t:none,\ # setvar:'tx.allowed_methods=GET HEAD POST OPTIONS'"
"WebDAVを利用する場合は、許可されるHTTPメソッドに CHECKOUT COPY DELETE LOCK MERGE MKACTIVITY MKCOL MOVE PROPFIND PROPPATCH PUT UNLOCK を追加して、以下のルールをアンコメントしてください" とのことなので、そうする。
SecAction \ "id:900200,\ phase:1,\ nolog,\ pass,\ t:none,\ setvar:'tx.allowed_methods=GET HEAD POST OPTIONS CHECKOUT COPY DELETE LOCK MERGE MKACTIVITY MKCOL MOVE PROPFIND PROPPATCH PUT UNLOCK'"
以上のように crs-setup.conf を修正して保存。
設定の文法チェックをして、問題無ければ Apache を再起動。
Syntax OK ← …と出たら大丈夫
sudo systemctl restart apache2
これで凡そ、Modsecurity が Nextcloud の動作に影響を与えなくなる筈。
この設定でしばらく運用していると、ファイルの更新などの際に、
- ルール 200002 (modsecurity.conf内で定義)
- ルール 921110 (REQUEST-921-PROTOCOL-ATTACK.conf内で定義)
に引っかかって、操作が完了しない事象が偶に発生しました。ファイルの内容に、たまたま不正と認識される文字列が含まれていた場合にブロックしてしまうっぽい。
なので、Nextcloudが稼働しているディレクトリで、先のルールを無効にしてみます。
/etc/modsecurity/ に modsec_local.conf※ というファイルを作成して内容を編集。
以下を記述します。
<Directory /path/to/nextcloud> SecRuleRemoveById 921110 SecRuleRemoveById 200002 </Directory>
/path/to/nextcloud は、Nextcloud がインストールされているディレクトリへの絶対パス。このディレクトリ内では、ルール 921110 と 200002 を無効にする、という設定です。
※ ファイル名は .conf で終われば何でも良い。
/etc/apache2/mods-available/security2.conf を見てみると、こう書いてある:
<IfModule security2_module>
# Default Debian dir for modsecurity's persistent data
SecDataDir /var/cache/modsecurity
# Include all the *.conf files in /etc/modsecurity.
# Keeping your local configuration in that directory
# will allow for an easy upgrade of THIS file and
# make your life easier
IncludeOptional /etc/modsecurity/*.conf
# Include OWASP ModSecurity CRS rules if installed
IncludeOptional /usr/share/modsecurity-crs/*.load
# Include local rules if exists
IncludeOptional /etc/modsec_local/*.conf
</IfModule>
この部分は、/etc/modsecurity ディレクトリ内の *.conf ファイルを全て読み込む、という設定です。ローカル設定をこのファイルに直接記述すると、このファイルがアップグレードされたときにその設定が消えてしまいかねないので、/etc/modsecurity/ に なにがし.conf という名のファイルを作成し、そこにローカル設定を記述しておいたほうが楽ちんですよ、ということですね。
変更を保存したら、いつものように設定の文法チェックを実行し、問題無ければ Apache を再起動。
Syntax OK ← …と出たら大丈夫
sudo systemctl restart apache2
ひとまずこれで落ち着いた感じ。そもそもこのクラウドサーバは自分しか利用していないので、とりあえず実運用に入って、何か不具合が起きたら都度、対処することにしましょ。
【2023.10.24 追記】
コメント