Archiv ‘Linux’

Samstag, 5. Juli 2014

E-Mail bei (erfolgreichem) SSH-Login

Dank Google und dem Internet war dieses unterfangen in einer Minute erledigt:

/etc/pam.d/sshd

Am Ende der Datei (die ich weder kannte und deren Inhalt ich nicht verstehe) fügte ich folgende Zeile ein:

...
session optional pam_exec.so seteuid /usr/local/bin/ssh-login-notify.sh

/usr/local/bin/ssh-login-notify.sh

Auch mailx kannte ich nicht, bisher habe ich immer mail verwendet (Erläuterungen zum Unterschied) — diese Ubuntu-Benutzer sind am „bleeding edge“ unterwegs!

#!/bin/sh
EMAILTO="logger@domain.tld"

if [ "$PAM_TYPE" != "close_session" ]; then
HOST="`hostname`"
SUBJECT="SSH Login: $PAM_USER from $PAM_RHOST on $HOST"
MESSAGE="`env`"

echo "$MESSAGE" | mailx -s "$SUBJECT" "$EMAILTO" &
fi

Quelle: How do I set up an email alert when a ssh login is successful?

Tags: , , , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Montag, 2. Juni 2014

MySQL will nach dem Upgrade auf Version 5.5 unter Debian nicht mehr starten

Aus irgendeinem Grund setze ich auf meinem Entwicklungsserver seit Jahren MySQL 5.0 ein. Heute sah ich den Tag gekommen, die Datenbank auf Version 5.5 zu „lüpfen“.

Leider lief dieses Unterfangen nicht ohne Komplikationen ab:

# /etc/init.d/mysql start
Starting MySQL database server: mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . failed!

Konfigurationsdatei anpassen

Na toll, sehr aussagekräftig das Ganze! Doch wenn man anstelle des Debian Startup-Scripts mysqld direkt aufruft, wird man von Fehlermeldungen nur so erschlagen:

# /usr/sbin/mysqld 
140602 21:39:51 [Warning] Using unique option prefix key_buffer instead of key_buffer_size is deprecated and will be removed in a future release. Please use the full name instead.
140602 21:39:51 [Warning] The syntax '--log-slow-queries' is deprecated and will be removed in a future release. Please use '--slow-query-log'/'--slow-query-log-file' instead.
140602 21:39:51 [ERROR] An old style --language value with language specific part detected: /usr/share/mysql/english/
140602 21:39:51 [ERROR] Use --lc-messages-dir without language specific part instead.
140602 21:39:51 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
140602 21:39:51 [Note] Plugin 'FEDERATED' is disabled.
/usr/sbin/mysqld: Table 'mysql.plugin' doesn't exist
140602 21:39:51 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
140602 21:39:51 InnoDB: The InnoDB memory heap is disabled
140602 21:39:51 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140602 21:39:51 InnoDB: Compressed tables use zlib 1.2.8
140602 21:39:51 InnoDB: Using Linux native AIO
140602 21:39:51 InnoDB: Initializing buffer pool, size = 128.0M
140602 21:39:51 InnoDB: Completed initialization of buffer pool
140602 21:39:51 InnoDB: highest supported file format is Barracuda.
140602 21:39:51  InnoDB: Waiting for the background threads to start
140602 21:39:52 InnoDB: 5.5.37 started; log sequence number 3243771
140602 21:39:52 [ERROR] /usr/sbin/mysqld: unknown option '--skip-bdb'
140602 21:39:52 [ERROR] Aborting

140602 21:39:52  InnoDB: Starting shutdown...
140602 21:39:53  InnoDB: Shutdown completed; log sequence number 3243771
140602 21:39:53 [Note] /usr/sbin/mysqld: Shutdown complete

Soso. Zuerst einmal musste ich die Konfigurationsdatei /etc/mysql/my.cnf säubern — auch wenn obige Fehlermeldungen aussehen als würden sie von Kommandozeilenoptionen stammen, waren sie bei mir alle in der my.cnf spezifiziert.

  • key_buffer muss in key_buffer_size umbenannt werden
  • log_slow_queries muss in slow-query-log-file umbenannt werden
  • language = /usr/share/mysql/english muss vollständig auskommentiert werden
  • myisam-recover muss in myisam-recover-options umbenannt werden
  • skip-bdb muss vollständig auskommentiert werden

