Unifi-Controller Installation

Ich beschreibe hier die Installation eines Unifi-Controllers in einem LXC-Container mit Debian 9. Warum Debian 9? Stand 03/2020 MUSS Debian 9 oder Ubuntu 16.04 eingesetzt werden, obwohl aktuellere Versionen vorhanden sind. Das beruht auf der Abhängigkeit zu MongoDB-Server 3.6, weil von unifi noch eine Option eingesetzt wird, die MongoDB-Server 4. nicht mehr hat.

Die Installation beruht auf der Standard-Dokumentation unter UniFi – How to Install & Upgrade the Controller on Windows, macOS or Linux.

Vorbereitungen

Ggf. muss ein Proxy für den Download des Paketes eingetragen werden. Der folgende Befehl setzt den Proxy nur für die aktuell Session.

export {http,https,ftp}_proxy="http://proxy:3128/"

Installation

Die folgenden Schritte beinhalten das Downloaden und Installieren des Paketes. Die Installation per dpkg wird wahrscheinlich fehlschlagen, weil Abhängkeiten fehlen. Diese werden per forcierter Installation nachgeladen.

cd ~
wget https://dl.ui.com/unifi/5.12.35/unifi_sysvinit_all.deb
dpkg -i unifi_sysvinit_all.deb
apt install -f

Reverse Proxy

Folgende Punkte sprechen in meinen Augen für den Einsatz eines Reverse-Proxy’s

  • Aufruf im Browser ohne Portangabe (8080)
  • Nutzung eines anderen Namens, als der des Hosts
  • Verwendung eines eigene SSL-Zertifikates, das nicht bei jedem Update neu in den Tomcat eingespielt werden muss

Hier Virtual-Host-Konfiguration für nginx:

server {
    listen       80;
    server_name  unifi unifi.intra.your-domain.com unifi.gast.your-domain.com;
 
    return 301 https://$server_name$request_uri;
}
 
server {
        listen 443;
        server_name unifi unifi.intra.your-domain.com unifi.gast.your-domain.com;
 
        ssl_certificate           /etc/nginx/ssl/unifi.intra.your-domain.com.chain.pem;
        ssl_certificate_key       /etc/nginx/ssl/unifi.intra.your-domain.com.key;
        root /var/www/html;
        ssl on;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers on;
 
        access_log            /var/log/nginx/unifi.access.log;
 
        location / {
 
                proxy_set_header        Host $http_host;
                proxy_set_header        X-Forwarded-Host $host;
                proxy_set_header        X-Forwarded-Server $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto $scheme;
                proxy_set_header        X-Scheme $scheme;
                proxy_set_header        Referer "";
                proxy_set_header        Upgrade $http_upgrade;
                proxy_set_header        Connection "upgrade";
 
                # Fix the "It appears that your reverse proxy set up is broken" error.
                proxy_pass          https://unific.mgmt.your-domain.com:8443;
                proxy_read_timeout  90;
 
                proxy_redirect      https://unific.mgmt.your-domain.com:8443 https://$server_name;
        }
 
}
Veröffentlicht in Unifi

Partition online mit parted vergrößern

Ubuntu installiert das Physical Volume bei der Erstinstallation in eine separate (zweite) Partition, da die erste Partition ohne LVM für /boot eingerichtet wird:

root@ubuntu1604lts:~/# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0            11:0    1 1024M  0 rom
vda           253:0    0   15G  0 disk
├─vda1        253:1    0  487M  0 part /boot
└─vda2        253:2    0  7,5G  0 part
  ├─vg00-root 252:0    0  1,9G  0 lvm  /
  ├─vg00-swap 252:1    0  1,9G  0 lvm  [SWAP]
  ├─vg00-tmp  252:3    0  488M  0 lvm  /tmp
  ├─vg00-var  252:4    0  1,9G  0 lvm  /var
  └─vg00-home 252:5    0  1,5G  0 lvm  /home
vdb           253:16   0   20G  0 disk
└─vg01-opt    252:2    0   10G  0 lvm  /opt

Hat man bei der Ersteinrichtung zu knapp gedacht, kann es passieren, dass die root-Partition vollläuft:

