P12. Servidor web + SSL + AWStats

De Lordwektabyte Wiki
Salta a la navegació Salta a la cerca

Enunciat

A partir d'una instal·lació CentOS 7 mínima, instal·la un servidor web Apache, habilita servir web des dels home dels usuaris del sistema i activa la vista d'estadístiques mitjançant AWstats.

Procediment

Partiré d'una màquina virtual amb IP igual a 192.168.56.250 i utilitzaré SSH des del host amfitrió per a enviar les comandes.

Servidor web Apache

Instal·lació del servidor web

Primer de tot instal·larem el paquet httpd amb les següents comandes:

yum install httpd -y
M08UF2P121.png


Una vegada instal·lat, podem engegar el servei amb

systemctl start httpd

i habilitar la càrrega automàtica a l'arrencada amb

systemctl enable httpd

Llavors, haurem de permetre el port 80 i el 443 a través del Firewall per tal de poder accedir a la màquina des de qualsevol màquina de la xarxa; també desactivarem el selinux.

firewall-cmd --add-service={http,https} --permanent
firewall-cmd --reload
setenforce 0 #Solució temporal

Una vegada fet això, si naveguem a http://192.168.56.250 veurem la pàgina per defecte de l'Apache:

M08UF2P122.png


Habilitar els directoris web d'usuari (userdir)

Editarem el fitxer /etc/httpd/conf.d/userdir.conf de la manera següent:

  • línia 17:
    #UserDir disabled
  • línia 24:
    UserDir public_html
  • línia 32:
    AllowOverride All
  • línia 33:
    Options None

De manera que el resultat final sigui:

#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
#
# The path to the end user account 'public_html' directory must be
# accessible to the webserver userid.  This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a "403 Forbidden" message.
#
<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    #UserDir disabled

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    #
    UserDir public_html
</IfModule>

#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
<Directory "/home/*/public_html">
    AllowOverride All
    Options None
    Require method GET POST OPTIONS
</Directory>

Com que hem modificat arxius de configuració de l'Apache, reiniciarem per a carregar els canvis:

systemctl restart httpd

Modificarem l'esquelet de creació del directori home dels usuaris

El directori /etc/skel és la plantilla per a crear els homes dels usuaris; de manera que si dins de skel afegeixo un directori amb un arxiu a dins, aquest s'anirà replicant per a cada nou usuari que creem. Creo un directori public_html

mkdir /etc/skel/public_html

Creo un arxiu index.html:

vi /etc/skel/public_html/index.html

Amb el contingut:

<h1>PÀGINA PER DEFECTE D'USUARI</h1>

Modificarem l'UMASK per defecte del home dels usuaris

UMASK 022

Si posem l'UMASK com a 022, els directoris d'usuari nous es crearan amb permisos tipus 755, de manera que Apache pugui accedir als homes per a llegir els userdirs.

Prova de funcionament USERDIR

Crearem un usuari nou

useradd guillem

Veiem que el seu home existeix, i que dins hi ha el public_html que hem afegit al skel.

M08UF2P123.png


Quan naveguem al home de l'usuari que hem creat i ens sortirà el index.html que hem creat a l'apartat anterior



Protegir amb un certificat SSL autosignat

El procediment per a crear aquest certificat és més o menys llarg però es pot documentar de manera simple. Els passos a seguir són els següents:

Crearem una clau privada al servidor lligada al nom de domini del web

És important que el nom de domini que escrivim coincideixi amb el nom de domini sota el qual tenim la web penjada; però com que aquesta pràctica la fem en local, no és crucial ja que no sortirà a Internet). Podem introduir una paraula de pas per a aquesta clau privada, que ens permetrà una capa de seguretat per a autenticar-nos a nosaltres mateixos com a propietaris d'aquesta clau; però tampoc és obligatòria.
[root@m08p01 public_html]# openssl genrsa -des3 -out practicam09.local.key 2048
Generating RSA private key, 2048 bit long modulus
.......................................................................................+++
...........+++
e is 65537 (0x10001)
Enter pass phrase for practicam09.local.key:
Verifying - Enter pass phrase for practicam09.local.key:

Crearem un Certificate Signing Request per a obtenir el certificat a partir de la clau privada generada al punt anterior

openssl req -new -key practicam08.local.key -out practicam08.local.csr

[root@m08p01 public_html]# openssl genrsa -des3 -out practicam08.local.key 2048
Generating RSA private key, 2048 bit long modulus
.......................................................................................+++
...........+++
e is 65537 (0x10001)
Enter pass phrase for practicam08.local.key:
Verifying - Enter pass phrase for practicam08.local.key:
[root@m08p01 public_html]# openssl req -new -key practicam08.local.key -out practicam09.local.csr
Enter pass phrase for practicam09.local.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

He deixat els apartats en blanc per agilitat en el procés.

El que ens demana primer és la paraula de pas de la clau privada per a poder-ne saber el contingut. Llavors ens va demanant diverses dades que s'inclouran en el certificat que podrem extreure a partir d'aquest CSR com ara el codi de país, l'estat, ciutat, nom d'organització, secció, nom comú (que hauria de coincidir amb el nom de domini que volem protegir), i una adreça de correu de contacte. Aquestes dades seran públiques per a tothom que pugui accedir al nostre certificat, per exemple, qualsevol client que accedís a la nostra web xifrada amb el certificat que extreiem amb aquest CSR de manera que podem evitar dades que no volguem publicar (adreça de correu personal, potser).

Crear el certificat a partir del CSR i la clau privada

