Ga naar de inhoud
Home » WordPress Website in de Oracle Cloud (OCI)

WordPress Website in de Oracle Cloud (OCI)

Oracle Cloud Blog Header

Notitie vooraf: dit is allemaal quick-and-dirty!! Moest het gewoon ff aan de praat krijgen. Garantie tot de deur πŸ™‚ πŸ™‚ πŸ™‚

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 πŸ™‚ ) Het public ip adres van de compute instance is130.61.161.240

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. 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

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

Pakket httpd installeren

sudo yum install httpd 
sudo systemctl start httpd
sudo systemctl enable httpd
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
sudo firewall-cmd --reload

Pakket mariadb installeren

sudo yum install mariadb-server
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo mysql_secure_installation

WordPress installeren

Eerst een db maken

mysql -u root -p
MariaDB>create database famtenhoopen;
quit

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 (in /var/www/html)

Daar kreeg ik dus een wordpress map (/var/www/html/wordpress) aangezien ik maar 1 website wil hebben moet alles 1 map omhoog.

Alle (echt alle) permissies goed zetten

cd /var/www/html
sudo mv wordpress/* .
sudo rm -fr wordpress
sudo chown -R apache.apache *
sudo chown apache.apache . 

Ga nu naar /etc/httpd/conf.d en maak daar een bestand wordpressadmin.conf aan. De inhoud is:

<Directory "/var/www/html/wp-admin">
  Options +Indexes +FollowSymLinks
  AllowOverride All
  Require all granted 
</Directory>

Met dit bestand gaan we straks de het admin deel van WordPress dichttimmeren. Kan nu ook, mocht je dat willen verander dan de regel:

Require all granted

in

Require ip 112.118.11.67 127.0.0.1

Op die manier komt alleen een gebruiker op de machine met ip adres 112.118.11.67 of de localhost (127.0.0.1) op het admin gedeelte. Verander dat 112.118… adres natuurlijk in je eigen ip-adres.

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

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.

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 compute 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

Virtual Hosts

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 kuntselwerk, pas het volgende aan in /etc/httpd/conf/httpd.conf

Plaats een # voor de regel DocumentRoot “/var/www/html”

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/html  
</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 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.

Nu we het toch hebben over veiligheid; ga ook nog ff naar /etc/httpd/conf.d/wordpressadmin.conf aan. Daar staat een Require in. Zorg ervoor dat het iets wordt in de geest van Require ip 113.45.23.123 127.0.0.1

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

Conclusie … Volgende keer…

Voor een klein prive website is dit prima echter het zou, naderhand gezien, een beter idee zijn geweest om de database in een apart private subnet te plaatsen. De DB cycles gaan dan op een apart single core machientje. De web cycles hebben dan dit single core machientjes voor zichzelf.

Database op een aparte Instance (kon het niet laten)

De orginele database heb ik eerst weggegooid, mariadb ook verwijderd. Tevens WordPress verwijderd en een schone WordPress ge-unzipped

Maak er een tweede subnet bij (de naam database had ik bedacht) naast diegene die je al hebt (de naam web had ik hier voor bedacht)

Maak aparte route tabellen voor beide subnetten. En geef elk subnet zijn eigen routetabel. Wat moet er in deze routetabellen staan:

  • Subnet database gaat naar het internet via een NAT
  • Subnet web gaan naar de buitenwereld via een Internet Gateway.

De reden dat de instances in het database subnet ook met de buitenwereld moeten kunnen spreken is om b.v. pakketten (mariadb-server πŸ™‚ ) moet kunnen installeren.

Inloggen op de instance in het private subnet database doe je via de instance in het publieke subnet (web).

Op de database machine de database installeren (zie boven)

Aangezien we connecties krijgen van de server waar wordpress opdraaid moeten we zorgen dat mariadb dit toestaat, en we moeten ook nog een database maken (bijvoorbeeld database famtenhoopen):

mysql -u root -p
MariaDB> create database famtenhoopen;
MaridDB> create user 'root'@'web.web.backbone.oraclevcn.com' identified by '<YOUR-PASSWORD>';
MaridDB> grant all privileges on *.* to 'root'@'web.web.backbone.oraclevcn.com';
MariaDB> flush privileges;
MariaDB> select host,user,password from mysql.user;
quit

Zorg ervoor dat je de naam van de machine gebruikt bij de gebruiker. IP adressen kunnen namelijk veranderen zonder dat je het door hebt.

Elke security man of vrouw zal dit niet goedkeuren, root access vanaf een ander machine, maar lees regel 1 (helemaal bovenaan nogmaals πŸ™‚

Wat is er gedaan:

  • Er is een database aangemaakt genoemd famtenhoopen
  • Er is een specifieke user op een specifieke host aangemaakt
  • Deze user krijgt alle rechten op alles
  • Met de select kijken we wat we gemaakt hebben en wat er al was

Als alle wachtwoorden gelijk zijn van alle gebruikers dan is de output van de select iets in de geest van:

+--------------------------------+------+-------------------------------------------+
| host                           | user | password |
+--------------------------------+------+-------------------------------------------+
| localhost                      | root | *B1F6FF51C13D32F065DC657C77AE858DC291E942 |
| 127.0.0.1                      | root | *B1F6FF51C13D32F065DC657C77AE858DC291E942 |
| ::1                            | root | *B1F6FF51C13D32F065DC657C77AE858DC291E942 |
| web.web.backbone.oraclevcn.com | root | *B1F6FF51C13D32F065DC657C77AE858DC291E942 |
+--------------------------------+------+-------------------------------------------+

Mensen uit de security hoek worden hier helemaal niet vrolijk van …..

De configuratie is aangepast, dus herstarten πŸ™‚

sudo systemctl restart mariadb

De standaard poort van mariadb/mysql open zetten

sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --reload

Security list aanpassen zodat de web machine bij de database machine kan komen.

Nu WordPress installeren op de web machine. Lange versie zie boven, korte versie: ga met de browser naar http://130.61.161.240

Nu volgt een vraag en antwoord spelletje, onthou dat de machine waar de database (famtenhoopen) op staat is database.database.backbone.oraclevcn.com (in mijn geval πŸ™‚ ), je gaat er heen als root.

Moet lukken πŸ™‚ Als goed is heb je kunnen inloggen (via het ip-adres).Β  Zorg dat je alle updates uitvoert waar WordPress over mekkert.

Ga terug naar Van IP naar een leesbaar thuis.famtenhoopen.nl en lees daar wat je moet doen om een goedleesbare url te krijgen en https.

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:

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 πŸ™‚