sql >> Database >  >> RDS >> PostgreSQL

Versleuteling gebruiken om PostgreSQL-databasebeveiliging te versterken

Opmerking:Delen van de blog bevatten verwijzingen en voorbeelden uit "AANKONDIGING VAN BESCHIKBAARHEID VAN POSTGRESQL INSTANCE LEVEL ENCRYPTION" door CyberTec, een bedrijf dat ondersteuning, advies en training biedt voor PostgreSQL.

Organisaties hebben te maken met verschillende soorten gegevens, waaronder zeer cruciale informatie die in een database moet worden opgeslagen. Beveiliging is een belangrijk aspect van overweging om ervoor te zorgen dat gevoelige gegevens zoals medische dossiers en financiële transacties niet in handen komen van mensen met snode middelen. In de loop der jaren komen ontwikkelaars met meerdere maatregelen om de gegevensintegriteit en -bescherming te verbeteren. Een van de meest gebruikte technieken is encryptie om datalekken te voorkomen.

Hoe vaak je ook complexe beschermingsmaatregelen hebt gebruikt, het kan zijn dat sommige mensen toch toegang krijgen tot je systeem. Versleuteling is een extra beveiligingslaag. PostgreSQL biedt codering op verschillende niveaus en biedt flexibiliteit bij het beschermen van gegevens tegen openbaarmaking als gevolg van onbetrouwbare beheerders, onveilige netwerkverbindingen en diefstal van databaseservers. PostgreSQL biedt verschillende coderingsopties, zoals:

  • SSL-hostverificatie
  • Gegevens versleutelen via een netwerk
  • Encryptie gegevenspartitie
  • Encryptie voor specifieke kolommen
  • Versleuteling wachtwoordopslag
  • Encryptie aan clientzijde

Hoe meer geavanceerde coderingsstrategie u gebruikt, hoe groter de kans dat u geen toegang meer heeft tot uw gegevens. Bovendien zal het leesproces niet alleen moeilijk zijn, maar ook veel bronnen vereisen om te zoeken en te decoderen. De coderingsoptie die u selecteert, hangt af van de aard van de gegevens waarmee u te maken hebt in termen van gevoeligheid. Het onderstaande diagram illustreert de algemene procedure van gegevenscodering en -decodering tijdens servertransacties.

Dit artikel bespreekt verschillende manieren waarop een onderneming gevoelige informatie kan beveiligen, maar het belangrijkste aandachtspunt is de eerder genoemde versleuteling op instantieniveau.

Encryptie

Versleuteling is een praktijk van het coderen van gegevens zodat deze niet langer in het oorspronkelijke formaat zijn en niet kunnen worden gelezen. Er zijn 2 soorten data wat betreft de database:data in rust en data in beweging. Wanneer gegevens in de database worden opgeslagen, wordt dit gegevens in rust genoemd. Aan de andere kant, als een klant bijvoorbeeld een verzoek naar de database stuurt, als sommige gegevens worden geretourneerd en de klant moeten bereiken, dan wordt dit data in beweging genoemd. De twee verschillende soorten gegevens moeten worden beschermd met behulp van vergelijkbare technologie. Als een applicatie bijvoorbeeld zo is ontwikkeld dat een gebruiker een wachtwoord moet opgeven, wordt dit wachtwoord niet als platte tekst in de database opgeslagen. Er zijn enkele coderingsprocedures die worden gebruikt om deze platte tekst vóór opslag in een andere tekenreeks te veranderen. Trouwens, als de gebruiker dit wachtwoord moet gebruiken voor bijvoorbeeld een inlogsysteem, dan hebben we een manier nodig om er een te vergelijken die zal worden ingediend tijdens het decoderingsproces.

Database-encryptie kan op verschillende manieren worden geïmplementeerd, maar veel ontwikkelaars houden geen rekening met het transportniveau. De verschillende benaderingen worden echter ook geassocieerd met verschillende valkuilen bij vertraagde gegevenstoegangstijden, vooral wanneer virtueel geheugen zwaar wordt gebruikt.

