Rootserver-Kochbuch
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
- Buchpatenschaft/Ansprechperson: Peter Littmann
- 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.
- Aufbau des Buches: Das Buch orientiert sich für den Anfang an dem Buch Rootserver unter Debian GNU Linux "Jessie": Do it yourself! Rootserver
Titelseite
BearbeitenÜber dieses Buch
BearbeitenAutor
BearbeitenNa icke natürlich.
Haftung / Gewähr
BearbeitenEs 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
BearbeitenDieses 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
BearbeitenEin kurzer Überblick
BearbeitenGrundlagen
BearbeitenVorüberlegungen
BearbeitenVor 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
BearbeitenUnmittelbar 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ügenpasswd
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 setzenservice sshd restart
Real Time Monitoring (RTM) prüfen
BearbeitenDa 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
Bearbeitendpkg-reconfigure locales
Ich wähle, da es sich um einen Server handelt, en_US.UTF-8 UTF-8.
Uhrzeit und Datum
BearbeitenLogdateien, Zertifikate und einige Dienste sind von einer genauen Zeit abhängig.
In der Grundinstallation ist ntpdate' installiert, dieses einmal ausführen.
localtime setzen
BearbeitenDer Debian-Weg ist: dpkg-reconfigure tzdata
hwclock
Bearbeitenhwclock --systohc
hwclock --show
Zeiteinstellung prüfen
Bearbeitentimedatectl 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
Bearbeitennano /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)
BearbeitenEingesetzt wird hier ufw.
apt-get install ufw
Später: Einstellungen zurücksetzen
Bearbeitenufw logging medium
SSH Port und Port für System Real Time Monitoring freigeben
Bearbeitenufw allow ssh
ufw allow 9100
ufw aktivieren
Bearbeitenufw enable
Aktive Regeln abfragen
Bearbeitenufw status
Logcheck
Bearbeitentail -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
BearbeitenFü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
BearbeitenCron / crontab
BearbeitenDebian verwendet immernoch Vixie Crron.
needrestart
Bearbeitenapt-get install needrestart
nano /etc/needrestart/needrestart.conf
Folgende Einträge wurden geändert und aktiviert:
$nrconf{verbosity} = 2;
$nrconf{restart} = 'a';
apticron - Updatebenachrichtigung
Bearbeitenapt-get install apticron
Beispielmail - apticron
Bearbeitencron-apt
Bearbeitenapt-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
BearbeitenDer Parameter -d legt fest, dass die Programmpakete nur heruntergeladen, keinesfalls ohne vorherige Kontrolle duch den Systemerwalter installiert werden.
config
BearbeitenDie 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
BearbeitenErstellen 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
Bearbeitencron-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
BearbeitenBei 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
BearbeitenEin 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
BearbeitenBei 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
Bearbeitenfail2ban Installation
Bearbeitenapt-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
BearbeitenIn 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
Bearbeitenservice fail2ban restart
service fail2ban status
Quellen
Bearbeiten- Grundlagen:
- Linux-Praxisbuch
- Linux-Distributionen: Ubuntu-Anwenderhandbuch, Knoppix-Handbuch
- Wikijunior Computer und Internet
- Vi-Befehlsreferenz, Learning the vi editor
- Datensicherung
- Regal:EDV, Abschnitt Sicherheit
- Datenbank:
- Angebotene Dienste:
Unterstützung durch den Serveranbieter
Bearbeiten- OVH
- Dokumentation: Deutsch andere Sprache oben rechts auswählen Französisch
- Forum: Englisch Französisch
- Github: https://github.com/ovh
Literaturverzeichnis
BearbeitenDieses 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.