sql >> Databasteknik >  >> RDS >> Database

Är din databas säker? Tänk om

1. Säkra din server

Många kända attacker är möjliga endast en gång fysiskt åtkomst till en maskin. Av denna anledning är det bäst att ha applikationsservern och databasservern på olika maskiner. Om detta inte är möjligt måste större försiktighet iakttas. Annars kan en angripare skada din databas även utan behörighet genom att utföra fjärrkommandon via en applikationsserver. Av denna anledning bör alla tjänster som körs på samma dator som databasen ges lägsta möjliga behörighet som fortfarande tillåter tjänsten att fungera.


Glöm inte att installera hela säkerhetspaketet:Antivirus och anti-spam, brandvägg och alla säkerhetspaket som rekommenderas av ditt operativsystems leverantör. Glöm inte heller att spendera 10 minuter på att tänka på din servers fysiska plats – på fel plats kan din server bli stulen, översvämmad, skadad av vilda djur eller lösdrivare.

2. Localhost Security eller Inaktivera eller begränsa fjärråtkomst

Fundera på om MySQL kommer att hämtas från systemet eller nås direkt från sin egen server. Om en chans att fjärråtkomst används, garantera att just karakteriserade värdar kan komma till servern. Detta görs vanligtvis genom TCP-omslag, IP-tabeller eller någon annan brandväggsprogrammering eller maskinvarutillgänglighetsverktyg.
För att begränsa MySQL från att öppna ett nätverksuttag, bör den medföljande parametern inkluderas i området [mysqld] i my.cnf eller my.ini:

hoppa över nätverk

Dokumentet finns i "C:\Program Files\MySQL\MySQL Server 5.1" katalog på Windows operativsystem eller "/etc/my.cnf" eller "/etc/mysql/my.cnf" på Linux.
Den här raden lamslår starten av systemadministration mitt under MySQL-starten. Det skulle vara idealiskt om du tänker på att en lokal anslutning kan användas och skapa en anslutning till MySQL-servern.

En annan möjlig lösning är att tvinga MySQL att bara lyssna på den lokala värden genom att lägga till följande rad i [mysqld] avsnitt av my.cnf bind-adress=127.0.0.1
Du kanske inte är villig att inaktivera systemåtkomst till din databasserver om klienter i din organisation har gränssnitt mot servern från sina maskiner eller webbservern som introduceras på en alternativ maskin. I så fall bör följande restriktiva tilldelningssyntax övervägas:

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

3. Inaktivera användningen av LOCAL INFILE

Nästa ändring är att inaktivera användningen av "LOAD DATA LOCAL INFILE" kommando, som hjälper till att hålla ogodkänd läsning från grannskapsregister. Detta är särskilt viktigt när nya SQL Injection-sårbarheter i PHP-applikationer hittas.
Dessutom, i vissa fall, "LOKALA INFIL" kommandot kan användas för att få åtkomst till andra filer i operativsystemet, till exempel "/etc/passwd" , med följande kommando:

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

Eller till och med betydligt mindre svårt:

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

För att inaktivera användningen av "LOKALA INFIL" kommandot, bör följande parameter läggas till i [mysqld] avsnittet i MySQL-konfigurationsfilen.

set-variable=local-infile=0

4. Ändra root-användarnamn och lösenord, håll dem starka.

Standardadministratörens användarnamn på MySQL-servern är "root" . Hackare försöker ofta få tillgång till dess behörigheter. För att göra den här uppgiften svårare, byt namn på "root" till något annat och förse det med ett långt, komplext alfanumeriskt lösenord.

För att byta namn på administratörens användarnamn, använd kommandot Rename i MySQL-konsolen:

mysql> RENAME USER root TO new\_user;

MySQL "RENAME USER" kommandot dök först upp i MySQL version 5.0.2. Om du använder en äldre version av MySQL kan du använda andra kommandon för att byta namn på en användare:

mysql> use mysql;

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

mysql> flush privileges;

