Formation Evolix

Administration système & réseau & sécurité

Cron

Les fichiers de cron

      
# systemctl status cron
      
      
# vim /etc/crontab
# vim /etc/default/cron
      
    
    
# vim /etc/cron.d/example
    
30 05 * * 0 www-data /usr/local/adm/savelog-weekly
    

Éditer une table

      
        $ crontab -e
        
        
        # crontab -u jdoe -e
      
0,30,45,51 * * * * /usr/local/adm/send-data
*/15 * * * * /usr/local/adm/check-nis 1>/dev/null 2>&1
00 01 * * * nice -10 find /inf -name core -exec rm -f {} \;
10 03 * * 1-6 nice -10 /usr/local/adm/sauvegarde-daily
30 05 * * 0 /usr/local/adm/savelog-weekly
30 06 1 * * /usr/local/adm/savelog-monthly
00 00 1 1 * /usr/local/bin/happy-new-year
MAILTO=alert@example.com
@daily /usr/local/bin/minuit-check
    

Documentation et consultation

      
$ man 5 crontab
      
      
$ crontab -l
      
      
# crontab -u jdoe -l
      
    

ntpd

      
$ date
      
      
# apt install ntp
      
      
# cat /etc/ntp.conf :
      
server ntp.evolix.net
    
      
# ntpq -p
      
      
$ timedatectl
      
      
# hwclock --show
      
      
# hwclock --systohc
      
    

systemd

systemd est un gestionnaire de services

Alternative au System V, installé par défaut depuis Debian 8.

      # systemctl status
      # systemctl list-units
      # systemctl --failed
      # systemctl list-unit-files
    
  • Unités par défaut : /usr/lib/systemd/system/
  • Modifications manuelles : /etc/systemd/system/
      # systemctl start <unité>
      # systemctl stop <unité>
      # systemctl restart <unité>
      # systemctl reload <unité>
    
      # systemctl status <unité>
      # systemctl is-enabled <unité>
      # systemctl enable <unité>
      # systemctl disable <unité>
    
      # systemctl reboot
      # systemctl poweroff
      # systemd-analyze
    

Modifier une unité

      # cp -a /lib/systemd/system/<service>.service /etc/systemd/system/
      # vim /etc/systemd/system/<service>.service
      # systemctl cat ssh
      # systemctl edit <unité>
      # systemctl daemon-reload
    

Postfix

Installation


# apt install postfix
    

Configuration

  • process : /etc/postfix/master.cf
  • options : /etc/postfix/main.cf
  # vim main.cf
smtpd_banner = $myhostname ESMTP mail server
biff = no
append_dot_mydomain = no
myhostname = hosting.example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = $myhostname
mydestination = $myhostname localhost.localdomain localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
disable_vrfy_command = yes
  
  
# date | mail -s test jdoe@example.com
# mailq
# qshape deferred
# postcat -vq < queue_id > > message.txt
# postsuper -d < queue_id >
# postsuper -d ALL
# postsuper -r < queue_id >
# postsuper -r ALL

# mailq | tail -n +2 | \
    awk 'BEGIN { RS = "" } /example\.com$/ { print $1 }' | \
    tr -d '*!' | postsuper -d -
  

syslog

Rsyslog est le démon syslog par défaut sous Debian.

Le protocole syslog gère la journalisation

Les messages sont :
  • émis par diverses applications (messages kernel, user, daemon, mail, etc.)
  • triés par facility (LOG_KERN, LOG_CRON, LOG_DAEMON, LOG_MAIL, LOG_AUTH, etc.)
  • ordonnés par severity (LOG_EMERG, LOG_ALERT, LOG_ERR, LOG_WARNING, etc.) ;
  • reçus par un démon qui les répartit dans différents fichiers situés dans le répertoire /var/log/ ou par d’autres façons (serveur syslog distant, terminal, etc.)
      # systemctl status rsyslog
      # vim /etc/rsyslog.conf
*.*;auth,authpriv.none;cron,mail,local4,local5,local7.none -/var/log/syslog
cron.*      /var/log/cron.log
#mail.info  -/var/log/mail.info
#mail.warn  -/var/log/mail.warn
#mail.err   /var/log/mail.err
local0.*    /var/log/postgresql.log
local1.*    /var/log/sympa.log
local4.*    -/var/log/openldap.log
local5.*    -/var/log/haproxy.log
local7.*    -/var/log/dhcp.log
    

