PDA

View Full Version : [WEB SERVER] HTTPS e PHP, Configurazione da zero di un webserver sicuro


Genymus
12-10-2013, 20:18
Salve a tutti,
Sto sviluppando (in PHP) un registro elettronico, e dati i dati sensibili che viaggiano tra server e client, avrei bisogno di configurare un web server che utilizzi il protocollo SSL.

Stavo pensando a:
• CentOS con interfaccia testuale (per evitare lo spreco di risorse) come Sistema Operativo
• Apache come web server
• PHP come linguaggio di programmazione server-side
• MySQL (in locale e non accessibile dall’esterno) come database

Premetto che sono disposto a cambiare sia OS che Web Server (ho sentito ben parlare di nginx, visto che a quanto pare sfrutta meglio le risorse), ma preferirei mantenere PHP e MySQL.
Quindi se qualcuno avesse un OS che funzioni meglio e un web server più performante, sappia che ogni consiglio è ben accetto (tenendo conto però che verrà utilizzato come test (in locazione nella scuola) per un anno e, se tutto funziona, verrà trasferito su un vps.

Adesso torniamo al problema… quello a cui punto, è avere un sistema sicuro ed configurato al meglio.
Di guide ne ho lette parecchie, ma non fanno altro che fare confusione (visto che sono per la maggior parte incomplete o incompatibili tra loro).

Possiedo già un certificato SSL (creato con openssl, devo creare una cosa economica ma sicura ).
Adesso dovrei scegliere il web server e configurarlo in modo che funzioni con https, e qui entrate in gioco voi.
Dove posso trovare una guida dettagliata (passo per passo, esempio con comandi per installare i vari moduli), su come configurare il web server, https, php, mysql server e (possibilmente).
Cosa mi consigliate di usare come firewall (software)?

Vi informo che (a parte quelle sporadiche volte che ho avviato ubuntu) non ho mai utilizzato Linux e non ho mai configurato niente in ssl… ho qualche conoscenza teorica, ma non mi basta, per cui mi rivolgo a voi, che probabilmente ci sarete già passati.

Un’ultima informazione, naturalmente pensavo di usare anche jquery per eseguire richieste a server, ma il dubbio che mi assilla è… funzionerà? Mi pare di aver capito, che basta far puntare le richieste e i link ad https, ma funziona anche con le $.post di jquery? O viaggia in chiaro? Se includo script js con percorsi relativi, è automatico il passaggio in https? C’è bisogno di decifrare i dati una volta arrivati al client o si arrangia a fare tutto il browser?.

Grazie mille a tutti quanti per il loro tempo.

PS: gradirei non si facessero commenti riguardo alla mia ignoranza sulla materia, quindi per favore, niente risposte come “se non hai mai configurato o usato Linux, perché lo devi usare?” perché la risposta sarebbe: “perché devo usare un sistema operativo tipo Windows che è oneroso ed inutile, quando posso (imparare innanzitutto) usarne uno basato su Linux molto più performante?”. Un’altra domanda potrebbe essere “Perché ti ostini a voler configurare un server https? Fallo fare a qualcuno che ne è capace!” la cui risposta sarebbe: “Innanzitutto, voglio imparare (anche sono come esperienza personale), ed anche perché devo sviluppare questa applicazione ad uno costo ridotto e non posso ne voglio dipendere da un’azienda esterna per la configurazione del server”. Inoltre, tutti quanti hanno dovuto imparare quello che sanno e ci sono molti modi per farlo, uno di questi è quello che sto utilizzando in questo momento.

marco_t
13-10-2013, 00:53
Puoi scaricare la guida di Ubuntu Server dal sito ufficiale
http://help.ubuntu-it.org/

Genymus
13-10-2013, 01:12
Ti ringrazio per la risposta tempestiva, stavo giusto dando un'occhiata ad un manuale, e sembra promettente...
Deduco quindi che mi consigli di usare ubuntu al posto di centos e apache2, inoltre vedo che la guida è piuttosto completa, almeno per quello che mi interessa...

Però, ancora non ho tutte le informazioni necessarie, gradirei avere informazioni sulla configurazione di apache2, php e mysql, per avere un sistema sicuro, mi rivolgo quindi agli amministratori di server che sicuramente in questo forum abbonderanno... cosa mi consigliate?

Per la configurazione di php, queste opzioni possono bastare?
php.ini:

display_errors=0
register_globals=0
safe_mode=0


altre opzioni:

magic_quotes_gpc > attiva


Mi sembrano poche, quindi immagino ci siano altre cose da modificare, anche sulla configurazione di apache.

Ritornando al discorso jquery, posso anche testarlo a configurazione terminata.

Aggiungo: che librerie/script php mi consigliate per cifrare i dati sul database? Naturalmente i più veloci e performanti, senza perdere di vista la sicurezza?

Ringrazio anticipatamente tutti.

antenore
13-10-2013, 21:04
Visto che parti quasi da zero con linux, ti consiglio per ora di lasciare in disparte la sicurezza (ssl e firewall) e iniziare a configurare l'ambiente LAMP.
Poi quando vedi che tutto funziona e hai compreso come funziona inizi a inserire il certificato ssl, etc..
Per le guide basta che cerchi la parola LAMP (che sta per Linux Apache Mysql Php) su google. Io ho iniziato con questa guida (http://guide.debianizzati.org/index.php/Installare_un_ambiente_LAMP:_Linux,_Apache2,_SSL,_MySQL,_PHP5) su linux debian.


Cosa mi consigliate di usare come firewall (software)?


Su linux si usa iptables.

Genymus
13-10-2013, 22:53
Visto che parti quasi da zero con linux, ti consiglio per ora di lasciare in disparte la sicurezza (ssl e firewall) e iniziare a configurare l'ambiente LAMP.

Grazie mille, credo che seguirò il tuo consiglio, perchè comunque è un progetto che verrà seguito durante il tempo libero, ed il tempo di progettazione è di minimo 6 mesi fino a 12... di conseguenza, avrò tutto il tempo di configurare la sicurezza. Quello che invece mi preme sapere è se dovrò adottare delle strategie di programmazione diverse da quelle attuali (senza https), o se il discorso non vale perchè apache si occuperà di cifrare le informazioni dopo aver elaborato le pagine tramite l'interprete php.

Grazie ancora

Tasslehoff
13-10-2013, 23:26
Riguardo al sistema operativo ti consiglio CentOS, lo troverai più conservativo di altre distribuzioni in merito ad aggiornamenti o versioni dei vari componenti che andrai ad utilizzare (es php, piuttosto che mysql), però in termini di stabilità e affidabilità parti già da ottime basi.
L'unico aspetto relativo alla sicurezza che può interessare l'OS sono gli updates, installare aggiornamenti a casaccio (o appena rilasciati) imho non è un approccio molto saggio per molti motivi (uno fra tutti, nessuno può garantire il funzionamento delle applicazioni se si fanno updates in questo modo, e come chiunque può confermare i test richiedono tempo e risorse), d'altro canto nemmeno usare versioni arcaiche dei package è molto saggio.
Un approccio ragionevole e sensato potrebbe essere quello di effettuare updates seguendo i rilasci delle major version di CentOS (es ora siamo a CentOS 6.4, quando uscirà la 6.5 attendi un paio di settimane e poi testa in pre-produzione o sviluppo, se gli adeguati test fai un backup full della produzione e poi upgrade e test anche di quella), magari monitorando più attentamente i rilasci di sicurezza delle componenti più sensibili (es Apache e php).

Per il webserver stai pure su Apache, a meno che tu preveda accessi stratosferici o a meno di utilizzare server davvero poco potenti (es un sistema embedded o simil Raspberry PI per capirci) la differenza è trascurabile.
Su apache troverai inoltre una comunità molto più ampia, molte più guide, tutorial e quant'altro ti potrà servire per implementare la tua soluzione.
Inoltre nel caso dovessi crescere molto con gli accessi sarà difficile che il webserver possa rappresentare un collo di bottiglia o la soluzione ad un eccessivo carico; in quel caso dovrai integrare la tua architettura con altre componenti (hw o sw), come acceleratori php o sistemi di caching, tutta roba che per il momento rappresenterebbe una inutile complicazione.
L'hardening di apache consiste essenzialmente nel modificare alcune direttive in modo da esporre online meno informazioni possibili riguardo alla tua architettura, e nell'eliminare (non occorre cancellare o disinstallare nulla, basta solo commentare parti dei file di configurazione) le componenti opzionali (per lo più moduli) che non serviranno alla tua applicazione.
Puoi cercare su google "apache hardening" per trovare un sacco di semplici tutorial.
In merito a SSL non c'è molto da dire, per l'ambiente di sviluppo puoi usare tranquillamente un certificato self signed senza spendere nulla, non è ne più sicuro ne meno rispetto ad un certificato firmato da una CA trustata dai browser. In produzione potete scegliere se proseguire con quello o comprare un certificato, la configurazione del virtualhost https è davvero banale e coinvolge pochissime direttive, in rete trovi innumerevoli tutorial che spiegano come farlo passo passo.

L'hardening di MySQL dipende anche da che architettura vuoi realizzare, di base puoi cominciare con il lanciare lo script mysql_secure_installation che trovi con ogni istanza di mysql (anche quella preinstallare dal setup di CentOS).
A parte le ovvie raccomandazioni sulle credenziali (ad es utilizzare uno schema dedicato per le tue applicazioni e non usare l'utente root, applicare delle grant sensate ai vari utenti) e sull'esposizione del dbms (che ovviamente deve essere acceduto unicamente da host fidati, come il webserver o l'application server, eventualmente dagli host di monitoraggio o di sviluppo, non certo esposto alla mercé del web) va particolarmente curato l'aspetto dei backup e dei relativi test di restore (in questo per fortuna mysql è estremamente amichevole).

La componente più sensibile e da curare maggiormente imho è quella applicativa.
Usando php devi stare molto attento a non seguire tutte le best practice di sviluppo per non esporre a web applicazioni suscettibili di attacchi basati su sql injection, controllare bene le query con gli adeguati caratteri di escape, usare prepared statements e tutte gli accorgimenti necessari a rendere il tuo codice sicuro.
Purtroppo su questo non ti posso essere d'aiuto perchè esula dalle mie competenze, posso solo consigliarti di rivolgerti a un forum dedicato allo sviluppo php per maggiori dettagli.

In merito al firewall può andar benissimo iptables, anzi è ottimo.
CentOS di suo propone una configurazione che è già sufficientemente curata in tal senso (lancia un "iptables -L -n -v" al boot per darle un'occhiata), anzi dovrai aprire la porta 80 o 443 per poter fare il browsing del tuo sito o delle tue applicazioni.

Sempre in termini di sicurezza posso consigliarti l'installazione di un sistema di intrusion detection basato su analisi dei log come OSSEC, un adeguato monitoraggio basato su Nagios e un sistema di raccolta statistica delle risorse e delle performance come Collectd (e il frontend grafico Collect Graph Panel), anche queste però ti consiglio di valutarle in fasi successive, considera che molti ambienti di produzione su cui ho lavorato (ahimè :rolleyes: o forse per fortuna, finchè ci saranno non mancherà lavoro per noi consulenti :asd: ) non prevedono nemmeno una frazione di queste misure.

Immagino che un giorno poi vorrete anche verificare gli accessi al sito/applicazioni, a tal proposito mi permetto di consigliarti l'ottimo Piwik (anzichè buttarsi su Google Analytics come fa bovinamente la gran parte delle persone... :rolleyes: )

Genymus
20-10-2013, 19:12
Allora, ringrazio tutti (e particolarmente Tasslehoff per il suo post sulla sicurezza)... ho avuto una settimana molto impegnata e non ho trovato neppure il tempo di ringraziare tutti. Per adesso, mi occuperò di configurare un server ubuntu (come server di sviluppo) applicando però le regole di Tasslehoff.
Ho deciso in questo modo, perchè immagino che ubuntu server sia il modo migliore di iniziare, quindi quando avrò preso confidenza con questa distro, passerò a centos per la parte di produzione.

Riguardo all'ultimo post, sebbene non utilizzi raspberry o sistemi simili, mi ritrovo comunque con un processore Atom dual core da 1,6 Ghz e circa 512mb di RAM... so che non è molto, però da una parte forse è meglio così, perchè molte volte è questo che offrono come VPS a basso costo...
Tasslehoff, mi consigli ancora Apache (ho sentito che è in grado di assegnare anche 30 mb di ram per ogni richiesta).

Non riesco bene a comprendere i sistemi di intrusion detection, ma lavorerò anche su questo (immagino che siano previsti e preconfigurati sui VPS).

Ancora grazie