Hoe Redis installeren en beveiligen op Rocky Linux 8

Introductie

Redis is een open-source, in-memory key-value datastore die uitblinkt in caching. Redis is een niet-relationele database die bekend staat om zijn flexibiliteit, prestaties, schaalbaarheid en brede taalondersteuning.

Redis is ontworpen voor gebruik door vertrouwde clients in een vertrouwde omgeving en heeft geen robuuste beveiligingsfuncties van zichzelf. Redis heeft echter wel een paar beveiligingsfuncties, zoals wachtwoordauthenticatie en de mogelijkheid om sommige opdrachten te hernoemen of uit te schakelen. Deze handleiding biedt instructies over hoe Redis te installeren en deze beveiligingsfuncties te configureren. Het behandelt ook een paar andere instellingen die de beveiliging van een op zichzelf staande Redis-installatie op Rocky Linux 8 kunnen verbeteren.

Merk op dat deze handleiding niet ingaat op situaties waarin de Redis-server en de clienttoepassingen zich op verschillende hosts of in verschillende datacenters bevinden. Installaties waarbij Redis-verkeer een onveilig of niet-vertrouwd netwerk moet doorkruisen, vereisen een ander reeks configuraties, zoals het opzetten van een SSL-proxy of een VPN tussen de Redis-machines.

Je kunt ook gebruikmaken van de Managed Redis Service van DigitalOcean.

Vereisten

Om deze tutorial te voltooien, heb je een server nodig die Rocky Linux 8 draait. Deze server moet een niet-rootgebruiker hebben met administratieve privileges en een firewall geconfigureerd met firewalld. Volg onze Handleiding voor het initiële instellen van de server voor Rocky Linux 8 om dit in te stellen.

Stap 1 — Redis installeren en starten

Je kunt Redis installeren met de DNF-pakketbeheerder. Met DNF kun je Redis, de benodigde afhankelijkheden en nano, een gebruiksvriendelijke teksteditor, installeren. Het is niet verplicht om nano te installeren, maar we zullen het in voorbeelden in deze handleiding gebruiken:

  1. sudo dnf install redis nano

Deze opdracht vraagt je om te bevestigen dat je de geselecteerde pakketten wilt installeren. Druk op y en vervolgens op ENTER om dit te doen:

Output
. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y

Hierna is er één belangrijke configuratiewijziging die je moet aanbrengen in het Redis-configuratiebestand, dat automatisch is gegenereerd tijdens de installatie.

Open dit bestand met je favoriete teksteditor. Hier gebruiken we nano:

  1. sudo nano /etc/redis.conf

Binnen het bestand, zoek naar de supervised-richtlijn. Deze richtlijn stelt je in staat om een init-systeem aan te geven om Redis als een service te beheren, waardoor je meer controle hebt over de werking ervan. De supervised-richtlijn is standaard ingesteld op no. Aangezien je Rocky Linux gebruikt, dat het systemd init-systeem gebruikt, wijzig dit naar systemd:

/etc/redis.conf
. . .

# Als je Redis uitvoert vanuit upstart of systemd, kan Redis communiceren met je
# supervisieboom. Opties:
#   supervised no      - geen supervisie-interactie
#   supervised upstart - geef upstart een signaal door Redis in de SIGSTOP-modus te zetten
#   supervised systemd - geef systemd een signaal door READY=1 naar $NOTIFY_SOCKET te schrijven
#   supervised auto    - detecteer upstart- of systemd-methode op basis van
#                        UPSTART_JOB- of NOTIFY_SOCKET-omgevingsvariabelen
# Opmerking: deze supervisiemethoden geven alleen het signaal "proces is gereed".
#       Ze activeren geen continue levendigheidspings naar je supervisor.
supervised systemd

. . .

Dat is de enige wijziging die je op dit punt in het Redis-configuratiebestand moet aanbrengen, dus sla het op en sluit het af wanneer je klaar bent. Als je nano hebt gebruikt om het bestand te bewerken, sla je op en sluit je af met CTRL + X, dan wanneer daarom wordt gevraagd, Y en vervolgens Enter.

