Server

Benutzer

Erstellen

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:

ssh-copy-id $USER_NAME@$SERVER_IP

Anderfall muss er z.B. von einem anderen Benutzer kopiert werden:

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

# 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

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:

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:

git clone git@github.com:KlugeNico/$REPO_NAME.git
mv $REPO_NAME/ www

Certbot installieren und Zertifikat erstellen:

sudo apt install certbot
sudo apt install python3-certbot-apache
sudo certbot certonly --apache -d www.$URL -d $URL

Die Apache Konfiguration erstellen:

cat << EOF > apache-config-file.txt
<VirtualHost *:80>
  ServerName www.$URL
  ServerAlias $URL
  Redirect permanent / https://www.$URL/
</VirtualHost>

<VirtualHost *:443>
  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/
</VirtualHost>

<VirtualHost *:443>
  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

  <Directory /home/$USER/www/html>
    Options FollowSymlinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
EOF
sudo mv apache-config-file.txt /etc/apache2/sites-available/www-${URL//[.]/-}.conf

Und schließlich die Seite aktivieren:

# 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

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

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

sudo chmod 644 /etc/systemd/system/{ServiceName}.service

sudo systemctl daemon-reload
sudo systemctl enable {ServiceName}
sudo systemctl start {ServiceName}

Entfernen

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

# 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

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
(Port [Some Random Port])
sudo sshd -t   # Check Syntax
sudo service sshd reload   # Reload sshd

fail2ban installieren für Schutz gegen Bots usw. (optional)

sudo apt install fail2ban

Auto-Updates

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Disable root

sudo passwd -l root

to reenable:

sudo passwd -u root

Secure shared memory

Datei /etc/fstab bearbeiten

Entweder für guten Schutz komplett schreibgeschützt:

tmpfs    /run/shm    tmpfs    ro,noexec,nosuid    0 0

Oder für mehr Kompatibilität nur Ausführen verbieten:

none /run/shm tmpfs rw,noexec,nosuid,nodev 0 0

Anschließend Neustart

Firewall

Allgemein:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Webserver:

sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443

Ethereum:

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

sudo ufw allow from 192.168.1.0/24
sudo ufw allow from <YOUR_IP> proto tcp to any port <YOUR_SSH_PORT>

Änderungen übernehmen und firewall starten:

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.

sudo apt update && sudo apt upgrade
sudo pro attach $YOUR_TOKEN

Weiteres

# 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