Hoe Redis te installeren en beveiligen op Ubuntu 22.04

Introductie

Redis is een in-memory key-value store die bekend staat om zijn flexibiliteit, prestaties en brede taalondersteuning. Deze tutorial demonstreert hoe u Redis installeert, configureert en beveiligt op een Ubuntu 22.04-server.

Vereisten

Om deze handleiding te voltooien, heeft u toegang nodig tot een Ubuntu 22.04-server met een niet-rootgebruiker met sudo-rechten en een firewall geconfigureerd met ufw. U kunt dit instellen door onze Initiële serverinstallatiehandleiding voor Ubuntu 22.04 te volgen.

Stap 1 — Redis installeren en configureren

We zullen de APT-pakketbeheerder gebruiken om Redis te installeren vanuit de officiële Ubuntu-repositories. Op het moment van schrijven is de beschikbare versie in de standaard repositories 6.0.16.

Begin met het bijwerken van uw lokale apt-pakketcache:

  1. sudo apt update

Installeer vervolgens Redis door te typen:

  1. sudo apt install redis-server

Dit zal Redis en zijn afhankelijkheden downloaden en installeren. Hierna is er één belangrijke configuratiewijziging die moet worden aangebracht in het Redis-configuratiebestand, dat automatisch is gegenereerd tijdens de installatie.

Open dit bestand met uw voorkeurteksteditor:

  1. sudo nano /etc/redis/redis.conf

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

/etc/redis/redis.conf
. . .

# Als u Redis uitvoert vanuit upstart of systemd, kan Redis communiceren met uw
# toezichtboom. Opties:
#   supervised no      - geen toezichtinteractie
#   supervised upstart - upstart signaleren door Redis in SIGSTOP-modus te zetten
#   supervised systemd - systemd signaleren door READY=1 naar $NOTIFY_SOCKET te schrijven
#   supervised auto    - upstart of systemd-methode detecteren op basis van
#                        UPSTART_JOB of NOTIFY_SOCKET omgevingsvariabelen
# Opmerking: deze toezichtmethoden geven alleen het signaal "proces is klaar" af.
#       Ze schakelen geen continue levende pings terug naar uw supervisor in.
supervised systemd

. . .

Dat is de enige wijziging die u op dit moment moet aanbrengen in het Redis-configuratiebestand, dus sla het op en sluit het af wanneer u klaar bent. Als u nano hebt gebruikt om het bestand te bewerken, doet u dit door op CTRL + X, Y en vervolgens ENTER te drukken.

Vervolgens start u de Redis-service opnieuw op om de wijzigingen die u hebt aangebracht in het configuratiebestand door te voeren:

  1. sudo systemctl restart redis.service

Daarmee hebt u Redis geïnstalleerd en geconfigureerd en draait het op uw machine. Voordat u het gaat gebruiken, is het echter verstandig om eerst te controleren of Redis correct werkt.

Stap 2 — Testen van Redis

Zoals bij elke nieuw geïnstalleerde software is het een goed idee om te controleren of Redis naar verwachting werkt voordat u verdere wijzigingen aanbrengt in de configuratie. We zullen in deze stap een handvol manieren bespreken om te controleren of Redis correct werkt.

Begin met controleren of de Redis-service actief is:

  1. sudo systemctl status redis

Als deze zonder fouten wordt uitgevoerd, produceert dit commando uitvoer vergelijkbaar met het volgende:

Output
● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . .

Deze uitvoer geeft aan dat Redis actief is en al is ingeschakeld, wat betekent dat het is ingesteld om elke keer op te starten wanneer de server wordt opgestart.

Opmerking: Deze instelling is wenselijk voor veel gebruikelijke toepassingen van Redis. Als u echter de voorkeur geeft aan het handmatig opstarten van Redis elke keer dat uw server opstart, kunt u dit configureren met het volgende commando:

  1. sudo systemctl disable redis

Om te controleren of Redis correct werkt, verbindt u met de server met behulp van redis-cli, de command-line client van Redis:

  1. redis-cli

In de prompt die volgt, test u de connectiviteit met het ping commando:

  1. ping
Output
PONG

Deze uitvoer bevestigt dat de serververbinding nog steeds actief is. Controleer vervolgens of u sleutels kunt instellen door het volgende uit te voeren:

  1. set test "It's working!"
Output
OK

Haal de waarde op door het volgende in te typen:

  1. get test

Als alles werkt, kunt u de waarde ophalen die u heeft opgeslagen:

Output
"It's working!"

Na bevestiging dat u de waarde kunt ophalen, verlaat u de Redis-prompt om terug te keren naar de shell:

  1. exit

Als laatste test controleren we of Redis in staat is om gegevens te behouden, zelfs nadat het is gestopt of opnieuw is opgestart. Om dit te doen, start u eerst de Redis-instantie opnieuw op:

  1. sudo systemctl restart redis

Verbind vervolgens opnieuw met de command-line client:

  1. redis-cli

En bevestig dat uw testwaarde nog steeds beschikbaar is:

  1. get test

De waarde van uw sleutel moet nog steeds toegankelijk zijn:

Output
"It's working!"

Verlaat opnieuw de shell wanneer u klaar bent:

  1. exit

Met dat, is uw Redis-installatie volledig operationeel en klaar voor gebruik. Sommige van de standaardconfiguratie-instellingen zijn echter onveilig en bieden kwaadwillende actoren mogelijkheden om uw server en de gegevens ervan aan te vallen en toegang te krijgen. De overgebleven stappen in deze handleiding behandelen methoden om deze kwetsbaarheden te verminderen, zoals voorgeschreven door de officiële Redis-website. Hoewel deze stappen optioneel zijn en Redis nog steeds zal functioneren als u ervoor kiest om ze niet te volgen, wordt sterk aanbevolen om ze uit te voeren om de beveiliging van uw systeem te versterken.

Stap 3 — Binden aan localhost

Standaard is Redis alleen toegankelijk vanaf localhost. Als je Redis echter hebt geïnstalleerd en geconfigureerd door een andere handleiding te volgen dan deze, heb je mogelijk het configuratiebestand bijgewerkt om verbindingen vanaf elke locatie toe te staan. Dit is niet zo veilig als binden aan localhost.

Om dit te corrigeren, open het Redis configuratiebestand voor bewerking:

  1. sudo nano /etc/redis/redis.conf

