AppArmor, isc-dhcp-server und das Leases-File

Yippie! <Skalpmode>…

Ach Mensch Leute, muß denn das sein?

Nov 23 17:49:51 gw06 dhcpd: No memory for /var/lib/dhcp/dhcpd.leases (724771929 bytes)

root@gw06:~# ls -lah /var/lib/dhcp/dhcpd.leases
-rw-r--r-- 1 root root 692M Nov 23 17:49 /var/lib/dhcp/dhcpd.leases

Klar, 700 MB passen schlecht in 1 GB Hauptspeicher …

Was war passiert? Im Müritzer Freifunknetz gab es Berichte, daß an (einem) bestimmten Knoten Endgeräte keine IPv4-Adressen per DHCP bekämen. Also mal draufgeschaut, wenig Anfragen gesehen und den Dienst einfach mal durchgestartet. Ergebnis siehe oben.

Auch auf gw05 hatten sich schon 400 MB an »leases« angesammelt, auf unserem zentralen DHCP-Server für Freifunk im Kreis Gütersloh gar schon 1,8 GB. WTF!?

Offensichtlich klappt irgendwas nicht mit dem stündlichen, vom isc-dhcp-server selbst durchgeführten, Ausmisten des »leases«-Files. Und in der Tat:

root@s3:~# grep dhcpd: /var/log/syslog | grep "Can't create"
Nov 23 07:21:02 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 08:21:03 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 09:21:04 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 10:21:05 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 11:21:06 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 12:21:07 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 13:21:08 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 14:21:09 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 15:21:10 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 16:21:12 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 17:21:14 s3 dhcpd: Can't create new lease file: Permission denied

Es stellte sich raus, das dies ein laaaange bekanntes Problem mit isc-dhcp-server und AppArmor ist, an dem schon lange rumgedoktort wurde, eine endgültige Lösung aber steht auch Ende 2015 noch aus :-(

Tolle Wurst. Immerhin, bei einem Neustart liest isc-dhcp-server das »leases«-File auch neu ein und mistet es aus; solange denn die Datei ins RAM paßt …

Da unsere VMs nur über 1 GB RAM verfügen, das »leases«-File in Gütersloh aber wichtig ist, mußte also erstmal Swap her:

root@s3:~# dd if=/dev/zero of=/swap.file bs=1M count=2048
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 52.0638 s, 41.2 MB/s
root@s3:~# mkswap /swap.file
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=68b2d918-32a2-43fe-b331-c7b691eba01c
root@s3:~# swapon /swap.file
root@s3:~# swapon -s
Filename                                Type            Size    Used    Priority
/swap.file                              file            2097148 0       -1
root@s3:~# free
             total       used       free     shared    buffers     cached
Mem:       1017856     947276      70580        428      35432     673908
-/+ buffers/cache:     237936     779920
Swap:      2097148          0    2097148
root@s3:~# service isc-dhcp-server stop ; service isc-dhcp-server start

Hat immerhin nur ca. 4 Minuten gedauert, bei entweder 90+% CPU (1 ›vCore‹) oder 90+% IOWAIT …

Nov 23 18:39:20 s3 dhcpd: Wrote 4056 leases to leases file.

Danach konnte aber endlich der Interims-Fix angewandt werden:

root@s3:~# apt-get -y install acl ; service isc-dhcp-server stop ; setfacl -dm u:dhcpd:rwx /var/lib/dhcp ; setfacl -m u:dhcpd:rwx /var/lib/dhcp ; service isc-dhcp-server start

Und dies entsprechend auch auf gw05 und gw06. Über erweiterte Dateiattribute darf nun User/Gruppe dhcpd in /var/lib/dhcp Dateien bearbeiten, auch wenn sie root gehörten:

root@gw05:~# ls -lah /var/lib/dhcp/
total 1.4M
drwxrwxr-x+  2 root  root  4.0K Nov 23 23:57 .
drwxr-xr-x  49 root  root  4.0K Aug 30 01:42 ..
-rw-r--r--   1 root  root     0 Apr 16  2014 dhclient.leases
-rw-rw-r--+  1 dhcpd dhcpd 607K Nov 24 00:35 dhcpd.leases
-rw-rw-r--+  1 dhcpd dhcpd 718K Nov 23 23:57 dhcpd.leases~

root@s3:~# grep dhcpd: /var/log/syslog | grep "Can't create"
Nov 23 07:21:02 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 08:21:03 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 09:21:04 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 10:21:05 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 11:21:06 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 12:21:07 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 13:21:08 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 14:21:09 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 15:21:10 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 16:21:12 s3 dhcpd: Can't create new lease file: Permission denied
Nov 23 17:21:14 s3 dhcpd: Can't create new lease file: Permission denied
root@s3:~# ls -lah /var/lib/dhcp/
total 5.4M
drwxrwxr-x+  2 root  root  4.0K Nov 23 22:40 .
drwxr-xr-x  50 root  root  4.0K Oct 20 21:58 ..
-rw-r--r--   1 root  root   512 Sep  1 22:49 dhclient.eth0.leases
-rw-r--r--   1 root  root     0 Mar  5  2015 dhclient.leases
-rw-rw-r--+  1 dhcpd dhcpd 2.3M Nov 23 23:23 dhcpd.leases
-rw-rw-r--+  1 dhcpd dhcpd 3.1M Nov 23 22:40 dhcpd.leases~

Dank an die, die diesen Workaround ersonnen haben. Dennoch sollte alleine die Bearbeitungszeit des gemeldeten Bugs den Verantworlichen seinen Skalp kosten. Hrmpft. Zweieinhalb Jahre … Seufz. </Skalpmode>