För att ändra en användares lösenord, använd följande kommandoradskommando:

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

Det är också möjligt att ändra lösenordet med "mysqladmin" verktyg:

shell> mysqladmin -u username -p password newpass

5. Ta bort "Test"-databasen

MySQL kommer med en "test"-databas avsedd som ett testutrymme. Den kan nås av den anonyma användaren och används därför av många attacker.
För att ta bort denna databas, använd drop-kommandot enligt följande:

mysql> drop database test;  

Eller använd "mysqladmin" kommando:

shell> mysqladmin -u username -p drop test  

6. Ta bort anonyma och inaktuella konton

MySQL-databasen kommer med några anonyma användare med tomma lösenord. Som ett resultat kan vem som helst ansluta till databasen för att kontrollera om så är fallet, gör följande:

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

I ett säkert system ska inga linjer ekas tillbaka. Ett annat sätt att göra detsamma:

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

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

Om bidragen finns kan vem som helst komma åt databasen och åtminstone använda standarddatabasen"test" . Kontrollera detta med:

shell> mysql -u blablabla

För att ta bort kontot, kör följande kommando:

mysql> DROP USER "";

MySQL "DROP USER" kommandot stöds från och med MySQL version 5.0. Om du använder en äldre version av MySQL kan du ta bort kontot på följande sätt:

mysql> use mysql;

mysql> DELETE FROM user WHERE user="";

mysql> flush privileges;  

7. Öka säkerheten med rollbaserad åtkomstkontroll

En mycket vanlig rekommendation för databassäkerhet är att sänka de behörigheter som ges till olika parter. MySQL är inte annorlunda. Vanligtvis när utvecklare arbetar använder de systemets maximala behörighet och tar mindre hänsyn till behörighetsprinciper än vi kan förvänta oss. Denna praxis kan utsätta databasen för betydande risker.
* Alla nya MySQL 5.x-installationer som redan är installerade med rätt säkerhetsåtgärder.
För att skydda din databas, se till att filkatalogen där MySQL-databasen faktiskt är lagrad ägs av användaren "mysql" och gruppen "mysql".

shell>ls -l /var/lib/mysql

Se dessutom till att endast användaren "mysql" och "root" har tillgång till katalogen /var/lib/mysql .
Mysql-binärfilerna, som finns under katalogen /usr/bin/, bör ägas av "root" eller den specifika systemanvändaren "mysql". Andra användare ska inte ha skrivbehörighet till dessa filer.

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

8. Håll koll på databasbehörigheter

Operativsystemsbehörigheter fixades i föregående avsnitt. Låt oss nu prata om databasbehörigheter. I de flesta fall finns det en administratörsanvändare (den omdöpta "roten") och en eller flera faktiska användare som samexisterar i databasen. Vanligtvis har "roten" ingenting att göra med data i databasen; istället används den för att underhålla servern och dess tabeller, för att ge och återkalla behörigheter, etc.
Å andra sidan används vissa användar-ID för att komma åt data, till exempel användar-ID som tilldelats webbservern för att utföra "select\update\insert\delete"-frågor och för att exekvera lagrade procedurer. I de flesta fall behövs inga andra användare; Det är dock bara du som systemadministratör som verkligen kan känna till din applikations behov.

Endast administratörskonton behöver ges SUPER/PROCESS/FILE-privilegier och tillgång till mysql-databasen. Vanligtvis är det en bra idé att sänka administratörens behörighet för åtkomst till data.

Granska privilegierna för resten av användarna och se till att dessa är korrekt inställda. Detta kan göras med hjälp av följande steg.

mysql> use mysql;  

[Identifiera användare]

mysql> select \* from users;  

[Lista anslag för alla användare]

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

Ovanstående uttalande måste köras för varje användare! Observera att endast användare som verkligen behöver root-privilegier ska beviljas dem.