Tabellenstruktur aktualisieren

Nach dieser Aktion kam MySQL zwar nicht mehr hoch, aber spuckte immerhin nur noch eine Fehlermeldung aus:

...
mysqld: Table 'mysql.plugin' doesn't exist
140602 21:52:02 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...

Wenn ich diesen Befehl aber auf der Kommandozeile ausführte, erhielt ich folgendes zu Gesicht:

# mysql_upgrade
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
FATAL ERROR: Upgrade failed

Eine Antwort auf Serverfault half mir dann aber auf die Sprünge: Bevor man diesen Befehl ausführt, muss mysql im Hintergrund laufen. Doch wie starte ich MySQL, wenn es zuerst die Ausführung von mysql_upgrade verlangt? Mit folgendem Befehl ignoriert MySQL Probleme mit fehlenden Tabellen:

# mysqld --skip-grant-tables

Anschliessend lässt man mysql_upgrade in einem anderen Terminal laufen. Und voila, nach dieser Aktion kommt MySQL nun auch wieder mit dem Debian-Startscript hoch:

# # /etc/init.d/mysql start
Starting MySQL database server: mysqld ..
Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly..

Tags:
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 28. Mai 2014

AirPrint mit einem HP LaserJet 1300 auf einem Linux-Server aktivieren

Heute habe ich den Linux-Server in meinem Heimnetzwerk so konfiguriert, dass der dort per USB angeschlossene HP LaserJet 1300 auch von iOS-Geräten (iPhone und iPad) mittels AirPrint angesteuert werden kann.

Dies stellt sich heutzutage, anno 2014, als ein äusserst simples Unterfangen heraus:

CUPS installieren

Zuerst installiert man auf dem Server CUPS, das Common UNIX Printing System, welches von Apple gehegt und gepflegt wird. In meinem Fall hat dieses Drucksystem lprng ersetzt, welches automatisch deinstalliert wird:

# apt-get install cups

cups Web-Oberfläche freigeben

In /etc/cups/cupsd.conf sind in allen Location-Elementen (merke: CUPS verwendet Apache als Web-Frontend) die IPs des lokalen Netzwerks für erlaubte Zugriffe freizugeben:

...
Listen *:631
...
DefaultAuthType BasicDigest
...
<Location />
  Order allow,deny
  Allow From 10.0.10.0/24
</Location>
...
<Location /admin>
  Order allow,deny
  Allow From 10.0.10.0/24
</Location>
...

DefaultAuthType BasicDigest habe ich von Basic auf Digest umgestellt, damit ich das Passwort meines sudo-befähigten Benutzers nicht im Klartext über das Netzwerk gesendet wird. Damit man sich nach dieser Konfigurationsanpassung einloggen kann, muss man zuerst noch einen entsprechenden Benutzer erstellen:

# lppasswd -a <username>
Enter password: ********
Enter password again: ********

Eigener Benutzer der Gruppe lpadmin hinzufügen

Damit ich CUPS über die Web-Oberfläche administrieren kann, habe ich meinen persönlichen Benutzernamen zusätzlich der lokalen Gruppe lpadmin zugewiesen:

# usermod -aG lpadmin <username>

CUPS LPD-Druckserver einrichten

Obwohl heute IPP das Mass aller (Druck)dinge ist, verwende ich für Mac OS X- und Windows-Clients weiterhin das LPR/LPD-Druckprotokoll, weil es so simpel gestrickt und kaum fehleranfällig ist. Da CUPS aber lprng deinstalliert hat, muss in /etc/inetd.conf folgende Zeile eingefügt werden, welche den CUPS-eigenen LPD-Server aktiviert:

...
printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd -o document-format=application/octet-stream

inetd startet man unter Debian folgendermassen neu:

# /etc/init.d/openbsd-inetd restart

Drucker einrichten und konfigurieren

Über die Web-Oberfläche, welche man unter http://localhost:631 erreicht (respektive über http://10.0.10.10:631) richtet man sich mit dem Installationsassistenten den USB-Drucker ein. Bei mir wurde das Gerät an der USB-Schnittstelle problemlos erkannt und auch entsprechende HP-Treiber angeboten.

