Hoe installeer ik een veilige website op Debian 10 of 11 met Apache, PHP, SSH, SSL, UFW, HTTPS, HTTP2 en securityheaders?
Installeer Debian 10 of 11 met Cinnamon Desktop, webserver en SSH server:
Log in als root, open terminal en kijk of het hekje er staat. Zo ja dan ben je root en hoef je niet meer eerst sudo te typen.
root@vps#
sudo apt update
sudo apt upgrade
Installeer en activeer de UFW firewall:
sudo apt install ufw
sudo ufw status
sudo ufw enable
sudo ufw app list
sudo ufw allow SSH
sudo ufw allow 'WWW Full'
regel verwijderen doe je zo:
sudo ufw app list numbered
sudo ufw delete 3
sudo ufw reload
veilige verbinding met SSH: Om onderstaande makkelijk te kunnen plakken in je console moet je root toestaan voor SSH
sudo nano /etc/ssh/sshd_config
PermitRootLogin yes
Reboot of reload SSH
Als je dit niet veilig genoeg vind geef dan in de firewall aan welk IP adres toegang mag hebben via SSH en verwijder alle andere:
ufw allow from hier.je.ip.adres to any port 22
ufw status
ufw reload
ufw status
Kijk op welke regel SSH staat en verwijder de regel.
ufw status
ufw delete 1
ufw reload
Kijk nog een keer op welke regel SSH (v6) staat en verwijder de regel.
ufw delete 4
ufw reload
ufw status
Nu kan je vanaf je computer veilig inloggen op je webserver met ssh als root
Handig voor SFTP Drive en RDP door een SSH tunnel
SFTP programma's voor Windows:
Filezilla SFTP Net Drive
SSH Tunnel met Putty:
In Putty:
Maak een SSH tunnel met port 1234 en destination localhost:3389
Open tunnel en log in.
RDP via SSH tunnel:
Op server:
sudo apt install xfce4
sudo apt install xrdp
Op werkstation:
In RDP log je in met 127.0.0.1:1234 en servernaam\user
Nodig voor bovenstaande:
Putty voor Windows
Apache webserver:
sudo systemctl status apache2
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo mkdir -p /var/www/computerbas
sudo chown -R $USER:$USER /var/www/computerbas
sudo chmod -R 755 /var/www/computerbas
nano /var/www/computerbas/index.html
En dan:
<html>
<head>
<title>Welkom op mijn website.nl!</title>
</head>
<body>
<h1>Gelukt! Virtual host werkt!</h1>
</body>
</html>
hostname -I
sudo apt install curl
curl -4 icanhazip.com
check: http://hier.je.server.ip
sudo systemctl restart apache2
sudo nano /etc/apache2/sites-available/computerbas.conf
En dan:
<VirtualHost *:80>
ServerAdmin bas@computerbas.nl
ServerName computerbas.nl
ServerAlias www.computerbas.nl
DocumentRoot /var/www/computerbas
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
En dan:
sudo a2ensite computerbas.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
HTTP2:
sudo a2dismod php7.4
sudo systemctl restart apache2
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2
sudo service php7.4-fpm restart
sudo a2enmod http2
sudo systemctl restart apache2
sudo a2enmod headers
sudo systemctl restart apache2
Security:
sudo apt install libapache2-mod-security2
sudo systemctl restart apache2
sudo nano /etc/apache2/conf-enabled/security.conf
En dan:
ServerTokens Full
ServerSignature On
SecServerSignature "Bas"
TraceEnable Off
Expires header:
sudo a2enmod expires
sudo systemctl restart apache2
SSL:
sudo apt update
sudo apt install python-certbot-apache
sudo certbot --apache --rsa-key-size 4096 --must-staple --staple-ocsp -d computerbas.nl -d www.computerbas.nl
sudo certbot renew --dry-run
sudo nano /etc/apt/sources.list
deb http://ftp.debian.org/debian buster-backports main
sudo apt install python-certbot-apache -t buster-backports
sudo certbot --apache --rsa-key-size 4096 --must-staple --staple-ocsp -d computerbas.nl -d www.computerbas.nl
sudo certbot renew --dry-run
PHP 7.4:
sudo apt install php7.4
sudo apt install php7.4-mysql
sudo apt install php7.4-zip
sudo apt install php7.4-fpm
sudo apt install php7.4-mbstring
sudo apt install php-curl
sudo apt install php7.4-curl
sudo a2enmod proxy_fcgi setenvif
sudo systemctl restart apache2
sudo a2enconf php7.4-fpm
sudo systemctl restart apache2
sudo a2enmod setenvif
sudo a2enmod headers
sudo a2enmod deflate
sudo a2enmod filter
sudo a2enmod expires
sudo a2enmod rewrite
sudo a2enmod include
En dan..
Securityheaders in ssl.conf:
Er zijn meer dan 100 HTTP response headers en je hebt ze zeker niet allemaal nodig. Alle mogelijk denkbare headers die je redelijkerwijs nodig zou kunnen hebben voor beveiliging staan hieronder. Probeer ze zeker niet allemaal tegelijk aan te zetten want dan kom je er niet achter welke header een probleem geeft als je website het niet meer doet. Als je meer wilt weten over een specifieke header check wikipedia: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
Als je Let's Encrypt gebruikt voor je SSL certificaat staat het configuratie bestand hier:
/etc/letsencrypt/options-ssl-apache.conf
En in:
/etc/apache2/sites-enabled/000-default-le-ssl.conf
staat :
Include /etc/letsencrypt/options-ssl-apache.conf
Om een nieuw configuratie bestand te gebruiken doe je dit:
sudo nano /etc/apache2/sites-available/computerbas.conf
SSLStaplingCache shmcb:/var/run/apache2/stapling_cache(128000)
DocumentRoot /var/www/computerbas
ServerName www.computerbas.nl
ServerAlias computerbas.nl
Include /etc/letsencrypt/ssl.conf
SSLCertificateFile /etc/letsencrypt/live/computerbas.nl/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/computerbas.nl/privkey.pem
DirectoryIndex index.php
AddType application/x-httpd-php .php
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
En dan:
sudo nano /etc/letsencrypt/ssl.conf
SSLEngine On
SSLHonorCipherOrder On
SSLCompression Off
SSLUseStapling On
SSLOptions +StrictRequire
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-SHA
Protocols h2
SSLOpenSSLConfCmd ECDHParameters secp384r1
SSLOpenSSLConfCmd Curves secp521r1:secp384r1
SSLSessionTickets Off
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
ExpiresActive On
ExpiresDefault "access plus 1 week"
SetEnv no-gzip
#Kijk uit met deze settings! Controleer of je website nog wel werkt na elke stap!
#Check het debugscherm van je browser en de logboeken van je webserver!
Header always set Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload'
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
Header always set Set-Cookie __Secure-sessionid=computerbas;Path=/;Secure;HttpOnly;SameSite=Strict
Header always set X-Xss-Protection '1; mode=block'
Header always set Referrer-Policy 'no-referrer'
Header always set X-Permitted-Cross-Domain-Policies 'master-only'
Header always set X-Download-Options 'noopen'
Header always set X-Powered-By ComputerBas
Header always set Expect-CT max-age=0
Header always set Expect-Staple 'max-age=31536000; includeSubDomains; preload'
Header always set Access-Control-Allow-Origin computerbas.nl
Header always set Accept-Ranges bytes
Header always set Allow "GET, POST"
Header always set X-DNS-Prefetch-Control on
Header always set X-Robots-Tag all
#Header always set X-Robots-Tag none
Header always set Trailer Max-Forwards
Header always set Tk ?
Header always set X-UA-Compatible IE=edge
Header always set X-AspNet-Version ComputerBas
Header always set Access-Control-Allow-Credentials true
Header always set Access-Control-Allow-Methods "POST, GET"
Header always set Access-Control-Allow-Headers "origin"
Header always set Access-Control-Request-Method "POST, GET"
Header always set Access-Control-Request-Headers "X-PINGOTHER, Content-Type"
Header always set Access-Control-Max-Age 3600
Header always set Access-Control-Expose-Headers: Content-Length
Header always set cross-origin-embedder-policy "unsafe-none"
Header always set cross-origin-opener-policy "unsafe-none"
Header always set cross-origin-resource-policy "cross-origin"
Header always set Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=(), midi=(),fullscreen=()"
#Kijk uit met de onderstaande CSP settings! Controleer of je website nog wel werkt in het debug scherm van de browser.
Header always set Content-Security-Policy "default-src 'none'; media-src 'self'; object-src 'none'; font-src 'self' https://fonts.gstatic.com; frame-src 'self' https://gadgets.buienradar.nl; frame-ancestors 'none'; form-action 'self'; manifest-src 'self'; img-src data: 'self'; base-uri 'none'; style-src https://computerbas.nl https://www.computerbas.nl; child-src https://computerbas.nl https://www.computerbas.nl; connect-src 'self'; script-src https://computerbas.nl https://www.computerbas.nl; upgrade-insecure-requests;"
Web Application Firewall:
nano /etc/modsecurity/modsecurity.conf
#Kijk uit met de onderstaande setting! Controleer of je website nog wel werkt in het debug scherm van de browser en ohja een herstart van apache duurt ongeveer 10 seconden langer. Is niet erg maar dan weet je dat ook weer.
#SecRuleEngine DetectionOnly
SecRuleEngine On
Alles werkend? Cool! Maak een snapshot en een backup!
Lees deze handleiding (en andere) op mijn forumpagina hier:
https://forum.computerbas.nl/viewtopic.php?id=64