Journaux principaux :

  • auth.log : authentification système (login, su, getty)
  • daemon.log : relatif aux daemons
  • mail.* : relatifs aux mails
  • kern.log : générés par le noyau
  • user.log : générés par des programmes utilisateur
  • debug : messages de debug
  • messages : messages d'infos
  • syslog : tous les messages (sauf exceptions définies)

logrotate

Le logiciel logrotate permet de gérer la rotation des journaux système et applicatif de façon précise et ordonnée.

  • Logrotate est exécuté tous les jours (cron.daily)
  • selon la fréquence choisie les journaux sont compressés et datés
  • des actions spécifiques sont possibles (relance du service, gérénation de stats…)
    
# vim /etc/logrotate.d/dpkg
    
/var/log/dpkg.log {
        monthly
        rotate 12
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
}
    

Note : le programme "savelog" permet une rotation ultrasimple de journaux en ajoutant un suffixe et conservant 7 versions.

log2mail

Pour surveiller précisement un fichier journal et recevoir immédiatemment des alertes par mail si certains termes apparaissent dans ce fichier.

    
# apt install log2mail
    
    
# vim /etc/log2mail/config/default
    
file = /var/log/mail.log
pattern = "fatal"
mailto = admin@example.com
template = /etc/log2mail/mail
    
# /etc/init.d/log2mail restart
    
    

logcheck

Logcheck envoie par mail, les lignes inconnues (non répertoriées dans ses règles) trouvées dans certains journaux.

      
# aptitude install logcheck logcheck-database
      
      
# cat /etc/logcheck/logcheck.conf
      
REPORTLEVEL="server"
SENDMAILTO="alert@example.com"
MAILASATTACH=0
FQDN=1
TMP="/tmp"
	

Exceptions dans ignore.d.server/

^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: \[IPTABLES DROP\] : IN=eth0 OUT= MAC=.*
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ log2mail\[[0-9]+\]: Logfile [.[:alnum:]/]+ rotated. Listening to new file.$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ nrpe\[[0-9]+\]: Could not read request from client, bailing out...$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ nrpe\[[0-9]+\]: INFO: SSL Socket Shutdown.$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ ntpd\[[0-9]+\]: clock is now [[:alnum:]]+$
    

fail2ban


# apt install fail2ban


# fail2ban-client status


# fail2ban-client status ssh


# vim /etc/fail2ban/filter.d/demo :

[Definition]
failregex =  warning: \[\]: authentication failed:
ignoreregex =

fail2ban (suite)


# vim /etc/fail2ban/jail.local

[demo-rule]

enabled = true
port    = http,https
filter  = demo
logpath = /var/log/demo.log
maxretry = 3
findtime = 1800
bantime = 3600

Introduction à Git

Qu'est-ce que Git ?

Système de contrôle de versions, open-source, décentralisé, conçu pour être efficace et rapide.

Contrôle de versions

  • conserver différentes versions dans le temps
  • naviguer dans l'historique
  • gérer des branches
  • travailler en équipe

outils connus ?

  • cp-old
    cp main.c main.c.old
  • RCS, CVS, SVN
  • GIT, Mercurial, Bazar, Darcs, GNU Arch…
  • Perforce, IBM Rational, Visual SourceSafe…

Open-source

  • License GPL v2
  • Créé par Linus Torvalds pour le noyau Linux
  • multi-plateformes

Décentralisé

  • Tout est local (le plus souvent)
  • échanges possibles entre dépôts (FS ou réseau)
  • tout l'historique est disponible
  • pereine et fiable (copies autonomes et complètes)

Rapide, efficace

  • simple base de données clés/valeurs
  • écrit en C, très portable
  • adapté à toutes les tailles de projets

Concepts de base

Historique

  • métadonnées sur le commit
  • liaison(s) avec le(s) parent(s)
  • visualisation chonologique

commit, tree, blob

  • un commit pointe sur un arbre
  • chaque élément pointe sur un autre arbre
  • … ou sur un "blob" (contenu final)

les branches

  • la botte secrète de Git
  • faciles à créer, fusionner, détruire
  • éphémères ou durables
  • locales ou partagées
  • la base d'un workflow d'équipe

3 zones

  • working copy : ce que voit votre éditeur
  • staging area : préparer des commits
  • repository : la base de données interne

Utilisation

  • en ligne de commande
  • dans un outil (graphique) dédié
  • intégré aux éditeurs…

En pratique : /etc/.git

Une bonne pratique Evolix.

Installation de Git


    $ su
    # apt install git
    # git --version
    git version 2.11.0
    

Initialisation du dépôt


    $ cd /etc
    $ su
    # git init
    # git status
    # git add .
    # git commit -m "commit initial"
    

Premières modifications


    # echo "127.0.0.1 foo" >> /etc/hosts
    # git status
    # git diff [HEAD]
    # git commit --all --message "Ajout de foo dans /etc/hosts"
    # git log
    # git show
    

Aller plus loin

Le livre Pro Git est incontournable,
pour le débutant comme pour l'expert.

git-scm.com/book/fr/v2

Monitoring

  • statistiques
    • nombreuses métriques locales
    • Munin, Collectd/Grafana, Beats/ELK
  • alerting
    • surveillance de services SMTP, POP3, HTTP, NNTP, PING, etc. + ressources (charge processeur, utilisation des disques, etc.)
    • Nagios, Icinga, Zabbix, Monit

Sécurité

  • sécurité physique
    • protection du BIOS par mot de passe
    • protection du boot loader
    • empêcher le reboot
    • clear_console
    • reporting

Sécurité (suite)

  • sécurité logicielle
    • gestion des mots de passe
    • configuration sécurisée
    • veille
    • mises à jour de sécurité
    • sauvegardes
    • firewall

réseau / iptables

Rappels réseau Couche physique : Ethernet (adresses MAC) Couche réseau : IPv4 (adressage, HostID, NetID, Masque, Brodcast, protocole ARP, ICMP) Couche transport : TCP, UDP (notion de ports, mode connecté) Couche application : HTTP, SMTP, DNS, etc. # iptables -L -t filter -v • INPUT: les chaînes appliquées sur INPUT concerneront tout paquet à destination de localhost • OUTPUT: les chaînes appliquées sur OUTPUT concerneront tout paquet en provenance de localhost • FORWARD: le paquet n'est pas destiné à la machine locale, mais il doit être relayé sur une autre interface. Les chaînes de FORWARD ne concerneront pas les paquets à destination ou venant de la machine locale. Exemple de règles : # iptables -A INPUT -i eth1 -j ACCEPT # iptables -A INPUT -p tcp --sport 143 --dport 1024:65535 -s 31.170.8.33 -m state --state ESTABLISHED,RELATED -j ACCEPT minifirewall # cd /etc/default && wget "https://forge.evolix.org/projects/minifirewall/repository/revisions/master/raw/minifirewall.conf" -O minifirewall # cd /etc/init.d && wget "https://forge.evolix.org/projects/minifirewall/repository/revisions/master/raw/minifirewall" # chmod 700 /etc/init.d/minifirewall # chmod 600 /etc/default/minifirewall

Introduction à Ansible

Qu'est-ce qu'Ansible ?

Automatisation de configuration d'infrastructure et déploiement

Objectifs d'Ansible

  • homogénéité
  • fiabilité
  • rapidité

Parfait pour

  • tâches répétitives
  • actions urgentes
  • demandes spécifiques

Principes fondateurs

  • Idempotence
  • Pas d'agent
  • Souplesse et légèreté

Installation

Paquets pour de nombreuses distributions

$ su
# apt install ansible
# ansible --version
ansible 2.2.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

Commandes de base


        $ ansible localhost --module-name ping
        $ ansible localhost --module-name ping --one-line
        $ ansible localhost --module-name setup
        $ ansible localhost --module-name setup --args "filter=ansible_mem*"
        $ ansible localhost --module-name lineinfile --args \
          "dest=/etc/hosts regexp=example.com line='192.168.0.25 example.com'"
      

Éléments de base

Modules

  • couche d'abstraction du shell
  • homogénéité
  • idempotence

Tasks / Handlers

  • invocation d'un module avec des paramètres
  • le handler n'est exécuté qu'une fois

Playbooks

  • exécution procédurale de tâches
  • définition du contexte
  • orchestration complexe

Rôles

  • comme un paquet autonome
  • contient tasks, handlers, variables, templates
  • inclus dans des playbooks
  • stockés localement ou récupérés dans un registre

