Rootserver-Kochbuch

Aus Wikibooks
Dieses Buch steht im Regal EDV. Zielgruppen: Studium und Beruf Lehrbuch

Zusammenfassung des Projekts[Bearbeiten]

00% fertig „Rootserver-Kochbuch“ ist nach Einschätzung seiner Autoren zu 0 % fertig

  • Zielgruppe: Wissbegierige bis ausgebildete Administratoren eines Linux Servers
  • Lernziele: Installation, Konfiguration und Betrieb eines Rootservers
  • Sind Co-Autoren gegenwärtig erwünscht?

Dieses Buch wird durch intensive Zusammenarbeit sicher schnell besser. Der Hauptautor freut sich über jeden, der mitmacht. Kaputtmachen kannst du nicht viel – also sei mutig. Wenn etwas nicht passt, rührt sich der Hauptautor bestimmt. Danke.


  • Projektumfang und Abgrenzung zu anderen Wikibooks: Dieses Buch richtet sich an Personen, die bereits erfahrene Linux Benutzer sind und ausreichende Kenntnisse in Administration und Netzwerk haben.


Titelseite[Bearbeiten]

Über dieses Buch[Bearbeiten]

Autor[Bearbeiten]

Na icke natürlich.

Haftung / Gewähr[Bearbeiten]

Es gilt der bei Freier Software übliche Slogan: Jeder bekommt das, was er bezahlt! Das hier ist freiwillig und kostenlos, folglich erfolgt keine Haftung, keine Gewähr für garnichts!!!
Ick bin Berliner, also sind Schreibfehler vorprogrammiert und da es sich um ein Wiki handelt, dürft ihr sie entweder gerne verbessern oder behalten.

Wie in Lehrbüchern üblich, werden Gebrauchsnamen, Markennamen, Handelsnamen, Warenbezeichnungen usw. ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei Verwendung ist Benutzer selber verpflichtet, zu prüfen, ob er sie verwenden darf.

Vorwort[Bearbeiten]

Dieses Buch behandelt in der Grundstufe die Beschreibung eines sogenannten LAMP-Servers(Linux, Apache, MySQL und PHP). Ssh und Ftp werden als wichtige Werkzeuge ebenfalls in der Grundstufe beschrieben.

Im weiteren Verlauf werden dann weitere Dienste wie ein Forum(phpBB), Wiki(MediaWiki) und ein Mailserver(Postfix, Dovecot mit SpamAssassin) etc. eingerichtet.

Textkonventionen im Buch[Bearbeiten]

Ein kurzer Überblick[Bearbeiten]

Grundlagen[Bearbeiten]

Vorüberlegungen[Bearbeiten]

Vor der Umsetzung steht wie immer erstmal die Planung:

  • Was will ich und was brauche ich dafür:
    • Ich will ein Forum betreiben und dafür phpBB einsetzen. PhpBB benötigt einen Webserver wie Apache und PHP, dieses darf bei der aktuellen Version 3.2 aber höchstens in der Version 7.2 eingesetzt werden, neuere Versionen werden momentan noch nicht unterstützt. Demzufolge kann ich nur z.B. Debian 9 einsetzen, die Version 10 würde PHP 7.3 mitbringen.
    • Ich will aus Sicherheitsgründen mindestens einen Server mit Software-RAID Level 1(Spiegel) einsetzen.
    • Aus kostengründen betreibe ich meinen Server bei Kimsifi(OVH).

SSH-Zugang und IP-Adresse[Bearbeiten]

Unmittelbar nach der Fertigstellung der Installation wird euch der Serveranbieter, beimir Kimsufi eine eMail mit der Server-IP und dem Initial-Passwort zukommen lassen, gut aufheben.

Zum Thema Sicherheit: Am sichersten wäre euer Server natürlich aufgehoben, wenn ihr ihn vom Netzwerk trennt, in den Keller stellt und den Schlüssel wegwerft. Nur, geht halt nicht. Als erste und wichtigste Aktion nach der Installation wird also erstmal ein neues Passwort gesetzt und ggf der ssh-Port verschoben.

Ich verwende hier unter Linux ein Terminal. alternativ liesse sich natürlich auch PuTTY verwenden.

1. Neues Terminal öffnen und Verbindung vom heimischen Rechner aufbauen und das Passwort ändern(auch als Rückfallebene):

  • Ein Terminal öffnen
  • ssh root@SERVER-IP
  • Euer Server meldet sich mit der Login-Abfrage
  • PASSWORT Der Einfachheit halber mittels Kopieren und Einfügen
  • passwd Neues, möglichst sicheres Passwort setzen.
  • Mittels lastb könnt ihr euch jetzt erstmal anzeigen lassen, wer euch seit der Installation schon alles ohne Einladung besuchen wollte.