Zoek deze regel en zorg ervoor dat deze is uitgecommentarieerd (verwijder het #teken als het bestaat):

/etc/redis/redis.conf
. . .
bind 127.0.0.1 ::1
. . .

Sla het bestand op en sluit het af wanneer je klaar bent (druk op CTRL + X, Y, dan ENTER).

Vervolgens, herstart de service om ervoor te zorgen dat systemd je wijzigingen leest:

  1. sudo systemctl restart redis

Om te controleren of deze wijziging van kracht is geworden, voer je de volgende netstat opdracht uit:

  1. sudo netstat -lnp | grep redis
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server

Opmerking: De netstat opdracht is mogelijk niet standaard beschikbaar op je systeem. Als dit het geval is, kun je het installeren (samen met een aantal andere handige netwerktools) met de volgende opdracht:

  1. sudo apt install net-tools

Deze uitvoer toont aan dat het redis-server programma is gebonden aan localhost (127.0.0.1), wat de wijziging weerspiegelt die je zojuist hebt aangebracht in het configuratiebestand. Als er een ander IP-adres in die kolom staat (0.0.0.0, bijvoorbeeld), controleer dan nogmaals of je de juiste regel hebt uitgecommentarieerd en herstart de Redis-service opnieuw.

Nu je Redis-installatie alleen nog maar luistert naar localhost, zal het moeilijker zijn voor kwaadwillende actoren om verzoeken te doen of toegang te krijgen tot je server. Echter, Redis is momenteel niet ingesteld om gebruikers te verplichten zich te authenticeren voordat ze wijzigingen aanbrengen in de configuratie of de gegevens die het bevat. Om dit te verhelpen, kun je Redis instellen om gebruikers te verplichten zich te authenticeren met een wachtwoord voordat ze wijzigingen kunnen aanbrengen via de Redis-client (redis-cli).

Stap 4 – Configuratie van een Redis-wachtwoord

Het configureren van een Redis-wachtwoord activeert een van zijn twee ingebouwde beveiligingsfuncties – het auth-commando, dat vereist dat clients zich authenticeren om toegang te krijgen tot de database. Het wachtwoord wordt rechtstreeks geconfigureerd in het configuratiebestand van Redis, /etc/redis/redis.conf, dus open dat bestand opnieuw met je voorkeurseditor:

  1. sudo nano /etc/redis/redis.conf

Scroll naar de SECURITY-sectie en zoek een uitgecommentarieerde directive die er als volgt uitziet:

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

Haal het commentaar weg door het # te verwijderen, en verander foobared in een veilig wachtwoord.

Opmerking: Boven de requirepass-directive in het redis.conf-bestand staat een uitgecommentarieerde waarschuwing:

/etc/redis/redis.conf
. . .
# Waarschuwing: aangezien Redis vrij snel is, kan een externe gebruiker tot
# 150k wachtwoorden per seconde proberen tegen een goede server. Dit betekent dat je
# een zeer sterk wachtwoord moet gebruiken, anders is het erg gemakkelijk te kraken.
#
. . .

Het is dus belangrijk dat je een zeer sterk en zeer lang waarde opgeeft als je wachtwoord. In plaats van zelf een wachtwoord te bedenken, kun je het openssl-commando gebruiken om een willekeurig wachtwoord te genereren, zoals in het volgende voorbeeld. Door de uitvoer van het eerste commando door te sturen naar het tweede openssl-commando, zoals hier getoond, worden eventuele regelafbrekingen verwijderd die door het eerste commando worden geproduceerd:

  1. openssl rand 60 | openssl base64 -A

Dit commando geeft een uitvoer zoals dit terug:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Nadat je de uitvoer van dat commando hebt gekopieerd en geplakt als de nieuwe waarde voor requirepass, zou het moeten zijn:

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Na het instellen van het wachtwoord, sla je het bestand op en sluit je het. Start vervolgens Redis opnieuw op:

  1. sudo systemctl restart redis.service

Om te testen of het wachtwoord werkt, open je de Redis-client:

  1. redis-cli

De volgende reeks commando’s toont hoe je kunt controleren of het Redis-wachtwoord werkt. Het eerste commando probeert een sleutel op een waarde in te stellen voordat authenticatie plaatsvindt:

  1. set key1 10

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

Output
(error) NOAUTH Authentication required.

Het volgende commando authenticatiseert met het wachtwoord dat is gespecificeerd in het Redis-configuratiebestand:

  1. auth your_redis_password

Redis bevestigt:

Output
OK

Daarna zal het opnieuw uitvoeren van het vorige commando slagen:

  1. set key1 10
Output
OK

get key1 vraagt Redis om de waarde van de nieuwe sleutel.

  1. get key1
Output
"10"

Na het bevestigen dat je commando’s kunt uitvoeren in de Redis-client na authenticatie, kun je redis-cli afsluiten:

  1. quit

Vervolgens zullen we ingaan op het hernoemen van Redis-commando’s die, als ze per ongeluk of door een kwaadwillende actor worden ingevoerd, ernstige gevolgen kunnen hebben voor je gegevens.

Stap 5 – Gevaarlijke Commando’s Hernoemen

De andere beveiligingsfunctie ingebouwd in Redis omvat het hernoemen of volledig uitschakelen van bepaalde commando’s die als gevaarlijk worden beschouwd.

Wanneer ze worden uitgevoerd door ongeautoriseerde gebruikers, kunnen dergelijke commando’s worden gebruikt om je gegevens opnieuw te configureren, te vernietigen of anderszins te wissen. Net als het authenticatiewachtwoord wordt het hernoemen of uitschakelen van commando’s geconfigureerd in dezelfde SECURITY-sectie van het /etc/redis/redis.conf-bestand.

Enkele van de commando’s die als gevaarlijk worden beschouwd zijn: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME en DEBUG. Dit is geen uitputtende lijst, maar het hernoemen of uitschakelen van al deze commando’s is een goed startpunt om de beveiliging van je Redis-server te verbeteren.

Of je een opdracht moet uitschakelen of hernoemen, hangt af van je specifieke behoeften of die van je site. Als je weet dat je een opdracht die misbruikt kan worden nooit zult gebruiken, kun je deze uitschakelen. Anders is het misschien in jouw belang om deze te hernoemen.

Om Redis-opdrachten te hernoemen of uit te schakelen, open je opnieuw het configuratiebestand:

  1. sudo nano /etc/redis/redis.conf

Waarschuwing: De volgende stappen laten zien hoe je opdrachten kunt uitschakelen en hernoemen als voorbeeld. Je moet alleen kiezen om opdrachten uit te schakelen of te hernoemen die voor jou zinvol zijn. Je kunt de volledige lijst met opdrachten zelf bekijken en bepalen hoe ze misbruikt kunnen worden op redis.io/commands.

Om een opdracht uit te schakelen, hernoem je deze naar een lege string (aangegeven door een paar aanhalingstekens zonder tekens ertussen), zoals hieronder getoond:

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

Om een opdracht te hernoemen, geef je deze een andere naam zoals in de onderstaande voorbeelden wordt getoond. Hernoemde opdrachten moeten moeilijk te raden zijn voor anderen, maar gemakkelijk te onthouden voor jou:

/etc/redis/redis.conf
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

Sla je wijzigingen op en sluit het bestand.

Na het hernoemen van een opdracht, pas je de wijziging toe door Redis opnieuw op te starten:

  1. sudo systemctl restart redis.service

Om de nieuwe opdracht te testen, voer je de Redis-commandoregel in:

  1. redis-cli

Vervolgens, authenticeren:

  1. auth your_redis_password
Output
OK

Laten we aannemen dat je de opdracht CONFIG hebt hernoemd naar ASC12_CONFIG, zoals in het voorgaande voorbeeld. Probeer eerst de oorspronkelijke CONFIG-opdracht te gebruiken. Deze zou moeten mislukken omdat je deze hebt hernoemd:

  1. config get requirepass
Output
(error) ERR unknown command `config`, with args beginning with:

Het aanroepen van het hernoemde commando zal echter succesvol zijn. Het is niet hoofdlettergevoelig:

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

Tenslotte kunt u afsluiten vanuit redis-cli:

  1. exit

Merk op dat als u al de Redis commandoregel gebruikt en vervolgens Redis herstart, u opnieuw moet authenticeren. Anders krijgt u deze foutmelding als u een commando typt:

Output
NOAUTH Authentication required.

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

/etc/redis/redis.conf
. . .
# Houd er rekening mee dat het wijzigen van de naam van commando's die worden gelogd in het
# AOF-bestand of verzonden naar replica's problemen kan veroorzaken.
. . .

Let op: Het Redis-project kiest ervoor om de termen “master” en “slave” te gebruiken, terwijl DigitalOcean over het algemeen de voorkeur geeft aan de alternatieven “primary” en “secondary”. Om verwarring te voorkomen hebben we ervoor gekozen om de termen te gebruiken die in de Redis-documentatie worden gebruikt.

Dat betekent dat als het hernoemde commando niet in het AOF-bestand staat, of als dat wel zo is maar het AOF-bestand nog niet naar slaves is verzonden, er geen probleem zou moeten zijn.

Dus, houd dat in gedachten wanneer u probeert commando’s te hernoemen. De beste tijd om een commando te hernoemen is wanneer u geen AOF persistentie gebruikt, of direct na installatie, dat wil zeggen voordat uw Redis-gebruikende applicatie is geïmplementeerd.

Als u AOF gebruikt en te maken heeft met een master-slave installatie, overweeg dan dit antwoord van de GitHub-issuepagina van het project. Het volgende is een antwoord op de vraag van de auteur:

De opdrachten worden gelogd naar de AOF en gerepliceerd naar de slave op dezelfde manier als ze worden verzonden, dus als je probeert de AOF opnieuw af te spelen op een instantie die niet dezelfde naamgeving heeft, kun je tegen inconsistenties aanlopen omdat de opdracht niet kan worden uitgevoerd (hetzelfde geldt voor slaves).

Dus de beste manier om hernoemen in gevallen als deze aan te pakken, is ervoor te zorgen dat hernoemde opdrachten worden toegepast op alle instanties in master-slave-installaties.

Conclusie

In deze tutorial heb je Redis geïnstalleerd en geconfigureerd, gevalideerd dat je Redis-installatie correct werkt en zijn ingebouwde beveiligingsfuncties gebruikt om het minder kwetsbaar te maken voor aanvallen van kwaadwillende actoren.

Houd er rekening mee dat zodra iemand is ingelogd op je server, het erg gemakkelijk is om de op Redis gebaseerde beveiligingsfuncties die we hebben ingesteld te omzeilen. Daarom is de belangrijkste beveiligingsfunctie op je Redis-server je firewall (die je hebt geconfigureerd als je de vereiste Initiële serverinstellingen tutorial hebt gevolgd), omdat dit het uiterst moeilijk maakt voor kwaadwillende actoren om die barrière te omzeilen.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04