root@ubuntu1604lts:~/# df -h
Dateisystem           Größe Benutzt Verf. Verw% Eingehängt auf
udev                   981M       0  981M    0% /dev
tmpfs                  201M    3,2M  197M    2% /run
/dev/mapper/vg00-root  1,8G    1,8G     0  100% /
tmpfs                 1001M       0 1001M    0% /dev/shm
tmpfs                  5,0M       0  5,0M    0% /run/lock
tmpfs                 1001M       0 1001M    0% /sys/fs/cgroup
/dev/vda1              464M    106M  331M   25% /boot
/dev/mapper/vg00-tmp   465M    2,3M  434M    1% /tmp
/dev/mapper/vg00-home  1,5G    2,3M  1,4G    1% /home
/dev/mapper/vg01-opt   9,8G     23M  9,2G    1% /opt
/dev/mapper/vg00-var   1,8G    630M  1,1G   37% /var
tmpfs                  201M       0  201M    0% /run/user/0


Wenn man jetzt für die VM die Festplatte vergrößert, ändert das leider nichts am Dateisystem, da die Partition und damit das LVM Physical Volume gleich groß geblieben ist:

root@ubuntu1604lts:~/# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               vg00
  PV Size               7,52 GiB / not usable 3,00 MiB
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              1925
  Free PE               0
  Allocated PE          1925
  PV UUID               ubAhLP-Od1g-7U3V-qj7O-dAws-CLuc-ePRnQ9

Jetzt also der große Moment, die benutzte Partition online zu vergrößern, ohne dass die vorhandenen Daten Schaden nehmen. Dazu eignet sich hervorragend parted (auch ohne GUI = gparted). Dazu kann man den dialoggesteuerten Modus starten und sich erst mal ein paar Informationen anzeigen lassen:

root@ubuntu1604lts:~/# parted
GNU Parted 3.2
/dev/mapper/vg00-var wird verwendet
Willkommen zu GNU Parted! Rufen Sie »help« auf, um eine Liste der verfügbaren Befehle zu erhalten.

(parted) select /dev/vda
/dev/vda wird verwendet
(parted) unit MiB
(parted) print free
Modell: Virtio Blockorientiertes Gerät (virtblk)
Festplatte  /dev/vda:  15360MiB
Sektorgröße (logisch/physisch): 512B/512B
Partitionstabelle: msdos
Disk-Flags:

Nummer  Anfang   Ende      Größe    Typ      Dateisystem   Flags
        0,03MiB  1,00MiB   0,97MiB           Freier Platz
 1      1,00MiB  488MiB    487MiB   primary  ext4          boot
 2      488MiB   8191MiB   7703MiB  primary                LVM
        8191MiB  15360MiB  7169MiB           Freier Platz


Wenn standardmäßig ein anderes, als die gewünschte Partition verwendet wird, muss man mit select erst in die entsprechende wechseln. Mit unit kann man mit unterschiedlichen Speichergrößen arbeiten. Wer jetzt versucht die Partition mit resizepart zu vergrößern, wird meistens scheitern, weil die Umrechnungen der Anzeige zu ungenau sind, um sie in den Änderungsangaben zu verwenden:

(parted) resizepart
Partitionsnummer? 2
Ende?  [8191MiB]? 15360MiB
Fehler: Der Ort 15360MiB ist außerhalb des Geräts /dev/vda.

Also erst einmal die Einheiten auf absolute Werte wie Sektoren einstellen und noch einmal versuchen. Da man sich diese auch so anzeigen lassen kann, kann man sich den Wert prima kopieren:

(parted) unit s
(parted) print free
Modell: Virtio Blockorientiertes Gerät (virtblk)
Festplatte  /dev/vda:  31457280s
Sektorgröße (logisch/physisch): 512B/512B
Partitionstabelle: msdos
Disk-Flags:

Nummer  Anfang     Ende       Größe      Typ      Dateisystem   Flags
        63s        2047s      1985s               Freier Platz
 1      2048s      999423s    997376s    primary  ext4          boot
 2      999424s    16775167s  15775744s  primary                LVM
        16775168s  31457279s  14682112s           Freier Platz

(parted) resizepart
Partitionsnummer? 2
Ende?  [16775167s]? 31457279s

Zeigt man sich dann das Ergebnis mit den vorherigen Einheiten an, erkennt man auch die Vergrößerung und kann das Programm verlassen:

(parted) unit MiB
(parted) print free
Modell: Virtio Blockorientiertes Gerät (virtblk)
Festplatte  /dev/vda:  15360MiB
Sektorgröße (logisch/physisch): 512B/512B
Partitionstabelle: msdos
Disk-Flags:

Nummer  Anfang   Ende      Größe     Typ      Dateisystem   Flags
        0,03MiB  1,00MiB   0,97MiB            Freier Platz
 1      1,00MiB  488MiB    487MiB    primary  ext4          boot
 2      488MiB   15360MiB  14872MiB  primary                LVM

