.. _server:
=========================
Server
=========================
Benutzer
=================================================
Erstellen
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
sudo useradd -m $USER_NAME # -m um Benutzerverzeichnis anzulegen
sudo usermod -aG sudo $USER_NAME
sudo passwd $USER_NAME
sudo su $USER_NAME
chsh -s /bin/bash # /bin/bash als Standardshell einstellen (ist schöner)
exit
exit
Dann muss noch der ssh public key von der lokalen Maschine mit der man sich auf dem Server verbinden will auf den Server kopiert werden. Falls ssh Passwort Authentifizierung noch aktiviert ist kann dies mit dem folgenden Befehl gemacht werden:
.. code-block:: sh
ssh-copy-id $USER_NAME@$SERVER_IP
Anderfall muss er z.B. von einem anderen Benutzer kopiert werden:
.. code-block:: sh
sudo su $USER_NAME
cd ~
mkdir .ssh
cd .ssh
sudo cp ../../$OLD_USER/.ssh/authorized_keys .
sudo chown $USER_NAME authorized_keys
Sichere am besten den ssh Schlüssel deines Gerätes, damit du den Zugang nicht verlierst!
Nützliche Befehle
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
# create home dir
usermod -d path user
# list all processes of user
ps -fU user
# generate ssh key (only once)
ssh-keygen # " -t rsa" for rsa
Apache
=================================================
Installation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
sudo apt update
sudo apt upgrade
sudo apt install apache2
sudo apt install php libapache2-mod-php
Website hinzufügen
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
WICHTIG! Füge eine Verlinkung von deiner Domain auf die Server IP in den DNS-Records hinzu!
Als erstes einen RSA-Key für den Benutzer erstellen, falls noch nicht vorhanden:
.. code-block:: sh
chmod +x ~ # Benutzerordner muss ausführbar sein, damit Apache datauf zugreifen kann.
ssh-keygen
cat .ssh/id_rsa.pub
Der zu sehende KEY muss in github als Deploy-Key hinterlegt werden, damit das Repo geklont werden kann!
Anschließend das Repo klonen:
.. code-block:: sh
git clone git@github.com:KlugeNico/$REPO_NAME.git
mv $REPO_NAME/ www
Certbot installieren und Zertifikat erstellen:
.. code-block:: sh
sudo apt install certbot
sudo apt install python3-certbot-apache
sudo certbot certonly --apache -d www.$URL -d $URL
Die Apache Konfiguration erstellen:
.. code-block:: sh
cat << EOF > apache-config-file.txt
ServerName www.$URL
ServerAlias $URL
Redirect permanent / https://www.$URL/
ServerName $URL
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.$URL/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.$URL/privkey.pem
Redirect permanent / https://www.$URL/
ServerName www.$URL
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.$URL/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.$URL/privkey.pem
DocumentRoot /home/$USER/www/html
ErrorLog ${APACHE_LOG_DIR}/$USER-error.log
CustomLog ${APACHE_LOG_DIR}/$USER-access.log combined
Options FollowSymlinks
AllowOverride All
Require all granted
EOF
sudo mv apache-config-file.txt /etc/apache2/sites-available/www-${URL//[.]/-}.conf
Und schließlich die Seite aktivieren:
.. code-block:: sh
# Notwendige apache mods aktivieren
sudo a2enmod rewrite
sudo a2enmod ssl
sudo systemctl reload apache2
# Anschließend Seite aktivieren und Apache neu starten
sudo a2ensite www-${URL//[.]/-}.conf
sudo systemctl reload apache2
Weiteres
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
# Apache ports verwalten
sudo nano /etc/apache2/ports.conf
# Allgemeine Konfiguration
sudo nano /etc/apache2/apache2.conf
# Apache logs
Services
==================================================
Ein Service startet automatisch mit Linux, läuft also (sofern es keine Fehler gibt) immer wenn der Server läuft:
Erstellen
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Erstelle die Datei /etc/systemd/system/{ServiceName}.service mit folgendem Inhalt:
.. code-block:: cfg
# The {Service Name} service (part of systemd)
# file: /etc/systemd/system/{ServiceName}.service
[Unit]
Description = {Service Description}
Wants = network-online.target
After = network-online.target
[Service]
User = $USER
ExecStart = {Service Start Commando}
Restart = on-failure
[Install]
WantedBy = multi-user.target
EOF
Setze die Berechtigungen der Service-Datei und starte den Service:
.. code-block:: sh
sudo chmod 644 /etc/systemd/system/{ServiceName}.service
sudo systemctl daemon-reload
sudo systemctl enable {ServiceName}
sudo systemctl start {ServiceName}
Entfernen
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
sudo systemctl stop [servicename]
sudo systemctl disable [servicename]
sudo rm /etc/systemd/system/[servicename]
sudo rm /etc/systemd/system/[servicename] # and symlinks that might be related
sudo rm /usr/lib/systemd/system/[servicename]
sudo rm /usr/lib/systemd/system/[servicename] # and symlinks that might be related
sudo systemctl daemon-reload
sudo systemctl reset-failed
Nützliche Befehle
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
# view and follow the log
journalctl -fu {ServiceName}
# view log since yesterday
journalctl --unit={ServiceName} --since=yesterday
# view log between a date
journalctl --unit={ServiceName} --since='2020-12-01 00:00:00' --until='2020-12-02 12:00:00'
# Check whether the service is active
sudo systemctl is-active {ServiceName}
# View the status of the service
sudo systemctl status {ServiceName}
# Restarting the service
sudo systemctl reload-or-restart {ServiceName}
# Stopping the service
sudo systemctl stop {ServiceName}
Server Safety
==================================================
SSH
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sshd konfigurieren in Datei /etc/ssh/sshd_config
.. code-block:: cfg
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
(Port [Some Random Port])
.. code-block:: sh
sudo sshd -t # Check Syntax
sudo service sshd reload # Reload sshd
fail2ban installieren für Schutz gegen Bots usw. (optional)
.. code-block:: cfg
sudo apt install fail2ban
Auto-Updates
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
Disable root
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
sudo passwd -l root
to reenable:
.. code-block:: sh
sudo passwd -u root
Secure shared memory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Datei /etc/fstab bearbeiten
Entweder für guten Schutz komplett schreibgeschützt:
.. code-block:: cfg
tmpfs /run/shm tmpfs ro,noexec,nosuid 0 0
Oder für mehr Kompatibilität nur Ausführen verbieten:
.. code-block:: cfg
none /run/shm tmpfs rw,noexec,nosuid,nodev 0 0
Anschließend Neustart
Firewall
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Allgemein:
.. code-block:: sh
sudo ufw default deny incoming
sudo ufw default allow outgoing
Webserver:
.. code-block:: sh
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
Ethereum:
.. code-block:: sh
# E.a. Allow p2p ports for lighthouse
sudo ufw allow 9000/tcp
sudo ufw allow 9000/udp
# Allow eth1 port
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
Allow ssh only for special IP:
.. code-block:: sh
sudo ufw allow from 192.168.1.0/24
sudo ufw allow from proto tcp to any port
Änderungen übernehmen und firewall starten:
.. code-block:: sh
sudo ufw enable
Ubuntu Pro
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Mit Ubuntu Pro erhält man schneller Sicherheitsupdates und kann man kann Features wie kernel-updates zur Laufzeit aktivieren.
Aktuell bekommt man gratis ein Token der für 5 Maschinen verwendet werden kann.
.. code-block:: sh
sudo apt update && sudo apt upgrade
sudo pro attach $YOUR_TOKEN
Weiteres
==================================================
.. code-block:: sh
# Quellliste für apt bearbeiten
nano /etc/apt/sources.list
# restart os
shutdown -r now
# Add Variable
nano /etc/environment
# Java version wechseln
update-alternatives --config java
# Java version anmelden
update-alternatives --install /usr/bin/java java /usr/lib/jvm/.../bin/java 1
# PHP Error log
tail -f /var/log/apache2/error.log