sql >> Database teknologi >  >> RDS >> Database

Er din database sikret? Tænk igen

1. Beskyt din server

Mange kendte angreb er kun mulige én gang fysisk adgang til en maskine. Af denne grund er det bedst at have applikationsserveren og databaseserveren på forskellige maskiner. Hvis dette ikke er muligt, skal der udvises større forsigtighed. Ellers kan en angriber ved at udføre fjernkommandoer via en applikationsserver være i stand til at skade din database selv uden tilladelser. Af denne grund bør enhver tjeneste, der kører på den samme maskine som databasen, tildeles den lavest mulige tilladelse, der stadig tillader tjenesten at fungere.


Glem ikke at installere hele sikkerhedspakken:Antivirus og Anti-spam, Firewall og alle sikkerhedspakkerne anbefalet af dit operativsystems leverandør. Glem heller ikke at bruge 10 minutter på at tænke på din servers fysiske placering - på den forkerte placering kan din server blive stjålet, oversvømmet, skadet af vilde dyr eller vagranter.

2. Localhost Security eller Deaktiver eller begræns fjernadgang

Overvej om MySQL vil blive hentet fra systemet eller tilgås direkte fra dets egen server. Hvis der er mulighed for, at fjernadgang bliver brugt, skal du garantere, at netop karakteriserede værter kan komme til serveren. Dette gøres almindeligvis gennem TCP-indpakninger, IP-tabeller eller andre firewallprogrammerings- eller hardwaretilgængelighedsværktøjer.
For at begrænse MySQL fra at åbne en netværkssocket, bør den medfølgende parameter inkluderes i [mysqld]-området i my.cnf eller my.ini:

spring over netværk

Dokumentet er placeret i "C:\Program Files\MySQL\MySQL Server 5.1" katalog på Windows-operativsystemet eller "/etc/my.cnf" eller "/etc/mysql/my.cnf" på Linux.
Denne linje lammer starten af ​​systemadministration midt i MySQL-opstarten. Det ville være ideelt, hvis du husker på, at en lokal forbindelse kan bruges, opsæt en forbindelse til MySQL-serveren.

En anden mulig løsning er at tvinge MySQL til kun at lytte til den lokale vært ved at tilføje følgende linje i [mysqld] sektion af my.cnf bind-adresse=127.0.0.1
Du er muligvis ikke villig til at udelukke systemadgang til din databaseserver, hvis klienter i din organisation har grænseflader med serveren fra deres maskiner eller webserveren introduceret på en alternativ maskine. I så fald bør følgende restriktive bevillingssyntaks overvejes:

mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';  

3. Deaktiver brugen af ​​LOCAL INFILE

Den næste ændring er at deaktivere brugen af ​​"LOAD DATA LOCAL INFILE" kommando, som vil hjælpe med at holde ugodkendt gennemlæsning fra kvarterets optegnelser. Dette er især vigtigt, når der findes nye SQL Injection-sårbarheder i PHP-applikationer.
Derudover, i visse tilfælde, "LOKAL INFIL" kommandoen kan bruges til at få adgang til andre filer på operativsystemet, for eksempel "/etc/passwd" , ved hjælp af følgende kommando:

mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1

Eller endda væsentligt mindre svært:

mysql> SELECT load\_file("/etc/passwd")

For at deaktivere brugen af ​​"LOCAL INFILE" kommando, skal følgende parameter tilføjes i [mysqld] afsnittet i MySQL-konfigurationsfilen.

set-variable=local-infile=0

4. Skift root brugernavn og adgangskode, hold dem stærke.

Standard administratorbrugernavnet på MySQL-serveren er "root" . Hackere forsøger ofte at få adgang til deres tilladelser. For at gøre denne opgave sværere skal du omdøbe "root" til noget andet og forsyne den med en lang, kompleks alfanumerisk adgangskode.

For at omdøbe administratorens brugernavn skal du bruge kommandoen omdøb i MySQL-konsollen:

mysql> RENAME USER root TO new\_user;

MySQL "RENAME USER" kommandoen dukkede først op i MySQL version 5.0.2. Hvis du bruger en ældre version af MySQL, kan du bruge andre kommandoer til at omdøbe en bruger:

mysql> use mysql;

mysql> update user set user="new\_user" where user="root";

mysql> flush privileges;

