cybersecurity_linux/dispensa/cybersecurity_linux.md
2024-03-15 14:58:04 +01:00

393 lines
14 KiB
Markdown

---
title: Cybersecurity con sistemi GNU/Linux
subtitle: Dispensa del corso
author: Andrea Fazzi
data: 13.03.2024
urlcolor: blue
---
# Utilizzo avanzato del terminale
In questa sezione verranno discussi gli utilizzi più avanzati del
terminale. In particolare, ci si soffermerà sui cosidetti *terminal
multiplexer*.
## I *terminal multiplexer*
I terminal multiplexer in Linux sono strumenti potenti che consentono
agli utenti di creare più sessioni di terminale all'interno di una
singola finestra del terminale. Questi strumenti sono particolarmente
utili per gestire più processi contemporaneamente, mantenendo aperte
le sessioni anche dopo la disconnessione, e per organizzare le
finestre del terminale in modo efficiente.
Uno dei terminal multiplexer più popolari e ampiamente utilizzati è
`tmux`. `tmux` permette agli utenti di creare, gestire e navigare tra
più sessioni di terminale, facilitando l'organizzazione dei processi e
la gestione delle finestre. Con `tmux`, è possibile dividere la
finestra del terminale in più riquadri, ciascuno dei quali può
eseguire un processo separato, e passare facilmente da una sessione
all'altra.
Un altro esempio di terminal multiplexer è `screen`, che offre
funzionalità simili a `tmux` ma con una sintassi leggermente
diversa. Entrambi gli strumenti sono disponibili per la maggior parte
delle distribuzioni Linux e possono essere installati tramite il
gestore di pacchetti della distribuzione.
Utilizzare un terminal multiplexer può migliorare notevolmente
l'efficienza e la produttività degli sviluppatori e degli
amministratori di sistema, consentendo di lavorare con più processi
contemporaneamente senza dover aprire molteplici finestre del
terminale.
### Riferimenti
1. [https://opensource.com/article/21/5/linux-terminal-multiplexer](https://opensource.com/article/21/5/linux-terminal-multiplexer)
## Introduzione a `tmux`
`tmux` è un potente strumento di gestione delle sessioni di terminale
in Linux. Permette agli utenti di creare, gestire e navigare tra più
sessioni di terminale all'interno di una singola finestra del
terminale. Questa funzionalità è particolarmente utile per
l'esecuzione di più programmi con una singola connessione, come quando
si effettua una connessione remota a una macchina utilizzando Secure
Shell (SSH) [1].
Per iniziare ad utilizzare `tmux`, basta digitare `tmux` nel
terminale. Questo comando avvia un server `tmux`, crea una sessione
predefinita (numero 0) con una singola finestra e si collega ad
essa. Una volta connessi a `tmux`, è possibile eseguire qualsiasi
comando o programma come si farebbe normalmente.
## Installazione di `tmux`
`tmux` è un'applicazione disponibile nel repository di `Arch
Linux`. Per installarla basterà utilizzare il comando `pacman`.
```bash
sudo pacman -S tmux
```
Per verificare che l'installazione sia andata a buon fine:
```bash
tmux -V
```
Il comando restituirà la versione installata.
### Riferimenti
1. https://www.redhat.com/sysadmin/introduction-tmux-linux
2. https://linuxhandbook.com/tmux/
3. https://hamvocke.com/blog/a-quick-and-easy-guide-to-tmux/
4. https://linuxize.com/post/getting-started-with-tmux/
5. https://linuxconfig.org/introduction-to-terminal-multiplexer-tmux
6. https://github.com/tmux/tmux/wiki/Getting-Started
7. https://www.howtogeek.com/671422/how-to-use-tmux-on-linux-and-why-its-better-than-screen/
8. https://opensource.com/article/17/2/quick-introduction-tmux
9. https://wiki.archlinux.org/title/Tmux
10. https://github.com/tmux/tmux/wiki
## Primi passi con `tmux`
Per eseguire `tmux` si dovrà semplicemente invocare il comando
all'interno di una sessione di terminale.
```bash
tmux
```
È possibile staccare la sessione `tmux` premendo `Ctrl+B` seguito da
`D`. `tmux` opera utilizzando una serie di scorciatoie da tastiera
(keybindings) attivate premendo la combinazione "prefisso". Di
default, il prefisso è `Ctrl+B`. Dopo di che, premere `D` per staccare
dalla sessione corrente. La sessione continua ad eseguire in
background anche dopo la disconnessione, permettendo di riprendere
dove si è lasciati quando si è pronti a riconnettersi al server e
riattaccarsi alla sessione esistente.
`tmux` fornisce una serie di scorciatoie da tastiera per eseguire
comandi rapidamente all'interno di una sessione `tmux`. Alcune delle
più utili includono:
- `Ctrl+B D` — Stacca dalla sessione corrente.
- `Ctrl+B %` — Suddividi la finestra in due pannelli orizzontalmente.
- `Ctrl+B "` — Suddividi la finestra in due pannelli verticalmente.
- `Ctrl+B` seguito da una freccia (sinistra, destra, su, giù) — Sposta tra i pannelli.
- `Ctrl+B X` — Chiudi il pannello.
- `Ctrl+B C` — Crea una nuova finestra.
- `Ctrl+B N` o `P` — Sposta alla finestra successiva o precedente.
- `Ctrl+B 0` (1,2...) — Sposta a una finestra specifica per numero.
- `Ctrl+B :` — Entra nella riga di comando per digitare
comandi. L'auto-completamento tramite tab è disponibile.
- `Ctrl+B ?` — Visualizza tutte le scorciatoie da tastiera. Premere `Q` per uscire.
- `Ctrl+B W` — Apre un pannello per navigare tra le finestre in più sessioni.
### Esercizio
Utilizza `tmux` per suddividere il terminale in due pannelli
verticali. Nel pannello di sinistra apri uno script in Python
utilizzando l'editor `nano`. Nel pannello di destra esegui il comando
`htop`. Se `htop` non è presente nel sistema, procedi con la sua
installazione attraverso il package manager `pacman`.
## Configurazione di `tmux`
Il file di configurazione di `tmux`, noto come `tmux.conf`, è un file
di testo che permette agli utenti di personalizzare l'ambiente di
lavoro di `tmux` secondo le proprie preferenze. Questo file può essere
posizionato in due luoghi principali:
- `~/.tmux.conf` per una configurazione specifica dell'utente corrente.
- `/etc/tmux.conf` per una configurazione globale, applicabile a tutti gli utenti del sistema.
Se il file `~/.tmux.conf` non esiste, può essere creato semplicemente
eseguendo il comando `touch ~/.tmux.conf` nel terminale. Questo creerà
un file di configurazione vuoto che può essere modificato per
aggiungere le impostazioni desiderate.
La configurazione di `tmux` può includere una vasta gamma di opzioni, tra cui:
- Cambio del prefisso di comando predefinito.
- Abilitazione della modalità mouse.
- Impostazione di due prefissi.
- Cambio del comportamento predefinito del server.
- Inizio del conteggio dei numeri delle finestre e dei pannelli (Base-Index) a 1.
- Modifica dello sfondo del pannello corrente.
- ...
Per esempio, per cambiare il prefisso di comando predefinito da
`Ctrl+B` a `Ctrl+A`, si potrebbe aggiungere la seguente riga al file
`tmux.conf`:
```
set-option -g prefix C-a
```
Dopo aver apportato modifiche al file di configurazione, è necessario
ricaricarlo per applicare le nuove impostazioni. Questo può essere
fatto eseguendo il comando `tmux source-file ~/.tmux.conf` dal
terminale o utilizzando il comando `source-file ~/.tmux.conf` dalla
modalità di comando di `tmux`. Per facilitare il processo, è possibile
aggiungere un collegamento rapido nel file `tmux.conf` per ricaricare
facilmente la configurazione:
```
bind r source-file ~/.tmux.conf \; display "Reloaded!"
```
Questo permette di ricaricare la configurazione premendo il prefisso
seguito da `r`, visualizzando un messaggio di conferma.
### Riferimenti
1. https://hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/
2. https://www.hostinger.com/tutorials/tmux-config
3. https://dev.to/iggredible/useful-tmux-configuration-examples-k3g
4. https://github.com/gpakosz/.tmux
5. https://arcolinux.com/everthing-you-need-to-know-about-tmux-configuration/
6. https://thevaluable.dev/tmux-config-mouseless/
7. https://github.com/samoshkin/tmux-config
8. https://wiki.archlinux.org/title/tmux
9. https://medium.com/@bhavik.n/customize-tmux-to-use-it-effectively-28b262c8b692
## Creazione di layout personalizzati
Si supponga di voler creare un file di configurazione specifico per un
progetto in cui il terminale viene diviso in tre parti: due colonne
verticali di cui una a sua volta suddivisa orizzontalmente. In questo
caso è possibile utilizzare uno script di configurazione
personalizzato per `tmux`. Questo script può essere salvato in un file
separato, ad esempio in `~/.config/tmux/split.conf`.
```
new -s splitted_session # crea una nuova sessione
selectp -t 0 # seleziona il primo pannello
splitw -h -p 50 # divide il pannello corrente orizzontalmente in due parti
selectp -t 1 # seleziona il nuovo secondo pannello
splitw -v -p 50 # divide il pannello corrente verticalmente in due parti
selectp -t 0 # torna al primo pannello
```
Una volta creato il file di configurazione, occorrerà "eseguirlo" con
```bash
tmux source-file ~/.config/tmux/split.conf
```
### Esercizio
Crea un file di configurazione `tmux` per produrre un layout con due
righe di cui la prima suddivisa in due colonne secondo uno schema
simile a quello riportato sotto.
```
-----------
| | |
| | |
-----------
| |
-----------
```
# Secure Shell
Il protocollo SSH (Secure Shell) è un protocollo di rete che fornisce
una connessione sicura e crittografata tra due sistemi informatici su
una rete non sicura. OpenSSH è una delle implementazioni più comuni di
SSH, che offre una serie di strumenti per la gestione delle chiavi
SSH, l'autenticazione e la sicurezza delle connessioni.
## Comando `ssh`
Il comando `ssh` è utilizzato per stabilire una connessione sicura con
un server remoto. Ad esempio, per connettersi a un server remoto con
l'indirizzo IP `192.168.1.100` come utente `utente`, il comando è:
```bash
ssh utente@192.168.1.100
```
Questo comando avvia una sessione SSH con il server specificato,
richiedendo l'autenticazione dell'utente.
## Comando `ssh-keygen`
`ssh-keygen` è uno strumento per generare una coppia di chiavi
pubbliche/private per l'autenticazione SSH. Per generare una nuova
chiave SSH, si può eseguire il comando `ssh-keygen` come nell'esempio sotto
```bash
ssh-keygen -t rsa
```
Agendo sulle opzioni del comando, si può specificare un percorso per
salvare la chiave impostare una passphrase per la chiave privata per
una maggioreq sicurezza.
```bash
ssh-keygen -t rsa -b 2048 -f ~/.ssh/mykey
```
Questo comando genera una chiave RSA di 2048 bit e la salva nel file
`~/.ssh/mykey`. La chiave pubblica corrispondente sarà salvata in
`~/.ssh/mykey.pub`.
## Comando `ssh-copy-id`
`ssh-copy-id` è uno strumento che copia la chiave pubblica SSH di un
utente in un server remoto, consentendo l'accesso senza password. Per
copiare la chiave pubblica `mykey.pub` dell'utente corrente al server
`192.168.1.100`, il comando è:
```bash
ssh-copy-id -i ~/.ssh/mykey.pub utente@192.168.1.100
```
Questo comando copia la chiave pubblica nel file
`~/.ssh/authorized_keys` dell'utente remoto, consentendo l'accesso
senza password. Dopo aver copiato la chiave, è possibile testare
l'accesso senza password con:
```bash
ssh -i ~/.ssh/mykey utente@192.168.1.100
```
I nomi di default per le chiavi pubbliche e private sono
rispettivamente `id_rsa.pub` e `id_rsa`. Utilizzando queste chiavi,
l'accesso al server senza password si semplifica. Basterà infatti
eseguire
```bash
ssh utente@192.168.1.100
```
## Mobile Shell (mosh)
Mosh, acronimo di Mobile Shell, è un'applicazione di terminale remoto
che risolve i problemi di connettività tipici di SSH, specialmente su
reti mobili o instabili. A differenza di SSH, che utilizza TCP e
richiede una connessione stabile, Mosh utilizza UDP, che è un
protocollo senza connessione, permettendo una connessione più stabile
e reattiva anche in presenza di interruzioni temporanee della
connessione. Mosh mantiene una connessione attiva attraverso
cambiamenti di indirizzo IP e sospensioni del dispositivo, rendendolo
ideale per l'uso su dispositivi mobili.
### Come funziona Mosh
Mosh inizia stabilendo una connessione SSH per l'autenticazione,
utilizzando le stesse credenziali di SSH (ad esempio, password o
chiavi pubbliche). Successivamente, avvia un server Mosh sul
dispositivo remoto e stabilisce una connessione UDP per la
comunicazione. Questo approccio consente a Mosh di gestire meglio la
perdita di pacchetti e di mantenere una connessione attiva anche in
presenza di interruzioni temporanee della rete.
### Vantaggi di Mosh rispetto a SSH
- **Robustezza e Responsività**: Mosh è più robusto e reattivo
rispetto a SSH, soprattutto su connessioni Wi-Fi, cellulari e lunghe
distanze. Questo è dovuto al suo protocollo basato su UDP che
gestisce meglio la perdita di pacchetti e imposta il tasso di
fotogrammi in base alle condizioni della rete.
- **Eco Locale Intelligente**: Mosh fornisce un eco locale speculativo
delle pressioni dei tasti, permettendo all'utente di vedere le
proprie pressioni dei tasti quasi istantaneamente, senza attendere
il round trip di rete. Questo migliora l'esperienza utente,
specialmente su connessioni ad alta latenza.
- **Supporto per Roaming**: Mosh supporta il roaming, permettendo
all'utente di cambiare la propria posizione fisica senza
interrompere la sessione. Questo è particolarmente utile per gli
utenti mobili che si spostano tra diversi luoghi.
### Esempi
Per connettersi a un server remoto utilizzando Mosh, il comando è
simile a quello di SSH, ma utilizzando `mosh` al posto di `ssh`. Ad
esempio:
```bash
mosh utente@host
```
E' possibile utilizzare `mosh` e `tmux` insieme. Ad esempio, con la
seguente linea di comando è possibile connettersi al server remoto ed
eseguire tmux.
```bash
mosh utente@host -- tmux
```
## Riferimenti
[1] https://www.ssh.com/academy/ssh/copy-id
[2] https://www.techtarget.com/searchsecurity/tutorial/Use-ssh-keygen-to-create-SSH-key-pairs-and-more
[3] https://alexhost.com/faq/using-ssh-copy-id-ssh-keygen-commands-in-linux/
[4] https://www.ssh.com/academy/ssh/keygen
[5] https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys
[6] https://docs.oracle.com/en/operating-systems/oracle-linux/openssh/openssh-WorkingwithSSHKeyPairs.html
[7] https://www.redhat.com/sysadmin/configure-ssh-keygen
[8] https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-linux-server
[9] https://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/
[10] https://mosh.org/
### Esercizio
### Prerequisiti
Installa un server OpenSSH e assicurati di poter effettuare
l'accesso. Crea un file layout.conf che funga da configurazione per
una sessione tmux. La configurazione deve prevedere una qualche
suddivisione della finestra. L'accesso via ssh dev'essere senza password.
### Obiettivo
Effettuando un ssh da locale verso locale, una volta effettuato
l'acccesso, la sessione tmux dev'essere automaticamente avviata.