Práctica 7: Implementación de sitios web sobre HTTPS#

Equipo AMJ-GAB-TPKL

  • Alanis Martínez Jennifer
  • González Arreguín Bryan
  • Torres Partida Karen Larissa

Nombre de Dominio y Dirección IP Pública#

Nombre de Dominio: scrapykoko.ml

IP pública: 20.213.61.249

Instalación y configuración de Apache HTTPD#

Primeramente se instalaron los paquetes apache2 en el equipo con el siguiente comando:

root@scrapykoko:~# apt -qy update
root@scrapykoko:~# apt -qy install apache2

Se revisó su estado en el equipo:

root@scrapykoko:~# systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-06-08 23:01:00 CDT; 23h ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 1421 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
   Main PID: 585 (apache2)
      Tasks: 55 (limit: 1074)
     Memory: 22.7M
        CPU: 4.589s
     CGroup: /system.slice/apache2.service
             ├─ 585 /usr/sbin/apache2 -k start
             ├─1425 /usr/sbin/apache2 -k start
             └─1426 /usr/sbin/apache2 -k start

Jun 08 23:01:00 scrapykoko.ml systemd[1]: Starting The Apache HTTP Server...
Jun 08 23:01:00 scrapykoko.ml systemd[1]: Started The Apache HTTP Server.

Y también que escuchara en el puerto 80:

root@scrapykoko:~# netstat -ntulp | grep apache2
tcp6       0      0 :::443                  :::*                    LISTEN      585/apache2
root@scrapykoko:~# apachectl -S
VirtualHost configuration:
*:80                   is a NameVirtualHost
         default server scrapykoko.ml (/etc/apache2/sites-enabled/000-default.conf:1)

Luego se configuró la directiva ServerName, la cual sirve para configurar el nombre del servidor, en este caso tenía que tener a scrapykoko.ml quedando de la siguiente manera el archivo etc/apache2/conf-available/servername.conf:

root@scrapykoko:~# cat /etc/apache2/conf-available/servername.conf
ServerName scrapykoko.ml

Después se generó la página de índice para el VirtualHost predeterminado, es decir, generemos el archivo /var/www/html/index.html, con el contenido especificado aquí quedando de la siguiente manera:

root@scrapykoko:~# cat /var/www/html/index.html
<!DOCTYPE HTML>
<html>
        <head>
                <meta charset="UTF-8">
                <title>Práctica 7 - Redes 2022-2</title>
                <link href="data:image/x-icon;base64," rel="icon" type="image/x-icon" />
        </head>
        <body>
                <h1>Hola</h1>
                <div>
                        <p>Esta es la página del <code>Equipo-AMJ-GAB-TPKL</code></p>
                        <p>Nuestro dominio DNS es <code>scrapykoko.ml</code></p>
                </div>
                <hr/>
                <code>Redes de Computadoras</code>
        </body>
</html>

Y se revisó con un navegador web, que el servidor respondiera con las siguientes url:

  • http://20.213.61.249/
Prueba con IP pública
  • http://scrapykoko.ml/
Prueba con el nombre de dominio
  • http://www.scrapykoko.ml/
Prueba con www y nombre de dominio

Luego de esto configuramos las directivas básicas de seguridad, haciendo los siguientes cambios en el archivo /etc/apache2/conf-available/security.conf:

  • ServerTokens {Valor}, esta directiva delimita la información que mostrará sobre el servidor en la cabecera de respuesta.

En este caso se escogió su Valor como ProductOnly el cual solo mostrará que estamos usando Apache, ya que sin esta directiva su valor sería FULL la cual mostraría tanto la versión de Apache, como en que sistema se está corriendo por ejemplo UNIX y los módulos que se están usando.

  • ServerSignature {Valor}, esta directiva permite la configuración de un pie de página, la cual se añadirá a los documentos generados por el servidor, este pie puede contener información del servidor como Apache/{Version} ({Sistema}) Server at {IP}, es decir, Apache/2.2 (Debian) Server at 125.25.2.4.

