{"id":86,"date":"2013-12-26T16:00:00","date_gmt":"2013-12-26T16:00:00","guid":{"rendered":"http:\/\/esferas.org\/msqlu\/2013\/12\/26\/awstats-en-un-servidor-publico\/"},"modified":"2013-12-26T16:00:00","modified_gmt":"2013-12-26T16:00:00","slug":"awstats-en-un-servidor-publico","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2013\/12\/26\/awstats-en-un-servidor-publico\/","title":{"rendered":"awstats en un servidor p\u00fablico &#8230;"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Imagen miniatura para web_server.png\" src=\"https:\/\/esferas.org\/mt\/msqlu\/assets_c\/2013\/09\/web_server-miniatura-autox119-45.png\" class=\"mt-image-left\" style=\"float: left; margin: 0 20px 20px 0;\" height=\"119\" width=\"100\" \/>&#8230; pues casi que no.<\/p>\n<p>Y no es \u00fanicamente por no abrir otro frente m\u00e1s con un script CGI pelado y desantendido, es que el acceso a los registros de los servidores virtuales me plantea problemas que no ten\u00eda hasta hace nada.<\/p>\n<\/p>\n<p><!--more--><\/p>\n<p>En la m\u00e1quina p\u00fablica de mi empresa tengo varios servidores virtuales con un aplicaci\u00f3n <em>Drupal<\/em>, un cat\u00e1logo de fotos con <em>Piwigo<\/em> y varios \u00e1rboles de documentos e im\u00e1genes que servimos al mundo mundial. Hace poco me plantearon la duda de si se estaban viendo o no las p\u00e1ginas y cu\u00e1ntos llegaban all\u00ed desde las b\u00fasquedas. Como no soy partidario de incluir anal\u00edticas de terceros, y tampoco tienen mucha idea de lo que quieren realmente,\u00a0 pens\u00e9 en utilizar mecanismos pasivos de an\u00e1lisis. A fin de cuentas el servidor web ya est\u00e1 generando un mont\u00f3n de informaci\u00f3n.<\/p>\n<p>Buscando software en Debian encontr\u00e9 <a href=\"http:\/\/www.awstats.org\">awstats<\/a> (escrito en Perl) y me pareci\u00f3 que pod\u00eda dar resultado. Una vez instalado, y antes siquiera de configurarlo, ya me percat\u00e9 de los problemas que me iba a encontrar en forma de lluvia de mensajes de error. Por lo visto la instalaci\u00f3n predeterminada se ejecuta cada media hora y no se le olvida nunca informar a su administrador favorito de todo lo que falta a\u00fan por retocar.<\/p>\n<p>Leyendo la documentaci\u00f3n del paquete me encontr\u00e9 con otro problema m\u00e1s: el acceso a los registros del servidor web. <em>awstats<\/em> funciona con el usuario predeterminado para scripts CGI (<em>www-data<\/em>) y pod\u00eda elegir entre hacerlo miembro del grupo de administraci\u00f3n o hacer que los registros estuviesen directamente a su alcance. La primera opci\u00f3n no me convenci\u00f3 nada. Este usuario est\u00e1 creado precisamente para reducir la gravedad de una intrusi\u00f3n a trav\u00e9s del servidor web y la otra &#8230; puf, como que tampoco me hac\u00eda grac\u00eda dar acceso a todo quisque a estos registros; demasiada informaci\u00f3n con demasiado acceso.<\/p>\n<p>As\u00ed que me lo he planteado de otra manera:<\/p>\n<ul>\n<li>El acceso a las estad\u00edsticas va a estar limitado al personal de la empresa, ergo, no es necesario que exista en el servidor de producci\u00f3n.<\/li>\n<li>El servidor p\u00fablico ya est\u00e1 sobrecargado de trabajo; agradecer\u00e1 no trabajar m\u00e1s de la cuenta.<\/li>\n<li>Las estad\u00edsticas van a consultarse, como mucho, una vez al d\u00eda. No es preciso que exista una actualizaci\u00f3n cont\u00ednua.<\/li>\n<li>Traerme los registros del servidor a la intranet elimina todos los inconvenientes de acceso.<\/li>\n<li>Puedo aprovechar para ordenar el rotado de estos registros e integrar en el proceso el env\u00edo de dichos archivos.<\/li>\n<\/ul>\n<p>As\u00ed que me he puesto a ello actuando en dos frentes al mismo tiempo: el servidor de producci\u00f3n y un servidor interno. Para el primero aprovecho que tengo escrito un paquete Debian con ajustes predeterminados para \u00e9l y en el que voy a situar la configuraci\u00f3n de logrotate, indicando que cada vez que se rote se transfieran los archivos al servidor interno. En \u00e9ste voy a instalar <em>awstats<\/em> y le dejar\u00e9 v\u00eda libre para que trabaje como m\u00e1s le guste. El acceso v\u00eda CGI a las estad\u00edsticas se situar\u00e1 en el servidor de administraci\u00f3n, con los controles que ya tengo para el personal.<\/p>\n<h3>Detalles constructivos<\/h3>\n<p>El archivo de rotaci\u00f3n de logs que muestro a continuaci\u00f3n est\u00e1 situado dentro del directorio <em>debian\/<\/em> de construcci\u00f3n del paquete. Concretamente como <em>debian\/paquete.virtualhosts.logrotate<\/em> y ser\u00e1 instalado bajo <em>\/etc\/logrotate.d\/virtuahosts<\/em>.<\/p>\n<pre><span style=\"color: #696969;\">#<\/span>\n<span style=\"color: #696969;\">#   Servidores web virtuales <\/span>\n<span style=\"color: #696969;\">#<\/span>\n\n<span style=\"color: #40015a;\">\/var\/log\/virtual\/admin.empresa.com<\/span><span style=\"color: #40015a;\">\/<\/span><span style=\"color: #808030;\">*<\/span><span style=\"color: #800000; font-weight: bold;\">.<\/span>log \n<span style=\"color: #40015a;\">\/var\/log\/virtual\/beta.empresa.com<\/span><span style=\"color: #40015a;\">\/<\/span><span style=\"color: #808030;\">*<\/span><span style=\"color: #800000; font-weight: bold;\">.<\/span>log \n<span style=\"color: #40015a;\">\/var\/log\/virtual\/blog.empresa.com<\/span><span style=\"color: #40015a;\">\/<\/span><span style=\"color: #808030;\">*<\/span><span style=\"color: #800000; font-weight: bold;\">.<\/span>log \n<span style=\"color: #40015a;\">\/var\/log\/virtual\/old.empresa.com<\/span><span style=\"color: #40015a;\">\/<\/span><span style=\"color: #808030;\">*<\/span><span style=\"color: #800000; font-weight: bold;\">.<\/span>log \n<span style=\"color: #40015a;\">\/var\/log\/virtual\/static.empresa.com<\/span><span style=\"color: #40015a;\">\/<\/span><span style=\"color: #808030;\">*<\/span><span style=\"color: #800000; font-weight: bold;\">.<\/span>log \n<span style=\"color: #40015a;\">\/var\/log\/virtual\/www.empresa.com<\/span><span style=\"color: #40015a;\">\/<\/span><span style=\"color: #808030;\">*<\/span><span style=\"color: #800000; font-weight: bold;\">.<\/span>log \n<span style=\"color: #800080;\">{<\/span>\n    <span style=\"color: #696969;\">#   Rotaci\u00f3n diaria si superan el megabyte y no conservar m\u00e1s de 30<\/span>\n    rotate          <span style=\"color: #008c00;\">30<\/span>\n    daily\n    size            1M\n\n    <span style=\"color: #696969;\">#   No comprimir registros<\/span>\n    nocompress\n\n    <span style=\"color: #696969;\">#   Notificar al administrador <\/span>\n    mail            admin@empresa<span style=\"color: #800000; font-weight: bold;\">.<\/span>es\n\n    <span style=\"color: #696969;\">#   Ignorar el archivo si no existe y no hacer nada <\/span>\n    <span style=\"color: #696969;\">#   si \u00e9ste est\u00e1 vac\u00edo<\/span>\n    missingok\n    notifempty\n\n    <span style=\"color: #696969;\">#   Permisos y propiedad del nuevo<\/span>\n    create <span style=\"color: #008c00;\">640<\/span> root adm\n    \n    <span style=\"color: #696969;\">#   Ejecutar lo siguiente justo al final de procesarlos todos<\/span>\n    sharedscripts\n    postrotate\n        <span style=\"color: #800000; font-weight: bold;\">if<\/span> <span style=\"color: #808030;\">[<\/span> <span style=\"color: #44aadd;\">-x<\/span> <span style=\"color: #40015a;\">\/usr\/bin\/weblogs2intranet<\/span> <span style=\"color: #808030;\">]<\/span><span style=\"color: #800080;\">;<\/span> <span style=\"color: #800000; font-weight: bold;\">then<\/span> begin <span style=\"color: #0f69ff;\">\\<\/span>\n            weblogs2intranet $<span style=\"color: #808030;\">*<\/span> <span style=\"color: #0f69ff;\">\\<\/span>\n        <span style=\"color: #800000; font-weight: bold;\">fi<\/span><span style=\"color: #800080;\">;<\/span> <span style=\"color: #0f69ff;\">\\<\/span>\n    endscript\n<span style=\"color: #800080;\">}<\/span>\n<\/pre>\n<p>Para verificar la s\u00edntaxis del archivo podemos emplear el propio programa de rotaci\u00f3n de la siguiente forma:<\/p>\n<pre>$ \/usr\/sbin\/logrotate -d debian\/<em>paquete.virtualhosts.logrotate<\/em> <br \/>reading config file debian\/<em>paquete.virtualhosts.logrotate<\/em><br \/><br \/>Handling 1 logs<br \/><br \/>rotating pattern: \/var\/log\/virtual\/admin.empresa.com\/*.log <br \/>\/var\/log\/virtual\/beta.empresa.com\/*.log <br \/>\/var\/log\/virtual\/blog.empresa.com\/*.log <br \/>\/var\/log\/virtual\/old.empresa.com\/*.log <br \/>\/var\/log\/virtual\/static.empresa.com\/*.log <br \/>\/var\/log\/virtual\/www.empresa.com\/*.log <br \/> 1048576 bytes (30 rotations)<br \/>empty log files are not rotated, old logs mailed to admin@empresa.es<br \/>not running postrotate script, since no logs were rotated<\/pre>\n<p>El script invocado tras el rotado de los registros se limita a utilizar rsync para enviar los cambios al servidor de la intranet. En \u00e9ste el servicio de sincronizaci\u00f3n est\u00e1 configurado as\u00ed:<\/p>\n<pre>secrets <span style=\"color: #800000; font-weight: bold;\">file<\/span>    <span style=\"color: #808030;\">=<\/span> \/etc\/rsyncd.secrets\nstrict modes    <span style=\"color: #808030;\">=<\/span> yes\nhosts allow     <span style=\"color: #808030;\">=<\/span> xxx.xxx.xxx.xxx\n<br \/>...<br \/>\n<span style=\"color: #7f9fbf; font-weight: bold;\">[weblogs]<\/span>\n        <span style=\"color: #800000; font-weight: bold;\">path<\/span>            <span style=\"color: #808030;\">=<\/span> \/srv\/backups\/weblogs\n        comment         <span style=\"color: #808030;\">=<\/span> Registros de servidores web\n        read only       <span style=\"color: #808030;\">=<\/span> no<br \/>        write only      = no <br \/>        use chroot      = yes <br \/>        transfer logging= yes<br \/>        uid             <span style=\"color: #808030;\">=<\/span> www-data\n        gid             <span style=\"color: #808030;\">=<\/span> www-data\n        auth users      <span style=\"color: #808030;\">=<\/span> weblogs\n<\/pre>\n<p>La cla\u00fasula <em>hosts allow<\/em> incluye la direcci\u00f3n IP fija del servidor exterior m\u00e1s todas aquellas internas que sean necesarias para el resto de los bloques de configuraci\u00f3n. El usuario <em>weblogs<\/em>, obviamente, se a\u00f1ade al archivo <em>\/etc\/rsyncd.secrets<\/em> y el directorio destino debe crearse antes de emplearlo o no funcionar\u00e1.<\/p>\n<p>Desde el servidor de producci\u00f3n la transmisi\u00f3n de los archivos registro es tan sencilla como invocar al programa rsync (a\u00f1adido como dependencia al paquete) con los siguientes par\u00e1metros:<\/p>\n<pre>rsync -a --password-file \/etc\/empresa\/rsync.client \\<br \/>    \/var\/log\/virtual \/var\/log\/apache2 \\<br \/>    weblogs@empresa.net::weblogs<\/pre>\n<p>Hay m\u00e1s cosas, pero creo que lo principal est\u00e1. En otra entrada hablar\u00e9 de la segunda parte del proceso: el an\u00e1lisis de los registros y la presentaci\u00f3n de los resultados.<\/p>\n<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8230; pues casi que no. Y no es \u00fanicamente por no abrir otro frente m\u00e1s con un script CGI pelado y desantendido, es que el acceso a los registros de los servidores virtuales me plantea problemas que no ten\u00eda hasta hace nada.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"1","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[6],"tags":[145,146,44],"class_list":["post-86","post","type-post","status-publish","format-standard","hentry","category-debian","tag-awstats","tag-logrotate","tag-servicios-web"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/86","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=86"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/86\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=86"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=86"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=86"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}