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:
- 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
:
- 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
:
. . .
# 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:
- sudo systemctl start redis.service
Als je wilt dat Redis opstart, kun je het inschakelen met het enable
-commando:
- 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:
- 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:
- redis-cli ping
Dit zou PONG
als antwoord moeten geven:
OutputPONG
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:
- 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:
. . .
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:
. . .
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:
- sudo firewall-cmd --permanent --new-zone=redis
Vervolgens specificeer welke poort je open wilt hebben. Redis gebruikt standaard poort 6379
:
- 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:
- 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:
- 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:
- sudo nano /etc/redis.conf
Scroll naar de SECURITY
-sectie en zoek naar een uitgecommentarieerde richtlijn die als volgt luidt:
. . .
# 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:
- 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:
. . .
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:
- echo "digital-ocean" | sha1sum
Na het instellen van het wachtwoord, sla het bestand op en sluit het vervolgens af en herstart Redis:
- sudo systemctl restart redis
Om te testen of het wachtwoord werkt, opent u de Redis-client:
- 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:
- 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:
- auth your_redis_password
Redis zal bevestigen dat u bent geauthenticeerd:
OutputOK
Daarna zou het opnieuw uitvoeren van het vorige commando succesvol moeten zijn:
- set key1 10
OutputOK
Het get key1
commando vraagt Redis om de waarde van de nieuwe sleutel:
- get key1
Output"10"
Dit laatste commando sluit redis-cli
af. U kunt ook exit
gebruiken:
- 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:
- 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:
# 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:
# 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:
- sudo systemctl restart redis.service
Om uw nieuwe commando’s te testen, gaat u naar de Redis-opdrachtregel:
- redis-cli
Authenticeer uzelf met het wachtwoord dat u eerder heeft gedefinieerd:
- auth your_redis_password
OutputOK
Als u het CONFIG
-commando hebt hernoemd naar ASC12_CONFIG
, zal een poging om het config
-commando te gebruiken mislukken:
- 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:
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
Tenslotte kunt u uit redis-cli
afsluiten:
- 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:
. . .
# 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:
- ls -l /var/lib | grep redis
Outputdrwxr-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
:
- 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:
- 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:
- 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:
- sudo chmod 600 /etc/redis.conf
U kunt de nieuwe eigendom en machtigingen verifiëren door de vorige ls
-opdrachten opnieuw uit te voeren:
- ls -l /var/lib | grep redis
Outputtotal 40
drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
- ls -l /etc/redis.conf
Outputtotal 40
-rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf
Tenslotte, herstart Redis om deze wijzigingen door te voeren:
- 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