Ett annat intressant privilegium är "VISA DATABASER". Som standard kan kommandot användas av alla som har tillgång till MySQL-prompten. De kan använda den för att samla information (t.ex. få databasnamn) innan de attackerar databasen genom att till exempel stjäla data. För att förhindra detta rekommenderar vi att du följer procedurerna som beskrivs nedan.

  • Lägg till " --skip-show-database" i startskriptet för MySQL eller lägg till det i MySQL-konfigurationsfilen
  • Ge privilegiet SHOW DATABASES endast till de användare som du vill använda det här kommandot

För att inaktivera användningen av kommandot "SHOW DATABASES" bör följande parameter läggas till i [mysqld]-delen av /etc/my.cnf :

[mysqld]

skip-show-database  

9. Aktivera loggning

Om din databasserver inte kör många frågor, rekommenderas det att du aktiverar transaktionsloggning genom att lägga till följande rad i avsnittet [mysqld] i /etc/my.cnf fil:

[mysqld]

log =/var/log/mylogfile  

Detta rekommenderas inte för tung produktion av MySQL-servrar eftersom det orsakar hög overhead på servern.
Dessutom, verifiera att endast "root" och "mysql" ID har åtkomst till dessa loggfiler (åtminstone skrivåtkomst).

Fellogg Se till att endast "root" och "mysql" har tillgång till loggfilen "hostname.err". Filen lagras i mysql-datakatalogen. Denna fil innehåller mycket känslig information som lösenord, adresser, tabellnamn, lagrade procedurnamn och koddelar. Den kan användas för informationsinsamling, och i vissa fall kan den förse angriparen med den information som behövs för att utnyttja databasen, maskinen på vilken databasen är installerad eller data inuti den.

MySQL-logg Se till att endast "root" och "mysql" har tillgång till loggfilen "logfile XY". Filen lagras i mysql-datakatalogen.

10. Ändra rotkatalogen

En chroot på UNIX {operativsystem} operativsystem är en operation som ändrar den uppenbara diskrotkatalogen för den aktuella metoden och dess underordnade. Ett program som har rotat om till en annan katalog kan inte komma åt eller namnge filer utanför den katalogen, och därför heter katalogen ett "chroot-fängelse" eller (mindre vanligt) ett "chroot-fängelse".

Genom att använda chroot-miljön kan skrivåtkomsten för mySQL-processerna (och underordnade processer) begränsas, vilket ökar serverns säkerhet.

Se till att det finns en dedikerad katalog för den chrootade miljön. Det här borde vara något i stil med:/chroot/mysql Dessutom bör följande parameter ändras i avsnittet [klient] i MySQL-konfigurationsfilen för att göra det bekvämt att använda databasens administrativa verktyg:

[klient]

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

Tack vare den kodraden kommer det inte att finnas något behov av att tillhandahålla kommandona mysql, mysqladmin, mysqldump etc. med --socket=/chroot/mysql/tmp/mysql.sock parameter varje gång dessa verktyg körs.

11. Ta bort gamla loggar regelbundet

Under installationsprocedurerna finns det massor av känslig data som hjälper ovälkomna användare att angripa en databas. Denna data hålls i serverns historik och kan vara oerhört användbar om en sak går fel under installationen. Genom att analysera historikfilerna kan administratörer ta reda på vad som har gått fel och förmodligen fixa saker och ting. Dessa filer behövs dock inte efter att installationen är klar.
Vi bör ta bort innehållet i MySQL-historikfilen (~/.mysql_history), varhelst alla döda SQL-kommandon förvaras (särskilt lösenord, som sparas som vanlig text):

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

Sammanfattningsvis bör vi betona databassäkerhet. Men det borde vara det första för alla individer eller företag.


  1. PL/SQL-blockproblem:Inga data hittades fel

  2. FEL:Ladda lokal data är inaktiverad - detta måste vara aktiverat på både klient- och serversidan

  3. Är det möjligt att använda användardefinierade aggregat (clr) med fönsterfunktioner (över)?

  4. Hur INTE RLIKE fungerar i MySQL