(parted) quit
Informationen: Möglicherweise müssen Sie /etc/fstab anpassen.

Jetzt nur noch das LVM Physical und Logical Volume und das Dateisystem der gewünschten Partition vergrößern und fertig:

root@ubuntu1604lts:~/# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0            11:0    1 1024M  0 rom
vda           253:0    0   15G  0 disk
├─vda1        253:1    0  487M  0 part /boot
└─vda2        253:2    0 14,5G  0 part
  ├─vg00-root 252:0    0  1,9G  0 lvm  /
  ├─vg00-swap 252:1    0  1,9G  0 lvm  [SWAP]
  ├─vg00-tmp  252:3    0  488M  0 lvm  /tmp
  ├─vg00-var  252:4    0  1,9G  0 lvm  /var
  └─vg00-home 252:5    0  1,5G  0 lvm  /home
vdb           253:16   0   20G  0 disk
└─vg01-opt    252:2    0   10G  0 lvm  /opt

root@ubuntu1604lts:~/# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               vg00
  PV Size               7,52 GiB / not usable 2,00 MiB
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              1925
  Free PE               0
  Allocated PE          1925
  PV UUID               ubAhLP-Od1g-7U3V-qj7O-dAws-CLuc-ePRnQ9

root@ubuntu1604lts:~/# pvresize /dev/vda2
  Physical volume "/dev/vda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

root@ubuntu1604lts:~/# pvdisplay /dev/vda2
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               vg00
  PV Size               14,52 GiB / not usable 3,00 MiB
  Allocatable           yes
  PE Size               4,00 MiB
  Total PE              3717
  Free PE               1792
  Allocated PE          1925
  PV UUID               ubAhLP-Od1g-7U3V-qj7O-dAws-CLuc-ePRnQ9

root@ubuntu1604lts:~/# lvresize -L +5G /dev/vg00/root
  Size of logical volume vg00/root changed from 1,86 GiB (476 extents) to 6,86 GiB (1756 extents).
  Logical volume root successfully resized.
root@ubuntu1604lts:~/# resize2fs /dev/vg00/root
resize2fs 1.42.13 (17-May-2015)
Dateisystem bei /dev/vg00/root ist auf / eingehängt; Online-Größenänderung ist
erforderlich
old_desc_blocks = 1, new_desc_blocks = 1
Das Dateisystem auf /dev/vg00/root is nun 1798144 (4k) Blöcke lang.

root@ubuntu1604lts:~/# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0            11:0    1 1024M  0 rom
vda           253:0    0   15G  0 disk
├─vda1        253:1    0  487M  0 part /boot
└─vda2        253:2    0 14,5G  0 part
  ├─vg00-root 252:0    0  6,9G  0 lvm  /
  ├─vg00-swap 252:1    0  1,9G  0 lvm  [SWAP]
  ├─vg00-tmp  252:3    0  488M  0 lvm  /tmp
  ├─vg00-var  252:4    0  1,9G  0 lvm  /var
  └─vg00-home 252:5    0  1,5G  0 lvm  /home
vdb           253:16   0   20G  0 disk
└─vg01-opt    252:2    0   10G  0 lvm  /opt

root@ubuntu1604lts:~/# df -h
Dateisystem           Größe Benutzt Verf. Verw% Eingehängt auf
udev                   981M       0  981M    0% /dev
tmpfs                  201M    3,2M  197M    2% /run
/dev/mapper/vg00-root  6,8G    1,8G  4,7G   28% /
tmpfs                 1001M       0 1001M    0% /dev/shm
tmpfs                  5,0M       0  5,0M    0% /run/lock
tmpfs                 1001M       0 1001M    0% /sys/fs/cgroup
/dev/vda1              464M    106M  331M   25% /boot
/dev/mapper/vg00-tmp   465M    2,3M  434M    1% /tmp
/dev/mapper/vg00-home  1,5G    2,3M  1,4G    1% /home
/dev/mapper/vg01-opt   9,8G     23M  9,2G    1% /opt
/dev/mapper/vg00-var   1,8G    630M  1,1G   37% /var
tmpfs                  201M       0  201M    0% /run/user/0

Ergebnis: root-Partition vergrößert, ohne das System offline zu nehmen und ohne Daten zu verlieren.

IPFire Webseite zeitweise auf red freischalten

