さくらのVPS:Siteguard(nginx)を導入する。

約半日引っかかったので、後に続く人が増えることを願い引っかかった点を紹介。

総論:こだわりが無ければApache版を使用するべき

というのも、Apache版はパッケージインストールされたApacheに対して追加でSiteGuardをインストールすればすぐ使用出来るのに対して、nginx版はSiteguardを使用する為のオプションを追加して自力でnginxをビルドしなきゃいけないためです。当然、nginxの更新に追従するのが面倒になり、結果的にWAFによる防御はあるがその土台であるnginxが脆弱というかなり笑えない状況になりかねません。
nginx版を選択する場合は、nginxの更新に気を配り、セキュリティアップデートは遅滞なく適用する覚悟を持ってください。

前提:Siteguard導入とnginxのコンパイルに必要なモジュールについて

まず、前提としてCentOS Stream9での話となります。基本的にREHL/Rocky/ALMAの8~9についてはほぼ同じ手順でどうにかなります。また、リポジトリとしてEPELとCRBを使用可能という条件での作業となります。
Siteguardとnginxのインストールに必要となるモジュールは以下の通りになるのでインストールしておいてください。

  • 開発ツール(Development Tools)グループ
  • libaio,libaio-devel
  • pcre-devel
  • openssl-devel
  • libxslt-devel
  • gd-devel
  • perl-ExtUtils-Embed
  • apr-devel
  • arp-util-devel

他のパッケージに必要等の理由で既に導入済みのものもあるかも知れませんが、とりあえずはこれだけあればどうにかなると思います。

nginxのconfigureオプションを取得する。

まじめにドキュメントを探して・・・というのもいいのですが、面倒なので以下の手順でパッケージ版のconfigureオプションを頂戴します。なお、以下手順はnginxの設定が何もされていない状態を想定しています。もし既にnginxでサイトを運用中の場合、コンフィグファイル等(nginx.conf)をバックアップの上2の手順から実施してください。

1.パッケージ版nginxをインストールする
※quicが使用したい場合はnginxのサイトからリポジトリファイルを取得してmainlineをenableにしてnginx-1.25をインストール。それ以外の場合は1.24をインストールすることになる。ソースをダウンロードする際にはここで選択したバージョンのソースファイルを選択すること。

2.インストール後にnginx -V を実行してconfigreオプションを取得する。

3.インストールしたパッケージ版nginxをアンインストールする。
※アンインストール後に残ったコンフィグ等はお好みで削除してください、ソースからのインストール時に各コンフィグ_defaultというファイルが作成されますが基本的にパッケージ版のものと差はありません。

取得したconfigureオプションを編集する

取得したオプションをSiteguardに使用する為に編集します。

編集する点は

  • –add-module=/opt/jp-secure/siteguardlite/nginx をオプションに追加する

Siteguardのインストール

さくらのVPSのコントロールパネルよりSiteguardのご利用ガイドを開き、サイト内の情報よりnginx版のSiteguardのパッケージをダウンロードする。

パッケージを解凍し、作成されたディレクトリに入り make install を実行することでSiteguardがインストールされる。

nginxのビルド

nginxのサイトよりソースファイルをダウンロードして解凍し、作成されたディレクトリに入る。
./configure <<編集したconfigureオプション>> を実行して完走することを確認する。

     /bin/ld: cannot find -lapr-1
     /bin/ld: cannot find -laprutil-1
     collect2: error: ld returned 1 exit status

上記のようなエラーが出た場合、ldconfig -p | grep “apr" を実行する。

        libaprutil-1.so.0 (libc6,x86-64) => /lib64/libaprutil-1.so.0
        libapr-1.so.0 (libc6,x86-64) => /lib64/libapr-1.so.0

上記のような結果の場合、シンボリックリンクが足りてないので追加する。

     例)
     ln -s libapr-1.so.0.7.0  /lib64/libapr-1.so
     ln -s libaprutil-1.so.0.6.1  /lib64/libaprutil-1.so
     ldconfig
     ※モジュールのバージョンについてはインストールされているバージョンを指定

再度ldconfig -p | grep “apr" を実行し、以下のようになっていることを確認。

     libaprutil-1.so.0 (libc6,x86-64) => /lib64/libaprutil-1.so.0
     libaprutil-1.so (libc6,x86-64) => /lib64/libaprutil-1.so
     libapr-1.so.0 (libc6,x86-64) => /lib64/libapr-1.so.0
     libapr-1.so (libc6,x86-64) => /lib64/libapr-1.so

その後、再度configureして完走したらmakeする。

makeした結果、以下のエラーが出て失敗した場合はconfigureのオプションの追加が必要となります。

 エラー: ‘strncpy’ specified bound depends on the length of                                                                                                                                                     the source argument [-Werror=stringop-truncation]

修正箇所は以下の通り

追加箇所: --with-cc-opt='~'の間
追加の設定: -Wno-error=stringop-truncation
例) --with-cc-opt='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wno-error=stringop-truncation -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC'

再度makeして問題無ければmake install します。

ここまで来れば後はマニュアルに従ってSiteGuardのセットアップを実行することでインストール作業は完了となります。実際のWAFとsiteの設定についてもマニュアルに従えば問題無く動作すると思います。

最後に本手順について参考にさせて頂いた非常に有用なサイトを紹介(正直下記2サイトが無ければ詰んでました):
Quiita @HiroshiAkutsu様:【nginx】さくら専用サーバにてsiteguardをインストールしてリバースプロキシサーバを構築
b13様:Site Guard Lite on Nginx on CentOS7 in さくらのVPS