Ubuntu Server absichern

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

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:

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

Verweise