WICHTIG: Ich hatte erhebliche Probleme mit dem Postscript-Druckertreiber (der HP LaserJet 1300 kann Postscript 2 emulieren): Jeder zweite Druckauftrag — egal ob von Mac oder vom iPad — blockierte den Drucker entweder oder liess ihn eine fast leere Seite mit der Fehlermeldung „Offending Command“ ausdrucken. Doch sobald ich den Drucker auf den Sample monochrome PCL XL/PCL 6 driver umgestellt hatte, funktionierte die Druckerei tadellos. In diesem Fall ist aber darauf zu achten, dass man unter Mac OS X ebenfalls mit dem PCL-Druckertreiber druckt, damit man dem CUPS-Druckserver die Umwandlung von PostScript zu PCL erspart.

Fertig!

Obwohl ältere AirPrint-Installationsanleitungen im Internet die Sysadmins nun auch noch auffordern, Avahi zu installieren (war bei mir schon vor dieser Neukonfiguration des Drucksystems auf dem Server aktiv) und mittels des Scripts airprint-generate.py einen Bonjour-Service anzukündigen, funktionierte die Anpreisung mit CUPS 1.7.2-3 ohne irgendwelche Konfigurationsanpassungen.

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 25. Mai 2014

lftp mit Zertifikatsproblemen

Wenn lftp auf Grund von Zertifikatsproblemen bockt …

Certificate verification: subjectAltName does not match »domain.tld«

… wechselt man folgendermassen auf unsichere FTP-Verbindungen:

$ lftp -e 'set ftp:ssl-allow off; cd public_html; put index.php; bye' www.domain.tld

Via: Lftp Fatal Error: Certificate Verification: Not Trusted

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 25. Mai 2014

curlftpfs unter Mac OS X

Ergänzungen meiner IT-Installation machten es kürzlich nötig, dass ich neu auch unter Mac OS X curlftpfs einsetze, um per FTP von bestimmten Web-Sites Sicherheitskopien anzufertigen (Stichwort: Vagrant und puPHPet, dank an Christian für die „Erleuchtung“!)

Entweder hat sich curlftpfs in der Zwischenzeit weiterentwickelt, oder unter Mac OS X läuft der „Karren“ etwas anders. Auf jeden Fall habe ich bei der Adaptierung meiner Linux-Scripte unter Mac OS X folgendes gelernt:

MacPorts

curlftpfs installiert man sich folgendermassen:

# port install curlftpfs

Wenn man curlftpfs dann zum ersten Mal ausführt, warnt einem Mac OS X (hier: 10.9 Mavericks), dass man eine Kernelextension aktiviert, welche von einem unbekannte Entwickler kompiliert wurde. Henusode … (NSA lässt grüssen). Die Warnung ist seither nie mehr aufgetaucht; ich hoffe, dass dies auch nach einem Reboot so bleibt.

Geduldiges mounten

In Tests hat sich herausgestellt, das das Mounten von FTP-Volumen längert dauert als unter Linux. Meinem Script habe ich deshalb folgendermassen Geduld beigebracht:

...
MAXIMUMITERATIONS=5000
...
TIME=$(date +%H:%M:%S)
echo -n "Checking whether mountpoint is populated ($TIME): "

COUNTER=0
while [ ! -d "$SOURCE" ]
do
	let COUNTER=COUNTER+1
	echo -n "."
	
	if [ "$COUNTER" -eq "$MAXIMUMITERATIONS" ]
	then
		echo "Mountpoint still not available after $COUNTER iterations. Aborting."
		exit 1
	fi
done
...

In der Variable $SOURCE ist der Pfad zu einem auf dem FTP-Server vorhandenen Unterordner gespeichert. Sobald bash meldet, dass dieser nun verfügbar ist, kann ich mit den Kopieraktionen beginnen.

Zugriff verweigert

Bei den Tests traf ich auch auf ein Berechtigungsproblem: Manchmal wurde rsync beim Traversieren von FTP-Ordnerstrukturen der Zugriff verweigert. Nach einigem Pröbeln realisierte ich, dass einige Ordner auf den FTP-Servern das Execution-Bit nur für den Owner gesetzt hatten, nicht aber für die Gruppe oder gar Dritte. In einem Fall passte ich die Berechtigungen über den FTP-Client meiner Wahl an, in einem anderen Fall war ich mir todsicher, dass ich allen Serverbenutzern definitiv keine Berechtigung zum Lesen aller meiner Dateien geben wollte. Was nun?