2. Neues Terminal öffnen und Verbindung vom heimischen Rechner aufbauen(als Arbeits-Terminal):

  • Ein Terminal öffnen
  • ssh root@SERVER-IP
  • Mittels des neu vergebenen Passworts anmelden.
  • Mittels whereis nano prüfen, ob Nano installiert ist.
  • Das hebe ich mir ggf. für später auf: nano /etc/ssh/sshd_config, nach #Port 22 suchen und z.B. in Port 2322 ändern

3. Da der Zugang als root potentiell gefährlich ist, einen neuen Standardbenutzer anlegen und ihm sudo-Rechte erteilen.

  • Normalerweise würde man hier useradd verwenden, Debian bietet hier aber das komfortablere adduser.
  • adduser duda
  • apt-get install sudo
  • Bei Debian ist hier die Gruppe sudo bereits freigeschaltet, sonst wäre z.B. die Gruppe wheel freizuschalten
  • usermod -aG sudo duda

4. Nun kann /etc/ssh/sshd_config erneut editiert und der Dienst neu gestartet werden

  • nano /etc/ssh/sshd_config, nach PermitRoootLogin yes suchen und auf no setzen
  • service sshd restart

Real Time Monitoring (RTM) prüfen[Bearbeiten]

Da mir meine Management-Oberfläche bei Kimsufi eine Echtzeitüberwachung anbietet, habe ich überpüft ob sie auch funktioniert und festgestellt, dass sie nicht ordentlich läuft. Die Komponenten habe ich neu installiert und die Dienste neu gestartet, erfolglos. Nun habe ich ein Ticket beim Support aufgemacht. OVH Doku zu RTM Auch nach einer Neuinstallation von Debian 9 und Freigabe der Ports 9100 und 6100:6200/udp, sind laut Monitoring IP OVH erfoderlich, läuft beamium scheinbar nicht richtig. Ich habe eine Meldung aufgemacht.

Locales überprüfen / anpassen[Bearbeiten]

dpkg-reconfigure locales</code Ich wähle, da es sich um einen Server handelt, en_US.UTF-8 UTF-8.

Uhrzeit und Datum[Bearbeiten]

Logdateien, Zertifikate und einige Dienste sind von einer genauen Zeit abhängig.

In der Grundinstallation ist ntpdate' installiert, dieses einmal ausführen.

localtime setzen[Bearbeiten]

Der Debian-Weg ist: dpkg-reconfigure tzdata

hwclock[Bearbeiten]

hwclock --systohc hwclock --show

Zeiteinstellung prüfen[Bearbeiten]

timedatectl status

Später kann ntp installiert werden[Bearbeiten]

  • ntp installieren: apt-get install ntp
  • ntp konfigurieren: nano /etc/ntp.conf ptbtime1.ptb.de bis ptbtime3 eintragen.
  • ntp neustarten: service ntp restart
  • ntp prüfen: systemctl status ntp

Paketquellen ggf. anpassen[Bearbeiten]

nano /etc/apt/sources.list:

# 



deb http://debian.mirrors.ovh.net/debian stretch main contrib non-free
deb-src http://debian.mirrors.ovh.net/debian stretch main contrib non-free

deb http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free

# stretch-updates, previously known as 'volatile'
deb http://debian.mirrors.ovh.net/debian stretch-updates main contrib non-free
deb-src http://debian.mirrors.ovh.net/debian stretch-updates main contrib non-free

Anschliessend die Quellen neu einlesen und das System ggf. aktualisieren
apt-get update
apt-get upgrade
apt-get dist-upgrade

Softwarefirewall installieren (Paketfilter)[Bearbeiten]

Eingesetzt wird hier ufw. apt-get install ufw

Später: Einstellungen zurücksetzen[Bearbeiten]

ufw logging medium

SSH Port und Port für System Real Time Monitoring freigeben[Bearbeiten]

ufw allow ssh ufw allow 9100

ufw aktivieren[Bearbeiten]

ufw enable

Aktive Regeln abfragen[Bearbeiten]

ufw status

Logcheck[Bearbeiten]

tail -f /var/log/ufw.log

Die Ausgabe sieht zum Beispiel dann so aus:

Oct 27 13:43:39 ns3268394 kernel: [14555.956562] [UFW BLOCK] IN=enp1s0 OUT= MAC=00:22:4d:84:8e:35:d8:24:bd:90:b0:c0:08:00 SRC=185.156.73.25 DST=5.39.80.228 LEN=40 TOS=0x00 PREC=0x00 TTL=249 ID=39015 PROTO=TCP SPT=43905 DPT=17000 WINDOW=1024 RES=0x00 SYN URGP=0 