For at ændre en brugers adgangskode skal du bruge følgende kommandolinjekommando:

mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');

Det er også muligt at ændre adgangskoden ved at bruge "mysqladmin" hjælpeprogram:

shell> mysqladmin -u username -p password newpass

5. Fjern "Test"-databasen

MySQL kommer med en "test" database beregnet som et testrum. Den kan tilgås af den anonyme bruger og bruges derfor af adskillige angreb.
For at fjerne denne database skal du bruge drop-kommandoen som følger:

mysql> drop database test;  

Eller brug "mysqladmin" kommando:

shell> mysqladmin -u username -p drop test  

6. Fjern anonyme og forældede konti

MySQL-databasen kommer med nogle anonyme brugere med tomme adgangskoder. Som et resultat kan enhver oprette forbindelse til databasen for at kontrollere, om dette er tilfældet, gør følgende:

mysql> select \* from mysql.user where user="";  

I et sikkert system bør ingen linjer ekko tilbage. En anden måde at gøre det samme på:

mysql> SHOW GRANTS FOR ''@'localhost';

mysql> SHOW GRANTS FOR ''@'myhost';

Hvis bevillingerne eksisterer, kan enhver få adgang til databasen og i det mindste bruge standarddatabasen"test" . Tjek dette med:

shell> mysql -u blablabla

For at fjerne kontoen skal du udføre følgende kommando:

mysql> DROP USER "";

MySQL "DROP USER" kommandoen understøttes fra og med MySQL version 5.0. Hvis du bruger en ældre version af MySQL, kan du fjerne kontoen som følger:

mysql> use mysql;

mysql> DELETE FROM user WHERE user="";

mysql> flush privileges;  

7. Øg sikkerheden med rollebaseret adgangskontrol

En meget almindelig anbefaling om databasesikkerhed er at sænke de tilladelser, der gives til forskellige parter. MySQL er ikke anderledes. Typisk, når udviklere arbejder, bruger de systemets maksimale tilladelse og tager mindre hensyn til tilladelsesprincipper, end vi kunne forvente. Denne praksis kan udsætte databasen for betydelig risiko.
* Enhver ny MySQL 5.x-installation, der allerede er installeret med de korrekte sikkerhedsforanstaltninger.
For at beskytte din database skal du sørge for, at filbiblioteket, som MySQL-databasen faktisk er gemt i, ejes af brugeren "mysql" og gruppen "mysql".

shell>ls -l /var/lib/mysql

Derudover skal du sikre dig, at kun brugeren "mysql" og "root" har adgang til mappen /var/lib/mysql .
Mysql-binære filer, som ligger under mappen /usr/bin/, bør ejes af "root" eller den specifikke system-"mysql"-bruger. Andre brugere bør ikke have skriveadgang til disse filer.

shell>ls -l /usr/bin/my\*  

8. Hold øje med databaserettigheder

Operativsystemtilladelser blev rettet i det foregående afsnit. Lad os nu tale om databasetilladelser. I de fleste tilfælde er der en administratorbruger (den omdøbte "rod") og en eller flere faktiske brugere, der eksisterer side om side i databasen. Normalt har "roden" intet at gøre med dataene i databasen; i stedet bruges det til at vedligeholde serveren og dens tabeller, til at give og tilbagekalde tilladelser osv.
På den anden side bruges nogle bruger-id'er til at få adgang til dataene, såsom det bruger-id, der er tildelt webserveren for at udføre "vælg\opdater\indsæt\slet"-forespørgsler og til at udføre lagrede procedurer. I de fleste tilfælde er ingen andre brugere nødvendige; dog er det kun dig, som systemadministrator, der virkelig kan kende din applikations behov.

Kun administratorkonti skal tildeles SUPER/PROCESS/FILE-rettigheder og adgang til mysql-databasen. Normalt er det en god idé at sænke administratorens tilladelser til at få adgang til dataene.

Gennemgå rettighederne for resten af ​​brugerne og sørg for, at disse er indstillet korrekt. Dette kan gøres ved hjælp af følgende trin.

mysql> use mysql;  

[Identificer brugere]

mysql> select \* from users;  

[Liste tilskud for alle brugere]

mysql> show grants for ‘root’@’localhost’;

Ovenstående erklæring skal udføres for hver bruger! Bemærk, at kun brugere, der virkelig har brug for root-privilegier, bør tildeles dem.