En este caso se escogió su Valor como Off, el cual significa que no va a generar este pie de página, también por defecto es este valor.

  • TraceEnable {Valor}, esta directiva determina qué comportamiento hacer ante las peticiones TRACE.

En este caso se escogió el Valor como Off, el cual significa que no se permiten esas peticiones haciendo que el servidor regrese al cliente 405 (METHOD not allowed), su valor por defecto de esta directa es On el cual sí permite estas peticiones.

  • DirectoryMatch {regex}, esta directiva encapsula directivas que se le aplicarán a los directorios del sistema de archivos que coincidan con la expresión regular, en este caso tenemos:
<DirectoryMatch "/\.git">
   Require all denied
</DirectoryMatch>

Es decir, la directiva Require se la aplicará a los directorios .git, ahora la directiva Require es la que se encarga de comprobar si el usuario auntenticado tiene permiso para acceder a los recursos, en este caso usamos all denied, que significa no se permite el acceso nunca, por lo que lo anterior está diciendo que no se permite acceder nunca a los directorios .git.

Dando como resultado el siguiente archivo

Configuración de SSL/TLS en Apache HTTPD#

Primeramente se habilitó el módulo y el VirtualHost de SSL con los siguientes comandos:

root@scrapykoko:~# a2enmod ssl
root@scrapykoko:~# a2ensite default-ssl

Y se revisó que estuvieran habilitados:

root@scrapykoko:~# ls -la /etc/apache2/sites-enabled
total 8
drwxr-xr-x 2 root root 4096 Jun  8 22:48 .
drwxr-xr-x 8 root root 4096 Jun  7 21:17 ..
lrwxrwxrwx 1 root root   35 Jun  7 18:13 000-default.conf -> ../sites-available/000-default.conf
lrwxrwxrwx 1 root root   35 Jun  7 18:44 default-ssl.conf -> ../sites-available/default-ssl.conf

También que se estuvieran escuchando en los puertos 80 y 443:

root@scrapykoko:~# netstat -ntulp | grep apache2
tcp6       0      0 :::443                  :::*                    LISTEN      585/apache2
tcp6       0      0 :::80                   :::*                    LISTEN      585/apache2

Luego se configuró los VirtualHosts predeterminados, haciendo lo siguiente:

  • En el archivo /etc/apache2/sites-enabled/000-default.conf se cambió:
 <VirtualHost *:80> ⇨ <VirtualHost _default_:80>
  • En el archivo /etc/apache2/sites-enabled/default-ssl.conf se cambió:
<VirtualHost *:443> ⇨ <VirtualHost _default_:443>

Quedando de la siguiente manera:

root@scrapykoko:~# cat /etc/apache2/sites-enabled/000-default.conf
<VirtualHost _default_:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerName scrapykoko.ml
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