Na het bewerken van het bestand, start de Redis-service:

  1. sudo systemctl start redis.service

Als je wilt dat Redis opstart, kun je het inschakelen met het enable-commando:

  1. sudo systemctl enable redis

Noticeer dat deze opdracht de .service-suffix niet bevat na de naam van het eenheidbestand. Meestal kunt u deze suffix weglaten bij systemctl-opdrachten, omdat deze automatisch kan worden geanalyseerd vanuit de servicenamen.

U kunt de status van Redis controleren door het volgende uit te voeren:

  1. sudo systemctl status redis
Output
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago Main PID: 14478 (redis-server) Tasks: 4 (limit: 11152) Memory: 6.6M CGroup: /system.slice/redis.service └─14478 /usr/bin/redis-server 127.0.0.1:6379

Zodra u hebt bevestigd dat Redis inderdaad actief is, kunt u de functionaliteit testen met deze opdracht:

  1. redis-cli ping

Dit zou PONG als antwoord moeten geven:

Output
PONG

Als dit het geval is, betekent dit dat Redis nu op uw server draait en dat u het kunt gaan configureren om de beveiliging te verbeteren.

Stap 2 — Redis configureren en beveiligen met een firewall

Een effectieve manier om Redis te beveiligen, is door ervoor te zorgen dat de server waarop het draait, alleen gebonden is aan localhost of aan een privé-IP-adres, en dat de server ook een firewall heeft die actief is.

Als u er echter voor hebt gekozen om Redis op te zetten met behulp van een andere handleiding, heeft u mogelijk het configuratiebestand bijgewerkt om verbindingen vanaf elke locatie toe te staan. Dit is niet zo veilig als het binden aan localhost of een privé-IP-adres.

Om dit op te lossen, opent u opnieuw het Redis-configuratiebestand met uw favoriete teksteditor:

  1. sudo nano /etc/redis.conf

Zoek de regel die begint met bind en zorg ervoor dat deze niet is uitgecommentarieerd of uitgeschakeld door het #-teken aan het begin van de regel te verwijderen indien nodig:

/etc/redis.conf
. . .
bind 127.0.0.1

Als je Redis aan een ander IP-adres wilt binden (bijvoorbeeld wanneer je vanaf een aparte host toegang wilt krijgen tot Redis), moet je sterk overwegen om het te binden aan een privé-IP-adres. Het binden aan een openbaar IP-adres vergroot namelijk de blootstelling van je Redis-interface aan externe partijen:

/etc/redis.conf
. . .
bind your_private_ip

Nadat is bevestigd dat de bind-richtlijn niet is uitgecommentarieerd, kun je het bestand opslaan en sluiten.

Als je de voorwaardelijke tutorial voor het initiële serverinstellingsproces hebt gevolgd en firewalld hebt geïnstalleerd op je server, en je niet van plan bent om verbinding te maken met Redis vanaf een andere host, hoef je geen extra firewallregels toe te voegen voor Redis. Immers, al het inkomende verkeer wordt standaard verworpen, tenzij expliciet toegestaan door de firewallregels. Aangezien een standaard zelfstandige installatie van Redis-server alleen luistert op de loopback-interface (127.0.0.1 of localhost), hoef je je geen zorgen te maken over inkomend verkeer op de standaardpoort.

Als je echter van plan bent om Redis te benaderen vanaf een andere host, moet je enkele wijzigingen aanbrengen in je firewalld-configuratie met behulp van het firewall-cmd-commando. Opnieuw moet je alleen toegang toestaan tot je Redis-server vanaf je hosts door hun privé-IP-adressen te gebruiken om het aantal hosts te beperken waaraan je service wordt blootgesteld.

Om te beginnen, voeg een speciale Redis-zone toe aan het beleid van je firewalld:

  1. sudo firewall-cmd --permanent --new-zone=redis

Vervolgens specificeer welke poort je open wilt hebben. Redis gebruikt standaard poort 6379:

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

Vervolgens specificeer je welke privé IP-adressen toegestaan moeten worden om door de firewall te gaan en toegang te krijgen tot Redis:

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