Encryptie van gegevens in rust

Gegevens in rust betekent inactieve gegevens die fysiek op schijf zijn opgeslagen. Als het gaat om het hosten van een database in een cloudomgeving, waar de cloudleverancier volledige toegang heeft tot de infrastructuur, kan versleuteling een goede maatregel zijn om de controle over de gegevens te behouden. Enkele van de coderingsstrategieën die u kunt gebruiken, worden hieronder besproken.

Full Disk Encryption (FDE)

Het concept achter FDE is over het algemeen om elk bestand en tijdelijke opslag te beschermen die delen van de gegevens kan bevatten. Het is behoorlijk efficiënt, vooral als je het moeilijk vindt om te selecteren wat je wilt beschermen of liever als je geen bestand wilt missen. Het belangrijkste voordeel van deze strategie is dat het geen speciale aandacht vereist van de eindgebruiker na toegang tot het systeem. Deze aanpak heeft wel enkele valkuilen. Deze omvatten:

  • Het coderings- en decoderingsproces vertraagt ​​de algehele toegang tot gegevens.
  • Gegevens zijn mogelijk niet beschermd wanneer het systeem is ingeschakeld, omdat de informatie wordt gedecodeerd en klaar is om gelezen te worden. U moet daarom een ​​aantal andere coderingsstrategieën toepassen, zoals op bestanden gebaseerde codering.

Bestandsgebaseerde versleuteling

In dit geval worden de bestanden of mappen versleuteld door het stapelbare cryptografische bestandssysteem zelf. In PostgreSQL gebruiken we vaak de pg_crypto-aanpak zoals besproken in dit artikel.

Enkele voordelen van de codering van het bestandssysteem zijn:

  • Actiecontrole kan worden afgedwongen door gebruik te maken van cryptografie met openbare sleutels
  • Gescheiden beheer van versleutelde bestanden, zodat back-ups van individueel gewijzigde bestanden, zelfs in versleutelde vorm, in plaats van back-ups van het gehele versleutelde volume.

Dit is echter niet een veel betrouwbare versleutelingsmethode die u kunt gebruiken voor uw geclusterde gegevens. De reden hiervoor is dat sommige op bestanden gebaseerde versleutelingsoplossingen een overblijfsel van versleutelde bestanden kunnen achterlaten waarvan een aanvaller kan herstellen. De beste combinatiebenadering is daarom om dit te combineren met volledige schijfversleuteling.

Encryptie op instantieniveau

Instantieniveau maakt gebruik van buffers zodat alle bestanden die deel uitmaken van het PostgreSQL-cluster op schijf worden opgeslagen als data-at-rest-codering. Ze worden vervolgens gepresenteerd als ontsleutelingsblokken wanneer ze van schijf in gedeelde buffers worden gelezen. Na het wegschrijven van deze blokken naar schijf vanuit de gedeelde buffers, worden ze weer automatisch versleuteld. De database wordt eerst geïnitialiseerd met codering met behulp van de opdracht initdb. Ten tweede wordt tijdens het opstarten de coderingssleutel op een van deze twee manieren door de server opgehaald; via de parameter pgcrypto.keysetup_command of via een omgevingsvariabele.

Download de whitepaper vandaag PostgreSQL-beheer en -automatisering met ClusterControlLees wat u moet weten om PostgreSQL te implementeren, bewaken, beheren en schalenDownload de whitepaper

Versleuteling op instantieniveau instellen

