Installation und “Grund”-Härtung von Dolibarr

Hallo Zusammen
Ich habe eine umfassende Anleitung zur Installation und „Grund“-Härtung von Dolibarr geschrieben
Das Ganze ist für einen Ubuntu 20.04 Server erstellt
Zugriff habe ich per SSH und PuTTY von einem Windows PC
Leider kann ich keine Farben im Text verwenden. zum Teil steht in der Beschreibung das die roten texte ersetzt gehören. Zum Teil ergibt es sich von alleine das da andere Werte reingehören.

Bitte lest die Texte durch und schaut euch auch die Codes und Befehle an, dann sollte das mit der Farbe nicht so schlimm sein.
Ich hoffe das es Euch hilft


Windows
unter Windows das SSH-Paar erstellen
Windows Startmenü in die Eingabezeile - cmd.exe - eingeben und bestätigen
oder mit Cmder - https://cmder.net/
ins eigene Benutzerverzeichnis wechseln - das rot geschriebene mit Ihren Daten ersetzen

cd C:\Users\Name

SSH-Key erzeugen → Pfad und Name bestätigen (Enter) oder eigenen Pfad und Namen eingeben →
Passphrase eingeben (oder leer lassen - nicht empfohlen)
Standard Sicherheit 2048 Bit
ssh-keygen
höhere Sicherheit 4096 Bit

ssh-keygen -t rsa -b 4096

Server
befehle am Server über PuTTY mit USER/PASSWORD Login beim sudo Root User‬‬‬‬‬‬‬‬‬‬‬‬‬ System update

sudo apt-get update -y && sudo apt-get upgrade -y
sudo apt -y install software-properties-common

SSH Server installieren falls er bei der Ubuntu Installation nicht mitinstalliert wurde

sudo apt install openssh-server

kontrolle ob SSH aktiv ist - mit ‚q‘ verlassen

sudo systemctl status ssh
# SSH als Service aktivieren wenn nicht aktiv
sudo systemctl enable ssh
sudo systemctl start ssh
# Ordner für SSH Key anlegen - das rot geschriebene mit Ihren Daten ersetzen
mkdir /home/user-name-server/.ssh
chmod 700 /home/user-name-server/.ssh
chown -R user-name-server:user-name-server /home/user-name-server/ssh

wechseln auf Windows Eingabe mit Cmder - https://cmder.net/
SSH-Key und authorized-keys erstellen – das rot geschriebene mit Ihren Daten ersetzen

cp C:\Users\Name\.ssh\id_rsa.pub C:\Users\Name\.ssh\authorized_keys

aufs Benutzerkonto wechseln – eigenen User und Namen eintragen

cd C:\Users\Name\

SSH-Key und authorized_keys auf den Server kopieren
user-name-server und server_IP-Adresse anpassen

cat ~/.ssh/id_rsa.pub | ssh [email protected] "cat >> ~/.ssh/authorized_keys"

mit PuTTY am Server:
rechte eingeben - das rot geschriebene mit Ihren Daten ersetzen

chmod 700 /home/user-name-server/.ssh
chmod 600 /home/user-name-server/.ssh/authorized_keys

testen ob SSH Autorisiergun läuft

ssh-add -l >> ~/.ssh/authorized_keys

wächseln auf Windows Eingabe mit Cmder
authorized_keys löschen - das rot geschriebene mit Ihren Daten ersetzen

rm C:\Users\Name\.ssh\authorized_keys

mit PuTTY am Server SSH Härten und absichern
erstellen einer Backup der sshd_config

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

aktuell festgelegte Optionen überprüfen

sudo sshd -T

verschieben der original sshd_config als .bak

sudo mv /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

mit einem Texteditor neue sshd_config erstellen

sudo nano /etc/ssh/sshd_config

nachstehendes einfügen und anpassen – SSH Port anpassen

# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Include /etc/ssh/sshd_config.d/*.conf

#Standart Port ist 22 Sie können es gegen ein Anderes „freies“ Port ersetzen
Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

	# Ciphers and keying
#RekeyLimit default none

	# Logging
#SyslogFacility AUTH
#LogLevel INFO

	# Authentication:
LoginGraceTime 20
PermitRootLogin no
#StrictModes yes
MaxAuthTries 3
#MaxSessions 10
PubkeyAuthentication yes

	# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2

#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

	# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
	# Change to yes if you don't trust ~/.ssh/known_hosts for
#HostbasedAuthentication
#IgnoreUserKnownHosts no
	# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes

	# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
PermitEmptyPasswords no

	# Change to yes to enable challenge-response passwords (beware issues with
	# some PAM modules and threads)
ChallengeResponseAuthentication no

	# Kerberos options
KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

	# GSSAPI options
GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

	# Set this to 'yes' to enable PAM authentication, account processing,
	# and session processing. If this is enabled, PAM authentication will
	# be allowed through the ChallengeResponseAuthentication and
	# PasswordAuthentication.  Depending on your PAM configuration,
	# PAM authentication via ChallengeResponseAuthentication may bypass
	# the setting of "PermitRootLogin without-password".
	# If you just want the PAM account and session checks to run without
	# PAM authentication, then enable this but set PasswordAuthentication
	# and ChallengeResponseAuthentication to 'no'.
UsePAM yes
AllowAgentForwarding no
AllowTcpForwarding no
#GatewayPorts no
X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

	# no default banner path
Banner none

	# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

	# override default of no subsystems
Subsystem sftp  /usr/lib/openssh/sftp-server

Texteditor verlassen - bei nano CTRL+x (STRG+x) - save mit y bestätigen

sshd_config neu laden

sudo systemctl restart ssh

verwendeten SSH-Port anzeigen

grep -i port /etc/ssh/sshd_config

Server verlassen

exit

PuTTY einrichten
PuTTYgen starten → Conversation → Import Key
und den Privaten Schlüssel - id_rsa - laden (ggf muss die Passphrase eingegeben werden)
in PuTTYgen auf → Save private key - klicken und das File als - id_rsa.ppk - speichern
sollte eine Passphrase beim laden abgefragt worden sein wird diese übernommen,
sonst die Frage nach der Passphrase mit JA/YES beantworten und weiter ohne Passphrase

PuTTY starten rechts auf → Conection - Data → bei Auto-login username den sudo Root User des Servers eintragen
jetzt auf → Conection → SSH → Auth → klicken und unter - Private key file for authentication -
den SSH-Key eingeben - C:\Users\Name.ssh\id_rsa.ppk
jetzt auf → Session - klicken → unter Host Name (or IP address)
die IP adresse des servers oder den Hostnamen eingeben und unter Port das gewählte SSH port
bei Connection type: SSH auswählen
unter - Save Sessions - einen Namen eingeben und mit Save speichern
ein Doppelklick auf diesen Namen öffnet das Eingabefeld zum Server
PuTTY neustarten und mit neuem Port einloggen
UFW Firewall einrichten
Firewall Status abfragen