Et andet interessant privilegium er "VIS DATABASER". Som standard kan kommandoen bruges af alle, der har adgang til MySQL-prompten. De kan bruge det til at indsamle information (f.eks. få databasenavne), før de angriber databasen ved for eksempel at stjæle dataene. For at forhindre dette, anbefales det, at du følger procedurerne beskrevet nedenfor.

  • Tilføj " --skip-show-database" til startscriptet for MySQL eller tilføj det til MySQL-konfigurationsfilen
  • Giv kun SHOW DATABASES-privilegiet til de brugere, du vil bruge denne kommando

For at deaktivere brugen af ​​kommandoen "SHOW DATABASES" skal følgende parameter tilføjes i [mysqld]-sektionen i /etc/my.cnf :

[mysqld]

skip-show-database  

9. Aktiver logning

Hvis din databaseserver ikke udfører mange forespørgsler, anbefales det, at du aktiverer transaktionslogning ved at tilføje følgende linje til [mysqld]-sektionen i /etc/my.cnf fil:

[mysqld]

log =/var/log/mylogfile  

Dette anbefales ikke til tunge produktions MySQL-servere, fordi det forårsager høj overhead på serveren.
Derudover skal du kontrollere, at kun "root" og "mysql" id'erne har adgang til disse logfiler (i det mindste skriveadgang).

Fejllog Sørg for, at kun "root" og "mysql" har adgang til logfilen "hostname.err". Filen er gemt i mysql-datamappen. Denne fil indeholder meget følsomme oplysninger såsom adgangskoder, adresser, tabelnavne, lagrede procedurenavne og kodedele. Den kan bruges til informationsindsamling, og i nogle tilfælde kan den give angriberen den information, der er nødvendig for at udnytte databasen, den maskine, som databasen er installeret på, eller dataene i den.

MySQL-log Sørg for, at kun "root" og "mysql" har adgang til logfilen "logfile XY". Filen er gemt i mysql-databiblioteket.

10. Skift rodmappen

En chroot på UNIX {operativsystem}-operativsystemer er en operation, der ændrer det tilsyneladende diskrodbibliotek for den nuværende køremetode og dens børn. Et program, der er genrodet til en anden mappe, kan ikke få adgang til eller navngive filer uden for denne mappe, og derfor kaldes mappen et "chroot-fængsel" eller (mindre almindeligt) et "chroot-fængsel".

Ved at bruge chroot-miljøet kan skriveadgangen til mySQL-processerne (og underordnede processer) begrænses, hvilket øger serverens sikkerhed.

Sørg for, at der findes en dedikeret mappe til det chrootede miljø. Dette burde være noget i stil med:/chroot/mysql For at gøre brugen af ​​databaseadministrative værktøjer praktisk, bør følgende parameter desuden ændres i [klient]-sektionen af ​​MySQL-konfigurationsfilen:

[klient]

socket = /chroot/mysql/tmp/mysql.sock

Takket være den kodelinje vil der ikke være behov for at levere kommandoerne mysql, mysqladmin, mysqldump osv. med --socket=/chroot/mysql/tmp/mysql.sock parameter hver gang disse værktøjer køres.

11. Slet gamle logfiler regelmæssigt

Under installationsprocedurerne er der masser af følsomme data, som vil hjælpe uvelkomne brugere med at angribe en database. Disse data opbevares i serverens historie og kan være meget nyttige, hvis en ting går galt under installationen. Ved at analysere historiefilerne kan administratorer finde ud af, hvad der er gået galt og sandsynligvis rette op på tingene. Disse filer er dog ikke nødvendige efter installationen er fuldført.
Vi bør fjerne indholdet af MySQL-historikfilen (~/.mysql_history), hvor som helst alle døde SQL-kommandoer opbevares (især adgangskoder, der opbevares som almindelig tekst):

cat /dev/null > ~/.mysql\_history

Afslutningsvis bør vi lægge vægt på databasesikkerhed. Det bør dog være det første for enhver person eller en virksomhed.


  1. Hvordan indstiller jeg programmæssigt forbindelsesstrengen for Entity-Framework Code-First?

  2. Oprettelse af en webapp fra bunden ved hjælp af Python Flask og MySQL:Del 5

  3. SQLite udtryksbaseret indeks

  4. connection.select_value returnerer kun strenge i postgres med pg gem