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

Il tuo database è protetto? Pensa di nuovo

1. Proteggi il tuo server

Molti attacchi noti sono possibili solo una volta che si accede fisicamente a una macchina. Per questo motivo, è meglio avere il server delle applicazioni e il server del database su macchine diverse. Se ciò non è possibile, è necessario prestare maggiore attenzione, altrimenti, eseguendo comandi remoti tramite un server delle applicazioni, un utente malintenzionato potrebbe essere in grado di danneggiare il database anche senza autorizzazioni. Per questo motivo, a qualsiasi servizio in esecuzione sulla stessa macchina del database dovrebbe essere concessa l'autorizzazione più bassa possibile che consenta comunque al servizio di funzionare.


Non dimenticare di installare l'intero pacchetto di sicurezza:Antivirus e Anti-spam, Firewall e tutti i pacchetti di sicurezza consigliati dal fornitore del tuo sistema operativo. Inoltre, non dimenticare di dedicare 10 minuti alla posizione fisica del tuo server:nella posizione sbagliata, il tuo server può essere rubato, allagato, danneggiato da animali selvatici o vagabondi.

2. Localhost Security o Disabilita o limita l'accesso remoto

Considera se MySQL verrà recuperato dal sistema o accederà direttamente dal proprio server. Nella remota possibilità che venga utilizzato l'accesso remoto, assicurarsi che gli host appena caratterizzati possano accedere al server. Ciò viene comunemente eseguito tramite wrapper TCP, tabelle IP o altri strumenti di programmazione firewall o accessibilità hardware.
Per impedire a MySQL di aprire un socket di rete, il parametro di accompagnamento dovrebbe essere incluso nell'area [mysqld] di my.cnf o my.ini:

salta la rete

Il documento si trova in "C:\Programmi\MySQL\MySQL Server 5.1" catalogo sul sistema operativo Windows o "/etc/my.cnf" o "/etc/mysql/my.cnf" su Linux.
Questa linea paralizza l'inizio dell'amministrazione dei sistemi nel bel mezzo dell'avvio di MySQL. Sarebbe l'ideale se tieni presente che è possibile utilizzare una connessione locale per configurare una connessione al server MySQL.

Un'altra possibile soluzione è forzare MySQL ad ascoltare solo localhost aggiungendo la seguente riga in [mysqld] sezione di mio.cnf indirizzo-bind=127.0.0.1
Potresti non essere disposto a rendere inabile l'accesso al sistema al tuo server di database se i client della tua organizzazione si interfacciano con il server dalle loro macchine o con il server web introdotto su una macchina alternativa. In tal caso, dovrebbe essere considerata la seguente sintassi di concessione restrittiva:

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

3. Disabilita l'uso di LOCAL INFILE

La prossima modifica consiste nel disabilitare l'uso di "LOAD DATA LOCAL INFILE" comando, che aiuterà a mantenere la lettura non approvata dai registri del quartiere. Ciò è particolarmente importante quando vengono rilevate nuove vulnerabilità di SQL injection nelle applicazioni PHP.
Inoltre, in alcuni casi, il "FILE LOCALE" il comando può essere utilizzato per accedere ad altri file sul sistema operativo, ad esempio "/etc/passwd" , utilizzando il seguente comando:

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

O anche significativamente meno difficile:

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

Per disabilitare l'utilizzo di "LOCAL INFILE" comando, è necessario aggiungere il seguente parametro in [mysqld] sezione del file di configurazione MySQL.

set-variable=local-infile=0

4. Cambia nome utente e password di root, mantienili forti.

Il nome utente dell'amministratore predefinito sul server MySQL è "root" . Gli hacker spesso tentano di ottenere l'accesso alle sue autorizzazioni. Per rendere più difficile questo compito, rinomina "root" a qualcos'altro e forniscigli una password alfanumerica lunga e complessa.

Per rinominare il nome utente dell'amministratore, utilizzare il comando rename nella console MySQL:

mysql> RENAME USER root TO new\_user;

MySQL "RINOMINA UTENTE" il comando è apparso per la prima volta in MySQL versione 5.0.2. Se utilizzi una versione precedente di MySQL, puoi utilizzare altri comandi per rinominare un utente:

