evoformations/reveal/sysadmin.html

1418 lines
40 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Formation Evolix : administration système et réseau</title>
<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
<meta name="author" content="Hakim El Hattab">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="reveal.js/css/reveal.css">
<link rel="stylesheet" href="reveal.js/css/theme/beige.css" id="theme">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="reveal.js/lib/css/zenburn.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'reveal.js/css/print/pdf.css' : 'reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<!--[if lt IE 9]>
<script src="reveal.js/lib/js/html5shiv.js"></script>
<![endif]-->
</head>
<body>
<div class="reveal">
<!-- Any section element inside of this container is displayed as a slide -->
<div class="slides">
<section>
<h1>Formation Evolix</h1>
<h3>Administration système &amp; réseau &amp; sécurité</h3>
</section>
<section>
<section>
<h2>Cron</h2>
Démon de planification de tâches
</section>
<section>
<h3>Les fichiers de cron</h3>
<pre>
<code data-trim class="hljs nohighlight">
# systemctl status cron
</code>
<code data-trim class="hljs nohighlight">
# vim /etc/crontab
# vim /etc/default/cron
</code>
</pre>
<pre>
<code data-trim class="hljs nohighlight">
# vim /etc/cron.d/example
</code>
30 05 * * 0 www-data /usr/local/adm/savelog-weekly
</pre>
</section>
<section>
<h3>Éditer une table</h3>
<pre>
<code data-trim class="hljs nohighlight">
$ crontab -e
</code>
<code data-trim class="hljs nohighlight">
# crontab -u jdoe -e
</code>
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
</pre>
</section>
<section>
<h3>Documentation et consultation</h3>
<pre>
<code data-trim class="hljs nohighlight">
$ man 5 crontab
</code>
<code data-trim class="hljs nohighlight">
$ crontab -l
</code>
<code data-trim class="hljs nohighlight">
# crontab -u jdoe -l
</code>
</pre>
</section>
</section>
<section>
<section>
<h2>ntpd</h2>
Démon de protocole de temps réseau.
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight">
$ date
</code>
<code data-trim class="hljs nohighlight">
# apt install ntp
</code>
<code data-trim class="hljs nohighlight">
# vim /etc/ntp.conf :
</code>
server ntp.evolix.net
<code data-trim class="hljs nohighlight">
# syctemctl restart ntp
# syctemctl status ntp
</code>
</pre>
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight">
# ntpq -p
</code>
<code data-trim class="hljs nohighlight">
$ timedatectl
</code>
<code data-trim class="hljs nohighlight">
# hwclock --show
</code>
<code data-trim class="hljs nohighlight">
# hwclock --systohc
</code>
</pre>
</section>
</section>
<section>
<section>
<h2>systemd</h2>
Gestionnaire système et service
</section>
<section>
<h3>systemd est un gestionnaire de services</h3>
<p>Alternative au System V, installé par défaut depuis Debian 8.</p>
<pre>
<code data-trim class="hljs nohighlight"># systemctl status</code>
<code data-trim class="hljs nohighlight"># systemctl list-units</code>
<code data-trim class="hljs nohighlight"># systemctl --failed</code>
<code data-trim class="hljs nohighlight"># systemctl list-unit-files</code>
</pre>
</section>
<section>
<ul>
<li>Unités par défaut : /usr/lib/systemd/system/</li>
<li>Modifications manuelles : /etc/systemd/system/</li>
</ul>
<pre>
<code data-trim class="hljs nohighlight"># systemctl start &lt;unité&gt;</code>
<code data-trim class="hljs nohighlight"># systemctl stop &lt;unité&gt;</code>
<code data-trim class="hljs nohighlight"># systemctl restart &lt;unité&gt;</code>
<code data-trim class="hljs nohighlight"># systemctl reload &lt;unité&gt;</code>
</pre>
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight"># systemctl status &lt;unité&gt;</code>
<code data-trim class="hljs nohighlight"># systemctl is-enabled &lt;unité&gt;</code>
<code data-trim class="hljs nohighlight"># systemctl enable &lt;unité&gt;</code>
<code data-trim class="hljs nohighlight"># systemctl disable &lt;unité&gt;</code>
</pre>
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight"># systemctl reboot</code>
<code data-trim class="hljs nohighlight"># systemctl poweroff</code>
<code data-trim class="hljs nohighlight"># systemd-analyze</code>
</pre>
</section>
<section>
<h2>Modifier une unité</h2>
<pre>
<code data-trim class="hljs nohighlight"># cp -a /lib/systemd/system/&lt;service&gt;.service /etc/systemd/system/</code>
<code data-trim class="hljs nohighlight"># vim /etc/systemd/system/&lt;service&gt;.service</code>
<code data-trim class="hljs nohighlight"># systemctl cat ssh</code>
<code data-trim class="hljs nohighlight"># systemctl edit &lt;unité&gt;</code>
<code data-trim class="hljs nohighlight"># systemctl daemon-reload</code>
</pre>
</section>
</section>
<section>
<section>
<h2>Postfix</h2>
Agent de transport de courriers électroniques
</section>
<section>
<h3>Installation et configuration</h3>
<pre><code data-trim class="hljs nohighlight">
# apt install postfix
</code></pre>
<ul>
<li>process : /etc/postfix/master.cf</li>
<li>options : /etc/postfix/main.cf</li>
</ul>
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight"># vim main.cf</code>
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
</pre>
</section>
<section>
<pre>
<code class="hljs nohighlight" data-trim style="max-height: 500px">
# 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 -
</code></pre>
</section>
</section>
<section>
<section>
<h2>syslog</h2>
<p>Rsyslog est le démon syslog par défaut sous Debian. </p>
</section>
<section>
<h3>Le protocole syslog gère la journalisation</h3>
Les messages sont :
<ul>
<li>émis par diverses applications (messages kernel, user, daemon, mail, etc.)</li>
<li>triés par <em>facility</em> (LOG_KERN, LOG_CRON, LOG_DAEMON, LOG_MAIL, LOG_AUTH, etc.)</li>
<li>ordonnés par <em>severity</em> (LOG_EMERG, LOG_ALERT, LOG_ERR, LOG_WARNING, etc.) ;</li>
<li>reçus par un démon qui les répartit dans différents fichiers situés dans le répertoire <tt>/var/log/</tt> ou par dautres façons (serveur syslog distant, terminal, etc.)</li>
</ul>
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight"># systemctl status rsyslog</code>
<code data-trim class="hljs nohighlight"># vim /etc/rsyslog.conf</code>
*.*;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
</pre>
</section>
<section>
<h3>Journaux principaux :</h3>
<ul>
<li>auth.log : authentification système (login, su, getty)</li>
<li>daemon.log : relatif aux daemons</li>
<li>mail.* : relatifs aux mails</li>
<li>kern.log : générés par le noyau</li>
<li>user.log : générés par des programmes utilisateur</li>
<li>debug : messages de debug</li>
<li>messages : messages d'infos</li>
<li>syslog : tous les messages (sauf exceptions définies)</li>
</ul>
</section>
</section>
<section>
<section>
<h2>logrotate</h2>
<p>Le logiciel logrotate permet de gérer la rotation des journaux système et applicatif de façon précise et ordonnée.</p>
</section>
<section>
<ul>
<li>Logrotate est exécuté tous les jours (cron.daily)</li>
<li>selon la fréquence choisie les journaux sont compressés et datés</li>
<li>des actions spécifiques sont possibles (relance du service, gérénation de stats…)</li>
</ul>
</section>
<section>
<h3>Exemple de configuration</h3>
<pre>
<code data-trim class="hljs nohighlight">
# vim /etc/logrotate.d/dpkg
</code>
/var/log/dpkg.log {
monthly
rotate 12
compress
delaycompress
missingok
notifempty
create 644 root root
}
</pre>
<p>Note : le programme "savelog" permet une rotation ultrasimple de journaux en ajoutant un suffixe et conservant 7 versions.</p>
</section>
</section>
<section>
<section>
<h2>log2mail</h2>
<p>Pour surveiller précisement un fichier journal et recevoir immédiatemment des
alertes par mail si certains termes apparaissent dans ce fichier.</p>
</section>
<section>
<h3>Installation, configuration et gestion</h3>
<pre>
<code data-trim class="hljs nohighlight">
# apt install log2mail
</code>
<code data-trim class="hljs nohighlight">
# vim /etc/log2mail/config/default
</code>
file = /var/log/mail.log
pattern = "fatal"
mailto = admin@example.com
template = /etc/log2mail/mail
<code data-trim class="hljs nohighlight">
# /etc/init.d/log2mail restart
</code>
</pre>
</section>
</section>
<section>
<section>
<h2>logcheck</h2>
<p>Logcheck envoie par mail, les lignes inconnues (non répertoriées dans ses règles) trouvées dans certains journaux.</p>
</section>
<section>
<h3>Installation et configuration</h3>
<pre>
<code data-trim class="hljs nohighlight">
# aptitude install logcheck logcheck-database
</code>
<code data-trim class="hljs nohighlight">
# vim /etc/logcheck/logcheck.conf
</code>
REPORTLEVEL="server"
SENDMAILTO="alert@example.com"
MAILASATTACH=0
FQDN=1
TMP="/tmp"
</section>
<section>
Exceptions dans /etc/logcheck/ignore.d.server/
<pre>
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: \[IPTABLES DROP\] : IN=eth0 OUT= MAC=.*
^\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:]]+$
</pre>
</section>
</section>
<section>
<section>
<h2>fail2ban</h2>
<p>Exécute des actions à la détection de comportements anormaux.</p>
</section>
<section>
<h3>Installation et commandes utiles</h3>
<pre>
<code data-trim class="hljs nohighlight">
# apt install fail2ban
</code>
<code data-trim class="hljs nohighlight">
# fail2ban-client status
</code>
<code data-trim class="hljs nohighlight">
# fail2ban-client status ssh
</code>
</pre>
</section>
<section>
<h3>Exemple de filtre</h3>
<pre>
<code data-trim class="hljs nohighlight">
# vim /etc/fail2ban/filter.d/demo :
</code>
[Definition]
failregex = warning: \[<HOST>\]: authentication failed:
ignoreregex =
</pre>
</section>
<section>
<h3>Exemple de <em>jail</em></h3>
<pre>
<code data-trim class="hljs nohighlight">
# vim /etc/fail2ban/jail.local
</code>
[demo-rule]
enabled = true
port = http,https
filter = demo
logpath = /var/log/demo.log
maxretry = 3
findtime = 1800
bantime = 3600
</pre>
</section>
</section>
<section>
<section>
<h2>Introduction à Git</h2>
</section>
<section>
<h3>Qu'est-ce que Git ?</h3>
<p>Système de contrôle de versions, open-source, décentralisé, conçu pour être efficace et rapide.</p>
</section>
<section>
<h4>Contrôle de versions</h4>
<ul>
<li>conserver différentes versions dans le temps</li>
<li>naviguer dans l'historique</li>
<li>gérer des branches</li>
<li>travailler en équipe</li>
</ul>
</section>
<section>
<h4>outils connus ?</h4>
<ul>
<li>cp-old <pre>cp main.c main.c.old</pre></li>
<li>RCS, CVS, SVN</li>
<li>GIT, Mercurial, Bazar, Darcs, GNU Arch…</li>
<li>Perforce, IBM Rational, Visual SourceSafe…</li>
</ul>
</section>
<section>
<h4>Open-source</h4>
<ul>
<li>License GPL v2</li>
<li>Créé par Linus Torvalds pour le noyau Linux</li>
<li>multi-plateformes</li>
</ul>
</section>
<section>
<h4>Décentralisé</h4>
<ul>
<li>Tout est local (le plus souvent)</li>
<li>échanges possibles entre dépôts (FS ou réseau)</li>
<li>tout l'historique est disponible</li>
<li>pereine et fiable (copies autonomes et complètes)
</ul>
</section>
<section>
<h4>Rapide, efficace</h4>
<ul>
<li>simple base de données clés/valeurs</li>
<li>écrit en C, très portable</li>
<li>adapté à toutes les tailles de projets</li>
</ul>
</section>
<section>
<h3>Concepts de base</h3>
</section>
<section>
<h4>Historique</h4>
<ul>
<li>métadonnées sur le commit</li>
<li>liaison(s) avec le(s) parent(s)</li>
<li>visualisation chonologique</li>
</ul>
</section>
<section>
<h4><em>commit</em>, <em>tree</em>, <em>blob</em></h4>
<ul>
<li>un commit pointe sur un arbre</li>
<li>chaque élément pointe sur un autre arbre</li>
<li>… ou sur un "blob" (contenu final)</li>
</ul>
</section>
<section>
<h4>les branches</h4>
<ul>
<li>la botte secrète de Git</li>
<li>faciles à créer, fusionner, détruire</li>
<li>éphémères ou durables</li>
<li>locales ou partagées</li>
<li>la base d'un workflow d'équipe</li>
</ul>
</section>
<section>
<h4>3 zones</h4>
<ul>
<li><em>working copy</em> : ce que voit votre éditeur</li>
<li><em>staging area</em> : préparer des commits</li>
<li><em>repository</em> : la base de données interne</li>
</ul>
</section>
<section>
<h4>Utilisation</h4>
<ul>
<li>en ligne de commande</li>
<li>dans un outil (graphique) dédié</li>
<li>intégré aux éditeurs…</li>
</ul>
</section>
<section>
<h3>En pratique : /etc/.git</h3>
<p>Une <em>bonne pratique</em> Evolix.</p>
</section>
<section>
<h4>Installation de Git</h4>
<pre><code data-trim class="hljs nohighlight">
# apt install git
# git --version
git version 2.11.0
</code></pre>
</section>
<section>
<h4>Initialisation du dépôt</h4>
<pre><code data-trim class="hljs nohighlight">
$ cd /etc
$ su
# git init
# git status
# git add .
# git commit -m "commit initial"
</code></pre>
</section>
<section>
<h4>Premières modifications</h4>
<pre><code data-trim class="hljs nohighlight">
# 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
</code></pre>
</section>
<section>
<h3>Aller plus loin</h3>
<p>Le livre <strong>Pro Git</strong> est incontournable,<br>pour le débutant comme pour l'expert.</p>
<p><a href="https://git-scm.com/book/fr/v2">git-scm.com/book/fr/v2</a></p>
</section>
</section>
<section>
<h2>Monitoring</h2>
<ul>
<li>statistiques
<ul>
<li>nombreuses métriques locales</li>
<li>Munin, Collectd/Grafana, Beats/ELK</li>
</ul>
</li>
<li>alerting
<ul>
<li>surveillance de services HTTP, SMTP, POP3, SQL etc. + ressources (charge processeur, utilisation des disques, etc.)</li>
<li>Nagios, Icinga, Zabbix, Monit</li>
</ul>
</li>
</ul>
</section>
<section>
<section>
<h2>Sécurité</h2>
</section>
<section>
<h3>Sécurité physique</h3>
<ul>
<li>protection du BIOS par mot de passe</li>
<li>protection du boot loader</li>
<li>empêcher le reboot</li>
<li>clear_console</li>
<li>reporting</li>
<li>fermeture de session en cas d'inactivité</li>
</ul>
</section>
<section>
<h3>Sécurité logicielle</h3>
<ul>
<li>gestion des mots de passe</li>
<li>configuration sécurisée</li>
<li>veille</li>
<li>mises à jour de sécurité</li>
<li>sauvegardes</li>
<li>firewall</li>
</ul>
</section>
</section>
<section>
<section>
<h2>Réseau / iptables</h2>
</section>
<section>
<h3>Rappels réseau</h3>
<ul>
<li>Couche physique : Ethernet (adresses MAC)</li>
<li>Couche réseau : IPv4 (adressage, HostID, NetID, Masque, Brodcast, protocole ARP, ICMP)</li>
<li>Couche transport : TCP, UDP (notion de ports, mode connecté)</li>
<li>Couche application : HTTP, SMTP, DNS, etc.</li>
</ul>
</section>
<section>
<h3>Afficher les règles du firewall</h3>
<pre>
<code data-trim class="hljs nohighlight">
# iptables -L -t filter -v
</code>
</pre>
</section>
<section>
<ul>
<li>INPUT: les chaînes appliquées sur INPUT concerneront tout paquet à destination de localhost</li>
<li>OUTPUT: les chaînes appliquées sur OUTPUT concerneront tout paquet en provenance de localhost</li>
<li>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.</li>
</ul>
</section>
<section>
<h3>Exemple de règles :</h3>
<pre>
<code data-trim class="hljs nohighlight">
# iptables -A INPUT -i eth1 -j ACCEPT
</code>
<code data-trim class="hljs nohighlight">
# iptables -A INPUT -p tcp --sport 143 --dport 1024:65535 \
-s 31.170.8.33 -m state --state ESTABLISHED,RELATED -j ACCEPT
</code>
</pre>
</section>
<section>
<h3>Analyse de minifirewall</h3>
<ul>
<li>Dépôt du projet : <a href="https://forge.evolix.org/projects/minifirewall/repository/">forge.evolix.org/projects/minifirewall/repository/</a></li>
<li>Instruction d'installation : <a href="https://forge.evolix.org/projects/minifirewall/wiki">forge.evolix.org/projects/minifirewall/wiki</a></li>
</ul>
</section>
</section>
<section>
<section>
<h2>Introduction à Ansible</h2>
</section>
<section>
<h3>Qu'est-ce qu'Ansible ?</h3>
<h4>Automatisation de configuration d'infrastructure et déploiement</h4>
</section>
<section>
<h3>Objectifs d'Ansible</h3>
<ul>
<li>homogénéité</li>
<li>fiabilité</li>
<li>rapidité</li>
</ul>
</section>
<section>
<h4>Parfait pour</h4>
<ul>
<li>tâches répétitives</li>
<li>actions urgentes</li>
<li>demandes spécifiques</li>
</ul>
</section>
<section>
<h3>Principes fondateurs</h3>
<ul>
<li>Idempotence</li>
<li>Pas d'agent</li>
<li>Souplesse et légèreté</li>
</ul>
</section>
<section>
<h3>Installation</h3>
<p>Paquets pour de nombreuses distributions</p>
<pre><code class="hljs nohighlight" data-trim>
# apt install ansible
# ansible --version
ansible 2.2.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
</code></pre>
</section>
<section>
<h3>Commandes de base</h3>
<pre><code class="hljs nohighlight" data-trim>
$ 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'"
</code></pre>
</section>
<section>
<h3>Éléments de base</h3>
</section>
<section>
<h4>Modules</h4>
<ul>
<li>couche d'abstraction du shell</li>
<li>homogénéité</li>
<li>idempotence</li>
</ul>
</section>
<section>
<h4><i>Tasks</i> / <i>Handlers</i></h4>
<ul>
<li>invocation d'un module avec des paramètres</li>
<li>le handler n'est exécuté qu'une fois</li>
</ul>
</section>
<section>
<h4><i>Playbooks</i></h4>
<ul>
<li>exécution procédurale de tâches</li>
<li>définition du contexte</li>
<li>orchestration complexe</li>
</ul>
</section>
<section>
<h4>Rôles</h4>
<ul>
<li>comme un paquet autonome</li>
<li>contient <em>tasks</em>, <em>handlers</em>, variables, <em>templates</em></li>
<li>inclus dans des <em>playbooks</em></li>
<li>stockés localement ou récupérés dans un registre</li>
</ul>
</section>
<section>
<h4>Inventaire et variables</h4>
<ul>
<li>liste des serveurs</li>
<li>moyens d'accès</li>
<li>variables spécifiques (par hôte ou groupe)</li>
</ul>
</section>
<section>
<pre><code class="hljs nohighlight" data-trim>
inventory/
├── group_vars
│ ├── all.yml
│ ├── hypervisors.yml
│ └── proxies.yml
├── hosts
├── hosts-dev
└── host_vars
├── stack01-data01.yml
├── stack01-front01-web01.yml
└── stack01-front01.yml
</code></pre>
</section>
<section>
<pre><code class="hljs ini" data-trim style="max-height: 600px">
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
</code></pre>
</section>
<section>
<h4>Variables</h4>
<ul>
<li>sources multiples (<em>facts</em> ou configuration)</li>
<li>règles de précédence pour personnalisation</li>
</ul>
</section>
<section>
<h3>Un playbook</h3>
</section>
<section>
<pre><code class="hljs yaml" data-trim>
---
- 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
</code></pre>
<pre><code class="hljs bash">$ ansible-playbook playbook.yml</code></pre>
</section>
</section>
<section>
<section>
<h2>OpenSSH</h2>
Client et serveur pour connexions shell à distance.
</section>
<section>
<h3> SSH: Secure Shell</h3>
<ul>
<li>Client: ssh, scp, sftp</li>
<li>Serveur: ssh-add, ssh-agent, ssh-keygen, ssh-keysign, ssh-keyscan, et sftp-server</li>
</ul>
</section>
<section>
<h2>Configuration du serveur</h2>
<pre>
<code data-trim class="hljs nohighlight"># vim /etc/ssh/sshd_config</code>
Port 22
Port 2222
PermitRootLogin yes/no/without-password
AllowUsers foo bar baz
Match Address 192.0.2.1,192.0.2.2
PasswordAuthentication yes
Match User foo,bar
PasswordAuthentication no
<code data-trim class="hljs nohighlight">
$ ssh-keygen
$ cat .ssh/id_rsa.pub
$ vim .ssh/authorized_keys
</code>
</pre>
</section>
<section>
<h2>Agent SSH</h2>
<pre>
<code data-trim class="hljs nohighlight">$ ssh-agent</code>
<code data-trim class="hljs nohighlight">$ scp fichier-local identité-distante@hôte-distant:chemin/fichier</code>
<code data-trim class="hljs nohighlight">$ scp identité-distante@hôte-distant:chemin/fichier fichier-local</code>
</pre>
</section>
</section>
<section>
<section>
<h2>Sauvegardes</h2>
</section>
<section>
<p>
File-system (totales ou incrémentales)
<pre>
<code data-trim class="hljs nohighlight">
tar -cpvf
cpio, pax
dump/restore, partimage
dd
</code>
<code data-trim class="hljs nohighlight">
umount /file-system
</code>
<code data-trim class="hljs nohighlight">
dump 0uf /dev/rst0 /file-system
</code>
</section>
<section>
<h2>LA solution magique...</h2>
<pre>
<code data-trim class="hljs nohighlight">
rsync -av --delete
cp -al
</code>
</pre>
<p>EvoBackup :<br><a href="https://forge.evolix.org/projetcs/evobackup">forge.evolix.org/projetcs/evobackup</a></p>
</section>
</section>
<section>
<section>
<h2>Gestion des droits</h2>
<p>Sous les systèmes de type Unix ou Linux, il existe plusieurs types de fichiers:
<ul>
<li>les fichiers,</li>
<li>les répertoires,</li>
<li>les liens symboliques,</li>
<li> les fichiers-périphériques.</li>
</ul>
</p>
</section>
<section>
<p>Un fichier appartient à un utilisateur (en fait un numéro d'utilisateur) et à un groupe (en fait un numéro de groupe).</p>
<p>Les 3 droits fondamentaux sont la <b>lecture, l'écriture et l'éxecution</b>.</p>
</section>
<section>
<p>Pour un fichier, ces 3 droits sont définis pour 3 catégories:
<ul>
<li>l'utilisateur,</li>
<li>le groupe</li>
<li>et le "reste du monde".</li>
</ul>
</p>
<p>Pour chacune de ces catégories: on note les droits sous la forme rwx.</p>
<pre>
<code data-trim class="hljs nohighlight">[s:sst] u:rwx g:rwx o:rwx</code>
</pre>
</section>
<section>
<h2>Commandes utiles/essentielles :</h2>
<ul>
<li>ls -l, stat, chmod, chown, chgrp</li>
<li>su, newgrp, login, who, w, w.procps</li>
</ul>
<pre>
<code data-trim class="hljs nohighlight">
$ chmod < catégorie >+< nouveau_droit > fichier
</code>
<code data-trim class="hljs nohighlight">
$ chmod < nouveaux_droits > fichier
</code>
</pre>
</section>
<section>
<p>Droits pour un répertoire :</p>
<pre>
<code data-trim class="hljs nohighlight">r = lister, x = traverser, w = écrire (et même effacer !!)</code>
</pre>
<p>Droits spéciaux :
<ul>
<li> Exécutables setuid ou setgid</li>
<li> Répertoire setgid ou stickybit</li>
</ul>
</p>
</section>
<section>
<p> Notation décimale :</p>
<pre>
<code data-trim class="hljs nohighlight">
777 = ?
700 = ?
600 = ?
644 = ?
755 = ?
775 = ?
701 = ?
</code>
</pre>
<p>
umask : Pour gérer droit niveau utilisateurs : commande umask
Fixé dans le fichier profile ou bashrc (local ou général...)
</p>
</section>
</section>
<section>
<section>
<h2>NFS</h2>
<pre>
<code data-trim class="hljs nohighlight">
# apt install nfs-kernel-server
</code>
<code data-trim class="hljs nohighlight">
# vim /etc/exports
</code>
/srv/nfs 192.0.2.4(rw,root_squash,sync,no_subtree_check)
/srv/nfs2 192.0.2.0/27(ro) 192.0.242(rw)
</pre>
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight">
# apt install nfs-common
# mount -t nfs -o nfsvers=3 192.0.2.1:/srv/nfs /mnt
</code>
</pre>
</section>
</section>
<section>
<section>
<h2>DRBD</h2>
<pre>
<code data-trim class="hljs nohighlight">#apt install drbd-utils</code>
</pre>
</section>
<section>
<p>Sur une installation DRBD on définit :
<ul>
<li>des <b>ressources</b> : chaque ressource DRBD a plusieurs paramètres, notamment le second serveur vers qui envoyer/recevoir la réplication</li>
<li>des <b>volumes</b> : chaque ressource DRBD peut avoir un ou plusieurs volumes, chaque volume est accessible via un périphérique unique nommé /dev/drbdXX</li>
</ul>
</p>
</section>
<section>
<p>Exemple simple dune ressource foo avec un volume /dev/drbd42 définie dans un fichier /etc/drbd.d/foo.res entre deux serveurs nommés tic et tac :</p>
<pre>
resource "foo" {
volume 0 {
device minor 42;
disk /dev/sdz1;
meta-disk internal;
}
on tic {
address 192.0.2.1:7014;
}
on tac {
address 192.0.2.2:7014;
}
}
</pre>
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight"># drbdadm -d adjust all
# drbdadm adjust all
# drbdadm dump
# drbdadm create-md [ressource]
# drbdadm attach/detach [ressource]
# drbdadm connect/disconnect [ressource]
# drbdadm adjust/adjust-with-progress [ressource]
# drbdadm primary/secondary [ressource]
</code>
<code data-trim class="hljs nohighlight">
$ cat /proc/drbd
# drbd-overview
</code>
</pre>
</section>
</section>
<section>
<section>
<h2>Virtualisation</h2>
<ul>
<li>KVM/libvirt</li>
<li>Xen</li>
<li>VMware</li>
</ul>
<p>Focus sur KVM :</p>
<pre>
<code data-trim class="hljs nohighlight"># apt install qemu-kvm bridge-utils qemu-utils libvirt-bin virtinst</code>
<code data-trim class="hljs nohighlight"># apt install netcat-openbsd</code>
</pre>
</section>
<section>
<pre><code data-trim class="hljs nohighlight">
# virsh list --all
# virsh start < vm-name >
# virsh shutdown < vm-name >
# virsh destroy < vm-name >
# virsh edit < vm-name >
# virsh undefine < vm-name >
# virsh define template.xml
</code></pre>
</section>
<section>
<pre><code data-trim class="hljs nohighlight">
# virt-install --connect=qemu:///system \
--name=template \
--cpu mode=host-passthrough --vcpus=1 \
--ram=512 \
--disk path=/path/template.qcow2, \
bus=virtio,cache=none,size=42,format=qcow2 \
--network=bridge:br0,model=virtio \
--noautoconsole --graphics vnc,listen=127.0.0.1,keymap=fr \
--cdrom=/home/images/debian-8.6.0-amd64-netinst.iso
</code></pre>
</section>
</section>
<section>
<section>
<h2>Conteneur</h2>
<h3>LXC</h3>
<pre>
<code data-trim class="hljs nohighlight">
# apt install lxc bridge-utils debootstrap
# lxc-create -t debian -n foo
# lxc-start -n foo -d
# lxc-attach -n foo
# lxc-stop -n foo
# lxc-info -n foo
# lxc-console -n foo
# lxc-halt -n foo
# lxc-destroy -n foo</code>
</pre>
</section>
<section>
<h2>Conteneur</h2>
<h3>Docker</h3>
<pre>
<code data-trim class="hljs nohighlight">
# apt install docker-engine
$ docker ps [options]
$ docker run [options] IMAGE [commande]
$ docker stop|kill [options] CONTENEUR
$ docker rm [options] CONTENEUR
$ docker rmi [options] IMAGE
$ docker exec [options] CONTENEUR COMMANDE</code>
</pre>
</section>
</section>
<section>
<section>
<h2>Authentification</h2>
</section>
<section>
<h3>/etc/passwd</h3>
Historiquement sous Unix, l'authentification est gérée par une <strong>liste des utilisateurs avec les mots de passe chiffrés accessible à tous</strong>, à savoir le fameux fichier <strong>/etc/passwd</strong> accessible en lecture et la commande passwd « set-uid root »
</section>
<section>
<h3>/etc/shadow recommandé</h3>
Le mot de passe chiffré est dans le fichier /etc/shadow inaccessible en lecture.
Commande pour activer/désactiver l'authentification shadow :
<pre>
<code data-trim class="hljs nohighlight">
# shadowconfig on/off
</code>
</pre>
</section>
<section>
<h3>Groupes UNIX</h3>
Les groupes d'un système sont dans le fichier /etc/group
</section>
<section>
<h3>Gestion des utilisateurs</h3>
<h4>Utilitaires basiques : paquet Debian "passwd"</h4>
useradd, groupadd, userdel, groupdel, usermod, groupmod, chsh, chfn
</section>
<section>
<h3>Gestion des utilisateurs</h3>
<h4>Utilitaires convivaux : paquet Debian "adduser"</h4>
adduser, addgroup, deluser et delgroup
<br>Ils tiennent sont configurables via /etc/adduser.conf :
<pre>
DSHELL=/bin/bash
DHOME=/home
SKEL=/etc/skel
QUOTAUSER="forquota"
DIR_MODE=0750
</pre>
</section>
<section>
<h3>« Profil » pour un utilisateur créé</h3>
Il se trouve dans le répertoire /etc/skel/
</section>
<section>
Les utilisateurs
<ul>
<li>sont identifiés par leur nom de compte</li>
<li>appartiennent à un groupe primaire (voir /etc/passwd)</li>
<li>peuvent appartenir à des groupes secondaires (voir /etc/group)</li>
</ul>
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight">jdoe@serveur:~$ whoami</code>
jdoe
<code data-trim class="hljs nohighlight">jdoe@serveur:~$ groups</code>
jdoe dialout cdrom audio video plugdev
<code data-trim class="hljs nohighlight">jdoe@serveur:~$ id</code>
uid=1000(jdoe) gid=1000(jdoe) groupes=20(dialout),24(cdrom),29(audio),44(video)
</pre>
</section>
<section>
<h3>Restriction de login</h3>
<pre>
<code data-trim class="hljs nohighlight"># vim /etc/login.defs</code>
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
</pre>
Complété par… Linux-PAM (à suivre)
</section>
<section>
<h3>/etc/shadow</h3>
Contient les infos sécurisées, notamment le mot de passe, mais également des paramètres d'expiration.
<pre><code data-trim class="hljs nohighlight"># vipw -s</code>
foo:$1$mYploS2J$uSouKZPBjUF6D094HPgGj/:13853:0:99999:7:::
</pre>
</section>
<section>
<h3>Politique de gestion des mots de passe</h3>
<ul>
<li>Mot de passe aléatoire ou quasi-aléatoire</li>
<li>Trace écrite bannie</li>
<li>Empêcher mot de passe trop simple pour les utilisateurs: librairie cracklib</li>
<li>Programme de génération de mot de passe: otp, apg, makepasswd, pwgen</li>
<li>Programme pour cracker les mots de passe: John the Ripper</li>
</ul>
</section>
<section>
<h3>Qui est root ?</h3>
<ul>
<li>UID=0</li>
<li>su, su -, su -c</li>
</ul>
</section>
<section>
<h3>sudo</h3>
<ul>
<li>Droits délégués (administration partagée, utilisation de scripts, etc.)</li>
<li>Éditer les droits : commande visudo</li>
<li>sudo -u, sudo sh -c,</li>
</ul>
<pre><code data-trim class="hljs nohighlight"># apt install sudo</code></pre>
</section>
<section>
<h3>Configuration</h3>
<pre><code data-trim class="hljs nohighlight"># visudo</code>
jdoe ALL = ALL
jdoe ALL = NOPASSWD: ALL
jdoe ALL = /usr/sbin/tcpdump
jdoe ALL = (foo) /bin/kill
jdoe ALL = (ALL) sudoedit /etc/hosts
</pre>
Pour lister les droits :
<pre><code data-trim class="hljs nohighlight"># sudo -l</code></pre>
</section>
<section>
<h3>Système de gestion des utilisateurs</h3>
<h3>!=</h3>
<h3>Système d'authentification des utilisateurs</h3>
</section>
<section>
<ul>
<li>Les UID et GID peuvent exister sans entrée dans /etc/password</li>
<li>Correspondances UID<->login, GID<->group faites par <em>libnss</em> (Name Services Switch)</li>
<li>Idem pour les noms de services, protocoles, machines (DNS)</li>
</ul>
</section>
<section>
<pre><code data-trim class="hljs nohighlight"># vim /etc/nsswitch.conf</code>
passwd: compat
group: compat
shadow: compat
hosts: files dns
</pre>
</section>
<section>
<h3>Pluggable Authentication Module PAM</h3>
<ul>
<li>Système de gestion très modulaire</li>
<li>Abstraction transparente des système d'authentification</li>
<li>Utilisable directement par les applications</li>
</ul>
</section>
<section>
<h4>Modules PAM</h4>
<ul>
<li>NIS</li>
<li>LDAP</li>
<li>Kerberos</li>
</ul>
<p>Ils deviennent interchangeables sans reconfiguration ou recompilation des services.</p>
</section>
<section>
<ul>
<li>Configuration : /etc/pam.d/</li>
<li>Comportement par défaut : /etc/pam.d/other</li>
<li>Syntaxe : "type niveau module arguments"</li>
<li>/etc/security/access.conf : permissions de login</li>
<li>/etc/security/limits.conf : limites diverses</li>
</ul>
</section>
<section>
<h4>Syntaxe des fichiers : "type"</h4>
<ul>
<li>auth : authentification</li>
<li>account : vérification des types de services autorisés</li>
<li>session : tâches à effectuer avant/après l'accès</li>
<li>password : mécanismes d'authentification</li>
</ul>
</section>
<section>
<h4>Syntaxe des fichiers : "niveau"</h4>
<ul>
<li>required : le succès à cette étape est nécessaire</li>
<li>requisite : le succès est nécessaire et l'accès est refusé en cas d'erreur</li>
<li>sufficient : le succès à cette étape suffit</li>
<li>optional : l'accès pourra etre refusé en fonction d'autres paramètres</li>
</ul>
</section>
<section>
<h4>Exemple /etc/pam.d/login</h4>
<pre>
# 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
</pre>
</section>
</section>
</div>
</div>
<script src="reveal.js/lib/js/head.min.js"></script>
<script src="reveal.js/js/reveal.js"></script>
<script>
// More info https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: true,
transition: 'slide', // none/fade/slide/convex/concave/zoom
// More info https://github.com/hakimel/reveal.js#dependencies
dependencies: [
{ src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: 'reveal.js/plugin/zoom-js/zoom.js', async: true },
{ src: 'reveal.js/plugin/notes/notes.js', async: true }
]
});
</script>
</body>
</html>