root@scrapykoko:~# cat /etc/apache2/sites-enabled/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerName scrapykoko.ml
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
                # error, crit, alert, emerg.
                # It is also possible to configure the loglevel for particular
                # modules, e.g.
                #LogLevel info ssl:warn

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                # For most configuration files from conf-available/, which are
                # enabled or disabled at a global level, it is possible to
                # include a line for only one particular virtual host. For example the
                # following line enables the CGI configuration for this host only
                # after it has been globally disabled with "a2disconf".
                #Include conf-available/serve-cgi-bin.conf

                #   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on

                #   A self-signed (snakeoil) certificate can be created by installing
                #   the ssl-cert package. See
                #   /usr/share/doc/apache2/README.Debian.gz for more info.
                #   If both key and certificate are stored in the same file, only the
                #   SSLCertificateFile directive is needed.

                #   Server Certificate Chain:
                #   Point SSLCertificateChainFile at a file containing the
                #   concatenation of PEM encoded CA certificates which form the
                #   certificate chain for the server certificate. Alternatively
                #   the referenced file can be the same as SSLCertificateFile
                #   when the CA certificates are directly appended to the server
                #   certificate for convinience.
                #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt

                #   Certificate Authority (CA):
                #   Set the CA certificate verification path where to find CA
                #   certificates for client authentication or alternatively one
                #   huge file containing all of them (file must be PEM encoded)
                #   Note: Inside SSLCACertificatePath you need hash symlinks
                #                to point to the certificate files. Use the provided
                #                Makefile to update the hash symlinks after changes.
                #SSLCACertificatePath /etc/ssl/certs/
                #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt

                #   Certificate Revocation Lists (CRL):
                #   Set the CA revocation path where to find CA CRLs for client
                #   authentication or alternatively one huge file containing all
                #   of them (file must be PEM encoded)
                #   Note: Inside SSLCARevocationPath you need hash symlinks
                #                to point to the certificate files. Use the provided
                #                Makefile to update the hash symlinks after changes.
                #SSLCARevocationPath /etc/apache2/ssl.crl/
                #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl

                #   Client Authentication (Type):
                #   Client certificate verification type and depth.  Types are
                #   none, optional, require and optional_no_ca.  Depth is a
                #   number which specifies how deeply to verify the certificate
                #   issuer chain before deciding the certificate is not valid.
                #SSLVerifyClient require
                #SSLVerifyDepth  10

                #   SSL Engine Options:
                #   Set various options for the SSL engine.
                #   o FakeBasicAuth:
                #        Translate the client X.509 into a Basic Authorisation.  This means that
                #        the standard Auth/DBMAuth methods can be used for access control.  The
                #        user name is the `one line' version of the client's X.509 certificate.
                #        Note that no password is obtained from the user. Every entry in the user
                #        file needs this password: `xxj31ZMTZzkVA'.
                #   o ExportCertData:
                #        This exports two additional environment variables: SSL_CLIENT_CERT and
                #        SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
                #        server (always existing) and the client (only existing when client
                #        authentication is used). This can be used to import the certificates
                #        into CGI scripts.
                #   o StdEnvVars:
                #        This exports the standard SSL/TLS related `SSL_*' environment variables.
                #        Per default this exportation is switched off for performance reasons,
                #        because the extraction step is an expensive operation and is usually
                #        useless for serving static content. So one usually enables the
                #        exportation for CGI and SSI requests only.
                #   o OptRenegotiate:
                #        This enables optimized SSL connection renegotiation handling when SSL
                #        directives are used in per-directory context.
                #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                #   SSL Protocol Adjustments:
                #   The safe and default but still SSL/TLS standard compliant shutdown
                #   approach is that mod_ssl sends the close notify alert but doesn't wait for
                #   the close notify alert from client. When you need a different shutdown
                #   approach you can use one of the following variables:
                #   o ssl-unclean-shutdown:
                #        This forces an unclean shutdown when the connection is closed, i.e. no
                #        SSL close notify alert is send or allowed to received.  This violates
                #        the SSL/TLS standard but is needed for some brain-dead browsers. Use
                #        this when you receive I/O errors because of the standard approach where
                #        mod_ssl sends the close notify alert.
                #   o ssl-accurate-shutdown:
                #        This forces an accurate shutdown when the connection is closed, i.e. a
                #        SSL close notify alert is send and mod_ssl waits for the close notify
                #        alert of the client. This is 100% SSL/TLS standard compliant, but in
                #        practice often causes hanging connections with brain-dead browsers. Use
                #        this only for browsers where you know that their SSL implementation
                #        works correctly.
                #   Notice: Most problems of broken clients are also related to the HTTP
                #   keep-alive facility, so you usually additionally want to disable
                #   keep-alive for those clients, too. Use variable "nokeepalive" for this.
                #   Similarly, one has to force some clients to use HTTP/1.0 to workaround
                #   their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
                #   "force-response-1.0" for this.
                # BrowserMatch "MSIE [2-6]" \
                #               nokeepalive ssl-unclean-shutdown \
                #               downgrade-1.0 force-response-1.0

                Include /etc/letsencrypt/options-ssl-apache.conf
                SSLCertificateFile /etc/letsencrypt/live/scrapykoko.ml/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/scrapykoko.ml/privkey.pem
        </VirtualHost>
