Creare un virtual host con Apache2

Per la creazione di un virtualhost su un server Debian equipaggiato con Apache2 è molto semplice.

Specifiche del server:

  • Indirizzo IP: 192.168.100.23
  • nome del virtualhost: http://www.mioserver.local
  • directory da pubblicare: /var/www/mioserver/httpdocs
  • directory dei log: /var/www/mioserver/log

Si aggiunge questa riga al file /etc/hosts
192.168.100.23 www.mioserver.local

Si crea la struttura delle directory da pubblicare e un file di prova:
mkdir /var/www/mioserver
mkdir /var/www/mioserver/httpdocs
mkdir /var/www/mioserver/log
echo "funziona!!!" > /var/www/mioserver/httpdocs/index.html
chmod -R www-data:www-data /var/www/mioserver/httpdocs

a questo punto si crea il file di configurazione del virtual host /etc/apache2/sites-enabled/001-mioserver

NameVirtualHost *
<VirtualHost *>
ServerName http://www.mioserver.local
DocumentRoot /var/www/mioserver/httpdocs
CustomLog /var/www/mioserver/log/access.log combined
ErrorLog /var/www/mioserver/log/error.log
</VirtualHost>

Se tutto è stato svolto correttamente, sarà sufficiente ricaricare il server apache:
/etc/init.d/apache2 reload

Shell remota con SSH

OpenSSH è più comune implementazione del protocollo SSH (Secure SHell).

Mediante la creazione di un canale criptato, ssh, permette di accedere a sistemi remoti e amministrarli mediante shell, come se si trattasse di sistemi locali.

Per connettersi ad un sistema remoto è necessario disporre di un client ssh. Il sistema remoto, a sua volta, deve avere un servizio ssh attivo.

La connessione avviene molto semplicemente mediante il comando:
ssh server.dominio.local
dove server.dominio.local è il server a cui ci si vuole connettere.

Nel caso in cui volessimo specificare un utente diverso da quello locale è sufficiente digitare:
ssh untente@server.dominio.local

Il server richiederà l’inserimento della password dell’utente specificato e successivamente, se corretta, fornirà una shell.

I file utilizzati da OpenSSH

Client

all’interno della propria home si trova un directory che si chiama .ssh (dir nascosta, usare ls -la per visualizzarla).
Dentro questa directory si trovano alcuni file utilizzati dal servizio ssh client.

  • known_hosts
    contiene le fingerprint delle chiavi pubbliche dei server conosciuti. Serve a garantire autenticità dell’identità dichiarata dai server ai quali si chiede accesso. Se il server al quale si chiede accesso è sconosciuto, verrà richiesta conferma della sua identità e la sua fingerprint verrà salvata in questo file per future autenticazioni.

Server

all’interno di ogni home directory è presente, anceh in questo caso una dir .ssh utile alla gestione del servizio di ssh server.
Il file più interessante è:

  • autorized_keys
    contiene le fingerprint pubbliche dai client autorizzati alla connessione. A seconda della configurazione, il server le può gestire per diversi tipi di operazioni. E’ possibile impedire l’accesso a qualunque client non sia in questa lista oppure permettere a chi è presente di accedere senza la richiesta della password (debian di default)

Come evitare di inserire la password tramite l’uso delle chiavi RSA

Per accedere ad un server ssh senza che vanga richiesta la password è possibile utilizzare le chiavi RSA per garantire autenticità del client. Il client dovrà generare le proprie chiavi RSA statiche mediante il comando:
ssh-keygen
Successivamente si deve trasportare la chiave pubblica /home/utente/.ssh/id_rsa.pub sul server attraversu un canale sicuro.
L’ultima operazione consiste nell’aggiungere la chiave RSA alle chiavi accettate dal server:
cat id_rsa.pub >> /home/utente/.ssh/authorized_keys
Chiaramente quest’ultima operazione dev’essere compiuta sul server.

La crittografia

La crittografia ha lo scopo di comunicare un messaggio al destinatario garantendo l’impossibilità di fruizione a soggetti non autorizzati.

I due principali problemi che la crittografia moderna (a chiavi asimmetriche) risolve sono:

  • garanzia che solo il legittimo destinatario possa leggere il messaggio (segretezza)
  • garanzia che il mittente sia proprio chi dice di essere (autenticità)

La crittografia asimmetrica si realizza matematicamente e ha come risultato la generazioni di una coppia di chiavi. La prima chiave, denominata “privata”, viene custodita segretamente, mentre la seconda, detta “pubblica”, viene resa disponibile a chiunque ne faccia richiesta.

Il funzionamento, molto semplificato, del meccanismo di crittografia asimmetrica è il seguente: un messaggio codificato con una chiave, può essere decodificato solo con l’altra chiave della coppia. Pertanto se codifichiamo con chiave pubblica, solo il possessore della chiave privata corrispondente potrà decodificare. Se codifichiamo una piccola parte di messaggio con la chiave privata, si potrà verificare l’identità decodificandolo con la chiave pubblica corrispondente.

Per garantire la segretezza, il messaggio viene codificato mediante la chiave pubblica del destinatario, il quale, unico titolare della chiave privata associata, sarà l’unico in grado di decodificarlo.

L’autenticità del viene garantita firmando il messaggio con la chiave privata del mittente, consentendo al destinatario la verifica mediante l’utilizzo della relativa chiave pubblica disponibile a tutti.

L’utilizzo della crittografia, in un sistema GNU/Linux offre la possibilità di ottenere strati di sucurezza implementati tramite SSL ed è alla base di servizi come SSH e HTTPS.

Backup

Il backup è la procedura che fa la differenza tra una seccatura e un disastro.

Realizzare una buona procedura di backup va oltre i comandi veri e propri che lo realizzano.
Sarebbe buona norma mantenere i supporti di backup, lontani dal sistema dal quale provengono per scongiurare la possibilità che un evento disastroso possa danneggiare sia gli originali che le copie.

Nella corretta amministrazione di un sistema è molto importante conoscere i comandi che permettono di archiviare i dati per conservarli in modo sicuro.

I comandi per il backup

tar

Il comando tar (Tape ARchive) serve a creare archivi sequenziali partendo da una moltitudine di file o di directory. Originarimente utilizzato per archiviare su supporti a nastro, mantiene la propria posizione di dominio nei comandi di archiviazione utilizzati nei sistemi GNU/Linux

gzip / gunzip

Questi due comandi comprimono/decomprimono file gz.
Possono essere usati in coppia con tar.

bzip2 / bunzip2

Questi due comandi comprimono/decomprimono file bzip2.
Questa coppia di compressione/decompressione è molto più efficiente di gzip/gunzip seppur più lenta.
Anch’essi possono essere utilizzati insieme a tar.

Qualche esempio

tar cvfz /tmp/mioarchivio.tar.gz /home/utente/miadir
la directory /home/utente/miadir viene archiviata e compressa nel file /tmp/mioarchivio.tar.gz

tar xvfz /tmp/mioarchivio.tar.gz
il file /tmp/mioarchivio.tar.gz viene decompresso ed estratto nella posizione corrente

tar tvf mioarchivio.tar
viene mostrato il contenuto dell’archivio mioarchivio.tar

Il boot di un sistema GNU/Linux

Su architettura i386 (intel-based) il boot avviene secondo questo principio:

  • all’accensione il BIOS definisce l’ordine dei dispositivi da cui eseguire il codice di avvio
  • il Boot Sector del primo dispositivo contiene il codice (o il suo riferimento) del loader del sistema operativo. I due boot loader più utilizzati sono LiLo e GRUB.
  • il loader carica il kernel in memoria e lo esegue. Il kernel esegue tutte le verifiche dell’hardware disponibile.
  • il kernel esegue il processo INIT, padre di tutti gli altri processi. Mediante i file di configurazione e il processo di inizializzazione dei servizi, viene avviato il sistema in ogni sua parte.

GRUB

Il bootloader più flessibile e versatile si chiama GRUB (GRand Unified Bootloader).
Il file di configurazione del bootloader è:
/boot/grub/menu.lst

Questi sono alcuni dei parametri di configurazione del file:

default 0
indica quale voce del menù verrà eseguita se non diversamente specificato dall’utente.

timeout 10
indica i secondi che verranno concessi all’utente per compiere la sua scelta

title Debian GNU/Linux
indica il titolo che apparirà nel menu
root (hd0,2)
indica la partizione di base da considerare (terza del primo disco)
kernel /boot/vmlinuz-2.6.10 ro root=/dev/hda3
indica il kernel e i parametri da caricare
initrd /boot/initrd-2.4.7-10.img
indica il ramdisc da installare durante il boot

Altre caratteritiche di GRUB

Durante la prima schermata di menù è possibile premere la lettera “e” per modificare al volo le voci del menù ed eventualmente correggere errori di configurazioni.
Inoltre è possibile premere la lettera “c” per ottenere una console minimale utilissima per eseguire un debug del sistema piuttosto approfondito.

Editor di testi VI

L’editor di testi più usato nell’ambiente GNU/Linux è VI (VIsual editor).

Normalmente, si installa la sua versione avanzata (VIM) oppure quella estesa (VIM Enhanced). Sono tutte sostanzialmente simili, differiscono in alcune caratteristiche marginali.

Per avviare l’editor di testi è sufficiente utilizzare il comando:
vi
oppure
vi nomefile
nel primo caso verrà solamente avviato l’editor, nel secondo verrà anche aperto un file. Se il file non esiste, sarà creato al primo salvataggio.

Modalità comando – modalità inserimento

L’editor VI opera in due modalità:

  • Modalità comando – Permette di inserire comandi per compiere tutte le azioni tipiche di un editor di testi: aprire un file, salvare un file, uscire, ricercare e sostituire parole.
  • Modalità inserimento – Permette di scrivere e modificare il testo vero e proprio.

Come passare da una modalità all’altra

Ci sono diversi modi per passare dalla modalità comando a quella inserimento. Per semplicità possiamo digitare la lettera “i” (inserimento).

Per tornare alla modalità comando è sufficiente premere il tasto ESC.

Una successiva pressione del tasto ESC manterrà la modalità comando. Per questa ragione, in qualsiasi condizione ci si trovi, per uscire dall’imbarazzo, è sufficiente premere ripetutamente il tasto ESC e si avrà la certezza di essere in modalità comando.

Comandi utili

Nella modalità comando, queste sono le azioni più utili:

ZZ salvare e uscire
:r nomefile aprire un file
:w salvare un file
:w nomefile salvare un file con un nuovo nome
:wq salvare ed uscire
:q uscire (solo se non si sono apportate modifiche non ancora salvate
q! uscire senza salvare

Comandi di copia e incolla

yy copia della riga corrente
2y(giu) copia delle due righe sottostanti
p incolla

Cancellare righe o caratteri

x cancella un carattere dopo il cursore
5x cancella cinque caratteri dopo il cursore
D cancella dal cursore alla fine della riga
dd cancella la riga in cui si trova il cursore
4dd cancella quattro righe dal cursore in poi
dG cancella tutte le righe fino alla fine del file
d1G cancella tutte le righe dall’inizio del file alla riga corrente

Spostarsi nel file

^ inizio riga corrente
$ fine riga corrente
G fine del file
1G inizio del file
:15 quindicesima riga

Ricerca e sostituzione del testo

/stringa cerca la stringa muovendosi verso il basso
? cerca la stringa muovendosi verso l’alto
u annulla l’ultima modifica
U annulla l’ultimo annullmento
. ripete l’ultimo comando

Dove trovare aiuto e risorse

Le domande più frequenti che hanno origine dell’approccio a GNU/Linux sono state affrontate decine e decine di volte da personalità di grande esperienza.

Inoltre esistono risorse preziose, senza le quali è molto difficile poter affrontare questo settore in modo proficuo. Partendo da Google, fino ad arrivare ai grandi portali tematici.

Per questa ragione vi segnalo qualche link interessante, lasciando a Google l’ingrato compito di trovare tutto quello che non è compreso in questa brevissima lista:

Il progetto GNU dal quale ha avuto origine GNU/Linux: http://www.gnu.org

Il progetto kernel.org che sviluppa e distribuisce il kernel: http://www.kernel.org

Indice del forum di compatibilità hardware: http://www.linuxquestions.org/hcl/index.php

Domande ricorrenti sulla shell BASH: http://www.faqs.org/faqs/unix-faq/shell/bash/

Le directory di sistema e il partizionamento

Le directory di sistema

Le directory di sistema sono comuni a quasi tutte le distribuzioni GNU/Linux. Per questo motivo è molto importante sapere, in via generale, quali sono le loro funzioni ed il loro contenuto.

  • /
    Questa directory detta “slash” o “root directory” (da non confondere con la “/root”) è la directory base di tutto il sistema. E’ detta “root directory” perchè è la radice alla quale fanno riferimento tutte le altre come se fossero dei rami. Qualsiasi file, directory, dispositivo deve essere in un qualche modo collegato (montato) a questa struttura per essere utilizzato dal sistema operativo.
  • /boot
    Contiene il kernel binario eseguibile (a volte compresso) ed i file necessari all’al bootstrap del sistema.
  • /etc
    Contiene i file di configurazione del sistema. Normalmente questi file sono di tipo testuale e corrispondono ai servizi di base e aggiuntivi installati sul sistema. Alcuni servizi possono avere i file di configurazione nelle rispettive directory di installazione.
  • /var
    Contiene file di dati che possono variare di dimensioni. Un classico esempio sono i file di log e gli archivi dei server ftp.
  • /usr
    Contiene i servizi e i programmi in uso agli utenti del sistema. Normalmente vi si trovano le installazioni dei servizi come i Web Server o i File Server.
  • /home
    In questa posizione vengono ospitate le home directory degli utenti che utilizzano il sistema. Tutte le configurazioni e le personalizzazioni che gli utenti apportano al loro profilo (preferiti del browser, configurazione del desktop, configurazione del client di posta) sono ospitate qui.
  • /root
    La home directory dell’utente root. Ha la medesima funzione della directory /home/utente ma è tenuta separta per sottolineare la completa differenza tra un utente normale e il superutente (root).
  • /tmp
    Qui vengono contenuti i file temporanei necessari ai processi e ai servizi. Molte distribuzioni ripuliscono periodicamente questa locazione.
  • /lib
    Contienele librerie software comuni a molti programmi e servizi.
  • /bin
    Contiene i file binari eseguibili utili al normale funzionamento del sistema.
  • /sbin
    Contiene i file binari eseguibili utili al normale funzionamento del sistema ma che normalmente possono essere eseguiti solo dal superutente.
  • /proc
    Non sono contenuti veri file di dati ma pseudofile che permettono di dare e ottenere informazioni al kernel.
  • /dev
    Tutti i dispositivi collegati al sistema vengono organizzati in questa directory per essere utlizzati da driver e utenti.
  • /mnt
    In questa directory è possibile collegare (montare) tutti i filesystem opzionali di cui possiamo avere bisogno (floppy, cdrom, dvd, risorse di rete)

Il partizionamento

Il partizionamento è una pratica che consente di suddifivere un dispositivo fisico come un hard disk in tanti dispositivi logici diversi. Il sistema operativo li considererà come fossero completamente separati tra loro.

Il partizionamento più semplice possibile è rappresentato da una sola partizione per “/” e una per l’area di swap.

Le installazioni più elaborate, comunemente dette “installazioni strutturate” prevedono l’assegnazione di una partizione (o a volte di interi dischi) alle partizioni “/home”, “/var”, “/boot”, “/usr”, “/tmp”. I motivi sono molteplici e per semplicità eviterò di trattarli in questa sede.

Identificazione di dischi e partizioni

Per semplicità prenderemo in esame solo due canali IDE e un canale SCSI.
Ad ogni canale IDE si possono connettere solo due dispositivi, uno master e uno slave.

La nomenclatura dei dispositivi è molto semplice:
Primo dipositivo (master) del primo canale IDE: hda
Secondo dispositivo (slave) del primo canale IDE: hdb

Primo dipositivo (master) del secondo canale IDE: hdc
Secondo dispositivo (slave) del terzo canale IDE: hdd

Per un ipotetico canale SCSI è ancora più semplice:

primo disco SCSI: sda
secondo disco SCSI: sdb
terzo disco SCSI: sdc
ecc ecc

Le partizioni inoltre vegono prese sequenzialmente partendo da 1.
Per esempio:

la terza partizione del disco slave del primo canale IDE: hdb3
la seconda partizione del primo disco SCSI: sda2
ecc ecc

Ovviamente questa è una semplificazione che non tiene conto di dispositivi SATA e device di USB storage, ma per semplicità possiamo dire che ogni device di storage o viene preso come disco SCSI o come disco IDE per cui possiamo estendere questa pratica anche ai casi meno ordinari.

Progettare un’installazione GNU/Linux

Molti credono che installare un sistema operativo abbia solo problemi di carattere tecnico, quali driver e supporto dell’hardware. I sistemisti più esperti, invece sanno bene che l’installazione di un sistema operativo richiede un serio progetto.

Vediamo, in via generale, quali punti andrebbero tenuti in considerazione:

  • Specifiche hardware
  • Funzioni della macchina
  • Utenti
  • Affidabilità richiesta

Ovviamente questi sono solo alcuni dei punti da prendere in considerazione, perchè si possono compiere scelte in fase di installazione, influenzate da un numero pressochè infinito di dettagli.

Specifiche hardware

Questa variabile influenza molte delle scelte da compiere in fase di installazione. La scelta dei driver giusti è fondamentale per la buona riuscita di tutto il processo di installazione. Inoltre la dimensione dei dischi e della RAM ci daranno limiti e condizioni nella scelta delle partizioni e nel dimensionamento dello swap.

Funzioni della macchina

Il compito che la macchina dovrà assolvere è uno dei punti più importanti nelle decisioni che si devono compiere durante l’installazione. A seconda che esse diventi un webserver, un fileserver, un proxy server, un firewall o un desktop, si devono fare delle scelte fondamentali.
Ad esempio è divenuta prassi comune scegliere un kernel interattivo (Preemptible kernel), per un desktop, ma mai e poi mai questa scelta andrebbe compiuta per un sistema server.
Inoltre si dovrà decidere quante partizioni saranno necessarie, e come disporle.
Da non sottovalutare la scelta del software da installare. Non dobbiamo mai dimenticare che è meglio installare pochi pacchetti e aggiungere successivamente quelli che servono, piuttosto che installare tutto il software disponibile per poi disabilitare quello non necessario.

Utenti

In base a quanti e quali utenti verranno ospitati sulla macchina si dovranno fare scelte strategiche. Per esempio il dimensionamento delle home directory, il tipo di servizi da offrire, le politiche di backup.

Affidabilità

L’affidabilità che la nostra macchina dovrà offrire ci fa decidere se scegliere soluzioni per l’integrità dei dati o per le tolleranze ai guasti.
Nella prima ipotesi penseremo all’installazione di dispositivi di backup e a RAID di dischi; nella seconda ipotesi dovremmo pensare alla virtualizzazione e al clustering.

Argomenti del corso

  • Pianificare un’installazione linux
  • Descrivere le funzionalità di una shell
  • Collegarsi ad un sistema remoto
  • Configurare e conoscere la Bash
  • Visione d’insiemesulla programmazione Bash
  • Messaggi di boot del kernel
  • Backup dei dati
  • Installare programmi
  • Processi attivi sul sistema e la loro gestione
  • Automazione del sistema
  • Configurazione della rete locale
  • Descrizione dei servizi
  • Inetd e Xinetd – ssh e altri servizi
  • Panoramica sul software disponibile
  • Il kernel