Nextcloud向けにModSecurityを設定したときのメモ。

前回 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 を編集。

sudo nano /etc/modsecurity/crs/crs-setup.conf

350行目あたりに、以下のような記述があります。

"これらのアプリケーションを利用している場合は、このルールをアンコメントして修正してね" ということなので、そうする。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 内で

…というルールが有効になるためです。このルール(PUTなどのメソッドを許可する)が効く場所を限定している分、こちらのほうが安全です。

続いて、377行目あたり。

"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 を再起動。

sudo apache2ctl -t
Syntax OK   ← …と出たら大丈夫
sudo systemctl restart apache2

これで凡そ、Modsecurity が Nextcloud の動作に影響を与えなくなる筈。

この設定でしばらく運用していると、ファイルの更新などの際に、

  • ルール 200002 (modsecurity.conf内で定義)
  • ルール 921110 (REQUEST-921-PROTOCOL-ATTACK.conf内で定義)

に引っかかって、操作が完了しない事象が偶に発生しました。ファイルの内容に、たまたま不正と認識される文字列が含まれていた場合にブロックしてしまうっぽい。

なので、Nextcloudが稼働しているディレクトリで、先のルールを無効にしてみます。

/etc/modsecurity/ に modsec_local.conf というファイルを作成して内容を編集。

sudo nano /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 を見てみると、こう書いてある:

この部分は、/etc/modsecurity ディレクトリ内の *.conf ファイルを全て読み込む、という設定です。ローカル設定をこのファイルに直接記述すると、このファイルがアップグレードされたときにその設定が消えてしまいかねないので、/etc/modsecurity/ に なにがし.conf という名のファイルを作成し、そこにローカル設定を記述しておいたほうが楽ちんですよ、ということですね。

変更を保存したら、いつものように設定の文法チェックを実行し、問題無ければ Apache を再起動。

sudo apache2ctl -t
Syntax OK   ← …と出たら大丈夫
sudo systemctl restart apache2

ひとまずこれで落ち着いた感じ。そもそもこのクラウドサーバは自分しか利用していないので、とりあえず実運用に入って、何か不具合が起きたら都度、対処することにしましょ。

【2023.10.24 追記】

カテゴリ: