Amministrazione GNU/Linux

Stefano Morandi

2016-03-19

Created: 2018-06-14 Thu 12:33

Lezione 1

scelta della distribuzione

debian_logo.png

"All distros suck, this one just sucks less"

Michael Elkins,Stefano Morandi

intro

  • prima giornata introduttiva e basilare
  • vanno curati anche gli aspetti burocratici
  • verificare quanti hanno almeno qualche conoscenza sysamdin

perché Debian

"The universal operating system"

debian.org

  • enorme comunità
  • apt / dpkg
  • supporto per diverse architetture
  • manutenzione e aggiornamento
  • vasto parco software

perché NON Debian

"Ci posso essere (pochi) casi in cui Debian non è la scelta migliore."

  • Politiche restrittive sulle licenze
  • Configurazioni non banali
  • Supporto hardware
  • Portatili

poco importanti in ambito server

versioni

  • stable: attualemte "jessie"
  • testing: attualmente "stretch"
  • old-stable: "wheezy"
  • unstable: sid

installazione

partizionamento

  • Installazione pulita su un singolo HD
  • Aggiungeremo 2 dischi in RAID1 + LVM

Si possono immaginare schemi di partizionamento complessi

Fondamentale l'uso di LVM

file system

  • ext4: come predefinito
  • XFS: preferibile per grandi file
  • BTRFS: fs di nuova generazione

BTRFS, ZFS sono molto interessanti perché offrono funzionalità avanzate

prima configurazione

panoramica del File System

Mantra: "Ogni cosa è un file"

Ci sono un sacco di file e directory sul mio hard disk!

panoramica

  • bin Essential command binaries
  • boot Static files of the boot loader
  • dev Device files
  • etc Host-specific system configuration
  • lib Essential shared libraries and kernel modules
  • media Mount point for removeable media
  • mnt Mount point for mounting a filesystem temporarily

panoramica

  • opt Add-on application software packages
  • sbin Essential system binaries
  • srv Data for services provided by this system
  • tmp Temporary files
  • usr Secondary hierarchy
  • var Variable data

verifica installazione

cat /etc/hosts
cat /etc/networks/interfaces
cat /etc/apt/sources.list

Lezione 2

gestione dei pacchetti

  • apt-get update / aptitude update

    Aggiorna stato dei pacchetti

  • apt-get (dist-)upgrade / aptitude (dist-)upgrade

    Aggiorna pacchetti

  • apt-cache search / aptitude search

    Ricerca un pacchetto

gestione dei pacchetti

  • apt-cache show / aptitude show

    Mostra le informazioni su un pacchetto

  • apt-get install / aptitude install

    Installa pacchetti e relative dipendenze

  • apt-get –purge remove / aptitude purge

    Rimuove pachetti. Con "purge" anche le relative configurazioni

gestione dei pacchetti

  • livelli di dipendenza
    • richiesti
    • raccomandati - vedi voce relativa
    • suggeriti

tips & tricks

  • dpkg –get-selections/set-selections
  • dpkg -l "" | grep \ii / -l "libapache"
  • dpkg -L <pacchetto>
  • apt-file search <nome\file>
  • apt-file list <nome\file>
  • dpkg –get-selections: replicare un'installazione
  • apt-file vuole una cache locale

aggiornare 'stable"

backports

http://backports.debian.org/Instructions/

dotdeb

http://www.dotdeb.org/instructions/

Assolutamente NON supportato dal team di debian

Spesso unica soluzione (es: php)

tools

strumenti essenziali

  • bash-completion
  • mc
  • aptitude
  • nethogs
  • rsync
  • lsblk
  • htop
  • multitail
  • logwatch
  • apt-file
  • nethogs: consumo di banda per processo
  • htop: top++ :)

Lezione 3

personalizzare la shell

  • aliases
  • prompt
  • bashrc vs profile
  • completamento

personalizzare la shell

default:

shell_01_nocolor.png

con:

PS1="$YELLOW[\t]$RED\u$PURPLE@\h:$BLUE\w \n$DEFAULT → "

shell_02_color.png

I codici colore si trovano sul sito di archlinux

