1. Notas sobre la instalación de certificado Let’s Encrypt

    Written by Miguel González on 2016-10-29

    Este artículo es una continuación del anterior sobre configurar un servidor web estático.

    Obtener certificado con certbot

    Como ya está instalado el repositorio EPEL, sólo hay que instalar la utilidad certbot.

    $ sudo yum install certbot
    

    Para crear los certificados:

    $ sudo certbot certonly --webroot -w /srv/www.migonzalvar.eu/ -d migonzalvar.eu -d www.migonzalvar.eu
    

    Esto funciona porque el servidor está ejecutándose y es accesible. certbot crea unos archivos en el raíz del sitio y Let's Encrypt los comprueba.

    Podemos ahora confirmar que está todo bien simulando una actualización:

    $ sudo certbot renew --dry-run
    

    Un paso más, para incrementar la seguridad y evitar el ataque Logjam cramos una clave fuerte Diffie-Hellman.

    $ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
    

    Configuración de nginx

    server {
        listen      80;
        server_name migonzalvar.eu www.migonzalvar.eu;
        return 301  https://$server_name$request_uri;
    }
    
    server {
        listen              443 ssl;
        server_name         migonzalvar.eu www.migonzalvar.eu;
        ssl_certificate     /etc/letsencrypt/live/migonzalvar.eu/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/migonzalvar.eu/privkey.pem;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        location / {
            root /srv/www.migonzalvar.eu/;
        }
    }
    

    Testamos la configuración recién creada:

    $ sudo nginx -t
    

    Y añádimos regla al firewall:

    $ sudo firewall-cmd --permanent --add-service=https
    $ sudo firewall-cmd --reload
    

    Renovación automática del certificado

    Crear /etc/systemd/system/certbot-renew.service:

    [Unit]
    Description=Let's Encrypt renewal
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/certbot renew --quiet --agree-tos
    ExecStartPost=/bin/systemctl reload nginx.service
    

    Y el mismo archivo pero acabado en .timer, es decir /etc/systemd/system/certbot-renew.timer:

    [Unit]
    Description=Daily renewal of Let's Encrypt's certificates
    
    [Timer]
    OnCalendar=daily
    RandomizedDelaySec=1day
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    

    POr último lo iniciamos y lo dejamos activo.

    $ sudo systemctl start certbot-renew.timer
    $ sudo systemctl enable certbot-renew.timer
    $ systemctl list-timers
    

    Referencias:

  2. Chuleta para configurar un servidor personal con CentOS (parte 2)

    Written by Miguel González on 2016-10-28

    En la parte 1 traté de como configurar el servidor. Ahora voy a describir como instalar un servidor web y mi primer sitio estático.

    nginx

    $ sudo vi /etc/yum.repos.d/nginx.repo
    …
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=0
    enabled=1
    …
    $ sudo yum update
    $ sudo yum install nginx
    
    $ sudo systemctl start nginx
    $ sudo systemctl enable nginx
    $ sudo firewall-cmd --permanent --add-service=http
    $ sudo firewall-cmd --reload
    

    Sitio estático

    Configurar el directorio donde estarán los archivos estáticos.

    $ sudo mkdir /srv/www.migonzalvar.eu
    $ sudo chown root.wheel -R /srv/www.migonzalvar.eu
    $ sudo chmod 2775 /srv/www.migonzalvar.eu
    $ sudo chcon -Rv --type=httpd_sys_content_t /srv/www.migonzalvar.eu
    

    la configuración de nginx en /etc/nginx/conf.d/www.migonzalvar.eu.conf:

    server {
        listen      80;
        server_name migonzalvar.eu www.migonzalvar.eu;
        location / {
            root /srv/www.migonzalvar.eu/;
        }
    }
    

    El último paso es subir los archivos desde mi ordenador, lo que se puede hacer con el comando rsync:

    LOCAL$ rsync web/ root@SERVER_IP_ADDRESS:/srv/www.migonzalvar.eu/
    

    Referencias:

  3. Chuleta para configurar un servidor personal con CentOS (parte 1)

    Written by Miguel González on 2016-10-27

    En este artículo describo como he configurado mi propio servidor privado virtual.

    Lo uso principalmente para alojar páginas estáticas y algún que otro experimento. Ni la configuración ni el procedimiento es especialmente novedoso pero sí que hay algunos pasos que me parece interesante compartir.

    Espero que le sirve a alguien, puede que incluso a mi yo del futuro.

    En mi caso he contratado un VPS en DigitalOcean pero este procedimiento sirve para cualquier servidor CentOS.

    Vamos allá.

    Creación del usuario administrador

    Accedo a través de ssh tecleando en mi ordenador ssh root@SERVER_IP_ADDRESS.

    Lo primero es configurar un usuario con el que administraré el sistema. No es una buena práctica usar root para el día a día. Es más recomendable tener un usuario con menos privilegios y recurrir al comando sudo cuando es necesario.

    En el SERVIDOR como root ejecuto los siguientes pasos para crear el usuario demo, asignarle una contraseña muy segura y enrolarlo en el grupo de administradores wheel.

    # adduser demo
    # passwd demo
    # gpasswd -a demo wheel
    

    Opcionalmente, para evitar teclear la contraseña cada vez que invoco sudo, voy a retocar el archivo /etc/sudoers

    # visudo
    

    Y configuro esta línea:

    %wheel  ALL=(ALL)       NOPASSWD: ALL
    

    A partir de ahora usaré el usario demo siempre, incluso para acceder al servidor.

    Desactivar acceso ssh a root

    Vuelvo a acceder al SERVIDOR pero esta vez como usuario demo:

    $ sudo vi /etc/ssh/sshd_config
    …
    PermitRootLogin no
    …
    

    Reinicio el servicio ssh y compruebo que esta levantado.

    $ sudo systemctl reload sshd
    $ ssh localhost
    The authenticity of host 'localhost (::1)' can't be established.
    ECDSA key fingerprint is a1:b2:c3:d4:e5:f6:10:20:30:40:50.
    Are you sure you want to continue connecting (yes/no)? ^C
    

    Activar firewall

    $ sudo systemctl start firewalld
    $ sudo firewall-cmd --permanent --add-service=ssh
    $ sudo firewall-cmd --reload
    $ sudo systemctl enable firewalld
    

    Sincronización de hora

    $ sudo timedatectl set-local-rtc 0
    $ sudo yum install chrony
    $ sudo systemctl start chronyd
    $ sudo systemctl enable chronyd
    

    Activación de SElinux

    $ sudo vi /etc/selinux/config
    ...
    SELINUX=enforcing
    ...
    

    Repositorios extra

    sudo yum install epel-release
    sudo yum install https://centos7.iuscommunity.org/ius-release.rpm
    

    Espero poder documentar próximamente como instalar nginx y configurar un sitio web estático.

    Referencias:

  4. Deploying a web application into a virtualenv using wheel packages

    Written by Miguel González on 2013-12-06

    First, assure virtualenv and pip Python tools are installed.

    # yum install -y python-virtualenv python-pip
    Loaded plugins: etckeeper
    xs-extra                                                 | 2.9 kB     00:00
    Package python-virtualenv-1.10.1-1.fc18.noarch already installed and latest version
    Package python-pip-1.3.1-4.fc18.noarch already installed and latest version
    Nothing to do
    

    The pathagar web application and all its dependencies will reside in its own directory.

    # mkdir /usr/local/pathagar-v2
    # cd /usr/local/pathagar-v2
    

    Then, create the virtual environment inside that directory and activate it.

    # virtualenv venv
    New python executable in venv/bin/python
    Installing Setuptools......................done.
    Installing Pip.............................done.
    # source venv/bin/activate
    

    This is the different method, install psycopg2 from a wheel package from a custom repository. This is a very fast procedure and avoids the need to compile and to have development packages.

    (venv)# pip install --use-wheel --no-index --find-links=http://xsce.activitycentral.com/wheelhouse/ psycopg2==2.5.1
    Ignoring indexes: https://pypi.python.org/simple/
    Downloading/unpacking psycopg2==2.5.1
      Downloading psycopg2-2.5.1-cp27-none-linux_armv7l.whl (321kB): 321kB downloaded
    Installing collected packages: psycopg2
    Successfully installed psycopg2
    Cleaning up...
    

    The rest of requirements can be installed from PyPI in the standard way.

    (venv)# pip install Django==1.4.5 django-tagging==0.3.1 django-sendfile==0.3.0 django-taggit==0.10
    Downloading/unpacking Django==1.4.5
      Downloading Django-1.4.5.tar.gz (7.7MB): 7.7MB downloaded
    
      Running setup.py egg_info for package Django
    
    Downloading/unpacking django-tagging==0.3.1
      Downloading django-tagging-0.3.1.tar.gz
      Running setup.py egg_info for package django-tagging
    
    Downloading/unpacking django-sendfile==0.3.0
      You are installing a potentially insecure and unverifiable file. Future versions of pip will default to disallowing insecure files.
      Downloading django-sendfile-0.3.0.tar.gz
      Running setup.py egg_info for package django-sendfile
    
    Downloading/unpacking django-taggit==0.10
      Downloading django-taggit-0.10.tar.gz
      Running setup.py egg_info for package django-taggit
    
    Installing collected packages: Django, django-tagging, django-sendfile, django-taggit
      Running setup.py install for Django
        changing mode of build/scripts-2.7/django-admin.py from 644 to 755
    
        changing mode of /usr/local/pathagar-v2/venv/bin/django-admin.py to 755
      Running setup.py install for django-tagging
    
      Running setup.py install for django-sendfile
    
      Running setup.py install for django-taggit
    
    Successfully installed Django django-tagging django-sendfile django-taggit
    Cleaning up...
    

    Now, we only have to install and deploy pathagar: all its dependencies are installed into the virtual environment totally isolated from site wide Python packages.

Links

Social