1418 lines
40 KiB
HTML
1418 lines
40 KiB
HTML
<!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 & réseau & 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 <unité></code>
|
||
<code data-trim class="hljs nohighlight"># systemctl stop <unité></code>
|
||
<code data-trim class="hljs nohighlight"># systemctl restart <unité></code>
|
||
<code data-trim class="hljs nohighlight"># systemctl reload <unité></code>
|
||
</pre>
|
||
</section>
|
||
|
||
<section>
|
||
<pre>
|
||
<code data-trim class="hljs nohighlight"># systemctl status <unité></code>
|
||
<code data-trim class="hljs nohighlight"># systemctl is-enabled <unité></code>
|
||
<code data-trim class="hljs nohighlight"># systemctl enable <unité></code>
|
||
<code data-trim class="hljs nohighlight"># systemctl disable <unité></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/<service>.service /etc/systemd/system/</code>
|
||
<code data-trim class="hljs nohighlight"># vim /etc/systemd/system/<service>.service</code>
|
||
<code data-trim class="hljs nohighlight"># systemctl cat ssh</code>
|
||
<code data-trim class="hljs nohighlight"># systemctl edit <unité></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 d’autres 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 d’une 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>
|