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

logrotate Konfiguration Apache2

Diese Konfiguration nutze ich für Apache2 VirtualHosts. Dabei liegen die von Apache angelegten Logfiles unter „/var/log/apache2/<vhostName>/“. Die Konfiguration des Speicherortes passiert in der VirtualHost-Konfiguration.

/var/log/apache2/<vhostName>/*.log {
       weekly
       missingok
       rotate 52
       compress
       dateext
       notifempty
       create 640 root adm
       olddir /var/log/apache2/<vhostName>/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/<ConfigDatei>
reading config info for /var/log/apache2/<vhostName>/*.log
olddir is now /var/log/apache2/<vhostName>/old/

Handling 1 logs

rotating pattern: /var/log/apache2/<vhostName>/*.log  weekly (52 rotations)
olddir is /var/log/apache2/<vhostName>/old/, empty log files are not rotated, old logs are removed
considering log /var/log/apache2/<vhostName>/access.log
  log does not need rotating
considering log /var/log/apache2/<vhostName>/error.log
  log does not need rotating

logrotate Konfiguration iptables

Diese Konfiguration nutze ich für iptables. Dabei liegen die angelegten Logfiles unter „/var/log/iptables/“. Die Konfiguration des Speicherortes passiert in der iptables-Konfiguration.

/var/log/iptables/*.log {
       daily
       missingok
       rotate 90
       compress
       dateext
       notifempty
       create 640 root adm
       olddir /var/log/iptables/old/
}

Das Verzeichnis für die alten Logs muss manuell angelegt werden.

Zur Überprüfung der Konfiguration sollte man diese testen:

/usr/sbin/logrotate -d /etc/logrotate.d/iptables

Dann müsste ungefähr folgendes erscheinen:

/usr/sbin/logrotate -d /etc/logrotate.d/iptables
reading config file /etc/logrotate.d/iptables
reading config info for /var/log/iptables/*.log
olddir is now /var/log/iptables/old/

Handling 1 logs

rotating pattern: /var/log/iptables/*.log  after 1 days (90 rotations)
olddir is /var/log/iptables/old/, empty log files are not rotated, old logs are removed
considering log /var/log/iptables/accept.log
  log does not need rotating
considering log /var/log/iptables/drop.log
  log does not need rotating

 

read

Zeilenweise Möglichkeiten

Wenn man Informationen interaktiv vom Benutzer oder zeilenweise aus Dateien benötigt, kann auf das Programm read zurückgreifen. Zusätzlich kann man über einen angegebenen Separator auf einzelne Felder in einer Zeile zurückgreifen. Dazu habe ich hier merkenswerte Mehrzeiler aufgeschrieben.

Linux Benutzer für SQL-Import vorbereiten

#!/bin/bash
# exportUser2SQL.sh
# Exportiert alle User aus der /etc/passwd in ein SQL-Dump-File
#
rm ~/insertIntoUsers.sql
while IFS=':' read uid password uidNumber gidNumber gecos home shell; do
        echo "INSERT INTO users values ('$uid','x',$uidNumber,$gidNumber,'$gecos','$home','$shell');" >> ~/insertIntoUsers.sql;
done < /etc/passwd
-- insertIntoUsers.sql
INSERT INTO users VALUES ('root','x',0,0,'root','/root','/bin/bash');
INSERT INTO users VALUES ('bin','x',1,1,'bin','/bin','/sbin/nologin');
INSERT INTO users VALUES ('daemon','x',2,2,'daemon','/sbin','/sbin/nologin');
INSERT INTO users VALUES ('adm','x',3,4,'adm','/var/adm','/sbin/nologin');
INSERT INTO users VALUES ('lp','x',4,7,'lp','/var/spool/lpd','/sbin/nologin');
INSERT INTO users VALUES ('sync','x',5,0,'sync','/sbin','/bin/sync');
INSERT INTO users VALUES ('shutdown','x',6,0,'shutdown','/sbin','/sbin/shutdown');
INSERT INTO users VALUES ('halt','x',7,0,'halt','/sbin','/sbin/halt');
INSERT INTO users VALUES ('mail','x',8,12,'mail','/var/spool/mail','/sbin/nologin');
INSERT INTO users VALUES ('news','x',9,13,'news','/etc/news','');
INSERT INTO users VALUES ('uucp','x',10,14,'uucp','/var/spool/uucp','/sbin/nologin');
INSERT INTO users VALUES ('operator','x',11,0,'operator','/root','/sbin/nologin');
INSERT INTO users VALUES ('games','x',12,100,'games','/usr/games','/sbin/nologin');
INSERT INTO users VALUES ('gopher','x',13,30,'gopher','/var/gopher','/sbin/nologin');
INSERT INTO users VALUES ('ftp','x',14,50,'FTP User','/var/ftp','/sbin/nologin');
INSERT INTO users VALUES ('nobody','x',99,99,'Nobody','/','/sbin/nologin');
INSERT INTO users VALUES ('nscd','x',28,28,'NSCD Daemon','/','/sbin/nologin');
INSERT INTO users VALUES ('vcsa','x',69,69,'virtual console memory owner','/dev','/sbin/nologin');
INSERT INTO users VALUES ('pcap','x',77,77,'','/var/arpwatch','/sbin/nologin');
INSERT INTO users VALUES ('dbus','x',81,81,'System message bus','/','/sbin/nologin');
INSERT INTO users VALUES ('rpc','x',32,32,'Portmapper RPC user','/','/sbin/nologin');
INSERT INTO users VALUES ('mailnull','x',47,47,'','/var/spool/mqueue','/sbin/nologin');
INSERT INTO users VALUES ('smmsp','x',51,51,'','/var/spool/mqueue','/sbin/nologin');
INSERT INTO users VALUES ('sshd','x',74,74,'Privilege-separated SSH','/var/empty/sshd','/sbin/nologin');
INSERT INTO users VALUES ('rpcuser','x',29,29,'RPC Service User','/var/lib/nfs','/sbin/nologin');
INSERT INTO users VALUES ('nfsnobody','x',65534,65534,'Anonymous NFS User','/var/lib/nfs','/sbin/nologin');
INSERT INTO users VALUES ('haldaemon','x',68,68,'HAL daemon','/','/sbin/nologin');
INSERT INTO users VALUES ('avahi-autoipd','x',100,102,'avahi-autoipd','/var/lib/avahi-autoipd','/sbin/nologin');
INSERT INTO users VALUES ('ntp','x',38,38,'','/etc/ntp','/sbin/nologin');
INSERT INTO users VALUES ('avahi','x',70,70,'Avahi daemon','/','/sbin/nologin');
INSERT INTO users VALUES ('apache','x',48,48,'Apache','/var/www','/sbin/nologin');
INSERT INTO users VALUES ('hsqldb','x',96,96,'','/var/lib/hsqldb','/sbin/nologin');
INSERT INTO users VALUES ('xfs','x',43,43,'X Font Server','/etc/X11/fs','/sbin/nologin');
INSERT INTO users VALUES ('gdm','x',42,42,'','/var/gdm','/sbin/nologin');

Linux Gruppen für SQL-Import vorbereiten

#!/bin/bash
# exportGroupMember2SQL.sh
# Wer die Informationen aus den Linux-Gruppen in einer Datenbank
# benötigt, kann sich diese einfach als INSERT-Statements vorbereiten:
rm ~/insertIntoGroups.sql
rm ~/insertIntoMembers.sql
while IFS=':' read gid password gidNumber members; do
        echo "INSERT INTO groups values ('$gid','$password',$gidNumber);" >> ~/insertIntoGroups.sql;
        # Kommas durch Leerzeichen ersetzen, damit FOR-Schleife genutzt werden kann.
        grpmembers=$(echo $members | tr ',' ' ')
        for member in $grpmembers; do
                echo "INSERT INTO members values($gidNumber,'$member');" >> ~/insertIntoMembers.sql;
        done
done < /etc/group
-- insertIntoGroups.sql
INSERT INTO groups VALUES ('root','x',0);
INSERT INTO groups VALUES ('bin','x',1);
INSERT INTO groups VALUES ('daemon','x',2);
INSERT INTO groups VALUES ('sys','x',3);
INSERT INTO groups VALUES ('adm','x',4);
INSERT INTO groups VALUES ('tty','x',5);
INSERT INTO groups VALUES ('disk','x',6);
INSERT INTO groups VALUES ('lp','x',7);
INSERT INTO groups VALUES ('mem','x',8);
INSERT INTO groups VALUES ('kmem','x',9);
INSERT INTO groups VALUES ('wheel','x',10);
INSERT INTO groups VALUES ('mail','x',12);
INSERT INTO groups VALUES ('news','x',13);
INSERT INTO groups VALUES ('uucp','x',14);
INSERT INTO groups VALUES ('man','x',15);
INSERT INTO groups VALUES ('games','x',20);
INSERT INTO groups VALUES ('gopher','x',30);
INSERT INTO groups VALUES ('dip','x',40);
INSERT INTO groups VALUES ('ftp','x',50);
INSERT INTO groups VALUES ('lock','x',54);
INSERT INTO groups VALUES ('nobody','x',99);
INSERT INTO groups VALUES ('users','x',100);
INSERT INTO groups VALUES ('nscd','x',28);
INSERT INTO groups VALUES ('utmp','x',22);
INSERT INTO groups VALUES ('utempter','x',35);
INSERT INTO groups VALUES ('floppy','x',19);
INSERT INTO groups VALUES ('vcsa','x',69);
INSERT INTO groups VALUES ('pcap','x',77);
INSERT INTO groups VALUES ('slocate','x',21);
INSERT INTO groups VALUES ('dbus','x',81);
INSERT INTO groups VALUES ('audio','x',63);
INSERT INTO groups VALUES ('rpc','x',32);
INSERT INTO groups VALUES ('mailnull','x',47);
INSERT INTO groups VALUES ('smmsp','x',51);
INSERT INTO groups VALUES ('sshd','x',74);
INSERT INTO groups VALUES ('ecryptfs','x',101);
INSERT INTO groups VALUES ('rpcuser','x',29);
INSERT INTO groups VALUES ('nfsnobody','x',65534);
INSERT INTO groups VALUES ('haldaemon','x',68);
INSERT INTO groups VALUES ('avahi-autoipd','x',102);
INSERT INTO groups VALUES ('ntp','x',38);
INSERT INTO groups VALUES ('avahi','x',70);
INSERT INTO groups VALUES ('apache','x',48);
INSERT INTO groups VALUES ('hsqldb','x',96);
INSERT INTO groups VALUES ('xfs','x',43);
INSERT INTO groups VALUES ('gdm','x',42);
-- insertIntoMembers.sql
INSERT INTO members VALUES(0,'root');
INSERT INTO members VALUES(1,'root');
INSERT INTO members VALUES(1,'bin');
INSERT INTO members VALUES(1,'daemon');
INSERT INTO members VALUES(2,'root');
INSERT INTO members VALUES(2,'bin');
INSERT INTO members VALUES(2,'daemon');
INSERT INTO members VALUES(3,'root');
INSERT INTO members VALUES(3,'bin');
INSERT INTO members VALUES(3,'adm');
INSERT INTO members VALUES(4,'root');
INSERT INTO members VALUES(4,'adm');
INSERT INTO members VALUES(4,'daemon');
INSERT INTO members VALUES(6,'root');
INSERT INTO members VALUES(7,'daemon');
INSERT INTO members VALUES(7,'lp');
INSERT INTO members VALUES(10,'root');
INSERT INTO members VALUES(12,'mail');
INSERT INTO members VALUES(13,'news');
INSERT INTO members VALUES(14,'uucp');
INSERT INTO members VALUES(63,'gdm');

LVM einrichten

Benötigte Pakete

Wenn noch nicht vorhanden, muss lvm installiert werden:

aptitude install lvm2

Wie ihr ein Logical Volume nachträglich verkleinert, könnt ihr hier nachlesen.

Logical Volume hinzufügen

Ich beschreibe hier das nachträgliche Hinzufügen einer lvm-Partition für den Ordner /var/backups unter Debian Squeeze, um eine bereits vorhandene volle Festplatte zu entlasten.

Ausgangslage

Eine Ausgabe von fdisk -l und df -h schafft einen Überblick über die Ausgangslage

root# fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00081015

Device Boot Start End Blocks Id System
/dev/sda1 * 1 993 7976241 83 Linux
/dev/sda2 994 1044 409657+ 5 Extended
/dev/sda5 994 1044 409626 82 Linux swap / Solaris

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x380b6e17

Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 8e Linux LVM


Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xfeb5b445

Device Boot Start End Blocks Id System
/dev/sdc1 1 1305 10482381 8e Linux LVM
root# df -h
Dateisystem Size Used Avail Use% Eingehängt auf
/dev/sda1 7,5G 5,5G 1,7G 78% /
tmpfs 506M 0 506M 0% /lib/init/rw
udev 501M 104K 501M 1% /dev
tmpfs 506M 0 506M 0% /dev/shm

Wie zu erkennen ist, ist die einzig vorhandene Partion schon recht voll, so dass ich diese, durch Auslagern des Orderns /var/backups entlasten will. Zudem sind bereits zwei Festplatten zu sehen, auf den jeweils eine primäre Partition mit lvm als Partitionierungssystem eingerichtet sind.

PV, VG und LV einrichten…

…bedeutet nix anderes, als eine Partition für lvm zu aktivieren (Physical Volume erstellen).

root# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created

Darauf wird dann eine Volume Group eingerichtet, die als Pool mehrere Physical Volumes aufnehmen kann. So kann man z.B. mehrere Festplatten innerhalb einer Volume Group verwenden. Hier sollte ein nicht all zu langer Name vergeben werden.

root# # vgcreate vg1 /dev/sdc1
Volume group "vg1" successfully created

Mit vgdisplay kann man sich dann die Einzelheiten zu der gerade eingerichteten Volume Group anschauen. Interessant ist dabei der Wert „Free PE“, der die Physikalischen Einheiten angibt, die noch für Logical Volumes zur Verfügung stehen.

# vgdisplay
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 10,00 GiB
PE Size 4,00 MiB
Total PE 2559
Alloc PE / Size 0 / 0
Free PE / Size 2559 / 10,00 GiB
VG UUID GcAW6r-L2Lp-DCkA-k3P3-al0Q-kCRf-5UXYFu

Danach erstelle ich noch ein Logical Volume (LV) mit der maximalen Anzahl (2559) von freien Physikalischen Einheiten (siehe oben). Würde man hier beim erstellen die angezeigten 10G angeben, bekäme man eine Fehlermeldung, dass nicht genügend freier Speicherplatz in der Volume Group vorhanden ist.

# lvcreate -l 2559 -n backups vg1
Logical volume "backup" created

Dateisystem einrichten

Jetzt muss das Dateisystem auf der neuen Partition noch eingerichtet werden. Ich wähle dazu hier ext3.

root# mkfs.ext3 /dev/vg1/backups
mke2fs 1.41.12 (17-May-2010)
Dateisystem-Label=
OS-Typ: Linux
Blockgröße=4096 (log=2)
Fragmentgröße=4096 (log=2)
Stride=0 Blöcke, Stripebreite=0 Blöcke
655360 Inodes, 2620416 Blöcke
131020 Blöcke (5.00%) reserviert für den Superuser
Erster Datenblock=0
Maximale Dateisystem-Blöcke=2684354560
80 Blockgruppen
32768 Blöcke pro Gruppe, 32768 Fragmente pro Gruppe
8192 Inodes pro Gruppe
Superblock-Sicherungskopien gespeichert in den Blöcken:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Schreibe Inode-Tabellen: erledigt
Erstelle Journal (32768 Blöcke): erledigt
Schreibe Superblöcke und Dateisystem-Accountinginformationen: erledigt

Das Dateisystem wird automatisch nach jeweils 31 Einhäng-Vorgängen bzw.
alle 180 Tage überprüft, je nachdem, was zuerst eintritt. Dies kann durch
tune2fs -c oder -i geändert werden.

Mounten und Datenübernahme

Zuerst muss die erstellte Partition temporär gemountet werden, damit die alten Daten übernommen werden können:

root# mkdir /mnt/backups
root# mount -t ext3 /dev/mapper/vg1-backups /mnt/backups

Wie zu erkennen ist, habe ich die Verknüpfung über den Device-Mapper genutzt. Jetzt können die Daten verschoben werden. ACHTUNG: Die Dateien dürfen sich nicht im Zugriff befinden!

root# mv /var/backups/* /mnt/backups/
root# ls -alh /var/backups/
insgesamt 0

Danach kann die Partion aus dem temporären Speicherort ausgehängt und in den endgültigen Speicherort eingehängt werden:

root# umount /mnt/backups
root# mount -t ext3 /dev/mapper/vg1-backups /var/backups

Bitte nach Beendigung der Arbeit die Anpassungen in der /etc/fstab nicht vergessen!

Wie ihr ein Logical Volume nachträglich verkleinert, könnt ihr hier nachlesen.

logrotate Konfiguration Icinga

Diese Konfiguration nutze ich für Icinga. Dabei liegt das von Icinga angelegte Logfiles unter „/var/log/icinga/„. Die Konfiguration des Speicherortes passiert in der Icinga-Hauptkonfigurationsdatei „/etc/icinga.cfg„. In Icinga2 erfolgt die Konfiguration in der Datei „/etc/icinga2/features-available/mainlog.conf“ und zeigt standardmäßig auf „/var/log/icinga2/„.

/var/log/icinga/*.log {
       weekly
       missingok
       rotate 52
       compress
       dateext
       notifempty
       create 640 icinga adm
       olddir /var/log/icinga/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/icinga
reading config info for /var/log/icinga/*.log
olddir is now /var/log/icinga/old/

Handling 1 logs

rotating pattern: /var/log/icinga/*.log weekly (52 rotations)
olddir is /var/log/icinga/old/, empty log files are not rotated, old logs are removed
considering log /var/log/icinga/icinga.log
log does not need rotating

Erreichbarkeit der FritzBox im Notfall

Erreichbarkeit über IP-Adresse

Wenn die IP-Konfiguration mal gespeichert ist, wird die aktuelle Netzwerk-Verbindung gekappt und versucht wieder neu aufzubauen. Ist dabei ein Fehler unterlaufen, ist die Fritz!Box über den normalen Weg nicht mehr erreichbar.

Glücklicherweise hat AVM diesen Notfall bedacht und eine feste zusätzliche Notfall-IP eingerichtet. Die Fritz!Box kann also immer unter http://169.254.1.1 erreicht werden. Diese IP liegt zufälligerweise 😉 in dem per RFC 3927 festgelegten APIPA-Netzwerk (Automatic Private IP Addressing) 169.254.0.0/16, dass genau dann zum Tragen kommt, wenn der Client-Computer keine Adresse per DHCP zugewiesen bekommt.

Sollte diese automatische Konfiguration nicht funktionieren oder es ist eine statische IP-Adresse eingetragen, muss diese manuell angepasst werden. Z.B. mit diesen Werten:

  • IP-Adresse: 169.254.1.100
  • Subnetzmaske: 255.255.0.0
  • Gateway: 169.254.1.1
  • DNS-Server: 169.254.1.1

Zurücksetzen der Fritz!Box per Telefon

Wenn alles nichts mehr hilft und kein Weg auf die Fritz!Box funktioniert hilft nur ein Reset auf die Werkseinstellungen. Nur wie, wenn die Weboberfläche nicht erreichbar ist?

Na per Telefon. Auch für diesen Fall hat sich AVM eine Lösung einfallen lassen. Fast alle Fritz!Boxen haben analoge oder digitale (ISDN) Telefonanschlüsse. Dort einfach ein handelsübliches Telefon angeschlossen und folgende Kombination auf der Telefontastatur eingeben:

 #991*15901590*

info Die Fritz!Box muss dafür natürlich eingeschaltet sein ;-).

 

 Danach fängt die Fritz!Box an zu arbeiten und startet sich anschließend neu. Dieser Vorgang kann bis zu 5 Minuten dauern.

Danach sollte der Router mindestens wieder über die oben genannte Notfall-IP erreichbar sein. Bei einem angeschlossenen Rechner mit aktiviertem DHCP sollte man jetzt auch eine IP-Adresse automatisch zugewiesen bekommen. Über den Konsolen-Befehl:

ipconfig /all

unter Windows bzw.

ifconfig -a

unter Linux sollte man sich jetzt seine IP-Adress-Konfiguration ansehen können. Die IP-Adresse des Standard-Gateways ist die der Fritz!Box.

Vim – Erweiterung des Texteditors vi

Suchen und Ersetzen mit vim

Hier mal die Suchen-Ersetzen-Möglichkeiten aus dem vimtutor:

Um das ERSTE Vorkommen von alt in einer Zeile durch neu zu ersetzen, tippe
 :s/alt/neu
Um ALLE Vorkommen von alt in einer Zeile durch neu zu ersetzen, tippe
 :s/alt/neu/g
Um Ausdrücke innerhalb von zwei Zeilen zu ersetzen, tippe
 :#,#s/alt/neu/g
Um alle Vorkommen in der ganzen Datei zu ersetzen, tippe
 :%s/alt/neu/g
Um jedes Mal nach einer Bestätigung gefragt zu werden, füge 'c' hinzu.
 :%s/alt/neu/gc (*c*onfirm)

Suchoptionen für vim

Manchmal sucht man ein Wort, findet es in vim aber nicht, weil bei der Suche standardmäßig die Groß-/Kleinschreibung unterschieden wird. Das bekommt durch das Setzen der Option „ignore case“ weg:

:set ic

Zusätzlich kann man sich die Fundstellen über die Option „hlsearch“ hervorheben lassen:

:set hls

Die inkrementelle Suche ist nur meines Erachtens gewöhnungsbedürftig:

:set is

Alle Optionen kann man sich natürlich auch dauerhaft in der zentral Datei /etc/vim/vimrc oder in der userspezifischen Datei ~/.vimrc speichern:

# Suchoptionen für vim :set ic hls is

Wer sich diese Optionen dauerhaft speichern will, kann das entweder für sich persönlich in der Datei ~/.vimrc oder zentral für alle Benutzer in /etc/vim/vimrc.local. Soll eine Konfiguration für alle zukünftigen Benutzer angelegt werden, muss diese im Verzeichnis /etc/skel abgelegt werden. Von dort werden alle Dateien in das Home-Verzeichnis des neuen Benutzers kopiert.

Universalwerkzeug sed

Einfaches Ersetzen in Dateien

Manchmal will einfach nur einen Wert an allen Stellen in einer Datei ersetzen:

sed -i 's/Alter Wert/Neuer Wert/g' /PfadZurDatei/Dateiname

Ersetzen von Text an gefundenen Stellen.

Manchmal muss es aber etwas aufwändiger sein. Wenn man z.B. einen String in einem Text sucht und in der gefundenen Zeile einen zweiten String ersetzen will. Hier am Beispiel einer NTP-Konfiguraton:

sed -i '/^server\ [0-3]\.debian\.pool\.ntp\.org/ s/server/#server/g' /etc/ntp.conf

Hier wird in der NTP-Konfiguration nach den Server-Einträgen gesucht (0.debian.pool.ntp.org, 1.debian.pool.ntp.org,2.debian.pool.ntp.org und 3.debian.pool.ntp.org). Diese Zeilen werden auskommentiert, um z.B. eigene NTP-Server für die Kerberos-Authentifizierung zu konfigurieren.

Wer öfter mit vim arbeitet, dem wird die Suchen-/Ersetzen-Formation bekannt vorkommen. Weitere Such-Ersetz-Möglichkeiten kann man hier nachlesen.