Ich benutze gerne IPFire, um mal schnell ein Testnetz aufzusetzen. Das red-Interface kommt dann ins vorhandene Gästenetz und das green-Interface stellt das Testnetz dar. Da das Testnetz aber noch keine Computer hat, habe ich nach der Installation keine Oberfläche, um ipfire konfigurieren zu können, da diese standardmäßig nur vom green-Interface aus erreichbar ist. Das kann man aber über einen Einzeiler zeitweise (bis zum nächsten Neustart) ändern, um die Konfiguration über die Management-Oberfläche vornehmen zu können.

Dazu muss man:

  • die IP seines eigenen PCs oder Netzwerkes (hier: 192.168.1.77) und
  • die IP des red-Interfaces der IPFire-Installation (hier: 192.168.0.101) wissen.

Seine eigene IP-Adresse bekommt man über den Befehl ipconfig in einer Kommandozeile unter Windows heraus:

C:\Users>ipconfig

Windows-IP-Konfiguration


Ethernet-Adapter LAN-Verbindung:

   Verbindungsspezifisches DNS-Suffix: domain.local
   IPv4-Adresse  . . . . . . . . . . : 192.168.1.77
   Subnetzmaske  . . . . . . . . . . : 255.255.255.0
   Standardgateway . . . . . . . . . : 192.168.1.1


Dann kann man sich mit dem bei der IPFire-Installation vergebenen Root-Kennwort an der Konsole anmelden und einen iptables-Eintrag vornehmen, der die https-Managment-Webseite auf dem red-Interface freischaltet.

warnung Das sollte man natürlich nur bei internen Netzwerken machen! Wer ipfire als Internet-Zugangsrouter verwendet, schaltet das Management damit in das Internet frei!

iptables -A INPUTFW -s 192.168.1.77/32 -d 192.168.0.101/32 -p tcp -m tcp --dport 444 -j ACCEPT

Erklärung der Parameter:

  • iptables = das Firewall-Programm
  • -A INPUTFW = die Firewall-Kette, in die diese Ausnahme eingetragen wird (werden muss)
  • -s 192.168.1.77/32 = der eine Host (/32) mit der IP 192.168.1.77, der diese Ausnahme nutzen darf (alternativ schaltet man das ganz Sub-Netz frei: -s 192.168.1.0/24)
  • -d 192.168.0.101/32 = die IP-Adresse des red-Interfaces der ipfire-Installation
  • -p tcp -m tcp = es wird das TCP-Protokoll benutzt
  • –dport 444 = der Port, der auf dem red-Interface freigeschaltet wird (standardmäßig verwendet ipfire für das Management per https diesen Port)
  • -j ACCEPT = Datenpakete auf einer Verbindung mit diesen Einschränkungen zulassen.

infoDa diese Konfiguration live vorgenommen und nicht abgespeichert wird, ist diese nach einem Neustart nicht mehr vorhanden! Das ist so gewollt, da die vollständige Konfiguration danach über das Web-Interface erfolgen kann.

T-SQL Array-Variablen deklarieren

Manchmal braucht man mehr als einen Wert in einer Variable. Dann kann man diese auch als Tabelle definieren:

DECLARE @Kunde table ([Kunden-Name] varchar(50), [Kunden-Status] varchar(10))

Die Variablen kann man dann über Standard-Statements befüllen und abfragen:

INSERT INTO @Kunde VALUES ('Kunde1','aktiv');
INSERT INTO @Kunde VALUES ('Kunde2','gekündigt');
INSERT INTO @Kunde VALUES ('Kunde3','inArbeit');
SELECT * FROM @Kunde
Kunden-Name                                        Kunden-Status
-------------------------------------------------- -------------
Kunde1                                             aktiv
Kunde2                                             gekündigt
Kunde3                                             inArbeit

Verwendung der Variable in WHERE-Klausel:

SELECT * from Vertraege WHERE Kundenstatus IN (SELECT [Kunden-Status] FROM @Kunde)
Veröffentlicht in MSSQL

apt-get / aptitude

Steuerung über die APT-Konfiguration

Wie der lokale Paket-Manager funktioniert kann man nicht nur per Script und Cronjobs sondern auch über die umfangreiche APT-Konfigurations-Syntax steuern. Die wichtigsten Parameter sind direkt im standardmäßig angelegten Cronjob „/etc/cron.daily/apt“ beschrieben.

Konfiguration eines Apt-Proxys

Dazu einfach unter

/etc/apt/apt.conf.d/

eine Konfigurations-Datei anlegen:

vi /etc/apt/apt.conf.d/01proxy

und in diese den folgenden Inhalt schreiben:

Acquire::http::Proxy "http://[[user][:pass]@]host[:port]/";

