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 π