Dateien rekursiv in Verzeichnissen zählen

Damit kann man alle Dateien in einem Verzeichnis zählen inklusive der enthaltenen Unterordnern.

find <Ordner> -type f | wc -l

Wenn man zwei Ordner z.B. mit gleichem Namen hat (durch rsync), kann man das auch zum Vergleichen nutzen:

Ordner=<OrdnerName> && find <Pfad1>$Ordner -type f | wc -l && find <Pfad2>$Ordner -type f | wc -l

Master Boot Record (MBR) zurücksetzen

Mit einer Linux-Live-CD kann man relativ einfach einen Master Boot Record zurücksetzen, um eine leere Partitionstabelle zu bekommen. Dazu einfach auf der Konsole folgenden Befehl eingeben:

dd if=/dev/zero of=/dev/sdx bs=512 count=1

Dieser Befehl schreibt in die ersten 512 Byte der anzugebenden SATA-Festplatte Nullen rein. Sollten noch IDE-Festplatten im Einsatz sein, muss es nicht „sdx“, sondern „hdx“ lauten. Das x ist durch den Buchstaben der gewünschten Festplatte zu ersetzen.

SSH absichern

SSH

Der Root muss sich nicht per SSH einloggen können. Es ist besser, wenn sich nur Benutzer einloggen und hinterher zum Root machen. Um das zu ändern muss in der

/etc/ssh/sshd_config

der entsprechende Parameter von

PermitRootLogin yes

auf

PermitRootLogin no

geändert werden. Das kann man entweder von Hand machen oder zu Übung mit sed:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak && sed -e 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new && cp /etc/ssh/sshd_config.new /etc/ssh/sshd_config

Mit dieser Zeile wird die Originaldatei gesichert, der Parameter ersetzt und alles in eine neue Datei geschrieben. Diese neue Datei ersetzt dann durch Kopieren die Original-Datei. Hinterher sind folgende Dateien vorhanden:

# ls -alh /etc/ssh/sshd_config*
 -rw-r--r-- 1 root root 1,9K 13. Jun 13:42 /etc/ssh/sshd_config
 -rw-r--r-- 1 root root 1,9K 13. Jun 13:42 /etc/ssh/sshd_config.bak
 -rw-r--r-- 1 root root 1,9K 13. Jun 13:42 /etc/ssh/sshd_config.new

so dass jederzeit auf die gewünschte Konfiguration gewechselt/zurückgesetzt werden kann.

Jetzt noch ein

# /etc/init.d/ssh reload

damit die Konfiguration noch aktiv wird. Durch den Reload bleiben aktuell aufgebaute Sessions aktiv!

Grub absichern

Um sicherzustellen, dass ein Benutzer, der das System rebootet und Zugriff auf die Konsole hat, nicht einfach am Bootprompt

init=/bin/sh

eingibt und sich damit eine Single-User-Shell erschleicht und einfach in das System einbrechen kann, sollte man den Bootprompt absichern. Nichts einfacher als das.

Zuerst sollte man sich einen md5-Hash für das Grub-Passwort erzeugen. Schön, dass Grub dafür gleich das entsprechende Werkzeug mitbringt:

grub-md5-crypt
Password:
Retype password:
$1$Ki6fc/$TdYOWM/XokvdhZoF/B/8v.

Dazu also einfach den o.g. Befehl aufrufen, zwei Mal das gewünschte Passwort eingeben und man erhält einen md5-Hash, den Grub verwenden kann. Wer es gerne ausprobieren möchte, das Passwort ist „test“.

Jetzt zur Konfiguration. Die erfolgt in

/boot/grub/menu.lst

Hier unter dem Bereich

## password ['--md5'] passwd

folgende Zeile hinzufügen

password --md5 $1$Ki6fc/$TdYOWM/XokvdhZoF/B/8v.

Als MD5-Passwort-String ist der vorher generierte zu verwenden. Wie man der Beschreibung des Bereiches entnehmen kann, kann man das Passwort auch im Klartext setzen. Aber warum ein Sicherheitsrisiko eingehen, wenn es nicht notwendig ist.