Inventaire et variables

  • liste des serveurs
  • moyens d'accès
  • variables spécifiques (par hôte ou groupe)

        inventory/
        ├── group_vars
        │   ├── all.yml
        │   ├── hypervisors.yml
        │   └── proxies.yml
        ├── hosts
        ├── hosts-dev
        └── host_vars
            ├── stack01-data01.yml
            ├── stack01-front01-web01.yml
            └── stack01-front01.yml
    

        kvm01 ansible_host=192.168.2.1
        kvm02 ansible_host=192.168.2.2

        stack01-front01 ansible_host=192.168.2.1 ansible_port=22020
        stack01-front01-web01 ansible_host=192.168.2.1 ansible_port=22101
        stack01-data01 ansible_host=192.168.2.1 ansible_port=22010

        [hypervisors]
        kvm01
        kvm02

        [fronts]
        stack01-front01

        [dbs]
        stack01-data01

        [web]
        stack01-front01-web01
    

Variables

  • sources multiples (facts ou configuration)
  • règles de précédence pour personnalisation

Un playbook


        ---
        - hosts: localhost

          tasks:
          - name: example.com in /etc/hosts
            lineinfile:
              dest: /etc/hosts
              regexp: example.com
              line: '192.168.0.25 example.com'
              state: present
        
$ ansible-playbook playbook.yml

ssh

sauvegardes

Gestion des droits

