First steps – ubuntu setup

Después de la instalación inicial:

1. Asegurar una contraseña fuerte para el usuario principal y para root

passwd root

2. Configurar el DNS: (/etc/resolv.conf)

nameserver 8.8.8.8
nameserver 8.8.4.4

3. Asegurar que root no puede hacer login via ssh (/etc/ssh/sshd_config):

PermitRootLogin = no
AllowUsers [myuser]
SyslogFacility AUTH
LogLevel INFO

4. Comprobar las reglas de la firewall (en mi caso utilizando iptables)
– desactivar uwf (sudo systemctl disable ufw)
– instalar iptables y iptables-persistant
– configurar reglas básicas (80, 22, 443)

Instalar Apache Web Server

apt install apache2

Asegurar unas configuraciones de seguridad (/etc/apache2/conf-enabled/security.conf). Las directrices de «Header» requieren que el modulo «Headers» este activo: «a2enmod headers»

ServerSignature Off
ServerTokens Prod
Header set X-Content-Type-Options: «nosniff»
Header set Strict-Transport-Security «max-age=63072000»
Header set X-Frame-Options: «sameorigin»
Header set X-XSS-Protection «1; mode=block»

Revisar los módulos activos:

apachectl -M | sort

Activate SSL module:

a2enmod ssl

Install certbot para generar el certificado:

apt-get install certbot
systemctl stop apache2
certbot certonly –standalone –rsa-key-size 4096 –agree-tos –preferred-challenges http -d [nombre_de_mi_domain]

Registrar el certificado en Apache en /etc/apache2/sites-enabled/default-ssl.conf

SSLEngine on
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCertificateFile /etc/letsencrypt/live/[nombre_de_mi_domain]/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[nombre_de_mi_domain]/privkey.pem

Asegurar la configuración del sitio en /etc/apache2/sites-enabled/000-default.conf

ServerAdmin xxxx
ServerName [nombre_de_mi_domain]
DocumentRoot xxxx
ErrorLog
CustomLog
Redirect

Comprobar el score de seguridad en https://observatory.mozilla.org

Preparar WebDAV

Crear el directorio del servidor:

mkdir /var/www/webdav
mkdir /var/www/DavLock
chown -R www-data:www-data /var/www/webdav
chown -R www-data:www-data /var/www/DavLock

Habilitar los módulos de apache para soportar DAV:

a2enmod dav
a2enmod dav_fs
a2enmod auth_digest

Preparar el metodo de autenticación, creando un fichero de contraseña para el servicio webdav y el usuario que decidamos (username):

htdigest -c /etc/apache2/users.password webdav [username]
chown www-data:www-data /etc/apache2/users.password

Adaptar la configuración (/etc/apache2/sites-enabled/default-ssl.conf)

DavLockDB /var/www/DavLock/DavLock

<Directory /var/www/webdav>
DAV On
AuthType Digest
AuthName «webdav»
AuthUserFile /etc/apache2/users.password
Require valid-user
</Directory>

Reiniciar el servicio de Apache:

systemctl restart apache2

Mounting y unmounting webdav en Ubuntu (es necesario tener los derechos!). Para mount se debe usar el usuario/contraseña de webdav

apt-get install davfs2
mkdir /home/thomas/webmount
mount -t davfs «https://tomspain72.ddns.net/webdav/» /home/thomas/webmount
fusermount -u /home/thomas/webmount

IPTables

Listar las reglas existentes con nº de línea:

iptables -L -v –line-numbers

Borrar una regla en una línea:

iptables -D [INPUT|…] [nº de regla]

Insertar una nueva regla:

iptables -I [INPUT|OUTPUT|….] [nº de línea]
ejemplo: iptables -I INPUT 9 -s 192.168.0.0/24 -p tcp --dport 1714:1764 -j ACCEPT

Guardar / restaurar reglas:

iptables-save > /etc/iptables/rules.v4
iptables-save > /etc/iptables/rules.v6

Restaurar reglas guardadas:

iptables-restore < /etc/iptables/rules.v[]

Servicio de iptables:

systemctl [stop|start|restart|restart] iptables

Instalar Fail2ban

Guardar la configuración de iptables.

iptables-save > /etc/iptables/rules.v4

Instalar Fail2ban.

sudo apt update
sudo apt install fail2ban

Configurar el servicio, creando primero el fichero de configuración /etc/fail2ban/jail.local :

cp /etc/fail2ban/jail.{conf,local}

Configurar los servicios que debe vigilar fail2ban (/etc/fail2ban/jail.local):

