Appunti LAMP

Da Linux User Group Scandiano.
Information icon.png
Cosa sono gli Appunti LAMP?

In questa pagina sono raccolti appunti rapidi per migliorare e rendere più sicura la gestione di un webserver bastato su GNU/Linux, Apache, MySql e PHP (LAMP appunto).

Apache

Limitare l'accesso su base IP

E' possibile limitare l'accesso a determinate cartelle su base IP utilizzando le seguenti direttive:

Order deny,allow
Deny from all
Allow from 192.198.1

Queste direttive possono essere inserite nel file di configurazione di apache all'interno di un tag <Directory "/var/www/la_mia_cartella"></Directory> o in un file .htaccess collocato all'interno della cartella che si desidera proteggere.

Limitare l'accesso attraverso le espressioni regolari

E' anche possibile limitare l'accesso usando le espressioni regolari: solitamente Apache permette l'accesso a tutto quello che è all'interno della nostra document root. Ad esempio se nella configurazione del nostro VHOST abbiamo dato come DocumentRoot la cartella portali tutto quello che c'è all'interno sarà accessibile e per impedire questo bisognerebbe limitare l'accesso alle singole cartelle ad una ad una, considerando poi che tutte le directory che vengono create successivamente dovrebbero essere aggiunte. Per ovviare a questo si può usare una configurazione come in questo esempio:

RewriteEngine on
RewriteRule ^/$ /2014 [R,L]

<Location ~ "^/(?!20[0-9]{2}|economia|secure|Shibboleth.sso)">
        order deny,allow
        deny from all
</Location>

Con l'opzione RewriteEngine e RewriteRule rendiamo accessibili solo le cartelle che iniziano con "20" seguito da due cifre (quindi da 2000 a 2099), alla cartella "economia" e al file Shibboleth.sso escludendo tutto il resto.

PHP

Disabilitare la visualizzazione degli errori di PHP

Disabilitare la visualizzazione degli errori di PHP serve a non fornire informazioni che potrebbero essere utili a chi ha brutte intenzioni nei confronti del tuo server. Per farlo devi modificare il file php.ini che su Debian e salvato in /etc/php5/apache2/php.ini e modificare la seguente riga:

display_errors = Off

Affinché la modifica abbia effetto è necessario riavviare il demone di apache.

Disabilitare le funzioni potenzialmente pericolose di PHP

Un modo per rendere più sicuro il vostro server è disabilitare le funzioni potenzialmente pericolose di PHP (ovviamente se non le usate). In estrema sintesi sono le funzioni che interagiscono con il sistema o che potrebbero rivelare informazioni compromettenti per il vostro server. Per disabilitare queste funzioni occorre editare la voce seguente nel file php.ini

disable_functions = "apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, 
fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, 
ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, 
phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, 
posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, 
xmlrpc_entity_decode, system"

Impostare il timezone

Per impostare il timezone di php che permette di avere l'orario corretto rispetto al proprio fuso è necessario editare il file php.ini impostando l'opzione:

date.timezone = "Europe/Berlin"

PhpMyAdmin

Filtrare l'accesso di PhpMyAdmin

Se utilizzi l'interfaccia di PhpMyAdmin per gestire il tuo database MySQL potresti voler limitare l'accesso solo a determinate macchine. Se hai installato PhpMyAdmin dai repository di Debian ha probabilmente una configurazione specifica per questo strumento su /etc/apache2/conf.d/phpmyadmin.conf. Modifica questo file aggiungendo alla fine prima di </Directory> le seguenti righe:

order deny,allow
deny from all
allow from 192.168.1.1

Ovviamente devi sostituire l'IP con quello della macchina dalla quale vuoi accedere. Puoi anche usare regole come le seguenti per abilitare intere sottoreti.

allow from 192.168.1

Se la cartella conf.d o il file phpmyadmin.conf non sono presenti basta crearli e lanciare questo comando:

echo 'Include /etc/apache2/conf.d/phpmyadmin.conf' >> /etc/apache2/httpd.conf

che aggiungerà al file httpd.conf la riga Include /etc/apache2/conf.d/phpmyadmin.conf. Sì può usare la stessa procedura per proteggere e limitare altre cartelle.

Cambiare l'url predefinito di PhpMyAdmin

Cambiare l'url predefinito dell'installazione di PhpMyAdmin dai repository può essere un buon modo per evitare attacchi automatici di brute force. Per farlo occorre editare il file /etc/apache2/conf.d/phpmyadmin.conf modificando la voce seguente:

Alias /percorsopersonale /usr/share/phpmyadmin