Sous les systèmes de type Unix ou Linux, il existe plusieurs types de fichiers: les fichiers, les répertoires, les liens symboliques, les fichiers-périphériques. Un fichier appartient à un utilisateur (en fait un numéro d'utilisateur) et à un groupe (en fait un numéro de groupe). Les 3 droits fondamentaux sont la lecture, l'écriture et l'éxecution. Pour un fichier, ces 3 droits sont définis pour 3 catégories: l'utilisateur, le groupe et le "reste du monde". Pour chacune de ces catégories: on note les droits sous la forme rwx. [s:sst] u:rwx g:rwx o:rwx Commandes utiles/essentielles : - ls -l, stat, chmod, chown, chgrp - su, newgrp, login, who, w, w.procps $ chmod + fichier $ chmod fichier Droits pour un répertoire : r = lister, x = traverser, w = écrire (et même effacer !!) Droits spéciaux : - Exécutables setuid ou setgid - Répertoire setgid ou stickybit Notation décimale : 777 = ? 700 = ? 600 = ? 644 = ? 755 = ? 775 = ? 701 = ? umask : - Pour gérer droit niveau utilisateurs : commande umask Fixé dans le fichier profile ou bashrc (local ou général...)

NFS

DRBD

LVM

Virtualisation

Conteneur

evolinux

auth

Historiquement sous Unix, l'authentification est gérée par une liste des utilisateurs avec les mots de passe chiffrés accessible à tous, à savoir le fameux fichier /etc/passwd accessible en lecture et la commande passwd « set-uid root » - Authentification shadow recommandé Le mot de passe chiffré est dans le fichier /etc/shadow inaccessible en lecture. Commande pour activer/désactiver l'authentification shadow : # shadowconfig on/off - Groupes UNIX : Les groupes d'un système sont dans le fichier /etc/group Programmes de gestion des utilisateurs : Utilitaires basiques : useradd, groupadd, userdel, groupdel, usermod, groupmod, chsh, chfn (paquet passwd sous Debian) Utilitaires convivaux : adduser, addgroup, deluser et delgroup (paquet adduser sous Debian) avec valeurs par défaut dans le fichier /etc/adduser.conf : « Profil » pour un utilisateur créé : Il se trouve dans le répertoire /etc/skel/ Les utilisateurs sont identifiés par leur nom de compte et par leur appartenance à un groupe par défaut(informations dans /etc/passwd). En plus, les utilisateurs peuvent appartenir à d'autres groupes (informations /etc/group). jdoe@serveur:~$ whoami jdoe jdoe@serveur:~$ groups jdoe dialout cdrom floppy audio video plugdev jdoe@serveur:~$ id uid=1000(jdoe) gid=1000(jdoe) groupes=20(dialout),24(cdrom),25(floppy),29(audio),44(video),46(plugdev),1000(jdoe) jdoe@serveur:~$ Restriction au niveau des procédures de login : Fichier /etc/login.defs : FAIL_DELAY 10 \ delai minimum entre deux tentatives de login FAILLOG_ENAB yes \ journaliser les tentatives ratées LOG_UNKFAIL_ENAB yes \ retenir les identifiants iconnus essayés LOG_OK_LOGINS yes \ retenir les tentatives réussies LOGIN_TIMEOUT 60 \ delai maximim pour authentification CHFN_RESTRICT rwh \ restriction pour la commande chfn Complété par... Linux-PAM (Pluggable Authentication Modules) Le fichier /etc/shadow contient les informations sécurisées, notamment la plus sensible : le mot de passe, mais également des paramètres d'expiration. Voir la commande vipw -s foo:$1$mYploS2J$uSouKZPBjUF6D094HPgGj/:13853:0:99999:7::: · nom de connexion de l´utilisateur (« login ») · mot de passe chiffré · nombre de jours, comptés à partir du 1er janvier 1970, depuis le dernier changement de mot de passe · nombre de jours à attendre avant de pouvoir changer le mot de passe · nombre de jours après lesquels le mot de passe doit être changé · nombre de jours avant la fin de validité du mot de passe et pendant lesquels l´utilisateur est averti · nombre de jours après la fin de validité provoquant la désactivation du compte · nombre de jours, comptés à partir du 1er janvier 1970, depuis que le compte est désactivé · champ réservé Politique de gestion des mots de passe - Mot de passe aléatoire ou quasi-aléatoire - Trace écrite bannie - Empêcher mot de passe trop simple pour les utilisateurs: librairie cracklib - Programme de génération de mot de passe: otp, apg, makepasswd, pwgen - Programme pour cracker les mots de passe: John the Ripper Qui est root ? - UID=0 - su, su -, su -c sudo - Droits délégués (administration partagée, utilisation de scripts, etc.) - Éditer les droits : commande visudo - sudo -u, sudo sh -c, # apt install sudo # visudo jdoe ALL = ALL jdoe ALL = NOPASSWD: ALL jdoe ALL = /usr/sbin/tcpdump jdoe ALL = (foo) /bin/kill jdoe ALL = (ALL) sudoedit /etc/hosts sudo -l - Le système de gestion des utilisateurs diffère du système d'authentification des utilisateurs - Utilisation des UID, GID (pas de réelle nécessité d'avoir une entrée dans /etc/password !!) - Correspondances UID<->login, GID<->group faites avec la bibliothèque libnss (Name Services Switch). C'est également le cas des noms de services, protocoles, machines (DNS). On peut d'ailleurs voir cela comme un DNS pour les UID/GID. Voir le fichier /etc/nsswitch.conf : passwd: compat group: compat shadow: compat hosts: files dns PAM Mode de fonctionnement très modulaire rendant transparent à l'application l'utilisation de tel ou tel système d'authentification. Des modules PAM existent pour NIS, LDAP, Kerberos, rendant ainsi les trois systèmes d'authentification interchangeables sans que cela nécessite une reconfiguration des logiciels en eux-même ou encore une recompilation des services. - Répertoire des fichiers de configuration: /etc/pam.d/ - Comportement par défaut: /etc/pam.d/other. - Syntaxe des fichiers "type" "niveau" "module" "arguments" - /etc/security/access.conf permet de gérer les permissions de login (si activé dans PAM) - /etc/security/limits.conf permet d'imposer des limites diverses sur les groupes ou les identifiants Syntaxe des fichiers "type" "niveau" "module" "arguments" "type" peut être : auth : authentification account : vérification des types de services autorisés session : tâches à effectuer avant/après l'accès password : mécanismes d'authentification "niveau" peut être : required : le succès à cette étape est nécessaire requisite : le succès est nécessaire et l'accès est refusé en cas d'erreur sufficient : le succès à cette étape suffit optional : l'accès pourra etre refusé en fonction d'autres paramètres Exemple /etc/pam.d/login : # Authenticate the user auth required pam_unix.so # Ensure users account and password are still active account required pam_unix.so # Change the users password, but at first check the strength # with pam_cracklib(8) password required pam_cracklib.so retry=3 minlen=6 difok=3 password required pam_unix.so use_authtok nullok md5 session required pam_unix.so ACL/QUOTA TODO