Um zu klären, wo dieser Kontaktversuch nun herkommt kann man entweder whois befragen oder Infosniper nutzen. apt-get install whois

Als grafische Shell installiere ich den Midnight Commander: apt-get install mc

Lynis[Bearbeiten]

Für die Installation von Lynis installiere ich git: apt-get install git

mkdir test cd test git clone https://github.com/CISOfy/lynis cd lynis mkdir /usr/local/lynis, mit mc habe ich dann die Dateien in da neue Verzeichnis kopiert. cd /usr/local/lynis; ./lynis audit system

Als Ergebnis der Überprüfung mit lynis installiere ich: apt-get install libpam-cracklib

Extrakt von lynnis-report.dat: /etc/login.defs könnte zum Beispiel verbessert werden:

suggestion[]=AUTH-9282|When possible set expire dates for all password protected accounts|-|-|
suggestion[]=AUTH-9286|Configure minimum password age in /etc/login.defs|-|-|
suggestion[]=AUTH-9286|Configure maximum password age in /etc/login.defs|-|-|
manual_event[]=AUTH-9328:03
suggestion[]=AUTH-9328|Default umask in /etc/login.defs could be more strict like 027|-|-|

suggestion[]=FILE-6310|To decrease the impact of a full /home file system, place /home on a separate partition|-|-|
suggestion[]=FILE-6310|To decrease the impact of a full /tmp file system, place /tmp on a separate partition|-|-|

suggestion[]=USB-1000|Disable drivers like USB storage when not used, to prevent unauthorized storage or data theft|-|-|

suggestion[]=STRG-1846|Disable drivers like firewire storage when not used, to prevent unauthorized storage or data theft|-|-|

warning[]=NAME-4210|Found BIND version in banner|-|-|
suggestion[]=NAME-4210|The version in BIND can be masked by defining 'version none' in the configuration file|-|-|

suggestion[]=PKGS-7370|Install debsums utility for the verification of packages with known good database.|-|-|

suggestion[]=PKGS-7420|Consider using a tool to automatically apply upgrades|-|-|

suggestion[]=FIRE-4513|Check iptables rules to see which rules are currently not used|-|-|

suggestion[]=SSH-7408|Consider hardening SSH configuration|AllowTcpForwarding (set YES to NO)|-|
details[]=SSH-7408|sshd|desc:sshd option AllowTcpForwarding;field:AllowTcpForwarding;prefval:NO;value:YES;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|ClientAliveCountMax (set 3 to 2)|-|
details[]=SSH-7408|sshd|desc:sshd option ClientAliveCountMax;field:ClientAliveCountMax;prefval:2;value:3;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|Compression (set YES to NO)|-|
details[]=SSH-7408|sshd|desc:sshd option Compression;field:Compression;prefval:NO;value:YES;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|LogLevel (set INFO to VERBOSE)|-|
details[]=SSH-7408|sshd|desc:sshd option LogLevel;field:LogLevel;prefval:VERBOSE;value:INFO;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|MaxAuthTries (set 6 to 3)|-|
details[]=SSH-7408|sshd|desc:sshd option MaxAuthTries;field:MaxAuthTries;prefval:3;value:6;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|MaxSessions (set 10 to 2)|-|
details[]=SSH-7408|sshd|desc:sshd option MaxSessions;field:MaxSessions;prefval:2;value:10;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|Port (set 22 to )|-|
details[]=SSH-7408|sshd|desc:sshd option Port;field:Port;prefval:;value:22;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|TCPKeepAlive (set YES to NO)|-|
details[]=SSH-7408|sshd|desc:sshd option TCPKeepAlive;field:TCPKeepAlive;prefval:NO;value:YES;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|X11Forwarding (set YES to NO)|-|
details[]=SSH-7408|sshd|desc:sshd option X11Forwarding;field:X11Forwarding;prefval:NO;value:YES;|
suggestion[]=SSH-7408|Consider hardening SSH configuration|AllowAgentForwarding (set YES to NO)|-|
details[]=SSH-7408|sshd|desc:sshd option AllowAgentForwarding;field:AllowAgentForwarding;prefval:NO;value:YES;|

suggestion[]=LOGG-2154|Enable logging to an external logging host for archiving purposes and additional protection|-|-|