Na het uitvoeren van die commando’s, herlaad de firewall om de nieuwe regels te implementeren:

  1. sudo firewall-cmd --reload

Onder deze configuratie, wanneer de firewall een pakket tegenkomt van het IP-adres van je client, zal het de regels in de toegewijde Redis-zone toepassen op die verbinding. Alle andere verbindingen worden verwerkt door de standaard public zone. De services in de standaard zone gelden voor elke verbinding, niet alleen voor diegene die niet expliciet overeenkomen, dus je hoeft geen andere services toe te voegen (bijv. SSH) aan de Redis-zone omdat die regels automatisch op die verbinding worden toegepast.

Houd er rekening mee dat het gebruik van een firewall-tool werkt, of je nu firewalld, ufw, of iptables gebruikt. Het belangrijkste is dat de firewall actief is, zodat onbekende personen geen toegang kunnen krijgen tot je server. In de volgende stap zul je Redis configureren zodat het alleen toegankelijk is met een sterk wachtwoord.

Stap 3 — Het configureren van een Redis-wachtwoord

Het configureren van een Redis-wachtwoord activeert een van de ingebouwde beveiligingsfuncties – het auth-commando – dat vereist dat clients zich authenticeren voordat ze toegang krijgen tot de database. Net als bij de bind-instelling wordt het wachtwoord rechtstreeks geconfigureerd in het configuratiebestand van Redis, /etc/redis.conf. Open dat bestand:

  1. sudo nano /etc/redis.conf

Scroll naar de SECURITY-sectie en zoek naar een uitgecommentarieerde richtlijn die als volgt luidt:

/etc/redis.conf
. . .
# requirepass foobared

Haal het commentaarteken weg door de # te verwijderen, en verander foobared in een zeer sterk wachtwoord naar keuze.

Opmerking: In plaats van zelf een wachtwoord te verzinnen, kunt u een tool zoals apg of pwgen gebruiken om er een te genereren. Als u echter geen applicatie wilt installeren alleen om een wachtwoord te genereren, kunt u de volgende opdracht gebruiken. Deze opdracht echoot een stringwaarde en stuurt deze naar het volgende sha256sum-commando, dat de SHA256-checksum van de string zal weergeven.

Wees ervan bewust dat het invoeren van deze opdracht zoals geschreven telkens hetzelfde wachtwoord zal genereren. Om een uniek wachtwoord te maken, verander de string tussen de aanhalingstekens naar een ander woord of zin:

  1. echo "digital-ocean" | sha256sum

Hoewel het gegenereerde wachtwoord niet gemakkelijk te onthouden zal zijn, zal het zeer sterk en lang zijn, wat precies het type wachtwoord is dat vereist is voor Redis. Nadat u de uitvoer van die opdracht hebt gekopieerd en geplakt als de nieuwe waarde voor requirepass, zou het moeten lezen:

/etc/redis.conf
. . .
requirepass password_copied_from_output

Als alternatief, als u de voorkeur geeft aan een korter wachtwoord, kunt u in plaats daarvan de uitvoer van een andere checksum gebruiken. Verander opnieuw het woord tussen de aanhalingstekens zodat het niet hetzelfde wachtwoord genereert als deze opdracht:

  1. echo "digital-ocean" | sha1sum

Na het instellen van het wachtwoord, sla het bestand op en sluit het vervolgens af en herstart Redis:

  1. sudo systemctl restart redis

Om te testen of het wachtwoord werkt, opent u de Redis-client:

  1. redis-cli

Hieronder volgt een reeks commando’s die worden gebruikt om te testen of het Redis-wachtwoord werkt. Het eerste commando probeert een sleutel op een waarde in te stellen voordat authenticatie heeft plaatsgevonden:

  1. set key1 10

Dat zal niet werken omdat u nog niet bent geauthenticeerd, dus Redis geeft een foutmelding terug:

Output
(error) NOAUTH Authentication required.

Het volgende commando authenticeren met het wachtwoord dat is opgegeven in het Redis-configuratiebestand:

  1. auth your_redis_password

Redis zal bevestigen dat u bent geauthenticeerd:

Output
OK