Een korte samenvatting van hoe u versleuteling op instantieniveau kunt instellen, vindt u in de onderstaande stappen:

  1. Controleer of je “contrib” hebt geïnstalleerd met het commando rpm -qa |grep contrib voor op RedHat gebaseerd besturingssysteem of dpkg -l |grep contrib voor op Debian gebaseerd besturingssysteem. Als het niet in de lijst staat, installeer het dan met apt-get install postgresql-contrib als je de op Debian gebaseerde omgeving gebruikt of yum install postgresql-contrib als je een op RedHat gebaseerd besturingssysteem gebruikt.
  2. Bouw de PostgreSQL-code.
  3. Cluster initialiseren door het vaststellen van de encryptiesleutel en het uitvoeren van het he initdb commando
    read -sp "Postgres passphrase: " PGENCRYPTIONKEY
    export PGENCRYPTIONKEY=$PGENCRYPTIONKEY
    initdb –data-encryption pgcrypto --data-checksums -D cryptotest
  4. Start de server met het commando
    $ postgres -D /usr/local/pgsql/data
  5. De omgevingsvariabele PGENCRYPTIONKEY instellen met het commando:
    export PGENCRYPTIONKEY=topsecret pg_ctl -D cryptotest start
    De sleutel kan ook worden ingesteld via een aangepaste en veiligere procedure voor het lezen van de sleutel via het bovengenoemde commando "pgcrypto.keysetup_command" postgresql.conf parameter.

Prestatieverwachtingen

Versleuteling gaat altijd ten koste van de prestaties, aangezien er geen opties zijn zonder kosten. Als uw werklast IO-gericht is, kunt u een aanzienlijk verminderde prestatie verwachten, maar dit is mogelijk niet het geval. Soms, op de typische serverhardware, als de dataset minder wordt gedeeld in de buffers of de verblijfsduur in de buffers kort is, kan de prestatiehit verwaarloosbaar zijn.

Nadat ik de codering van mijn database had uitgevoerd, heb ik een kleine test uitgevoerd om te controleren of codering echt van invloed is op de prestaties en de resultaten zijn hieronder weergegeven.

Werklast Geen codering Met encryptie Prestatiekosten
Bulk invoegbewerking 26s 68s 161%
Lezen-schrijven passen in gedeelde buffers (in de verhouding van 1:3) 3200TPS 3068TPS 4.13%
Alleen lezen van gedeelde buffers 2234 TPS 2219 TPS 0,68%
Alleen-lezen past niet in gedeelde buffers 1845 TP's 1434 TPS 22.28%
Lezen-schrijven past niet in gedeelde buffers in de verhouding 1:3 3422 TPS 2545 TPS 25,6%

Zoals weergegeven in de bovenstaande tabel, kunnen we zien dat de prestatie niet-lineair is, omdat deze soms springt van 161% naar 0,7%. Dit is een eenvoudige indicatie dat de coderingsprestaties werklastspecifiek zijn en niet alleen gevoelig zijn voor het aantal pagina's dat wordt verplaatst tussen gedeelde buffers en schijf. Dit kan ook van invloed zijn op de kracht van de CPU, afhankelijk van de betrokken werkbelasting. Versleuteling op instantieniveau is een redelijk haalbare optie en de eenvoudigste benadering voor een aantal omgevingen.

Conclusie

Gegevensversleuteling is een belangrijke onderneming, vooral voor gevoelige informatie in databasebeheer. Er zijn een aantal opties beschikbaar voor gegevensversleuteling wat betreft PostgreSQL. Bij het bepalen welke benadering moet worden gebruikt, is het belangrijk om de gegevens, de applicatie-architectuur en het gegevensgebruik te begrijpen, aangezien versleuteling ten koste gaat van de prestaties. Op deze manier kunt u begrijpen:wanneer u versleuteling moet inschakelen, waar uw gegevens worden blootgesteld en waar het veilig is, wat de beste versleutelingsmethode is om te gebruiken.


  1. Reset MySQL-rootwachtwoord met behulp van de instructie ALTER USER na installatie op Mac

  2. ComboBox.ValueMember en DisplayMember

  3. SQL Server Database Back-up Encryptie

  4. MySQL SELECTEER LIKE of REGEXP om meerdere woorden in één record te matchen