sshd
apache

Install PHP

Además del paquete php, necesitará php-mysql, un módulo PHP que permite que este se comunique con bases de datos basadas en MySQL. También necesitará libapache2-mod-php para habilitar Apache para gestionar archivos PHP. Los paquetes PHP básicos se instalarán automáticamente como dependencias.

Para instalar estos paquetes, ejecute lo siguiente:

apt install php libapache2-mod-php php-mysql

Configuraciones en (/etc/php/7.4/apache2/php.ini):

error_log = /var/log/php-scripts.log
extension=curl
extension=fileinfo
extension=mbstring
extension=exif
extension=mysqli
extension=openssl
extension=pdo_mysql
date.timezone = «Europe/Madrid»

[MySQLi]
mysqli.default_host = localhost
mysqli.default_pw = [xxx]

Install phpMyAdmin

apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl

Los ficheros de la aplicación terminan en:

/usr/share/phpmyadmin/

Crear el directorio temporal y el fichero de configuración, copiando la plantilla (/usr/share/phpmyadmin/):

mkdir /usr/share/phpmyadmin/tmp
chown root:www-data /usr/share/phpmyadmin/tmp
chmod 770 /usr/share/phpmyadmin/tmp
cp config.sample.inc.php config.sample.inc.php
vim config.sample.inc.php

Y editando los parámetros:

$cfg[‘blowfish_secret’] = [xxx]
$cfg[‘TempDir’] = ‘/usr/share/phpmyadmin/tmp’;
$cfg[‘DefaultLang’] = ‘en’;

Crear la seguridad de directorio en Apache, con el fichero y usuario:

mkdir /etc/apache2/passwordfiles
htpasswd -c /etc/apache2/passwordfiles/phpMyAdmin.password [nombre de usuario]

Configurar el directorio virtual (/etc/apache2/sites-enabled/default-ssl.conf):

Alias /phpmyadmin /usr/share/phpmyadmin/
<Directory /usr/share/phpmyadmin/>
AuthType Basic
AuthName «Restricted Content»
AuthUserFile /etc/apache2/passwordfiles/phpMyAdmin.password
Require valid-user
</Directory>

Y proteger los directorios del sistema de phpMyAdmin (/etc/apache2/sites-enabled/default-ssl.conf):

<Directory /usr/share/phpmyadmin/templates>
Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
Require all denied
</Directory>

Instalar y configurar SAMBA

Instalar el paquete básico:

apt update
apt install samba

Crear un usuario de linux para gestionar el acceso a la carpeta compartida y asignarle una contraseña de samba (no es la misma que de linux):

adduser [sambauser]
smbpasswd -a [sambauser]

Crear el directorio donde deben ir los ficheros. En mi caso será un directorio para el servidor, con un usuario de samba para acceder desde Windows. Además hay que ajustar los derechos del directorio al usuario que hemos creado.

mkdir /var/samba/sambashare -p
chown sambauser:sambauser /var/samba/sambashare/ -R
chmod 770 /var/samba/sambashare -R

Ahora registrar el directorio en la configuración de samba (/etc/samba/smb.conf):

[sambashare]
comment = Samba on Ubuntu
path = /var/samba/sambashare
read only = no
browsable = yes

Además de alinear el grupo de trabajo al de la red de windows en el mismo fichero (/etc/samba/smb.conf):

workgroup = WORKGROUP

Añadir los puertos necesarios al firewall (iptables). En este ejemplo se incluyen a partir de la linea 5 de las reglas existentes de iptables y solo se da acceso a un origen de red interna ‘192.168.0.0/24‘:

sudo iptables -I INPUT 5 -s 192.168.0.0/24 -p udp -m udp –dport 137 -j ACCEPT
sudo iptables -I INPUT 5 -s 192.168.0.0/24 -p udp -m udp –dport 138 -j ACCEPT
sudo iptables -I INPUT 5 -s 192.168.0.0/24 -p tcp -m tcp –dport 139 -j ACCEPT
sudo iptables -I INPUT 5 -s 192.168.0.0/24 -p tcp -m tcp –dport 445 -j ACCEPT
iptables-save > /etc/iptables/rules.v4
systemctl restart iptables

Al final reiniciar el servicio:

systemctl restart smbd

Compartir un nuevo directorio

Editar la configuración de samba (/etc/samba/smb.conf), para registrar el nuevo directorio:

[sambashare]
comment = Samba on Ubuntu
path = /var/samba/sambashare
read only = no
browsable = yes