sudo ufw status

wenn inaktiv UFW Firewall aktivieren und mit ‚y‘ bestätigen

sudo ufw enable

alle eingehenden Anfragen blocken

sudo ufw default deny incoming

alle ausgehenden Anfragen erlauben

sudo ufw default allow outgoing

IPv6 unterstützung aktivieren

cat /etc/default/ufw

Sie Können mit dem standart SSH Port weitermachen, denn Sie es nicht geändert haben
→ # vor sudo entfernen

#sudo ufw allow SSH

zusätzliche Sicherheit gibt es, wenn man nur ausgewählte IP Adressen zulässt
IP Adresse identifizieren mit der man am Server angemeldet ist

w

erhaltene IP Adresse übernehmen und Server IP Adresse einfügen – ggf. eigene Portadresse
so haben Sie nur SSH Zugang für die IP des Clientrechners am Server und dem SSH Port
→ # vor sudo entfernen

#sudo ufw allow proto tcp from erhaltene IP Adresse to Server IP Adresse port eigenes Port

http und https freigeben

sudo ufw allow http
sudo ufw allow https

ggf Limits für das SSH Port eingeben https://www.cyberciti.biz/faq/howto-limiting-ssh-connections-with-ufw-on-ubuntu-debian/

#sudo ufw limit ssh

zur Kontrolle Firewall Status abfragen

sudo ufw status

UFW Firewall neustarten

sudo ufw reload

UFW Firewall als Service einrichten → UFW wird bei jedem Neustart aktiviert
mit ‚q‘ verlassen

sudo systemctl status ufw.service

nicht zu empfehlen aber manchmal nötig
UFW Firewall deaktivieren - deaktiviert auch den Service

#sudo ufw disable

Server Neustart

sudo reboot now

und mit dem privilegierten Benutzerrechten am Server anmelden

sudo -s

Starten Sie mit folgenden Softwarepakete, als notwendige Grundlage den Serverbetriebs

apt update -q4 && apt install -y curl gnupg2 git lsb-release apt-transport-https tree locate software-properties-common dirmngr screen htop net-tools zip unzip bzip2 ffmpeg ghostscript libfile-fcntllock-perl libfontconfig1 libfuse2 lsb-release socat

Server update und upgrade

apt update && apt upgrade -V && apt dist-upgrade && apt autoremove -y

Tragen Sie den zukünftigen Servernamen sowohl in die hosts-Datei, als auch in die
hostname-Datei ein – vorhandenen Eintrag löschen und mit neuem ersetzen

nano /etc/hosts

Passen Sie die roten Werte an Ihre Umgebung an:

127.0.0.1 localhost
127.0.1.1 Ihre.Domain.de
# The following lines are desirable for IPv6 capable hosts
::1       Ihre.Domain.de ip6-localhost ip6-loopback
fe00::0   ip6-localnet
ff00::0   ip6-mcastprefix
ff02::1   ip6-allnodes
ff02::2   ip6-allrouters
<externe IPv4> Ihre.Domain.de
<externe IPv6> Ihre.Domain.de

Geben Sie den korrekten Servername in der hostname-Datei an und ersetzen den roten
Wert durch Ihren:

nano /etc/hostname

Der Servername muss als FQDN, also vollqualifiziert angegeben werden
vorhandenen Eintrag löschen und mit neuem ersetzen

Ihre.Domain.de

Konfigurieren Sie den Zeitserverdienst und fügen Sie die zwei Zeitserver hinzu.

NTP=ntp1.dismail.de ntp2.dismail.de

Speichern Sie diese Datei und starten den Zeitserver neu:

systemctl restart systemd-timesyncd

Sorgen Sie nun dafür, dass der Server nicht in einen „Energiesparmodus“ wechseln kann:

systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

Starten Sie abschließend den Server neu

reboot now

und melden sich dann erneut mit privilegierten Benutzerrechten am Server an:

sudo -s

Fügen Sie dem System weitere Software-Repositories (Softwarequellen) hinzu, um die
aktuellen Releases der jeweiligen Pakete installieren zu können.
Das folgende gilt nur für Ubuntu Server (AMD64 und ARM64)
Debian ist ein bisschen anders
Stellen Sie sicher, dass das Paket „ubuntu-keyring“ installiert ist:

apt install -y ubuntu-keyring

Fügen Sie Ihrem System den nginx-Key hinzu:

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Tragen Sie anschließend die Softwarequellen für nginx und PHP ein:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list

Um auch die aktuellen PHP-Ressourcen verwenden zu können fügen wir das entsprechende
Repository hinzu:

add-apt-repository -y ppa:ondrej/php

Wir ergänzen die Paketquellen für MariaDB, aktualisieren dann das System
Vorbereitung MariaDB:

cd ~
wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup
./mariadb_repo_setup --mariadb-server-version="mariadb-10.6"

Aktualisierung des Servers:

apt update

Um sicherzustellen, dass keine Relikte früherer Installationen den Betrieb des Webserver
stören, entfernen wir diese:

apt remove nginx nginx-extras nginx-common nginx-full -y --allow-change-held-packages

Zudem stellen wir sicher, dass das Pendant (Apache2) zum nginx Webserver weder aktiv
noch installiert ist.

systemctl stop apache2.service && systemctl disable apache2.service

Nun sind die Vorbereitungen zur Installation des Webservers abgeschlossen und wir
können diesen mit dem nachfolgenden Befehl installieren

apt install -y nginx

und den Dienst zum automatischen Start nach einem Systemneustart mittels

systemctl enable nginx.service

einrichten. Mit Blick auf die späteren Anpassungen wird die Standardkonfiguration
gesichert und eine neue Konfigurationsdatei geöffnet

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak && touch /etc/nginx/nginx.conf
nano /etc/nginx/nginx.conf

Kopieren Sie den gesamten nachfolgenden Inhalt in die Datei und ersetzen die rot
markierten Werte entsprechend Ihres Systems:

