NAXSIを動的モジュールとしてビルドしたnginxのdebパッケージを作成した

ビルドのメモ

wargio/naxsi: NAXSI is an open-source, high performance, low rules maintenance WAF for NGINXをビルドしたメモです。 オリジナルnbs-system/naxsi は2023-11-08にアーカイブ済み。

ビルド用のレポジトリは https://github.com/hnakamur/nginx-deb-docker です。

補足メモ

本題は以上で、以下は細かい話ですが、ついでにメモ。

Dependsのライブラリの一部をRecommendsとSuggetsに移動

今回の変更前はnginxの動的モジュールが使用する共有ライブラリがすべてDependsに含まれていました。 そのため、aptでインストールする際にそれらのライブラリすべてをインストールする必要がありました。

動的モジュールなのでnginxの設定によって使わないこともあるのにインストールを強制されるのは 望ましくないです。

そこで一部をRecommendsとSuggetsに移動しました。

debian/rulesは1行目のshebangが#!/usr/bin/make -fとなっており、2行目以降はMakefile形式になっています。 debian/rules#L292-L308binary-archターゲットのdh_shlibdeps -aの後に、これで生成されるdebian/nginx.substvarsファイルを加工するためのコマンドを追加しました。

binary-arch: install build-dbg
	dh_testdir
	dh_testroot
	dh_installchangelogs -a
	dh_installdocs -a
	dh_lintian -a
	dh_link -aA
	dh_compress -a
	dh_perl -a
	dh_fixperms -a
	dh_installdeb -a
	dh_shlibdeps -a
	mv debian/nginx.substvars debian/nginx.substvars.orig
	debian/modify-substvars < debian/nginx.substvars.orig > debian/nginx.substvars
	dh_gencontrol -a
	dh_md5sums -a
	dh_builddeb $(foreach p,$(DO_PKGS),-p$(p))

上記で呼んでいるdebian/modify-substvarsは今回の変更で追加したPerlスクリプトです。 libssl3(t64)? の箇所はUbuntu 24.04ではlibssl3t64、Ubuntu 22.04ではlibssl3というパッケージ名の両方に対応するためです。

#!/usr/bin/perl
use strict;
use warnings;

my $line = <STDIN>;
chomp $line;
$line =~ s/^shlibs:Depends=//;

my @depends = ();
my @recommends = ();
my @suggests = ();
my @fields = split /, /, $line;
foreach my $field (@fields) {
  if ($field =~ /^(libc6 |libcrypt1 |libpcre3$|libssl3(t64)? |zlib1g )/) {
    push @depends, $field;
  } elsif ($field =~ /^libluajit-5.1-2 /) {
    push @recommends, $field;
  } else {
    push @suggests, $field;
  }
}
my $depends = join(", ", @depends);
my $recommends = join(", ", @recommends);
my $suggests = join(", ", @suggests);
print "shlibs:Depends=$depends\nshlibs:Recommends=$recommends\nshlibs:Suggests=$suggests\n";

debian/control#L30-L34の部分を今回変更して、RecommendsとSugguestsの行を追加しました。

Package: nginx
Architecture: any
Depends: ${misc:Depends}, ${shlibs:Depends}, lsb-base (>= 3.0-6), adduser
Recommends: ${shlibs:Recommends}
Suggests: ${shlibs:Suggests}

ビルドしたnginxをインストールした環境でapt show nginxでDepends、Recommends、Suggestsを確認すると以下のようになっていました。