Per rendere attive le modifiche riavviare apache con:

/etc/init.d/apache2 restart

MySQL

Creare un nuovo db e un nuovo utente con controllo completo sul db

Facciamo il login come root su mysql.

mysql -u root -p

Creiamo un nuovo database

mysql> CREATE DATABASE ilmiodb;

Creiamo l'utente e contestualmente concediamo tutti i privilegi sul database appena creato

mysql> GRANT ALL PRIVILEGES ON ilmiodb.* TO 'ilmioutente'@'localhost' IDENTIFIED BY 'passwd1';

NOTA: Se stai creando il database per l'installazione di Mediawiki puoi seguire la guida ufficiale

Backup dei dati di mysql

Il backup dei dati periodico di MySQL è un operazione imprescindibile per la sicurezza del proprio server. Esistono molti modi per fare il backup dei dati e della struttura dei database. Questo processo viene detto dump. Per seguire un backup completo di tutti i database e delle relative tabelle si può usare il comando:

mysqldump -u root -p --all-databases > nome-del-file-dump.sql

Invocato il comando mysqldump[1] verrà richiesta la password dell'utente root. Il file prodotto con questo comando sarà un file contenete istruzioni sql che permetterano in caso di failure di rirpistinare la struttura completa dei database con i relativi dati.

Se si desidera automatizzare il processo di backup sarà necessario scrivere la password dell'utente in chiaro nello script di backup come nell'esempio seguente:

mysqldump -u backupuser -pla-mia-password --all-databases > nome-del-file-dump.sql

In questo caso, per evitare di scrivere in chiaro la password di root, può essere una buona idea creare un utente specifico per i backup al quale concedere i privilegi minimi necessari per svolgere questa operazione a livello globale. Si potrà creare l'utente backupuser concedendo a livello globale i privilegi di SELECT, SHOW VIEW e di LOCK TABLES. E' possibile creare l'utente con l'interfaccia PHPMyAdmin o con il comando seguente lanciato dopo aver fatto il login su MySQL:

MYSQL> grant select, show view, lock tables on *.* to 'backupuser'@'localhost' identified by 'password';

Se si riceve l'errore "mysqldump: Couldn't execute 'show events':" si può aggiungere il parametro event alla stringa:

MYSQL> grant select, show view, event, lock tables on *.* to 'backupuser'@'localhost' identified by 'password';

In molti casi può essere utile conservare i dump sql separati per i singoli database. Per effettuare il backup di un singolo database si può utilizzare il comando:

mysqldump -u backupuser -p nomedatabase > backup-database.sql

Oppure è possibile creare un backup automatico su singoli file sql utilizzando uno script simile al seguente, il quale esclude dal backup lo schema di mysql e scrive una riga di log per ogni backup corretto:

#!/bin/bash

TGT="/mnt/backup/"
TAG="BACKUP"
OF=bkp-$(date "+%Y%m%d")

for i in $(echo "show databases;" | mysql -u root -ppassword | grep -v "Database" | grep -v "information_schema" | grep -v "performance_schema")
do
        mysqldump $i -u root -ppassword > $TGT$OF-$i.sql
        if [ $? == 0 ]
        then
                logger "Dump OK: $i" -t $TAG
        else
                logger "Dump ERROR: $?" -t $TAG
        fi
done;
exit 0

mysqldump è uno strumento potentissimo che ti permette anche di effettuare un dump filtrato con una query:

mysqldump -u root -p miodatabase miatabella --where="data<'2010-12-31 00:00:00'" > Dump_pre2010.sql

Ripristino di un dump sql

Se volete ripristinare un database sql utilizzando un file di dump sql il comando è il seguente:

 mysql -u root -p nome-database < backup-database.sql

Il comando funziona anche per ripristinare un singolo database da un file dump completo[2].

Riparare tabella Mysql

Per riparare una tabella mysql corrotta (fare un backup prima!) basta entrare nella cartella del database (solitamente /var/lib/mysql/nome_db) e lanciare questo comando se si tratta di tabelle MyISAM:

myisamchk *.MYI

o questo comando se si tratta di tabelle ISAM:

isamchk *.MYI

Solitamente è meglio selezionare solo la tabella che ha bisogno di essere riparata, vediamo un esempio:

myisamchk --tmpdir=/home/user/tmp -f mdl_log.MYI

Qui è stata specificata la cartella temporanea e forzata la riparazione sulla tabella mdl_log.MYI.

Note

  1. Documentazione ufficiale del comando mysqldump
  2. Vedi richiesta su Stackoverflow