Folgende Option verhindert, dass curlftpfs respektive FUSE bei FTP-Verbindungen Berechtigungschecks durchführen (dies ist hier Aufgabe des FTP-Servers — gibt dieser Zugriff auf eine Datei, hat definitiv schon eine zuverlässige Authentifizierung und Authorisierung stattgefunden):

$ curlftpfs -o defer_permissions ...

Zeichensalat

In meinem älteren Blog-Artikel zu curlftpfs habe ich gezeigt, wie der Zeichensatzproblematik unter Linux begegnen kann. Unter Mac OS X klappt dies so nicht. Stattdessen sind folgende Werte an curlftpfs zu übergeben:

$ curlftpfs -o modules=iconv,from_code=latin1

Quelle: International characters (e.g. Swedish åäö) in remote file system folder names makes Finder hang #71

Den Ausgabezeichensatz finden FUSE respektive curlftpfs offenbar selber heraus.

Dem Parameter from_code ist natürlich der Zeichensatz des FTP-Servers mitzugeben. Es sind alle iconv bekannten Zeichensätze konfigurierbar:

$ iconv -l

In Verbindung mit rsync führt dies aber zum unerwünschten Verhalten, dass Verzeichnisse und Dateien mit Umlauten im Namen bei jeder Synchronisation erneut heruntergeladen werden (ich bin unschuldig, das war ein anderer Benutzer des Servers!).

Tags: , , , , ,
Labels: Apple, Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 10. April 2014

imapfilter funktioniert nach dem Heartbleed-Disaster nicht mehr automatisch

Da offenbar auch der Hoster meines Vertrauens vom Heartbleed-Disaster betroffen war und vorbildlicherweise schnurstracks seine SSL-Zertifikate ausgetauscht hat, kam es zu Problemen mit meiner imapfilter-Installation, welche ich hier in anderen Blog-Artikeln bereits beschrieben habe.

Obwohl das Shell-Script auf meinem Linux-Server zu Hause alle fünf Minuten aufgerufen wird, wurden meine Mails in verschiedenen Mail-Accounts seit Mittwoch 15:15 Uhr nicht mehr gemäss den imapfilter-Regeln verschoben.

Heute Mittag erst wurde ich stutzig, wieso sich soviel Müll in meinen INBOXes stapelte und ging der Sache auf den Grund. Dank meinen Log-Daten fand ich die Ursache dann sofort heraus:

imapfilter: certificate mismatch in non-interactive mode

Um dieses Problem zu beheben, musste ich mich per SSH auf meinen Linux-Server einloggen, in denjenigen User wechseln, unter welchem der imapfilter-Cron Job ausgeführt wird, und danach erst einmal die Datei mit den abgelegten Zertifikaten löschen:

$ rm ~/.imapfilter/certificates

Anschliessend musste ich imapfilter einmalig von Hand von der Kommandozeile ausführen (wer mit imapfilter auf verschiedenen Mail-Servern filtert, muss das Prozedere für jeden Server einzeln durchführen, damit die Zertifikatsdatei wieder mit allen aktuellen Zertifikaten gefüllt wird):

$ imapfilter -c /dir/to/recipes/mail-at-domain-tld
Server key fingerprint: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
    (R)eject, accept (t)emporarily or accept (p)ermanently? p

Voilà! Seither klappt das Filtering meiner IMAP-Konten wieder reibungslos.

Tags: ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 6. März 2014

rsync braucht unter Mac OS X ewig für „building file list…“

rsync ist das Tool meiner Wahl, um meine Backups auf mein Synology NAS im LAN sowie per WAN auf einen Linux-Server im Elternhaus zu spiegeln. Doch aufgepasst: Wer sich seit jeher daran stört, dass die Backup-Scripts bei hunderttausenden Dateien eine Ewigkeit bei „building file list…“ stehen bleiben, sei folgender Rat gegeben:

Man sollte unbedingt eine aktuelle Version von rsync – mindestens aber Version 3 – verwenden. Bis und mit Mac OS X 10.8 liefert Apple Version 2.6 mit, welche in dieser Hinsicht noch nicht optimiert wurde: Version 2 liest zuerst alle Dateien des Quellverzeichnis ein, während Version 3 nach den ersten 1000 Dateien (oder so) mit dem Backup beginnt und die verbleibenden Dateien anschliessend päckchenweise (nach Bedarf, basierend auf der Backup-Geschwindigkeit), einliest. Diese Massnahme verringert nebenbei auch gerade den RAM-Bedarf des Tools.