Hier z.B. die Konfiguration wenn lokal der apt-cacher installiert wurde:

Acquire::http::Proxy "http://localhost:3128/";

Automatische Installation von Sicherheits-Updates

Dafür ist erst einmal das zusätzliche Paket „unattended-upgrades“ notwendig.

aptitude install unattended-upgrades

Mit der Installation wird die notwendige Konfigurationsdatei „/etc/apt/apt.conf.d/50unattended-upgrades“ (beschrieben für Debian)

// Automatically upgrade packages from these (origin, archive) pairs
Unattended-Upgrade::Allowed-Origins {
 "${distro_id} stable";
 "${distro_id} ${distro_codename}-security";
// "${distro_id} ${distro_codename}-updates";
// "${distro_id} ${distro_codename}-proposed-updates";
};

// List of packages to not update
Unattended-Upgrade::Package-Blacklist {
// "vim";
// "libc6";
// "libc6-dev";
// "libc6-i686";
 "^linux-image.*";
};

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. The package 'mailx'
// must be installed or anything that provides /usr/bin/mail.
//Unattended-Upgrade::Mail "root@localhost";

// Do automatic removal of new unused dependencies after the upgrade
// (equivalent to apt-get autoremove)
//Unattended-Upgrade::Remove-Unused-Dependencies "false";

// Automatically reboot *WITHOUT CONFIRMATION* if a
// the file /var/run/reboot-required is found after the upgrade
//Unattended-Upgrade::Automatic-Reboot "false";

// Use apt bandwidth limit feature, this example limits the download
// speed to 70kb/sec
//Acquire::http::Dl-Limit "70";

installiert. Hier wird bestimmt, welche Pakete automatisch installiert bzw. von der automatischen Installation ausgenommen werden. Man kann sich auch per Email bei Fehlern benachrichtigen lassen.

Damit sind die automatischen Updates aber noch nicht aktiv!

Dafür müssen erst die folgenden drei Zeilen

APT::Periodic::Enable "1";
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

in die Datei „/etc/apt/apt.conf.d/10periodic“ geschrieben/angehängt werden. Durch diese zwei Zeilen werden die Paket-Listen einmal täglich aktualisiert und die Pakete, die in „/etc/apt/apt.conf.d/50unattended-upgrades“ konfiguriert sind, installiert.

Für die Benamung der Datei habe ich bisher noch keine Beschreibung gefunden. Da diese für die Funktion aber ohne Bedeutung ist, habe ich mich nach dem Eintrag im Ubuntu-Wiki gerichtet, in dem ich diese Konfiguration auch gefunden habe.

Die Ausführung erfolgt dann durch das vorhandene APT-Script „/etc/cron.daily/apt“, das täglich ausgeführt wird.

Update-Download

Wer möchte kann sich die anstehenden Updates ja bereits downloaden. Dann braucht es bei der Installation nicht so lange. Dazu muss man einfach eine Zeile der umfangreichen APT-Konfiguration aktivieren, in dem man sie in eine Datei unterhalb von „/etc/apt/apt.conf.d/“ schreibt.

Hat man es z.B. wie oben bei den automatischen Updates eingerichtet, kann man die folgende Zeile in die Datei „/etc/apt/apt.conf.d/10periodic“ eintragen:

APT::Periodic::Download-Upgradeable-Packages "1";

Damit werden die anstehenden Update-Dateien einmal täglich heruntergeladen, aber nicht installiert.

Cache aufräumen

Damit das standardmäßig vorhandene Script „/etc/cron.daily/apt“ auch das Aufräumen übernimmt, braucht man nur eine Zeile aktivieren.

APT::Periodic::AutocleanInterval "7";

Damit wird „apt-get autoclean“ alle 7 Tage ausgeführt.

Logs rotieren

Ich richte immer noch eine erweiterte Konfiguration für logrotate ein.

Fehlerbehebung

Wer seine anstehenden Linux-Updates per Nagios/Icinga überwacht, kann nach dem manuellen Neuanlegen der o.g. Dateien auf folgenden Fehler treffen:

'/usr/bin/apt-get -o 'Debug::NoLocking=true' -s -qq upgrade' exited with non-zero status.
APT WARNING: 0 packages available for upgrade (0 critical updates). warnings detected, errors detected. run with -v for information

Beim Testen des angezeigten Befehls treten wie immer keine Fehler auf. Man ist ja root. Also sollte der Befehl als der Benutzer ausgeführt werden, unter dem die Monitoring-Software läuft:

su <monitoringbenutzer> -s /bin/bash

