Vooral beginnende penetratietesters leggen minder nadruk op databasebeveiliging in het algemeen. Een toepassing zonder databaseconfiguratie en beveiligingstests kan niet veilig zijn. Misschien gebruikt u al MySQL-software, een databasebeheersysteem, dus hoe kunt u het veiliger maken? Hier zijn zeven stappen die u moet volgen.
1. Gebruik SSH-tunneling in plaats van verbinding op afstand
De MySQL-service draait standaard op poort 3306. Als je MySQL installeert, zie je dat poort 3306 voor alle verbindingen in luistermodus staat. Zoals het er nu uitziet, staat de MySQL-poort open voor de buitenwereld. Daarom moet u de MySQL-service instellen om alleen naar het lokale adres te luisteren.
Aangezien servers meestal draaien op een Linux-distributie, zijn de onderstaande voorbeelden gebaseerd op een Debian-distributie. Het bestand dat u moet gebruiken voor SSH-tunneling in plaats van externe verbinding en om de standaardpoort voor de buitenwereld af te sluiten is
/etc/mysql/my.cnf. In dit bestand moet u een veld met de naam openen [mysqld] en schrijf het volgende commando:[mysqld]
binden-adres=127.0.0.1
Vergeet na dit proces niet om dit bestand op te slaan en de service opnieuw te starten met de volgende opdracht:
sudo systemctl herstart mysqld
# of
sudosysteemctlherstartenmariadb.dienst
Hiermee luistert de MySQL-service alleen naar het lokale adres.
Als u MariaDB gebruikt, kunt u ook onderzoeken /etc/mysql/mariadb.conf.d/50-server.cnf en controleer of er een definitie voor is bind-adres.
Nu je het bind-adres hebt ingesteld op 127.0.0.1, dat is localhost, kunt u een Nmap-scan uitvoeren en de uitvoer controleren:
U kunt de MySQL-poort zien omdat 127.0.0.1 de localhost vertegenwoordigt die u ziet. U kunt proberen het bindadres opnieuw te wijzigen om er zeker van te zijn dat dit werkt:
[mysqld]
binden-adres=127.5.5.1
Bewaar dan de /etc/mysql/my.cnf bestand en herstart de MySQL-service. Als u een Nmap-scan uitvoert nogmaals, in dit stadium zou u dit bindadres niet op localhost moeten zien.
Zodra u weet dat dit werkt, gaat u terug naar de instellingen van de eerste stap en stelt u het bindadres terug in op 127.0.0.1 en slaat u het opnieuw op.
2. Stel een lokale toegangsbarrière voor bestanden in
MySQL kan communiceren met het lokale bestandssysteem. Met query's kunt u de inhoud van een tekst in het lokale bestandssysteem bekijken of het queryresultaat naar een schijf branden. Om te voorkomen dat kwaadwillende aanvallers deze functie gebruiken, moet u voorkomen dat MySQL communiceert met het lokale bestandssysteem.
U kunt een functie genaamd local-infile gebruiken om voorzorgsmaatregelen te nemen. Stel je bijvoorbeeld voor dat je een bestand hebt met de naam "/etc/secretfile.txt" en je hebt een wachtwoord in dit bestand. Als de waarde van de local-infile functie in uw /etc/mysql/my.cnf bestand 1 is, dan is de toegang open. U hebt dus toegang tot het bestand secretfile.txt.
De waarde van de functie local-infile is 1. Start de MySQL-database opnieuw op om de wijzigingen door te voeren. Maak nu verbinding met MySQL met de volgende opdracht en controleer of u het bestand secretfile.txt kunt zien:
SELECTEERLAAD BESTAND("/etc/geheimbestand.txt");
Het is niet moeilijk om de informatie in een willekeurig bestand op uw computer vast te leggen.
Om dit probleem op te lossen, wijzigt u de waarde local-infile in uw bestand /etc/mysql/my.cnf als volgt:
[mysqld]
lokaal-inbestand=0
Start de MySQL-service opnieuw. Maak opnieuw verbinding met MySQL en herhaal de vorige stap; u zou de inhoud van het bestand niet meer moeten kunnen zien.
Als gebruikers nog geen lees- en schrijfmachtigingen hebben voor lokale bestanden, kunnen ze dit bestand niet zien. Het is echter nog steeds iets dat u moet controleren in penetratietesten en databasebeveiliging.
3. Stel toepassingsgebruikers en wachtwoorden in
De databasebeheergebruiker en de MySQL-gebruiker die toegang tot de database heeft, moeten van elkaar verschillen. Met andere woorden, het verbinden van applicaties met MySQL met rootgebruikers is buitengewoon gevaarlijk. Definieer indien mogelijk de gebruikers van toepassingen die niet werken UPDATE- of INSERT-bewerkingen afzonderlijk.
Een ander ding om op dit punt te overwegen, zijn gebruikerswachtwoorden. Zoals op bijna elk gebied, moeten wachtwoorden voor MySQL-gebruikers complex en onvoorspelbaar zijn. Als je hierbij hulp nodig hebt, zijn er geweldige wachtwoordgeneratorsystemen die je kunt gebruiken.
4. Anonieme gebruikers verwijderen
Wanneer u MySQL standaard installeert, treden enkele anonieme gebruikers op. U moet deze verwijderen en hun toegang blokkeren. Voor een veilige MySQL-server zou u geen reactie moeten krijgen als resultaat van de volgende vraag:
SELECTEER * VAN mysql.gebruiker WAARGEBRUIKER="";
# Voorbeelduitvoer
Leeg set (0,001 seconden)
Als er resultaten zijn, moet u deze anonieme gebruikers verwijderen. Als er bijvoorbeeld een anoniem account met de naam "anonuser" in een omgeving met de naam "localhost" zou zijn, zou u een opdracht als de volgende moeten gebruiken om dit account te verwijderen:
VERLAAT GEBRUIKER 'anonieme gebruiker'@'localhost';
5. Controleer de machtigingen voor lokale MySQL-bestanden
Stel je voor dat je een databasebeheerder bent en je wilt terug naar de gegevens van een week geleden. In dit geval moet u mogelijk via SSH verbinding maken met de databaseserver en de gewenste MySQL-bestanden wijzigen. Terwijl je dit deed, heb je misschien de root-gebruikersrechten van Linux gebruikt; dat wil zeggen dat het eigendom en de machtigingen van de gegevensbestanden kunnen veranderen. Dat wil je niet.
Kijk naar de map /var/lib/mysql om de verleende machtigingen te controleren. Wat u hier moet controleren, is of de eigenaar van alle bestanden de MySQL-gebruiker is. De volgende opdracht zal het lukken:
sudo ls -al /var/lib/mysql
De lees- en schrijfrechten van de bestanden zouden alleen voor de MySQL-gebruiker moeten zijn. Andere gebruikers mogen geen machtigingen hebben.
6. Gebruik MySQL-SSL
Nadenken over een concreet voorbeeld is de beste manier om het gebruik van MySQL en SSL te begrijpen. Stel je voor dat een van de servers in de ABC-regio, waar veel verschillende servers staan, wordt overgenomen door kwaadwillende hackers. Hackers gaan een interne scan uitvoeren in de ABC-regio. Op deze manier verzamelen ze informatie over de servers.
Als ze tijdens dit proces een MySQL-server detecteren, kunnen ze een Man-in-the-Middle (MitM)-aanval op de doelserver, wat betekent dat ze de sessie-informatie kunnen stelen van applicaties en gebruikers die verbinding maken met deze server. Een van de beste manieren om dit te voorkomen is om schakel SSL in op de MySQL-server.
7. Log- en geschiedenisbestanden
U gebruikt MySQL-logboeken om fouten te analyseren en op te sporen. U kunt bewerken waar deze logboeken worden bewaard door my.cnf als volgt in te voeren:
# /etc/mysql/my.cnf
[mysqld]
loggen =/var/loggen/mylogfiles
U kunt de naam of locatie van de mylogfiles naar wens wijzigen. Er is nog een bestand dat u moet controleren. Wanneer u verbinding maakt met de MySQL-server in een Linux-terminal en verschillende opdrachten typt, worden deze query's opgeslagen in het bestand mysql_history. Als u de volgende opdracht uitvoert, kunt u de query's zien die u gebruikt in de MySQL-terminal:
kat ~/.mysql_geschiedenis
U moet de inhoud van dit bestand verwijderen als u geen informatie wilt geven over het soort zoekopdrachten dat u op de server uitvoert. Gebruik de volgende opdracht om de inhoud van het bestand te verwijderen:
sudo-echo "schoongemaakt"> ~/.mysql_geschiedenis
U kunt de inhoud van het bestand dan opnieuw controleren.
Degene die eigenaar is van de database, is eigenaar van het systeem
In welke branche u ook werkt, uw database bevat altijd belangrijke informatie. Dit kunnen uw klanten, bankrekeningen en wachtwoorden zijn. Kwaadwillende aanvallers kennen het belang en de waarde hiervan. Database-ontwikkelaars en -beheerders moeten op zijn minst de basis kennen die ze tegenkomen bij penetratietesten om de hackers te verslaan.