# dpkg-query -W -f 'Version: ${Version}\nDepends: ${Depends}\nRecommends: ${Recommends}\nSuggests: ${Suggests}\n' nginx
Version: 1.29.0+mod.3-2hn1ubuntu24.04
Depends: libc6 (>= 2.38), libcrypt1 (>= 1:4.1.0), libpcre3, libssl3t64 (>= 3.0.0), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Recommends: libluajit-5.1-2 (>= 2.1.20250117)
Suggests: libcares2 (>= 1.11.0~rc1), libgcc-s1 (>= 3.3.1), libgd3 (>= 2.1.0~alpha~), libgeoip1t64 (>= 1.6.12), libmhash2 (>= 0.9.9.9), libmodsecurity3 (>= 3.0.14), libperl5.38t64 (>= 5.38.2), libstdc++6 (>= 13.1), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25)
# dpkg-query -W -f 'Version: ${Version}\nDepends: ${Depends}\nRecommends: ${Recommends}\nSuggests: ${Suggests}\n' nginx
Version: 1.29.0+mod.3-2hn1ubuntu22.04
Depends: libc6 (>= 2.35), libcrypt1 (>= 1:4.1.0), libpcre3, libssl3 (>= 3.0.0~~alpha1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Recommends: libluajit-5.1-2 (>= 2.1.20250117)
Suggests: libc-ares2 (>= 1.11.0~rc1), libgcc-s1 (>= 3.3.1), libgd3 (>= 2.1.0~alpha~), libgeoip1 (>= 1.6.12), libmhash2 (>= 0.9.9.9), libmodsecurity3 (>= 3.0.14), libperl5.34 (>= 5.34.0), libstdc++6 (>= 11), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25)
# dpkg-query -W -f 'Version: ${Version}\nDepends: ${Depends}\nRecommends: ${Recommends}\nSuggests: ${Suggests}\n' nginx
Version: 1.28.0+mod.3-2hn1ubuntu24.04
Depends: libc6 (>= 2.38), libcrypt1 (>= 1:4.1.0), libpcre3, libssl3t64 (>= 3.0.0), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Recommends: libluajit-5.1-2 (>= 2.1.20250117)
Suggests: libcares2 (>= 1.11.0~rc1), libgcc-s1 (>= 3.3.1), libgd3 (>= 2.1.0~alpha~), libgeoip1t64 (>= 1.6.12), libmhash2 (>= 0.9.9.9), libmodsecurity3 (>= 3.0.14), libperl5.38t64 (>= 5.38.2), libstdc++6 (>= 13.1), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25)
# dpkg-query -W -f 'Version: ${Version}\nDepends: ${Depends}\nRecommends: ${Recommends}\nSuggests: ${Suggests}\n' nginx
Version: 1.28.0+mod.3-2hn1ubuntu22.04
Depends: libc6 (>= 2.35), libcrypt1 (>= 1:4.1.0), libpcre3, libssl3 (>= 3.0.0~~alpha1), zlib1g (>= 1:1.1.4), lsb-base (>= 3.0-6), adduser
Recommends: libluajit-5.1-2 (>= 2.1.20250117)
Suggests: libc-ares2 (>= 1.11.0~rc1), libgcc-s1 (>= 3.3.1), libgd3 (>= 2.1.0~alpha~), libgeoip1 (>= 1.6.12), libmhash2 (>= 0.9.9.9), libmodsecurity3 (>= 3.0.14), libperl5.34 (>= 5.34.0), libstdc++6 (>= 11), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25)

man apt-getのOPTIONSの項に以下の説明があります。

--no-install-recommends
    Do not consider recommended packages as a dependency for installing. Configuration Item:
    APT::Install-Recommends.

--install-suggests
    Consider suggested packages as a dependency for installing. Configuration Item:
    APT::Install-Suggests.

これらのオプション無しだとlibluajit-5.1-2はインストールされますが、libcares2などはインストールされないということになります。

lua-nginx-moduleを使わない場合は--no-install-recommendsを指定してインストールすればよいです。ただし、deb内のnginx設定ファイルは使う設定になっているので、インストール後に設定ファイルを書き換えてから起動する必要があります。

# sed -i '/^load_module/d' /etc/nginx/nginx.conf
# sed -i '/^lua_package/d' /etc/nginx/conf.d/default.conf

このレポジトリのdebianディレクトリのファイルについて

なお、 https://github.com/hnakamur/nginx-deb-docker のdebビルドの設定ファイルはかなり昔に(DebianやUbuntuのパッケージのではなく)nginx.orgで提供しているものをコピーして改変したものです。

おそらく https://github.com/nginx/pkg-oss からコピーしたと思います。 debian/nginx.rules.in#L129-L143を見ると、上記に引用したdebian/rulesのbinary-archターゲットの今回の変更前の内容と一致していました。