Der Parameter -s für die Shell ist optional, aber bei Systembenutzern ohne Shell notwendig. Danach sieht man dann erst den eigentlichen Fehler:

/usr/bin/apt-get -o 'Debug::NoLocking=true' -s -qq upgrade
E: Konfigurationsdatei /etc/apt/apt.conf.d/10periodic wird geöffnet - ifstream::ifstream (13: Keine Berechtigung)

Einfach Leseberechtigungen für „Others“ auf die gemeldete Datei setzen und schon klappt’s mit dem Nachbarn ;-). Bei mir war die Ursache die restriktiv gesetzte UMASK im Profil.

logrotate Konfiguration unattended-upgrades

Diese Konfiguration nutze ich für die automatischen Updates unter Debian/Ubuntu. Dabei liegen die angelegten Logfiles standardmäßig unter „/var/log/unattended-upgrades/“. Die Konfiguration des Speicherortes passiert in der APT-Konfigurationsdatei „/etc/apt/apt.conf.d/50unattended-upgrades“ über den Parameter „APT::UnattendedUpgrades::LogDir“. Der Pfad ist in der Logrotate-Konfiguration also entsprechend zu setzen:

/var/log/unattended-upgrades/unattended-upgrades.log {
monthly
missingok
rotate 24
compress
dateext
notifempty
olddir /var/log/unattended-upgrades/old/
}

/var/log/unattended-upgrades/unattended-upgrades-dpkg*.log {
daily
missingok
rotate 92
compress
dateext
olddir /var/log/unattended-upgrades/old/
}

Die Konfiguration sollte vor dem ersten Einsatz getestet werden:

logrotate -d /etc/logrotate.d/<ConfigDatei>

Dabei kommt dann in etwa so etwas heraus:

reading config file /etc/logrotate.d/unattended-upgrades
reading config info for /var/log/unattended-upgrades/unattended-upgrades.log
olddir is now /var/log/unattended-upgrades/old/
reading config info for /var/log/unattended-upgrades/unattended-upgrades-dpkg*.log
olddir is now /var/log/unattended-upgrades/old/

Handling 2 logs

rotating pattern: /var/log/unattended-upgrades/unattended-upgrades.log monthly (24 rotations)
olddir is /var/log/unattended-upgrades/old/, empty log files are not rotated, old logs are removed
considering log /var/log/unattended-upgrades/unattended-upgrades.log
log does not need rotating

rotating pattern: /var/log/unattended-upgrades/unattended-upgrades-dpkg*.log after 1 days (92 rotations)
olddir is /var/log/unattended-upgrades/old/, empty log files are rotated, old logs are removed
considering log /var/log/unattended-upgrades/unattended-upgrades-dpkg*.log
log /var/log/unattended-upgrades/unattended-upgrades-dpkg*.log does not exist -- skipping

awk – Auswertung von Textdateien

Was Awk ist, kann man auf Wikipedia nachlesen. Ich schreibe mir hier Zusammenstellungen auf, die mir merkenswert erscheinen.

Deinstallations-Liste aus Paketmanager dpkg erstellen

Manchmal muss man auch mal aufräumen. Dann hilft es schon, wenn man sich die Liste seines lokalen Paketmanagers (dpkg) für sein Online-Paketverwaltungstool (apt-get, aptitude) aufbereiten kann.

dpkg -l | grep lxde | awk '{progs=progs$2" "} END {print progs}'

Damit wird mit dpkg eine Liste der installierten Programme erzeugt und diese auf den Begriff lxde gefiltert. Das Ergebnis wird an awk per Pipe weitergegeben. Awk verarbeitet aus allen Zeilen die Spalte 2 ($2) und speichert diese zusammen mit einem Leerzeichen in der Variable progs. Zum Schluss (END) wird die Variable progs ausgegeben.

Jetzt kann man noch die Paketverwaltung seiner Wahl mit dem entsprechenden Deinstallations-Befehl (remove, purge) davorsetzen und die Programme werden entfernt.

Ein erweitertes Suchergebnis erhält man mit egrep, so dass man auch nach mehreren Begriffen suchen kann:

dpkg -l | egrep '(lxde|gnome|gdm)' | awk '{progs=progs$2" "} END {print progs}'

Hier muss man nur beachten, dass die Regular Expressions in Anführungszeichen stehen müssen. Im hier gezeigten Beispiel werden von alle Zeilen an awk übergeben, die „lxde“ oder „gnome“ oder „gdm“ enthalten.

Konfiguration rkhunter

Automatische DB-Aktualisierung nach Paketinstallation/-Upgrade