suggestion[]=BANN-7126|Add a legal banner to /etc/issue, to warn unauthorized users|-|-|
weak_banner_file[]=/etc/issue
suggestion[]=BANN-7130|Add legal banner to /etc/issue.net, to warn unauthorized users|-|-|

suggestion[]=ACCT-9622|Enable process accounting|-|-|
suggestion[]=ACCT-9626|Enable sysstat to collect accounting (disabled)|-|-|
suggestion[]=ACCT-9628|Enable auditd to collect audit information|-|-|

suggestion[]=FINT-4350|Install a file integrity tool to monitor changes to critical and sensitive files|-|-|
suggestion[]=TOOL-5002|Determine if automation tools are present for system management|-|-|

suggestion[]=FILE-7524|Consider restricting file permissions|See screen output or log file|text:Use chmod to change file permissions|

warning[]=HOME-9304|Permissions of some users' home directories are not strict enough. Should be 750 or more restrictive.|-|-|
details[]=KRNL-6000|sysctl|desc:No description;field:kernel.core_uses_pid;prefval:1;value:0;|
details[]=KRNL-6000|sysctl|desc:Restrict access to kernel symbols;field:kernel.kptr_restrict;prefval:2;value:0;|
details[]=KRNL-6000|sysctl|desc:Disable magic SysRQ;field:kernel.sysrq;prefval:0;value:438;|
details[]=KRNL-6000|sysctl|desc:Disable process tracing for everyone;field:kernel.yama.ptrace_scope;prefval:1 2 3;value:0;|
details[]=KRNL-6000|sysctl|desc:Log all packages for which the host does not have a path back to the source;field:net.ipv4.conf.all.log_martians;prefval:1;value:0;|
details[]=KRNL-6000|sysctl|desc:Disable/Ignore ICMP routing redirects;field:net.ipv4.conf.all.send_redirects;prefval:0;value:1;|
details[]=KRNL-6000|sysctl|desc:Log all packages for which the host does not have a path back to the source;field:net.ipv4.conf.default.log_martians;prefval:1;value:0;|
suggestion[]=KRNL-6000|One or more sysctl values differ from the scan profile and could be tweaked||Change sysctl value or disable test (skip-test=KRNL-6000:<sysctl-key>)|
suggestion[]=HRDN-7230|Harden the system by installing at least one malware scanner, to perform periodic file system scans|-|Install a tool like rkhunter, chkrootkit, OSSEC|

hardening_index=63

Siehe bezüglich motd

Ergebnis von lynis.log fand ich nicht erwähnenswert.

Das Systemm aktualisieren[Bearbeiten]

Cron / crontab[Bearbeiten]

Debian verwendet immernoch Vixie Crron.

needrestart[Bearbeiten]

apt-get install needrestart

nano /etc/needrestart/needrestart.conf

Folgende Einträge wurden geändert und aktiviert:

  • $nrconf{verbosity} = 2;
  • $nrconf{restart} = 'a';

apticron - Updatebenachrichtigung[Bearbeiten]

apt-get install apticron

Beispielmail - apticron[Bearbeiten]

cron-apt[Bearbeiten]

apt-get install cron-apt

Die Konfig folgendermassen anpassen:
nano /etc/cron-apt/action.d/3-download

autoclean -y
upgrade -d -y -o APT::Get::Show-Upgraded=true

Die Änderung von dist-upgrade auf upgrade bewirkt, dsss apt keine, möglicherweise doch noch benötigte Pakete, entfernt, um andere Pakete installieren zu können.
Auf einem Server ist eher eine konservative herangehesweise angesagt.

Programmpaket nur herunterladen - keine automatische Installation[Bearbeiten]

Der Parameter -d legt fest, dass die Programmpakete nur heruntergeladen, keinesfalls ohne vorherige Kontrolle duch den Systemerwalter installiert werden.

config[Bearbeiten]

Die Konfigurationsdatei ist nach der Installation leer und muss sinnvole Werte erhalten: nano /etc/cron-apt/config
MAILON="output" Mit der Angabe 'output wird erreicht, dass man bei jeder Ausgabe von cron-apt eine eMail erhält, dies kann später gelockert werden.

Nur Sicherheitsupates automatisch installieren[Bearbeiten]

Erstellen der folgenden Datei mit nachfolgendem Eintrag:
nano /etc/cron-apt/action.d/4-security
upgrade -y -o APT::Get::Show-Upgraded=true

Erstellen der folgenden Datei mit nachfolgendem Eintrag:
nano /etc/cron-apt/config.d/4-security
OPTIONS="-q -o Dir::Etc::SourceList=/etc/apt(sources.list.d/security_only.list -o Dir::Etc::SourceParts=\"/dev/null\""

