Vereisten
- Een server met een statisch openbaar IP. Dit is waar Nginx draait.
- Backend-servers met de beoogde website die over HTTP draait
- Een geregistreerde domeinnaam. Ik zal ranvirslog gebruiken.com als mijn primaire domeinnaam en de twee websites zijn op FQDN's - ww1.ranvirslog.com en ww2ranvirslog.com
Opstelling
Dus de IP-adressen zijn veranderd sinds de laatste keer, aangezien ik deze setup opnieuw doe. Dit zijn de nieuwe IP's en hostnamen.
VM/hostnaam | Openbare IP | Privé IP | Rol/functie |
ReverseProxy | 68.183.214.151 | 10.135.127.136 | TLS-aansluitpunt en reverse proxy-server proxy |
web1 | Nvt | 10.135.126.102 | Hosting ww1.ranvirslog.com website via poort 80 HTTP |
web2 | Nvt | 10.135.126.187 | Hosting ww2.ranvirslog.com website via poort 80 HTTP |
De DNS-records zijn zo ingesteld dat beide websites (verschillende subdomeinen) naar hetzelfde statische openbare IP verwijzen. Dit is toevallig het IP-adres van onze Nginx reverse proxy:
Een opname | Waarde |
ww1.ranvirslog.com | 68.183.214.151 |
ww2.ranvirslog.com | 68.183.214.151 |
Om onze reverse DNS te laten werken via niet-versleutelde HTTP, hebben we twee bestanden gemaakt in /etc/conf.d/ genaamd ww1.conf en ww2.conf elk met de volgende configuratie:
/etc/conf.d/ww1.conf
serverluister 80;
luister [::]:80;
servernaam ww1.ranvirslog.com;
plaats /
proxy_pass http://10.135.126.102/;
proxy_buffering uit;
proxy_set_header X-Real-IP $remote_addr;
/etc/conf.d/ww2.conf
serverluister 80;
luister [::]:80;
servernaam ww2.ranvirslog.com;
plaats /
proxy_pass http://10.135.126.187/;
proxy_buffering uit;
proxy_set_header X-Real-IP $remote_addr;
Het besturingssysteem dat we gebruiken is Ubuntu 18.04 LTS en we hebben verwijderd het bestand /etc/nginx/sites-enabled/default zodat Nginx puur als een reverse DNS kan fungeren met behulp van de hierboven getoonde configuraties.
Objectief
Nu de reverse DNS (en de backend-websites) al actief zijn, is ons doel om een enkel TLS-certificaat te installeren voor beide FQDN's (dat is ww1.ranvirslog.com en ww2.ranvirslog.com) op onze Nginx reverse proxy.
Het verkeer tussen elke client en de reverse proxy wordt versleuteld, maar het verkeer tussen de reverse proxy en de backend-servers is niet versleuteld. Dit is echter nog steeds een oneindig veel veiligere optie dan helemaal geen HTTPS hebben. Voor gevallen waarin de reverse proxy en de verschillende webservers zich op dezelfde host bevinden, bijvoorbeeld als u Docker-containers gebruikt om ze allemaal op dezelfde VPS te hosten, dan bevindt zelfs dit niet-versleutelde verkeer zich op een enkele host.
Certbot installeren
Certbot is een clientprogramma dat op onze reverse proxy-server draait en een TLS-certificaat onderhandelt met LetsEncrypt. Het zal LetsEncrypt bewijzen dat de server in feite controle heeft over de FQDN's waarover hij beweert controle te hebben. We maken ons geen zorgen over hoe Certbot het doet.
Traditioneel kunt u Certbot gebruiken als zelfstandige software die alleen de certificaten (die in feite gewoon lange cryptografische sleutels zijn) zal ophalen en op de server opslaan. Maar gelukkig zijn er voor de meeste besturingssystemen aangepaste plug-ins voor Nginx, Apache en andere software. We zullen de Certbot met Nginx-plug-in installeren. Dit zal Nginx automatisch configureren om de nieuw verkregen sleutels te gebruiken en onveilige regels zoals luisteren naar HTTP op poort 80 te verwijderen.
Als u op Debian gebaseerde systemen gebruikt, zoals in mijn geval, gebruik ik Ubuntu 18.04 LTS, dan is de installatie een fluitje van een cent.
$ sudo apt-update$ sudo apt install software-properties-common
$ sudo add-apt-repository-universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-update
$ sudo apt install python-certbot-nginx
Andere besturingssystemen, je RedHat, Gentoo, Fedora kunnen de officiële instructies volgen zoals hier vermeld.
Nadat u Certbot . hebt geïnstalleerd met Nginx-plug-in voor uw combinatie van besturingssysteem kunnen we aan de slag.
TLS-certificaten behalen
Voer de volgende opdracht uit om het TLS-certificaat voor de eerste keer op te halen:
$ sudo certbot --nginxDit gaat door een reeks interactieve vragen, zoals hieronder weergegeven:
- Voer je e-mailadres in
Logboek voor foutopsporing opslaan in /var/log/letsencrypt/letsencrypt.log
Geselecteerde plug-ins: Authenticator nginx, Installer nginx
Voer het e-mailadres in (gebruikt voor dringende verlengings- en beveiligingsmeldingen) (Voer 'c' in om te annuleren): [e-mail beveiligd]
- Ga akkoord met TOS
Lees de Servicevoorwaarden op https://letsencrypt.org/documents/LE-SA-v1.2-nov-15-2017.pdf. U moet akkoord gaan om u te registreren bij de ACME-server op https://acme-v02.api.letencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A
- Optionele nieuwsbrief
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Zou je bereid zijn om je e-mailadres te delen met de Electronic Frontier Foundation, een van de oprichters van het Let's Encrypt-project en de non-profitorganisatie die Certbot ontwikkelt? We willen je graag e-mail sturen over ons werk om het web te versleutelen, EFF-nieuws, campagnes en manieren om digitale vrijheid te ondersteunen.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
- Het zal dan de domeinnamen op uw server detecteren en als u alle domeinen wilt selecteren, drukt u gewoon op
Voor welke namen wil je HTTPS activeren??
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: ww1.ranvirslog.com
2: ww2.ranvirslog.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Selecteer de juiste cijfers gescheiden door komma's en/of spaties, of laat de invoer leeg om alle getoonde opties te selecteren (Voer 'c' in om te annuleren):
- Stuur alles door naar TLS. Ik koos voor optie 2, om alles naar SSL om te leiden, maar jouw gebruikssituatie kan verschillen. Voor nieuwe backend-installaties is het veilig om optie 2 te kiezen.
Kies of u HTTP-verkeer wilt omleiden naar HTTPS, HTTP-toegang verwijderenS.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Geen omleiding - Breng geen verdere wijzigingen aan in de webserverconfiguratie.
2: Redirect - Laat alle verzoeken omleiden naar beveiligde HTTPS-toegang. Kies dit voor nieuwe sites of als u zeker weet dat uw site op HTTPS werkt. U kunt deze wijziging ongedaan maken door de configuratie van uw webserver te bewerken.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Selecteer het juiste nummer [1-2] en vervolgens [enter] (druk op 'c' om te annuleren): 2
Als alles goed is gegaan, wordt dit bericht weergegeven, alleen voor uw domeinnamen.
Gefeliciteerd! Je hebt met succes https://ww1 . ingeschakeld.ranvirslog.com en https://ww2.ranvirslog.com U kunt de FQDN's bezoeken en opmerken dat de websites nu het hangslotteken hebben dat suggereert dat alles gecodeerd is.
Bekijk de configuratiebestanden
Als u de configuratiebestanden bekijkt die we eerder hebben gemaakt, namelijk /etc/conf.d/ww1.conf en /etc/conf.d/ww2.conf, je zult merken dat alle "Listen 80"-regels zijn verdwenen en dat er een paar nieuwe regels zijn toegevoegd, vertel de server dat de communicatie moet worden gecodeerd en de locatie van de certificaten en sleutels om de genoemde codering uit te voeren.
Ik raad ten zeerste aan om de configuratiebestanden te bekijken, omdat dat je ook kan leren hoe je op de juiste manier certificaten installeert en configuratiebestanden schrijft.
Certificering Vernieuwing
Typische LetsEncrypt-certificaten zijn 90 dagen geldig en voordat ze verlopen, moet u ze vernieuwen. U kunt Certbot gebruiken om de vernieuwing eerst droog uit te voeren door de opdracht uit te voeren:
$ sudo certbot vernieuwen --dry-runAls de bewerking is gelukt, ziet u de volgende melding:
Gefeliciteerd, alle verlengingen zijn gelukt. De volgende certificaten zijn vernieuwd:
/etc/letsencrypt/live/ww1.ranvirslog.com/fullchain.pem (succes)** DRY RUN: simuleren van 'certbot renew' dichtbij het verstrijken van het certificaat
** (Bovenstaande testcertificaten zijn niet opgeslagen).)
Nu kunt u een Cron-taak toevoegen die elke week of zo zal proberen te vernieuwen. Certbot vernieuwt de certificaten niet tenzij ze daar echt aan toe zijn, dus u hoeft zich geen zorgen te maken. De opdracht voor daadwerkelijke vernieuwing is:
$ certbot vernieuwenVoeg het toe aan de cron-job van root met:
$ sudo crontab -eSelecteer in de volgende prompt uw favoriete editor (kies Nano als u het niet zeker weet) en voeg de volgende regels toe aan het einde van het nu geopende bestand:
…# U kunt bijvoorbeeld een back-up maken van al uw gebruikersaccounts
# om 5 uur.m elke week met:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# Zie voor meer informatie de handleidingen van crontab(5) en cron(8)
#
# m h dom mon dow commando
* 2 * * 2 certbot verlengen
Dit zal de opdracht certbot vernieuwen om 2 uur 's nachts op een willekeurige minuut, op de tweede dag van elke week uitvoeren.
Conclusie
Als TLS-certificaten nieuw voor u zijn, kan experimenteren met zaken als HSTS riskant zijn. Aangezien deze veranderingen onomkeerbaar zijn. Als je echter door het konijnenhol van beveiliging wilt gaan, kan ik de blog van Troy Hunt ten zeerste aanbevelen, wat een van de belangrijkste inspiratiebronnen is achter dit schrijven.