Ab der Version 1.3.8, die z.B. auf Ubuntu 12.04 LTS eingesetzt wird, kann man rkhunter automatisch seine DB aktualisieren lassen, damit man beim Einsatz von automatischen Aktualisierungen hinterher keine False-Positive-Emails von rkhunter kommen. Dazu den Wert APT_AUTOGEN in der /etc/default/rkhunter auf true setzen. Den Rest erledigt dann die APT-Konfiguration aus /etc/apt/apt.conf.d/90rkhunter, welche automatisch bei der Installation angelegt wurde.

Wer noch mit der Version 1.3.6 arbeitet, z.B. auf Debian Squeeze und Ubuntu 10.04 LTS, kann sich diese Funktion aber sehr einfach aktivieren. Dazu einfach die folgenden Konfigurationen und ein Script aus Ubuntu 12.04 LTS auf die Konsole kopieren und ab geht’s.

cat >> /usr/share/rkhunter/scripts/rkhupd.sh <<EOF
#!/bin/sh
set -e
 
if ! grep -qsE '^DISABLE_TESTS=.*(hashes.*attributes|attributes.*hashes|properties)' /etc/rkhunter.conf{.local,} || \
     grep -qsE '^ENABLE_TESTS=.*(hashes|attributes|properties)' /etc/rkhunter.conf{.local,}; then
         rkhunter --propupd --nolog
fi
EOF
chmod 755 /usr/share/rkhunter/scripts/rkhupd.sh
 
cat >> /etc/default/rkhunter <<EOF
 
# Set this to yes to enable automatic database updates
# (default: false)
APT_AUTOGEN="true"
EOF
 
cat >> /etc/apt/apt.conf.d/90rkhunter <<EOF
// Makes sure that rkhunter file properties database is updated after each remove or install only APT_AUTOGEN is enabled
DPkg::Post-Invoke { "if [ -x /usr/bin/rkhunter ] && grep -qiE '^APT_AUTOGEN=.?(true|yes)' /etc/default/rkhunter; then /usr/share/rkhunter/scripts/rkhupd.sh; fi" }
EOF

Semiaktuelle Software-Versionen bestätigen

Debian legt standarmäßig mehr Wert auf Stabilität und Minimalismus, als auf Aktualität. Zumindestens, wenn man sich auf den STABLE-Zweig beschränkt. Benutzt man dann z.B. den RootKit-Hunter, kommt es zu Meldungen, dass einige Applikationen, wie z.B. openSSL, GPG, PHP, SSH-Server, die bekannte Ziele für Sicherheitsattacken sind, zu alt sind.

Man hat jetzt zwei Möglichkeiten, diesen Warnungen zu begegnen. Zum einen die aktuell eingesetzten Versionen per Konfigurationsoption in der /etc/rkhunter.conf auf eine Whitelist zu setzen:

APP_WHITELIST="gpg:1.4.9 openssl:0.9.8g php:5.2.6 sshd:5.1p1"

Damit werden z.B. die o.g. Applikationen mit der aufgeführten Version als o.k. angesehen. Man muss diese Versionen bei einem Update allerdings manuell nachpflegen.

Alternativ, kann man auch das Scannen aller Applikationen per Konfiguraitonsoption ausschalten. Dafür muss man die „apps“ unter „DISABLE_TESTS“ mit aufnehmen:

DISABLE_TESTS="suspscan hidden_procs deleted_files packet_cap_apps apps"

Meines Erachtens ist das aber nicht der wirklich gute Weg.

Neuerungen in Debian Squeeze und rkhunter 1.3.6

Mit der Version 1.3.6 werden einige neue Punkte gemeldet. So z.B.:

No MAIL-ON-WARNING option has been configured.
Warning: Checking for possible rootkit strings [ Warning ]
Found string 'hdparm' in file '/etc/init.d/.depend.boot'. Possible rootkit: Xzibit Rootkit
Found string 'hdparm' in file '/etc/init.d/hdparm'. Possible rootkit: Xzibit Rootkit
Warning: Hidden directory found: /dev/.udev
Warning: Hidden directory found: /dev/.mdadm
Warning: Hidden directory found: /dev/.initramfs

Im Einzelnen dazu Folgendes:

No MAIL-ON-WARNING option has been configured