Erstellen der folgenden Datei mit den beiden nachfolgenden Einträgen:
nano /etc/apt/sources.list.d/security_only.list
deb http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free

Testlauf[Bearbeiten]

cron-apt -s startet dann einen Testlauf im Terminal.

CRON-APT RUN [/etc/cron-apt/config]: Sun Oct 27 15:58:19 CET 2019
CRON-APT ACTION: 0-update
CRON-APT LINE: /usr/bin/apt-get -o quiet=1 update -o quiet=2
CRON-APT ACTION: 3-download
CRON-APT LINE: /usr/bin/apt-get -o quiet=1 autoclean -y
Reading package lists...
Building dependency tree...
Reading state information...
CRON-APT LINE: /usr/bin/apt-get -o quiet=1 upgrade -d -y -o APT::Get::Show-Upgraded=true
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
CRON-APT ACTION: 4-security
CRON-APT LINE: /usr/bin/apt-get -q -o Dir::Etc::SourceList=/etc/apt/sources.list.d/security_only.list -o Dir::Etc::SourceParts="/dev/null" upgrade -y -o APT::Get::Show-Upgraded=true
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Tägliche Ausführung[Bearbeiten]

Bei der Installation wurde bereits eine crontab in /etc/cron.d abgelegt, die täglich um 04:00 Uhr für die Durchführung sorgt.

Den Server neu starten[Bearbeiten]

Ein entsprechender Entrag mit nano /etc/crontab sorgt für einen wöchentlichen Neutart des Servers Montags um 03:00 Uhr.
Hierbei muss darauf geachtet werden, dass keine anderen Operationen gleichzeitig ablaufen.

Empfehlung[Bearbeiten]

Bei der Bedeutung der Sicherheit für den ordnungsgemäßen Betrieb und möglichen Gefährdung des Servers ist es von hoher Wichtigkeit Sicherheitsupdates so zeitnah wie möglich einzuspielen.

Sicherheitsrelevante Software installieren[Bearbeiten]

fail2ban Installation[Bearbeiten]

apt-get install fail2ban Da die .conf-Dateien bei jedem Programm-Update überschrieben werden würden, sind diese nicht direkt zu ändern, sondern deren lokale Kopie. cd /etc/fail2ban cp jail.conf jail.local

Mittels nano jail.local die Konfiguration anpassen und mit dem Parameter enable die gewünschten Filter einschalten.

[sshd]
enabled  = true
port     = ssh
filter   = sshd
logpath  = %(sshd_log)s
backend  = %(sshd_backend)s
maxretry = 3

[postfix]
enabled  = true
port     = smtp,465,submission
logpath  = %(postfix_log)s
backend  = %(postfix_backend)s

[postfix-sasl]
enabled  = true
port     = smtp,465,submission,imap3,imaps,pop3,pop3s
# You might consider monitoring /var/log/mail.warn instead if you are
# running postfix since it would provide the same log lines at the
# "warn" level but overall at the smaller filesize.
logpath  = %(postfix_log)s
backend  = %(postfix_backend)s

# dovecot defaults to logging to the mail syslog facility
# but can be set by syslog_facility in the dovecot configuration.
[dovecot]
enabled = true
port    = pop3,pop3s,imap,imaps,submission,465,sieve
logpath = %(dovecot_log)s
backend = %(dovecot_backend)s

[mysqld-auth]
enabled  = true
port     = 3306
logpath  = %(mysql_log)s
backend  = %(mysql_backend)s

Emailbenachrichtigung[Bearbeiten]

In der Sektion ACTIONS folgendes ändern:

# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
# mailing. Change mta configuration parameter to mail if you want to
# revert to conventional 'mail'.
mta = mail
# Choose default action.  To change, just override value of 'action' with the
# interpolation to the chosen action shortcut (e.g.  action_mw, action_mwl, etc) in jail.local
# globally (section [DEFAULT]) or per specific section
action = %(action_mwl)s

Dienst neu starten und Status prüfen[Bearbeiten]

service fail2ban restart service fail2ban status

Quellen[Bearbeiten]

Unterstützung durch den Serveranbieter[Bearbeiten]

Literaturverzeichnis[Bearbeiten]

Dieses Lehrwerk ist erst vor kurzem angelegt worden. – Nützliche Hinweise findest du im Wikibooks-Lehrbuch. – Bei Problemen kannst du unter diesem Link um Hilfe bitten. – Diskussionen zu diesem Buch führst du auf dieser Seite. – (Datum im Format Jahr_Monat_Tag: 20191026))

Details zu diesem Baustein erfährst du unter diesem Link.