12 misure per uno LAMP Linux Apache MySQL PHP directory principale del server web sicuro
La frequenza di hacking è aumentato drammaticamente negli ultimi mesi. Soprattutto un sacco di dati che devono essere raccolti da hack su server web. Anche la Sony PSN trucco ha approfittato di una vulnerabilità senza patch in Web Server Apache. Così eccomi qui a sollevare le misure che il server può possedere un po 'più sicuro contro gli attacchi provenienti dall'esterno. Naturalmente, anche questo non fornisce protezione al 100%, ma è meglio fare i cattivi del gioco un po 'più difficile. Alcune delle misure richiedono solo una installazione minimale e manutenzione. Altri hanno bisogno di un sacco di tempo e la conoscenza di PHP per la cattura. Si deve sempre prestare attenzione al rapporto costi-benefici nella scelta delle misure di sicurezza. Non ha senso per proteggere un piccolo sito privato come la Federal Reserve Bank. Tuttavia, poche modifiche specifiche per il sistema ha già una grande significa sicurezza di più. E che si dovrebbe trattare anche prima che sia troppo tardi ....
Tutti i suggerimenti e Codesnips si riferiscono a una finestra di Debian attuale.
Prima Il firewall - vietare Una volta che tutto
Maggior parte delle distribuzioni di Linux nelle loro installazioni di default aprire tutte le porte verso l'esterno che non sono assolutamente necessari. Questa situazione può cambiare rapidamente, tuttavia, anche quando il server
giocare e di provare le cose. Improvvisamente, anche il media server è in ascolto su Internet o il database
accetta connessioni da Internet. Pertanto, non è sbagliato per disciplinare se stessi e mettere su un firewall molto restrittivo che vieta in sostanza una volta tutte le connessioni dall'esterno e consente solo (auto-) composti selezionati. Fortunatamente, questo è fatto rapidamente con iptables. In questo modo non si può più fornire servizi per rendere accessibile al mondo che non hanno nulla da lì. Purtroppo, si paga un po 'di conforto - il firewall deve essere regolato ogni volta che si desidera offrire nuovi servizi. Tuttavia, lo sforzo è piccolo e le grandi benefici.
# / Bin / bash # Cancella tabelle esistenti iptables-F # Proibire tutte le connessioni in entrata iptables-P INPUT GOCCIA iptables-P FORWARD DROP # Consenti tutto in uscita iptables-P OUTPUT ACCEPT # Permettere a SSH iptables-A INPUT-j ACCEPT-p tcp - dport 22 # Permetti HTTP iptables-A INPUT-j ACCEPT-p tcp - dport 80 # Ulteriori informazioni su servizio (UDP) permettono, per esempio, server di gioco iptables-A INPUT-j ACCEPT-p tcp - dport 4534 # Lasciare tutto da localhost. (Per consentire il libero accesso al server stesso, i suoi servizi, # Per esempio, PHP sul database locale iptables-A INPUT-s 127.0.0.1-j ACCEPT # Connessioni già esistenti saranno accettate in ciascun porto # (Obbligatorio per alcuni demoni) iptables-A INPUT-m state - state ESTABLISHED, RELATED-j ACCEPT
Questa spina dorsale poco che possiamo semplicemente continuare a espandere e aggiungere i propri servizi. Quando si lavora sul firewall, si dovrebbe sempre fare accantonamenti per il caso che si blocca da solo. Soprattutto per i server remoti a cui non hanno accesso fisico, è molto fastidioso perdere da un firewall non governare un proprio accesso. Per evitare questo problema fuori dalla strada, si può lasciare il lavoro per iniziare al firewall temporaneamente solo un job di cron che resetta il firewall ogni pochi minuti o il riavvio del server. Sono le regole successivamente testato e amato, il cronjob sarà disattivato e le nuove regole rimangono permanentemente attivo.
Per scoprire quali servizi sono proprio dietro ad ascoltare il proprio server, è possibile utilizzare netstat:
# Per i socket TCP: netstat-LPN | grep tcp # Lo stesso vale per UDP: netstat-LPN | grep udp
Per verificare se il firewall funziona davvero, è possibile eseguire la scansione porta il proprio server da un altro computer. Tutto ha funzionato e dovrebbe comportare solo le porte anche che sono aperti:
# Per TCP: nmap-p1-65 535 meinserver.de # Per UDP: nmap-sU-p1-65 535 meinserver.de
Secondo SSH login divieto
Sul suo server principale proprio di avere pieno accesso SSH. Questo è molto utile, come si può da qualsiasi client SSH ai tempi del server solo per lavorare su di esso. Il rovescio della medaglia è che il corso può chi purtroppo è in qualche modo preso le proprie password. E 'molto più sicuro per consentire gli accessi SSH solo con un file di chiave valido. Pertanto, la chiave pubblica del client al server e copiati gli accessi interattivi sono disabilitati inserendo una password.
# Sul client, creare una chiave pubblica # Se specificato durante la generazione di una password, bisogna # File di log dopo, la chiave e la password. In caso contrario # Necessario solo la chiave. ssh-keygen-t rsa # Copiare la chiave generata sul server ssh-copy-id-i ~ /. ssh / id_rsa.pub root@meinserver.de # Ora regolare sshd_config sul server / etc / ssh / . . PasswordAuthentication no . . # Poi ricominciare da capo RearBBpos / Etc / init.d / ssh restart
Anche qui si dovrebbe prendere le precauzioni necessarie per non chiudere, anche qualora qualcosa non funziona.
La chiave pubblica su una chiavetta USB con la password corrispondente in testa rende molto più difficile per i ragazzi cattivi per ottenere una shell.
Terzo SSH bruteforcing prevenire DenyHosts
Se il consiglio non è pratico 2 e non rinunciare alla comodità della password di login basati vuole, si può almeno evitare che i tassi di password automatizzati di attaccanti sul server. Un sacco di bot su internet tutto il giorno cercando di fare altro che server SSH e provare nelle varie password. Con una password ragionevolmente sicuro non è un grosso problema, ma c'è un feeling migliore, anche se non è possibile. Inoltre, protegge anche i suoi utenti, se ci sono sui conti server e utente. Qui, non si può contare sugli utenti di utilizzare password sicure. DenyHosts costantemente rivisti e le autenticazioni ssh sul utente blocca per un po 'che hanno inserito le loro password in modo errato ripetuto. L'IP degli utenti temporaneamente andare in / etc / hosts.deny, in modo che essi non hanno più accesso a è possibile. Questo SSH bruteforcing a un compito molto lungo e non molto promettente.
apt-get install DenyHosts Denyhosts N. funziona subito dopo l'installazione. Può essere # Nel file / etc / denyhosts.conf sintonizzare
4 Blacklist utilizzate per bloccare IP problema noto
In Internet varie liste nere sono mantenuti, che elencano un gran numero di server criminali / tritato / spam / fraudolenta. Queste liste IP possono essere inseriti direttamente nel firewall, in modo che da questo è noto, non ai computer di fiducia non possono connettersi a tutti di un proprio server. Così si può ridurre la quantità di spam su un proprio server in modo drammatico e l'uno o l'altro script kiddie lock out, perché la sua procura russa smette improvvisamente di funzionare. Come fare che sono stato in un altro articolo di blog ha descritto l'esempio della lista nera di Infiltrated.net.
5 Non usare FTP per lavorare sul server
FTP è una reliquia di tempi migliori quando Internet era ancora un piccolo villaggio di fiducia. Molti amministratori di siti web utilizzano ancora FTP per trasferire i file al server o per lavorare sul proprio sito web. Purtroppo, questo è molto incerta, dato che FTP trasmette tutti i dati non garantiti. Le password ei dati possono essere letti senza problemi ad ogni hop tra server e client. Molto più sicuro di andare con sshfs. Consente di montare una directory tramite ssh sul file system locale del server remoto. È quindi possibile lavorare sul server come se fosse sul computer locale. Tutti gli accessi ai file del file sul server sono completamente trasparenti, in modo da poter aprire con il programma locale di grafica per modificare l'immagine direttamente sul server, e quindi salvare. Più comfort e sicurezza senza troppa fatica.
# Installare sshfs apt-get install sshfs # Crea mountpoint sul file system locale mkdir / media / myserver # Server per il supporto file system locale sshfs www-data@mein-server.de :/ var / www / media / myserver # Ora è la directory / var / www sul mio server locale in / media / myserver disponibili
6 Installa aggiornamenti
Un sistema super-sicuro non aiuterà se il sistema stesso è difettoso e una vulnerabilità nota può essere sfruttata. Nella maggior parte dei casi, queste vulnerabilità chiuse in fretta, ma spesso si dimentica di amministrazione aggiornamenti periodici del sistema di fare. Sia che si dovrebbe attivare gli aggiornamenti automatici su server Linux o non è una questione controversa. Alcuni non farebbe mai, perché naturalmente con un sacco di sfortuna può essere che gli aggiornamenti di rendere il sistema inutilizzabile. Questo è accaduto a me in più di 10 anni di lavoro sui sistemi Debian, ma mai e apprezzo i vantaggi di aggiornamenti tempestivi e regolari, molto superiore al rischio che ne deriva.
# Questa riga nel file / etc / crontab, aggiorna l'orologio di sistema ogni giorno alle 6 del mattino 0 6 *** root apt-get update && apt-get-y aggiornamento
Si tratta di quick-and-dirty metodo ha funzionato per me finora sempre bene. Di recente ho letto che nel repository Debian e al pacchetto unattended-upgrades esiste che risolve il problema probabilmente più elegante, ma non sono stati testati.
Anche con questi aggiornamenti del sistema vollautomtischen non è del tutto fuori dai guai. Se un aggiornamento del kernel è stata consegnata, è necessario avviare il sistema ancora una volta a mano, altrimenti le modifiche non sarà attivo.
Se usiamo codice di terze parti PHP sul server, come ad esempio un CMS open source o di un forum, è naturalmente assolutamente necessario e questo codice con le nuove versioni aggiornate. Dal momento che Debian non aggiorna i suoi cambiamenti alle applicazioni delle norme che disciplinano il lavoro manuale è richiesto. Il modo migliore per leggere le vostre mailing list con i relativi prodotti in modo da essere sempre aggiornati.
7 PHP con open_basedir imprigionare
Hack Molti basata sul fatto che una vulnerabilità nel codice PHP viene utilizzato per accedere ai file in accesso al file system che non appartengono al sito, ma il sistema stesso è questo che si dovrebbe bloccare PHP in modo da leggere solo nelle directory specificatamente designati e scrivere consentito. Per questo, il php.ini l'opzione di configurazione open_basedir. PHP ha la possibilità di mettere l'accesso consentito solo alle directory lì. I file come / etc / passwd sono fuori portata. Hosting di più siti web su un server è necessario impostare open_basedir in ogni configurazione virtual host su ogni lato.
Php.ini # globale attraverso: # / Etc/php5/apache2/php.ini open_basedir = / var / www / tmp :/ / # Per la configurazione del sito in VirtualHost: php_value open_basedir / var / www / sito / tmp :/ /
E 'importante considerare se tutti i siti sono stati aggiunti gli script di solito hanno bisogno di accedere, altrimenti può essere che sei funzioni disattivate e legittima dell'applicazione PHP.
8 Crea il tuo sito web per gli utenti di MySQL
Usa la tua PHP-MySQL applicazione, si deve assolutamente creare per l'utente Apllikation proprio MySQL e in nessun caso utilizzare le richieste di utente root di MySQL. Si dovrebbe anche limitare i diritti degli utenti finora che le operazioni sono consentite solo in realtà, che richiede lo script PHP. CREATE TABLE e DROP TABLE sono comuni in SQL injection e utilizzato nella maggior parte delle applicazioni PHP non richiesti. Ospita più siti web con più database su un server, è necessario creare le vostre proprie basi di dati per tutti gli utenti. Così, dopo un attacco riuscito, un utente malintenzionato ha accesso solo a uno dei database e non direttamente a tutti. Se non si vuole provare la riga di comando per gestire gli account utente MySQL, gestione degli utenti funziona anche abbastanza facile con phpMyAdmin sotto i "diritti" tab.
9 Messaggi di errore PHP off
Messaggi di errore PHP un utente malintenzionato può rivelare molto su un proprio server: strutture di directory, strutture di database, errori di configurazione, ecc Questi studiosi cercano anche per l'utente molto poco professionale. Per questo motivo dovrebbero essere su un server web dal vivo, spegnere sempre, perché hai intenzione di continuare a vedere nei log.
Php.ini # globale attraverso: # / Etc/php5/apache2/php.ini display_errors = Off # Per la configurazione del sito in VirtualHost: display_errors php_flag Off # I messaggi di errore venga letto comunque: cat / var/log/apache2/error.log | grep php
10 Obiettivo per il limite di SQL injection con ModSecurity
SQL injection sono il metodo più utilizzato di attacco sui server web. Accedere direttamente attraverso l'applicazione web e si riunisce un browser per eseguire tali operazioni. Qui vengono trasmessi dalle variabili costruito dall'utente query SQL inviate ai privilegi dell'utente del database tutti i suoi database cancellerà leggere o modificarli. Una reale protezione efficace contro SQL injection esiste solo se il codice PHP è stato scritto il sito in relazione a questi attacchi. Ogni variabile da input dell'utente, che potrebbe entrare in una query SQL, deve essere testato ed è scappato. PHP offre il real_mysql_escape_string function ().
Se non siete sicuri se il codice è pulito, può mod_security Apache per contribuire a scongiurare una grande quantità di questi attacchi comunque. revisione mod_security costante tutte le richieste al server Web e risponde alle pre-pattern, che molti attacchi di SQL injection può essere bloccato. Purtroppo, funziona bene solo con uno sforzo mod_security manuale. Spesso, dopo una nuova installazione blocchi mod_security anche richiesto (regolare) le funzioni del vostro codice PHP, in modo che non si ha altra scelta, come l'applicazione completa per testare nuovamente l'installazione. Solo allora si fa a scoprire se mod_security potrebbe anche non voler bloccare le funzioni. Se è così, allora la lista dei filtri da regolare a scomparire in modo che il falso-positivo.
La configurazione di mod_security è piuttosto complicato e va oltre lo scopo di questo articolo, ma ci sono tonnellate di buoni tutorial su mod_security Internet.
11 ID check - Apache non sa chi è
Questo non è proprio metodo efficace nei confronti di un hack, fa gli script automatizzati che sono alla ricerca per le versioni server, ma leggermente più pesante. Di solito i punti di Apache a pagine con messaggi di errore (ad esempio non 404 trovato) la sua firma server.
Apache/2.2.16 (Unix) Server at www.daniel-ritter.de Port 80
Si elimina ogni potenziale aggressore riceveranno almeno una volta prima sul server Web eigesetzten e il livello di versione. Il server di firma è spento rapidamente:
# / Etc/apache2/conf.d/security ServerSignature Off
12 Non utilizzare disabilitare i moduli di Apache
Per impostazione predefinita, Apache ha caricato alcuni moduli che sono quasi mai necessari. Su Debian si possono trovare i moduli caricati
come un link simbolico in / etc/apache2/mods-enabled.
Può essere rimosso quasi sempre:
mod_cgi
Consente di eseguire script CGI. Questa tecnica risale agli albori del Web e stato il progenitore di linguaggi di scripting moderni per consentire siti web dinamici. mod_cgi è inutile per il 99% dei siti PHP e con un Apache difettosa config è un potenziale buco di sicurezza
a2dismod cgi
mod_status
Consente ai browser di leggere informazioni sullo stato del Apache. E 'quasi mai usato per "normali" siti, fornisce informazioni sullo stato degli attaccanti, ma Apache.
stato a2dismod
mod_autoindex
mod_autoindex assicura che le directory possono essere elencati sul server web, se non c'è una pagina di indice valido nella directory appropriata. Se questa funzionalità non è desiderata, è necessario disabilitare, dal momento che interi alberi di directory sul server web può essere visibili esternamente.
a2dismod AUTOINDEX