mysql> use mysql;

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

mysql> flush privileges;

Per modificare la password di un utente, utilizza il seguente comando da riga di comando:

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

È anche possibile modificare la password utilizzando "mysqladmin" utilità:

shell> mysqladmin -u username -p password newpass

5. Rimuovere il database "Test"

MySQL viene fornito con un database "test" inteso come spazio di test. Vi può accedere l'utente anonimo, ed è quindi utilizzato da numerosi attacchi.
Per rimuovere questo database, utilizzare il comando drop come segue:

mysql> drop database test;  

Oppure usa "mysqladmin" comando:

shell> mysqladmin -u username -p drop test  

6. Rimuovi gli account anonimi e obsoleti

Il database MySQL viene fornito con alcuni utenti anonimi con password vuote. Di conseguenza, chiunque può connettersi al database per verificare se questo è il caso, procedere come segue:

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

In un sistema sicuro, nessuna linea dovrebbe essere ripetuta. Un altro modo per fare lo stesso:

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

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

Se le sovvenzioni esistono, chiunque può accedere al database e almeno utilizzare il database predefinito"test" . Verifica con:

shell> mysql -u blablabla

Per rimuovere l'account, esegui il seguente comando:

mysql> DROP USER "";

MySQL "DROP USER" il comando è supportato a partire da MySQL versione 5.0. Se utilizzi una versione precedente di MySQL, puoi rimuovere l'account come segue:

mysql> use mysql;

mysql> DELETE FROM user WHERE user="";

mysql> flush privileges;  

7. Aumenta la sicurezza con il controllo degli accessi basato sui ruoli

Una raccomandazione molto comune per la sicurezza del database è quella di ridurre le autorizzazioni concesse a varie parti. MySQL non è diverso. In genere, quando gli sviluppatori lavorano, utilizzano la massima autorizzazione del sistema e prendono meno in considerazione i principi di autorizzazione di quanto ci si potrebbe aspettare. Questa pratica può esporre il database a rischi significativi.
* Qualsiasi nuova installazione di MySQL 5.x già installata utilizzando le corrette misure di sicurezza.
Per proteggere il tuo database, assicurati che la directory dei file in cui è effettivamente memorizzato il database MySQL sia di proprietà dell'utente "mysql" e del gruppo "mysql".

shell>ls -l /var/lib/mysql

Inoltre, assicurati che solo gli utenti "mysql" e "root" abbiano accesso alla directory /var/lib/mysql .
I binari mysql, che risiedono nella directory /usr/bin/, dovrebbero essere di proprietà di "root" o dell'utente specifico di sistema "mysql". Gli altri utenti non dovrebbero avere accesso in scrittura a questi file.

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

8. Tieni sotto controllo i privilegi del database

Le autorizzazioni del sistema operativo sono state corrette nella sezione precedente. Ora parliamo delle autorizzazioni del database. Nella maggior parte dei casi, c'è un utente amministratore (il rinominato "root") e uno o più utenti effettivi che coesistono nel database. Di solito, la "radice" non ha nulla a che fare con i dati nel database; invece, viene utilizzato per mantenere il server e le sue tabelle, per concedere e revocare permessi, ecc.
D'altra parte, alcuni ID utente vengono utilizzati per accedere ai dati, come l'ID utente assegnato al server Web per eseguire query "select\update\insert\delete" e per eseguire stored procedure. Nella maggior parte dei casi non sono necessari altri utenti; tuttavia, solo tu, come amministratore di sistema, puoi davvero conoscere le esigenze della tua applicazione.

Solo agli account amministratore devono essere concessi i privilegi SUPER / PROCESS /FILE e l'accesso al database mysql. Di solito, è una buona idea ridurre le autorizzazioni dell'amministratore per l'accesso ai dati.

Rivedere i privilegi del resto degli utenti e assicurarsi che siano impostati in modo appropriato. Questo può essere fatto usando i seguenti passaggi.

mysql> use mysql;  

[Identifica utenti]

mysql> select \* from users;  

[Elenca le concessioni di tutti gli utenti]

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