Daarna zou het opnieuw uitvoeren van het vorige commando succesvol moeten zijn:

  1. set key1 10
Output
OK

Het get key1 commando vraagt Redis om de waarde van de nieuwe sleutel:

  1. get key1
Output
"10"

Dit laatste commando sluit redis-cli af. U kunt ook exit gebruiken:

  1. quit

Het zou nu erg moeilijk moeten zijn voor ongeautoriseerde gebruikers om toegang te krijgen tot uw Redis-installatie. Wees ervan bewust dat als u al de Redis-commandoregelclient gebruikt en vervolgens Redis opnieuw start, u opnieuw moet authenticeren. Let ook op dat zonder SSL of een VPN, dit wachtwoord nog steeds kan worden onderschept door externe partijen als u op afstand verbinding maakt met Redis.

Hierna zal deze gids ingaan op het hernoemen van Redis-commando’s om Redis verder te beschermen tegen kwaadwillende actoren.

Stap 4 — Hernoemen van Gevaarlijke Commando’s

Een andere beveiligingsfunctie ingebouwd in Redis stelt u in staat bepaalde commando’s die als gevaarlijk worden beschouwd, te hernoemen of volledig uit te schakelen. Wanneer uitgevoerd door ongeautoriseerde gebruikers, kunnen deze commando’s worden gebruikt om uw gegevens opnieuw te configureren, te vernietigen of anderszins te wissen. Enkele van de als gevaarlijk beschouwde commando’s zijn:

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM
  • RENAME
  • DEBUG

Dit is geen uitputtende lijst, maar het hernoemen of uitschakelen van alle commando’s in deze lijst kan helpen om de beveiliging van uw gegevensopslag te verbeteren. Of u een bepaald commando moet uitschakelen of hernoemen, hangt af van uw specifieke behoeften. Als u weet dat u een commando dat misbruikt kan worden nooit zult gebruiken, kunt u het uitschakelen. Anders kunt u het beter hernoemen.

Net als het authenticatie-wachtwoord wordt het hernoemen of uitschakelen van commando’s geconfigureerd in de SECURITY-sectie van het /etc/redis.conf-bestand. Om Redis-commando’s in of uit te schakelen, opent u het configuratiebestand opnieuw voor bewerking:

  1. sudo nano /etc/redis.conf

LET OP: Dit zijn voorbeelden. U moet ervoor kiezen om de commando’s uit te schakelen of te hernoemen die voor u zinvol zijn. U kunt meer te weten komen over de commando’s van Redis en bepalen hoe ze mogelijk verkeerd worden gebruikt op redis.io/commands.

Om een commando uit te schakelen of te verwijderen, hernoemt u het naar een lege string, zoals dit:

/etc/redis.conf
# Het is ook mogelijk om een commando volledig uit te schakelen door het naar
# een lege string te hernoemen:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

Om een commando te hernoemen, geeft u het een andere naam zoals in de voorbeelden hieronder. Hernoemde commando’s moeten moeilijk te raden zijn voor anderen, maar eenvoudig voor u te onthouden:

/etc/redis.conf
# Het is ook mogelijk om een commando volledig uit te schakelen door het naar
# een lege string te hernoemen:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

Sla uw wijzigingen op en sluit het bestand. Pas vervolgens de wijzigingen toe door Redis opnieuw te starten:

  1. sudo systemctl restart redis.service

Om uw nieuwe commando’s te testen, gaat u naar de Redis-opdrachtregel:

  1. redis-cli

Authenticeer uzelf met het wachtwoord dat u eerder heeft gedefinieerd:

  1. auth your_redis_password
Output
OK

Als u het CONFIG-commando hebt hernoemd naar ASC12_CONFIG, zal een poging om het config-commando te gebruiken mislukken:

  1. config get requirepass
Output
(error) ERR unknown command 'config'

Het aanroepen van het hernoemde commando zal echter succesvol zijn. Let op dat Redis-commando’s niet hoofdlettergevoelig zijn:

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

Tenslotte kunt u uit redis-cli afsluiten:

  1. exit

