evoformations/reveal/sysadmin.html

1418 lines
40 KiB
HTML
Raw Permalink Normal View History

2017-06-19 11:03:13 +02:00
<!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">
2017-06-19 16:46:03 +02:00
<link rel="stylesheet" href="reveal.js/css/reveal.css">
<link rel="stylesheet" href="reveal.js/css/theme/beige.css" id="theme">
2017-06-19 11:03:13 +02:00
<!-- Theme used for syntax highlighting of code -->
2017-06-19 16:46:03 +02:00
<link rel="stylesheet" href="reveal.js/lib/css/zenburn.css">
2017-06-19 11:03:13 +02:00
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
2017-06-19 16:46:03 +02:00
link.href = window.location.search.match( /print-pdf/gi ) ? 'reveal.js/css/print/pdf.css' : 'reveal.js/css/print/paper.css';
2017-06-19 11:03:13 +02:00
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<!--[if lt IE 9]>
2017-06-19 16:46:03 +02:00
<script src="reveal.js/lib/js/html5shiv.js"></script>
2017-06-19 11:03:13 +02:00
<![endif]-->
</head>
<body>
<div class="reveal">
<!-- Any section element inside of this container is displayed as a slide -->
<div class="slides">
2017-06-19 18:33:19 +02:00
<section>
<h1>Formation Evolix</h1>
2017-06-19 21:41:32 +02:00
<h3>Administration système &amp; réseau &amp; sécurité</h3>
2017-06-19 18:33:19 +02:00
</section>
2017-06-19 11:03:13 +02:00
<section>
2017-06-19 23:52:26 +02:00
<section>
<h2>Cron</h2>
2017-06-20 03:19:14 +02:00
Démon de planification de tâches
2017-06-19 23:52:26 +02:00
</section>
2017-06-19 22:51:36 +02:00
2017-06-19 23:52:26 +02:00
<section>
2017-06-19 23:59:40 +02:00
<h3>Les fichiers de cron</h3>
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# systemctl status cron
2017-06-19 23:52:26 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# vim /etc/crontab
# vim /etc/default/cron
2017-06-19 23:59:40 +02:00
</code>
</pre>
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# vim /etc/cron.d/example
2017-06-19 23:52:26 +02:00
</code>
2017-06-19 23:59:14 +02:00
30 05 * * 0 www-data /usr/local/adm/savelog-weekly
2017-06-19 23:52:26 +02:00
</pre>
</section>
2017-06-19 22:51:36 +02:00
2017-06-19 23:52:26 +02:00
<section>
2017-06-20 00:01:09 +02:00
<h3>Éditer une table</h3>
2017-06-19 23:52:26 +02:00
<pre>
<code data-trim class="hljs nohighlight">
$ crontab -e
</code>
<code data-trim class="hljs nohighlight">
# crontab -u jdoe -e
</code>
2017-06-19 23:59:14 +02:00
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
2017-06-19 23:52:26 +02:00
</pre>
</section>
<section>
2017-06-20 00:01:09 +02:00
<h3>Documentation et consultation</h3>
2017-06-19 23:52:26 +02:00
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
$ man 5 crontab
2017-06-19 23:52:26 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
$ crontab -l
2017-06-19 23:52:26 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# crontab -u jdoe -l
2017-06-19 23:52:26 +02:00
</code>
</pre>
</section>
2017-06-19 11:03:13 +02:00
</section>
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 00:23:11 +02:00
<section>
<h2>ntpd</h2>
2017-06-20 01:12:41 +02:00
Démon de protocole de temps réseau.
2017-06-20 00:23:11 +02:00
</section>
<section>
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
$ date
2017-06-20 00:23:11 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# apt install ntp
2017-06-20 00:23:11 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 22:48:58 +02:00
# vim /etc/ntp.conf :
2017-06-20 00:23:11 +02:00
</code>
2017-06-20 00:12:08 +02:00
server ntp.evolix.net
2017-06-20 22:48:58 +02:00
<code data-trim class="hljs nohighlight">
# syctemctl restart ntp
# syctemctl status ntp
</code>
2017-06-20 00:23:11 +02:00
</pre>
</section>
2017-06-19 23:59:14 +02:00
<section>
2017-06-20 00:23:11 +02:00
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# ntpq -p
2017-06-20 00:23:11 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
$ timedatectl
2017-06-20 00:23:11 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# hwclock --show
2017-06-20 00:23:11 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# hwclock --systohc
2017-06-20 00:23:11 +02:00
</code>
</pre>
2017-06-19 23:59:14 +02:00
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 00:12:08 +02:00
<section>
2017-06-20 00:23:11 +02:00
<h2>systemd</h2>
2017-06-20 01:12:41 +02:00
Gestionnaire système et service
2017-06-20 00:12:08 +02:00
</section>
<section>
<h3>systemd est un gestionnaire de services</h3>
<p>Alternative au System V, installé par défaut depuis Debian 8.</p>
<pre>
2017-06-20 00:23:11 +02:00
<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>
2017-06-20 00:12:08 +02:00
</pre>
</section>
2017-06-19 22:59:55 +02:00
2017-06-20 00:12:08 +02:00
<section>
2017-06-20 00:23:11 +02:00
<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>
2017-06-20 00:12:08 +02:00
</section>
2017-06-19 22:59:55 +02:00
2017-06-20 00:12:08 +02:00
<section>
2017-06-20 00:23:11 +02:00
<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>
2017-06-20 00:12:08 +02:00
</section>
2017-06-19 22:59:55 +02:00
2017-06-20 00:12:08 +02:00
<section>
2017-06-20 00:23:11 +02:00
<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>
2017-06-20 00:12:08 +02:00
</section>
2017-06-19 22:59:55 +02:00
2017-06-20 00:12:08 +02:00
<section>
2017-06-20 00:23:11 +02:00
<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>
2017-06-20 00:12:08 +02:00
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-19 23:31:43 +02:00
<section>
<h2>Postfix</h2>
2017-06-20 01:12:41 +02:00
Agent de transport de courriers électroniques
2017-06-19 23:31:43 +02:00
</section>
<section>
2017-06-20 01:12:41 +02:00
<h3>Installation et configuration</h3>
2017-06-19 23:31:43 +02:00
<pre><code data-trim class="hljs nohighlight">
2017-06-20 00:17:16 +02:00
# apt install postfix
2017-06-19 23:31:43 +02:00
</code></pre>
<ul>
<li>process : /etc/postfix/master.cf</li>
<li>options : /etc/postfix/main.cf</li>
</ul>
</section>
<section>
<pre>
2017-06-20 02:20:47 +02:00
<code data-trim class="hljs nohighlight"># vim main.cf</code>
2017-06-19 23:11:44 +02:00
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
2017-06-20 00:23:11 +02:00
</pre>
</section>
2017-06-19 23:11:44 +02:00
2017-06-20 00:23:11 +02:00
<section>
<pre>
<code class="hljs nohighlight" data-trim style="max-height: 500px">
2017-06-19 23:11:44 +02:00
# 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
2017-06-19 23:31:43 +02:00
# mailq | tail -n +2 | \
awk 'BEGIN { RS = "" } /example\.com$/ { print $1 }' | \
tr -d '*!' | postsuper -d -
2017-06-20 00:23:11 +02:00
</code></pre>
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 00:38:59 +02:00
<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>
2017-06-19 23:32:08 +02:00
*.*;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
2017-06-20 00:38:59 +02:00
</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>
2017-06-19 23:32:08 +02:00
</section>
<section>
2017-06-20 00:56:00 +02:00
<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>
2017-06-19 23:46:53 +02:00
2017-06-20 00:56:00 +02:00
<section>
2017-06-20 01:12:41 +02:00
<h3>Exemple de configuration</h3>
2017-06-20 00:56:00 +02:00
<pre>
<code data-trim class="hljs nohighlight">
2017-06-19 23:46:53 +02:00
# vim /etc/logrotate.d/dpkg
2017-06-20 00:56:00 +02:00
</code>
2017-06-19 23:46:53 +02:00
/var/log/dpkg.log {
monthly
rotate 12
compress
delaycompress
missingok
notifempty
create 644 root root
}
2017-06-20 00:56:00 +02:00
</pre>
<p>Note : le programme "savelog" permet une rotation ultrasimple de journaux en ajoutant un suffixe et conservant 7 versions.</p>
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
<section>
2017-06-20 00:56:00 +02:00
<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>
2017-06-20 01:12:41 +02:00
<h3>Installation, configuration et gestion</h3>
2017-06-20 00:56:00 +02:00
<pre>
<code data-trim class="hljs nohighlight">
2017-06-19 23:57:29 +02:00
# apt install log2mail
2017-06-20 00:56:00 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-19 23:57:29 +02:00
# vim /etc/log2mail/config/default
2017-06-20 00:56:00 +02:00
</code>
2017-06-19 23:57:29 +02:00
file = /var/log/mail.log
pattern = "fatal"
mailto = admin@example.com
template = /etc/log2mail/mail
2017-06-20 00:56:00 +02:00
<code data-trim class="hljs nohighlight">
2017-06-19 23:57:29 +02:00
# /etc/init.d/log2mail restart
2017-06-20 00:56:00 +02:00
</code>
</pre>
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
<section>
2017-06-20 00:56:00 +02:00
<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>
2017-06-20 01:12:41 +02:00
<h3>Installation et configuration</h3>
2017-06-20 00:56:00 +02:00
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:01:56 +02:00
# aptitude install logcheck logcheck-database
2017-06-20 00:56:00 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 22:48:58 +02:00
# vim /etc/logcheck/logcheck.conf
2017-06-20 00:56:00 +02:00
</code>
2017-06-20 00:01:56 +02:00
REPORTLEVEL="server"
SENDMAILTO="alert@example.com"
MAILASATTACH=0
FQDN=1
TMP="/tmp"
</section>
2017-06-20 00:56:00 +02:00
<section>
2017-06-20 22:48:58 +02:00
Exceptions dans /etc/logcheck/ignore.d.server/
2017-06-20 00:56:00 +02:00
<pre>
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: \[IPTABLES DROP\] : IN=eth0 OUT= MAC=.*
2017-06-20 00:01:56 +02:00
^\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:]]+$
2017-06-20 00:56:00 +02:00
</pre>
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
<section>
2017-06-20 01:12:41 +02:00
<h2>fail2ban</h2>
<p>Exécute des actions à la détection de comportements anormaux.</p>
</section>
<section>
2017-06-20 01:12:41 +02:00
<h3>Installation et commandes utiles</h3>
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:13:29 +02:00
# apt install fail2ban
2017-06-20 01:12:41 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:13:29 +02:00
# fail2ban-client status
2017-06-20 01:12:41 +02:00
</code>
<code data-trim class="hljs nohighlight">
2017-06-20 00:13:29 +02:00
# fail2ban-client status ssh
2017-06-20 01:12:41 +02:00
</code>
</pre>
</section>
<section>
<h3>Exemple de filtre</h3>
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:13:29 +02:00
# vim /etc/fail2ban/filter.d/demo :
2017-06-20 01:12:41 +02:00
</code>
2017-06-20 00:13:29 +02:00
[Definition]
failregex = warning: \[<HOST>\]: authentication failed:
ignoreregex =
2017-06-20 01:12:41 +02:00
</pre>
</section>
<section>
2017-06-20 01:12:41 +02:00
<h3>Exemple de <em>jail</em></h3>
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:13:29 +02:00
# vim /etc/fail2ban/jail.local
2017-06-20 01:12:41 +02:00
</code>
2017-06-20 00:13:29 +02:00
[demo-rule]
2017-06-20 01:12:41 +02:00
enabled = true
port = http,https
filter = demo
logpath = /var/log/demo.log
2017-06-20 00:13:29 +02:00
maxretry = 3
findtime = 1800
2017-06-20 01:12:41 +02:00
bantime = 3600
</pre>
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 00:13:29 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-19 18:33:19 +02:00
<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>
2017-06-19 22:53:07 +02:00
<li>gérer des branches</li>
2017-06-19 18:33:19 +02:00
<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>
2017-06-19 22:53:07 +02:00
<li>Tout est local (le plus souvent)</li>
2017-06-19 21:41:32 +02:00
<li>échanges possibles entre dépôts (FS ou réseau)</li>
2017-06-19 18:33:19 +02:00
<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>
2017-06-19 21:41:32 +02:00
<h4><em>commit</em>, <em>tree</em>, <em>blob</em></h4>
2017-06-19 18:33:19 +02:00
<ul>
2017-06-19 21:41:32 +02:00
<li>un commit pointe sur un arbre</li>
2017-06-19 18:33:19 +02:00
<li>chaque élément pointe sur un autre arbre</li>
2017-06-19 21:41:32 +02:00
<li>… ou sur un "blob" (contenu final)</li>
2017-06-19 18:33:19 +02:00
</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>
2017-06-19 21:41:32 +02:00
<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>
2017-06-19 18:33:19 +02:00
</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>
2017-06-19 21:41:32 +02:00
<h3>En pratique : /etc/.git</h3>
2017-06-19 21:21:59 +02:00
<p>Une <em>bonne pratique</em> Evolix.</p>
2017-06-19 18:33:19 +02:00
</section>
2017-06-19 22:53:07 +02:00
<section>
<h4>Installation de Git</h4>
2017-06-20 02:20:47 +02:00
<pre><code data-trim class="hljs nohighlight">
2017-06-19 22:53:07 +02:00
# apt install git
# git --version
git version 2.11.0
</code></pre>
</section>
2017-06-19 18:33:19 +02:00
<section>
2017-06-19 21:21:59 +02:00
<h4>Initialisation du dépôt</h4>
2017-06-20 02:20:47 +02:00
<pre><code data-trim class="hljs nohighlight">
2017-06-19 21:41:32 +02:00
$ cd /etc
2017-06-19 18:33:19 +02:00
$ su
2017-06-19 22:53:07 +02:00
# git init
2017-06-19 18:33:19 +02:00
# git status
# git add .
# git commit -m "commit initial"
</code></pre>
</section>
2017-06-19 21:21:59 +02:00
<section>
<h4>Premières modifications</h4>
2017-06-20 02:20:47 +02:00
<pre><code data-trim class="hljs nohighlight">
2017-06-19 21:21:59 +02:00
# 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>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 01:40:24 +02:00
<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>
2017-06-20 22:48:58 +02:00
<li>surveillance de services HTTP, SMTP, POP3, SQL etc. + ressources (charge processeur, utilisation des disques, etc.)</li>
2017-06-20 01:40:24 +02:00
<li>Nagios, Icinga, Zabbix, Monit</li>
</ul>
</li>
</ul>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 01:40:24 +02:00
<section>
<h2>Sécurité</h2>
</section>
<section>
2017-06-20 01:40:24 +02:00
<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>
2017-06-20 01:40:24 +02:00
<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>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 01:08:33 +02:00
<section>
<h2>Réseau / iptables</h2>
2017-06-20 01:40:24 +02:00
</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>
2017-06-20 01:08:33 +02:00
</section>
2017-06-20 01:40:24 +02:00
2017-06-20 01:08:33 +02:00
<section>
2017-06-20 01:40:24 +02:00
<h3>Afficher les règles du firewall</h3>
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:49:58 +02:00
# iptables -L -t filter -v
2017-06-20 01:40:24 +02:00
</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>
2017-06-20 01:08:33 +02:00
</section>
2017-06-20 01:40:24 +02:00
2017-06-20 01:08:33 +02:00
<section>
2017-06-20 01:40:24 +02:00
<h3>Exemple de règles :</h3>
<pre>
<code data-trim class="hljs nohighlight">
2017-06-20 00:49:58 +02:00
# iptables -A INPUT -i eth1 -j ACCEPT
2017-06-20 01:40:24 +02:00
</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>
2017-06-20 22:48:58 +02:00
<li>Dépôt du projet : <a href="https://forge.evolix.org/projects/minifirewall/repository/">forge.evolix.org/projects/minifirewall/repository/</a></li>
2017-06-20 01:40:24 +02:00
<li>Instruction d'installation : <a href="https://forge.evolix.org/projects/minifirewall/wiki">forge.evolix.org/projects/minifirewall/wiki</a></li>
</ul>
2017-06-20 01:08:33 +02:00
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-19 22:02:56 +02:00
<section>
<h2>Introduction à Ansible</h2>
</section>
2017-06-19 23:20:45 +02:00
<section>
<h3>Qu'est-ce qu'Ansible ?</h3>
<h4>Automatisation de configuration d'infrastructure et déploiement</h4>
</section>
2017-06-19 22:02:56 +02:00
<section>
2017-06-19 23:16:23 +02:00
<h3>Objectifs d'Ansible</h3>
<ul>
<li>homogénéité</li>
<li>fiabilité</li>
<li>rapidité</li>
</ul>
2017-06-19 22:02:56 +02:00
</section>
<section>
2017-06-19 23:16:23 +02:00
<h4>Parfait pour</h4>
<ul>
<li>tâches répétitives</li>
<li>actions urgentes</li>
<li>demandes spécifiques</li>
</ul>
2017-06-19 22:02:56 +02:00
</section>
2017-06-19 22:53:07 +02:00
<section>
2017-06-19 23:16:23 +02:00
<h3>Principes fondateurs</h3>
2017-06-19 22:53:07 +02:00
<ul>
2017-06-19 23:16:23 +02:00
<li>Idempotence</li>
<li>Pas d'agent</li>
<li>Souplesse et légèreté</li>
2017-06-19 22:53:07 +02:00
</ul>
</section>
<section>
2017-06-19 23:16:23 +02:00
<h3>Installation</h3>
<p>Paquets pour de nombreuses distributions</p>
2017-06-20 22:48:58 +02:00
<pre><code class="hljs nohighlight" data-trim>
2017-06-19 23:16:23 +02:00
# 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'"
2017-06-19 23:59:40 +02:00
</code></pre>
2017-06-19 23:16:23 +02:00
</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>
2017-06-19 23:59:40 +02:00
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>
2017-06-19 23:16:23 +02:00
</section>
<section>
<pre><code class="hljs ini" data-trim style="max-height: 600px">
2017-06-19 23:59:40 +02:00
kvm01 ansible_host=192.168.2.1
kvm02 ansible_host=192.168.2.2
2017-06-19 23:16:23 +02:00
2017-06-19 23:59:40 +02:00
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
2017-06-19 22:53:07 +02:00
2017-06-19 23:59:40 +02:00
[hypervisors]
kvm01
kvm02
2017-06-19 22:53:07 +02:00
2017-06-19 23:59:40 +02:00
[fronts]
stack01-front01
2017-06-19 22:53:07 +02:00
2017-06-19 23:59:40 +02:00
[dbs]
stack01-data01
2017-06-19 22:53:07 +02:00
2017-06-19 23:59:40 +02:00
[web]
stack01-front01-web01
</code></pre>
2017-06-19 22:53:07 +02:00
</section>
<section>
2017-06-19 23:16:23 +02:00
<h4>Variables</h4>
<ul>
<li>sources multiples (<em>facts</em> ou configuration)</li>
<li>règles de précédence pour personnalisation</li>
</ul>
2017-06-19 22:53:07 +02:00
</section>
<section>
2017-06-19 23:16:23 +02:00
<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>
2017-06-19 22:53:07 +02:00
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 01:39:02 +02:00
<section>
2017-06-20 01:47:00 +02:00
<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>
2017-06-20 22:48:58 +02:00
<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
2017-06-20 01:47:00 +02:00
<code data-trim class="hljs nohighlight">
$ ssh-keygen
$ cat .ssh/id_rsa.pub
$ vim .ssh/authorized_keys
2017-06-20 01:47:00 +02:00
</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>
2017-06-20 01:39:02 +02:00
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 01:39:02 +02:00
<section>
2017-06-20 01:47:00 +02:00
<h2>Sauvegardes</h2>
2017-06-20 01:39:02 +02:00
</section>
2017-06-20 02:20:47 +02:00
2017-06-20 01:39:02 +02:00
<section>
2017-06-20 02:20:47 +02:00
<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>
2017-06-20 01:39:02 +02:00
</section>
2017-06-20 02:20:47 +02:00
2017-06-20 01:39:02 +02:00
<section>
2017-06-20 02:20:47 +02:00
<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>
2017-06-20 01:39:02 +02:00
</section>
2017-06-20 02:20:47 +02:00
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 01:23:40 +02:00
<section>
2017-06-20 02:20:47 +02:00
<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>
2017-06-20 01:47:57 +02:00
</section>
<section>
2017-06-20 02:20:47 +02:00
<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>
2017-06-20 01:23:40 +02:00
</section>
2017-06-20 01:47:00 +02:00
<section>
<p>Pour un fichier, ces 3 droits sont définis pour 3 catégories:
2017-06-20 01:23:40 +02:00
<ul>
<li>l'utilisateur,</li>
<li>le groupe</li>
<li>et le "reste du monde".</li>
2017-06-20 02:10:53 +02:00
</ul>
</p>
<p>Pour chacune de ces catégories: on note les droits sous la forme rwx.</p>
2017-06-20 01:23:40 +02:00
<pre>
2017-06-20 02:20:47 +02:00
<code data-trim class="hljs nohighlight">[s:sst] u:rwx g:rwx o:rwx</code>
2017-06-20 01:23:40 +02:00
</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>
2017-06-20 02:20:47 +02:00
<code data-trim class="hljs nohighlight">
2017-06-20 02:10:53 +02:00
$ chmod < catégorie >+< nouveau_droit > fichier
2017-06-20 01:23:40 +02:00
</code>
2017-06-20 02:20:47 +02:00
<code data-trim class="hljs nohighlight">
2017-06-20 02:10:53 +02:00
$ chmod < nouveaux_droits > fichier
2017-06-20 01:23:40 +02:00
</code>
</pre>
</section>
<section>
2017-06-20 02:20:47 +02:00
<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>
2017-06-20 01:23:40 +02:00
</section>
<section>
2017-06-20 02:10:53 +02:00
<p> Notation décimale :</p>
2017-06-20 01:23:40 +02:00
<pre>
2017-06-20 02:20:47 +02:00
<code data-trim class="hljs nohighlight">
2017-06-19 11:03:13 +02:00
777 = ?
700 = ?
600 = ?
644 = ?
755 = ?
775 = ?
701 = ?
2017-06-20 01:23:40 +02:00
</code>
2017-06-20 02:10:53 +02:00
</pre>
2017-06-20 01:23:40 +02:00
<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>
2017-06-19 11:03:13 +02:00
<section>
2017-06-20 01:47:57 +02:00
<section>
2017-06-20 02:20:47 +02:00
<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>
2017-06-20 01:47:57 +02:00
</section>
<section>
2017-06-20 02:20:47 +02:00
<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>
2017-06-20 01:47:57 +02:00
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 02:10:53 +02:00
<section>
<h2>DRBD</h2>
<pre>
2017-06-20 02:20:47 +02:00
<code data-trim class="hljs nohighlight">#apt install drbd-utils</code>
2017-06-20 02:10:53 +02:00
</pre>
</section>
<section>
<p>Sur une installation DRBD on définit :
<ul>
2017-06-20 02:25:06 +02:00
<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>
2017-06-20 02:10:53 +02:00
</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;
}
}
2017-06-20 02:10:53 +02:00
</pre>
2017-06-20 02:25:06 +02:00
</section>
<section>
<pre>
2017-06-20 02:20:47 +02:00
<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]
2017-06-20 02:10:53 +02:00
</code>
2017-06-20 02:20:47 +02:00
<code data-trim class="hljs nohighlight">
$ cat /proc/drbd
# drbd-overview
2017-06-20 02:10:53 +02:00
</code>
2017-06-20 02:25:06 +02:00
</pre>
2017-06-20 02:10:53 +02:00
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 02:10:53 +02:00
<section>
2017-06-19 18:33:19 +02:00
<h2>Virtualisation</h2>
2017-06-20 02:10:53 +02:00
<ul>
<li>KVM/libvirt</li>
<li>Xen</li>
<li>VMware</li>
</ul>
<p>Focus sur KVM :</p>
<pre>
2017-06-20 02:20:47 +02:00
<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>
2017-06-20 02:10:53 +02:00
</pre>
</section>
<section>
2017-06-20 02:20:47 +02:00
<pre><code data-trim class="hljs nohighlight">
# virsh list --all
2017-06-20 02:25:06 +02:00
# virsh start < vm-name >
# virsh shutdown < vm-name >
# virsh destroy < vm-name >
# virsh edit < vm-name >
# virsh undefine < vm-name >
# virsh define template.xml
2017-06-20 02:10:53 +02:00
</code></pre>
</section>
<section>
2017-06-20 02:20:47 +02:00
<pre><code data-trim class="hljs nohighlight">
# virt-install --connect=qemu:///system \
--name=template \
--cpu mode=host-passthrough --vcpus=1 \
--ram=512 \
2017-06-20 02:25:06 +02:00
--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
2017-06-20 02:10:53 +02:00
</code></pre>
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 02:29:36 +02:00
<section>
<h2>Conteneur</h2>
2017-06-20 02:29:36 +02:00
<h3>LXC</h3>
<pre>
2017-06-20 02:20:47 +02:00
<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
2017-06-20 02:29:36 +02:00
# lxc-destroy -n foo</code>
</pre>
</section>
<section>
2017-06-20 22:48:58 +02:00
<h2>Conteneur</h2>
2017-06-20 02:29:36 +02:00
<h3>Docker</h3>
<pre>
2017-06-20 02:20:47 +02:00
<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
2017-06-20 02:29:36 +02:00
$ docker exec [options] CONTENEUR COMMANDE</code>
</pre>
</section>
2017-06-19 16:46:03 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-19 16:46:03 +02:00
<section>
2017-06-20 02:20:47 +02:00
<section>
<h2>Authentification</h2>
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 02:20:47 +02:00
<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">
2017-06-19 11:03:13 +02:00
# shadowconfig on/off
2017-06-20 02:20:47 +02:00
</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>
2017-06-20 03:11:54 +02:00
<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 :
2017-06-20 02:20:47 +02:00
<pre>
DSHELL=/bin/bash
DHOME=/home
SKEL=/etc/skel
QUOTAUSER="forquota"
DIR_MODE=0750
</pre>
</section>
<section>
2017-06-20 03:11:54 +02:00
<h3>« Profil » pour un utilisateur créé</h3>
2017-06-19 11:03:13 +02:00
Il se trouve dans le répertoire /etc/skel/
2017-06-20 03:11:54 +02:00
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<section>
Les utilisateurs
<ul>
<li>sont identifiés par leur nom de compte</li>
<li>appartiennent à un groupe primaire (voir /etc/passwd)</li>
2017-06-20 22:48:58 +02:00
<li>peuvent appartenir à des groupes secondaires (voir /etc/group)</li>
2017-06-20 03:11:54 +02:00
</ul>
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<section>
<pre>
<code data-trim class="hljs nohighlight">jdoe@serveur:~$ whoami</code>
2017-06-19 11:03:13 +02:00
jdoe
2017-06-20 03:11:54 +02:00
<code data-trim class="hljs nohighlight">jdoe@serveur:~$ groups</code>
2017-06-20 22:48:58 +02:00
jdoe dialout cdrom audio video plugdev
2017-06-20 03:11:54 +02:00
<code data-trim class="hljs nohighlight">jdoe@serveur:~$ id</code>
2017-06-20 22:48:58 +02:00
uid=1000(jdoe) gid=1000(jdoe) groupes=20(dialout),24(cdrom),29(audio),44(video)
2017-06-20 03:11:54 +02:00
</pre>
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<section>
<h3>Restriction de login</h3>
<pre>
2017-06-20 22:48:58 +02:00
<code data-trim class="hljs nohighlight"># vim /etc/login.defs</code>
2017-06-19 11:03:13 +02:00
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
2017-06-20 03:11:54 +02:00
</pre>
Complété par… Linux-PAM (à suivre)
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<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>
2017-06-19 11:03:13 +02:00
foo:$1$mYploS2J$uSouKZPBjUF6D094HPgGj/:13853:0:99999:7:::
2017-06-20 03:11:54 +02:00
</pre>
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<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>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<section>
<h3>Configuration</h3>
<pre><code data-trim class="hljs nohighlight"># visudo</code>
2017-06-19 11:03:13 +02:00
jdoe ALL = ALL
jdoe ALL = NOPASSWD: ALL
jdoe ALL = /usr/sbin/tcpdump
jdoe ALL = (foo) /bin/kill
jdoe ALL = (ALL) sudoedit /etc/hosts
2017-06-20 03:11:54 +02:00
</pre>
Pour lister les droits :
<pre><code data-trim class="hljs nohighlight"># sudo -l</code></pre>
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<section>
<h3>Système de gestion des utilisateurs</h3>
<h3>!=</h3>
<h3>Système d'authentification des utilisateurs</h3>
</section>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<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>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<section>
2017-06-20 22:48:58 +02:00
<pre><code data-trim class="hljs nohighlight"># vim /etc/nsswitch.conf</code>
2017-06-19 11:03:13 +02:00
passwd: compat
group: compat
shadow: compat
hosts: files dns
2017-06-20 03:11:54 +02:00
</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>
2017-06-19 11:03:13 +02:00
2017-06-20 03:11:54 +02:00
<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>
2017-06-19 16:46:03 +02:00
</section>
2017-06-20 03:11:54 +02:00
</section>
2017-06-19 11:03:13 +02:00
</div>
</div>
2017-06-19 16:46:03 +02:00
<script src="reveal.js/lib/js/head.min.js"></script>
<script src="reveal.js/js/reveal.js"></script>
2017-06-19 11:03:13 +02:00
<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: [
2017-06-19 16:46:03 +02:00
{ 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 }
2017-06-19 11:03:13 +02:00
]
});
</script>
</body>
</html>