bash startup file

  • shell interattiva (di login o meno)
  • shell non interattiva
  • shell interattiva legge/scrite su terminale
  • shell interattiva di login o no (non lo sono zterm/konsole)
  • importante per variabili d'ambiente negli script!

shell interattiva di login

  • /etc/profile
  • /etc/bash.bashrc (debian)
  • ~/.profile (debian -> .bashrc)
  • In alternativa, se presente, ~/.bash\profile

shell interattiva (no login)

xterm, gnome-terminal, konsole

  • ~/.bashrc
ssh root@myhost "echo ciao"

cosa fa un SysAdmin ?

Se non sai che faccia ha il tuo sysadmin, vuol dire che sta lavorando bene

monitorare lo stato del sistema

live

  • processi (ps, kill)
  • carico (top, htop)
  • traffico (iftop, nethogs)
  • disco (df, du)
  • backup (tar, gzip)
  • ps -aufx
  • htop
  • nethogs + apt-get/wget per generare traffico
  • dh -h / du -sh /var/*
  • tar -czf /tmp/etc.tgz /etc/* (con nota su tmp)

log di sistema

Tutti i login in Debian sono in var/log

rsyslog / syslog-ng / systemd

Ogni messaggio di log ha 2 proprietà:

  • Servizio (authpriv, cron, kernel, mail…)
  • Priorità (debug, info… alert, emerg)

log di sistema

  • auth.log: autorizzazioni/autenticazioni
  • boot.log: log durante il boot del sistema
  • cron: cron o ancron
  • dmesg: vedere anche dmesg
  • kern.log: messaggi loggati dal kernel
  • mail.log: sistma di posta
  • syslog: log globale

log di sistema

  • rsyslog.conf
  • logrotate.conf
  • "-" per buffer
cat /etc/logrotate.conf
cat /etc/logrotate.d/rsyslog
cat /etc/logrotate.d/nginx

strumenti

  • less
  • tail
  • grep
less /var/log/syslog
tail -n10 /var/log/syslog
tail -f /var/log/syslog
grep <username> /var/log/auth.log

networking

configurazione

/etc/hosts
/etc/resolv.conf
/etc/network/interfaces

gestione interfacce

ifconfig

ifup
ifdown

ifconfig
ifconfig eth0 (up/down)

ifconfig eth0 <ip>
ifconfig eth0:0 <ip> (alias)
dhclient eth0

gestione interfacce

iproute2

ip addr
ip addr show eth0
ip link
ip link show eth0
ip -s link show eth0

ip link set eth0 up
ip link set eth0 down

ip addr add <ip>/<prefix> dev <eth>
ip addr del <ip>/<prefix> dev <eth>

routing

route
route add

ip route show
ip route add <net> via <gw>
ip route add default via <ip_gw>

ip neigh = arp -an
ip neigh delete <ip> dev <eth>
ip neighbor flush dev <eth>

Si possono rendere permanenti via "/etc/network/interfaces"

up route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.254
down route del -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.254

debug

  • ping
  • traceroute
  • host / dig
  • nmap
  • netstat
  • /etc/udev/rules.d/70-persistent-net.rules
  • come prima cosa verificare che l'interfaccia sia stata rilevata:
Port 4321
IdentityFile ~/.ssh/id_rsa_corso
TCPKeepAlive yes

Lezione 4

utenti e permessi

La gestione degli utenti e dei relativi permessi è estremamente semplice (troppo?)

"root" e tutti gli altri :)

Anche l'accesso ai file è limitato a "utente", "gruppo" e "altri"

configurazione

  • /etc/passwd (shadow)
  • /etc/group
  • /etc/pam.conf
  • /etc/nsswitch.conf
  • passwd con "x" al posto della passwd
  • passwd in shadow => permessi su file
  • "*" in shadow => impedire login utente

creare un utente

useradd -D (default)
useradd -d <home> -s <shell> -g <gruppo> -G -m <utente>
passwd <utente>
adduser <utente>
  • "-m" copia /etc/skel
  • passwd: imposta anche le scadenze
  • adduser: interattivo (debian)

modificare utente

usermod -L <utente> (blocca)
usermod -U <utente> (sblocca)
userdel -r <utente>
deluser <utente> (debian)
chage <utente>

creare gruppo

groupadd <gruppo>
groupdel <gruppo>

addgroup
delgroup

su e sudo

furto di identità

su

  • su <utente>
  • su <utente> -c <comando>
  • su <utente> -s <altrashell>
  • NB: home e env sono quelli dell'utente di partenza
  • "-l" o "-" per caricare quello del destinatario

sudo

Meccanismo di delega molto flessibile

xkcd_sandwich.png

Non è installato di default in debian

sudo

  • sudo -u <utente>
  • sudo -e <filediconfigurazione>
  • sudo -i
  • sudo -u <utente> <comando>
  • sudo -g <gruppo> <comando>
  • "-i" shell interattiva (di login se non <comando>)
  • sudo ls /var/lib/mysql
  • sudo -u stefano ls /home/stefano
  • sudo -g adm less /var/log/syslog

sudoers

root    ALL=(ALL:ALL) ALL
%admin  ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

Cmnd_Alias NGX = /usr/sbin/service nginx restart
User_Alias NGXADMINS = stefano, pippo
NGXADMINS  ALL=NOPASSWD: NGXT
  • minimale:

    USER HOSTNAME=(USER:GROUP) OPZIONI: COMMANDO

  • modificabile solo con visudo

Lezione 5

accesso ai file

Un file sistem umix-like ha, di default, una gestione dei privilegi e dei permessi molto basilare.

privilegi

  • privilegi dell'utente (u)
  • privilegi del gruppo (g)
  • privilegi degli altri (o)

permessi

  • lettura (r)
  • scrittura (w)
  • esecuzione o attraversamento (x)
drwxr-xr-x  2 root    root  4096 apr 20 05:34 backups
-r-xrwxr-x  7 stefano root  4096 giu 11 21:36 mio_file
drwxr-xr-x 33 root    root  4096 giu 25 12:35 lib
drwxrwsr-x  2 root    staff 4096 apr 20 05:34 local
lrwxrwxrwx  1 root    root    18 giu 11 21:36 mio_link -> mio_file

truelite_permessi_ls.png

permessi

Modificabili con

  • chmod: modifica permessi e privilegi
  • chown: cambia proprietario/gruppo
  • chgrp: cambia gruppo
chmod 755 <file>
chmod u=rw,g=r,o= <file>

chgrp <gruppo> <file>
chgrp -R <gruppo> <directory>

suid bit, sgid bit…

  • Il comportamento cambia a seconda che si tratti di file (eseguibili) o directory
  • In caso di file permettono l'esecuzione con i privilegi del proprietario.
-rwsr-xr-x 1 root root 45396 mag 25  2012 /usr/bin/passwd

… sgid bit e sticky bit

  • In caso di directory, sgid bit viene usato per impostare il gruppo a quello della directory
  • Se presente lo sticky bit i file della directory potranno essere cancellati solo dal relativo proprietario
drwxrwxrwt  5 root root  4096 giu 25 16:35 tmp

esercizio!

  • Creare una directory "prova" dentro "/tmp"
  • Creare file vuoto README in "prova"
  • Assegnare i permessi di scrittura al gruppo "corso"
  • Fare in modo che tutti i file siano del gruppo "corso"
  • Verificare che funzioni :-)

esercizio (meno scemo)…

Creare una struttura di directory in "/srv/samba" atta a condividere file in una LAN aziendale.

esercizio

Nell'azienda sono presenti diverse strutture indipendenti:

  • amministrazione (paolo, marta)
  • direzione (andrea, lisa)
  • produzione (giovanna, stefano)
  • ricerca & sviluppo (anna, giorgia)

esercizio

  • L'amministrazione "archivia" i propri documenti anno per anno.
  • La direzione butta tutto in un unico calderone
  • La produzione per anno e per progetto
  • R&S per progetto

L'utente MegaDirettoreGenrale deve poter accedere a tutta la struttura.

script

#!/bin/bash

MESSAGGIO="questo è uno script"

echo $MESSAGGIO

backup

realizzare uno script di backup che

  • realizzi uno copia del sistema
  • mantenga uno storico compresso di 7gg

variabili

OGGI=$(date +%Y%m%d)
VECCHIO=$(date --date='7 days ago' +%Y%m%d)
MAX_DAYS=7

# di cosa fare il backup
SRC_DIRS=( "/home/" "/etc" "/srv/samba/" )

# USB disk/NFS...
BACKUP_DIR="/tmp/backup"
SNAPSHOT_DIR="$BACKUP_DIR/snapshot"
ARCHIVES_DIR="$BACKUP_DIR/archives"
EXCLUDE_FILE=/ect/my_backup/exclude

snapshot

rsync

rsync -av  --excude-from=$EXCLUDE_FILE $DIR $SNAPSHOT_DIR/

storico

tar

tar czf $BACKUP_DIR/archives/$OGGI.tgz --exclude-from=$EXCLUDE_FILE $DIR

rimuovere i vecchi file

rm $BACKUP_DIR/archives/$VECCHIO

find $BACKUP_DIR/archives/* -mtime +$MAX_DAYS -exec rm {} \;

cron e atd

at

atd è il demone che si occupa dei comandi da eseguire una sola volta, ma in un determinato momento nel futuro.

at

# esegue backup.sh alle 22 di oggi
at -f backup.sh 22:00

# domani :)
at -f backup.sh 22:00 tomorrow

# tra 5 giorni
at -f backup.sh 22:00 +5 days

# elenco dei lavori
atq

# rimozione di un lavoro in coda
atrm <id> <id> ...

cron

cron è il demone responsabile dell'esecuzione di comandi pianificati e ricorrenti (ogni giorno, ora, settimana…)

cron

  • di sistema
  • di ogni utente abilitato

    /ect/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )


.---------------- [m]inute: minuto (0 - 59)
|  .------------- [h]our: ora (0 - 23)
|  |  .---------- [d]ay [o]f [m]onth: giorno del mese (1 - 31)
|  |  |  .------- [mon]th: mese (1 - 12)
|  |  |  |  .---- [d]ay [o]f [w]eek: giorno della settimana (0 - 6) (domenica=0 o 7)
|  |  |  |  |

*  *  *  *  *  comando da eseguire

utente

# nuovo
crontab -e

# elenco
crontab -l

# esporto
crontab -l > mio_crontab

# importo
crontab mio_crontab

riferimenti

script di backup

Lezione 6

SAMBA

Opening Windows to a Wider World

versioni

  • Samba 3.6 (old)
  • Samba 4.1 (default)
apt-get install samba smbclient

caratteristiche: Samba 3

  • Implementazione CIFS/SMB
  • NT4 Domain
  • Mappa utenti/gruppi win <=> Unix
  • ACL

caratteristiche: Samba 4

  • Active Directory!
  • Migrazione

Aggiornare da samba3 a samba4 dovrebbe essere indolore (stand alone server)

Migrazione HOWTO

documentazione

La documentazione di samba-3 è ottima

documentazione

La documentazione di samba-4 è …

Esempio

gruppi e utenti

  • amministrazione (paolo, marta)
  • direzione (andrea, lisa)
  • produzione (giovanna, stefano)
  • ricerca & sviluppo (anna, giorgia)
  • MegaDirettoreGenerale: roberto
  1. Creare utenti e grupppi
  2. Creare struttura directory
  3. Configurazione samba
    • global
    • home
    • share
    • printers
  4. Mappare i gruppi unix <=> win

Come base prendiamo il file di default

cd /etc/samba
mv smb.conf smb.conf.origin
testparm -s smb.conf.origin > smb.conf.clean

testparm
testparm -v

Tuttele opzioni di smb.conf

global

[global]
server role = standalone server
map to guest = Bad User
obey pam restrictions = Yes
pam password change = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
unix password sync = Yes
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = No
usershare allow guests = Yes
panic action = /usr/share/samba/panic-action %d
idmap config * : backend = tdb

homes

[homes]
comment = Home Directories
valid users = %S
create mask = 0700
directory mask = 0700
browseable = No
path = %H
valid user=%S: current share name
path=%H home of user %u

produzione

[produzione]
comment = Produzione - Cartella condivisa
path = /srv/samba/produzione
valid users = @produzione
invalid users = root
force group = produzione
create mask = 0660
directory mask = 0770
read only = no
browsable = yes

popolare DB utenti

# creo gli utenti
smbpasswd -a root
smbpasswd -a andrea
smbpasswd -a <...>

#cambio password
smbpasswd <nome>

# verifico server
nmblookup <NETBIOS_NAME>

# verifico share
smbclient -L <NETBIOS_NAME>

# verifico utilizzo
smbstatus
# verifico share
smbclient -L //<NETBIOS_NAME>/<SHARE>

# backup veloce
smbclient //<NETBIOS_NAME>/<SHARE> -U<utente>   -Tc backup.tgz

vincere facile?

zentyal_logo.png

firewall

iptables

parte del progetto netfilter che è un insieme di funzionalità del kernel per interagire con lo stack di rete.

iptables è il comando in userspace che consente di impostare le regole di filtro per i pacchetti.

table, chains e rules

  • netfilter / iptables
    • policy: azione di default
    • rule: regole/criteri per ogni pacchetto
    • chain: insieme di regole
    • tables: contengono catene
  • netfilter / iptables

    4 tabelle predefinite

    1. Filter (default)
    2. NAT
    3. Mangle
    4. (Raw)
  • netfilter / iptables

    catene predefinite

    • INPUT
    • OUTPUT
    • FORWARD
    • PREROUTING
    • POSTROUTING

percorso

I pacchetti in ingresso passano per la tabella di "mangle", poi per la "NAT" e poi per la "Filter"

Sorry, your browser does not support SVG.

Figure 7: wikimedia

nfk-traversal.png

Figure 8: linux-ip

prima ed unica regola per un buon firewall…

KISS

iptables

iptables -A INPUT -i lo -j ACCEPT

-A: append
INPUT: nome catena (tabella 'filter')
-i: interfaccia
lo: loopback
-j: jump
ACCEPT: accetto il pacchetto senza elaborare le regole successive

iptables

# visualizza le regole nella tabella di filter
iptables -L -v

# specifico tabella NAT
iptables -t nat -L -v  --line-numbers

# rimuovo la terza regola da filter/INPUT
iptables -D INPUT 1

# Rifiuto pacchetti da <cattivone_ip>
iptables -A INPUT -s <cattivone_ip> -j REJECT

# Ignoro pacchetti da <cattivone_ip>
iptables -A INPUT -s <cattivone_ip> -j DROP

Lezione 7

networking

iptables

# Accesso SSH solo da acuni IP
iptables -A INPUT -p tcp -s $MIOIP --dport 22 -m state \
      --state NEW,ESTABLISHED -j ACCEPT

# Limito tentativi di connessione
iptables -A INPUT -p tcp --dport 22 -m limit \
      --limit 1/minute --limit-burst 10 -j ACCEPT

# Forward
iptables -t nat -A PREROUTING -p tcp --dport 80 \
      -j DNAT --to $SERVERWB:80

iptables

# log
iptables -A INPUT -j LOG --log-prefix $LOG_PREFIX

# scarto il resto
iptables -A INPUT -j DROP

script firewall

script nat

Riferimenti

gestione dischi

RAID

# Redundant Array of Independent Disks

apt-get install mdadm

RAID

creare un RAID1

# creo partizione raid
fdisk /dev/sdb #tipo fd

# copio schema su sdc
sfdisk -d /dev/sdb | sfdisk /dev/sdc --force

# Creo il device raid
mdadm --create --verbose /dev/md0 --level=raid1 \
      --raid-devices=2 /dev/sdb1 /dev/sdc1

creare un RAID1

# controllo avanzamento
cat /proc/mdstat

# fs
mkfs.ext4 /dev/md0
mkdir /mnt/raid1
mount /dev/md0 /mnt/raid1

echo "/dev/md0 /mnt/raid1 ext4 defaults 0 0" >> /etc/fstab

manutenzione di un RAID1


# marcare come guasto
mdadm --set-faulty /dev/md0 /dev/sdc1
mdadm --remove /dev/md0 /dev/sdc1
cat /proc/mdstat

#...sostituzione hd...

# copiare struttura partizioni
sfdisk -d /dev/sdb | sfdisk /dev/sdc --force

# aggiungere un disco al raid
mdadm --add /dev/md0 /dev/sdc1

# informazioni sul RAID
mdadm --query --detail /dev/md0

FINE

e: stefano@uomorando.it

t: @uomorando

w: http://pnlug.it

peace, love and linux