Jeder der einen Linux-Server betreibt, sollte sich ernsthaft mit dem Thema Sicherheit auseinandersetzen. Einen tollen Artikel zu diesem Thema habe ich hier gefunden.
SSH
SSH root-login verhindern
Root-Login über SSH ist in Ubuntu normalerweise bereits deaktiviert. Es lohnt sich aber sicher, dies zu überprüfen. Auf meinen Servern gibt es keinen Grund sich als root über SSH einlogen zu können. Deswegen deaktiviere ich dies grundsätzlich:
sudo vi /etc/ssh/sshd_config
PermitRootLogin no
sudo service ssh restart
Root-Login mit RSA-Key
Falls doch ein Root-Login benötigt würde, ist es empfehlenswert diesen statt mit einem Passwort mit einem RSA-Key abzusichern:
sudo vi /etc/ssh/sshd_config
PermitRootLogin without-password
sudo service ssh restart
Anschliessend muss noch ein Key erstellt werden: http://go2linux.garron.me/ssh-login-using-no-password
Verweise
- http://www.andrewault.net/2010/05/17/securing-an-ubuntu-server/
- http://go2linux.garron.me/secure-root-account-ssh-without-password
- http://go2linux.garron.me/ssh-login-using-no-password
Denyhosts
Es ist beeindruckend, wieviele Login-Versuche (Attacken) /var/log/auth.log auf meinen Servern aufweist. Denyhost ermöglicht es diese Attacken etwas einzudämmen, indem es
/var/log/auth.log
scant und mehrfach fehlgeschlagene Logins analysiert. Die IP-Adressen, welche die Fehlerhaften Logins produziert haben, werden in /etc/hosts.deny eingetragen.
Installation
Die Installation erfolgt sehr einfach.
sudo apt-get install denyhosts
Das war’s auch schon. Denyhost arbeitet nun bereits und trägt IP-Adressen in /etc/hosts.deny ein:
sudo less /etc/hosts.deny
Hinweis:
Bitte prüft bei der ersten Installation ob nicht zufälligerweise eure eigene IP in hosts.deny eingetragen wurde. Bei einer nachträglichen Installation kann es sein, dass aufgrund früher fehlgeschlagene Logins (welche z.B. bei Testlogins entstehen) eure eigene IP in hosts.deny eingetragen wird.
Dies kann verhindert werden, indem die eigenen IP-Adressen in die whitelist eingefügt werden:
sudo vi /etc/hosts.allow
sshd: x.x.x.x
Konfiguration
Denyhost erstellt sich seine eigenen Auswertungen und speichert diese unter
/var/lib/denyhosts
ab. Basierend auf diesen Daten legt denyhost die Einträge in
/etc/hosts.deny
fest.
Das Config-File befindet sich auf Ubuntu unter
/etc/denyhosts.conf
Verweise
Fail2Ban
Ab Ubuntu 14.04 gibt es denyhosts offenbar nicht mehr über den Package-Manager:
http://askubuntu.com/questions/433924/package-denyhosts-in-ubuntu-trusty-tahr-is-deleted-temporary-or-forever
Es wird nun Fail2Ban empfohlen.
Siehe:
- http://devget.net/tutorials/securing-an-ubuntu-14-04-server-with-fail2ban/
- https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-12-04
Logwatch
Logs sind eine tolle Sache und ermöglichen die Nachvollziehbarkeit von Vorkommnissen auf den Servern. Das bedingt jedoch, dass man die Logs auch anschaut. Logwatch ermöglicht die einfache Analyse von Logs. Die Logs können auch regelmässig an Administratoren versendet werden. Sepiell für Internet-Root-Server ist dies zu empfehlen:
Installation
sudo apt-get install logwatch
Mit der Installation von Logwatch werden weitere benötigte Dienste wie Postfix installiert. Bei der Installation von Postfix wird nachgefragt, welche Art von E-Mail Server installiert werden soll. Da auf meinen Servern keine Mail empfangen, sonder nur welche versendet werden sollen (durch Scripte) installiere ich ein „Satelitten System“. Siehe hierzu auch: http://wiki.ubuntuusers.de/Postfix#Grundkonfiguration.
Den SMTP-Relay-Server lasse ich leer.
Achtung: Es ist wichtig, dass der hostname korrekt gesetzt ist (z.B. servername.domain.ch):
hostname -f
Dieser Hostname muss auch in der Postfix-Config (myhostname = servername.domain.ch) korrekt gesetzt sein:
sudo vi /etc/postfix/main.cf
Nun sollte logwatch bereits funktionieren. Logs anschauen:
sudo logwatch | less
Konfiguration
Die Basiskonfiguration sieht ein cache-Verzeichins /var/cache/logwatch vor. Dieses wird aber durch die Paket-Installation nicht angelegt. Das müssen wir manuell machen:
sudo mkdir /var/cache/logwatch
Die Konfiguration sollte nicht im Installations-Verzeichnis (/usr/share/logwatch) vorgenommen werden. Deswegen kopieren wird die default-config nach /etc/logwatch:
sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
Nun können wir die Konfiguration durchführen um beispielsweise die Mail-Adresse zu konfigurieren:
sudo vi /etc/logwatch/conf/logwatch.conf
Tomcat
Wenn man tomcat, so wie ich, manuell installiert, kann man mit wenigen Konfig-Anpassungen Logwatch dazu überreden auch den Tomcat-Service zu loggen:
Logfile
vi /etc/logwatch/conf/logfiles/tomcat.conf
Folgende Zeile hinzufügen
LogFile = <pfad>/catalina.out
Services
vi /etc/logwatch/conf/services/tomcat.conf
Folgende Zeilen hinzufügen
Title = "Tomcat" LogFile = tomcat
Scripts
Das Script stammt von https://github.com/vintikjeny/logwatch
vi /etc/logwatch/scripts/services/tomcat
#!/usr/bin/perl # Detail level $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 5; # total number of errors in log file my $Total_err = 0; # hash with only unique errors, where KEY - error message, VALUE - number of errors of this type my %unique_err = (); # default value of error message my $Message = ""; # total number of unique errors my $Unique_err_num; # main loop while (defined($line = <STDIN>)) { # use tomcat7 date regex to define start of new message (or end of previous) if ($line =~ /^(.*\s+[1-31]+.*(:+[0-9]+[0-9]+){2}\s+(AM|PM)+)/) { # if previous collected message - is Error message if ($Message =~ /^(ERROR:|SEVERE:)/) { # if it is a new message, then add this message to hash if (!exists $unique_err{$Message}) { $unique_err{$Message} = 0; } # increment messages counters $unique_err{ $Message } = $unique_err{$Message}+1; $Total_err++; } # clear variable from previous message $Message = ""; # Ignorable strings (java stacktrace) } elsif($line =~ /^(.+(at+\s+)|(.*Hint:)|(.*Position:))|((\s+more)$)/) { next; } else { # construct nessesary strings to message $Message = $Message.$line; } } # if log detail level is NOT LOW if ($Detail != 0) { # Print every error in file while ( my ($key, $value) = each(%unique_err) ) { chomp $key; print "Message: $key\nCount: $value\n"; print "-------------------------------\n"; } } # get total number of unique errors in file $Unique_err_num = scalar keys %unique_err; # Print total result print "Unique errors: $Unique_err_num\n"; print "Total num of Errors: $Total_err\n";
Testen
Logwatch Auswertung erstellen und eine Mail versenden
sudo logwatch --output mail
Wenn kein Mail ankommt, lohnt sich ein Blick in das Log von Postfix
tail -n 1000 /var/log/mail.log