openssl x509 -req -days 365 -in practicam08.local.csr -signkey practicam08.local.key -out practicam08.local.crt

[root@m08p01 public_html]# openssl x509 -req -days 365 -in practicam08.local.csr -signkey practicam08.local.key -out practicam08.local.crt
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting Private key
Enter pass phrase for practicam08.local.key:
En aquest pas hem de definir un temps de caducitat del certificat (expiració). En aquest cas, aquest certificat deixarà de ser vàlid d'aquí un any.
Una vegada generat el certificat, mourem els 2 arxius necessaris (Private Key i certificat) al directori per defecte on l'Apache els pot llegir /etc/pki/tls/ i els col·locarem al subdirectori on correspongui: certs o bé private per al certificat i la clau privada, respectivament.
mv practicam08.local.crt /etc/pki/tls/certs
mv practicam08.local.key /etc/pki/tls/private

Instal·lar el mòdul SSL per a l'Apache

Apache és un software molt modular que permet un funcionament bàsic amb la instal·lació de sèrie però es pot extendre amb mòduls addicionals. Per tal de poder oferir suport per a HTTPS amb el mòdul SSL corresponent que instal·larem
install mod_ssl

Amb la instal·lació d'aquest mòdul se'ns crearà un arxiu de configuració nou al directori de configuració de l'Apache que és el que s'encarrega de les directives per al default site que se servirà per HTTPS.

Aplicar el certificat al servidor Apache

L'últim pas és dir a Apache que pel port 443 (defecte per a HTTP+SSL →HTTPS) xifri les comunicacions mitjançant aquest certificat que hem creat. Per no complicar-nos massa, modificaré l'arxiu de configuració per defecte que defineix les directives del meu web server pel que fa a HTTPS: /etc/httpd/conf.d/ssl.conf

Buscarem la secció corresponent al certificat i editarem per tal de definir-hi la ruta al certificat creat.

(...)
#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/practicam08.local.crt
(...)

Llavors buscarem la secció de la clau privada i definirem la ruta a la lau privada:

(...)
#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/practicam08.local.key
(...)

Reiniciar servidor Apache per aplicar els canvis

Farem un systemctl restart httpd de manera que Apache recarregui la nova configuració amb el certificat triat. Em demana la contrasenya de la clau privada.
systemctl restart httpd
Enter SSL pass phrase for fe80::955f:5554:3436:ba19:443 (RSA) : ****

Forçar accés per SSL

Modificarem l'arxiu /var/www/html/.htaccess i hi posarem el següent codi:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

També modificarem l'arxiu de configuració principal per permetre modificacions amb arxius .htaccess:

(...)
<Directory />
    AllowOverride all 
    Require all granted
</Directory>
(...)

Reiniciarem el servei i veurem que si naveguem a http://192.168.56.250/, ens redireccionarà a HTTPS i veurem l'advertència del certificat autosignat. El mateix passarà per a qualsevol userdir que hi accedim: http://192.168.56.250/~guillem

Si naveguem a https://192.168.56.250/~guillem tindrem l'avís del certificat autosignat però la comunicació estarà xifrada


AWStats pic 26

Instal·lació

Primer de tot haurem d'instal·lar el repositori EPEL:

rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

I instal·larem el paquet amb:

yum --enablerepo=epel install awstats

utilitzant el repositori afegit abans.

Configuració

Modificarem l'arxiu de configuració de l'AWStats i modificarem la secció Directory de manera que quedi així, per a poder accedir a les estadístiques des de qualsevol màquina de la xarxa. Per defecte limita l'accés des de localhost.

<Directory "/usr/share/awstats/wwwroot">
    Options None
    AllowOverride None
    <IfModule mod_authz_core.c>
        # Apache 2.4
        Require all granted
    </IfModule>
    <IfModule !mod_authz_core.c>
        # Apache 2.2
        Order allow,deny
        Allow from all
    </IfModule>
</Directory>

El següent pas és configurar l'arxiu de l'AWStats per tal que ens mostri les estadístiques de l'Apache que s'executa en aquell servidor

nano /etc/awstats/awstats.localhost.localdomain.conf

La configuració per defecte hauria de funcionar en el nostre cas. Podem revisar el paràmetre LogFile i fer-lo coincidir amb la ruta on el nostre Apache guarda els logs i comprovar que el SiteDomain correspongui també amb el nom de la màquina que volem monitoritzar. En el nostre cas, com que és una màquina local que no surt a Internet, queda com a localhost.localdomain.

Reiniciarem el servidor web per carregar la nova configuració

systemctl restart httpd

Carregarem les estadístiques inicials a partir de les dades existents fins al moment amb la comanda:

/usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=localhost.localdomain -update

De manera que es faci un populate inicial de les dades recollides.

[root@m08p01 awstats]# /usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=localhost.localdomain -update

Create/Update database for config "/etc/awstats/awstats.localhost.localdomain.conf" by AWStats version 7.7 (build 20180105)
From data in log file "/var/log/httpd/access_log"...
Phase 1 : First bypass old records, searching new record...
Direct access after last parsed record (after line 26)
Jumped lines in file: 26
 Found 26 already parsed records.
Parsed lines in file: 0
 Found 0 dropped records,
 Found 0 comments,
 Found 0 blank records,
 Found 0 corrupted records,
 Found 0 old records,
 Found 0 new qualified records.

Resultat

Podem navegar a la URL http://192.168.56.250/awstats/awstats.pl?config=localhost.localdomain i veurem les estadístiques del nostre servidor:

Podem veure, per exemple, que les peticions s'han fet durant l'octubre i prou, ja que aquest servidor és nou