Gegevensbescherming is een van de belangrijkste aspecten van het beheer van een database. Afhankelijk van de organisatiestructuur, of u nu een ontwikkelaar, systeembeheerder of DBA bent, moet u, als u de productiedatabase beheert, de gegevens controleren op ongeautoriseerde toegang en gebruik. Het doel van beveiligingsmonitoring is tweeledig. Ten eerste om ongeautoriseerde activiteiten in de database te identificeren. En twee, om te controleren of databases 'en hun configuraties op bedrijfsbrede basis voldoen aan het beveiligingsbeleid en -standaarden.
In dit artikel zullen we monitoring voor beveiliging in twee categorieën verdelen. Een daarvan zal betrekking hebben op de auditing van MySQL- en MariaDB-databaseactiviteiten. De tweede categorie gaat over het controleren van uw instanties op mogelijke beveiligingslekken.
Bewaking op basis van query- en verbindingsbeleid
Continue auditing is een noodzakelijke taak voor het bewaken van uw databaseomgeving. Door uw database te controleren, kunt u verantwoordelijkheid nemen voor ondernomen acties of geopende inhoud. Bovendien kan de audit enkele kritieke systeemcomponenten bevatten, zoals degene die verband houden met financiële gegevens ter ondersteuning van een precieze reeks voorschriften zoals SOX of de EU AVG-verordening. Meestal wordt dit bereikt door informatie over DB-bewerkingen in de database in een extern logbestand te loggen.
Standaard is controle in MySQL of MariaDB uitgeschakeld. U en dit bereiken door extra plug-ins te installeren of door alle zoekopdrachten vast te leggen met de parameter query_log. Het algemene query-logbestand is een algemeen overzicht van wat MySQL uitvoert. De server legt wat informatie vast in dit logboek wanneer clients verbinding maken of verbreken, en het registreert elke SQL-instructie die van clients wordt ontvangen. Vanwege prestatieproblemen en gebrek aan configuratie-opties, is de general_log geen goede oplossing voor beveiligingsaudits.
Als u MySQL Enterprise gebruikt, kunt u de MySQL Enterprise Audit-plug-in gebruiken, die een uitbreiding is op de eigen MySQL-versie. De plug-in MySQL Enterprise Audit Plugin is alleen beschikbaar bij MySQL Enterprise, een commercieel aanbod van Oracle. Percona en MariaDB hebben hun eigen open source-versies van de audit-plug-in gemaakt. Ten slotte kan de McAfee-plug-in voor MySQL ook worden gebruikt met verschillende versies van MySQL. In dit artikel zullen we ons concentreren op de open source plug-ins, hoewel de Enterprise-versie van Oracle de meest robuuste en stabiele lijkt.
Kenmerken van MySQL Open Source Audit-plug-ins
Hoewel de open source audit-plug-ins hetzelfde werk doen als de Enterprise-plug-in van Oracle - ze produceren output met databasequery's en verbindingen - zijn er enkele grote architecturale verschillen.
MariaDB Audit Plugin – De MariaDB Audit Plugin werkt met MariaDB, MySQL (vanaf versie 5.5.34 en 10.0.7) en Percona Server. MariaDB is standaard begonnen met het opnemen van de Audit-plug-in vanaf versies 10.0.10 en 5.5.37, en het kan in elke versie vanaf MariaDB 5.5.20 worden geïnstalleerd. Het is de enige plug-in die Oracle MySQL, Percona Server en MariaDB ondersteunt. Het is beschikbaar op het Windows- en Linux-platform. Versies vanaf 1.2 zijn het meest stabiel en het kan riskant zijn om lagere versies te gebruiken in uw productieomgeving.
McAfee MySQL Audit Plugin – Deze plug-in gebruikt geen MySQL audit API. Het is onlangs bijgewerkt om MySQL 5.7 te ondersteunen. Sommige tests tonen aan dat op API gebaseerde plug-ins betere prestaties kunnen leveren, maar u moet dit controleren met uw omgeving.
Percona Audit Log Plugin – Percona biedt een open source auditing-oplossing die kan worden geïnstalleerd met Percona Server 5.5.37+ en 5.6.17+ als onderdeel van het installatieproces. In vergelijking met andere open source-plug-ins heeft deze plug-in meer bereikuitvoerfuncties omdat het XML, JSON en naar syslog uitvoert.
Omdat het enkele interne hooks naar de server heeft om feature-compatibel te zijn met de plug-in van Oracle, is het niet beschikbaar als een zelfstandige plug-in voor andere versies van MySQL.
Plugin-installatie op basis van MariaDB-auditextensie
De installatie van open source MySQL-plug-ins is vrij gelijkaardig voor MariaDB-, Percona- en McAfee-versies.
Percona en MariaDB voegen hun plug-ins toe als onderdeel van de standaard serverbinaire bestanden, dus het is niet nodig om plug-ins afzonderlijk te downloaden. De Percona-versie ondersteunt officieel alleen zijn eigen vork van MySQL, dus er is geen directe download van de website van de leverancier (als u deze plug-in met MySQL wilt gebruiken, moet u de plug-in verkrijgen van een Percona-serverpakket). Als u de MariaDB-plug-in met andere forks van MySQL wilt gebruiken, kunt u deze vinden op https://downloads.mariadb.com/Audit-Plugin/MariaDB-Audit-Plugin/. De McAfee-plug-in is beschikbaar op https://github.com/mcafee/mysql-audit/wiki/Installation.
Voordat u de installatie van de plug-in start, kunt u controleren of de plug-in in het systeem aanwezig is. De locatie van de dynamische plug-in (vereist geen herstart van de instantie) kan worden gecontroleerd met:
SHOW GLOBAL VARIABLES LIKE 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| plugin_dir | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
Controleer de map die wordt geretourneerd op bestandssysteemniveau om er zeker van te zijn dat u een kopie van de plug-inbibliotheek hebt. Als u geen server_audit.so of server_audit.dll in /usr/lib64/mysql/plugin/ heeft, dan is het waarschijnlijker dat uw MariaDB-versie niet wordt ondersteund en deze moet upgraden naar de nieuwste versie..
De syntaxis om de MariaDB-plug-in te installeren is:
INSTALL SONAME 'server_audit';
Om geïnstalleerde plug-ins te controleren, moet u het volgende uitvoeren:
SHOW PLUGINS;
MariaDB [(none)]> show plugins;
+-------------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+-------------------------------+----------+--------------------+--------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| wsrep | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CLIENT_STATISTICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INDEX_STATISTICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| TABLE_STATISTICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| USER_STATISTICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
...
| INNODB_MUTEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_SEMAPHORE_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLESPACES_ENCRYPTION | ACTIVE | INFORMATION SCHEMA | NULL | BSD |
| INNODB_TABLESPACES_SCRUBBING | ACTIVE | INFORMATION SCHEMA | NULL | BSD |
| Aria | ACTIVE | STORAGE ENGINE | NULL | GPL |
| SEQUENCE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| user_variables | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
| SERVER_AUDIT | ACTIVE | AUDIT | server_audit.so | GPL |
+-------------------------------+----------+--------------------+--------------------+---------+
Als je aanvullende informatie nodig hebt, kijk dan in de PLUGINS-tabel in de information_schema-database die meer gedetailleerde informatie bevat.
Een andere manier om de plug-in te installeren, is door de plug-in in my.cnf in te schakelen en de instantie opnieuw te starten. Een voorbeeld van een basisconfiguratie van een audit-plug-in van MariaDB zou kunnen zijn:
server_audit_events=CONNECT
server_audit_file_path=/var/log/mysql/audit.log
server_audit_file_rotate_size=1073741824
server_audit_file_rotations=8
server_audit_logging=ON
server_audit_incl_users=
server_audit_excl_users=
server_audit_output_type=FILE
server_audit_query_log_limit=1024
Bovenstaande instelling moet in my.cnf worden geplaatst. Audit-plug-in zal bestand /var/log/mysql/audit.log maken dat zal roteren met een grootte van 1 GB en er zullen acht rotaties zijn totdat het bestand wordt overschreven. Het bestand bevat alleen informatie over verbindingen.
Momenteel zijn er zestien instellingen die u kunt gebruiken om de MariaDB-auditplug-in aan te passen.
server_audit_events
server_audit_excl_users
server_audit_file_path
server_audit_file_rotate_now
server_audit_file_rotate_size
server_audit_file_rotations
server_audit_incl_users
server_audit_loc_info
server_audit_logging
server_audit_mode
server_audit_output_type
Server_audit_query_log_limit
server_audit_syslog_facility
server_audit_syslog_ident
server_audit_syslog_info
server_audit_syslog_priority
Onder hen vindt u opties om gebruikers op te nemen of uit te sluiten, verschillende loggebeurtenissen in te stellen (CONNECT of QUERY) en te schakelen tussen bestand en syslog.
Om ervoor te zorgen dat de plug-in wordt ingeschakeld bij het opstarten van de server, moet u
plugin_load=server_audit=server_audit.so instellen in uw my.cnf-instellingen. Een dergelijke configuratie kan bovendien worden beschermd door server_audit=FORCE_PLUS_PERMANENT, waardoor de verwijderingsoptie voor plug-ins wordt uitgeschakeld.
UNINSTALL PLUGIN server_audit;
ERROR 1702 (HY000):
Plugin 'server_audit' is force_plus_permanent and can not be unloaded
Hier zijn enkele voorbeelditems geproduceerd door MariaDB-auditplug-in:
20180817 20:00:01,slave,cmon,cmon,31,0,DISCONNECT,information_schema,,0
20180817 20:47:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0
20180817 20:47:02,slave,cmon,cmon,19,0,DISCONNECT,information_schema,,0
20180817 20:47:02,slave,cmon,cmon,18,0,DISCONNECT,information_schema,,0
20180819 17:19:19,slave,cmon,cmon,12,0,CONNECT,information_schema,,0
20180819 17:19:19,slave,root,localhost,13,0,FAILED_CONNECT,,,1045
20180819 17:19:19,slave,root,localhost,13,0,DISCONNECT,,,0
20180819 17:19:20,slave,cmon,cmon,14,0,CONNECT,mysql,,0
20180819 17:19:20,slave,cmon,cmon,14,0,DISCONNECT,mysql,,0
20180819 17:19:21,slave,cmon,cmon,15,0,CONNECT,information_schema,,0
20180819 17:19:21,slave,cmon,cmon,16,0,CONNECT,information_schema,,0
20180819 19:00:01,slave,cmon,cmon,17,0,CONNECT,information_schema,,0
20180819 19:00:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0
Rapport Schemawijzigingen
Als u alleen DDL-wijzigingen wilt bijhouden, kunt u het ClusterControl Operational Report on Schema Change gebruiken. Het Schema Change Detection Report toont alle DDL-wijzigingen in uw database. Deze functionaliteit vereist een extra parameter in het configuratiebestand van ClusterControl. Als dit niet is ingesteld, ziet u de volgende informatie:schema_change_detection_address is niet ingesteld in /etc/cmon.d/cmon_1.cnf. Als dat eenmaal op zijn plaats is, kan een voorbeelduitvoer zijn zoals hieronder:
Het kan worden ingesteld met een schema en de rapporten kunnen naar de ontvangers worden gemaild.
ClusterControl:operationeel rapport plannenMySQL Database Security Assessment
Pakketupgradecontrole
Eerst beginnen we met veiligheidscontroles. Up-to-date zijn met MySQL-patches helpt de risico's te verminderen die gepaard gaan met bekende kwetsbaarheden in de MySQL-server. U kunt uw omgeving up-to-date houden door de pakketrepository van de leverancier te gebruiken. Op basis van deze informatie kunt u uw eigen rapporten maken of tools zoals ClusterControl gebruiken om uw omgeving te verifiëren en u te waarschuwen voor mogelijke updates.
ClusterControl Upgrade Report verzamelt informatie van het besturingssysteem en vergelijkt deze met pakketten die beschikbaar zijn in de repository. Het rapport is verdeeld in vier secties; upgradeoverzicht, databasepakketten, beveiligingspakketten en andere pakketten. U kunt snel vergelijken wat u op uw systeem hebt geïnstalleerd en een aanbevolen upgrade of patch vinden.
ClusterControl:upgraderapport ClusterControl:details van het upgraderapportOm ze handmatig te vergelijken, kunt u
SHOW VARIABLES WHERE variable_name LIKE "version";
Met beveiligingsbulletins zoals:
https://www.oracle.com/technetwork/topics/security/alerts-086861.html
https://nvd.nist.gov/view/vuln/search- resultaten?adv_search=true&cves=on&cpe_vendor=cpe%3a%2f%3aoracle&cpe_produ
https://www.percona.com/doc/percona-server/LATEST/release-notes/release-notes_index.html
https://downloads.mariadb.org/mariadb/+releases/
https://www.cvedetails.com/vulnerability-list/vendor_id-12010/Mariadb.html
https://www. cvedetails.com/vulnerability-list/vendor_id-13000/Percona.html
Of opslagplaatsen van leveranciers:
Op Debian
sudo apt list mysql-server
Op RHEL/Centos
yum list | grep -i mariadb-server
Accounts zonder wachtwoord
Met lege wachtwoorden kan een gebruiker inloggen zonder een wachtwoord te gebruiken. MySQL kwam met een reeks vooraf gemaakte gebruikers, waarvan sommige zonder wachtwoord verbinding kunnen maken met de database of, erger nog, anonieme gebruikers. Gelukkig is dit veranderd in MySQL 5.7. Ten slotte wordt het alleen geleverd met een root-account dat het wachtwoord gebruikt dat je tijdens de installatie hebt gekozen.
Stel voor elke rij die wordt geretourneerd uit de auditprocedure een wachtwoord in:
SELECT User,host
FROM mysql.user
WHERE authentication_string='';
Bovendien kunt u een plug-in voor wachtwoordvalidatie installeren en een veiliger beleid implementeren:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
SHOW VARIABLES LIKE 'default_password_lifetime';
SHOW VARIABLES LIKE 'validate_password%';
Een goed begin kan zijn:
plugin-load=validate_password.so
validate-password=FORCE_PLUS_PERMANENT
validate_password_length=14
validate_password_mixed_case_count=1
validate_password_number_count=1
validate_password_special_char_count=1
validate_password_policy=MEDIUM
Deze instellingen zijn natuurlijk afhankelijk van uw zakelijke behoeften.
Bewaking op afstand
Door het gebruik van jokertekens binnen hostnamen te vermijden, kunt u de specifieke locaties beheren van waaruit een bepaalde gebruiker verbinding kan maken met en interactie kan hebben met de database.
U moet ervoor zorgen dat elke gebruiker alleen vanaf specifieke hosts verbinding kan maken met MySQL. U kunt altijd meerdere vermeldingen voor dezelfde gebruiker definiëren, dit zou moeten helpen om de noodzaak voor jokertekens te verminderen.
Voer de volgende SQL-instructie uit om deze aanbeveling te beoordelen (zorg ervoor dat er geen rijen worden geretourneerd):
SELECT user, host FROM mysql.user WHERE host = '%';
Testdatabase
De standaard MySQL-installatie wordt geleverd met een ongebruikte database genaamd test en de testdatabase is beschikbaar voor elke gebruiker, vooral voor de anonieme gebruikers. Dergelijke gebruikers kunnen tabellen maken en ernaar schrijven. Dit kan op zichzelf een probleem worden - en schrijven zou wat overhead toevoegen en de databaseprestaties verminderen. Het wordt aanbevolen om de testdatabase te verwijderen. Om te bepalen of de testdatabase aanwezig is, voert u het volgende uit:
SHOW DATABASES LIKE 'test';
Als u merkt dat de testdatabase aanwezig is, kan dit zijn dat het mysql_secure_installation-script dat de testdatabase verwijdert (evenals andere beveiligingsgerelateerde activiteiten) niet is uitgevoerd.
LAAD DATA INFILE
Als zowel de server als de client de mogelijkheid hebben om LOAD DATA LOCAL INFILE uit te voeren, kan een client gegevens van een lokaal bestand naar een externe MySQL-server laden. De parameter local_infile bepaalt of bestanden op de computer van de MySQL-client kunnen worden geladen of geselecteerd via LOAD DATA INFILE of SELECT local_file.
Dit kan mogelijk helpen bij het lezen van bestanden waartoe de client toegang heeft - op een toepassingsserver zou men bijvoorbeeld toegang kunnen krijgen tot alle gegevens waartoe de HTTP-server toegang heeft. Om dit te voorkomen, moet u local-infile=0 instellen in my.cnf.
Voer de volgende SQL-instructie uit en zorg ervoor dat het veld Waarde is ingesteld op UIT:
SHOW VARIABLES WHERE Variable_name = 'local_infile';
Bewaking voor niet-versleutelde tabelruimten
Vanaf MySQL 5.7.11 ondersteunt InnoDB gegevensversleuteling voor tabellen die zijn opgeslagen in tabelruimten per tabel. Deze functie biedt versleuteling in rust voor fysieke tabelruimtegegevensbestanden. Om te onderzoeken of uw tabellen versleuteld zijn, voert u het volgende uit:
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test | t1 | ENCRYPTION="Y" |
+--------------+------------+----------------+
Als onderdeel van de codering moet u ook rekening houden met codering van het binaire logboek. De MySQL-server schrijft veel informatie naar binaire logbestanden.
Versleuteling verbindingsvalidatie
In sommige opstellingen zou de database niet toegankelijk moeten zijn via het netwerk als elke verbinding lokaal wordt beheerd, via de Unix-socket. In dergelijke gevallen kunt u de variabele 'skip-networking' toevoegen in my.cnf. Skip-netwerken voorkomt dat MySQL een TCP/IP-verbinding gebruikt, en alleen Unix-socket zou mogelijk zijn op Linux.
Dit is echter een vrij zeldzame situatie omdat het gebruikelijk is om toegang te krijgen tot MySQL via het netwerk. U moet dan controleren of uw verbindingen versleuteld zijn. MySQL ondersteunt SSL als middel om verkeer te coderen, zowel tussen MySQL-servers (replicatie) als tussen MySQL-servers en clients. Als u Galera-cluster gebruikt, zijn vergelijkbare functies beschikbaar - zowel communicatie binnen het cluster als verbindingen met clients kunnen worden versleuteld met SSL. Voer de volgende zoekopdrachten uit om te controleren of u SSL-codering gebruikt:
SHOW variables WHERE variable_name = 'have_ssl';
select ssl_verify_server_cert from mysql.slave_master_info;
Dat is het voor nu. Dit is geen volledige lijst, laat het ons weten als er andere controles zijn die u vandaag uitvoert op uw productiedatabases.