Damit kann man die Boot-Prompt-Zeilen nicht mehr ohne Passwort editieren.

Schön und gut. Aber den Single-User-Modus, der automatisch von Grub immer mit eingerichtet wird kann immer noch gestartet werden. Um das zu verhindern, muss folgender Parameter geändert werden:

Von

# lockalternative=false

auf

# lockalternative=true

Damit muss dass Passwort auch für das Starten aller nicht-Default-Zeilen eingegeben werden.

Zum Schluss noch ein

update-grub

damit Grub, die lockalternative-Direktive übernimmt.

Webserver absichern

Ein Apache-Webserver gibt standardmäßig auftretende Fehler auf der Webseite aus. Dass kann durch provozierte Aufrufe zur Preisgabe von unerwünschten Informationen wie

  • lokaler Verzeichnispfad des Webservers
  • Apache-Version
  • PHP-Version
  • Patchlevel von Apache2/PHP

führen.

Daher sollten diese Informationen auf Produktivsystem nicht öffentlich angezeigt werden.

PHP

Dazu muss man nur in der entsprechenden php.ini (hier: /etc/php5/apache2/php.ini) das Anzeigen der Fehler abschalten (Off).

; Print out errors (as a part of the output). For production web sites,
; you're strongly encouraged to turn this feature off, and use error logging
; instead (see below). Keeping display_errors enabled on a production web site
; may reveal security information to end users, such as file paths on your Web
; server, your database schema or other information.
;
display_errors = Off

Für den Administrator sind diese Fehler natürlich trotzdem wichtig. Daher sollte man das Logging der Fehler einschalten (On).

; Log errors into a log file (server-specific log, stderr, or error_log (below))
; As stated above, you're strongly advised to use error logging in place of
; error displaying on production web sites.
;
log_errors = On

Die Fehlermeldungen werden in das error-Log der jeweiligen vHost- oder Standard-Konfiguration geschrieben.

Apache2

Auch der Apache2 kann noch etwas schweigsamer konfiguriert werden. Und damit das nicht so schwer fällt, ist es sogar schon vorbereitet.

Im Pfad „/etc/apache2/conf.d/“ existiert in Debian die Datei „security“. In dieser sind bereits die wichtigsten Einstellung vorhanden und müssen für Produktivsysteme nur noch aktiviert werden.

# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minimal | Minor | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Minimal
#ServerTokens Full
#ServerTokens Prod
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off

Kerberos-Authentifizierung

Allgemeines

Je weiter man in sicherheitsrelevante Netzwerke eintaucht, um so öfter begegnet man der Anforderung einer zentralen Benutzer-Authentifizierung. Klar man kann sich jetzt einen eigenen LDAP-Server mit openLDAP aufbauen, Schemata einrichten und mit Inhalten füllen. Wenn aber, wie in vielen Firmen, bereits ein Active Directory vorhanden ist, kann man ja auch gleich diese Möglichkeiten verwenden, oder? Also Kerberos-Utilities installiert, konfiguriert, Benutzer angelegt und los.

Ok, eine vollständige Integration, bei der neue Benutzer automatisch angelegt werden ist das nicht. Aber für die Administration von Linux-Servern über SSH wird das auch nicht unbedingt benötigt. Die Personen, die das System betreuen sind meistens überschaubar oder können z.B. durch Software-Verwaltungen wie Puppet angelegt werden.

Ich beschreibe hier die Einrichtung der Kerberos-Authentifizierung für Ubuntu/Debian. Für RPM-basierte Systeme müssen ggf. die notwendigen Pakete bzw. die Pfade angepasst werden.

Benötigte Pakete

Für Kerberos ist eine Zeitsynchronisation essentiell. Daher ist NTP Pflicht. Zusätzlich natürlich die Kerberos-Utilities:

apt-get install ntp ntpdate libpam-krb5 krb5-user

Konfiguration

NTP

