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

Zusammenfassung des Projekts

Bearbeiten

  „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

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.

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 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 --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

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.

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

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.