Debian deb Paket für selbst kompiliertes nginx mit ModSecurity 3

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
burnersk
Beiträge: 125
Registriert: 22.10.2008 21:32:16
Lizenz eigener Beiträge: MIT Lizenz

Debian deb Paket für selbst kompiliertes nginx mit ModSecurity 3

Beitrag von burnersk » 16.02.2018 14:34:22

Ich möchte meine eigene Variante von nginx kompilieren, da ich gewisse Dritt-Module und auch einige selbst geschriebene Module benutzen möchte.

Das Problem ist das ein Dritt-Modul (ModSecurity) eine eigene Bibliothek braucht. Ich könnte jetzt natürlich die libmodsecurity.so.3 direkt mit dem nginx-Paket mit ausliefern; das würde aber auch heißen, dass bei einem ModSecurity Update nginx neu gebaut werden müsste, was ich nicht möchte (lieber die Bibliothek selbst als eigenes Paket). Wie baue ich also ein Debian Paket von Quellen, welche keine debian/rules haben? Ich möchte, dass libmodsecurity.so.3 über das Paket libmodsecurity ausgeliefert wird, dass dieses Paket die benötigten Abhängigkeiten (siehe unten) auflöst und dass das nginx Paket zu diesem libmodsecurity-Paket abhängig ist.

Der unten aufgezeigte Ablauf ignoriert (dh_shlibdeps) einfach nicht aufgelöste Abhängigkeiten (libmodsecurity) beim nginx Paketbau. Das möchte ich eigentlich nicht machen. Wie muss ich das libmodsecurity Paket bauen und nginx debian/rules modifizieren, dass er das neue libmodsecurity Paket als Abhängigkeit nimmt?

Ich bin wie folgt vorgegangen:

Code: Alles auswählen

# Vorbereitungen:
mkdir -p /data && cd /data
sudo apt-get update && sudo apt-get install wget gnupg

# nginx Quellen hinzufügen (Signierschlüssel und Paketquelle):
wget -O - http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
echo "deb-src http://nginx.org/packages/mainline/debian/ stretch nginx" | sudo tee -a /etc/apt/sources.list
sudo apt-get update

# nginx Quellcode-Paket herunterladen und Abhängigkeiten installieren:
apt-get source nginx=1.13.8-1~stretch
sudo apt-get build-dep nginx=1.13.8-1~stretch

# 3rd Party Module herunterladen:
git clone -b v3.0.0 -- https://github.com/SpiderLabs/ModSecurity.git /data/nginx-modules/ModSecurity
git clone -b v1.0.0 -- https://github.com/SpiderLabs/ModSecurity-nginx.git /data/nginx-modules/ModSecurity-nginx

# ModSecurity kompilieren:
cd /data/nginx-modules/ModSecurity
git submodule init && git submodule update
sudo apt-get install libgeoip-dev libcurl4-openssl-dev libyajl-dev liblmdb-dev libxml2-dev liblua5.3-dev
./build.sh && ./configure && make && sudo make install
cd /data

# Patch nginx's debian/rules (siehe anderer Code-Block)
patch /data/nginx-1.13.8/debian/rules /data/debian-rules.patch

# nginx Paket bauen:
debuild -b -uc -us -ui
/data/debian-rules.patch

Code: Alles auswählen

--- /data/nginx-1.13.8/debian/rules.orig        2017-12-26 12:11:22.000000000 +0100
+++ /data/nginx-1.13.8/debian/rules     2018-02-16 13:41:59.448040752 +0100
@@ -38,12 +38,12 @@

 config.status.nginx: config.env.nginx
        cd $(BUILDDIR_nginx) && \
-       CFLAGS="" ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt="$(CFLAGS)" --with-ld-opt="$(LDFLAGS)"
+       CFLAGS="" ./configure --prefix=/usr/share/nginx --pid-path=/run/nginx.pid --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --user=nginx --group=nginx --with-compat --with-file-aio --with-pcre-jit --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_mp4_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module --with-mail --with-mail_ssl_module --with-stream --with-stream_geoip_module --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --add-module=/data/nginx-modules/ModSecurity-nginx --with-cc-opt="$(CFLAGS)" --with-ld-opt="$(LDFLAGS)"
        touch $@

 config.status.nginx_debug: config.env.nginx_debug
        cd $(BUILDDIR_nginx_debug) && \
-       CFLAGS="" ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt="$(CFLAGS)" --with-ld-opt="$(LDFLAGS)" --with-debug
+       CFLAGS="" ./configure --prefix=/usr/share/nginx --pid-path=/run/nginx.pid --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --user=nginx --group=nginx --with-compat --with-file-aio --with-pcre-jit --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_mp4_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module --with-mail --with-mail_ssl_module --with-stream --with-stream_geoip_module --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --add-module=/data/nginx-modules/ModSecurity-nginx --with-cc-opt="$(CFLAGS)" --with-ld-opt="$(LDFLAGS)" --with-debug
        touch $@

 build-arch.%: config.status.%