Die Standard-Werte helfen uns in diesem Fall nicht weiter, da es darauf ankommt die gleiche Zeit wie der Kerberos-Server zu haben. Also müssen die vorhandenen Domain-Controller „herhalten“. Das ganze habe ich als sed-Statements zusammengeschrieben, damit ich es jedes Mal einfach auf die NTP-Konfigurationsdatei /etc/ntp.conf anwenden kann.

Backup der ntp.conf anlegen:

cp /etc/ntp.conf /etc/ntp.conf.bak

Domain-Controller angeben:

dc1=dc1.domain.tld
dc2=10.10.0.1

NTP-Sed für Debian:

sed -i 's/^server 0.debian.pool.ntp.org iburst/#server 0.debian.pool.ntp.org iburst/g' /etc/ntp.conf
sed -i 's/^server 1.debian.pool.ntp.org iburst/#server 1.debian.pool.ntp.org iburst/g' /etc/ntp.conf
sed -i 's/^server 2.debian.pool.ntp.org iburst/#server 2.debian.pool.ntp.org iburst/g' /etc/ntp.conf
sed -i 's/^server 3.debian.pool.ntp.org iburst/#server 3.debian.pool.ntp.org iburstnserver $dc2nserver $dc1/g' /etc/ntp.conf

NTP-Sed für Ubuntu:

sed -i 's/^server 0.ubuntu.pool.ntp.org/#server 0.ubuntu.pool.ntp.org/g' /etc/ntp.conf
sed -i 's/^server 1.ubuntu.pool.ntp.org/#server 1.ubuntu.pool.ntp.org/g' /etc/ntp.conf
sed -i 's/^server 2.ubuntu.pool.ntp.org/#server 2.ubuntu.pool.ntp.org/g' /etc/ntp.conf
sed -i 's/^server 3.ubuntu.pool.ntp.org/#server 3.ubuntu.pool.ntp.orgnserver $dc2nserver $dc1/g' /etc/ntp.conf

Kerberos

Nun muss noch die Verbindung zu den Domain-Controllern konfiguriert werden. Die notwendigen Schreibweisen habe ich durch die entsprechenden Umformatierungen bereits eingebaut. Es müssen nur die Werte für WORKGROUP, DOMAIN und DOMAIN-CONTROLLER angegeben werden:

# benötigte Variablen sicherheitshalber zurücksetzen
unset adm
unset kdc
# Workgroup
ownwg=OWNWORKGROUP
# Domäne angeben
owndomain=DOMAIN.TLD
# Domänen-Controller
dc[0]=dc1.domain.tld
dc[1]=dc2.domain.tld
### Nicht mehr ändern
DOMAIN=$(echo $owndomain | tr '[:lower:]' '[:upper:]')
domain=$(echo $owndomain | tr '[:upper:]' '[:lower:]')
WORKGROUP=$(echo $ownwg | tr '[:lower:]' '[:upper:]')
workgroup=$(echo $ownwg | tr '[:upper:]' '[:lower:]')
for i in "${dc[@]}"; do
  kdc=$(echo -e "kdc = $int$kdc")
  adm=$(echo -e "admin_server = $int$adm")
done
 
cat > /etc/krb5.conf << EOF
[libdefaults]
        default_realm = $DOMAIN
        clockskew = 300
        kdc_timesync = 1
        forwardable = true
        proxiable = true
 
[realms]
$DOMAIN = {
        $kdc
        default_domain = $DOMAIN
        $adm
}
 
 
 
[logging]
        kdc = FILE:/var/log/krb5/krb5kdc.log
        admin_server = FILE:/var/log/krb5/kadmind.log
#       default = SYSLOG:NOTICE:DAEMON
        default = FILE:/var/log/krb5.log
[domain_realm]
        .$WORKGROUP = $DOMAIN
        $WORKGROUP= $DOMAIN
[appdefaults]
pam = {
        ticket_lifetime = 6h
        renew_lifetime = 6h
        forwardable = true
        proxiable = false
        retain_after_close = false
        minimum_uid = 1
        use_shmem = sshd
}
EOF

Benutzer anlegen

