<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Enrico Tenivella &#187; Apache</title>
	<atom:link href="http://www.texilee.it/category/apache/feed" rel="self" type="application/rss+xml" />
	<link>http://www.texilee.it</link>
	<description>Diario di bordo di un sistemista</description>
	<lastBuildDate>Mon, 21 Jun 2010 11:55:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>debian lenny django mod-wsgi</title>
		<link>http://www.texilee.it/debian-lenny-django-mod-wsgi</link>
		<comments>http://www.texilee.it/debian-lenny-django-mod-wsgi#comments</comments>
		<pubDate>Thu, 01 Apr 2010 09:36:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://www.texilee.it/?p=320</guid>
		<description><![CDATA[aptitude install libapache2-mod-wsgi python-imaging gettext python-mysqldb ## download django src/svn ## apache cfg ### DJANGO begin ### Alias  /media/ /var/www/htdocs/website/django/website/media/ WSGIScriptAlias / /var/www/htdocs/website/django/website/apache/django.wsgi WSGIDaemonProcess nuovacigat user=website group=website  processes=1 threads=1 maximum-requests=1000 display-name=website.dj WSGIProcessGroup website ### DJANGO end ### ## cat  /var/www/htdocs/website/django/website/apache/django.wsgi import os import sys sys.stdout = sys.stderr #Calculate the path based on the location of [...]]]></description>
			<content:encoded><![CDATA[<p>aptitude install libapache2-mod-wsgi python-imaging gettext python-mysqldb</p>
<p>## download django src/svn</p>
<p>## apache cfg</p>
<p>### DJANGO begin ###<br />
Alias  /media/ /var/www/htdocs/website/django/website/media/<br />
WSGIScriptAlias / /var/www/htdocs/website/django/website/apache/django.wsgi<br />
WSGIDaemonProcess nuovacigat user=website group=website  processes=1 threads=1 maximum-requests=1000 display-name=website.dj<br />
WSGIProcessGroup website<br />
### DJANGO end ###</p>
<p>## cat  /var/www/htdocs/website/django/website/apache/django.wsgi</p>
<p>import os<br />
import sys</p>
<p>sys.stdout = sys.stderr</p>
<p>#Calculate the path based on the location of the WSGI script.</p>
<p>apache_configuration= os.path.dirname(__file__)project = os.path.dirname(apache_configuration)workspace = os.path.dirname(project)sys.path.append(workspace)<br />
sys.path.append(&#8216;/var/www/htdocs/website/django/django-website&#8217;)      &lt;&#8211;  django fw<br />
sys.path.append(&#8216;/var/www/htdocs/website/django/website&#8217;)       &lt;&#8211; app<br />
import django.core.handlers.wsgi<br />
os.environ['DJANGO_SETTINGS_MODULE'] = &#8216;website.settings&#8217;<br />
application = django.core.handlers.wsgi.WSGIHandler()</p>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/debian-lenny-django-mod-wsgi/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache http return code table</title>
		<link>http://www.texilee.it/apache-http-return-code-table</link>
		<comments>http://www.texilee.it/apache-http-return-code-table#comments</comments>
		<pubDate>Wed, 17 Sep 2008 07:21:06 +0000</pubDate>
		<dc:creator>texilee</dc:creator>
				<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://www.texilee.it/?p=261</guid>
		<description><![CDATA[100 Continue 101 Switching Protocols 102 Processing 200 OK 201 Created 202 Accepted 204 No Content 205 Reset Content 206 Partial Content 207 Multi-Status 300 Multiple Choices 301 Moved Permanently 302 Found 303 See Other 304 Not Modified 305 Use Proxy 306 unused 307 Temporary Redirect 400 Bad Request 401 Authorization Required 402 Payment Required [...]]]></description>
			<content:encoded><![CDATA[<p>100 Continue<br />
101 Switching Protocols<br />
102 Processing<br />
200 OK<br />
201 Created<br />
202 Accepted<br />
204 No Content<br />
205 Reset Content<br />
206 Partial Content<br />
207 Multi-Status<br />
300 Multiple Choices<br />
301 Moved Permanently<br />
302 Found<br />
303 See Other<br />
304 Not Modified<br />
305 Use Proxy<br />
306 unused<br />
307 Temporary Redirect<br />
400 Bad Request<br />
401 Authorization Required<br />
402 Payment Required<br />
403 Forbidden<br />
404 Not Found<br />
405 Method Not Allowed<br />
406 Not Acceptable<br />
408 Request Time-out<br />
409 Conflict<br />
410 Gone<br />
411 Length Required<br />
412 Precondition Failed<br />
413 Request Entity Too Large<br />
414 Request-URI Too Large<br />
415 Unsupported Media Type<br />
417 Expectation Failed<br />
418 unused<br />
419 unused<br />
420 unused<br />
421 unused<br />
422 Unprocessable Entity<br />
423 Locked<br />
424 Failed Dependency<br />
500 Internal Server Error<br />
501 Method Not Implemented<br />
502 Bad Gateway<br />
504 Gateway Time-out<br />
506 Variant Also Negotiates<br />
507 Insufficient Storage<br />
508 unused<br />
509 unused<br />
510 Not Extended</p>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/apache-http-return-code-table/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian apache utf8 problem</title>
		<link>http://www.texilee.it/debian-apache-utf8-problem</link>
		<comments>http://www.texilee.it/debian-apache-utf8-problem#comments</comments>
		<pubDate>Wed, 23 May 2007 12:33:23 +0000</pubDate>
		<dc:creator>texilee</dc:creator>
				<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://www.texilee.it/2007/05/23/apache/debian-apache-utf8-problem/</guid>
		<description><![CDATA[Di default le pagine vengono (anche in presenza di un tag meta) restituite con encoding iso-8859-1 Cio&#8217; porta a notevoli problemi se le pagine vengono scritte in utf8, per ovviare apache ci mette a disposizione la direttiva applicabile a qualsiasi context AddDefaultCharset Se si vuole lasciare libertà completa allo sviluppatore basta disattivare questa funzionalità con [...]]]></description>
			<content:encoded><![CDATA[<p>Di default le pagine vengono (anche in presenza di un tag meta) restituite con encoding  iso-8859-1</p>
<p>Cio&#8217; porta a notevoli problemi se le pagine vengono scritte in utf8, per ovviare apache ci mette a disposizione la direttiva applicabile a qualsiasi context</p>
<pre>AddDefaultCharset</pre>
<p>Se si vuole lasciare libertà completa allo sviluppatore basta disattivare questa funzionalità con</p>
<pre>AddDefaultCharset Off</pre>
<p>Per visualizzare testo/codice nei vari standard e soprattutto in rapidità link l&#8217;<a href="http://people.w3.org/rishida/scripts/uniview/conversion.php">unicode code converter</a> giunto alla 4^ versione</p>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/debian-apache-utf8-problem/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>APACHE Script monitor hits/day</title>
		<link>http://www.texilee.it/apache-script-monitor-hitsday</link>
		<comments>http://www.texilee.it/apache-script-monitor-hitsday#comments</comments>
		<pubDate>Wed, 23 Aug 2006 11:44:09 +0000</pubDate>
		<dc:creator>texilee</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://texilee.gruppoinfo.it/2006/08/23/linux/apache-script-monitor-hitsday/</guid>
		<description><![CDATA[#  Script per conteggiare le richieste di un singolo ip all&#8217;interno del access log #+ e monitorare attivita&#8217; di richieste sospette. #check utente ROOT ROOT_UID=0 #codice errore se nn root E_NONROOT=67 if [ "$UID" -ne "$ROOT_UID" ] then echo &#8220;Devi essere root&#8230;.&#8221; exit $E_NONROOT fi if [ ! "$(echo $1 &#124; grep '[0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}&#8217;)&#8221; ] then [...]]]></description>
			<content:encoded><![CDATA[<p>#  Script per conteggiare le richieste di un singolo ip all&#8217;interno del access log<br />
#+ e monitorare attivita&#8217; di richieste sospette.</p>
<p>#check utente ROOT<br />
ROOT_UID=0</p>
<p>#codice errore se nn root<br />
E_NONROOT=67</p>
<p>if [ "$UID" -ne "$ROOT_UID" ]<br />
then<br />
echo &#8220;Devi essere root&#8230;.&#8221;<br />
exit $E_NONROOT<br />
fi</p>
<p>if [ ! "$(echo $1 | grep '[0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}&#8217;)&#8221; ]<br />
then<br />
echo &#8220;Uso: `basename $0` indirizzo_IP numero_giorni&#8221;<br />
exit 1<br />
fi</p>
<p>IP=$1</p>
<p>echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#8221;<br />
if [ -n "$2" ]<br />
then<br />
for i in $(seq 0 $2); do<br />
DATA_PER_ACCESSLOG=$(date &#8211;date=&#8221;$i day ago&#8221; &#8216;+%d/%b&#8217;)<br />
TOT=`grep -c $IP.*$DATA_PER_ACCESSLOG /var/www/htdocs/web/logs/web-access.log`<br />
echo $DATA_PER_ACCESSLOG &#8220;  &#8221; $IP &#8220;  &#8221; $TOT<br />
# echo $i<br />
done<br />
else<br />
#date &#8211;date=&#8217;2 day ago&#8217; &#8216;+%s&#8217;<br />
DATA_PER_ACCESSLOG=`date +&#8217;%d/%b&#8217;`<br />
TOT=`grep -c $IP.*$DATA_PER_ACCESSLOG /var/www/htdocs/web/logs/web-access.log`<br />
echo $DATA_PER_ACCESSLOG &#8220;  &#8221; $IP &#8220;  &#8221; $TOT<br />
fi<br />
echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#8221;</p>
<p>exit 0</p>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/apache-script-monitor-hitsday/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>APACHE Script monitor hits per ip in un arco di N minuti</title>
		<link>http://www.texilee.it/apache-script-monitor-hits-per-ip-in-un-arco-di-n-minuti</link>
		<comments>http://www.texilee.it/apache-script-monitor-hits-per-ip-in-un-arco-di-n-minuti#comments</comments>
		<pubDate>Wed, 23 Aug 2006 11:38:45 +0000</pubDate>
		<dc:creator>texilee</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://texilee.gruppoinfo.it/2006/08/23/linux/apache-script-monitor-hits-per-ip-in-un-arco-di-n-minuti/</guid>
		<description><![CDATA[#!/bin/bash # Script per monitorare il numero di hits per ip in un arco di N minuti, solo utente root #default minuti DEFAULTMIN=1440 #check utente ROOT ROOT_UID=0 #codice errore se nn root E_NONROOT=67 if [ "$UID" -ne "$ROOT_UID" ] then echo &#8220;Devi essere root&#8230;.&#8221; exit $E_NONROOT fi if [ -n "$1" ] then NUMERO=$1 else [...]]]></description>
			<content:encoded><![CDATA[<p>#!/bin/bash<br />
#  Script per monitorare il numero di hits per ip in un arco di N minuti, solo utente root</p>
<p>#default minuti<br />
DEFAULTMIN=1440</p>
<p>#check utente ROOT<br />
ROOT_UID=0</p>
<p>#codice errore se nn root<br />
E_NONROOT=67</p>
<p>if [ "$UID" -ne "$ROOT_UID" ]<br />
then<br />
echo &#8220;Devi essere root&#8230;.&#8221;<br />
exit $E_NONROOT<br />
fi</p>
<p>if [ -n "$1" ]<br />
then<br />
NUMERO=$1<br />
else<br />
NUMERO=$DEFAULTMIN<br />
echo &#8220;Uso: `basename $0` numero_minuti  [DEFAULT 1440]&#8221;<br />
fi</p>
<p>#Linea per far puntare la variabile ACCESSLOGTMPFILE al file access.log originale<br />
ACCESSLOGTMPFILE=&#8217;/var/www/htdocs/web/logs/web-access.log&#8217;</p>
<p>LIMITE=$NUMERO<br />
for ((i=1; i <= LIMITE; i++))<br />
do<br />
CONFRONTO=`date &#8211;date=&#8221;$i minutes ago&#8221; +&#8221;%d/%b/%Y:%R&#8221;`<br />
printf $CONFRONTO<br />
printf &#8220;\t&#8221;<br />
grep $CONFRONTO $ACCESSLOGTMPFILE |wc -l<br />
done</p>
<p>exit 0</p>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/apache-script-monitor-hits-per-ip-in-un-arco-di-n-minuti/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurazione Pound Debian</title>
		<link>http://www.texilee.it/configurazione-pound-debian</link>
		<comments>http://www.texilee.it/configurazione-pound-debian#comments</comments>
		<pubDate>Wed, 26 Jul 2006 07:59:08 +0000</pubDate>
		<dc:creator>texilee</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://texilee.gruppoinfo.it/2006/07/26/linux/configurazione-pound-debian/</guid>
		<description><![CDATA[Esempio di configurazione di pound per il load balancing/reverse proxy del webserver apache su Debian Sarge. Ipotizzando di dover mettere in produzione dei servizi web per un totale di macchine (eterogenee o non) che supera nettamente il nostro range di ip pubblici pound si rivela uno strumento eccezionale. #apt-get install pound Il file di configurazione [...]]]></description>
			<content:encoded><![CDATA[<p>Esempio di configurazione di pound per il load balancing/reverse proxy del webserver apache su Debian Sarge.<br />
Ipotizzando di dover mettere in produzione dei servizi web per un totale di macchine (eterogenee o non) che supera nettamente il nostro range di ip pubblici pound si rivela uno strumento eccezionale.</p>
<pre>#apt-get install pound</pre>
<p>Il file di configurazione da modificare è /etc/pound/pound.cfg</p>
<p>Nell&#8217;esempio sottostante si fa riferimento ad una situazione composta da 4 macchine di back-end di cui 2 mirror a carico bilanciato</p>
<pre>User    www-data</pre>
<pre>Group  www-data</pre>
<pre>ExtendedHTTP   0</pre>
<pre>WebDAV  0</pre>
<pre>LogLevel 3</pre>
<pre>Alive 10</pre>
<pre>ListenHTTP  xxx.xxx.xxx.xxx,80</pre>
<pre>######FOO########</pre>
<pre>UrlGroup ".*"</pre>
<pre>HeadRequire Host ".*foo.texilee.it*"</pre>
<pre>Session IP 300</pre>
<pre>BackEnd 10.10.10.10,80,9</pre>
<pre>EndGroup</pre>
<pre>######BAR########</pre>
<pre>UrlGroup ".*"</pre>
<pre>HeadRequire Host ".*bar.texilee.it*"</pre>
<pre>Session IP 300</pre>
<pre>BackEnd 10.10.10.13,80,9</pre>
<pre>EndGroup</pre>
<pre>###### Load Balancing########</pre>
<pre>UrlGroup ".*"  Session IP 300</pre>
<pre>BackEnd 10.10.10.15,80,9</pre>
<pre>BackEnd 10.10.10.25,80,1</pre>
<pre>EndGroup</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/configurazione-pound-debian/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Bash Apache IDS part1</title>
		<link>http://www.texilee.it/advanced-bash-apache-ids-part1</link>
		<comments>http://www.texilee.it/advanced-bash-apache-ids-part1#comments</comments>
		<pubDate>Fri, 21 Jul 2006 10:34:42 +0000</pubDate>
		<dc:creator>texilee</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://texilee.gruppoinfo.it/2006/07/21/linux/advanced-bash-apache-ids-part1/</guid>
		<description><![CDATA[Esistono innumerevoli sistemi IDS, molti a pagamento, molti con funzionalità totalmente inutili, alcuni troppo &#8220;permissivi&#8221; e proporzionalmente altri troppo &#8220;aggressivi&#8221;. In questo articolo, primo di una lunga serie tempo permettendo, cerco di mostrarvi le tecniche per costruirsi le basi per mettere in piedi un IDS casalingo utilizzando gli strumenti che bash ci offre. Potrebbe essere [...]]]></description>
			<content:encoded><![CDATA[<p>Esistono innumerevoli sistemi IDS, molti a pagamento, molti con funzionalità totalmente inutili, alcuni troppo &#8220;permissivi&#8221; e proporzionalmente altri troppo &#8220;aggressivi&#8221;.<br />
In questo articolo, primo di una lunga serie tempo permettendo, cerco di mostrarvi le tecniche per costruirsi le basi per mettere in piedi un IDS casalingo utilizzando gli strumenti che bash ci offre.</p>
<p>Potrebbe essere un ottimo esercizio mirato ad affinare le tecniche di scripting bash, vi ricordo che potet raggiungere lo stesso obiettivo con altri linguaggi stile php / perl ma quasi sicuramente otterrete a parità di risultati un utilizzo più massiccii in termini di cpu.</p>
<p>Iniziamo con il postprocessing dell&#8217;analisi del file access.log di apache con l&#8217;opzione &#8220;combined&#8221;</p>
<p>Lo scopo è avere a portata di mano una utility che ci permetta al volo di capire quali determinati IP hanno effettuato richieste verso il nostro sito.</p>
<pre>awk '{print $1}' /var/log/apache/access.log</pre>
<p>Possiamo contare il numero di hits totale</p>
<pre>awk '{print $1}' /var/log/apache/access.log|wc -l</pre>
<p>e passare a qualcosa di più utile: ordinamento e conteggio</p>
<pre>awk '{print $1}' /var/log/apache/access.log|
sort|uniq -c|sort</pre>
<p>Sono bastati un paio di comandi per fare qualcosa che via php/perl (senza usare CPAN!) vi sarebbe costato qualche ciclo&#8230; ora togliamo anche le &#8220;&#8221; virgolette che contornano l&#8217;indirizzo IP</p>
<pre>awk '{print $1}' /var/log/apache/access.log|
sort|uniq -c|sort|sed s/\"//g</pre>
<p>Se volessimo sapere quante sono in tutto le richieste e ip unici aggiungiamo un awk</p>
<pre>awk '{print $1}' /var/log/apache/access.log|
sort|uniq -c|sort|sed s/\"//g|
awk '{print $0;tot+=1;sum+=$1}
END {print "HITS: "sum "|IP: " tot}'</pre>
<p>Lo script è &#8220;corto&#8221; quanto basta per essere ancora scritto a video e richiamato via history e relativo !ID_CMD. Ovviamente ha le sue limitazioni in quanto la funzionalità è relativa ai settaggi del vostro logrotate. Nel prossimo articolo inserirò il metodo per potere parsare solo gli ultimi X minuti del file access.log e rendere lo script più performante nella sintassi</p>
<p><strong>./hits ARG1</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/advanced-bash-apache-ids-part1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hardening Debian Linux LAMP Servers</title>
		<link>http://www.texilee.it/hardening-debian-linux-lamp-servers</link>
		<comments>http://www.texilee.it/hardening-debian-linux-lamp-servers#comments</comments>
		<pubDate>Fri, 30 Jun 2006 10:25:10 +0000</pubDate>
		<dc:creator>texilee</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://texilee.gruppoinfo.it/2006/06/30/linux/hardening-debian-linux-lamp-servers/</guid>
		<description><![CDATA[Hardening Debian Linux Web PHP Servers L&#8217;aspetto più rilevante nella configurazione di un web server è senza dubbio la completa collaborazione fra sviluppatori di codice e sistemisti (gli sviluppatori grafici non hanno voce in questione ) Inutile preparare una macchina dalla configurazione hardware ottimale con RAID 5 o 10 su 4 dischi SCSI e un [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Hardening Debian Linux Web PHP Servers</strong></p>
<p>L&#8217;aspetto più rilevante nella configurazione di un web server è senza dubbio la completa collaborazione fra sviluppatori di codice e sistemisti (gli sviluppatori grafici non hanno voce in questione <img src='http://www.texilee.it/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  )</p>
<p>Inutile preparare una macchina dalla configurazione hardware ottimale con RAID 5 o 10 su 4 dischi SCSI e un firewall di 3000 righe per scoprire di lunedì mattina che il DB è vuoto. Motivo? Account di amministratore settato con USER: &#8220;Admin&#8221; e Password indovinate un po&#8217;&#8230; <img src='http://www.texilee.it/wp-includes/images/smilies/icon_neutral.gif' alt=':|' class='wp-smiley' />  &#8230; &#8220;Admin&#8221; ovvio!</p>
<p>Sprecare quel paio d&#8217;ore in più a chiacchierare con lo sviluppatore non è male, ma cosa buona e giusta! Prendetevi tutto il tempo per rendere stabili e congruenti le modifiche e non abbiate nè fretta nè timore di far osservare qualche policy di sicurezza in più al vostro collega cresciuto su manuali che danno per scontato il non effettuare input sanitazing.</p>
<p>Per la preparazione del kernel (personalmente pendo dalla parte degli amanti di conf monolitiche con le giuste patch applicate vedi grsecurity) penso di scrivere qualcosina più avanti.</p>
<p><strong>Security is a process, not a result</strong> (sia chiaro in partenza&#8230;)</p>
<p><strong>Security a livello di sistema</strong></p>
<p>Questo è il compito del sistemista &#8230; effettivamente c&#8217;è bisogno di parecchio tempo per raffinare la tecnica e centralizzare le politiche in un layer di controllo non troppo invasivo.</p>
<p>Prima di iniziare a stilare qualche linea di codice e iniziare a riconfigurare mezza /etc è un consiglio confrontarsi con lo sviluppatore. Bisogna tener conto delle effettive esigenze del developer: upload (accesso ftp per lo spostamento di file) , directory con permessi di scrittura lato utenza apache (chmod www-data dir ), parametri dimensionali (massimo tempo di esecuzione script), necessità di reloadare servizi (accesso ssh), accettare traffico da e verso determinati ip e porte.</p>
<p>Il bello della configurazione di un server è che ogni volta che ne andrete a creare uno nuovo vi verrà sempre più naturale orientarlo verso sicurezza e performance, ovviamente se avete voglia di imparare e tenervi aggiornati!</p>
<p>Stilata la lista delle necessità dello sviluppatore iniziamo a modificare le configurazioni più &#8220;critiche&#8221;.</p>
<p>Dividiamo in due rami il nostro compito: network security e file system security, iniziamo a leggere le specifiche e trarre le conclusioni. Il server web ospiterà un cms php/mysql, dovrà essere permesso l&#8217;invio di mail, il webmaster dovrà modificare i file della htdocs, e restartare o stoppare apache e mysql. Installiamo una LAMP e phpmyadmin per l&#8217;amministrazione del DB, qmail per l&#8217;invio delle mail, il demone ssh per permettere &#8220;ftp&#8221; over SSH (quindi niente proftpd o simili) e la gestione dei demoni (via sudo darete la possibilità all&#8217;utente webmaster di compiere quelle determinate operazioni&#8230;)</p>
<p>Network security</p>
<pre>#netstat -l -n -p -t -u -w
Active Internet connections (only servers)
Proto  Local Address         PID/Program name
tcp    127.0.0.1:3306        31920/mysqld
tcp    192.168.168.168:80    15695/apache
tcp    192.168.168.168:22    26850/sshd
tcp    127.0.0.1:25          15809/tcpserver</pre>
<p>L&#8217;elenco delle porte in ascolto sul server, comprende i vari protocolli ma esclude i socket unix (canali di comunicazione fra ad esempio apache e mysql) e qualche colonna poco utile a fini didattici.</p>
<pre>#nmap -sS 192.168.168.168

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http</pre>
<p>Nmap finished: 1 IP address (1 host up) scanned in 0.578 seconds</p>
<p>Perfetto (siamo ancora sprovvisti di firewall) vengono riconosciute da nmap le porte dei servizi che saranno contattabili dal segmento pubblico e nn solo da localhost: apache sulla 80 e ssh sulla 22</p>
<p>Come fare a disabilitare i servizi di default? Semplicemente commentate le entry relative nei file di configurazione sotto /etc e sotto /etc/init.d per i file di configurazione come quello di qmail. E&#8217; inutile lasciare servizi che non dovranno essere raggiungibili dal mondo esterno in ascolto. Meglio bindarli su localhost. Su Debian date uno sguardo /etc/inetd.conf /etc/init.d/* e /etc/default</p>
<p><strong>IPTABLES</strong></p>
<p>Per completare la nostra configurazione di rete non rimane che scrivere un piccolo firewall da mettere sulla macchina, che rimarrà cmq. in dmz dietro a un altro firewall un po&#8217; più corposo. La politica che preferisco è quella del DROP, check del set di regole e in caso di pacchetto non contemplato loggo e droppo. Loggo cmq. tutti i tentativi di accesso verso ssh, molti cambiano porta per l&#8217;accesso ssh ( sempre molta fantasia.. 220,2200,222,2222), tuttavia non sento questa necessità perchè permetto l&#8217;accesso solo da determinati IP o classi se dinamici.</p>
<p>#policy in drop<br />
/sbin/iptables -t filter -P INPUT DROP</p>
<p>#loggo tentativi ssh<br />
/sbin/iptables -t filter -A INPUT -p tcp -m state &#8211;state NEW &#8211;dport 22 -j LOG &#8211;log-prefix ***SSH*** &#8211;log-level ERR</p>
<p>#permetto in input connessioni già &#8220;fidate&#8221;<br />
/sbin/iptables -t filter -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT</p>
<p>#permetto http da tutti<br />
/sbin/iptables -t filter -A INPUT -p tcp &#8211;dport 80 -j ACCEPT</p>
<p>#permetto ssh da client fidati<br />
/sbin/iptables -t filter -A INPUT -s 192.168.168.169 -p tcp &#8211;dport 22 -j ACCEPT<br />
/sbin/iptables -t filter -A INPUT -s 45.98.45.98 -p tcp &#8211;dport 22 -j ACCEPT</p>
<p>#loggo input con dest non ok<br />
/sbin/iptables -t filter -A INPUT -j LOG &#8211;log-level ERR &#8211;log-prefix &#8220;input: &#8221;</p>
<p>#e droppo<br />
/sbin/iptables -t filter -A INPUT -j DROP</p>
<p>Il firewall da mettere direttamente sul server è abbastanza completo, megli lavorare più massicciamente sul firewall con eth con ip esterno, anche per effettuare analisi sulla rete senza dover disattivarlo ogni volta.<br />
Per salvare le nostre regole</p>
<p>#iptables-save > /root/fw<br />
#chmod 600 /root/fw</p>
<p>ed eventuale restore</p>
<p>iptables-restore < /root/fw</p>
<p>oppure crearsi uno script bash iniziando con</p>
<p>#!/bin/sh</p>
<p>Per quanto riguarda SSH modificate le seguenti entries nelfile /etc/ssh/sshd_config</p>
<pre>Port 22
ListenAddress 192.168.168.168
Protocol 2
PermitRootLogin no
AllowUsers texilee webmaster</pre>
<p>e reload</p>
<p>/etc/init.d/ssh restart</p>
<p><strong>File System</strong><br />
E' cosa buona non creare una sola partizione / ma suddividere in base alle esigenze il FS in diverse partizioni e montarle in maniera diversa. Le più critiche sono la /tmp e la /var, se nella prima è di moda parcheggiarci rootkit nella seconda il problema può essere causa di DOS per log "impazziti" che nel giro di poco tempo riempiono il filesystem. Appurato che non lanceremo nulla dalla /tmp poichè i nostri script e binari risiedono da tutt'altra parte possiamo impedire a livello di filesystem l'esecuzione di codice dall'interno di tmp modificando il file /etc/fstab in questa maniera</p>
<p>/dev/hda2 /tmp ext3 nodev,nosuid, noexec 0 0</p>
<p>Può capitare (tipico esempio uno dei centinaia bachi di tipo "esecuzione di codice arbitrario" di prodotti php open source) che un attaccante ti sfondi la macchina e parcheggi nella /tmp il suo simpatico rootkit, ti hanno appena modificato ls e netstat e non te ne puoi accorgere se non facendo delle analisi da un'altra macchina messa in eth promiscous mode... tornano utili un paio di tools: <strong>samhain chkrootkit</strong></p>
<p>Samhain crea un database con "firme" di file di sistema presenti al momento della esecuzione del tool, record contenenti valori quali data dimensione inode. Il demone controlla periodicamente l'integrità dei file sul FS con le informazioni contenute nel suo DB ed in caso di incongruenza si occupa di mandare una mail all'indirizzo specificato nel file di configurazione. Su Debian apt-get install samhain chkrootkit , i file di configurazione come al solito sotto /etc.</p>
<p>Per concludere trovo estremamente interessante costruire qualche script bash per tracciare quelle situazioni di gravità (disco pieno, troppe connessioni dallo stesso ip, carico di lavoro troppo elevato... argomento di prossimi post ) e l'utilizzo di <strong>atsar </strong>(apt-get install atsar) per avere uno storico del carico di lavoro e poter rintracciare con facilità nei log i motivi di "sbalzi" particolarmente elevati di carico.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/hardening-debian-linux-lamp-servers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache 1.3 stato dei processi figli script PHP</title>
		<link>http://www.texilee.it/apache-13-stato-dei-processi-figli-script-php</link>
		<comments>http://www.texilee.it/apache-13-stato-dei-processi-figli-script-php#comments</comments>
		<pubDate>Fri, 09 Jun 2006 18:14:16 +0000</pubDate>
		<dc:creator>texilee</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://texilee.gruppoinfo.it/2006/06/09/linux/apache-13-stato-dei-processi-figli-script-php/</guid>
		<description><![CDATA[Apache 1.3 su Unix è un server Web basato su processi. Il programma Apache, al suo avvio, genera (fork) svariati processi figli; con il fork un processo primario genera copie identiche di se stesso, chiamate figli. Ognuno di tali figli può servire una richiesta indipendente dalle altre, con il vantaggio di migliorare la stabilità: se [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Apache 1.3</strong> su Unix è un server Web basato su processi. Il programma Apache, al suo avvio, genera (<strong>fork</strong>) svariati processi figli; con il fork un processo  primario genera copie identiche di se stesso, chiamate <em>figli</em>.  Ognuno di tali figli può servire una richiesta indipendente dalle altre, con il vantaggio di migliorare la stabilità: se uno di tali figli ha un comportamento anomalo  (va fuori controllo o ha perdite di memoria) può essere interrotto senza alcun effetto sugli altri. La stabilità è conseguita a spese delle prestazioni.  Nella maggior parte dei sistemi Unix, la creazione di processi e il cambiamento  del contesto (assegnazione di tempo del processore a ogni processo) sono operazioni costose in termini di risorse di sistema, dal momento che i processi sono isolati gli uni dagli altri e non possono quindi facilmente condividere codice e dati. [www.pluto.it]</p>
<p>Per controllare lo &#8220;stato&#8221; di ognuno dei processi figli di apache via php si può utilizzare questo semplice script, la consultazione dello stato dei processi risulta estremamente rapida.</p>
<pre>

&lt;?php

echo "&lt;h3&gt;Apache Forked  Status Viewer&lt; /h3&gt;";

$cmd = '/bin/ps --User www-data -o \'%p %C\'';

exec($cmd,$status);

foreach ($status as $val)
echo '&lt;br /&gt;'.$val;

?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.texilee.it/apache-13-stato-dei-processi-figli-script-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