</IfModule>

Después se recargó el servicio y se revisó cuál era la ruta raíz del sitio web:

root@scrapykoko:~# systemctl reload apache2

root@scrapykoko:~# grep 'DocumentRoot' /etc/apache2/sites-enabled/*.conf
/etc/apache2/sites-enabled/000-default.conf:    DocumentRoot /var/www/html
/etc/apache2/sites-enabled/default-ssl.conf:            DocumentRoot /var/www/html

Luego se tramitó el certificado SSL con Let´s Encrypt, para ello primero se instaló certbot:

root@scrapykoko:~# apt -qy install certbot python3-certbot-apache

Después se generó el certificado con el siguiente comando y siguiendo las instrucciones de esta página:

root@scrapykoko:~# certbot --authenticator manual --installer apache --domain 'scrapykoko.ml' --domain '*.scrapykoko.ml'

La salida del comando está aquí

Las validaciones dadas dieron lo siguiente:

C:\Users\DTana>curl -v http://scrapykoko.ml/.well-known/acme-challenge/6vAgkeJOVI4KydZ3eNKyJAy7_4Q9og6udij8xPpgbrg
*   Trying 20.213.61.249:443...
* Connected to scrapykoko.ml (20.213.61.249) port 80 (#0)
> GET /.well-known/acme-challenge/6vAgkeJOVI4KydZ3eNKyJAy7_4Q9og6udij8xPpgbrg HTTP/1.1
> Host: scrapykoko.ml
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sat, 11 Jun 2022 02:27:10 GMT
< Server: Apache
< Last-Modified: Wed, 08 Jun 2022 01:58:28 GMT
< ETag: "58-5e0e60aa07596"
< Accept-Ranges: bytes
< Content-Length: 88
<
6vAgkeJOVI4KydZ3eNKyJAy7_4Q9og6udij8xPpgbrg.Et8fPeWpiV69lUjDAeoyrEwLcvfzkH-FfWu1G3OhcDM
* Connection #0 to host scrapykoko.ml left intact

C:\Users\DTana\Downloads\BIND9.16.29.x64>dig.exe TXT _acme-challenge.scrapykoko.ml

; <<>> DiG 9.16.29 <<>> TXT _acme-challenge.scrapykoko.ml
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56129
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.scrapykoko.ml. IN      TXT

;; ANSWER SECTION:
_acme-challenge.scrapykoko.ml. 3600 IN  TXT     "llnkrEdlBLbn3wz8LfnpeUPH887M8C2oInvkgLQdvzg"

;; Query time: 63 msec
;; SERVER: 192.168.1.254#53(192.168.1.254)
;; WHEN: Fri Jun 10 21:29:04 Hora de verano central (MÚxico) 2022
;; MSG SIZE  rcvd: 114

Además se activó que el tráfico HTTP se redirige a HTTPS, haciendo que sea agregaran las siguiente líneas al archivo /etc/apache2/sites-enabled/000-default.conf:

RewriteEngine on
RewriteCond %{SERVER_NAME} =scrapykoko.ml
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

También se verificó que tuvieramos el certificado y la llave privada en /etc/letsencrypt:

root@scrapykoko:~# tree /etc/letsencrypt/archive
/etc/letsencrypt/archive
└── scrapykoko.ml
    ├── cert1.pem
    ├── chain1.pem
    ├── fullchain1.pem
    └── privkey1.pem

1 directory, 4 files
root@scrapykoko:~# tree /etc/letsencrypt/live
/etc/letsencrypt/live
├── README
└── scrapykoko.ml
    ├── cert.pem -> ../../archive/scrapykoko.ml/cert1.pem
    ├── chain.pem -> ../../archive/scrapykoko.ml/chain1.pem
    ├── fullchain.pem -> ../../archive/scrapykoko.ml/fullchain1.pem
    ├── privkey.pem -> ../../archive/scrapykoko.ml/privkey1.pem
    └── README

1 directory, 6 files
root@scrapykoko:~#

Y por último se verifica que se estén utilizando los certificados de Let's Encrypt en tu VirtualHost de HTTPS:

root@scrapykoko:~# egrep -i '^\s*SSLCertificate(Key)?File' /etc/apache2/sites-enabled/*.conf
/etc/apache2/sites-enabled/default-ssl.conf:            SSLCertificateFile /etc/letsencrypt/live/scrapykoko.ml/fullchain.pem
/etc/apache2/sites-enabled/default-ssl.conf:SSLCertificateKeyFile /etc/letsencrypt/live/scrapykoko.ml/privkey.pem
root@scrapykoko:~#

Configuración de VirtualHosts para HTTP y HTTPS#

Se siguieron los pasos de la siguiente página.

En toda la práctica se configuraron 3 VirtualHost, el primero fue scrapykoko.ml y este se configuró en los pasos anteriores quedando sus archivos de configuración de la siguiente manera:

root@scrapykoko:~# cat /etc/apache2/sites-enabled/000-default.conf
<VirtualHost _default_:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerName scrapykoko.ml
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
RewriteEngine on
RewriteCond %{SERVER_NAME} =scrapykoko.ml
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

root@scrapykoko:~# cat /etc/apache2/sites-enabled/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerName scrapykoko.ml
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
                # error, crit, alert, emerg.
                # It is also possible to configure the loglevel for particular
                # modules, e.g.
                #LogLevel info ssl:warn

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                # For most configuration files from conf-available/, which are
                # enabled or disabled at a global level, it is possible to
                # include a line for only one particular virtual host. For example the
                # following line enables the CGI configuration for this host only
                # after it has been globally disabled with "a2disconf".
                #Include conf-available/serve-cgi-bin.conf

                #   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on

                #   A self-signed (snakeoil) certificate can be created by installing
                #   the ssl-cert package. See
                #   /usr/share/doc/apache2/README.Debian.gz for more info.
                #   If both key and certificate are stored in the same file, only the
                #   SSLCertificateFile directive is needed.

                #   Server Certificate Chain:
                #   Point SSLCertificateChainFile at a file containing the
                #   concatenation of PEM encoded CA certificates which form the
                #   certificate chain for the server certificate. Alternatively
                #   the referenced file can be the same as SSLCertificateFile
                #   when the CA certificates are directly appended to the server
                #   certificate for convinience.
                #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt

                #   Certificate Authority (CA):
                #   Set the CA certificate verification path where to find CA
                #   certificates for client authentication or alternatively one
                #   huge file containing all of them (file must be PEM encoded)
                #   Note: Inside SSLCACertificatePath you need hash symlinks
                #                to point to the certificate files. Use the provided
                #                Makefile to update the hash symlinks after changes.
                #SSLCACertificatePath /etc/ssl/certs/
                #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt

                #   Certificate Revocation Lists (CRL):
                #   Set the CA revocation path where to find CA CRLs for client
                #   authentication or alternatively one huge file containing all
                #   of them (file must be PEM encoded)
                #   Note: Inside SSLCARevocationPath you need hash symlinks
                #                to point to the certificate files. Use the provided
                #                Makefile to update the hash symlinks after changes.
                #SSLCARevocationPath /etc/apache2/ssl.crl/
                #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl

                #   Client Authentication (Type):
                #   Client certificate verification type and depth.  Types are
                #   none, optional, require and optional_no_ca.  Depth is a
                #   number which specifies how deeply to verify the certificate
                #   issuer chain before deciding the certificate is not valid.
                #SSLVerifyClient require
                #SSLVerifyDepth  10

                #   SSL Engine Options:
                #   Set various options for the SSL engine.
                #   o FakeBasicAuth:
                #        Translate the client X.509 into a Basic Authorisation.  This means that
                #        the standard Auth/DBMAuth methods can be used for access control.  The
                #        user name is the `one line' version of the client's X.509 certificate.
                #        Note that no password is obtained from the user. Every entry in the user
                #        file needs this password: `xxj31ZMTZzkVA'.
                #   o ExportCertData:
                #        This exports two additional environment variables: SSL_CLIENT_CERT and
                #        SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
                #        server (always existing) and the client (only existing when client
                #        authentication is used). This can be used to import the certificates
                #        into CGI scripts.
                #   o StdEnvVars:
                #        This exports the standard SSL/TLS related `SSL_*' environment variables.
                #        Per default this exportation is switched off for performance reasons,
                #        because the extraction step is an expensive operation and is usually
                #        useless for serving static content. So one usually enables the
                #        exportation for CGI and SSI requests only.
                #   o OptRenegotiate:
                #        This enables optimized SSL connection renegotiation handling when SSL
                #        directives are used in per-directory context.
                #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                #   SSL Protocol Adjustments:
                #   The safe and default but still SSL/TLS standard compliant shutdown
                #   approach is that mod_ssl sends the close notify alert but doesn't wait for
                #   the close notify alert from client. When you need a different shutdown
                #   approach you can use one of the following variables:
                #   o ssl-unclean-shutdown:
                #        This forces an unclean shutdown when the connection is closed, i.e. no
                #        SSL close notify alert is send or allowed to received.  This violates
                #        the SSL/TLS standard but is needed for some brain-dead browsers. Use
                #        this when you receive I/O errors because of the standard approach where
                #        mod_ssl sends the close notify alert.
                #   o ssl-accurate-shutdown:
                #        This forces an accurate shutdown when the connection is closed, i.e. a
                #        SSL close notify alert is send and mod_ssl waits for the close notify
                #        alert of the client. This is 100% SSL/TLS standard compliant, but in
                #        practice often causes hanging connections with brain-dead browsers. Use
                #        this only for browsers where you know that their SSL implementation
                #        works correctly.
                #   Notice: Most problems of broken clients are also related to the HTTP
                #   keep-alive facility, so you usually additionally want to disable
                #   keep-alive for those clients, too. Use variable "nokeepalive" for this.
                #   Similarly, one has to force some clients to use HTTP/1.0 to workaround
                #   their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
                #   "force-response-1.0" for this.
                # BrowserMatch "MSIE [2-6]" \
                #               nokeepalive ssl-unclean-shutdown \
                #               downgrade-1.0 force-response-1.0

                Include /etc/letsencrypt/options-ssl-apache.conf
                SSLCertificateFile /etc/letsencrypt/live/scrapykoko.ml/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/scrapykoko.ml/privkey.pem
        </VirtualHost>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Quedando la página de la siguiente manera:

Virtual Host 1

Luego se configuró a docs.scrapykoko.ml el cual tiene de alias a kernel.scrapykoko.ml, este mostrará la documentación de la versión del kernel de linux, para eso se configuró al archivo docs.conf el cual quedó de la siguiente manera siguiendo las instrucciones dadas en la página:

<VirtualHost *:80>
        ServerName docs.scrapykoko.ml
        ServerAlias kernel.scrapykoko.ml
        ServerAdmin webmaster@localhost

        LogLevel info ssl:warn

        DocumentRoot /usr/share/doc/linux-doc/html
        <Directory /usr/share/doc/linux-doc/html>
                AllowOverride none
                Options -Indexes
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/docs_error.log
        CustomLog ${APACHE_LOG_DIR}/docs_access.log combined

RewriteEngine on
RewriteCond %{SERVER_NAME} =docs.scrapykoko.ml [OR]
RewriteCond %{SERVER_NAME} =kernel.scrapykoko.ml
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
        ServerName docs.scrapykoko.ml
        ServerAlias kernel.scrapykoko.ml
        ServerAdmin webmaster@localhost

        LogLevel info ssl:warn

        DocumentRoot /usr/share/doc/linux-doc/html
        <Directory /usr/share/doc/linux-doc/html>
                AllowOverride none
                Options -Indexes
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/docs_error.log
        CustomLog ${APACHE_LOG_DIR}/docs_access.log combined

</VirtualHost>

En este documento se configuraron dos VirtualHost uno para el puerto 80 (HTTP) y otro para el puerto 443 (HTTPS), donde el de HTTP, se redigirá al de HTTPS con las siguientes líneas:

RewriteEngine on
RewriteCond %{SERVER_NAME} =docs.scrapykoko.ml [OR]
RewriteCond %{SERVER_NAME} =kernel.scrapykoko.ml
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Como habíamos dicho este documento es para el VirtualHost docs.scrapykoko.ml, por lo que la directiva ServerName {Valor} que es para configurar el nombre del servidor su valor es docs.scrapykoko.ml, luego la directiva ServerAlias {Valor} es para configurar nombres alternativos para un VirtualHost, en este caso su valor es kernel.scrapykoko.ml.

Luego como DocumentRoot /usr/share/doc/linux-doc/html, es para especificar la raíz del sitio, y esta está fuera de /var/www se tiene que configurar la directiva Directory la cual se usa para englobar un grupo de directivas que se aplicarán a un directorio y a sus sub directorios, quedó de la siguiente manera:

<Directory /usr/share/doc/linux-doc/html>
                AllowOverride none
                Options -Indexes
                Require all granted
</Directory>

En este caso se englobaron 3 directivas:

  • AllowOverride {Valor}, esta directiva sirve para saber qué directivas serán permitidas en los archivos .htaccess, en este caso su valor es none que quiere decir que se va a ignorar a los archivos .htaccess.

  • Options [+|-]{Valor}, esta directiva sirve para configurar qué características están disponibles en un directorio, en este caso su valor es -Indexes, el cual quiere decir que cuando se solicite un directorio y no tenga DirectoryIndex no mostrará un lista formateada del directorio, esto por el -.

  • Require, esta ya se había explicado arriba, pero ahora su valor es all granted, la cual dice que el acceso esta permitido incondicionalmente para el directorio /usr/share/doc/linux-doc/html.

Luego la directiva LogLevel es para controlar el nivel verbosidad del ErroLog, en este caso su valor es info ssl:warn, donde se le asigna el nivel informativo al módulo ssl:warn.

Y por último la directiva ErrorLog es para especificar dónde se guardarán los registros de errores en este caso es docs_error.log, luego CustomLog es para especificar dónde se guardarán los registros de un formato específico, en este caso usamos un registro combinado combined el cual se guardará en docs_access.log.

Quedando las páginas de la siguiente manera:

Virtual Host usando docs
Virtual Host usando kernel

Luego se configuró a sitio.scrapykoko.ml el cual tiene de alias a tareas.scrapykoko.ml, este mostrara la vista que nosotros tenemos cuando vemos las tareas y prácticas entregadas, este se guardará en sitio.conf, el cual quedó de la siguiente manera:

root@scrapykoko:~# cat /etc/apache2/sites-available/sitio.conf
<VirtualHost *:80>
        ServerName sitio.scrapykoko.ml
        ServerAlias tareas.scrapykoko.ml
        ServerAdmin webmaster@localhost

        LogLevel info ssl:warn

        DocumentRoot /srv/repositorio/public
        <Directory /srv/repositorio/public>
                AllowOverride none
                Options -Indexes
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/sitio_error.log
        CustomLog ${APACHE_LOG_DIR}/sitio_access.log combined

RewriteEngine on
RewriteCond %{SERVER_NAME} =sitio.scrapykoko.ml [OR]
RewriteCond %{SERVER_NAME} =tareas.scrapykoko.ml
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
        ServerName sitio.scrapykoko.ml
        ServerAlias tareas.scrapykoko.ml
        ServerAdmin webmaster@localhost

        LogLevel info ssl:warn

        DocumentRoot /srv/repositorio/public
        <Directory /srv/repositorio/public>
                AllowOverride none
                Options -Indexes
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/sitio_error.log
        CustomLog ${APACHE_LOG_DIR}/sitio_access.log combined

</VirtualHost>

La explicación de sus directivas es parecida a la del docs.scrapykoko.ml.

Para esta se nos pedía ubicar una rama donde se hacían las entregas, para ello hicimos la siguiente rama la cual contiene las prácticas entregadas antes de la 6 y 7, se instalaron las dependencias de python y se convirtieron los archivos Markdown a HTML con el siguiente comando:

root@scrapykoko:~# mkdocs build --strict --verbose 2>&1 | egrep -v '^DEBUG' | tee salida-mkdocs.log

Y su salida es esta.

Quedando las páginas de la siguiente manera:

Virtual Host usando sitio
Virtual Host usando tareas

Antes de que las páginas pudieran ser accesibles, primero se habilitaron con lo siguientes comandos:

root@scrapykoko:~# a2ensite docs.conf

root@scrapykoko:~# ls -la /etc/apache2/sites-available/docs.conf  /etc/apache2/sites-enabled/docs.conf
-rw-r--r-- 1 root root 1137 Jun  8 18:07 /etc/apache2/sites-available/docs.conf
lrwxrwxrwx 1 root root   28 Jun  8 17:38 /etc/apache2/sites-enabled/docs.conf -> ../sites-available/docs.conf

root@scrapykoko:~# a2ensite sitio.conf
root@scrapykoko:~# ls -la /etc/apache2/sites-available/sitio.conf /etc/apache2/sites-enabled/sitio.conf
-rw-r--r-- 1 root root 1120 Jun  8 22:50 /etc/apache2/sites-available/sitio.conf
lrwxrwxrwx 1 root root   29 Jun  8 22:48 /etc/apache2/sites-enabled/sitio.conf -> ../sites-available/sitio.conf

Luego se revisó la configuración del Apache HTTPD y se recargó el servicio:

root@scrapykoko:~# apachectl -S
VirtualHost configuration:
*:80                   is a NameVirtualHost
         default server scrapykoko.ml (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost scrapykoko.ml (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost docs.scrapykoko.ml (/etc/apache2/sites-enabled/docs.conf:1)
                 alias kernel.scrapykoko.ml
         port 80 namevhost sitio.scrapykoko.ml (/etc/apache2/sites-enabled/sitio.conf:1)
                 alias tareas.scrapykoko.ml
*:443                  is a NameVirtualHost
         default server scrapykoko.ml (/etc/apache2/sites-enabled/default-ssl.conf:2)
         port 443 namevhost scrapykoko.ml (/etc/apache2/sites-enabled/default-ssl.conf:2)
         port 443 namevhost docs.scrapykoko.ml (/etc/apache2/sites-enabled/docs.conf:24)
                 alias kernel.scrapykoko.ml
         port 443 namevhost sitio.scrapykoko.ml (/etc/apache2/sites-enabled/sitio.conf:24)
                 alias tareas.scrapykoko.ml
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex ssl-stapling: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33

root@scrapykoko:~# systemctl reload apache2

Revisión de la redirección de HTTP a HTPPS#

Esa se hizo usando el archivo consulta-http.sh dando como resultado al siguiente archivo.

Archivos solicitados#

Archivos de configuración:#

Archivos de bitácora#

Archivos de datos#

  • Archivo virtualhosts.txt

  • Copia de seguridad del directorio /var/www

  • Copia de seguridad de los datos generados por certbot

  • Archivo de datos registros-dns.txt

  • Archivo de datos con el diagnóstico de consultas HTTP y HTTPS aquí

  • Archivo de datos con el diagnóstico de certificados SSL aquí

NOTA#

La parte de:

- Explicación del procedimiento que se siguió para crear los recursos en Azure
- Explicación del procedimiento que se siguió para registrar el nombre de dominio en FreeNom y asociarlo a la zona DNS en Azure
- Explicación de los comandos utilizados para inicializar la máquina virtual en Azure
- Salida de las consultas DNS para los registros SOA, NS, A y CNAME
- Salida de los siguientes comandos en la máquina virtual como el usuario root

Es de la práctica anterior y su explicación se encuentra ahí.