Version 3 ist auf meinem System über MacPorts installiert:

# port install rsync

Damit man auch wirklich sicher ist, dass in den eigenen Backup-Scripts Version 3 und nicht Version 2 verwendet wird, sollte man den rsync-Pfad in Scripts hardkodieren:

#RSYNC=$(which rsync)
RSYNC="/opt/local/bin/rsync/"

Um während der Ausführung eines Scripts zu prüfen, ob Version 3 des Tools verwendet wird, empfiehlt es sich, rsync das Argument --info=progress2 mitzugeben. In diesem Fall wird jede Datei, die kopiert wird, auf einer neuen Zeile ausgegeben. Neben dessen Grösse, dem Netzwerk-Durchsatz und der Transfergeschwindigkeit auf das Zielmedium steht ganz am Ende der Zeile einerseits xfr für die fortlaufende Nummer aller übertragender Dateien und Ordner sowie to-chk, die Zahl der bereits überprüften Dateien vom (provisorischen) Total aller Dateien. to-chk wird sich während der Laufzeit des Scripts sequentiell erhöhen.

$ rsync -av --info=progress2 . /mnt/backup/2014-03-06/
... 1,238,099 100%  146.38kB/s    0:00:08  (xfr#5, to-chk=169/396)
...

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 6. März 2014

SSH zwingen, sich ausschliesslich mit einem spezifischen Private Key anzumelden

Wer bereits einmal SSH-Verbindungsaufnahmen debuggen musste und dazu den Kommandozeilenparameter -v, -vv oder -vvv verwendet hat, weiss, das der SSH-Agent standardmässig all im .ssh-Ordner vorhandenen private Keys durchprobiert, bis einer passt (oder eben nicht).

Ob dies eine Sicherheitslücke darstellt weiss ich nicht, aber ich finde es ineffizient. Diese Unschönheit lässt sich mit zwei zusätzlichen Parametern IdentityFile sowie IdentitiesOnly in den Host-Definitionen in .ssh/config beheben:

Host shortcut
	Hostname domain.tld
	IdentityFile /Users/mario/.ssh/id_rsa_special
	IdentitiesOnly

Quelle: GitHub / SSH with multiple identities; the slightly-more-definitive guide

Tags: , , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 5. März 2014

UUID einer Festplatte unter Linux auslesen

Es empfiehlt sich heutzutage, in /etc/fstab die Festplatten basierend auf ihrer UUID am richtigen Mount-Point einzuhängen. Die UUID einer bestimmten Platte findet man auf folgenden zwei Wegen heraus:

$ ls -l /dev/disk/by-uuid

Oder wenn die Device-Bezeichnung der Festplatte bekannt/klar ist:

$ blkid /dev/sda

Quelle: Short Tip: Get UUID of Hard Disks [Update]

Tags: , , ,
Labels: Linux

1 Kommentar | neuen Kommentar verfassen

Mittwoch, 5. März 2014

Alle Spuren von GPT-Partitionen von einer portablen Festplatte entfernen

Ich habe eine kürzlich erworbene Festplatte mit dem Disk Utility von Mac OS X komplett neu formatiert und partitioniert. Als ich die Festplatte kürzlich unter Linux neu partitionieren wollte, realisierte ich, dass die Festplatte mit den neuen GPT-Partitionen eingerichtet war (im Gegensatz zu den aus der DOS-Zeit stammenden MBR-Partitionen).

Wie entfernt man jegliche Überreste von GTP-Partitionierungsschemen von der Festplatte? Ganz einfach: Man installiere sich das Debian-Paket gdisk und führe dann folgendes aus:

# apt-get install gdisk
# gdisk /dev/sde
GPT fdisk (gdisk) version 0.7.2

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: present

Found valid MBR and GPT. Which do you want to use?
 1 - MBR
 2 - GPT
 3 - Create blank GPT

Your answer: 1

Command (? for help): x

Expert command (? for help): z
About to wipe out GPT on /dev/sde. Proceed? (Y/N): y
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
Blank out MBR? (Y/N): n
MBR is unchanged. You may need to delete an EFI GPT (0xEE) partition
with fdisk or another tool.

Quelle: Wiping Out Old GPT Data

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen