Breve documentazione per inizializzare un server web Ubuntu (versione in questione: 20.04.1 LTS)
❗ Usare sudo prima del comando se non si hanno i diritti necessari.
Link per visualizzare direttamente la parte interessata:
Configurazione IP & installazione pacchetti necessari
Attivazione HTTPS su Apache2 (Self-Signed)
Installazione e configurazione del servizio Samba (SMB)
-
apt update
-
apt upgrade
-
apt install net-tools
-
nano /etc/hosts
-
nano /etc/hostname
📌Checkpoint: immettere il comando 'reboot' per riavviare il server web e visualizzare l'hostname aggiornato.
reboot
- nano /etc/netplan/00-installer-config.yaml
Versione senza DHCP, indirizzi statici
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
addresses: [172.16.29.105/16]
gateway4: 172.16.1.7
nameservers:
addresses: [172.16.1.10, 1.1.1.1]
Versione con DHCP, indirizzi dinamici
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: true
dhcp6: true
Questa configurazione IP è stata fatta all'interno della scuola e riguarda il mio caso in particolare. Se il server è virtualizzato occorre impostare la scheda di rete in modalità Bridge.
- netplan try
📌Checkpoint: verificare se l'indirizzo è stato modificato correttamente tramite il comando 'ip addr' e verificare la connessione con il comando 'ping'.
ip addr
ping www.google.com
Introduzione SSH: protocollo che stabilisce una connessione remota cifrata tramite un'interfaccia a riga di comando con un altro host della rete. Ha sostituito il protocollo insicuro Telnet.
Introduzione Apache2: è il server web libero piu' diffuso al mondo, in grado di operare su una grande vastità di S.O. Ha il vantaggio di offrire controlli per la sicurezza come quelle effettuate da un proxy.
1. Installazione
-
apt install openssh-server
-
apt install apache2
📌Checkpoint: verificare l'installazione del server Apache aprendo il browser e mettendo nella barra degli indirizzi l'IP del server web, se viene visualizzata la pagina di default di Apache l'installazione è andata a buon fine.
172.16.29.105/index.html
2. Creazione di un utente per un sito specifico
-
useradd -s /bin/bash -d /var/www/'nome_cartella_sito' -m 'nome_user'
-
passwd 'password'
📌Checkpoint: fare il login da remoto per verificare la corretta aggiunta dell'utente.
3. Aggiunta del sito web
-
cd /var/www/'nome_cartella_sito'
-
mkdir log
-
cd /etc/apache2/sites-available
-
cp 000-default.conf 'nome_cartella_sito'.conf
-
nano 'nome_cartella_sito'.conf
Togliere il commento nella riga ServerName e inserire il dominio del sito; In DocumentRoot inserire il percorso della cartella del sito; In ErrorLog e CustomLog togliere il $, le parentesi graffe e inserire il percorso della cartella del sito /log.
4. Abilitazione del sito
-
a2ensite 'file_configurazione_sito'.conf
-
systemctl restart apache2.service
📌Checkpoint: immettere nella barra degli indirizzi del browser 'nome_cartella_sito.dominio', se vengono visualizzati i file inseriti dall'utente registrato il sito funziona correttamente. Di seguito alcuni esempi:
sitoa-105.virtual.marconi
sitob-105.virtual.marconi
ubuntu-srv105.virtual.marconi
❗ Questo sarà un esempio applicato al sito chiamato sitoa-105.virtual.marconi, modificare i testi di seguito per adattarli a qualsiasi altro sito.
Azione preliminare. Controllo della versione OpenSSL
- openssl version -a
📌Checkpoint: Controllare l'output, dovrà essere simile al seguente:
OpenSSL 1.1.1f 31 Mar 2020
built on: Mon Apr 20 11:53:50 2020 UTC
platform: debian-amd64
options: bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack ...
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific
- a2enmod ssl, in caso il modulo SSL non fosse attivo.
1. Creazione del certificato SSL
-
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/'nome_chiave'.key -out /etc/ssl/certs/'nome_certificato'.crt
Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:sitoa-105.virtual.marconi Email Address []:
-
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
2. Configurare Apache per utilizzare SSL
-
nano /etc/apache2/conf-available/ssl-params.conf
# from https://cipherli.st/ # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProtocol All -SSLv2 -SSLv3 SSLHonorCipherOrder On # Disable preloading HSTS for now. You can use the commented out header line that includes # the "preload" directive if you understand the implications. #Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff # Requires Apache >= 2.4 SSLCompression off SSLSessionTickets Off SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
-
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak, prima di modificare il file di configurazione di SSL creiamo un backup del file stesso.
-
nano /etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost ServerName sitoa-105.virtual.marconi DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/'nome_certificato'.crt SSLCertificateKeyFile /etc/ssl/private/'nome_chiave'.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </VirtualHost> </IfModule>
3. Reindirizzamento delle richieste HTTP ad HTTPS
-
nano /etc/apache2/sites-available/sitoa-105.conf e aggiungere le righe comprese tra i tre punti di sospensione.
<VirtualHost *:80> . . . ServerName sitoa-105.virtual.marconi Redirect / https://sitoa-105.virtual.marconi/ . . . </VirtualHost>
-
systemctl reload apache2
4. Modificare le impostazioni del firewall per permette il traffico in entrata e uscita
-
ufw allow 'Apache Full'
-
ufw delete allow 'Apache'
-
ufw status, visualizzare lo stato del firewall.
📌Checkpoint: lo status del firewall dovrà essere simile al seguente:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
5. Controllare che le modifiche siano avvenute con successo
📌Checkpoint: immettere il comando 'apache2ctl configtest' per verificare che non ci siano errori di sintassi. Output:
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
- systemctl restart apache2, solo se il checkpoint non ha dato errori.
6. Test
Digitare sul browser https://sitoa-105.virtual.marconi (questo è il mio caso in particolare, il dominio o l'IP può essere differente in base alla configurazione effettuata). Visto che il certificato non è verificato e confermato da nessuna autorità, riceveremo questo avvertimento, ma solamente per la prima volta:
Per procedere fare click su 'Avanzate' e fare un click sul link per continuare comunque la connessione al sito.
❗ N.B. il lucchetto sarà segnato da una X, questo vuol dire che il certificato non è confermato, ma la connessione è comunque criptata. ❗
❗ Questo sarà un esempio applicato al sito chiamato sitoa-105.virtual.marconi, modificare i testi di seguito per adattarli a qualsiasi altro sito.
Azione preliminare. Controllo della versione OpenSSL
- openssl version -a
📌Checkpoint: Controllare l'output, dovrà essere simile al seguente:
OpenSSL 1.1.1f 31 Mar 2020
built on: Mon Apr 20 11:53:50 2020 UTC
platform: debian-amd64
options: bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack ...
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific
- a2enmod ssl, in caso il modulo SSL non fosse attivo.
Azione preliminare 2. Creazione di una nuova cartella in /etc/apache2
-
cd /etc/apache2, spostamento all'interno di /etc/apache2.
-
mkdir ssl, creazione della cartella chiamata ssl, conterrà al suo interno la chiave privata, pubblica e il certificato.
-
cd ssl, spostamento all'interno della cartella appena creata.
1. Creazione della chiave privata
- openssl genrsa -out 'nome_chiave_privata'.key 2048
2. Estrazione della chiave pubblica dalla chiave privata
- openssl rsa -in 'nome_chiave_privata'.key -pubout -out 'nome_chiave_pubblica'.key
3. Creazione del CSR (Certificate Signing Request)
-
openssl req -new -key 'nome_chiave_privata'.key -out 'nome_csr'.csr
Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:sitoa-105.virtual.marconi Email Address []:
📌Checkpoint: immettere il comando 'openssl req -text -in 'nome_csr'.csr -noout -verify' per verificare che le informazioni inserite all'interno del CSR siano corrette. Output:
verify OK
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=US, ST=Utah, L=Lehi, O=Your Company, Inc., OU=IT, CN=yourdomain.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:bb:31:71:40:81:2c:8e:fb:89:25:7c:0e:cb:76:
[...17 lines removed]
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
0b:9b:23:b5:1f:8d:c9:cd:59:bf:b7:e5:11:ab:f0:e8:b9:f6:
[...14 lines removed]
❗ Ora sarà necessario inviare il CSR creato alla CA (Certification Authority). Una volta inviato riceveremo un certificato rilasciato sicuro con estensione .cer.
4. Configurare Apache per utilizzare il nuovo certificato
-
nano /etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost ServerName sitoa-105.virtual.marconi DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/'nome_cer'.cer SSLCertificateKeyFile /etc/apache2/ssl/'nome_chiave_privata'.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </VirtualHost> </IfModule>
Introduzione: FTP (File Transfer Protocol) è un protocollo utilizzato per il trasferimento di dati basato su un sistema client-server. Consente di caricare, scaricare e spostare file all'interno di un sistema di directory.
-
apt install vsftpd
-
nano /etc/vsftpd.conf
listen=yes listen_ipv6=NO anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES ftpd_banner=Welcome to our FTP service. chroot_local_user=YES local_root=/var/www/$USER user_sub_token=$USER allow_writeable_chroot=YES secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=NO session_support=YES log_ftp_protocol=YES
-
systemctl start vsftpd
-
systemctl enable vsftpd
Introduzione: SMB (Server Message Block) è un protocollo utilizzato soprattutto dai Microsoft Windows, principalmente per condividere file, stampanti, porte seriali e comunicazioni di varia natura tra diversi nodi di una rete. Include anche un processo di comunicazione tra processi autenticata.
-
apt update
-
apt install samba
📌Checkpoint: immettere il comando 'whereis samba' e verificare l'output, che deve essere il seguente:
samba: /usr/sbin/samba /usr/lib/samba /etc/samba /usr/share/samba /usr/share/man/man7/samba.7.gz /usr/share/man/man8/samba.8.gz
-
mkdir /home/'nome_user'/sambashare/
-
nano /etc/samba/smb.conf e inserire in fondo al file queste righe di testo:
[sambashare] comment=Samba on Ubuntu path=/home/'nome_user'/sambashare read only=no browsable=yes #Condivisione di una cartella [shared] comment = Cartella condivisa # Commento sulla condivisione path = /cartella/da/condividere # Percorso della condivisione browseable = yes # Rende visibile la condivisione public = yes # Rende la cartella accessibile create mask = 0755 # Permessi dei file #Condivisione della home [homes] comment = Home condivisa # Commento sulla condivisione browseable = yes # Rende visibile la condivisione valid users = %S # Utente che vi può accedere create mask = 0700 # Permessi dei file directory mask = 0700 # Permessi della home
-
service smbd restart
-
ufw allow samba, permette al firewall di lasciar passare il traffico in entrata e in uscita che riguarda il servizio SMB.
-
smbpasswd -a 'nome_user'
📌Checkpoint per Ubuntu: aprire il default file manager, fare click su Connect to Server e inserire 'smb://ip-address/sambashare'.
📌Checkpoint per macOS: nel menu Finder, fare click su Go > Connect to Server e inserire 'smb://ip-address/sambashare'.
📌Checkpoint per Windows: aprire il default file manager e modificare l'indirizzo con '\\ip-address\sambashare'.
❗ N.B. per 'ip-address' si intende l'IP del webserver; 'sambashare' è il nome della cartella per la condivisione. ❗
Introduzione: Tomcat è un server web che fornisce una piattaforma software per l'esecuzione di applicazioni web sviluppate in linguaggio Java.
1. Installazione Java
-
apt update
-
apt install default-jdk
📌Checkpoint: Verificare la versione Java installata inserendo il comando java -version. Un esempio di output è questo:
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)
2. Creazione di un nuovo utente che eseguirà il servizio Tomcat
- useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat
3. Installazione Tomcat e permessi
-
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.41/bin/apache-tomcat-9.0.41.tar.gz -P /tmp
-
tar xf /tmp/apache-tomcat-9*.tar.gz -C /opt/tomcat, estraiamo l'archivio scaricato dentro la cartella /opt/tomcat.
-
cd /opt/tomcat
-
sudo chgrp -R tomcat /opt/tomcat
-
sudo chmod -R g+r conf
-
sudo chmod g+x conf
-
sudo chown -R tomcat webapps/ work/ temp/ logs/
4. Creazione di un systemd Unit file
-
nano /etc/systemd/system/tomcat.service, inserendo le righe di testo di sotto permetterà di eseguirlo come un servizio.
[Unit] Description=Tomcat 9 servlet container After=network.target [Service] Type=forking User=tomcat Group=tomcat Environment="JAVA_HOME=/usr/lib/jvm/default-java" Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true" Environment="CATALINA_BASE=/opt/tomcat/latest" Environment="CATALINA_HOME=/opt/tomcat/latest" Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid" Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC" ExecStart=/opt/tomcat/latest/bin/startup.sh ExecStop=/opt/tomcat/latest/bin/shutdown.sh [Install] WantedBy=multi-user.target
❗ N.B. Modificare il percorso JAVA_HOME se la cartella d'installazione di Java è differente ❗
-
systemctl daemon-reload
-
systemctl start tomcat, esecuzione del servizio Tomcat.
📌Checkpoint: verificare lo stato del servizio inserendo il comando 'systemctl status tomcat'. L'output dovrà essere il seguente:
* tomcat.service - Tomcat 9 servlet container
Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2018-09-05 15:45:28 PDT; 20s ago
Process: 1582 ExecStart=/opt/tomcat/latest/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 1604 (java)
Tasks: 47 (limit: 2319)
CGroup: /system.slice/tomcat.service
- systemctl enable tomcat, se non ci sono errori è possibile eseguire il servizio Tomcat all'esecuzione del server utilizzando questo comando.
5. Modificare il firewall lasciando passare il traffico Tomcat sulla porta 8080
- ufw allow 8080/tcp
6. Accesso a Tomcat
Digitare all'interno della barra di ricerca del browser http://server_domain_or_IP:8080