@@ -127,7 +127,7 @@
        dh_perl -a
        dh_fixperms -a
        dh_installdeb -a
-       dh_shlibdeps -a
+       dh_shlibdeps -a --dpkg-shlibdeps-params=--ignore-missing-info
        dh_gencontrol -a
        dh_md5sums -a
        dh_builddeb $(foreach p,$(DO_PKGS),-p$(p))

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Debian deb Paket für selbst kompiliertes nginx mit ModSecurity 3

Beitrag von rendegast » 28.02.2018 10:30:39

Du kannst die erstellte Lib oder deren Link in einer FHS-Struktur hinterlegen
und einem Debianequivs-Paket übergeben, zBsp. per lokal-libmodsecurity.control

Code: Alles auswählen

Package: lokal-modsecurity
Version: ...... (ich benutze hier normalerweise die Form "<datum>-lokal")
Section: lokal-libs
Architecture: amd64
Multi-Arch: <...>
Depends: ..., ..., ...
usw.
..
..
Postinst: <Skript/Befehl für ldconfig>
Files: usr/lib/x86_64-linux-gnu/libmodsecurity....so .
 pfad/weitere-datei .
 pfad/weitere-datei .
(auch in Description: benutze ich in der ersten Zeile das Kennwort "...lokal..")


Der gewählte Pfad sollte/muß von ldconfig, zumindest aber von nginx abgegrast werden.
Gegebenenfalls 'Files:' um eine Datei für /etc/ld.so.conf.d/ erweitern.




sudo apt-get build-dep nginx=1.13.8-1~stretch
Die Pakete kommen als 'manuell installiert' ins System.
Irgendwann fragt mensch sich, warum ist xxxxxxx-dev auf dem System?
Daher für diese besser auch ein Meta-equivs-Paket erstellen, einzige markante Eigenschaften bestehen in der Erklärung und dem Halten der Abhängigkeiten:

Code: Alles auswählen

...
Depends: ..., ..., ...,
Description: .....
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

burnersk
Beiträge: 125
Registriert: 22.10.2008 21:32:16
Lizenz eigener Beiträge: MIT Lizenz

Re: Debian deb Paket für selbst kompiliertes nginx mit ModSecurity 3

Beitrag von burnersk » 05.03.2018 17:28:40

Danke erstmal für die Hilfe...

Ich blicke da leider noch immer nicht ganz durch. Für LibModSecurity habe ich jetzt folgende Control-Datei (für equivs):

Code: Alles auswählen

Package: libmodsecurity
Description: Libmodsecurity is one component of the ModSecurity v3 project.
 The library codebase serves as an interface to ModSecurity
 Connectors taking in web traffic and applying traditional
 ModSecurity processing. In general, it provides the
 capability to load/interpret rules written in the
 ModSecurity SecRules format and apply them to HTTP content
 provided by your application via Connectors.
Maintainer: Sören Kornetzki <mail@soeren-kornetzki.de>
Version: 3.0.0~201803051559
Section: lokal-libs
Architecture: amd64
Depends: libgeoip1 (= 1.6.9-4), geoip-bin (= 1.6.9-4), libcurl3 (= 7.52.1-5+deb9u4), libyajl2 (= 2.1.0-2+b3), libxml2 (= 2.9.4+dfsg1-2.2+deb9u2), liblua5.3-0 (= 5.3.3-1)
Files: usr/local/modsecurity/lib/libmodsecurity.so .
 usr/local/modsecurity/lib/libmodsecurity.la .
 usr/local/modsecurity/lib/libmodsecurity.a .
 usr/local/modsecurity/lib/libmodsecurity.so.3.0.0 .
 usr/local/modsecurity/lib/libmodsecurity.so.3 .
Dieses Paket habe ich installiert bevor ich Nginx kompiliert habe. Die Dateien waren vorher auch noch nicht vorhanden, nach der Paketinstallation war aber alles korrekt vorhanden.

Bei der Nginx-Kompilation kommt nun aber folgender fehler:

Code: Alles auswählen

[...]
dh_shlibdeps -a
dpkg-shlibdeps: error: no dependency information found for /usr/local/modsecurity/lib/libmodsecurity.so.3 (used by debian/nginx/usr/sbin/nginx)
Hint: check if the library actually comes from a package.
dh_shlibdeps: dpkg-shlibdeps -Tdebian/nginx.substvars debian/nginx/usr/sbin/nginx debian/nginx/usr/sbin/nginx-debug returned exit code 2
debian/rules:120: recipe for target 'binary-arch' failed
make: *** [binary-arch] Error 2
dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2
debuild: fatal error at line 1116:
dpkg-buildpackage -rfakeroot -us -uc -b -ui failed
Was machen ich falsch?

Antworten