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


Voor Debian 11:


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


Voor Debian 10:


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;"

en dan..


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



    Laatst gewijzigd op 26/01/2023
  Deze server draait Debian 11.6 en Apache 2.4.54
SSL 100% A+ Mozilla A+ Cryptcheck A+ Securityheaders A+ Immuniweb A+ Immuniweb A+ Securityheaders A++ Internet 100% HSTS OK Valid CSS Home Cookie Policy Privacy Policy Facebook Twitter LinkedIn
Deze website is gemaakt om je te helpen met het maken van een veilige website en veilige verbindingen met die website. Verder heb ik geprobeerd om maximaal te scoren bij SSL en SEO checkers. Die SEO checkers kijken naar allerlei onzinnige dingetjes die je niet als je naar m'website kijkt maar een internet browser leest dat allemaal heel anders. En daar ga je dan enorm op zitten studeren hoeveel characters je pagina titel mag hebben bijvoorbeeld. En wat de ideale hoeveelheid content ik op een webpagina. Zoals je hier kunt lezen moet je vooral niet te weinig content hebben anders gaat vooral die nibbler.silktide.com zeiken. Maar hij heeft gelijk want hij kijkt naar wat een search engine zoals Google gewoon graag wil zien. En dan doen we dat zo. Of je dat nou leuk vind of niet dat maakt eigenlijk verder helemaal niks uit. Zo moet het PUNT! Kijk gerust in de broncode van mijn HTML pagina's hoe ik het een en ander gedaan heb. Ik heb geprobeerd om te voldoen aal alle security richtlijnen die er maar zo ongeveer zijn op internet. En ik ben op zoek gegaan naar het randje van waar beveiliging ophoud en het grote hacken gaat beginnen. In ben echt heel benieuwd hoe moeilijk ze het vinden om mijn website te hacken aangezien ik zo ongeveer alles gedaan heb om hem veilig te maken. Zonder dat ik daarmee lager in Google kom te staan bijvoorbeeld. Succes ermee!! Geef me een like op Facebook als je er iets aan hebt gehad. Hier komt meer over waar ik deze website voor heb gemaakt. Deze regels staan er vooral om meer content te krijgen. Dat is nodig volgens nibbler.silktide.com. Stom dat ik niet nog twaalf woorden extra heb getypt want dan had ik er precies 1000. Deze website is gemaakt om je te helpen met het maken van een veilige website en veilige verbindingen met die website. Verder heb ik geprobeerd om maximaal te scoren bij SSL en SEO checkers. Die SEO checkers kijken naar allerlei onzinnige dingetjes die je niet als je naar m'website kijkt maar een internet browser leest dat allemaal heel anders. En daar ga je dan enorm op zitten studeren hoeveel characters je pagina titel mag hebben bijvoorbeeld. En wat de ideale hoeveelheid content ik op een webpagina. Zoals je hier kunt lezen moet je vooral niet te weinig content hebben anders gaat vooral die nibbler.silktide.com zeiken. Maar hij heeft gelijk want hij kijkt naar wat een search engine zoals Google gewoon graag wil zien. En dan doen we dat zo. Of je dat nou leuk vind of niet dat maakt eigenlijk verder helemaal niks uit. Zo moet het PUNT! Kijk gerust in de broncode van mijn HTML pagina's hoe ik het een en ander gedaan heb. Ik heb geprobeerd om te voldoen aal alle security richtlijnen die er maar zo ongeveer zijn op internet. En ik ben op zoek gegaan naar het randje van waar beveiliging ophoud en het grote hacken gaat beginnen. In ben echt heel benieuwd hoe moeilijk ze het vinden om mijn website te hacken aangezien ik zo ongeveer alles gedaan heb om hem veilig te maken. Zonder dat ik daarmee lager in Google kom te staan bijvoorbeeld. Succes ermee!! Geef me een like op Facebook als je er iets aan hebt gehad. Hier komt meer over waar ik deze website voor heb gemaakt. Deze regels staan er vooral om meer content te krijgen. Dat is nodig volgens nibbler.silktide.com. Stom dat ik niet nog twaalf woorden extra heb getypt want dan had ik er precies 1000. Deze website is gemaakt om je te helpen met het maken van een veilige website en veilige verbindingen met die website. Verder heb ik geprobeerd om maximaal te scoren bij SSL en SEO checkers. Die SEO checkers kijken naar allerlei onzinnige dingetjes die je niet als je naar m'website kijkt maar een internet browser leest dat allemaal heel anders. En daar ga je dan enorm op zitten studeren hoeveel characters je pagina titel mag hebben bijvoorbeeld. En wat de ideale hoeveelheid content ik op een webpagina. Zoals je hier kunt lezen moet je vooral niet te weinig content hebben anders gaat vooral die nibbler.silktide.com zeiken. Maar hij heeft gelijk want hij kijkt naar wat een search engine zoals Google gewoon graag wil zien. En dan doen we dat zo. Of je dat nou leuk vind of niet dat maakt eigenlijk verder helemaal niks uit. Zo moet het PUNT! Kijk gerust in de broncode van mijn HTML pagina's hoe ik het een en ander gedaan heb. Ik heb geprobeerd om te voldoen aal alle security richtlijnen die er maar zo ongeveer zijn op internet. En ik ben op zoek gegaan naar het randje van waar beveiliging ophoud en het grote hacken gaat beginnen. In ben echt heel benieuwd hoe moeilijk ze het vinden om mijn website te hacken aangezien ik zo ongeveer alles gedaan heb om hem veilig te maken. Zonder dat ik daarmee lager in Google kom te staan bijvoorbeeld. Succes ermee!! Geef me een like op Facebook als je er iets aan hebt gehad. Hier komt meer over waar ik deze website voor heb gemaakt. Deze regels staan er vooral om meer content te krijgen. Dat is nodig volgens nibbler.silktide.com. Stom dat ik niet nog twaalf woorden extra heb getypt want dan had ik er precies 1000. Deze website is gemaakt om je te helpen met het maken van een veilige website en veilige verbindingen met die website. Verder heb ik geprobeerd om maximaal te scoren bij SSL en SEO checkers. Die SEO checkers kijken naar allerlei onzinnige dingetjes die je niet als je naar m'website kijkt maar een internet browser leest dat allemaal heel anders. En daar ga je dan enorm op zitten studeren hoeveel characters je pagina titel mag hebben bijvoorbeeld. En wat de ideale hoeveelheid content ik op een webpagina. Zoals je hier kunt lezen moet je vooral niet te weinig content hebben anders gaat vooral die nibbler.silktide.com zeiken. Maar hij heeft gelijk want hij kijkt naar wat een search engine zoals Google gewoon graag wil zien. En dan doen we dat zo. Of je dat nou leuk vind of niet dat maakt eigenlijk verder helemaal niks uit. Zo moet het PUNT! Kijk gerust in de broncode van mijn HTML pagina's hoe ik het een en ander gedaan heb. Ik heb geprobeerd om te voldoen aal alle security richtlijnen die er maar zo ongeveer zijn op internet. En ik ben op zoek gegaan naar het randje van waar beveiliging ophoud en het grote hacken gaat beginnen. In ben echt heel benieuwd hoe moeilijk ze het vinden om mijn website te hacken aangezien ik zo ongeveer alles gedaan heb om hem veilig te maken. Zonder dat ik daarmee lager in Google kom te staan bijvoorbeeld. Succes ermee!! Geef me een like op Facebook als je er iets aan hebt gehad. Hier komt meer over waar ik deze website voor heb gemaakt. Deze regels staan er vooral om meer content te krijgen. Dat is nodig volgens nibbler.silktide.com. Stom dat ik niet nog twaalf woorden extra heb getypt want dan had ik er precies 1000.