Wie oben bereits erwähnt wurde lediglich die Verbindung zum Kerberos-Server konfiguriert, damit bestehende Benutzer authentifiziert werden können. Die Benutzer müssen aber weiterhin manuell angelegt werden. Dies muss mit dem Kontonamen aus der Domäne erfolgen:

useradd -s /bin/bash -m $SAM-Account

Um das zu testen, kann man sich jetzt ein Kerberos-Ticket ausstellen lassen:

kinit $SAM-Account
klist

Fallstricke

Zeitunterschied zu groß

Bei Kerberos darf der Zeitunterschied zwischen Client und Server maximal 5 Minuten sein. Sollte die Anmeldung mal nicht funktionieren unbedingt die Zeitsynchronisation prüfen und ggf. manuell synchronisieren:

# NTP-Dienst anhalten
/etc/init.d/ntp stop
# Manuelle Synchronisation
ntpdate dc1.domain.tld
# NTP-Dienst wieder starten
/etc/init.d/ntp start
# NTP kontrollieren
ntpq -p

Installations-Benutzer kann Passwort nicht ändern

In der Standard-Konfiguration kann der Benutzer, der bei der Installation angelegt wurde, sein Passwort nicht mehr ändern. Grund dafür ist die PAM-Konfiguration, die die Passwortänderung für alle Benutzer aber UID>=1000 an Kerberos weiterleitet. Da der Installationsbenutzer dort aber wahrscheinlich nicht existiert, schlägt die Änderung fehl.

# z.B. in /etc/pam.d/common-auth kontrollieren:
# auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000

Dies lässt sich aber sehr leicht durch das Austauschen der entsprechenden Zeile ändern:

sed -i 's/pam_krb5.so minimum_uid=1000/pam_krb5.so minimum_uid=1001/g' /etc/pam.d/common-*

Damit werden in allen common-Dateien unterhalb von /etc/pam.d/ die uid von 1000 auf 1001 hochgesetzt.

# auth [success=2 default=ignore] pam_krb5.so minimum_uid=1001

Dadurch wird der Installationsbenutzer wieder nur noch lokal authentifiziert.

mdadm checkarray auto-read-only

05Fehlermeldung:
checkarray: W: array md1 in auto-read-only state, skipping...

Ausgabe mdstat:

Server:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0] sdb3[1]
      1949367168 blocks [2/2] [UU]
md1 : active (auto-read-only) raid1 sda2[0] sdb2[1]
      3903680 blocks [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[1]
      240832 blocks [2/2] [UU]
unused devices: <none>

Wenn das Array neu eingerichtet und noch nie genutzt wurde, steht es noch im Zustand „auto-read-only“. Dadurch kann der Raid-Verbund nicht geprüft werden. Bei mir ist md1 das Raid-1-Array mit der Swap-Datei. Da mein Rechner relativ frisch installiert ist, wurde der SWAP noch nicht genutzt. Abhilfe schafft folgende Vorgehensweise:

# Alle Swap-Dateien aus /proc/swaps deaktivieren
Server:~# swapoff -a
# SWAP-Dateisystem auf das gemeldete Gerät (bei mir md1) schreiben
Server:~# mkswap /dev/md1
# Alle Swap-Dateien aus /proc/swaps aktivieren
Server:~# swapon -a

Ausgabe mdstat danach:

Server:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0] sdb3[1]
      1949367168 blocks [2/2] [UU]
md1 : active raid1 sda2[0] sdb2[1]
      3903680 blocks [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[1]
      240832 blocks [2/2] [UU]
unused devices: <none>

Und schon klappt der Check wieder:

Server:~# /usr/share/mdadm/checkarray --quiet /dev/md1
Server:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0] sdb3[1]
      1949367168 blocks [2/2] [UU]
md1 : active raid1 sda2[0] sdb2[1]
      3903680 blocks [2/2] [UU]
      [===>.................] check = 19.4% (758272/3903680) finish=0.6min speed=84252K/sec
