We gaan een wordpress webserver in de lucht brengen. In dit voorbeeld thuis.famtenhoopen.nl.
Het domain famtenhoopen.nl is in mijn bezit (beetje essentieel π )
In OCI hebben we al een netwerk gemaakt en zijn alle routetabellenen security lists up to date. De firewalld op de instanties kan dus uit!
- Subnet database gaat naar het internet via een NAT
- Subnet web gaan naar de buitenwereld via een Internet Gateway.
En
- Het public ip adres van de compute instance is130.61.161.240 en zit in een public subnetwerk
- We maken ook gebruik van een database instance die in een private subnetwerk zit op 10.0.1.3
Dat idee klinkt misschien onzinnig want de compute instance stelt niet veel voor (geekbench5 resultaat voor single core: 272 en multi core: 327) maar de disken zijn wel snel. Mocht een website voor jezelf willen hebben, dan moet dat best kunnen … denk ik. Zeker als je de database op een aparte instantie zet.Dit is ook de reden waarom ik hier aan begonnen ben LOL. Kijken wat het wordt ….
Inloggen
Inloggen gaat via ssh, een ssh key maak je via ssh-kygen. Dit is een vraag en antwoord spelletje π Geef geen passphrase op!!
Via ssh -i <privatekey> user@ip-adress …. in mijn geval iets in de geest van:
ssh -i ~/Documenten/Oracle/Cloud/arjan-instance/PKI/host-web/user-opc/opc opc@130.61.161.240
Zelf doe ik het via Remmina Remote Desktop Client, maar dat is eigenlijk om het even.
Zorg ervoor dat je op beide instanties bent ingelogd
Tip van Flip
Wordt je helemaal gek van dat ge-sudo .. type dan
sudo bash
Krijg je een nieuwe shell met uid 0 (=root) en ben je van al dat ge-sudo af π
Tooltjes die handig kunnen zijn
ff installeren voor alle ellende echt begint π
sudo yum install whois telnet nmap ImageMagick
Doe dit zowel op instantie waar WordPress op komt als ook op de database instantie.
Zet ook op biede instanties de firewalld uit:
sudo systemctl stop firewalld sudo systemctl disable firewalld
Yeaahhhh
Pakket httpd installeren op de WordPress instantie
sudo yum install httpd sudo systemctl start httpd sudo systemctl enable httpd
Pakket mariadb installeren op de database instantie en ook op de WordPress instantie
sudo yum install mariadb-server
# alleen starten op de database instantie!
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo mysql_secure_installation
Onthou het root wachtwoord dat je opgegeven hebt!!
Een db maken op de database instantie. WordPress gaat deze straks gebruiken.
mysql -u root -p MariaDB>create database famtenhoopen; quit
WordPress installeren op de WordPress instantie
PHP7 installeren, standaard is er alleen PHP5
sudo yum install oracle-php-release-el7 sudo yum install php sudo yum install php-mysql php-json php-gd php-xml php-mbstring php-zip
WordPress overhalen en unzippen
sudo mkdir /var/www/websites cd /var/www/websites sudo wget ..... sudo unzip .....
Daar kreeg ik dus een wordpress map (/var/www/websites/wordpress) Ik maak een aparte map voor deze website (/var/www/websites/tenhoopen), wie weet wat er in de toekomst nog bij komt.
cd /var/www/websites sudo mv wordpress tenhoopen sudo chown -R apache.apache * sudo chown apache.apache .
Maak een bestand /etc/httpd/conf.d/wordpress.conf en zet er het volgende in
# # settings voor wordpress websites # <Directory "/var/www/websites"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride All # # Controls who can get stuff from this server. # Require all granted </Directory>
Probeer of je nu de webserver kunt herstarten. DIt doen we alleen om ff te controleren of we geen config fouten gemaakt hebben die bij een herstart boven water komen. Er kunnen dus nog steeds config fouten achterblijven … maar dat lossen we later wel op.
sudo systemctl restart httpd
Disable SELinux op de WordPress instantie en de database instantie
SELinux is enabled. Dat is heel goed maar voor nu een beetje overkill.Als je het aan laat staan krijg je bij de installatie van WordPress volgende cryptische fouten (LOL ja het was vallen en opstaan de eerste keer):
[Thu Jun 25 18:42:14.045018 2020] [php7:warn] [pid 5990] [client 80.60.218.224:39002] PHP Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0 [Thu Jun 25 18:42:14.045047 2020] [php7:error] [pid 5990] [client 80.60.218.224:39002] PHP Fatal error: Unknown: Failed opening required '/var/www/html/wp-admin/install.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0
Dussssss……
Je kunt SELinux gaan tweaken maar je kunt het ook uitzetten. Doe het volgende om het uit te zetten:
#wat is de status van SELinux sudo sestatus cd /etc/sysconfig sudo vi selinux #zet SELINUX op disabled en save file en exit
Vervolgens reboot je het systeem, en SELinux is disabled.
Webserver testen op de WordPress instantie
Je moet nu toegang hebben tot je website (http://130.61.161.240/ en die brengt je naar het begin van de installatie van WordPress. De eerste vraag is … welke taal? Daarna begint het echte werk π
Weet je de gegevens over je database …. Let’s go!! (de installatie begint nu).
Na de installatie log je in als de gebruiker die je hebt opgegeven. Vervolgens voer je alle updates uit waar WordPress over mekkert.
Van IP naar een leesbaar thuis.famtenhoopen.nl
Zorg ervoor dat in je DNS de servernaam een A record heeft! In dit voorbeeld is dat thuis.famtenhoopen.nl
Als je dit A record hebt aangemaakt dan geduld, alle name servers moeten dit nog wel krijgen. Controleer of je via de WordPress instance succesvol
dig thuis.famtenhoopen.nl
hebt kunnen uitvoeren. Doe dit ook vanaf de computer die je nu zelf gebruikt. Als beide thuis.famtenhoopen.nl hebben kunnen resolven, dan kun je verder gaan. Anders gewoon wachten, nachtje slapen is vaak voldoende LOL
Kijk nu of je op je website kunt komen via http://thuis.famtenhoopen.nl (mogelijk eerst de cache van je browser leeg maken π )
?????????Inloggen doe je via http://thuis.famtenhoopen.nl/wp-login.php, doe dit vanaf je eigen computer??????
Virtual Hosts aanpassen op de WordPress instantie
We willen straks van http naar https, dat gaan we doen met Lets Encrypt. Die kan heel veel zelf zolang het maar over virtual hosts gaat. Dat moet dus nu voor elkaar worden gebutst.
Wat hebben we nu aan virtual hosts:
sudo apachectl -S
Dat is nog even wat knutselwerk, pas het volgende aan in /etc/httpd/conf/httpd.conf
Voeg de volgende twee regels toe aan het eind:
# Load Virtual Hosts definition IncludeOptional sites-enabled/*.conf
Save het bestand.
Maak een map aan sites-enabled
sudo mkdir /etc/httpd/sites-enabled
Virtual host config maken:
sudo vi /etc/httpd/sites-enabled/thuis.famtenhoopen.nl.conf
Inhoud wordt:
<VirtualHost *:80> ServerName thuis.famtenhoopen.nl DocumentRoot /var/www/websites/famtenhoopen </VirtualHost>
Restart apache:
sudo systemctl restart httpd
Het volgende command laat alle geconfigureerde Virtual Hosts zien:
sudo apachectl -S
Als alles verloopt naar verwachting kun je nog steeds bij http://thuis.famtenhoopen.nl komen. Let goed op de adres balk .. hier kan (mogelijk) het ip adres te staan.
In WordPress onder Settings β General moet je nu nog het wordpress adres (URL) en site adres (URL) aanpassen. Maak van beide http://thuis.famtenhoopen.nl
Lets Encrypt
De website https maken gaat dus via Lets Encrypt.
**************************************************
Je moet echter wel een domein naam in je bezit hebben!!! EN je moet een A-Record hebben in je DNS voor je site (in dit geval thuis.famtenhoopen.nl).
Heb je dat niet dat krijg je het niet aan de praat want Lets Encrypt checked dit.
**************************************************
Zet nu in de cloud poort 443 ook nog open anders kom je niet binnen via https://… π (Hint: Netwerken β Virtuele cloudnetwerken β “VCN” β “Subnet” β Security List)
Volg nu de instructies op zoals beschrevenop https://certbot.eff.org/lets-encrypt/centosrhel7-apache
… OF …
In het kort:
sudo yum install certbot python2-certbot-apache
Restart apache zodat je zeker weet dat alles goed geconfigureerd en actief is:
sudo systemctl restart httpd
Configutreer nu ssl via
sudo certbot --apache
Restart apache zodat je zeker weet dat alles goed geconfigureerd en actief is:
sudo systemctl restart httpd
En kijk of je bij https://thuis.famtenhoopen.nl kunt komen (heb je redirect aangezet dan kun je ook naar http://thuis.famtenhoopen.nl gaan, die gaat dan automatisch door naar https://thuis…
Nog even redirect, tijdens sudo certbot – -apache kreeg je hier een vraag over. Heb je yes gezegd dan is /etc/httpd/sites-enabled/thuis.famtenhoopen.nl.conf aangepast. Er zijn drie regels bijgevoegd, hier het eindresultaat:
<VirtualHost *:80> ServerName thuis.famtenhoopen.nl DocumentRoot /var/www/html RewriteEngine on RewriteCond %{SERVER_NAME} =thuis.famtenhoopen.nl RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
De 3 rode regels zijn toegevoegd, wil je toch geen redirect (DAT IS GEEN GOED IDEE) zet dan een # voor deze regels.
Nadat je apache gerestart hebt (sudo systemctl restart httpd) is het actief.
Er kunnen vreemde dingen gebeuren π Het legen van de cache van je browser kan dit probleem oplossen (ja ja .. ik had ook last van vallen en opstaan π ).
Ik had de 3 rode regels voorzien van een # en kan daarna wel bij http://… komen maar niet bij https://… Legen van de logfiles en daarna herstarten van Apache gaf mij de volgende ellende:
[Mon Jun 29 09:34:48.457649 2020] [ssl:warn] [pid 5970] AH01909: RSA certificate configured for web.web.backbone.oraclevcn.com:443 does NOT include an ID which matches the server name [Mon Jun 29 09:34:48.480099 2020] [ssl:warn] [pid 5970] AH01909: RSA certificate configured for web.web.backbone.oraclevcn.com:443 does NOT include an ID which matches the server name
Welke virtual hosts zijn er?
sudo apachectl -S VirtualHost configuration: *:443 is a NameVirtualHost default server web.web.backbone.oraclevcn.com (/etc/httpd/conf.d/ssl.conf:56) port 443 namevhost web.web.backbone.oraclevcn.com (/etc/httpd/conf.d/ssl.conf:56) port 443 namevhost thuis.famtenhoopen.nl (/etc/httpd/sites-enabled/thuis.famtenhoopen.nl-le-ssl.conf:2) *:80 thuis.famtenhoopen.nl (/etc/httpd/sites-enabled/thuis.famtenhoopen.nl.conf:1) ServerRoot: "/etc/httpd" ... ... ...
Via /etc/httpd/conf.d/ssl.conf er twee bijgekregen π Ga naar /etc/httpd/conf.d/ssl.conf en zet een hekje voor alle regels te beginnen bij:
<VirtualHost _default_:443>
en eindigen bij
</VirtualHost>
Let op: deze twee regels moeten ook een # krijgen!!
Bij het plaatsen van de #jes kwam je ook deze regels tegen:
# Use separate log files for the SSL virtual host; note that LogLevel # is not inherited from httpd.conf. ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn
Deze regels moet je plaatsen vlak boven </VirtualHost> in /etc/httpd/sites-enabled/thuis.famtenhoopen.nl-le-ssl.conf
Herstarten apache
sudo systemctl restart httpd
Controle op aanwezigheid van meerder virtual hosts:
sudo apachectl -SVirtualHost configuration: *:443 thuis.famtenhoopen.nl (/etc/httpd/sites-enabled/thuis.famtenhoopen.nl-le-ssl.conf:2) *:80 thuis.famtenhoopen.nl (/etc/httpd/sites-enabled/thuis.famtenhoopen.nl.conf:1) ServerRoot: "/etc/httpd" .........
Nu komen we ergens π Maar hij doet het nog steeds niet. Logs leeg maken en herstarten. Dat geeft geen errors in de ssl hoek. Naar de browser en laden van https://thuis.famtenhoopen.nl geeft in de browser ERR_ADDRESS_UNREACHABLE
Maar dat wist je natuurlijk al π Want …. inderdaad de firewall staat poort 443 nog te blocken. Om dat op te lossen:
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp sudo firewall-cmd --reload
Nu doet ie precies wat ie doen moet π Gefeliciteerd.
Mocht je de RewriteRules hebben voor zien van een #, dan is het verstandig om die nu weg te halen (en restart apache vervolgens). Op die wijze heb je er voor gezorgd dat al het verkeer naar de website “veilig” is.
Dit zorgt ervoor dat alleen hosts met deze ip-adressen bij het admin gedeelte van WordPress kunnen komen.
Onderhoud Lets Encrypt Certificaten
De certificaten verlopen na (geloof) 3 maanden, dus automatisch updaten via de cron van root. Voeg de volgende regel toe aan de cron van root:
sudo crontab -e # voeg de volgende regel toe 0 0,12 * * * /bin/certbot renew -q
WordPress configureren
Inloggen doe je via http://thuis.famtenhoopen.nl/ doe dit vanaf je eigen computer. Configureer hier wordpres
Weet je de database naam, databae host , user en password…:)
Nog een keer Flip…
Installeer de Wordfence Security plugin en activeer 2FA!!!!! en de UpdraftPlus WordPress Backup plugin om te zorgen dat je altijd een backup hebt.
Met installeren bedoel ik installerern EN configurerern… anders heb je er nog niets aan LOL
NFS (TODO)
Voor onderhoud is het makkelijk om de website map te exporteren over NFS. Niet de hele dag π alleen als het nodig is.
NFS server installeren:
sudo yum install nfs-utils
In de firewall zet je de volgende poorten open in de secruity list (hier hoe het moet met firewalld):
sudo firewall-cmd --permanent --zone=public --add-port=111/tcp sudo firewall-cmd --permanent --zone=public --add-port=111/udp sudo firewall-cmd --permanent --zone=public --add-port=2049/tcp sudo firewall-cmd --permanent --zone=public --add-port=2049/udp sudo firewall-cmd --reload
In /etc/exports zet je
/blabla *(rw,root_squash,sync,no_subtree_check)
Als je het sterretje veranderd in het ip-adres van je nfs-client wordt het een stuk veiliger
Start en enable NFS:
sudo systemctl start nfssudo systemctl enable nfs
Plezier ermee π