Waarschuwing: Met betrekking tot het hernoemen van commando’s is er een waarschuwing aan het einde van de SECURITY-sectie in het bestand /etc/redis.conf, die luidt:

/etc/redis.conf
. . .

# Let op dat het wijzigen van de namen van commando's die worden gelogd in het 
# AOF-bestand of verzonden naar replica's problemen kan veroorzaken.

. . .

Dit betekent dat als het hernoemde commando niet in het AOF-bestand staat, of als het er wel in staat maar het AOF-bestand niet naar replica’s is verzonden, er geen probleem zou moeten zijn. Houd daar rekening mee bij het hernoemen van commando’s. De beste tijd om een commando te hernoemen is wanneer je geen AOF-volharding gebruikt of direct na installatie (dat wil zeggen, voordat je Redis-gebruikende toepassing is geïmplementeerd).

Stap 5 — Instellen van Eigenaarschap en Bestandsmachtigingen van Gegevensdirectory

Deze stap zal een paar wijzigingen in eigenaarschap en machtigingen doorlopen die je mogelijk moet maken om het beveiligingsprofiel van je Redis-installatie te verbeteren. Dit omvat ervoor zorgen dat alleen de gebruiker die toegang nodig heeft tot Redis, toestemming heeft om zijn gegevens te lezen. Die gebruiker is standaard de redis-gebruiker.

Je kunt dit controleren door te grep-en naar de Redis-gegevensdirectory in een lange lijst van de bovenliggende directory. Dit commando en de uitvoer ervan worden hieronder gegeven:

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 6 22:22 redis

Deze uitvoer geeft aan dat de Redis-gegevensdirectory eigendom is van de gebruiker redis, met secundaire toegang verleend aan de groep redis. Deze eigendomsinstelling is veilig, net als de machtigingen van de map, die met behulp van octale notatie zijn ingesteld op 750.

Als de machtigingen van uw Redis-gegevensdirectory onveilig zijn, kunt u ervoor zorgen dat alleen de Redis-gebruiker en -groep toegang hebben tot de map en de inhoud ervan door het chmod-commando uit te voeren. Het volgende voorbeeld wijzigt de machtigingsinstelling van deze map naar 770:

  1. sudo chmod 770 /var/lib/redis

De andere machtiging die u mogelijk moet wijzigen, is die van het Redis-configuratiebestand. Standaard heeft het een bestandsmachtiging van 640 en is eigendom van root, met secundair eigendom door de groep root:

  1. ls -l /etc/redis.conf
Output
-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf

Die toestemming (640) betekent dat het Redis-configuratiebestand alleen leesbaar is door de gebruiker redis en de groep root. Omdat het configuratiebestand het ongecodeerde wachtwoord bevat dat u hebt geconfigureerd in stap 4, moet redis.conf eigendom zijn van de gebruiker redis, met secundair eigendom door de groep redis. Om dit in te stellen, voert u het volgende commando uit:

  1. sudo chown redis:redis /etc/redis.conf

Vervolgens wijzigt u de machtigingen zodat alleen de eigenaar van het bestand er toegang toe heeft om te lezen en te schrijven:

  1. sudo chmod 600 /etc/redis.conf

U kunt de nieuwe eigendom en machtigingen verifiëren door de vorige ls-opdrachten opnieuw uit te voeren:

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
  1. ls -l /etc/redis.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf

Tenslotte, herstart Redis om deze wijzigingen door te voeren:

  1. sudo systemctl restart redis

Daarmee is uw Redis-installatie beveiligd.

Conclusie

Houd er rekening mee dat zodra iemand is ingelogd op uw server, het mogelijk is om de Redis-specifieke beveiligingsfuncties die u hebt ingesteld te omzeilen. Daarom is de belangrijkste beveiligingsfunctie die in deze tutorial wordt behandeld de firewall, omdat dit voorkomt dat onbekende gebruikers überhaupt op uw server kunnen inloggen.

Als u probeert Redis-communicatie over een niet-vertrouwd netwerk te beveiligen, moet u een SSL-proxy gebruiken, zoals aanbevolen door Redis-ontwikkelaars in de officiële Redis-beveiligingsgids.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-rocky-linux-8