L'istruzione di cui sopra deve essere eseguita per ogni utente! Tieni presente che solo agli utenti che necessitano davvero dei privilegi di root dovrebbero essere concessi loro.

Un altro privilegio interessante è "MOSTRA BANCHE DATI". Per impostazione predefinita, il comando può essere utilizzato da chiunque abbia accesso al prompt di MySQL. Possono usarlo per raccogliere informazioni (ad esempio, ottenere i nomi dei database) prima di attaccare il database, ad esempio, rubando i dati. Per evitare ciò, si consiglia di seguire le procedure descritte di seguito.

  • Aggiungi " --skip-show-database" allo script di avvio di MySQL o aggiungilo al file di configurazione di MySQL
  • Concedi il privilegio SHOW DATABASES solo agli utenti a cui desideri utilizzare questo comando

Per disabilitare l'utilizzo del comando "SHOW DATABASES", è necessario aggiungere il seguente parametro nella sezione [mysqld] del /etc/my.cnf :

[mysqld]

skip-show-database  

9. Abilita registrazione

Se il server del database non esegue molte query, si consiglia di abilitare la registrazione delle transazioni, aggiungendo la seguente riga alla sezione [mysqld] di /etc/my.cnf file:

[mysqld]

log =/var/log/mylogfile  

Questo non è raccomandato per i server MySQL di produzione pesante perché provoca un sovraccarico elevato sul server.
Inoltre, verifica che solo gli ID "root" e "mysql" abbiano accesso a questi file di log (almeno l'accesso in scrittura).

Registro errori Assicurati che solo "root" e "mysql" abbiano accesso al file di registro "hostname.err". Il file è archiviato nella directory dei dati mysql. Questo file contiene informazioni molto riservate come password, indirizzi, nomi di tabelle, nomi di stored procedure e parti di codice. Può essere utilizzato per la raccolta di informazioni e, in alcuni casi, può fornire all'attaccante le informazioni necessarie per sfruttare il database, la macchina su cui è installato il database o i dati al suo interno.

Registro MySQL Assicurati che solo "root" e "mysql" abbiano accesso al file di registro "logfile XY". Il file è archiviato nella directory dei dati di mysql.

10. Cambia la directory principale

Un chroot su sistemi operativi UNIX {sistema operativo} è un'operazione che cambia la directory radice del disco apparente per il metodo in esecuzione attuale e i suoi figli. Un programma che è stato re-rootato in una directory diversa non può accedere o nominare file al di fuori di quella directory, e quindi la directory è denominata "prigione chroot" o (meno comunemente) "prigione chroot".

Utilizzando l'ambiente chroot, l'accesso in scrittura ai processi MySQL (e ai processi figlio) può essere limitato, aumentando la sicurezza del server.

Assicurarsi che esista una directory dedicata per l'ambiente con chroot. Dovrebbe essere qualcosa del tipo:/chroot/mysql Inoltre, per rendere conveniente l'uso degli strumenti di amministrazione del database, è necessario modificare il seguente parametro nella sezione [client] del file di configurazione di MySQL:

[cliente]

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

Grazie a quella riga di codice, non sarà necessario fornire i comandi mysql, mysqladmin, mysqldump ecc. con il --socket=/chroot/mysql/tmp/mysql.sock parametro ogni volta che questi strumenti vengono eseguiti.

11. Elimina regolarmente i vecchi log

Durante le procedure di installazione, ci sono molti dati sensibili che aiuteranno gli utenti indesiderati ad aggredire un database. Questi dati vengono conservati nella cronologia del server e potrebbero essere terribilmente utili se qualcosa va storto durante l'installazione. Analizzando i file della cronologia, gli amministratori possono capire cosa è andato storto e probabilmente aggiustare le cose. Tuttavia, questi file non sono necessari al termine dell'installazione.
Dovremmo rimuovere il contenuto del file di cronologia MySQL (~/.mysql_history), ovunque siano conservati tutti i comandi SQL morti (in particolare le password, che sono mantenute come testo normale):

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

In conclusione, dovremmo enfatizzare la sicurezza del database. Tuttavia dovrebbe essere la prima cosa per qualsiasi individuo o azienda.