Ist keine „MAIL-ON-WARNING“ Email-Adresse angegeben, wird die Ausgabe standardmäßig an root gesendet. Hat man keine Weiterleitung aktiviert, bekommt man auch keine Meldungen. Hat man eine Weiterleitung eingerichtet, bekommt man alle Ausgaben per Email unverschlüsselt zugesendet. Beim Transport durch das Internet kann das auch ein Sicherheitsrisiko bedeuten, da man lesen kann, welche Sicherheitsrisiken bestehen.
Also sollte man lieber eine Email-Adresse eintragen. Dann bekommt man nur eine Info über eine mögliche Infektion und man muss das lokale Log kontrollieren.

Warning: Checking for possible rootkit strings

Durch die Umstellung in Debian squeeze auf den Abhängigkeits-Boot-Modus geht die Datei /etc/init.d/.depend.boot in Ordnung. Zusätzlich wird auch die Datei /etc/init.d/hdparm gemeldet, die aber nur das Festplattenmonitoring darstellt.

Beide und weitere kann man wie folgt von der Überprüfung ausnehmen:

RTKT_FILE_WHITELIST="/etc/init.d/.depend.boot /etc/init.d/hdparm"

Warning: Hidden directory found

Squeeze hat auch ein paar neue versteckte Ordner unterhalb von /dev erzeugt, die natürlich potentiell gefährlich sein können. Nach manueller Kontrolle, kann man die bereits vorbereiteten Optionen einfach inder /etc/rkhunter.conf auskommentieren:

ALLOWHIDDENDIR=/dev/.udev
ALLOWHIDDENDIR=/dev/.initramfs
ALLOWHIDDENDIR=/dev/.mdadm

Lokale Konfigurationsdatei aber Version 1.3.6

Ab Version 1.3.6 kann rkhunter mit einer lokalisierten Konfigurationsdatei betrieben werden, was Updates wesentlich erleichtert. Die Datei muss zwingend rkhunter.conf.local heißen und im selben Verzeichnis liegen wie die Konfigurationsdatei des Betreuers (rkhunter.conf). Bei Debian liegen beide Dateien also unter /etc.

Sie enthält einfach alle geänderten Variablen. Da sie nach der Standard-Datei eingelesen wird, werden alle vorher konfigurierten Optionen überschrieben.

NTP Network Time Protocol

Manuelle Synchronisation

Die manuelle Synchronisation unter Linux erfolgt über ntpdate. Dementsprechend muss dieses Paket überhaupt erst einmal installiert werden. Danach kann über

ntpdate <server>

seine eigene Computer-Zeit mit der des angegebenen Servers einmalig abgleichen. Falls bereits ein NTP-Daemon läuft, muss der vorher angehalten werden.

Unter Windows kann man seine Zeit über die Kommandozeile einmalig wie folgt abgleichen:

net time \\<server>

Automatische Synchronisation

Soll die Zeit automatisch und regelmäßig abgeglichen werden, muss ein entsprechender Dienst laufen.

Unter Linux installiert man dafür das Paket ntp, dass einen NTP-Daemon enthält. Dieser wird über die Datei /etc/ntp.conf konfiguriert und enthält bereits einige Server, die sich je nach OS unterscheiden. Hier ein Beispiel für Debian:

# pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will
# pick a different set every time it starts up. Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst

Mit einer weiteren Zeile „server <Eigener Zeitserver>“ kann man eigene Zeitserver hinzufügen oder die vorhanden ersetzen.

Damit der Dienst nur als NTP-Client läuft, sollten Zugriffe von außen nicht zugelassen werden:

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

Unter Windows wird die Zeit automatisch aktualisiert. Standardmäßig mit dem Server „time.windows.com“. Wer hier einen eigenen Server einstellen möchte kann dies unter Windows 7 (auch Server 2008 R2) über die Systemsteuerung -> „Datum und Uhrzeit“ -> Register „Internetzeit“ -> „Mit einem Internetzeitserver synchronisieren“ -> „Server:“ einstellen. Der eigene Server ist manuell in dem Auswahlfeld einzugeben.

Eigenen Zeitserver unter Linux einrichten

Da der Linux NTP-Daemon ntpd sowieso läuft, kann man ihn für sein eigenes Netz auch als Zeitserver freigeben. Dazu müssen nur der Zugriff auf den Zeitserver aus dem lokalen Subnetz (hier 192.168.1.0) freigegeben werden:

# erlaubt lesenden Zugriff im lokalen Netz 192.186.1.0/24
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

Wer eine Firewall auf seinem Rechner betreibt, muss dafür noch den UDP-Port 123 freigeben. Bei IP-Tables sieht das wie folgt aus:

iptables -A INPUT -p udp --dport 123 -s 192.168.1.0/24 -j ACCEPT