Hacer que aparezca Ubuntu en el Windows 10 Network Browsing

Descargar e instalar el paquete WSDD.

wget https://github.com/christgau/wsdd/archive/master.zip
unzip master.zip
mv wsdd-master/src/wsdd.py wsdd-master/src/wsdd
cp wsdd-master/src/wsdd /usr/bin
cp wsdd-master/etc/systemd/wsdd.service /etc/systemd/system
Abrir los puertos necesarios.

Adaptar la configuración del servicio:

vim /etc/systemd/system/wsdd.service

systemctl daemon-reload
systemctl start wsdd
service wsdd status
systemctl enable wsdd

sudo iptables -I INPUT 9 -s 192.168.0.0/24 -p udp –dport 3702 -j ACCEPT
sudo iptables -A OUTPUT -p udp –dport 3702 -j ACCEPT
sudo iptables -I INPUT 9 -s 192.168.0.0/24 -p tcp -m tcp –dport 5357 -j ACCEPT

Wake on LAN

Para configurar seguir los siguientes pasos:

  1. Activar la opción en el BIOS del ordenador
  2. Determinar la dirección MAC de la tarjeta de red que deba recibir el paquete WOL
  3. Activar la opción en el sistema operativo (windows y/o Linux)
  4. Abrir el puerto en el router y asegurar que el router transmite el paquete al PC en cuestión (en general puerto 9)
  5. Instalar el tool en Windows/Android/Linux que pueda enviar un paquete WOL al PC en cuestión

Printserver para compartir la impresora

Objetivo: compartir la impresora en la red domestica

Instalar CUPS y SAMBA,

apt-get install cups cups-pdf
apt-get install printer-driver-gutenprint

Abrir el puerto en el firewall para administrar CUPS (631) desde un explorador (en mi caso solo se permite desde la red local):

sudo iptables -I INPUT 9 -s 192.168.0.0/24 -p tcp -m tcp –dport 631 -j ACCEPT

Añadir el usuario (linux) para gestionar las impresoras al grupo «lpadmin», que es el grupo administrativo de CUPS (en mi caso el usuario de samba). Este usuario se utilizará para acceder a la página de administración de CUPS (http://192.168.0.114:631):

adduser [sambauser] lpadmin

Instalar PI-HOLE

Importante:

El servicio en ubuntu es «pihole-FTL«.

systemctl restart pihole-FTL

Es necesario instalar SQLITE y activar el módulo PHP de SQLITE3:

apt-get install php7.4-sqlite3
/etc/php/7.4/apache2/php.ini -> «extension=sqlite3»

Para cambiar la contraseña del admin de pi-hole:

El directorio www de pi-hole en Apache debe pertenecer a «www-data» y el usuario «pihole» al grupo «www-data»:

chown www-data:www-data pi_html/ -R
usermod -a -G pihole www-data

Asegurar que los puertos de DNS estén abiertos para el tráfico local:

sudo iptables -I INPUT 9 -s 192.168.0.0/24 -p udp -m udp –dport 53 -j ACCEPT
sudo iptables -I INPUT 9 -s 192.168.0.0/24 -p tcp -m tcp –dport 53 -j ACCEPT

Comprobar que no se use otro nameserver que el pi-hole local:

/etc/resolv.conf

Renovar Certificados (Apache y Tomcat)

Con sudo o con usuario root, primero parar Apache service y despues renovar mediante el cerbot:

systemctl stop apache2
certbot renew
systemctl start apache2

Ahora actualizar los certificados en Tomcats:

Asegurar que la configuración en el fichero «/etc/tomcat9/server.xml» es correcta:

<Connector port=»8443″ protocol=»org.apache.coyote.http11.Http11NioProtocol» maxThreads=»150″ SSLEnabled=»true» >
<SSLHostConfig>
<Certificate
certificateFile=»/etc/tomcat9/certs/cert.pem»
certificateKeyFile=»/etc/tomcat9/certs/privkey.pem»
certificateChainFile=»/etc/tomcat9/certs/chain.pem» />
</SSLHostConfig>
</Connector>

Despues copiar los ficheros de certicado de Let’s Encryp a la configuración de Tomcat y reiniciar el servicio.

rm /etc/tomcat9/certs/*
cd /etc/letsencrypt/live/thomaskoslowsky.com
cp {cert,chain,privkey}.pem /etc/tomcat9/certs
chown tomcat:tomcat /etc/tomcat9/certs/*
systemctl restart tomcat9