En el artículo sobre seguridad técnica en un sistema Ubuntu hablé por primera vez de awstat como herramienta para monitorizar los accesos a páginas web. Veamos como añadir restricciones de acceso y geolocalización de IPs.
La configuración base la podemos mejorar añadiendo autenticación, para esto tendremos que tener activos varios módulos de nuestro servidor apache:
a2enmod auth_basic a2enmod authn_file a2enmod authz_user
Editamos el fichero donde hayamos definido el dominio de nuestra página web, por ejemplo “/etc/apache2/sites-enabled/000-ejemplo.com” y debajo de:
ScriptAlias /cgi-bin/awstats.pl /usr/lib/cgi-bin/awstats.pl
Añadimos:
<Directory /usr/lib/cgi-bin/awstats.pl> AllowOverride All Options FollowSymLinks Order allow,deny allow from all AuthName "Acceso restringido a Estadísticas" AuthType basic AuthUserFile /etc/awstats/htpasswd.ejemplo.com require valid-user </Directory>
De esta forma estamos indicando a Apache que queremos autenticar los usuarios que accedan a “awstats.pl” y que los usuarios/contraseñas los tiene que comprobar en el fichero “/etc/awstats/htpasswd.ejemplo.com”. Así que necesitamos crear este último fichero con los usuarios que necesitemos:
htpasswd -cm /etc/awstats/htpasswd.ejemplo.com usuario1 htpasswd -m /etc/awstats/htpasswd.ejemplo.com usuario2
Para mayor seguridad, en la configuración de awstats (p.ej. ‘/etc/awstats/awstats.ejemplo.com.conf’) indicamos que únicamente queremos que awstats se muestre a usuarios autenticados:
AllowAccessFromWebToAuthenticatedUsersOnly=1
Reiniciamos apache y ya tenemos restringido el acceso a awstats:
/etc/init.d/apache reload
Por otra parte, si queremos añadir geolocalización de IPs a awstats:
sudo -s apt-get install liburi-perl libgeo-ip-perl mkdir /usr/local/share/GeoIP cd /usr/local/share/GeoIP wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz wget http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz gzip -d *
Y añadimos a la configuración de awstats (p.ej. ‘/etc/awstats/awstats.ejemplo.com.conf’):
LoadPlugin="geoip GEOIP_STANDARD /usr/local/share/GeoIP/GeoIP.dat" LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoLiteCity.dat" LoadPlugin="geoip_org_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoIPASNum.dat"
Listo una configuración modelo de awstats por si resulta de utilidad, donde también se incluyen secciones extra especialmente pensadas por si la página en cuestión es un wordpress:
LogFile="/var/log/apache2/vhosts/ejemplo.com.access.log" LogFormat=1 DNSLookup=1 DirData="/var/lib/awstats/ejemplo.com/" DirCgi="/cgi-bin" DirIcons="/icon" SiteDomain="ejemplo.com" HostAliases="www.ejemplo.com" # Separated by spaces AllowToUpdateStatsFromBrowser=1 AllowFullYearView=3 AllowAccessFromWebToAuthenticatedUsersOnly=1 SkipFiles="REGEX[^\/wp-admin] REGEX[^\/wp-includes\/wlwmanifest.xml] REGEX[^\/cgi-bin\/awstats.pl] REGEX[^\/icons] REGEX[^\/w00tw00t\.at\.ISC\.SANS\.DFind]" SkipHosts="REGEX[^192\.168\.]" NotPageList="css js class gif jpg jpeg png bmp ico swf" # what file extensions will not be counted as Page Views or Downloads #LevelForWormsDetection=2 # Full detection (decreases speed by 15% #ShowWormsStats=HBL # "/js/awstats_misc_tracker.js" needs to be added to webpage # More info: http://awstats.sourceforge.net/docs/awstats_config.html#MiscTrackerUrl MiscTrackerUrl="/js/awstats_misc_tracker.js" ShowScreenSizeStats=1 ShowMiscStats=1 # Show domains/country chart # # Context: Web, Streaming, Mail, Ftp # # Default: PHB, Possible column codes: PHB ShowDomainsStats=UVPHB LoadPlugin="tooltips" # Help LoadPlugin="decodeutfkeys" # makes it possible to show keywords and keyphrases correctly using national characters LoadPlugin="geoip GEOIP_STANDARD /usr/local/share/GeoIP/GeoIP.dat" LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoLiteCity.dat" LoadPlugin="geoip_org_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoIPASNum.dat" ExtraSectionName1="Wordpress entries" # Code 304: Not modified # Code 200: OK ExtraSectionCodeFilter1="200 304" # http://domain/?p=100 ExtraSectionCondition1="URL,\/" ExtraSectionFirstColumnTitle1="Entry ID" ExtraSectionFirstColumnValues1="QUERY_STRING,p=([^&]+)" ExtraSectionFirstColumnFormat1="www.ejemplo.com/?p=%s" ## ## U = Unique visitors ## V = Visits ## P = Number of pages ## H = Number of hits (or mails) ## B = Bandwith (or total mail size for mail logs) ## L = Last access date ## E = Entry pages ## X = Exit pages ## C = Web compression (mod_gzip,mod_deflate) ExtraSectionStatTypes1=UVPHBL ExtraSectionAddAverageRow1=0 ExtraSectionAddSumRow1=1 MaxNbOfExtra1=10 MinHitExtra1=1 ExtraSectionName2="Wordpress pages" ExtraSectionCodeFilter2="200 304" ExtraSectionCondition2="URL,\/" ExtraSectionFirstColumnTitle2="Page ID" ExtraSectionFirstColumnValues2="QUERY_STRING,page_id=([^&]+)" ExtraSectionFirstColumnFormat2="www.ejemplo.com/?page_id=%s" ExtraSectionStatTypes2=UVPHBL ExtraSectionAddAverageRow2=0 ExtraSectionAddSumRow2=1 MaxNbOfExtra2=10 MinHitExtra2=1 ExtraSectionName3="Top downloads" ExtraSectionCodeFilter3="200 304" ExtraSectionCondition3="URL,(.*((\.diff)|(\.doc)|(\.pdf)|(\.rtf)|(\.sh)|(\.tgz)|(\.zip)|(\.bz2)|(\.gz)))" ExtraSectionFirstColumnTitle3="Download" ExtraSectionFirstColumnValues3="URL,(.*)" ExtraSectionFirstColumnFormat3="%s" ExtraSectionStatTypes3=HBL ExtraSectionAddAverageRow3=0 ExtraSectionAddSumRow3=1 MaxNbOfExtra3=10 MinHitExtra3=1