user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
events {
	worker_connections 1024;
	multi_accept on; use epoll;
}
http {
	server_names_hash_bucket_size 64;
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log warn;
	# set_real_ip_from 127.0.0.1;			# nur nötig wenn sie nicht auf Localhost sind
	real_ip_header X-Forwarded-For;
	real_ip_recursive on;
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
	sendfile on;
	send_timeout 3600;
	tcp_nopush on;
	tcp_nodelay on;
	open_file_cache max=500 inactive=10m;
	open_file_cache_errors on;
	keepalive_timeout 65;
	reset_timedout_connection on;
	server_tokens off;
	resolver 127.0.0.53 valid=30s;
	resolver_timeout 5s;
	include /etc/nginx/conf.d/*.conf;
}

Speichern Sie die Datei und schließen Sie diese, um im Anschluss den Webserver neu zu
starten:

service nginx restart

Legen Sie drei Ordner an und setzen die korrekten Berechtigungen:
Ich habe als Dokument Ortner (/mnt/doli-data) eine weitere Festplatte verwendet
daher muss ich diesen Ortner nicht mehr anlegen – näheres dazu gern auf Anfrage
ohne extraplatte einfach weiter machen

mkdir -p /var/log/doli /mnt/doli-data /var/www/doli
chown -R www-data:www-data /mnt/doli-data /var/www/doli /var/log/doli

Starten Sie abschließend den Server neu

reboot now

und melden sich dann erneut mit privilegierten Benutzerrechten am Server an:

sudo -s

Das PHP Repository wurde bereits im vorherigen Kapitel eingerichtet und aktiviert, so dass
wir direkt mit der Installation beginnen können

apt update -q4 && apt install -y php7.4-fpm php7.4-common php7.4-curl php7.4-intl php7.4-mbstring php7.4-mcrypt php7.4-json php7.4-xmlrpc php7.4-soap php7.4-mysql php7.4-gd php7.4-xml php7.4-cli php7.4-zip

Setzen Sie das richtige Datumsformat, um auch ein korrektes Logging zu ermöglichen:

timedatectl set-timezone Europe/Berlin

jetzt können wir die php.ini anpassen

sed -i "s/file_uploads =.*/file_uploads = On/" /etc/php/7.4/fpm/php.ini
sed -i "s/allow_url_fopen =.*/allow_url_fopen = Off/" /etc/php/7.4/fpm/php.ini
sed -i "s/memory_limit =.*/memory_limit = 1024M/" /etc/php/7.4/fpm/php.ini
sed -i "s/;cgi.fix_pathinfo=.*/cgi.fix_pathinfo = 1/" /etc/php/7.4/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 100M/" /etc/php/7.4/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 100M/" /etc/php/7.4/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/7.4/fpm/php.ini
sed -i "s/;date.timezone =.*/date.timezone = Europe\/\Berlin/" /etc/php/7.4/fpm/php.ini

Starten Sie nun beide Dienste, nginx und PHP, neu:

service php7.4-fpm restart
service nginx restart

Die Installation von MariaDB erfolgt mit diesem Befehl:

apt update -q4 && apt install -y mariadb-server`

Härten wir nun den Datenbankserver mittels des mitgelieferten Tools
„mysql_secure_installation“. Bei einer Erstinstallation besteht kein Root Passwort, so dass
Sie die Abfrage mit ENTER bestätigen könne. Es wird empfohlen, ein Passwort direkt zu
setzen, der entsprechende Dialog erscheint automatisch:

mysql_secure_installation
 Enter current password for root (enter for none): <ENTER>
 Switch to unix_socket authentication [Y/n] Y
 Set root password? [Y/n] Y

	 root-Passwort 2 mal eingeben – Ihr-starkes-stück-Passwort -

 Remove anonymous users? [Y/n] Y
 Disallow root login remotely? [Y/n] Y
 Remove test database and access to it? [Y/n] Y
 Reload privilege tables now? [Y/n] Y

Stoppen Sie nun den Datenbankserver und sichern dann die Standardkonfiguration, um
unmittelbar danach Anpassungen vornehmen zu können

service mysql stop
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf

Kopieren Sie alle nachfolgenden Zeilen in die leere Datei:

[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
bulk_insert_buffer_size = 16M
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
concurrent_insert = 2
connect_timeout = 5
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
general_log = 0
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
innodb_read_only_compressed=OFF
key_buffer_size = 128M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_allowed_packet = 16M
max_binlog_size = 100M
max_connections = 200
max_heap_table_size = 64M
myisam_recover_options = BACKUP
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 2M
query_cache_size = 64M
query_cache_type = 1
query_cache_min_res_unit = 2k
read_buffer_size = 2M
read_rnd_buffer_size = 1M
skip-external-locking
skip-name-resolve
slow_query_log_file = /var/log/mysql/mariadb-slow.log
slow-query-log = 1
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 4M
table_open_cache = 400
thread_cache_size = 128
tmp_table_size = 64M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
#unix_socket=OFF
user = mysql
wait_timeout = 600
[mysqldump]
max_allowed_packet = 16M
quick
quote-names
[isamchk]
key_buffer = 16M

Speichern und schließen Sie die Datei und starten dann den Datenbankserver neu, um die
Dolibarr-Datenbank, den Dolibarr-Benutzer und sein Passwort einzurichten:
root-Passwort eingeben – Ihr-starkes-stück-Passwort -

service mysql restart
mysql -uroot -p
CREATE DATABASE DatenbankName CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER [email protected] identified by 'DatenbankPasswort'; GRANT ALL PRIVILEGES on DatenbankName.* to [email protected]; FLUSH privileges; quit;

Aus Erfahrung heraus empfehle ich Ihnen, den Server einmalig neu zu starten:

reboot now

Wir richten nun verschiedene vhost, also Serverkonfigurationsdateien, ein und modifizieren
die Standard vhost-Datei persistent. Da das System zuvor neu gestartet wurde wechseln wir
erneut in den privilegierten Benutzermodus, sichern die Standard vhost-Datei namens
default.conf und legen leere vHost-Dateien zum Konfigurieren an.

sudo -s

Erstellen Sie die globale vhost-Datei

nano /etc/nginx/conf.d/doli.conf

Kopieren Sie alle nachfolgenden Zeilen in die Datei und passen die rot markierten
Werte entsprechend Ihres Systems an und speichern und schließen Sie diese Datei.

server {
	listen 80;
	listen [::]:80;
	root /var/www/doli/htdocs;
	index  index.php index.html index.htm;
	server_name  Ihr-Server-Name;

	client_max_body_size 100M;
	client_body_timeout 3600s;
	fastcgi_buffers 64 4K;

	location ~ ^/api/(?!(index\.php))(.*)
	{
	try_files $uri /api/index.php/$2?$query_string;
	}

	location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)
	{
	return 404;
	}
	location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)
	{
	return 404;
	}

	location ~ [^/]\.php(/|$)
	{
		fastcgi_split_path_info ^(.+?\.php)(/.*)$;
		fastcgi_pass unix:/run/php/php7.4-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_param PATH_INFO $fastcgi_path_info;
		fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
		include fastcgi_params;
		fastcgi_read_timeout 3600;
		fastcgi_send_timeout 3600;
	}

	location ~ ^/api/(?!(index\.php))(.*)
	{
		try_files $uri /api/index.php/$2?$query_string;
	}

	gzip on;
	gzip_vary on;
	gzip_comp_level 4;
	gzip_min_length 256;
	gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
	gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
}

wenn Sie Ihr Dolibarr hinter einem Proxi oder Revers-Proxi installieren
müssen Sie dafür eine weiter .conf erstellen

nano /etc/nginx/conf.d/proxi.conf

in die kommt das rein

# nur verwenden wenn Sie einen Proxi oder revers-Proxi nutzen

server {
	listen 80;
	location /
	{
		proxy_pass http://IP-Dolibarr-Server;
		client_max_body_size 100M;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
		proxy_http_version 1.1;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header Host $host;
	}
}

Webserver erneut starten.

service nginx restart

Wir beginnen nun die ‚eigentliche‘ Installation von Dolibarr und
laden das aktuelle Dolibarr Release herunter: - zurzeit 15.0.1

cd /tmp && wget https://sourceforge.net/projects/dolibarr/files/Dolibarr%20ERP-CRM/15.0.1/dolibarr-15.0.1.zip

Entpacken Sie Dolibarr und verschieben es in das Webverzeichnis (var/www/doli)

unzip dolibarr-15.0.1.zip && rm /tmp/dolibarr-15.0.1.zip
mv dolibarr-15.0.1/* /var/www/doli

setzen der Berechtigung

chown -R www-data:www-data /var/www/doli

Wir können nun mit der installation von Dolibarr fortfahren.
öffnen Sie Dolibarr in Ihrem Browser

Ihre.Domain.de

den Dokumentortner eintragen - /mnt/doli-data
den DB-Namen eintragen
Datenbank erstellen nicht anklicken
DB-User und DB-Passwort eintragen
Erstellen Sie ein Benutzerkonto… anklicken
root und root-Passwort eintragen

Admin-Name und Admin-Passwort eintragen
jetzt können Sie sich bei Dolibarr einloggen

Um Dolibarr in einer sicheren (zumindest sicherer) Umgebung zu nutzen
Schließen Sie es wieder und machen mit der Serverseitigen Einrichtung weiter

Server update und upgrade und unnötiges löschen

apt update && apt upgrade -V && apt dist-upgrade -y && apt autoremove -y

Server neustart

reboot now

und mit dem priviligierten Benutzerrechten am Server anmelden

sudo -s

Jetzt wo die Installation geklappt hat können Sie die Ladezeit wieder verringern

nano /etc/nginx/conf.d/doli.conf

nachstehendes suchen und anpassen

fastcgi_read_timeout 360;
fastcgi_send_timeout 360;

Jetzt legen Sie die install.lock an um zu verhindern das eine erneute Installation erfolgt

nano /mnt/doli-data/install.lock
# nur ein Enter und wieder raus

Texteditor verlassen - bei nano CTRL+x (STRG+x) - save mit y bestätigen

php.ini anpassen

sed -i "s/session.use_strict_mode =.*/session.use_strict_mode = 1/" /etc/php/7.4/fpm/php.ini
sed -i "s/session.use_only_cookies =.*/session.use_only_cookies = 1/" /etc/php/7.4/fpm/php.ini
sed -i "s/session.cookie_httponly =.*/session.cookie_httponly = 1/" /etc/php/7.4/fpm/php.ini
sed -i "s/session.cookie_samesite =.*/session.cookie_samesite = Lax/" /etc/php/7.4/fpm/php.ini
sed -i "s/;allow_url_fopen =.*/allow_url_fopen = Off/" /etc/php/7.4/fpm/php.ini
sed -i "s/allow_url_include =.*/allow_url_include = Off/" /etc/php/7.4/fpm/php.ini

Sie sollten die PHP-Funktionen deaktivieren, falls Sie keine Systembefehle
in benutzerdefiniertem Code ausführen wollen:

sed -i "s/disable_functions =.*/disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,passthru,shell_exec,system,proc_open,popen/" /etc/php/7.4/fpm/php.ini

für den fall das Sie Ihre Meinung geändert haben und doch benutzerdefinierte
Code ausführen möchten

sed -i "s/disable_functions =.*/disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals/" /etc/php/7.4/fpm/php.ini
# Starten Sie nun beide Dienste, nginx und PHP, neu:
service php7.4-fpm restart
service nginx restart

Öffnen Sie bei Dolibarr gehen Sie auf Einstellungen → Sicherheit →
klick auf den Reiter Passwörter → ganz runter scrollen und klicken Sie bei
Datenbankpasswort in der Konfigurationsdatei conf.php verschlüsselt speichern
(empfohlene Einstellung) auf → Aktivieren

gehen Sie zurück zur Serverseite

nano /var/www/doli/htdocs/conf/conf.php

nachstehendes suchen und anpassen, speichern und schließen

$dolibarr_main_prod='1';

Jetzt vergeben Sie an die /conf.php nur Leserechte

chmod -R 400 /var/www/doli/htdocs/conf/conf.php

Als nächstes installieren wir fail2ban um den Server gegen Brute-force-Attacken und
fehlerhafte Login versuche zu schützen:

apt update -q4 && apt install -y fail2ban

Erstellen Sie eine neue Filterdatei für Passwort vergessen und befüllen diese wie
nachfolgend beschrieben

touch /etc/fail2ban/filter.d/doli-passforgotten.conf

Kopieren Sie alles von „cat …“ bis „… EOF“ in Ihre Zwischenablage und fügen es dann in die
Shell ein:

cat <<EOF >/etc/fail2ban/filter.d/doli-passforgotten.conf
[Definition]
failregex = ^ [A-Z\s]+ <HOST>\s+--- Access to .*/passwordforgotten.php - action=buildnewpassword
ignoreregex =
EOF

Erstellen Sie eine neue Filterdatei für Passwort Falscheingabe und befüllen diese wie
nachfolgend beschrieben

touch /etc/fail2ban/filter.d/doli-passwrong.conf

Kopieren Sie alles von „cat …“ bis „… EOF“ in Ihre Zwischenablage und fügen es dann in die
Shell ein:

cat <<EOF >/etc/fail2ban/filter.d/doli-passwrong.conf
[Definition]
failregex = ^ [A-Z\s]+ <HOST>\s+functions_dolibarr::check_user_password_.* Authentication KO
ignoreregex =
EOF

Bestätigen Sie mit um die Datei zu befüllen

Damit dieser Filter zum Einsatz kommt, wird dies Fail2ban noch bekannt gemacht:

nano /etc/fail2ban/jail.local

Hier fügen wir folgenden Inhalt ein:

[doli-passforgotten]
; rule against call of passwordforgottenpage
enabled = true
port    = http,https
filter  = doli-passforgotten
logpath = /var/log/doli-passforgotten.log
action  = %(action_mw)s
bantime  = 86400     ; 1 day
findtime = 3600      ; 1 hour
maxretry = 5

[doli-passwrong]
; rule against bruteforce hacking (login + api)
enabled = true
port    = http,https
filter  = doli-passwrong
logpath = /var/log/doli-passwrong.log
action  = %(action_mw)s
bantime  = 86400     ; 1 day
findtime = 3600      ; 1 hour
maxretry = 5

Erstellen Sie 2 Logfiles für ihre Dolibarr-Filter
fügen Sie ind jedes Log nur ein Enter ein und speichern

nano /var/log/doli-passforgotten.log
nano /var/log/doli-passwrong.log

Mit den zuvor dargestellten Parametern wird nach 5 fehlerhaften Anmeldeversuchen
(maxretry) innerhalb der letzten 3600 (findtime, das entspricht 1h) die IP des
potentiellen Angreifers für einen Zeitraum von 86400 Sekunden (bantime, enspricht 1Tag)
gesperrt.
Starten Sie fail2ban neu und überprüfen den fail2ban-status:

service fail2ban restart
service fail2ban status

Aktualisieren Sie ihren Server und installieren Sie postfix. Sie haben damit die Möglichkeit,
sich von fail2ban, apticron und bei SSH-Anmeldungen per Mail informieren zu lassen:

apt update -q4 && apt install -y postfix mailutils

Erstellen Sie Ihre Mailkonfiguration
Wählen Sie zuerst Satellitensystem aus,
geben dann ihre Domäne ein (Ihre.Domain.de) und zuletzt
noch den smtp.Server.

verschieben Sie die Original main.cf nach main.cf.bak

mv /etc/postfix/main.cf /etc/postfix/main.cf.bak

und fügen Sie nun die folgende Postfixkonfiguration ein:

nano /etc/postfix/main.cf

Ersetzen Sie die rot markierten Stellen und überschreichen damit den inhalt:

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2
smtpd_tls_security_level=may
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_un>
myhostname = localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, Ihre-Domain.de, localhost.Ihre.Dolain.de, localhost
relayhost = smtp.Server:587
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
#Bei Problemen mit IPv6 stellen Sie die Zeile wie nachfolgend um
#inet_protocols = ipv4
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps =  hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
sender_canonical_maps = hash:/etc/postfix/sender_canonical
smtp_use_tls = yes
smtp_enforce_tls = yes

erstellen und hinterlegen Sie nun die Zugangsdaten für das Versenden von Mails:

nano /etc/postfix/sasl_passwd

Tragen Sie die Daten wie folgt ein und ersetzen die roten Werte durch Ihre:

smtp.server [email protected]:Ihr-Passwort

Da in dieser Datei das Passwort im Klartext steht setzen wir die Dateiberechtigungen auf # 600

chmod 600 /etc/postfix/sasl_passwd
# Schreiben Sie nun die Domäne in die Datei mailname:
nano /etc/mailname

Ersetzen Sie den roten Wert durch Ihre Domäne:

Mailadresse.de

Abschließend definieren wir noch den Bezug von Benutzern zu Mailadressen. Öffnen Sie die Datei

nano /etc/postfix/sender_canonical

und legen dort Benutzer und Mailadressen fest:

root [email protected]
< [email protected] > [email protected] 
www-data [email protected] 
default [email protected]

Jetzt werden die Konfiguration kompiliert und Postfix neu gestartet:

postmap /etc/postfix/sasl_passwd
postmap /etc/postfix/sender_canonical
service postfix restart

Testen Sie nun den Versandt einer Mail über Ihr Postfix

echo "Dies ist eine Testmail" | mailx -s "Test" [email protected]

Sollte die Mail nicht ankommen, so sehen Sie bitte im Log (mail.log) nach:

nano /var/log/mail.log

Passen Sie die PHP-Konfiguration an um auch PHP-Mails über postfix zu versenden:
Setzen Sie den sendmail_path wie folgt:

sed -i "s/;sendmail_path =.*/sendmail_path = \/usr\/\sbin\/\sendmail -t -i/" /etc/php/7.4/fpm/php.ini

und starten dann PHP neu:

service php7.4-fpm restart

Ersetzen Sie in der fail2ban-Konfiguration die nachfolgenden Parameter durch Ihre, um
Benachrichtigungen bei fehlerhaften Login versuchen und Banns zu erhalten. Sichern Sie
dazu die Originalkonfiguration von fail2ban und bearbeiten diese dann:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak
sed -i "s/destemail =.*/destemail = [email protected]/" /etc/fail2ban/jail.conf 
sed -i "s/sender =.*/sender = [email protected]/" /etc/fail2ban/jail.conf
sed -i "s/mta =.*/mta = mail/" /etc/fail2ban/jail.conf
sed -i "s/action = %(action_)s.*/action = %(action_mwl)s/" /etc/fail2ban/jail.conf

Um bei einem Serverneustart fail2ban-Mails zu unterdrücken passen Sie die folgende Datei an:

nano /etc/fail2ban/action.d/mail-buffered.local

Kopieren Sie den Inhalt hinein:

[Definition]
actionstart =
actionstop =

Legen Sie dann Dummy-Dateien durch das Ausführen der folgenden Befehle an:

cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail-whois-lines.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail-whois.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/sendmail-buffered.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/sendmail-common.local

Starten Sie den fail2ban-Service neu

service fail2ban restart

und Sie werden ab sofort (nur noch) bei Banns, also neu blockierten IP-Adressen die durch
fehlerhafte Login versuche aufgefallen sind, informiert.

Apticron informiert Sie über verfügbare Systemaktualisierungen bzw. auch dann, wenn ihr
System „up2date“ ist. Installieren Sie apticron aus den Standardsoftwarequellen Ubuntus:

apt update -q4 && apt install -y apticron

Nun passen wir apticron an und ändern wenigstens die folgenden Parameter:
Die ,conf ist selbsterklärend und Sie können weitere Anpassungen nach Ihren
Vorstellungen vornehmen

cp /usr/lib/apticron/apticron.conf /etc/apticron/apticron.conf

nano /etc/apticron/apticron.conf
EMAIL="[email protected]"
SYSTEM="Ihre.Domai.de"
NOTIFY_HOLDS="1"
NOTIFY_NO_UPDATES="1"
CUSTOM_SUBJECT='$SYSTEM: $NUM_PACKAGES package update(s)'
CUSTOM_NO_UPDATES_SUBJECT='$SYSTEM: no updates available'
CUSTOM_FROM="[email protected]"

Überprüfen Sie apticron und den soeben konfigurierten Mailversand indem sie apticron
aufrufen:

apticron

Sie erhalten nun umgehend eine Mailbenachrichtigungen über Ihren aktuellen
Systemzustand. Passen Sie zuletzt noch den Cronjob an, um sich regelmäßig und
automatisch benachrichtigen zu lassen:

cp /etc/cron.d/apticron /etc/cron.d/apticron.bak
nano /etc/cron.d/apticron

den vorhandenen Eintrag durch diesen ersetzen

30 7 * * * root if test -x /usr/sbin/apticron; then /usr/sbin/apticron --cron; else true; fi

Apticron Informiert Sie jetzt jeden Morgen um 07.30 Uhr per Mail über Ihren
Systemaktualitätsgrad und möglich Aktualisierungs Maßnahmen.

wenn Sie über die erfolgreichen SSH-Einwahl informiert werden möchten
Passen Sie die Profildatei an und erweitern diese am Ende um die folgenden Zeilen:

nano /etc/profile
if [ -n "$SSH_CLIENT" ]; then
        echo 'Login on' `hostname` `date` `who -m` | mail -s "Login on `hostname` from `echo $SSH_CLIENT |
        awk '{print $1}'`" [email protected]
fi

Bei jeder erfolgreichen SSH-Einwahl werden Sie ab sofort aktiv benachrichtigt.
Solange Sie selbst es wahren ist alles okay – aber wenn nicht……

service php7.4-fpm restart
service nginx restart
apt update && apt upgrade -V && apt dist-upgrade -y && apt autoremove -y
reboot now

Jetzt können Sie Dolibarr einrichten und ich wünsche Ihnen viel Spaß und Erfolg damit.
Sollten Sie auf Probleme - Fehler oder sonstige Ärgernisse stoßen
Fragen Sie jemanden der sich auskennt
Wenn Sie Lob verteilen möchten stehe ich gerne zur Verfügung

Gruß Skalar

1 „Gefällt mir“

Super! Vielen Dank für die detaillierte Beschreibung, man sieht, dass dort viel Arbeit reingeflossen ist! :+1:

Vielleicht könnte man die Anleitung auch zusätzlich ins Dolibarr-Wiki mit aufnehmen? Ich bin mir nicht sicher, wo es die Ratsuchenden am besten erreicht, dort oder hier im Forum.

Installation und Konfiguration von Redis

Wir installieren den Redis-Server um die Dolibarrperformance zu steigern, da durch Redis die Last auf der MariaDB-Dolibarrdatenbank reduziert wird:

apt update -q4 && apt install -y redis-server

Passen Sie die Rediskonfiguration durch das Sichern und Anpassen der Konfiguration mittels Ausführens der nachfolgenden Befehle an

cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sed -i "s/port 6379/port 0/" /etc/redis/redis.conf
sed -i s/\#\ unixsocket/\unixsocket/g /etc/redis/redis.conf
sed -i "s/unixsocketperm 700/unixsocketperm 770/" /etc/redis/redis.conf
sed -i "s/# maxclients 10000/maxclients 10240/" /etc/redis/redis.conf
usermod -aG redis www-data
cp /etc/sysctl.conf /etc/sysctl.conf.bak
sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf

Starten Sie den gesamten Server neu

reboot now

Gratulation, Redis ist jetzt Installiert und eingerichtet.

Installation und Konfiguration einer SSL-Zertifizierung

Vorausgesetzt Sie haben die bisherige Installation erfolgreich abgeschlossen, können Sie diese um ein SSL-Zertifikat erweitern.
Selbstverständlich kann das schon im ersten Schritt erfolgen, aber dafür müsste ich jetzt den ganzen Post ändern.

Wechseln Sie in den privilegierten Benutzermodus

sudo -s
apt update -q4 && apt install -y ssl-cert ca-certificates

Erstellen Sie die nötigen Ordner für die SSL-Zertifikate

mkdir -p /var/www/letsencrypt/.well-known/acme-challenge /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs
make-ssl-cert generate-default-snakeoil -y

Wir richten nun verschiedene vhost, also Serverkonfigurationsdateien, ein und modifizieren die Standard vhost-Datei persistent. Sichern der Standard vhost-Datei namens default.conf und legen leere vHost-Dateien zum Konfigurieren an.

[ -f /etc/nginx/conf.d/default.conf ] && mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
[ -f /etc/nginx/conf.d/http.conf ] && mv /etc/nginx/conf.d/http.conf /etc/nginx/conf.d/doli.http.bak
[ -f /etc/nginx/conf.d/doli.conf ] && mv /etc/nginx/conf.d/doli.conf /etc/nginx/conf.d/doli.conf.bak
touch /etc/nginx/conf.d/default.conf
touch /etc/nginx/conf.d/http.conf
touch /etc/nginx/conf.d/doli.conf

Somit ist durch die leere „default.conf“ Datei auch bei späteren Aktualisierungen des Webservers sichergestellt, dass diese Standardkonfiguration den Dolibarr betrieb nicht beeinflusst.

Bearbeiten Sie die globale vhost-Datei, um die http-Standardanfragen permanent auf https umzuleiten und zudem die SSL-Zertifikatskommunikation mit Let’sEncrypt zu ermöglichen

nano /etc/nginx/conf.d/http.conf

Kopieren Sie alle nachfolgenden Zeilen in die Datei http.conf und passen Ihre.Domain.de entsprechend Ihres Systems an:

upstream php-handler {
server unix:/run/php/php7.4-fpm.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name Ihre.Domain.de;
root /var/www;
location ^~ /.well-known/acme-challenge {
default_type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}

Speichern und schließen Sie diese Datei. Bearbeiten Sie nun die eigentliche Dolibarr vHost-Datei doli.conf, die sämtliche Konfigurationen für den Betrieb der Dolibarr enthält.

nano /etc/nginx/conf.d/doli.conf

Kopieren Sie alle nachfolgenden Zeilen in die Datei doli.conf und passen Ihre.Domain.de entsprechend Ihres Systems an

server {
	listen 443      ssl http2;
	listen [::]:443 ssl http2;
	root /var/www/doli/htdocs;
	index  index.php index.html index.htm;
	server_name Ihre.Domain.de;

	ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
	ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
	ssl_trusted_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
	#ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
	#ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
	#ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
	#ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
	#ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
	ssl_dhparam /etc/ssl/certs/dhparam.pem;
	ssl_session_timeout 1d;
	ssl_session_cache shared:SSL:50m;
	ssl_session_tickets off;
	ssl_protocols TLSv1.3 TLSv1.2;
	ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';
	ssl_ecdh_curve X448:secp521r1:secp384r1;
	ssl_prefer_server_ciphers on;
	ssl_stapling on;
	ssl_stapling_verify on;

	client_max_body_size 100M;
	client_body_timeout 3600s;
	fastcgi_buffers 64 4K;

	location ~ ^/api/(?!(index\.php))(.*)
	{
	try_files $uri /api/index.php/$2?$query_string;
	}

	location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)
	{
	return 404;
	}
	location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)
	{
	return 404;
	}

	location ~ [^/]\.php(/|$)
	{
		fastcgi_split_path_info ^(.+?\.php)(/.*)$;
		fastcgi_pass unix:/run/php/php7.4-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_param PATH_INFO $fastcgi_path_info;
		fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
		include fastcgi_params;
		fastcgi_read_timeout 3600;
		fastcgi_send_timeout 3600;
	}

	location ~ ^/api/(?!(index\.php))(.*)
	{
		try_files $uri /api/index.php/$2?$query_string;
	}

	gzip on;
	gzip_vary on;
	gzip_comp_level 4;
	gzip_min_length 256;
	gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
	gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

	location ^~ /.well-known
	{
		location = /.well-known/carddav
		{
			return 301 /remote.php/dav/;
		}
		location = /.well-known/caldav
		{
			return 301 /remote.php/dav/;
		}
		location /.well-known/acme-challenge
		{
			try_files $uri $uri/ =404;
		}
		location /.well-known/pki-validation
		{
			try_files $uri $uri/ =404;
		}
		return 301 /index.php$request_uri;
	}
}

Speichern und schließen Sie diese Datei und erweitern dann die Server- und Systemsicherheit durch die Möglichkeit des sicheren Schlüsselaustauschs mittels eines Diffie-Hellman Schlüssels

openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Das Generieren kann – in Abhängigkeit von der Systemleistung – einige Minuten dauern. Erst wenn das Generieren abgeschlossen ist, starten Sie den Webserver erneut.

service nginx restart

Bitte stellen Sie sicher, dass Ihr Server sowohl über Port 80/TCP als auch über Port 443/TCP von außen erreichbar ist. Das Erstellen und Aktualisieren von Let’s Encryptzertifikaten erfolgt zwingend über http und Port 80!

Wenn Sie auf einem Heimserver arbeiten erfolgt die Freigabe auf Ihren Router
Zudem muss eine Umleitung Ihrer Domain bei Ihrem Provider bestehen.
Wie das geht erfahren sie bei Ihrem Provider und in den Einstellungen Ihres Routers.

Für das Zertifikatshandling erstellen wir nun einen dedizierten Benutzer und fügen diesen der www-data Gruppe hinzu
Einfach Enter drücken ohne etwas einzutragen bis →
Is the information correct? [Y/n] Y

adduser --disabled-login certuser
usermod -a -G www-data certuser

Diesem technischen Benutzer erteilen wir noch die notwendigen Berechtigungen, um bei einer Zertifikatserneuerung den notwendigen Webserverstart initiieren zu können.

touch /etc/sudoers.d/certuser
cat <<EOF >/etc/sudoers.d/certuser
certuser ALL=NOPASSWD: /bin/systemctl reload nginx.service
EOF

Wechseln Sie in die Shell des neuen Benutzers (certuser) um die Zertifikatssoftware zu installieren und verlassen diese Shell direkt im Anschluss wieder

su - certuser
curl https://get.acme.sh | sh
exit

Passen Sie die entsprechenden Datei- und Verzeichnisberechtigungen an, um die neuen Zertifikate darin speichern zu können

chmod -R 775 /var/www/letsencrypt && chmod -R 770 /etc/letsencrypt && chown -R www-data:www-data /var/www/ /etc/letsencrypt

Setzen Sie Let’s Encrypt als Standard CA für Ihren Server

su - certuser -c ".acme.sh/acme.sh --set-default-ca --server letsencrypt"

und wechseln dann erneut in die Shell des neuen Benutzers

su - certuser

Den nachfolgenden Schritt bitte sehr sorgfältig durchlesen und anpassen!!
Let’s Encrypt gestattet nur maximal 5 Wiederholungen pro Domain und Woche, bei jedem durchlauf sind somit 2 Vorgänge weg.

Beantragen Sie nun die SSL-Zertifikate von Let’s Encrypt und ersetzen dabei Ihre.Domain.de mit Ihrer realen Domain :

acme.sh --issue -d Ihre.Domain.de --server letsencrypt --keylength 4096 -w /var/www/letsencrypt --key-file /etc/letsencrypt/rsa-certs/privkey.pem --ca-file /etc/letsencrypt/rsa-certs/chain.pem --cert-file /etc/letsencrypt/rsa-certs/cert.pem --fullchain-file /etc/letsencrypt/rsa-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
acme.sh --issue -d Ihre.Domain.de --server letsencrypt --keylength ec-384 -w /var/www/letsencrypt --key-file /etc/letsencrypt/ecc-certs/privkey.pem --ca-file /etc/letsencrypt/ecc-certs/chain.pem --cert-file /etc/letsencrypt/ecc-certs/cert.pem --fullchain-file /etc/letsencrypt/ecc-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"

Verlassen Sie die Shell des neuen Benutzers

exit

Jetzt legen Sie ein Skript an, dass zukünftig die Berechtigungen überprüft und korrigiert

nano /root/permissions.sh

Kopieren Sie alle Zeilen in die Datei:

#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0640
find /var/www/ -type d -print0 | xargs -0 chmod 0750
chmod -R 775 /var/www/letsencrypt
chmod -R 770 /etc/letsencrypt 
chown -R www-data:www-data /var/www /etc/letsencrypt
chown -R www-data:www-data /mnt/doli-data

exit 0

Markieren Sie das Skript als ausführbar und führen es dann direkt aus:

chmod +x /root/permissions.sh
/root/permissions.sh

Entfernen Sie Ihre bisher verwendeten Self-Signed-Zertifikate aus nginx und aktivieren Sie die neuen, vollwertigen und bereits gültigen SSL Zertifikate von Let’s Encrypt. Starten Sie dann den Webserver neu:

sed -i '/ssl-cert-snakeoil/d' /etc/nginx/conf.d/doli.conf
sed -i s/#\ssl/\ssl/g /etc/nginx/conf.d/doli.conf
service nginx restart

Um sowohl die SSL-Zertifikate automatisch zu erneuern, als auch den notwendigen Webserverneustart zu initiieren, wurde automatisch ein Cronjob angelegt.

crontab -l -u certuser

Wenn alles geklappt hat ist Ihre Dolibarr Installation jetzt im Internett mit einem SSL-Zertifikat verschlüsselt und kann mit https://Ihre.Domain.de aufgerufen werden

Bitte nehmen Sie sich etwas Zeit und überprüfen den Sicherheitsstatus Ihres Servers.
Ziel sollte zudem sein, mindestens das nachfolgend dargestellte „A+“-Ergebnis in den Tests zu erzielen:

https://www.ssllabs.com/ssltest/index.html
https://observatory.mozilla.org/

Ich hoffe das Euch das etwas hilft
Gruß Scalar

Hallo und danke für dein Like

Ich denke nicht das, dass ins Wiki gehört. Das geht ja über Dolibarr raus und schafft eine halbwegs sichere Umgebung für den Betrieb.

In der Dolibarr-Wiki sollte, für den Laien verständliche Informationen zur Wartung, Nutzung, Erweiterung und Betrieb von Dolibarr geben.

Das dies in der Welt von Developern etwas anderes darstellt als für Normal-User mit rudimentären programmiert Kenntnissen ist etwas anderes.
Bitte versteh das nicht als Kritik
Es ist eine Tatsache das jemand der etwas wirklich gut kann, Probleme damit hat dies in einer Form wieder zu geben die jemand ohne dies Kenntnisse versteht.

Trotz allem hoffe ich das meine kleine Anleitung auch anderen hilft. Vll kommt ja noch das eine oder andre dazu.
Hab da ein paar Ideen für die Zukunft, wenn ich wieder zu viel Zeit zwischen Essen und schlafen habe.

Gruß Scalar

Ich habe das ganze jetzt dich als Dolibarr-Wiki Seite erstellt.

Installieren und Härten von Dolibarr - Dolibarr ERP CRM Wiki

Da ist auch der Unterschied zu debian beschrieben.

Gruß Scalar

So viel Wissen, was hier zur Verfügung gestellt wird! Respekt! Und Danke!
Ein paar kleine Anmerkungen.
Hier ist die Reihenfolge falsch. Wenn kein SSH-Server installiert und aktiv ist, komme ich per ssh-Client auch nicht drauf.

Das ist (halb) doppelt. Ich kann die Optionen direkt in der sshd.conf überprüfen, das Erstellen eines backups, welches direkt danach überschrieben wird, ist nicht notwendig.

Lustig, dass das auch funktioniert. Auf anderen als Ubuntu/Debian kann es jedoch ggf. zu Problemen kommen.
Besser wäre, den sshd neuzustarten.

Frage: Hier ist tcp als Protokoll angegeben, nicht ssh. Wäre das auch möglich (dann ohne Angabe des Ports)?

Damit ist Apache zwar deaktiviert, aber noch installiert.
systemctl stop apache2.service && systemctl disable apache2.service && apt remove apache2
wäre vollständig(er)

1 „Gefällt mir“

Hallo und danke für die Antwort

Stimmt, OpenSSH sollte, zu diesem Zeitpunkt, schon installiert sein. Meist geschieht das mit der Installation von Ubuntu.
Den Status ab zu fragen ist aber in jedem Fall nicht verkehrt.

Nun das hat schon einen Grund, der sich aus meiner Erfahrung mit - nicht neu aufgesetzten - Betriebssystemen ergeben hat.

sudo cp .......

kopiert, in dem Fall die sshd_config nach sshd_config.bak

damit bleibt der Inhalt beider erhalten und kann mit

sudo sshd -T

ausgelesen werden, bestehende Systeme haben gelegentlich Einstellungen die in die neue mit übernommen werden müssen, daher erst mal nur kopiert.
Um den Inhalt der ganzen sshd.config zu ersetzen gibt es ein paar Möglichkeiten.
eine ist das File zu löschen

sudo rm /etc/ssh/sshd_config

eine andere ist, die beschriebene, die sshd_config zu verschieben

sudo mv /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

man könnte auch im Editor jede einzelne Zeile löschen z.B. mit strg-k (ctrl-k) im Fall von nano

Die Portfreigabe habe ich mit 3 Möglichkeiten beschrieben

  • entweder direkte Freigabe des Standard Port mit → sudo ufw allow allow ssh
    (ist die schwächste da der Port bereits bekannt ist und so der unerwünschte Zugriff leichter fällt)

  • oder die Freigabe des selbst gewählten Port mit → sudo ufw allow allow PORT
    (in dem Fall muss der Port erst gefunden werden der für eine Verbindung mit SSH offen ist)

Die Dritte Möglichkeit, und sicherste ist die Freigabe noch zu verstärkten indem diese an einen festgelegte IP-Adresse gebunden wird.
→ sudo ufw allow proto tcp from erhaltene IP Adresse to Server IP Adresse port eigenes Port
Wenn Sie den Port hier nicht mit angibt, ist auch kein Port offen und es kann keine Verbindung hergestellt werden.

" proto tcp " ist nur das Protokoll und gibt kein Port frei.

Stimmt kann man machen und sollte auch gemacht werden, wenn Apache unnötig als Installation vorhanden ist.

Vielen Dank für das Feedback _MSc und die Anmerkungen.
Ich bin mir sicher Sie finden noch mehr das ich falsch, unverständlich oder doppelt beschrieben habe und freue mich über weitere Anmerkungen.
Gruß Scalar

PS
Es hat sich erledigt, der Key war ja noch in meinem Windows Verzeichnis, der Grund warum Putty sich nicht anmelden konnte war mein Benutzername (Groß und Klein-schreibung) hatte ich nicht beachtet.

Hallo Scalar,
erstmal vielen Dank für diese Tolle Anleitung, es hat mir viel geholfen Dolibarr Sicher einzurichten und ist seit fast 2 Monaten im Einsatz, heute habe ich leider meinen SSH Putty Zugang verloren, ich wollte lediglich die Schriftgröße ändern und überschrieb mein Dolibarr Profil und schon war das Zertifikat oder ähnl. nicht mehr da.
Meine Frage, kann ich sorglos ein Neues Schlüssel Paar erstellen ohne den Betrieb von Dolibarr zu gefährden, bei mir läuft es unter Ubuntu 20.04 als Hyper-V VM, ich habe also über Hyper-V noch Zugriff, würde aber gerne wieder mit Putty arbeiten.

LG
Jason.