md0 : active raid1 sda1[0] sdb1[1]
      240832 blocks [2/2] [UU]
unused devices: <none>

Weitere Infos dazu im Debian Bug Tracker

vim als Standard-Editor festlegen

Ich ziehe vim nano für die Arbeit mit Textdateien vor. Um ihn als Standardeditor unter Debian festzulegen, muss einfach der den Link für den bevorzugten Editor ändern. Dann kann man z.B. seine crontab wieder mit vim bearbeiten.

Server:~# ls -alh /etc/alternatives/editor
lrwxrwxrwx 1 root root 12 29. Apr 07:46 /etc/alternatives/editor -> /usr/bin/nano
Server:~# rm /etc/alternatives/editor
Server:~# ln -s /usr/bin/vim /etc/alternatives/editor
Server:~# ls -alh /etc/alternatives/editor
lrwxrwxrwx 1 root root 12 29. Apr 07:46 /etc/alternatives/editor -> /usr/bin/vim

Konsolenauflösung vergrößern unter Debian Squeeze

In Squeeze hat sich diese Änderung auf einen Eintrag reduziert. Anfangs musste nur noch die folgende Zeile in der Datei /etc/default/grub erweitert werden:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=0x0305"

Den Erweiterungsteil habe ich fett/kursiv markiert. Allerdings ist diese Konfiguration bereits überholt (deprecated).

Aktuell muss mann nur noch den GFXMODE in der Datei o.g. Datei angeben:

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE=1024x768

Damit diese Einstellung auch nach dem abgeschlossenen Boot-Vorgang noch aktiv ist, muss diese als permanent markiert werden. Das erfolgt in der Datei /etc/grub.d/00_header:

if loadfont `make_system_path_relative_to_its_root 
 "${GRUB_FONT_PATH}"` ; then
 set gfxmode=${GRUB_GFXMODE}
 set gfxpayload=keep
 load_video
 insmod gfxterm
fi

Dazu die Zeile set gfxpayload=keep unterhalb der Zeile set gfxmode=${GRUB_GFXMODE} einfügen.

Danach noch die GRUB Konfigurationsdateien aktualisieren:

update-grub

Danke an Pronto, auf dessen Webseite, ich diesen Tipp gefunden habe.

Konsolenauflösung vergrößern unter Debian Lenny

Auf aktuellen Monitoren mit 19″ und mehr, kann die geringe Auflösung der Monitor-Konsole schon ziemlich lästig sein. Man kann daher die Konsole im Grafikmodus betreiben, muss dazu aber ein paar Einstellungen vornehmen.

Damit die benötigten Kernelmodule bereits beim Systemstart geladen werden, sind in der Datei /etc/initramfs-tools/modules folgende Zeilen hinzuzufügen:

...
fbcon
vesafb
vga16fb
...

Bei Debian Lenny noch die Initram-Datei neu generieren lassen (bei Squeeze nicht mehr notwendig).

Server# update-initramfs -u

Jetzt wird noch die entsprechende Modusnummer für die gewünschte Bildschirmauflösung benötigt. Das geht am besten mit dem Paket hwinfo und der Option –framebuffer.

Server# aptitude install hwinfo
Server# hwinfo --framebuffer

Das Paket wird immer benötigt, um die unterstütze Auflösung herauszufinden.

...
Mode 0x033c: 1920x1440 (+1920), 8 bits
Mode 0x033a: 1600x1200 (+1600), 8 bits
Mode 0x0307: 1280x1024 (+1280), 8 bits
Mode 0x0305: 1024x768 (+1024), 8 bits
Mode 0x0301: 640x480 (+640), 8 bits
Mode 0x0303: 800x600 (+832), 8 bits
...

Jetzt in Lenny noch die gewünschte Auflösung in der GRUB-Konfigurations-Datei an zwei Stellen eintragen. Einmal in der Zeile beginnend mit # defoptions und in der Kernelzeile, die durch Grub standardmäßig gestartet wird (meistens die Erste).

Datei /boot/grub/menu.lst

...
# defoptions=quiet splash vga=0x0307
...