Questa è una domanda canonica sulla protezione di uno stack LAMP
Quali sono le linee guida assolute per proteggere un server LAMP?
Questa è una domanda canonica sulla protezione di uno stack LAMP
Quali sono le linee guida assolute per proteggere un server LAMP?
Risposte:
La risposta di David è una buona base per i principi generali della protezione del server. Come ha indicato David, questa è una domanda enorme. Le tecniche specifiche che prendi potrebbero dipendere fortemente dal tuo ambiente e da come verrà utilizzato il tuo server. Attenzione, questo può richiedere molto lavoro in un ambiente di test per essere realizzato e fatto bene. Seguito da molto lavoro per l'integrazione nel proprio ambiente di produzione e, soprattutto, nel processo aziendale.
In primo luogo, tuttavia, controlla se la tua organizzazione ha delle politiche di protezione, poiché potrebbero essere le più direttamente pertinenti. In caso contrario, a seconda del ruolo, questo potrebbe essere un ottimo momento per costruirli. Consiglierei anche di affrontare ciascun componente separatamente dal basso verso l'alto.
L
Ci sono molte buone guide disponibili per aiutarti. Questo elenco può aiutarti o meno a seconda della tua distribuzione.
A
Apache può essere divertente da proteggere. Trovo più facile rafforzare il sistema operativo e mantenere l'usabilità rispetto ad Apache o PHP.
The M
La P
Questo si scontra a fondo con l'idea di Secure Programming Practices, che è una disciplina a sé stante. SANS e OWASP hanno una quantità ridicola di informazioni sull'argomento, quindi non proverò a replicarle qui. Mi concentrerò sulla configurazione di runtime e lascerò i tuoi sviluppatori preoccuparsi del resto. A volte la 'P' in LAMP si riferisce a Perl, ma di solito PHP. Sto assumendo quest'ultimo.
Hai fatto una domanda che è, francamente, degna di alcuni libri sull'argomento. Ma ci sono alcune linee guida di base generali che funzionano bene:
Spero che ti aiuti a iniziare.
Ecco una buona lista di controllo con cui mi piace iniziare.
Aggiungendo ciò che David suggerisce, più modulare è la tua installazione, con ciò intendo limitare l'accesso a determinati utenti / gruppi creati appositamente per un'attività e limitarne l'ambito, più sicuro è il tuo stack LAMP: un esempio di questo è avere un utente Apache per file / cartelle Apache con autorizzazioni impostate di conseguenza e non in alcun gruppo che può accedere a file / cartelle di sistema critici. Un utente che può accedere alle tabelle MySql associate ai tuoi siti Web che intendi pubblicare e solo a tali tabelle. Inoltre, puoi limitare il loro accesso per fornire la quantità minima di accesso da una chiamata PHP. Inoltre, assicurati che il nome utente MySQL utilizzato / esposto attraverso il file PHP non sia lo stesso nome utente o password utilizzata per un altro utente.
Cosa significa: se l'utente apache o l'utente MySql sono compromessi, non possono fare alcun danno al di fuori dell'ambito delle cartelle a cui apache ha accesso (nel caso dell'utente apache) e all'esterno della tabella ( s) / database (s) (nel caso dell'utente per il database MySQL).
Se in qualche modo l'utente di MySQL dovesse essere compromesso, non potrebbe, ad esempio, accedere al database e eliminare tutti i database da MySQL e rovinare tutti i tuoi dati. POTREBBERO in alcune circostanze essere in grado di eliminare le tabelle o inserire informazioni in alcune tabelle in un database isolato, motivo per cui è importante concedere l'accesso alle tabelle solo dove è assolutamente necessario e concedere solo le autorizzazioni necessarie ... se non si ' Non è necessario disporre dei privilegi di eliminazione delle tabelle o dei privilegi di aggiornamento, quindi non assegnarli a quell'utente.
Inoltre, se per qualche motivo il nome utente e la password dell'account amministrativo vengono rilevati per MySQL, se si utilizza un nome utente diverso rispetto a qualsiasi nome utente sul sistema, devono prima violare la sicurezza del sistema prima di accedere al database per danneggiare. Lo stesso vale per l'utente apache e l'accesso ai file.
Esempio di tempo! Ho intenzione di fare un esempio di sistema per semplificare l'idea.
supponiamo che tu abbia utenti sul tuo sistema (root dovrebbe essere disabilitato per sicurezza attraverso qualcosa come umod -l o passwd -l, ecc.): john, barney, terence e lisa.
potresti creare un utente in MySQL con il nome di bigbird (assicurati di usare una password con hash). Bigbird ha solo privilegi selezionati e privilegi di aggiornamento, ma non rilascia o crea, e certamente no . Inoltre, si crea un altro utente MySQL amministrativo con il nome garfield per lavorare sul database MySQL e si elimina l'utente root dal database MySQL in modo che non possa essere compreso. garfield è stato concesso . privilegi su MySQL (in effetti, si tratta solo di rinominare root).
ora crei un gruppo apache o un utente e lo chiameremo apweb2. Appweb2 non è un membro di altri gruppi e tutti i file / cartelle per apache sono memorizzati in / home / apweb2 /. Ogni host virtuale avrebbe la propria sottocartella e ciascuno di questi host avrebbe la radice del documento impostata su quella sottocartella. I collegamenti simbolici sarebbero disabilitati per non fornire accidentalmente l'accesso al resto del sistema.
Inoltre, puoi limitare l'accesso ssh solo a determinati utenti (o ad alcuni gruppi, mi piace inserirli nel gruppo ssh e renderlo l'unica cosa in grado di usare ssh).
Inoltre, puoi scegliere quali utenti hanno i privilegi di sudo per limitare ulteriormente le cose. Un altro passo che puoi fare è fare in modo che tutti gli utenti ssh non siano in grado di sudo, potresti creare utenti speciali che possono usare sudo che non possono usare ssh, quindi una volta che hai effettuato l'accesso, devi accedere a un altro utente per avere accesso a sudo.
Quindi, modularizzando ogni segmento, se ne viene compromesso uno, l'intero stack non verrà compromesso e sarà possibile rimediare al problema 1 invece di ricominciare tutto da capo.
Ho trovato questo documento di SANS.org davvero utile http://www.sans.org/score/checklists/linuxchecklist.pdf
Al momento, non trascurare la virtualizzazione dei container, vale a dire Docker, systemd-nspawn e i meccanismi di virtualizzazione dei container su cui sono costruiti (spazi dei nomi, cgroups). L'uso della virtualizzazione del contenitore consente di isolare i processi, ad esempio se uno dei servizi è compromesso, un utente malintenzionato non otterrà l'accesso ad altri servizi.
Nel caso di LAMP, è possibile utilizzare, ad esempio, quattro contenitori Docker con server SSH, Apache, MySQL, PHP-FPM / Python / Perl / ecc.