Saloperie de bienvenue

Bienvenue dans cette saloperie de wiki. Évidemment, ce wiki est un projet collaboratif et peut contenir des erreurs. N'hésitez pas à nous informer des fautes que vous pouvez voir, mais aussi des ajouts que vous souhaiteriez voir apparaître.

Si vous souhaitez ajouter un article par vous-même et donc devenir comme nous des salops de collaborateurs, vous pouvez nous envoyer un markdown ou un txt sur le sujet de votre choix et il sera ajouté sous le pseudo que vous souhaitez. Cependant, pour que le wiki garde une certaine qualité, il sera soumis à une saloperie de test pour vérifier son bon fonctionnement.

Pour cela une seule adresse wiki@salo.pe.

Merci pour la lecture et profitez à fond de nos saloperies d'articles.

Markdown

Par ce salop d'Oreo

Le markdown

Le markdown est un langage de balisage (Markup Language) tout comme le HTML (HyperText Markup Language), le XML ou le LaTeX. Dans ces différents langages, des balises permettent dce délimiter des séquences de caractères afin de traiter le texte d'une manière particulière lors de son affichage.

L'intérêt principal du markdown est sa simplicité de lecture et d'écriture permettant une rédaction rapide et fluide tout en mettant en place une structure claire dans le document en vue de sa relecture.

Le Markdown est souvent utilisé dans les blogs, les messageries instantanées, les forums et même (attention, suprise) dans la création de wiki (oui ce wiki est écrit en Markdown) du fait de la rapidité de son apprentissage.

Syntax

Bold and italic

*italic text* italic text
_italic text_ italic text
**bold text** bold text
__bold text__ bold text
***italic and bold text*** italic and bold text
___italic and bold text___ italic and bold text

Crossed out text

~~cross out text~~ cross out text

Titles

# Title 1
## Title 2
### Title 3
#### Title 4
##### Title 5

Paragraph

To insert a new paragraph just put a new ligne.
To insert a end of line put two spaces or a \.

Quote

> some text
> continue the text

> an other text zone

some text continue the text

an other text zone

List

You can use the plus sign, the dash or an asterisk as follows:

* l1
* l2
* l3
  • l1
  • l2
  • l3

Code

To print code you can use backtick: `code`

You can also use three backticks to print a block of code and add the programing language to print syntax in color.

```html
<body>
    TOTO
</body>
```.
<body>
    TOTO
</body>

To display a clickable hyperlink use < hyperlink >.
To display an hyperlink not clickable use ` hyperlink `.
To give an alternative name to an hyperlink just add [Name] in front of your link.

Images

  alternative text       image link
       v                      v
![image example](https://example.com/bild.jpg)

Tables

| cell title1 | cell title 2|
|--------|--------|
|    A    |    B    |
|    C    |    D    |
cell title1cell title 2
AB
CD

Footnotes

In the text I place [^1] a footnotes \
[^1]: this is a footnote

In the text I place 1 a footnotes

1

this is a footnote

LaTeX

Par ces salops de Kuro et FanfanlaTulipe

Alors là, on va aborder une belle saloperie.

Pandoc

pandoc est une bibliothèque Haskell et un convertisseur pour transformer un format de document en un autre (voir le site ci-dessous pour voir les formats supportés). Nous aborderons ici la converstion d'un mélange de markdown, LaTeX et HTML en pdf.

Site de pandoc

Nous allons faire un makefile pour transformer notre document source (ici saloperie.md) en LaTeX compilé en pdf. PENSEZ A REMPLACER LES ESPACES PAR DES TABULATIONS POUR QUE LE MAKEFILE SOIT VALIDE

makefile :

# A perfect makefile to compile notion.so exported markdown
CC=pandoc
C_ARGS=-f markdown-implicit_figures

# Definition des differents pdfs pouvant être compilés
# saloperie.pdf: header.md_ saloperie_de_markdown.md_
# saloperie.pdf est le nom du pdf généré
# header.md_ saloperie_de_markdown.md_ est la liste des md devant être mis dans le pdf
#                                       dans l'ordre avec un _ en fin de nom
saloperie.pdf: header.md_ saloperie.md_
saloperie2.pdf: header.md_ saloperie2.md_

# Merge les dépendences en un fichier et le compile
%.pdf:
	cat $^ > $@.tmpdf.md
	$(CC) $(C_ARGS) -o $@ $@.tmpdf.md


# Génère les markdown pratiques pour êtres compilés en Latex
%.md_: %.md
    @# Copie le fichier markdown dans un nouveau fichier avec _ en début et sans le .md
    cp $< $@
    @# Remplace les lignes ne contenant que `\\` par des `\newpage`
    sed -i 's/^\\\\$$/\\newpage/' $@
    @# Retire les commentaires `Untitled` des images (quand export depuis Notion)
    sed -i 's/!\[Untitled\]/![]/' $@
    @# remplace les %20 dans le fichier par des underscores (pour retirer les espaces des noms de fichiers qui cassent pandoc)
    sed -i 's/%20/_/g' $@
    @# centre les images
    sed -i 's/^\!\[.*\]\(.*\)$$/\\centering\n\n&\n\n\\raggedright/g' $@

# Création du fichier header en modifiant les occurences de `$title` et `$authors` par les contenus des fichiers correspondants
header.md_: header.md title authors
    @# Copie le fichier header.md dans un fichier _header
    cp $< $@
    @# Remplace `$title` par le contenu du fichier title
    sed -i 's/$$title/'"$$(cat title)"'/' $@
    @# Remplace `$authors` par le contenu du fichier title
    sed -i 's/$$authors/'"$$(cat authors)"'/' $@

# Crée un fichier de titre basique si il n'existe pas
title:
    cat << "EOF" > $@
        Saloperie de pdf
    EOF
    sed -i 's/\\/\\\\/g' $@

# Crée un fichier authors basique si il n'existe pas
authors:
    cat << "EOF" > $@
        Un salaud d'anonyme\\Saloperie de Wiki
    EOF
    sed -i 's/\\/\\\\/g' $@

# Retire les espaces des noms de fichiers
# A lancer lors de l'export avant la première compilation
remove_space_in_files_names:
    # Retire les espaces des dossiers
    @find . -depth -type d -name "* *" -print -exec bash -c 'mv "$$0" "$${0// /_}"' {} \;
    # Retire les espaces des fichiers
    @find . -depth -type f -name "* *" -print -exec bash -c 'mv "$$0" "$${0// /_}"' {} \;

clean:
    ${RM} *.tmpdf.md
    ${RM} *.md_
    ${RM} *.pdf

.PHONY: all clean remove_space_in_files_names
.ONESHELL:

header.md :

---
numbersections: true
geometry: margin=3cm
header-includes:
 - \usepackage{graphicx}
 - \usepackage[ddmmyyyy]{datetime}
 - \usepackage{fvextra}
 - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
---
<!--
graphicx : Permet de faire une image en latex sans forcement avoir une image en markdown ensuite
datetime : Permet de changer le format de date utilisé
fvextra et DefineVerbatimEnvironment : Permet un retour a la ligne automatique avec un `\` a la fin des lignes de code sortant de la page
-->

\begin{titlepage}
    \centering
    \vspace*{0.05cm}

    \rule{\linewidth}{0.1 mm} \\[0.4 cm]
    { \huge \bfseries  $title}\\

    \rule{\linewidth}{0.1 mm} \\[1 cm]

    \begin{minipage}{0.7\textwidth}
        \begin{center} \large
\textbf{$authors}
            \end{center}
            \end{minipage}~
            \begin{minipage}{0.7\textwidth}
    \end{minipage}\\[3 cm]

        \begin{figure}[h]
        \centering
        \includegraphics[width=5cm]{logo-saloperie.png}%
    \end{figure}
        \begin{center}
        \today
            \end{center}
\end{titlepage}

\newpage
\renewcommand{\contentsname}{Sommaire}
\tableofcontents

\newpage

Ce header nécessite d'avoir une image logo-saloperie.png à coté du Makefile

Pour compiler le fichier :

make
# ou
make saloperie.pdf

make clean  # supprimer les fichiers générés et les fichiers temporaires

Pour encore un peu plus d'automatisation, vous pouvez placer ce Makefile, le fichier header.md et l'image logo-saloperie.png dans un dossier précis (ici ce sera ~/Desktop/pdf) et ajouter la fonction suivante dans votre .bashrc (ou tout autre fichier de configuration de shell que vous utilisez)

function pdf_makefile() {
    cp ~/Desktop/pdf/Makefile ~/Desktop/pdf/logo.png ~/Desktop/pdf/header.md .
    echo -n "$1: _header" >> Makefile
    shift
    for i in $@; do
        echo -n " _$(echo $i | awk -F '.md$' '{ print $1 }')" >> Makefile
    done
    echo "" >> Makefile
}

Ainsi, lorsque vous souhaitez compiler un nouveau markdown, vous pouvez faire pdf_makefile pdf.pdf premier_markdown.md deuxieme_markdown.md et vous obtiendrez le makefile adapté avec la règle pour créer le pdf pdf.pdf en utilisant header.md comme header et avec premier_markdown.md et deuxieme_markdown.md comme contenu.

Gantt

Pour inclure des Gantt LaTeX dans votre pdf, vous pouvez ajouter l'inclusion suivante dans le fichier header.md

 - \usepackage{pgfgantt}

Intégrez et utilisez ensuite les commandes LaTeX suivantes pour créer votre diagramme de Gantt

gantt.md :

<!--
================================================================================

                              COMMANDS DEFINITION

Available commands:
- \begin{coolGantChart}{start}{end}
  Create a new Gantt from start to end indexes.
  Thoses indexes are used to generate the gantt bars afterwards
- \end{coolGantChart}
  End the gantt chart
- \gantttitle and \gantttitlelist
  See Titles section in [pgfgantt documentation](https://texdoc.org/serve/pgfgantt.pdf/0)
- \coolNewGroup{Group title}
  Create a group title for the following gantt bars
- \definecolor{actual}{RGB}{68,114,196}
  Defines the `actual` color to RGB(68, 114, 196).
  The `actual` color is used by default for the coolNewBar command
- \coolNewBar[color]{Bar title}{start_index}{end_index}
  Create a gantt bar from start_index to end_index
  Color defaults to `actual`
- \coolNewLink[line_count]{from}{to}
  Create a link from the `from` bar to the `to` bar
  The first bar created in the chart is indexed 0 and it increments for each bar created.
  `line_count` correspond to the how much lines are between from and to to make the arrow turns at the right places
- \coolNewRevertLink[1]{1}{2}
  Same as \coolNewLink but the turns are centered the opposite way (try it to understand fully)

Are are some nice colors to use for the bars
\definecolor{actual}{RGB}{68,114,196}   % Blue
\definecolor{actual}{RGB}{112,173,71}   % Light green
\definecolor{actual}{RGB}{255,217,102}  % Yellow
\definecolor{actual}{RGB}{255,75,75}    % Light red
\definecolor{actual}{RGB}{0,188,208}    % Cyan
\definecolor{actual}{RGB}{237,125,49}   % Orange
\definecolor{actual}{RGB}{112,48,160}   % Purple

================================================================================
-->
\newcounter{test}

\newenvironment{coolGantChart}[2]{
\begin{ganttchart}[
  x unit=0.50cm,
  group left shift=0,
  group top shift=0.4,
  group right shift=0,
  group height=0.7,
  bar height=.5,
  group peaks height=.0,
  group peaks width=.0,
  y unit chart=0.5cm,
  y unit title=0.5cm,
  title height=0.8
]{#1}{#2}
\setcounter{test}{0}
}{
\end{ganttchart}
}

\makeatletter
\newcommand\removeSpecialCharacters[1]{
  \begingroup
  \let\c\relax
  \renewcommand\add@accent[2]{##2}
  #1
  \endgroup
}
\makeatother


\newcommand\coolNewBar[4][actual]{
\ganttbar[bar/.append style={fill=#1},name=\thetest]{#2}{#3}{#4}
\stepcounter{test}
}

\newcommand\coolNewGroup[1]{%
\ganttgroup[group/.append style={draw=black}]{#1}{-100}{-100}
}

\newcommand\coolNewLink[3][1]{
    \ganttlink[link mid=(1 - 1/(2*#1))]{#2}{#3}
}
\newcommand\coolNewRevertLink[3][1]{
    \ganttlink[link mid=(1/(2*#1))]{#2}{#3}
}

<!--
================================================================================

                                  EXAMPLE GANT

================================================================================
-->


\begin{coolGantChart}{1}{36}
\gantttitle{1ère année}{12}\gantttitle{2ème année}{12}\gantttitle{3ème année}{12}\\
	\gantttitlelist{1,...,36}{1} \\

\definecolor{actual}{RGB}{68,114,196}
\coolNewGroup{Groupe 1}{1}{36}\\
\coolNewBar{Barre 1}{1}{36}\\
\coolNewBar{Barre 2}{1}{6}\\
\coolNewBar{Barre 3}{7}{13}\\
\coolNewBar{Barre 4}{7}{11}\\


\coolNewLink[1]{1}{2}

\definecolor{actual}{RGB}{112,173,71}
\coolNewGroup{Groupe 2}{1}{12}\\
\coolNewBar{Barre 5}{1}{2}\\
\coolNewBar{Barre 6}{3}{7}\\

\coolNewRevertLink[2]{1}{3}
\coolNewLink[1]{4}{5}

\definecolor{actual}{RGB}{255,217,102}
\coolNewGroup{Groupe 3}{8}{29} \\
\coolNewBar{Barre 7}{12}{15} \\
\coolNewBar{Barre 8}{8}{15}\\
\coolNewBar{Barre 9}{16}{24} \\
\coolNewBar{Barre 10}{23}{29} \\

\coolNewLink[3]{3}{6}

\definecolor{actual}{RGB}{255,75,75}
\coolNewGroup{Groupe 3}{1}{24}l\\
\coolNewBar{Barre 11}{1}{3}
\addtocounter{test}{-1}
\coolNewBar{}{13}{18}\\
\coolNewBar{Barre 12}{3}{7}\\
\coolNewBar{Barre 13}{7}{24}\\
\coolNewBar{Barre 14}{1}{24}\\
\coolNewBar{Barre 15}{5}{11}\\

\coolNewRevertLink[14]{1}{12}

\definecolor{actual}{RGB}{237,125,49}
\coolNewGroup{Groupe 4}{1}{24}\\
\coolNewBar{Barre 16}{1}{8}\\
\coolNewBar{Barre 17}{13}{20}\\
\coolNewBar{Barre 18}{13}{18}\\

\coolNewLink{5}{16}
\coolNewLink[1]{3}{16}
\coolNewLink[1]{3}{17}

\definecolor{actual}{RGB}{112,48,160}
\coolNewGroup{Groupe 5}{1}{16}\\
\coolNewBar{Barre 19}{1}{6}\\
\coolNewBar{Barre 20}{3}{7}\\
\coolNewBar{Barre 21}{8}{10}\\
\coolNewBar{Barre 22}{11}{16}\\

\coolNewLink[2]{18}{20}
\coolNewLink[1]{20}{21}
\coolNewLink[2]{6}{8}
\coolNewLink[1]{7}{8}

\definecolor{actual}{RGB}{0,188,208}
\coolNewGroup{Grouope 6}{1}{13}\\
    \coolNewBar{Barre 23}{1}{7}\\
    \coolNewBar{Barre 24}{8}{13}\\

\coolNewLink[1]{22}{23}

\end{coolGantChart}

Slides

Contrairement aux autres articles sur le LaTeX qui utilisent pandoc et permettent donc de mélanger le LaTeX et le Markdown, nous utiliserons ici latexmk pour compiler le document.

slides.tex :

%\documentclass[handout, 11pt,a4paper,final,aspect ratio=169]{beamer}   % This one is for printing
\documentclass[11pt,a4paper,final,aspect ratio=169]{beamer}             % This one is for presenting (with \pause)

% See the following links to choose a theme and color
% http://mcclinews.free.fr/latex/beamergalerie/completsgalerie.html
% https://deic.uab.cat/~iblanes/beamer_gallery/index_by_theme_and_color.html
\usetheme{metropolis}
%\usecolortheme{seagull}

% Prevent navigation buttons on the slide
\beamertemplatenavigationsymbolempty

% Make sure table of content are numbered
\setbeamertemplate{section in toc}[sections numbered]
\setbeamertemplate{subsection in toc}[subsections numbered]

\usepackage[utf8]{inputenc}
\usepackage[french]{babel}

\usepackage{enumitem}
\setlist[description]{style=nextline} % Specific for some types of lists
\setlist[itemize]{label=\textbullet}  % Specific for some types of lists

\newcommand\tab[1][4mm]{\hspace*{#1}}

% Add a slide when section changes
\AtBeginSection[]{
\begin{frame}
\sectionpage
\end{frame}
\addtocounter{framenumber}{-1}
}

% Add a slide when subsection changes
\AtBeginSubsection[]{
\begin{frame}
\subsectionpage
\end{frame}
\addtocounter{framenumber}{-1}
}

\title{titre}
\subtitle{sous titre}
\author{Moi}
\date{\today}

\begin{document}
\begin{frame}
\vspace*{0.05cm}
{\Large \bfseries Titre \\[0.2cm]}{\large Sous titre}\\
{\usebeamercolor[fg]{alerted text}{\rule{\linewidth}{0.2mm}\\[0.4cm]}}

\textbf{auteur}\\{\today}

\begin{figure}[h]
\centering
\includegraphics[width=0.2\textwidth]{img/logo1.png}%
\tab[8mm]
\includegraphics[width=0.2\textwidth]{img/logo2.png}%
\tab[8mm]
\includegraphics[width=0.2\textwidth]{img/logo3.png}%
\end{figure}
\end{frame}

\begin{frame}
\tableofcontents
\end{frame}


\section{Définitions}
\begin{frame}{\secname}
\begin{description}
\item[Mot]{Définition}
\item[Mot 2]{Définition 2}
\end{description}
\end{frame}

\section{Partie 1.}
\subsection{Partie 1.1}
\begin{frame}{\secname ~--\subsecname}
Such slide\pause
Such animation
\end{frame}

\subsection{Partie 1.2}
\begin{frame}{\secname ~--\subsecname}
Such new slide\pause
Such new animation
\end{frame}

%\input{otherfile.tex}

\end{document}

La compilation se fait avec la commande latexmk -pdf slides.tex

Flameshot

Par ce salop de Kuro

Vous devez faire une saloperie de tutoriel d'installation ? Vous êtes au bon endroit !!

Flameshot

Flameshot est un programme permettant de prendre des captures d'écran et d'y ajouter quelques précisions directement. Il a été utilisé conjointement à Notion et à un Makefile pandoc afin de réaliser des tutoriels d'installation de différents systèmes et, entre autre, de certains tutos de ce wiki.

Site de flameshot

Installation

Pour installer flameshot, référez-vous au site de flameshot ou, sur Archlinux, utilisez simplement la commande pacman -S flameshot.

Utilisation

Pour utiliser flameshot, il vous faudra d'abord le lancer afin qu'il soit disponible en arrière plan. Vous pourrez ensuite utiliser la commande flameshot gui pour voir apparaître les propositions pour faire le screenshot. Vous pourrez alors ajouter des fioritures sur l'image résultante afin d'expliciter ce que vous souhaitez expliquer dans l'image en question. Vous pouvez alors enregistrer sous le screenshot modifié ou bien tout simplement utiliser ctrl + c pour le copier et pouvoir ensuite le coller, par exemple sur Notion.

Quelques unes des fioritures

Pensez à configurer les raccourcis de flameshot afin de simplifier l'accès à ces fioritures.

Sous Windows

Flameshot remplace automatiquement la touche Imp. écran lorsqu'il est lancé. Pour lancer flameshot au démarrage faire Win + R puis taper shell:startup et enfin glisser un raccourci vers flameshot dans ce dossier. Les options de configuration sont disponibles en faisant un clic droit sur l'icône flameshot dans les tâches minimisées.

Un peu de scripting

Bien que flameshot soit un outil très pratique de base, quelques fonctionnalités manquaient afin de réellement industrialiser les screenshots. Nous avons donc fait le choix de faire un peu de bash pour les ajouter.

~/.local/bin/vmscreen

#!/bin/bash

function flameshot_save_result() {
    val=$(flameshot gui -g)
    echo $val | grep aborted || echo $val > /tmp/flameshot_vmscreen
}

[ $# -eq 0 ] && [ -e /tmp/flameshot_vmscreen ] && VMSCREEN_CONFIG=$(cat /tmp/flameshot_vmscreen)

flameshot_save_result &
if [ ! -z "$VMSCREEN_CONFIG" ] && [ "$VMSCREEN_CONFIG" != "screenshot aborted" ] ; then
    sleep 0.1
    xdotool mousemove --screen 0 $(cut -d' ' -f 3,4 <<< $VMSCREEN_CONFIG)
    xdotool mousedown 1
    xdotool mousemove_relative $(( $(cut -d' ' -f 1 <<< $VMSCREEN_CONFIG) - 1)) $(( $(cut -d' ' -f 2 <<< $VMSCREEN_CONFIG) - 1))
    xdotool mouseup 1
fi

.config/i3/config sous i3, une autre manière d'ajouter des raccourcis sinon

bindsym $mod+p --release exec "~/.local/bin/vmscreen"
bindsym $mod+Shift+p --release exec "~/.local/bin/vmscreen new"
bindsym Print --release exec "flameshot gui"

Avec ce script et ces raccourcis, vous pouvez soit utiliser votre touche Capture d'écran et accéder à la capture d'écran, soit utiliser $mod+p et $mod+Shift+p pour utiliser les scripts.

  • A la première utilisation, $mod+p semblera lancer flameshot normalement. Cependant, la position de la zone de l'écran capturée est sauvegardée et la prochaine utilisation de $mod+p sélectionnera directement la même zone de l'écran. Cela permet de sélectionner toujours la même zone d'un écran (par exemple l'emplacement d'une machine virtuelle sur l'écran) sans avoir à refaire la zone à chaque fois.
  • $mod+Shift+p permet de refaire une sélection de zéro qui sera enregistrée.

Attention !! Quitter la prise de screenshot avec échap gardera l'ancien paramétrage en mémoire et utiliser flameshot gui ou la touche Capture d'écran ne modifiera pas ce qui avait été enregistré.

Pare-feu et iptables

Par ce salop de FanfanlaTulipe

Nous aborderons ici le sujet des pare-feu, point cruciale dans la sécurité des serveurs et des réseaux.

Pare-feu

Un pare-feu permet de filtrer les flux réseaux sur une machine et de faire respecter la politique de sécurité du réseau. Nous distinguerons deux définitions du pare-feu :

  • Pare-feu matériel : il s'agit d'un matériel réseau dont le but est de filtrer les flux réseaux le traversant. On peut par exemple citer les pare-feu Fortinet ou Palo Alto.
  • Pare-feu logiciel : il s'agit d'une couche réseau qui va filtrer les flux réseaux déstinés à ou transitant par la machine. Là, on peut citer Windows Defender (pare-feu de Microsoft), iptables (pare-feu Linux) ou pf (pare-feu BDS).

La suite de ce guide parle des pare-feu logiciels. Nous désignemerons par "pare-feu" les pare-feu logiciels.

Le filtrage se fait selon plusieurs critères, par exemple :

  • La source et la destination d'un paquet (IP, port, interface réseau)
  • Les données transportées (taille, correspondance avec un motif)

On distingue deux types de pare-feu :

  • Sans état (Stateless): un pare-feu sans état ne va pas faire la distinction entre un nouveau paquet et un paquet présent suite à une connexion. Par exemple, dans le cas d'un pare-feu sans état sur un serveur web, il faut autoriser les flux entrants à destination du port 80 ET les flux sortants à l'origine du port 80.
  • A état (stateful): à l'inverse, un pare-feu avec état va pouvoir déterminer si un paquet est neuf ou s'il provient d'une connexion déjà établie. Dans notre exemple, il suffit d'autoriser les flux entrants à destination du port 80 et le pare-feu autorisera les paquets en réponse à la requète à sortir.

Les pare-feu sans état sont donc bien plus stricts et permettent un meilleur contrôle des flux, mais sont plus compliqués à maintenir et la probabilité de faire des erreurs est plus grande. A l'inverse, les pare-feu à état sont plus simples d'utilisation et plus adaptés aux protocoles dit 'connectés' comme TCP.

Iptables

Wiki Arch Linux
Wiki sur les pare-feu à état et exemple de configuration
Guide concernant les pare-feu de l'ANSSI

iptables est un outil en ligne de commande pour configurer le pare-feu du noyau Linux (le terme "iptables" est aussi utilisé pour désigner ce pare-feu). Ce pare-feu est configurable directement avec iptables ou avec des outils graphiques (nous y reviendrons plus bas).

Il faut noter qu'iptables est utilisé pour la pile IPv4, et ip6tables pour la pile IPv6.

ATTENTION, si vous travaillez sur une machine distante, faire une erreur lors de la configuration du pare-feu peut couper votre connexion et rendre la machine injoignable !

Par défaut, iptables est un pare-feu sans état. Il est cependant possible de le transformer en pare-feu à état avec le module noyau conntrack. Nous utiliserons conntrack pour la suite de ce guide. De plus, il est important de savoir qu'iptables fonctionne selon le principe du first-match. Cela signifie que la première règle qui correspond au paquet sera la règle appliquée.

Rendre iptables stateful

On accepte tous les paquets provenant de connexions déjà établies :

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Il est donc nécessaire d'appliquer ses règles en premier, pour appliquer la règle du first-match.

Ne pas couper la connexion actuel dans le cas d'une machine distante

iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Règles par défaut

Sous Linux, il est conseillé de mettre par défaut les règles suivantes :

  • DROP sur le traffic entrant (INPUT)
  • DROP sur le traffic transité (FORWARD)
  • ACCEPT sur le traffic sortant (OUTPUT)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Dans la logique du first-match, ces règles doivent être appliqué en dernières.

Règles persistentes

Les règles iptables ne survivent pas à un redémarrage. Il est donc nécessaire de faire quelques manipulations pour leurs permettre d'être persistentes. Nous utiliserons 2 binaires :

  • iptables-save pour sauvegarder les règles iptables.
  • iptables-restore pour rétablir les règles iptalbes.

Pour sauvegarder les règles actuellement en place :

sudo iptables-save -f /etc/iptables/iptables.rules

De plus il faut un service qui se lancera un démarrage pour rétablir les règles :

sudo vim /usr/lib/systemd/system/iptables.service
[Unit]
Description=IPv4 Packet Filtering Framework
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/iptables-restore /etc/iptables/iptables.rules
ExecReload=/usr/sbin/iptables-restore /etc/iptables/iptables.rules
ExecStop=/usr/sbin/iptables -F
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Outils graphiques

Le tocage à la porte

Le port knocking (normalement je préfère les termes français mais là...) est une méthode pour mettre d'ouvrir un port sur un pare-feu normalement fermé. Le pare-feu va attendre des connexions à des endroits bien spécifiques, dans un ordre précis. L'intéret du port knocking est de rendre un service invisible à un scan de port.

Nous verrons ici comment l'implémenter avec iptables.

Je vous jure je vais le faire.

Source du wiki Arch Linux

Sécurité par l'obscurité

Le principe de la sécurité par l'obscurité repose sur la non-divulgation d'information pour assurer la sécurité d'une structure (dans le cas de la sécurité informatique). On peut par exemple citer le rot n dans la cryptographie.

La sécurité par l'obscurité est dangereuse car elle donne un faux sentiment de sécurité. En effet, si le secret est découvert, toutes les messages passés, présentes et futures sont vulnérables (dans le cas de la cryptographie).

La question est donc : "Est ce que le tocage à la porte est une sécurité par l'obscurité ?"

Le tocage à la porte ne remplace pas une authentification classique. Cela doit être une mesure complémentaire uniquement pour contrer les scans de port ou les attaques par force brute. Le tocage à la porte ne doit en aucun cas donner accès à des ressources sensibles sans une autre forme d'authentification. Enfin, pour répondre à la question, le tocage à la porte peut être vu comme une forme de mot de passe supplémentaire, mais qui est récupérable avec une attaque de l'homme du milieu (man-in-the-middle) par exemple.

SSH

Par ce salop de FanfanlaTulipe et corrigé par ce salop de fl0w5

Secure SHell est un protocole de communication sécurisé (couche 7) destiné à remplacer rlogin, telnet et rsh (des protocoles non sécurisés) fonctionnant sur le port 22 par défaut.

Le Secure SHell Daemon représente le serveur SSH sur lequel les clients se connectent.

Vu la simplicité du système, nous n'expliquerons pas ici le fonctionnement du démon, nous n'aborderons que son installation et sa configuration. Nous utiliserons également l'implémentation OpenSSH (maintenu par OpenBSD).

Installation

Notre exemple d'installation sera fait sur une machine Debian.

apt install openssh-server -y
systemctl enable ssh
systemctl start ssh

systemctl status ssh    # On vérifie que le démon tourne

Génération des clés

Basé sur les recommandations de l'ANSSI

SSH utilise un système de clé asymétrique pour l'authentification. Il faut noter que dans la pratique, on renouvelle assez peu les clés, il faut donc les faire robustes.

  • La taille minimale d'une clé RSA est 2048 bits.
  • La taille minimale d'une clé ECDSA est de 256 bits.
  • DSA ne doit pas être utilisé.

Pour générer un biclé, entrez une des deux commandes suivantes, en fonction de votre implémentation favorite :

ssh-keygen -t rsa -b 2048 <fichier de clé RSA>      # RSA
ssh-keygen -t ecdsa -b 256 <fichier de clé ECDSA>   # ESDSA

Ces fichiers sont à utiliser comme clé d'identification hôte (attribut HostKey dans sshd) ou utilisateur (IdentifyFile dans ssh).

ECDSA doit être préféré à RSA si les clients et les serveurs le supportent.

Gestion des clés

Une clé privée d'authentification utilisateur ne doit être lisible que de ce dernier et protégée par un mot de passe. Ce chiffrement permet de laisser suffisamment de temps aux équipes d'administration pour révoquer le biclé.

Une clé privée d'authentification hôte ne doit être lisible que par le service sshd, soit l'utilisateur root :

-rw------- root:root /etc/ssh/ssh_host_rsa_key
-rw------- root:root /etc/ssh/ssh_host_ecdsa_key

Le répertoire ~/.ssh/ et son contenu doivent être protégés.

Afin de vérifier les modes et le propriétaire des fichiers de l'utilisateur avant la connextion :

StrictModes yes     # Normalement activé de base

Choix des algorithmes symétriques

Le canal de comminication entre le client et le serveur est chiffré avec un algorithme symétrique. Dans /etc/ssh/sshd_config :

Ciphers aes256-ctr,aes192-ctr,aes128-ctr

# OpenSSH > 6.3
MACs    hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

# Anciennes versions
MACs    hmac-sha2-512,hmac-sha2-265,hmac-sha1

Authentification

L'authentification d'un utilisateur doit se faire avec l'une des implémentations suivantes, dans l'ordre de préférence :

  • ECDSA
  • RSA
  • tickets Kerberos
  • PAM
  • mot de passe vis-à-vis d'une base de données

Il faut savoir que le fichier authorized_keys, qui stocke normalement les clés publiques des utilisateurs déjà authentifiés, permet de configurer les accès d'un serveur.

# La clé n'autorise l'accès que si le client provient du réseau 192.168.1.0/24.
from="192.168.1.*" ssh-ecdsa AAAA...

# La clé autorise l'accès pour un client venant du domaine *.salo.pe sauf pour *.belle.salo.pe
from="!*.belle.salo.pe, *.salo.pe" ssh-rsa AAAA...

# Bloque l'usage de l'agent forwarding pour cette clé
no-agent-forwarding ssh-ecdsa AAAA...

Imputabilité

L'imputabilité des accès est nécessaire pour la traçabilité. Autrement dit, chaque utilisateur doit avoir son propre compte. De plus, le compte root ne doit pas être accessible :

PermitRootLogin no

Configuration sécurisée

/etc/ssh/ssh_config est le fichier de configuration du client.

# Il faut s'assurer de l'authenticité du serveur.
StrictHostKeyChecking ask

/etc/ssh/sshd_config est le fichier de configuration du serveur OpenSSH.

# SSH existe en 2 versions, SSHv1 et SSHv2. SSHv1 présentant des problèmes de sécurité,
# nous forcerons l'utilisation du protocol v2.
Protocol 2

# Si le serveur SSH est exposé à un réseau non maitrisé, il est recommandé de lui
# mettre un port d'écoute différent de celui par défaut (22). Il est conseillé
# d'utiliser un port inférieur à 1024 afin d'empêcher les tentatives d'usurpation
# par des services non administrateurs.
# Ici, le port 969 par exemple :
Port 2222

# Sur un réseau maitrisé, sshd doit écouter uniquement sur une interface
# du réseau d'administration, distincte de l'opérationnelle
# Ici, le serveur écoute sur l'adresse 192.168.254.3 sur le port 22.
ListenAddress 192.168.254.3:22

# Active la séparation des privilèges en créant un fils non privilégié
# pour prendre en charge le trafic réseau entrant pour éviter une escalade de privilège.
# Par défaut à yes
UsePrivilegeSeparation sandbox

# On proscrit l'accès sans mot de passe
PermitEmptyPasswords no

MaxAuthTries 3 # doit être strictement supérieur à 1

# Interdire la connexion en temps que root
PermitRootLogin no

# Affiche les informations de la dernière connexion
PrintLastLog yes

# AllowUsers permet de spécifier la liste des utilisateurs autorisés
# Ici, l'acces à fanfanlatulipe est restreint aux adresses IPs du réseau 192.168.254.0/24
# et bobotlebrocolis à 192.168.1.0/24
AllowUsers fanfanlatulipe@192.168.254/24 bobotlebrocolis@192.168.1/24

# AllowGroups permet de spécifier la liste des groupes autorisés
AllowGroups wheel@192.168.254/24 flore

# Bloquer la modification des variables d'environnement;
# Les variables d'environnement peuvent modifier le fonctionnement attendu de programme.
# La directive AcceptEnv permet d'autoriser la modification d'une variable.
# !!! Je n'ai pas trouvé de documentation sur cette directive !!!
PermitUserEnvironment no

# Permet d'éxecuter une commande à la connexion.
# Cela remplace la connexion.
# ForceCommand <command>
# Par exemple, une connexion à l'utilisateur reboot relancera la machine :
Match User reboot
    ForceCommand reboot

# Désactivation de la redirection de flux
AllowTcpForwarding no
X11Forwarding no
ForwardX11Trusted no

##### Commandes expliqués plus haut #####

StrictModes yes

Ciphers aes256-ctr,aes192-ctr,aes128-ctr
# OpenSSH > 6.3
MACs    hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# Anciennes versions
MACs    hmac-sha2-512,hmac-sha2-265,hmac-sha1

Utilisation des clés pour un host

Il est possible d'automatiser l'utilisation d'une clé ssh grâce à une fichier config situé dans "~/.ssh".

Pour faire cela utilisez les lignes de config suivantes:

Host [DOMAIN]
 HostName [DOMAIN]
 IdentityFile [PATH_TO_SSH_KEY]

L'exemple d'utilisation le plus fréquent est un serveur distant dont l'adresse ne change pas comme par exemple un répo Git.

P.S. : Afin d'utiliser une clé SSH à la place de la paire username/password pour les répo git un changement dans l'adresse de remote est nécessaire ("https://github.com/[repo]" à "git@github.com:[repo]")

Références

ANSSI :

IETF :

Divers :

Bastion d'administration

Définition

Un bastion d'administration ou plus simplement bastion est un équipement de rebond qui remplit plusieurs fonctions de sécurité (authentification, traçabilité, renouvellement des secrets). Cependant, le bastion constitue une ressource d'information critique car il contient des secrets d'authentification critique et les journaux liés aux actions d'administriation. Il est donc nécessaire qu'un bastion ne soit pas exposé sur un SI de faible niveau de confiance.

Enfin, un bastion ne doit être déployé que si la présence d'un équipement de rebond est jugé pertinente et si le niveau de confiance de l'équipement est satisfaisant.

Comme mentionné dans les recommandations de l'ANSSI sur la protection des systèmes d'information essentiels et sur l'administration sécurisée des systèmes d'information:
La solution qui consiste à déployer un bastion comme moyen d’interconnexion depuis un poste d’un SI bureautique vers un SI d’administration est à proscrire. Elle procure un sentiment de sécurité injustifié puisqu’en réalité le bastion, porte d’entrée unique vers le SI d’administration, constitue une opportunité d’attaque importante, par exemple depuis un poste bureautique compromis depuis Internet. Source ANSSI

Rupture protocolaire

Les actions d'administration necessitent des besoins forts en traçabilité et en confidentialité.

Il peut donc être souhaitable de mettre en place une rupture protocolaire pour assurer la traçabilité des connexions, un certain nombre de filtrage ou pour compenser la faiblesse de sécurité des protocoles d'administration.

Il est important de noter qu'avec une rupture protocolaire, la session sécurisée peut être rompu. C'est pour cela qu'il est préférable de renoncer à la rupture protocolaire pour des besoins de confidentialité.

Utilisation

Il existe deux implémentations du bastion ssh :

  • ForwardAgent
  • ProxyJump

Dû aux problèmes de sécurité qu'implique l'implémentation ForwardAgent, nous n'aborderons que ProxyJump dans ce guide.

La transmission de l’agent doit être activée avec prudence. Les utilisateurs ayant la possibilité de contourner les autorisations sur l’hôte distant (pour la chaussette UNIX de l’agent) peuvent accéder à l’agent local via la connexion transférée. Un attaquant ne peut pas obtenir de clé de l’agent, mais il peut effectuer des opérations sur les clés qui lui permettent de s’authentifier en utilisant les identités chargées dans l’agent. (source du manuel)

ProxyJump dynamique

Nous allons nous connecter à host2 en passant par host1, sans rupture protocolaire.

ssh -J host1 host2

Il est également possible de le faire avec des utilisateurs définis :

ssh -J user1@host1 user2@host2

ProxyJump statique

Il est possible de configurer dans .ssh/config :

# On renseigne le bastion
Host bastion
  HostName host1

Host server
  HostName host2
  ProxyJump bastion
ssh server

Référenciels

ANSSI :

DNS

Par ce salop de FanfanlaTulipe

Un DNS (Domain Name System) est un système hiérarchique et décentralisé, utilisé pour identifier les différentes machines d'un réseau avec des noms, et non des adresses IP.

Plusieurs services de DNS existent :

  • Bind9
  • nsd
  • Knot
  • powerDNS

Les exemples suivants ont été fait avec un bind9.

Start Of Authority

salo.pe.     IN      SOA    ns.salo.pe. root.salo.pe. (
                            25112101    ; serial
                            3600        ; refresh
                            900         ; retry
                            3600        ; expire
                            200         ; minimum
)

La SOA est l'information la plus importante d'un enregistrement DNS. Il va permettre de donner plusieurs informations aux autres DNS :

  • Le nom de la zone (salo.pe)
  • La classe de réseau (IN)
  • Le type d'enregistrement (SOA)
  • Le master name (ns.salo.pe)
  • L'adresse mail du responsable (root.salo.pe)
  • Le serial, il doit être incrémenté à chaque changement. Communément, il s'agit du jour, mois et année et une version (ddmmyyvv par exemple).
  • Le refresh, définit le temps d'attente entre chaque demande du fichier pour les autres DNS.
  • Le retry, définit le temps d'attente d'une nouvelle demande si le fichier n'est pas disponible.
  • Le expire, définit combien de temps le fichier de zone est valide.
  • Le minimum, définit le time to live dans le cache d'un client

Name Server

salo.pe     IN      NS      ns.salo.pe

Le Name Server (NS) indique quel DNS fait autorité pour ce domaine.

A

salo.pe     IN      A       <IPv4>

Les enregistrements de type A définissent les enregistrements pour les IPv4.

AAAA

salo.pe     IN      AAAA    <IPv6>

Les enregistrements de type AAAA définissent les enregistrements pour les IPv6.

Text

acme        IN      TXT     "Hello There"

Les enregistrements de type text (TXT) permettent d'entrer un texte pour un DNS. Ce type est utilisé par exemple par certbot et letsencrypt pour délivrer des certificats.

Mail eXchanger

salo.pe     IN      MX      1 mail.salo.pe

Les enregistrements MX permettent de spécifier un serveur de mail pour le domaine.

Canonical NAME

magnifique.salo.pe  IN  CNAME   belle.salo.pe

Les enregistrements CNAME permettent de donner des alias à des noms de domaines.

$TTL

$TTL 5m

Le $TTL définit combien de temps les clients DNS garde en cache l'enregistrement.

Exemple

$TTL 5m

salo.pe.    IN      SOA     ns.salo.pe. root.salo.pe. (
                            25112103
                            3600
                            900
                            3600
                            200
)

            IN      NS      ns.salo.pe
            IN      A       <IPv4>

ns          IN      A       <IPv4>
mail        IN      A       <IPv4>
belle       IN      A       <IPv4>
belle       IN      AAAA    <IPv6>
magnifique  IN      CNAME   belle.salo.pe

acme        IN      TXT     "Some text"

salo.pe     IN      MX      mail.salo.pe

bind9

bind9 est un service linux offrant un serveur DNS.

CVE details - bind9

Plusieurs fichiers sont intéressants concernant le service bind9 :

  • named.conf et ses dérivés (named.conf.local et named.conf.options)
  • le fichier de zone, ici salo.pe.zone

named

Dans /etc/bind/, on trouve named.conf et ses dérivés. named.conf ne nous intéressera pas ici, ce dernier inclut les autres fichiers (et on fait les choses proprement).

named.conf.local

Ce fichier va permettre à bind9 de trouver les fichiers de zone.

zone "salo.pe." {
    type master;
    file "/var/lib/bind/salo.pe.zone";
    notify no;
};
  • type : défini le type de zone. Les types de zone disponibles sont les suivants :
    • master: désigne le serveur faisant autorité pour cette zone.
    • slave: désigne le serveur de noms comme serveur esclave de cette zone.
    • forward: retransmet toutes les requêtes à propos de cette zone vers d'autres serveurs de noms.
  • file: le chemin du fichier de zone
  • notify: définit si les serveurs esclaves sont notifiés d'un changement de configuration.
    • yes
    • no
    • explicit: notifie seulement les serveurs esclaves spécifiés dans une liste also-notify.
  • allow-transfer: spécifie les serveurs autorisés à recevoir un transfert de zone depuis ce serveur.
  • also-notify: spécifie les serveurs à notifier lors d'un changement de configuration.

Il existe d'autres options, voir la référence ci-dessous.

Pour plus d'information sur la configuration de zone, voir ici.

Enfin, voir ici pour un exemple de la documentation.

named.conf.options

Ce fichier permet de spécifier des options à bind9.

options {
    directory "/var/cache/bind";

    allow-recusion { any; };
};
  • directory : défini le cache de bind9.
  • allow-recursion: spécifie les serveurs autorisés à faire des requêtes récursives sur ce serveur.

Pour voir toutes les options disponibles, voir ici.

Fichier de zone

Le fichier de zone définit les enregistrements DNS, expliqués plus haut.

Commandes utiles

named-checkconf named.conf

named-checkzone <nom du domaine> <chemin du fichier de zone>

Références

ANSSI - Bonnes pratiques pour l'acquisition et l'exploitation de noms de domaine

DNSSEC

DNS Secuity Extensions (DNSSEC) est une spécification qui sert à garantir l'intégrité des données transmises par le DNS. DNSSEC va donc signer les enregistrements DNS d'une zone.

Tout d'abord, pour activer l'utilisation de DNSSEC dans notre bind9, il faut aller dans /etc/bind/named.conf.options et ajouter les lignes suivantes dans l'options { }:

dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

On va ensuite créer un biclé pour signer la zone (ZSK pour Zone Signing Key) :

dnssec-keygen -a ECDSAP256SHA256 -b 2048 -n ZONE salo.pe

La commande va créer un biclé :

Generating key pair.
Ksalo.pe.+001+01010

On va également créer un biclé pour signer notre clé précédente (KSK pour Key Signing Key) :

dnssec-keygen -f KSK -a ECDSAP256SHA256 -b 2048 -n ZONE salo.pe
Generating key pair.
Ksalo.pe.+002+02020

On va maintenant créer 4 clés publiques / privées. Il faut maintenant ajouter les clés publiques (qui contiennent des enregistrements DNSKEY) à notre fichier de zone :

for key in $(ls Ksalo.pe*.key); do
    echo "\$INCLUDE $key" >> salo.pe.zone
done

Il faut maintenant signer le fichier de zone avec :

dnssec-signzone -3 $(head -c 1024 /dev/urandom | sha1sum | cut -b 1-16) -N INCREMENT -o salo.pe -t salo.pe.zone
Verifying the zone using the following algorithms:
- ECDSAP256SHA256
Zone fully signed:
Algorithm: ECDSAP256SHA256: KSKs: x active, x stand-by, x revoked
                            ZSKs: x active, x stand-by, x revoked
                            salo.pe.zone.signed
                            Signatures generated:                       xx
                            Signatures retained:                         x
                            Signatures dropped:                          x
                            Signatures successfully verified:            x
                            Signatures unsuccessfully verified:          x
                            Signing time in seconds:                 x.xxx
                            Signatures per second:                 xxx.xxx
                            Runtime in seconds:                      x.xxx

La commande a généré un fichier signé, nommé dans notre cas salo.pe.zone.signed. Ce dernier contient maintenant les enregistrements RRSIG. Il ne reste plus qu'à dire à bind9 que le fichier de zone a changé (dans /etc/bind/named.conf.local) :

zone "salo.pe." {
    type master;
    file "/var/lib/bind/salo.pe.zone.signed";
    notify no;
};

On va recharger bind9 :

service bind9 reload

Et on va tester notre enregistrement DNSKEY :

dig DNSKEY salo.pe. @locahost
; <<>> DiG 9.16.23 <<>> DNSKEY salo.pe @pi
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6915
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (good)
;; QUESTION SECTION:
;salo.pe.           IN  DNSKEY

;; ANSWER SECTION:
salo.pe.        300 IN  DNSKEY  257 3 14 N2IdneSgXq9qtbI7tkbdJn1eNpMrCp1ahWQkXllcshQMoR5n38bdVigy BIpkQE2urSvAsh3sDLziREvlbVbTD+tjqadvIzjAFJd+/R4xd7EqPNiK XMONjcjsf5Eld5S8
salo.pe.        300 IN  DNSKEY  256 3 14 WEW+NXfKvEoYHknb3AV5FitgFUzhaf6ztPIMCyvFhhrjkrwANfFIThcw 8LXbLqghVkhJhoTdp7cMHbn2VoIbcoo2nypNH2xIYojlpcG8IDR4+FfL 912Qpemm5hhYqid1

;; Query time: xx msec
;; SERVER: xxx.xxx.xxx.xxx#xxx(xxx.xxx.xxx.xxx)
;; WHEN: Sat Nov 27 08:04:06 CET 2021
;; MSG SIZE  rcvd: xxx

On va également tester la présence de l'enregistrement RRSIG :

dig A wiki.salo.pe @localhost +dnssec
; <<>> DiG 9.16.23 <<>> A wiki.salo.pe @pi +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24670
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (good)
;; QUESTION SECTION:
;wiki.salo.pe.          IN  A

;; ANSWER SECTION:
wiki.salo.pe.       300 IN  A   xxx.xxx.xxx.xxx
wiki.salo.pe.       300 IN  RRSIG   A 14 3 300 20211227055627 20211127055627 64607 salo.pe. q3oc64GzeiDmN1qIoRSa64fb/UxGdDAO7gYIP34JUEfluchSYcU3yml1 W2aHznpkQRggy2es/whFljsOq84Q2p60KmO6tmbPBB/ptSpEN0jnlSTt FTxsJWD5Bdkcf9Lo

;; Query time: xx msec
;; SERVER: xxx.xxx.xxx.xxx#xxx(xxx.xxx.xxx.xxx)
;; WHEN: Sat Nov 27 08:04:47 CET 2021
;; MSG SIZE  rcvd: xxx

Voici un script pour générer le fichier de zone signé (ici dans Ansible) :

#!/bin/sh

DIR="<chemin vers un dossier>"
REGEX_ALL_KEYS="<regex pour les clés>"              # avec l'exemple, Ksalo.pe*
REGEX_PUBLIC_KEYS="<regex pour les clés publiques>" # Ksalo.pe.*.key
ZONE_FILE="<fichier de zone>"                       # salo.pe.zone
SIGNED_ZONE_FILE="<fichier de zone signé>"          # salo.pe.zone.signed
DOMAIN="<domaine>"                                  # salo.pe

# On va utiliser notre fichier de zone (salo.pe.zone) et en faire un
# fichier de base, qui sera copié à chaque execution.
# cp salo.pe.zone salo.pe.zone.base
BASE_ZONE_FILE="<fichier de zone d'origine>"

rm $DIR/$REGEX_ALL_KEYS $DIR/$ZONE_FILE $DIR/$SIGNED_ZONE_FILE

set -e

dnssec-keygen -K $DIR -a ECDSAP256SHA256 -b 2048 -n ZONE $DOMAIN
dnssec-keygen -K $DIR -f KSK -a ECDSAP256SHA256 -b 2048 -n ZONE $DOMAIN

cp "$DIR/$BASE_ZONE_FILE" "$DIR/$ZONE_FILE"

for key in $(ls $DIR/$REGEX_PUBLIC_KEYS); do
    echo "\$INCLUDE $key" >> "$DIR/$ZONE_FILE"
done

dnssec-signzone -A -3 $(head -c 2048 /dev/urandom | sha1sum | cut -b 1-16) -K $DIR -N INCREMENT -o $DOMAIN -t $DIR/$ZONE_FILE

Sommaire

Par ces salops de Kuro et FanfanlaTulipe

Bienvenue sur ce guide abordant plusieurs sujets concernant la meilleure distribution Linux de cette planête, Arch Linux.

Vous trouverez ci-dessous tous les sujets abordés dans ces guides. Ils peuvent concernés des thèmes spécifiques à Arch Linux ou bien des thèmes plus généraux, applicable à Linux.

Sommaire

Par ces salops de Kuro et FanfanlaTulipe

Bienvenue sur ce guide abordant plusieurs sujets concernant la meilleure distribution Linux de cette planête, Arch Linux.

Vous trouverez ci-dessous tous les sujets abordés dans ces guides. Ils peuvent concernés des thèmes spécifiques à Arch Linux ou bien des thèmes plus généraux, applicable à Linux.

Prérequis

Par ces salops de Kuro et FanfanlaTulipe

Ce wiki se base sur les tutoriels suivants :

Il est préférable d'avoir installer Windows 10 (où l'installer) et de sauvergarder toutes les données importantes présents sur l'ordinateur en cas d'échec.

Ce guide ne sera pas responsable de quelconques saloperies que vous pourriez faire !

Télécharger l'ISO d'Arch Linux et créer une clé d'installation avec Rufus par exemple.

Vérifier que le SecureBoot est désactivé dans le BIOS.

Désactiver le démarrage rapide dans les paramètres Windows.

Windows

Général

Assurez-vous d'avoir de la place sur votre disque pour l'installation d'Arch Linux avec l'utilitaire de partition Windows. Il est conseillé de laisser au moins 50Go à Windows pour qu'il fonctionne correctement, mais laissez-en plus si vous comptez l'utiliser dans de bonnes conditions.

Avec la commande regedit, ajouter au registre une valeur DWORD dans le registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal :

  • nouvelle valeur DWORD
  • affecter la valeur 1

Enfin, télécharger et installer VeraCrypt.

Veracrypt

  • Système > Chiffrer le disque/les partitions systemes
  • Sélectionner Normal.
  • Sélectionner Chiffrer les partitions système Windows.
  • Sélectionner Single boot.
  • Sélectionner l'algorithme de chiffrement que vous souhaitez.
  • Choisir un mot de passe robuste.
  • Retenir le mot de passe robuste.
  • Bouger la souris ou taper au clavier pendant la génération des clés de chiffrement.
  • Lancer le test de chiffrement.
  • Une fois le système redémarré, valider le chiffrement total du système.

Arch Linux

Brancher la clé d'installation créée plus haut et démarrer l'ordi sur cette clé. Quand Arch Linux a démarré, choisir Boot Arch Linux.

Pour mettre le clavier en AZERTY :

loadkeys fr-latin1

Se connecter à Internet si ce n'est pas le cas :

iwctl

station <wlan device name> connect <wifi-station-name>

Pour vérifier que l'ordinateur soit bien connecté à Internet : ping google.com.

On va également ajouter dm_crypt dans les modules kernel explicitement :

modprobe dm_crypt

On va mettre l'ordinateur à l'heure :

timedatectl set-ntp true

Si vous souhaitez procéder à l'installation depuis une autre machine :

  • Sur la machine cible :
passwd

systemctl start sshd # n'est pas forcément nécessaire

ip a # Pour voir l'IP
  • Sur votre machine :
ssh root@<IP>

Prérequis

Par ces salops de Kuro et FanfanlaTulipe

Ce wiki se base sur les tutoriels suivants :

Il est préférable d'avoir installer Windows 10 (où l'installer) et de sauvergarder toutes les données importantes présents sur l'ordinateur en cas d'échec.

Ce guide ne sera pas responsable de quelconques saloperies que vous pourriez faire !

Télécharger l'ISO d'Arch Linux et créer une clé d'installation avec Rufus par exemple.

Vérifier que le SecureBoot est désactivé dans le BIOS.

Désactiver le démarrage rapide dans les paramètres Windows.

Windows

Général

Assurez-vous d'avoir de la place sur votre disque pour l'installation d'Arch Linux avec l'utilitaire de partition Windows. Il est conseillé de laisser au moins 50Go à Windows pour qu'il fonctionne correctement, mais laissez-en plus si vous comptez l'utiliser dans de bonnes conditions.

Avec la commande regedit, ajouter au registre une valeur DWORD dans le registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal :

  • nouvelle valeur DWORD
  • affecter la valeur 1

Enfin, télécharger et installer VeraCrypt.

Veracrypt

  • Système > Chiffrer le disque/les partitions systemes
  • Sélectionner Normal.
  • Sélectionner Chiffrer les partitions système Windows.
  • Sélectionner Single boot.
  • Sélectionner l'algorithme de chiffrement que vous souhaitez.
  • Choisir un mot de passe robuste.
  • Retenir le mot de passe robuste.
  • Bouger la souris ou taper au clavier pendant la génération des clés de chiffrement.
  • Lancer le test de chiffrement.
  • Une fois le système redémarré, valider le chiffrement total du système.

Arch Linux

Brancher la clé d'installation créée plus haut et démarrer l'ordi sur cette clé. Quand Arch Linux a démarré, choisir Boot Arch Linux.

Pour mettre le clavier en AZERTY :

loadkeys fr-latin1

Se connecter à Internet si ce n'est pas le cas :

iwctl

station <wlan device name> connect <wifi-station-name>

Pour vérifier que l'ordinateur soit bien connecté à Internet : ping google.com.

On va également ajouter dm_crypt dans les modules kernel explicitement :

modprobe dm_crypt

On va mettre l'ordinateur à l'heure :

timedatectl set-ntp true

Si vous souhaitez procéder à l'installation depuis une autre machine :

  • Sur la machine cible :
passwd

systemctl start sshd # n'est pas forcément nécessaire

ip a # Pour voir l'IP
  • Sur votre machine :
ssh root@<IP>

Partitions des disques

Nous utiliserons cfdisk pour gérer les partitions des disques. Nous partitionnerons un ssd classique, /dev/nvme0n1.

fdisk -l # Pour voir la liste des partitions disponibles

cfdisk /dev/nvme0n1

Nous allons donc créer 3 partitions :

Nom de la partitionPoint de montagePartitionTaille suggérée
boot/boot/dev/nvme0n1p5512 Mo
root//dev/nvme0n1p6>= 50 Go
home/home/dev/nvme0n1p7Le reste

La partition de swap sera virtuel.

Nous utiliserons la partition EFI de Windows. Vous pouvez la localiser avec un fdisk -l.

Dans le cas d'une disposition BIOS ou MBR :

Nom de la partitionPoint de montageTaille suggérée
[SWAP]-Au moins la taille de votre RAM
root/Le reste

Création des partitions

Avant tout, nous allons executer fdisk -l pour connaitre le nombre de partition déjà présente sur le disque. Dans notre exemple, la commande sort :

Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: **************************
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: ********-****-****-****-************

Device             Start        End   Sectors   Size Type
/dev/nvme0n1p1      2048     206847    204800   100M EFI System
/dev/nvme0n1p2    206848     239615     32768    16M Microsoft reserved
/dev/nvme0n1p3    239616  101374679 101135064  48.2G Microsoft basic data
/dev/nvme0n1p4 101376000  102397951   1021952   499M Windows recovery environment

On a donc 4 partitions déjà présentes. Nous allons donc créer les partitions 5, 6 et 7.

Boot

  • Aller sur Free space.
  • Entrer dans [ New ].
  • Entrer la taille souhaitée, ici 512M.

Notre partition /dev/nvme0n1p5 est créée, de type Linux filesystem.

Root

Il est recommandé de laisser 50Go à cette partition.

  • Aller sur Free space.
  • Entrer dans [ New ].
  • Entrer la taille souhaitée, ici 50G.

Notre partition /dev/nvme0n1p6 est créée, de type Linux filesystem.

Home

  • Aller sur Free space.
  • Entrer dans [ New ].
  • Entrer la taille souhaitée, ici la taille restant du disque.

Notre partition /dev/nvme0n1p7 est créée, de type Linux filesystem.

Application des changements

Entrer [ Write ] pour écrire les changements puis [ Quit ].

Félicitations, vous avez partitionné votre disque. Il va maintenant falloir formater correctement les partitions.

Dans notre exemple, nous utilisons toujours /dev/nvme0n1 comme disque, nous avons en conséquence :

  • /dev/nvme0n1p5 pour la partition boot.
  • /dev/nvme0n1p6 pour la partition root.
  • /dev/nvme0n1p7 pour les données utilisateurs.

Afin de faciliter la suite de l'installation, nous définirons des variables :

export efi=/dev/nvme0n1p1
export boot=/dev/nvme0n1p5
export root=/dev/nvme0n1p6
export home=/dev/nvme0n1p7

Chiffrer les partitions

Dans le bonne pratique d'installation, il est recommandé de chiffrer ses partitions afin d'empêcher une personne de monter vos disques et de récupérer vos données.

Les commandes suivantes servent à écraser les données déjà existantes sur les partitions. Ces commandes sont donc optionnelles.

cryptsetup open --type plain -d /dev/urandom $root to_be_wiped # Ecraser la partition root
dd if=/dev/zero of=/dev/mapper/to_be_wiped status=progress
cryptsetup close to_be_wiped

cryptsetup open --type plain -d /dev/urandom $home to_be_wiped # Override home partition
dd if=/dev/zero of=/dev/mapper/to_be_wiped status=progress
cryptsetup close to_be_wiped

On va maintenant chiffrer la partition root avec un mot de passe et la partition home avec un fichier, ici 20ko de données aléatoire. On va également créer un volume swap de 24Go, ce n'est pas obligatoire.

cryptsetup -y luksFormat $root                  # chiffre root avec un mot de passe
dd if=/dev/urandom of=keyfile bs=1024 count=20  # génére un fichier de 20ko aleatoire
cryptsetup --key-file keyfile luksFormat $home  # chiffre home avec le fichier aleatoire

cryptsetup luksOpen $root crypt_root
cryptsetup --key-file keyfile luksOpen $home crypt_pool

lvm pvcreate /dev/mapper/crypt_pool
lvm vgcreate lvmpool /dev/mapper/crypt_pool
lvm lvcreate -L 24GB -n swap lvmpool            # la taille de la partition SWAP doit être supérieur ou égale à la taille de votre RAM pour pouvoir hiberner
lvm lvcreate -l 100%FREE -n home lvmpool

Formattage des partitions

Nous allons commencer par formatter les partitions.

Si vous avez du swap :

mkswap /dev/mapper/lvmpool-swap
swapon /dev/mapper/lvmpool-swap

Pour le boot et le filesystem :

mkfs.ext4 $boot
mkfs.ext4 /dev/mapper/crypt_root
mkfs.ext4 /dev/mapper/lvmpool-home

Bien joué, c'est formatté !

Monter les partitions filesystem

Une fois nos partitions créées et formattées, il faut monter les partitions filesystem pour travailler dedans.

mount /dev/mapper/crypt_root /mnt
mkdir /mnt/boot
mkdir /mnt/home
mount $boot /mnt/boot
mount /dev/mapper/lvmpool-home /mnt/home
mkdir /mnt/boot/efi
mount $efi /mnt/boot/efi

Les partitions sont maintenant montées et prêtes à l'emploi.

La base et le chroot

pacstrap

Pacstrap sert à installer les systemes nécessaires à la survie de cette magnifique distribution qu'est Arch Linux. La première commande ci-dessous est la commande avec les paquets minimums, vous pouvez cependant télécharger les paquets que vous souhaitez. Il est conseillé d'installer les paquets suivants :

  • base
  • linux ou un autre paquet noyau
  • linux-firmwareou un autre micrologiciel
  • un gestionnaire de réseau, ici networkmanager
  • un éditeur de texte, ici vim
# Nous aurons ici besoin des paquets suivants
pacstrap /mnt gimp base linux linux-firmware \ # Paquets nécessaires à arch linux
            grub \          # Nous reviendrons dessus plus tard
            efibootmgr \    # utile pour GRUB
            vim \
            sudo \          # Nous reviendrons dessus plus tard
            networkmanager \
            lvm2

Cela va installer tous les paquets de base (ça peut prendre quelques minutes).

Si pacstrap sort une erreur du type :

error: pam: signature from "John Doe <john@doe.com>" is unknown trust
:: File /mnt/var/cache/pacman/pkg/pam-1.5.2-1-x86_64.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
Do you want to delete it? [Y/n]

Lancer la commande suivante puis relancer la commande pacstrap :

pacman -Sy archlinux-keyring

Déchiffrement automatique

Copier le fichier de clé dans /mnt/root.

cp keyfile /mnt/root

Trouver la valeur de la partition home dans ls -l /dev/disk/by-uuid. Ici 4517ff0f-deab-4564-90ca-e4f4947b8ca3 :

total 0
lrwxrwxrwx 1 root root 10 Dec  4 10:37 3c07c1fb-8c95-4b86-b133-be0dbcf94e44 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Dec  4 09:57 4A6B-045F -> ../../sda1
lrwxrwxrwx 1 root root 10 Dec  4 10:37 8f885dc4-2292-48a0-a319-b9045a300d93 -> ../../dm-3
lrwxrwxrwx 1 root root 15 Dec  4 10:32 4517ff0f-deab-4564-90ca-e4f4947b8ca3 -> ../../nvme0n1p7
lrwxrwxrwx 1 root root 15 Dec  4 10:37 51565f90-9666-47fc-ba13-85c1bdb016eb -> ../../nvme0n1p5
lrwxrwxrwx 1 root root 15 Dec  4 09:57 C6B27122B27117DF -> ../../nvme0n1p4
lrwxrwxrwx 1 root root 15 Dec  4 09:57 D2A6-C16F -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Dec  4 09:57 FC5AA8015AA7B734 -> ../../nvme0n1p3
lrwxrwxrwx 1 root root 15 Dec  4 10:31 ad022385-b683-4e48-8e66-3cb027b67a9a -> ../../nvme0n1p6
lrwxrwxrwx 1 root root 10 Dec  4 10:35 bc05acd8-90a2-43e8-922a-df890c3a11ad -> ../../dm-2

Ajouter crypt_hdd UUID=xyz /root/keyfile luks dans /mnt/etc/crypttab avec xyz étant la valeur trouvée précédement :

crypt_hdd	UUID=4517ff0f-deab-4564-90ca-e4f4947b8ca3	/root/keyfile	luks

TRIM

TRIM va permettre d'augmenter la durée de vie d'un SSD si ce dernier est chiffré.

Si l'on se trouve sous ssd (ce qui est notre cas) :

  • on vérifie que notre SSD supporte l'usage de TRIM. Une valeur différente de zéro indique le support de TRIM :
lsblk --discard
  • dans /mnt/etc/crypttab, ajouter discard après luks :
crypt_hdd	UUID=4517ff0f-deab-4564-90ca-e4f4947b8ca3	/root/keyfile	luks	discards
  • dans /mnt/etc/lvm/lvm.conf, activer issue_discards. (S'il n'existe pas, copier /etc/lvm/lvm.conf d'abord)
  • systemctl enable fstrim.service et systemctl enable fstrim.timer.

Référence sur TRIM :

arch-chroot

On va ensuite générer notre table de fichiers (fstab) et lancer le système.

genfstab -U /mnt >> /mnt/etc/fstab

arch-chroot /mnt

Nous sommes maintenant dans notre systeme de fichier, en tant que root.

Time

ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime

hwclock --systohc

Langue

On va maintenant définir le locale, soit la langue de l'ordinateur.

vim /etc/locale.gen

Vous arrivez dans un gros fichier où toutes les lignes sont commentées. Trouvez la langue souhaitée et décommentez là.

en_US.UTF-8 UTF-8   # Pour l'anglais
fr_FR.UTF-8 UTF-8   # Pour le français
locale-gen

On peut également changer le keymap, c'est à dire la disposition du clavier au niveau du système. Ouvrir /etc/vconsole.conf :

# us par défaut
KEYMAP=fr   # pour mettre en français

Hostname & hostfile

echo "<hostname>" > /etc/hostname
vim /etc/hosts

Entrer la configuration suivante, remplacer pour le nom défini juste avant :

127.0.0.1       localhost
::1             localhost
127.0.1.1       <hostname>.localdomain  <hostname>

Initramfs et GRUB

Initramfs

initramfs est un schéma pour charger une image temporaire de systèmes de fichiers permettant le démarrage du noyau Linux.

Il faut mettre keyboard avant modconf et ajouter keymap encrypt lvm2 après block pour initramfs.

vim /etc/mkinitcpio.conf
HOOKS=(base udev autodetect keyboard modconf block keymap encrypt lvm2 filessytems fsck)
mkinitcpio -p linux

Référence : Wiki Arch Linux sur mkinitcpio

GRUB

GRUB est un boot loader qui vous nous permettre de choisir sur quel systeme on souhaite démarrer une machine. Nous l'avons téléchargé précédement.

Partition chiffrée

Nous allons commencer par trouver les UUID de la partition root et efi :

blkid
/dev/nvme0n1p1: UUID="C423-D675" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="b1070c21-2d6f-434f-80c3-37cdd3e5899b"
/dev/nvme0n1p4: BLOCK_SIZE="512" UUID="7C66315266310E80" TYPE="ntfs" PARTUUID="9ae311e5-026b-418b-be9b-4bfbabcf914d"
/dev/nvme0n1p5: UUID="546c759f-924d-4811-b853-84c328ca55f2" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="618fc4b6-6cf9-834d-82b0-978c6d4c6a8d"
/dev/nvme0n1p6: UUID="ad022385-b683-4e48-8e66-3cb027b67a9a" TYPE="crypto_LUKS" PARTUUID="af351b03-8486-e648-8358-8008f9b0b747"
/dev/nvme0n1p7: UUID="e473a1cb-95f7-4cfd-8770-9fcc07f0a52b" TYPE="crypto_LUKS" PARTUUID="3eaa5115-7707-d349-ab7b-c887854f8872"
/dev/sr0: UUID="731ac0004d532055" LABEL="CCCOMA_X64FRE_EN-US_DV9" BLOCK_SIZE="2048" TYPE="udf"
/dev/sda1: LABEL="ARCH_202104" UUID="4A6B-045F" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="001304a7-01"
/dev/loop0: TYPE="squashfs"
/dev/mapper/crypt_pool: UUID="B4xto1-7Fwb-layI-wWdY-yoxu-68CF-7WZYUt" TYPE="LVM2_member"
/dev/nvme0n1p3: PARTLABEL="Basic data partition" PARTUUID="2079ff68-8dc3-46f5-a18a-80077802e160"
/dev/nvme0n1p2: PARTLABEL="Microsoft reserved partition" PARTUUID="38cadc6a-a4d2-4b59-98ac-76fa03d0f95a"
/dev/mapper/lvmpool-home: UUID="50ec36ca-ab6a-42f9-aa33-6e17f181a8c9" BLOCK_SIZE="4096" TYPE="ext4"
/dev/mapper/crypt_root: UUID="85dfd718-6b00-4dd8-bd69-cf0ad366f28f" BLOCK_SIZE="4096" TYPE="ext4"

Ici, l'UUID de root est ad022385-b683-4e48-8e66-3cb027b67a9a et celui de efi est C423-D675.

Dans la configuration de grub (/etc/default/grub), nous allons modifier GRUB_CMDLINE_LINUX pour qu'il ait le format suivant :

GRUB_ONLINE_LINUX="cryptdevice=UUID=${ROOT_UUID}:crypt_root root=/dev/mapper/crypt_root"

Dans le cas où le SSD supporte TRIM (référence), mettre :

GRUB_ONLINE_LINUX="cryptdevice=UUID=${ROOT_UUID}:crypt_root:allow-discards root=/dev/mapper/crypt_root"

Windows 10

Dans /etc/grub.d/40_custom, Nous allons ajouter Windows 10 à GRUB. $FS_UUID est l'uuid de la partition efi :

#!/bin/sh

set -e

tail -n +3 $0

if [ "${grub_platform}" == "efi" ]; then
    menuentry "Windows 10" {
        insmod part_gpt
        insmod fat
        insmod search_fs_uuid

        search --fs-uuid --set=root $FS_UUID
        chainloader /EFI/VeraCrypt/DcsBoot.efi
    }
fi

On va maintenant générer GRUB :

grub-install --target=x86_64-efi --recheck
grub-mkconfig -o /boot/grub/grub.cfg

Secure Boot

Il est possible de changer les commandes executés par GRUB au démarrage d'une machine et ainsi boot avec root sans mot de passe (Référence).

Nous ne verrons ici que la sécurisation de la version 2 de GRUB, la version 1 étant relativement peu utilisée.

Nous allons voir comment protéger la modification des commandes GRUB, afin de protéger notre machine au démarrage mais de ne pas avoir à entrer un mot de passe tout le temps. Notre machine est déjà chiffrée, ça suffit.

N'utilisez pas l'instruction password, elle requiert un mot de passe en clair. Nous utiliserons plutot grub-mkpasswd-pbkdf2 pour le hasher.

grub-mkpasswd-pbkdf2

Dans /etc/grub.c/40_custom, ajouter à la fin :

# Password
set superusers="<nom de l'utilisateur>"
password_pbkdf2 <nom de l'utilisateur> <le hash généré par grub-mkpasswd-pbkdf2>

Cela donne par exemple :

# Password
set superusers="supersaloperie"
password_pbkdf2 supersaloperie grub.pbkdf2.sha512.10000.3527FF766CC755FA99FD7BD74F30A5DF3E4C6DE0F2C48C9F573C53DA75D03FAC09B7A82FDA0276802393BEDB0BAE8C3AC4F882D3E87BAAC6E82F9EB5C959D4B4.FAE05D6223B15D24FFED8AD0489C421271B119D7C4F6921DF8A429E0EFD312EF279E3A720453C8066D39183B70016702AFE9C23A37B6AB877D5CB3328084798E

superusers acceuille une liste d'utilisateurs, séparés par des espace, virgules, point-virgules ou pipes (|). Si la liste est vide, cela désactive l'accès à la CLI et à la modification des commandes.

Afin que des entrées puissent être utilisées sans mot de passe, il est possible de rajouter --unrestricted après un menuentry. De la même manière, on peut restreindre l'accès à une entrée à un utilisateur en particulier avec --users "<les utilisateurs>" :

set superusers="supersaloperie"
password_pbkdf2 supersaloperie grub.pbkdf2.sha512.10000.[...]
password saloperie insecure

menuentry "Runnable by anyone" --unrestricted {
    echo "Saloperie de Wiki"
    halt
}

menuentry "Only supersaloperie" --users "" {
    echo "Super Saloperie"
    halt
}

menuentry "supersaloperie et saloperie" --users saloperie {
    echo "Que les saloperies"
    reboot
}

Pensez donc à passer dans tous vos fichiers de configuration (/etc/grub.d/) et ajouter --unrestricted ou --users <users> si vous le souhaitez. Quand cela est fait, recréer le fichier de configuration de grub :

grub-mkconfig -o /boot/grub/grub.cfg

Redemarrage sur l'OS precedement demarre

Dans certains cas il peut être intéressant de pouvoir enregistrer le dernier OS lancé afin de le lancer à nouveau au prochain redémarrage (AKA les MAJ Windows, si vous êtes en dual boot notamment). Pour arriver à ce résultat trois choix s'offrent à vous :

  • lancer la commande de génération de grub citée plus haut : grub-mkconfig -o /boot/grub/grub.cfg en précisant GRUB_DEFAULT=saved devant
  • modifier le fichier /etc/default/grub pour y ajouter cette même variable : GRUB_DEFAULT=saved et générer le fichier de config
  • deprecié ou modifier le fichier /boot/grub/grub.cfg, qui est généré par la commande juste au dessus

Dans le dernier cas voici les étapes pour parvenir à vos fins :

  • au début du fichier vous devriez retrouvez ce bout de code, dans lequel default doit être égal à ${saved_entry} dans le else
### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}" <---- verifiez bien cette ligne
fi
  • à chaque option du menu de grub un peu plus bas, dans les sections ### BEGIN /etc/grub.d/10_linux ### et/ou ### BEGIN /etc/grub.d/30_os-prober ###, etc ... la ligne savedefault doit être la première ligne, voici un exemple avec Windows :
menuentry 'Windows 10 (sur /dev/sdax)' --class windows --class os $menuentry_id_option 'osprober-chain-UUID' {
	savedefault          <-------------- cette ligne la
	insmod part_msdos
	insmod ntfs
	set root='hd1,msdos4'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-ieee1275='ieee1275//disk@0,msdos4' --hint-bios=hd1,msdos4 --hint-efi=hd1,msdos4 --hint-baremetal=ahci1,msdos4  UUID
	else
	  search --no-floppy --fs-uuid --set=root UUID
	fi
	parttool ${root} hidden-
	drivemap -s (hd0) ${root}
	chainloader +1
}

Pensez à bien vérifier que la fonction savedefault est bien présente dans votre fichier.

Références :

Utilisateurs et mots de passe

Pour le moment, on ne connait pas le mot de passe du compte root. On va donc le changer :

passwd

Entrez votre mot de passe. Retenez le bien, il s'agit du mot de passe à ne pas oublier !

Il est ensuite recommandé d'ajouter un utilisateur "classique" et de l'utiliser. Le compte root ne doit être utilisé que lorsque c'est nécessaire !

J'appellerai mon utilisateur saloperie.

useradd -m saloperie

passwd saloperie

On va enfin ajouter notre nouvel utilisateur à certains groupes, comme le groupe wheel pour pouvoir utiliser sudo afin de ne pas se reconnecter en temps que root :

usermod -aG wheel,audio,video,optical,storage saloperie

sudo

On va ajouter les droits sudo à notre utilisateur mais sudo n'est pas intallé.

pacman -S sudo

On va ensuite éditer le fichier sudo :

EDITOR=vim
visudo

Dans le fichier, décommentez la ligne # %wheel ALL=(ALL) ALL et ajoutez la ligne Defaults insults après la liste de defaults.

Reboot et Vérification

On va redémarrer la machine.

exit            # quitte arch-chroot
umount -R /mnt  # démonte des partitions
reboot

Vérifiez maintenant que Windows et Arch Linux se lancent bien et fonctionnent correctement.

ATTENTION : un problème graphique existe concernant VeraCrypt. Si vous bootez sous Windows, il est possible que vous tombiez sur un écran noir. Entrez votre mot de passe puis votre code PIM (Taper ENTRER si vous n'en avez pas mis).

Pour rappel, le clavier est en mapping US pour le mot de passe VeraCrypt.

Internet

Jusqu'à maintenant, nous avons utilisé iwctl pour gérer le wifi (si vous avez fait l'installation avec le wifi).

Nous allons passer une gestionnaire de réseau plus poussé et plus simple d'utilisation, Network Manager.

Network Manager

Network Manager est un programme qui va permettre la détection et la configuration des réseaux.

Installation

sudo pacman -S networkmanager

Ce paquet contient le démon Network Manager, nmcli et nmtui.

Pour vérifier que le démon tourne correctement, taper la commande suivante :

sudo systemctl status networkmanager.service

Utilisation

nmcli

Nous n'aborderons ici que les connexions aux réseaux sans fil.

Il est possible d'utiliser networkmanager uniquement en ligne de commande mais son utilisation est vite fastidieuse quand il s'agit d'utiliser des réseaux aux connexions complexes.

Tout d'abord, faites la liste des réseaux disponibles avec :

nmcli device wifi list
IN-USE  BSSID              SSID                       MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
        xx:xx:xx:xx:xx:xx  FreeWifi_secure            Infra  xx    xxx Mbit/s  74      ▂▄▆_  WPA2 802.1X
        xx:xx:xx:xx:xx:xx  Freebox-xxxxxx             Infra  xx    xxx Mbit/s  70      ▂▄▆_  WPA2
        xx:xx:xx:xx:xx:xx  Livebox-xxxx               Infra  xx    xxx Mbit/s  52      ▂▄__  WPA1 WPA2
        xx:xx:xx:xx:xx:xx  Freebox-xxxxxx             Infra  xx    xxx Mbit/s  50      ▂▄__  WPA2
        xx:xx:xx:xx:xx:xx  FreeWifi_secure            Infra  xx    xxx Mbit/s  47      ▂▄__  WPA2 802.1X
        xx:xx:xx:xx:xx:xx  Livebox-xxxx               Infra  xx    xxx Mbit/s  40      ▂▄__  WPA1 WPA2
        xx:xx:xx:xx:xx:xx  WiFiExtender-xxxxxxxxxxxx  Infra  xx    xxx Mbit/s  34      ▂▄__  WPA2
        xx:xx:xx:xx:xx:xx  Freebox-xxxxxx             Infra  xx    xxx Mbit/s  34      ▂▄__  WPA2
        xx:xx:xx:xx:xx:xx  Wifisalonxx                Infra  xx    xxx Mbit/s  32      ▂▄__  WPA2
        xx:xx:xx:xx:xx:xx  SFR_xxxx                   Infra  xx    xxx Mbit/s  29      ▂___  WPA1 WPA2
        xx:xx:xx:xx:xx:xx  FreeWifi_secure            Infra  xx    xxx Mbit/s  29      ▂___  WPA2 802.1X
        xx:xx:xx:xx:xx:xx  SFR-xxxx                   Infra  xx    xxx Mbit/s  24      ▂___  WPA1 WPA2
        xx:xx:xx:xx:xx:xx  freebox_chats              Infra  xx    xxx Mbit/s  24      ▂___  WPA2

Rafraichir cette liste avec :

nmcli device wifi rescan

Pour vous connecter à un réseau sans fil "classique" :

nmcli device wifi connect <SSID> --ask

Pour se connecter/déconnecter à un réseau déjà connu :

nmcli connection up/down <SSID>

nm-connection-editor

nm-connection-editor est un gestionnaire graphique des réseaux. Il vous permettra de gérer les connexions réseaux de manière graphique.

sudo pacman -S nm-connection-editor

Gestionnaire de paquets

Le gestionnaire de paquets de base d'Archlinux est pacman. Il s'agit d'un bon gestionnaire de paquets mais il n'utilise pas l'AUR (Arch User Repository). Il s'agit du répertoire des paquets créés par la communauté.

Tout d'abord, pensez à mettre à jour vos bases de données :

sudo pacman -Syu

ATTENTION, ce répertoire étant maintenu par la communauté, les paquets qu'il contient sont donc à utiliser avec précaution !

Yet Another Yogurt

yay est un gestionnaire de paquets utilisant l'AUR et est bien plus intéressant que pacman.

Pour l'installer :

sudo pacman -S base-devel \     # Paquets nécessaire pour compiler sous Arch
               git

cd /tmp
git clone https://aur.archlinux.org/yay.git
cd yay && makepkg -si

YAY ne doit pas être installé en tant que root ! Le script d'installation refusera.

Shell

Arch Linux utilise par défaut le shell Bash (Bourne-Again SHell). Il s'agit du shell du GNU Project. Bien que ce shell soit fonctionnel et parfaitement utilisable, il en existe des plus agréables à utiliser.

Zsh

zsh est un shell bien plus user-friendly que bash ou sh. Il est également configurable à souhait.

yay -S zsh

Pour lancer ce shell par défaut :

chsh -s /usr/bin/zsh

Relancer ensuite votre session.

Félicitations, vous êtes sous Zsh.

Oh-my-zsh

Il est cependant possible customiser Zsh de manière très poussée. Oh-my-zsh va permettre de façon simple de gérer votre shell et d'utiliser des plugins.

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Plugin

Dans ~/.zshrc, on trouve la ligne suivante :

plugins=(git)

Il s'agit de la structure qui déclare les plugins utilisés, ici git. On trouve tous les plugins déjà installés dans ~/.oh-my-zsh/plugins/. Si vous téléchargez d'autres plugins, il est recommandé de les stocker dans ~/.oh-my-zsh/custom/plugins.

Les plugins suivants sont recommandés :

Thème

Dans ~/.zshrc, on trouve la ligne suivante :

ZSH_THEME="robbyrussel"

Il s'agit de la structure qui déclare le thème utilisé. On trouve tous les thèmes déjà installés dans ~/.oh-my-zsh/themes/. Si vous modifiez un thème déjà existant, il est recommandé de le stocker dans ~/.oh-my-zsh/custom/themes.

Une visualisation des thèmes est disponible ici.

Pourquoi stocker les fichiers supplémentaires / modifiés dans custom

A chaque démarrage, oh-my-zsh vérifie s'il est bien à jour. Dans le cas où il doit faire une mise à jour, il va git pull son repo. Cependant, si vous modifiez un fichier suivi par le git, le pull sera un échec à cause des conflits de fichiers.

Bref, ne faites pas trop de saloperies.

Graphisme

Vous êtes normalement le plus heureux des Hommes car vous possédez une machine sous Arch Linux. Mais ce qui est encore mieux, c'est un Arch Linux avec un environnement graphique. Nous entrons ici dans le monde du goût et des couleurs, choisissez votre environnement graphique comme il vous plaira

Prérequis

Si vous venez d'installer votre machine, il est problable que vous n'ayez pas démarré le daemon NetworkManager et vous n'êtes pas connecté à un réseau (si vous utilisez un wifi).

systemctl enable NetworkManager

nmcli device wifi list      # Trouver votre réseau
nmcli device wifi connect <nom du wifi> --ask

i3

i3 est un window manager dynamique.

yay -S i3-gaps \     # peut être remplacé par i3-wm
       i3blocks \
       i3lock \
       i3status \
       dmenu \       # pour faire mod+d
       xorg \        # x11
       xorg-xinit \  # x11
       ttf-dejavu    # police d'écriture

Configuration d'X11

On va configurer X11 pour démarrer i3 au lancement de la session. Tout d'abord dans /etc/X11/xinit/xinitrc :

# twm &                         # Commenter cette ligne
xclock -geometry 50x50-1+1 &
xterm -geometry 80x50+494+51 &
xterm -geometry 80x20+494-0 &
# exec xterm -geometry 80x66+0+0 -name login    # Commenter cette ligne
exec i3                         # Ajouter cette ligne pour démarrer i3

Il ne reste plus qu'à lancer le système X. On utilise pour cela startx.

Pour démarrer l'environnement graphique au lancement de la session, nous allons rajouter dans /etc/profile :

if [[ "$(tty)" == '/dev/tty1' ]]; then
    exec startx
fi

Nous n'executerons startx que sur le tty 1 afin de pouvoir travailler sans environnement graphique si ce dernier fonctionne mal.

i3status

i3status symbolise les informations présent dans l'i3-bar (par défaut en bas de l'écran). Cette barre de status est totalement configurable.

Un exemple de configuration d'i3status est disponible dans les dotfiles.

Terminal Emulator

Cependant, avant pouvoir lancer i3, il faut choisir un terminal emulator.
Pour changer votre terminal emulator courant, aller dans la configuration d'i3, dans ~/.config/i3/config. On y trouve (par défaut ligne 45):

bindsym $mod+Return exec <terminal emulator>

xterm

xterm est le terminal emulator standard du système X. Ce n'est pas mon favori mais il fonctionne très bien.

yay -S xterm

Il s'agit du terminal emulator de base d'i3, aucun configuration suplémentaire n'est nécessaire.

termite

termite est un terminal emulator bien plus intéressant selon moi, il gère bien mieux l'utf-8 que xterm.

yay -S termite

ATTENTION, termite n'est plus maintenu. La communauté recommande Alacritty pour le remplacer.

Alacritty

Alacritty est un terminal emulator écrit en Rust inspiré de termite.

yay -S alacritty

Fond d'écran

Pour ajouter un fond d'écran, on va utiliser feh :

yay -S feh

Dans .config/i3/config :

exec --no-startup-id feh --no-fehbg --bg-scale '<chemin vers une image png>'

i3lock

i3block est le système de vérouillage d'écran d'i3. Par défaut, il affiche un écran blanc. Nous allons donc mettre en place un raccourci clavier pour vérouiller l'écran avec une image personnalisée. Dans .config/i3/config :

bindsym $mod+l --release exec i3lock -t -e -f -i '<chemin vers une image en png>'

Contour des fenêtres

for_window [class="*."] border pixel 2                      # Epaisseur des contours
client.focused #930000 #930000 #930000 #930000 #930000$     # Couleur du contour d'une fenetre active
client.focused_incative #333333 #5f676a #ffffff #484e50     # Couleur du contour d'une fenetre inactive

Police d'écriture

Il est possible de changer la police d'écriture de votre terminal. Concernant i3, vous trouverez dans le fichier de configuration (.config/i3/config) la ligne suivante :

font pango:monospace 8

Si une aucune police n'est précisée dans votre terminal emulator (ici, Alacritty), cette police prend le dessus. Elle controle également la police de la i3-bar.

Configuration d'Alacritty

De la documentation d'Alacritty

Les fichiers de configuration peuvent se trouver aux localisations suivantes :

  • $XDG_CONFIG_HOME/alacritty/alacritty.yml
  • $XDG_CONFIG_HOME/alacritty.yml
  • $HOME/.config/alacritty/alacritty.yml
  • $HOME/.alacritty.yml

Le fichier de configuration par défaut se trouve dans /usr/share/doc/alacritty/example/alacritty.yml. Copiez le et mettez le dans une des localisations précédentes.

Voici un exemple de configuration pour le terminal emulator Alacritty :

env:
  XTERM: xterm-256color   # pour avoir un terminal correct sur SSH

font:
  size: 07.5              # la taille de la police

colors:
  primary:
    background: '#000000'
    foreground: '#e0e0e0'
 normal:
    black:   '#3f3f3f'
    red:     '#b06060'
    green:   '#60b47a'
    yellow:  '#dfaf8f'
    blue:    '#506080'
    magenta: '#dc9cc3'
    cyan:    '#8cd0d8'
    white:   '#ffffff'

window.opacity: 0.8   # opacité du fond

L'opacité du fond sous Alacritty ou termite nécessite un paquet supplémentaire, picom.

Pour le lancer au démarrage d'i3, dans .config/i3/config :

exec picom

Wiki d'Alacritty

Gestion de la résolution et du multi-écran

xrandr

Nous utiliserons xrandr pour gérer l'affichage via un terminal.

Wiki d'xrandr

Pour commencer, pour trouver le nom des différents écrans et les résolutions correspondantes :

xrandr
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 16384 x 16384
eDP-1 connected primary 1920x1080+1920+0 (normal left inverted right x axis y axis) 309mm x 174mm
   1920x1080     60.02*+  60.01    59.97    59.96    59.93    48.00
   1680x1050     59.95    60.02    59.88
   [...]
   360x202       59.51    59.13
   320x180       59.84    59.32
HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 1600mm x 900mm
   1920x1080     60.00*+  59.96    50.00    59.94    59.93    24.00    23.98
   1680x1050     60.00    59.95    59.88
   [...]
   360x202       59.51    59.13
   320x180       59.84    59.32
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)

On trouve ici deux écrans détectés, eDP-1 et HDMI-1 avec leur résolution respective.

Changer la résolution d'un écran

Pour changer de résolution, ici par exemple on change la résolution d'HDMI-1 :

xrandr --output HDMI-1 --mode 1680x1050

Ajouter un écran à gauche ou à droite

Pour ajouter un écran :

# Ajout d'HDMI-1 à gauche d'eDP-1
xrandr --output HDMI-1 --mode 1920x1080 --left-of eDP-1

# Ajout d'HDMI-1 à droite d'eDP-1
xrandr --output HDMI-1 --mode 1920x1080 --right-of eDP-1

Copier un écran

# Copie d'eDP-1 sur HDMI-1
xrandr --output HDMI-1 --mode 1920x1080 --same-as eDP-1

arandr

arandr est un front-end d'xrandr qui permet de gérer l'affichage de manière graphique.

yay -S arandr

autorandr

autorandr permet de gérer automatiquement les configurations des affichages en fonction des différents écrans connectés.

yay -S autorandr

Il faut enregistrer les configurations avec

autorandr --save <name>

Attention il faut débrancher les écrans pour qu'ils ne soient pas pris en compte

Vérifier que le service est activé et en fonctionnement

systemctl status autorandr

Système de notification

La meilleur distribution du monde n'embarque pas de système de notification par défaut. Nous allons donc avoir la joie et le privilège d'en installer un.

Deux éléments sont libnotify et un serveur de notification.

Wiki des notifications

Libnotify

yay -S libnotify

Serveur de notification

Certains environnements de bureaux embarquent leur propre serveur de notification (on peut citer GNOME ou KDE Plasma). Il n'est donc pas nécessaire d'installer de serveur de notification dans ce cas.

Dans l'exemple d'i3, nous n'avons pas de serveur de notification. Nous allons donc voir quelques serveurs standalones.

Notifications-daemon

notification-daemon est le serveur de notification par défaut.

yay -S notification-daemon

Pour le lancer automatiquement avec un service :

vim /usr/share/dbus-1/services/org.freedesktop.Notifications.service
[D-BUS Service]
Name=org.freedesktop.Notifications
Exec=/usr/lib/notification-daemon-1.0/notification-daemon

Wired

wired est un autre serveur de notification, disponible dans l'AUR.

yay -S wired

wired est un serveur bien plus configurable que le notification-daemon. La documentation sur la configuration est disponible ici.

Si vous souhaitez passer à wired et que vous utilisez déjà notification-daemon, il suffit de supprimer le fichier /usr/share/dbus-1/services/org.freedesktop.Notifications.services.

Pour le lancer, il suffit de lancer le binaire /usr/bin/wired. Penser à le lancer au démarrage.

Tester un serveur de notification

Le binaire notify-send permet de tester votre serveur de notification.

notify-send "saloperie de notification"

Batterie

Arch Linux ne signale pas quand le niveau de batterie est bas. Il ne se met pas en hibernation non plus pour sauver ce que vous faites.

Nous venons de voir comment installer un serveur de notification. Nous allons donc nous en servir pour savoir quand il faut penser à recharger la batterie de votre ordinateur.

Bien sûr, si vous installez Arch Linux sur un ordinateur fixe, cette étape est inutile.

Batsignal

batsignal est un paquet qui va envoyer des notifications pour signaler différents niveaux de batterie.

yay -S batsignal

Sur la page batsignal de l'AUR, on trouve un utilisateur qui l'appelle avec un service. En théorie cela fonctionne, mais pas dans la pratique (du moins à chaque fois que je l'ai testé). On va donc appeler batsignal au lancement d'i3 dans ~/.config/i3/config :

# On définit un warning à 20% de batterie,
# un critique à 10% et un danger à 5%
# -e va permettre de faire expirer les notifications
exec batsignal -w 20 -c 10 -d 5 -e

Saloperie de systemd

Systemd est une suite de blocks basiques pour construire un système Linux. Il gère le système et les services en tant que PID 1. Il a pour but d'unifier la configuration des services pour beaucoup de distributions Linux, dont la meilleure.

La commande principale pour gérer systemd est systemctl. Nous avons déjà vu cette commande dans squid, nginx ou ssh.

Ce document ne sera qu'une ébauche suite à la complexité de systemd.

Gestion de l'alimentation éléctrique

ActionCommande
Rebootsystemctl reboot
Eteindre (avec les scripts d'arret)systemctl shutdown
Eteindre (sans les scripts d'arret)systemctl poweroff
Mettre en veillesystemctl suspend
Mettre en hibernationsystemctl hibernate

Suspend vs Hibernate

Suspend arrête les processus et met la machine en mode basse consommation.

Hibernate déplace le contenu de la mémoire dans le swap, dit au bootloader de démarrer directement sur le bon noyau et éteint la machine. Il faut rallumer la machine pour que le noyau se recharge depuis le swap.

Services

Pour ajouter un service, dans /etc/systemd/system/, ajouter un fichier .service constuit de la sorte pour un service simple :

[Unit]
Description=La description du service
After=une_dépendance

[Service]
Type=simple
ExecStart=ma_commande_de_demarrage
ExecStop=ma_commande_d_arret
User=Le_user_a_utiliser_pour_lancer_le_service
Group=Le_groupe_a_utiliser_pour_lancer_le_service
AmbientCapabilities=Capabilities_a_ajouter_au_processus A_separer_avec_des_espaces
CapabilityBoundingSet=Limite_le_processus_a_ces_capabilities A_separer_avec_des_espaces

[Install]
WantedBy=multi-user.target

Par défault, User et Group sont ceux de l'utilisateur lançant le service donc souvent root:root.

Par exemple, ce wiki se lance grâce à un service :

[Unit]
Description=mdBook wiki
After=network.target

[Service]
Type=simple
ExecStart=/home/pi/mdBook/target/release/mdbook serve /home/mdbook/doc/wiki-salope -n xxx.xxx.xxx.xxx -p xxxx

[Install]
WantedBy=mutli-user.target

Les services peuvent avoir des configurations très compliquées. Vous trouverez ci-dessous des références :

Wiki Arch Linux sur systemd

Configuration d'une unité

Configuration d'un service

Les commandes suivantes sont à connaitre concernant les services :

ActionCommande
Voir l'état d'un servicesystemctl status service
Lancer un servicesystemctl start service
Arrêter un servicesystemctl stop service
Relancer un servicesystemctl restart service
Recharger un servicesystemctl reload service
Lancer un serice au démarragesystemctl enable service
Ne pas lancer un service au démarragesystemctl disable service
Masque un servicesystemctl mask service
Démasque un servicesystemctl unmask service

Durée de vie de la batterie

Nous verrons ici deux paquets pour optimiser la durée de vie de votre batterie.

Powertop

Tutoriel de référence

Powertop est un outil fournit par Intel (mais à l'air de fonctionner avec Un processeur AMD) qui va permettre d'optimiser des modules dans le userspace, le noyau et le matériel pour sauver votre batterie.

yay -S powertop

Tout d'abord, nous allons lancer powertop en mode "calibration" pour permettre au paquet de faire un état des lieux. Cela prend quelques minutes, armez-vous de patience.

sudo powertop --calibrate

Ensuite, créer et activer un service afin de lancer powertop --auto-tune au lancement de votre machine (voir le guide sur les services systemd) :

[Unit]
Description=Powertop tunings

[Service]
Type=oneshot
ExecStart=/usr/bin/powertop --auto-tune

[Install]
WantedBy=multi-user.target

TLP

TLP est un utilitaire pour Linux qui va optimiser la durée de vie de la batterie. La seule chose à faire est d'installer le paquet :

yay -S tlp

Et de lancer le service TLP (voir le guide sur les services systemd) :

sudo systemctl enable tlp.service
sudo systemctl start tlp.service

Backlight et contrôle de la luminosité de l'écran

Il est toujours utile de savoir gérer la luminosité de l'écran d'un ordinateur portable, que ce soit pour la gestion de la batterie ou pour le confort.

La gestion de la luminosité étant très différente d'un constructeur à un autre, le fonctionnement de ce guide n'est pas garanti.

Les systèmes ci-dessous ont été testé et fonctionnent sous Arch Linux, avec un Lenovo ThinkPad P14s sous processeur AMD.

Sources de ce guide :

ACPI

La luminosité est ajustable en ajustant l'alimentation des LEDs (ou cathodes). Cette alimentation peut être contrôlé en utilisant le module noyau ACPI. Une interface est disponible dans /sys/class/backlight/.

Le nom du dossier dépend du modèle de votre carte graphique :

ls /sys/class/backlight/
amdgpu_bl0

Pour la suite de ce guide, amdgpu_bl0 sera utilisé à titre d'exemple.

On trouve dans /sys/class/backlight/amdgpu_bl0/ :

actual_brightness  device          scale      uevent
bl_power           max_brightness  subsystem
brightness         power           type

La puissance maximale est disponible dans max_brightness :

255

La puissance est contrôlable dans brightness, avec une valeur entre 0 et max_brightness.

echo 150 > /sys/class/backlight/amdgpu_bl0/brightness

Script

Deux types de scripts sont proposés pour contrôler de manière simple la luminosité de l'écran :

  • un script à lancer avec une valeur
  • utiliser les boutons du clavier sensés gérer la luminosité

Dans les deux cas, l'écriture dans /sys/class/backlight/amdgpu_bl0/brightness est protégé et accessible uniquement par root.

Rendre brightness éditable par tout le monde

Créer (ou modifier) le fichier /etc/udev/rules.d/backlight.rules :

sudo vim /etc/udev/rules.d/backlight.rules
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", RUN+="/bin/chgrp wheel /sys/class/backlight/amdgpu_bl0/brightness"
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", RUN+="/bin/chmod g+w /sys/class/backlight/amdgpu_bl0/brightness"

Cela rend le fichier /sys/class/backlight/amdgpu_bl0/brightness éditable par le groupe wheel.

-rw-rw-r-- 1 root wheel 4.0K Feb 10 11:31 /sys/class/backlight/amdgpu_bl0/brightness

Editer directement les permissions du fichier avec les commandes ne suffit pas, cette configuration ne survit pas à un redémarrage :

chmod 664 /sys/class/backlight/amdgpu_bl0/brightness
chown root:wheel /sys/class/backlight/amdgpu_bl0/brightness

Script cli

old=`cat /sys/class/backlight/intel_backlight/brightness`
max=`cat /sys/class/backlight/intel_backlight/max_brightness`
new=`expr $old + $1`

# make sure not to go below 0
if [ $new -lt 0 ]
then
	new=0
fi

# make sure not to go over the maximum brightness
if [ $new -gt $max ]
then
	new=$max
fi

echo $new | tee /sys/class/backlight/intel_backlight/brightness

Boutons

sudo vim /usr/local/bin/brightness-up
#!/bin/sh

echo $(( $(cat /sys/class/backlight/amdgpu_bl0/brightness) + 15)) | tee /sys/class/backlight/amdgpu_bl0/brightness
sudo vim /usr/local/bin/brightness-down
#!/bin/sh

echo $(( $(cat /sys/class/backlight/amdgpu_bl0/brightness) - 15)) | tee /sys/class/backlight/amdgpu_bl0/brightness

Enfin, pour rendre les boutons utilisables sous i3 :

bindsym XF86MonBrightnessDown exec "brightness-down"
bindsym XF86MonBrightnessUp exec "brightness-up"

Fichier de configuration

Par ces salops de Kuro et FanfanlaTulipe

Vous trouverez plus bas des fichiers de configuration divers et variés concernant plusieurs outils.

Git

[color]
    ui = true
[alias]
    poule = pull
    # push and create a merge request on gitlab
    pmr = push -o merge_request.create -o merge_request.remove_source_branch
    # push and create a merge request on gitlab that merges when pipeline validates
    pmra = "push -o merge_request.create -o merge_request.remove_source_branch -o merge_request.merge_when_pipeline_succeeds";
    # push and create a pull request on github. Needs hub to be installed
    ppr = "! git push ; hub pull-request -p --no-edit"
    # random message commit
    yolo = "! git commit -m \"$(curl http://whatthecommit.com/index.txt)\""
    # Commit and push eveything with a random message commit
    fire = "! git add . ; git yolo ; git push"
[core]
    editor = vim
    # Add a global gitignore file on home that applies locally on all projects
    excludesfile = ~/.gitignore_global
# Clones https urls from gitlab with ssh
[url "git@gitlab.com:"]
    insteadOf = "https://gitlab.com/"
# Clones https urls from github with ssh
[url "git@github.com:"]
    insteadOf = "https://github.com/"

Corbeille

Dans le run command de votre shell (.bashrc ou .zshrc) :

export CORBEILLE=$(<~/.config/corbeille/config || echo "~/.Corbeille") 2> /dev/null

alias crm='command rm'
function rm(){
    actualp=$(pwd | cut -f1 -d" ");
    if [ $actualp != $CORBEILLE ]
    then
        if [ ! -e $CORBEILLE ];
        then mkdir $CORBEILLE ;
        fi
        mv "$@" $CORBEILLE;
    else
        command rm "$@"
    fi
}
function clearcorbeille(){
    command rm -rf $CORBEILLE
}

Dans .config/corbeille/config :

<chemin vers votre corbeille>

Vim

~/.vimrc :

set sw=4            # nombre d'espace pour chaque marche d'indentation
set mouse=a
set ttymouse=sgr    # corrige un problème de souris sous alacritty
set ts=4            # nombre d'espace pour une tabulation
set number          # affiche les numéros des lignes
set ruler           # affiche la position du curseur sous les fenêtres
syntax on           # affiche les couleurs pour les syntaxes connues
set expandtab       # change les tabulations en espaces en mode Insertion
set smarttab        # une tabulation dans une indentation insert 'shiftwidth' espaces
set ai              # auto-indentation
set si              # auto-indente de manière intelligente
set colorcolumn=120 # affiche une barre rouge à 120 colonnes

filetype plugin indent on   # detecte et indente

set autoread        # met à jour le fichier s'il a été modifié en dehors de vim
set autowrite       # écrit un fichier automatique à la sortie de vim

set nobackup        # ne garde pas de backup après avoir écraser un fichier
set noswapfile      # pas de fichier de swap

set encoding=utf-8  # l'encodage utilisé

set list            # montre les tabulations comme des ^I et les fins de lignes comme $
set listchars=tab:>-,trail:·    # montre les tabulations comme >--- et les espaces en fin de ligne comme ·
autocmd BufWritePre * :%s/\s\+$//e  # supprime les espaces en fin de ligne

i3status

# i3status configuration file.
# see "man i3status" for documentation.

# It is important that this file is edited as UTF-8.
# The following line should contain a sharp s:
# ß
# If the above line is not correctly displayed, fix your editor first!

general {
        colors = true
        interval = 5
}

order += "volume master"
order += "path_exists vpn"
order += "ipv6"
order += "wireless _first_"
order += "ethernet _first_"
order += "battery all"
order += "disk /"
order += "load"
order += "memory"
order += "tztime local"

volume master {
        format = "Vol: %volume"
        format_muted = "Vol: off"
        device = "default"
        mixer = "Master"
        mixer_idx = 0
}

volume speaker {
        format = "on"
        format_muted = "off"
        device = "default"
        mixer = "Speaker"
        mixer_idx = 0
}

path_exists vpn {
        path = "/proc/sys/net/ipv4/conf/tun0"
        format = "VPN: up"
        format_down = "VPN: down"
}

wireless _first_ {
        format_up = "W: (%quality at %essid) %ip"
        format_down = "W: down"
}

ethernet _first_ {
        format_up = "E: %ip (%speed)"
        format_down = "E: down"
}

battery all {
        format = "%status %percentage %remaining"

        format_down = "No battery"
        status_chr = "⚡"
        status_full = "☻"
        low_threshold = 10
}

disk "/" {
        format = "%avail"
}

load {
        format = "%1min"
}

memory {
        format = "%used / %total"
        threshold_degraded = "1G"
        format_degraded = "MEMORY < %available"
}

tztime local {
        format = "%d-%m-%Y %H:%M:%S"
}

Squid

Par ce salop de FanfanlaTulipe et corrigé par ce salop de fl0w5

Squid est un proxy HTTP, HTTPS et FTP. Il permet un bon controle sur le réseau, en particulier web.

Un proxy, c'est quoi cette saloperie ?

Un proxy (à ne pas confondre avec un reverse-proxy) est un système permettant de faire rebond. Dans le cas de Squid, cela permet de mettre un intermédiaire entre un client et un serveur principalement web. Cela a donc l'avantage de cacher les clients derrière un système configurable et qui peut tout journaliser. Son utilisation en entreprise est donc très recommandée.

Proxy HTTP

On entre dans la partie simple du guide. Tout d'abord, nous allons voir comment faire un simple proxy HTTP. L'exemple sera fait sur une machine Debian.

Installation

On va commencer par récupérer le paquet Squid et activer le service :

apt install squid -y
systemctl enable squid
systemctl start squid

systemctl status squid  # Pour vérifier qu'il fonctionne

Configuration

Squid tourne sur le port 3128 par défaut. On regardera comment le modifier plus bas mais nous utiliserons ce port pour le reste de cette saloperie de guide.

Le fichier de configuration de Squid est /etc/squid/squid.conf.

Tout d'abord, si vous souhaitez changer le port d'écoute, trouvez http_port 3128 et modifiez le.

Nous allons maintenant passer aux ACL (Access Control List) du proxy Squid.

vim /etc/squid/squid.conf

La configuration par défaut de Squid n'autorise pas les connexions entrantes. On va régler ça. Trouver http_access allow localnet et décommenter le.
Trouver ensuite un ensemble de lignes (ligne 1188 par défaut) :

acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines

Elles définissent les IPs autorisées à communiquer avec le proxy. Il est possible d'ajouter une seule IP ou plusieurs :

acl localnet src 1.2.3.4            # Une seule IP
acl localnet src 1.2.3.0-1.2.3.255  # Un ensemble d'IPs
acl localnet src 1.2.3.0/24         # Un CIDR

Si vous souhaitez ajouter votre IP publique, vous pouvez la trouver ici. Il est également conseillé de supprimer les IPs par défaut qui ne sont pas utiles.

Test du proxy

Sur la machine cliente :

curl -x http://<ip du proxy>:<port> -I http://google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Sat, 27 Nov 2021 22:36:13 GMT
Expires: Mon, 27 Dec 2021 22:36:13 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Age: 5276
X-Cache: HIT from vps-xxxxxxxx
X-Cache-Lookup: HIT from vps-xxxxxxxx:3128
Via: 1.1 vps-xxxxxxxx (squid/x.x)
Connection: keep-alive

Il est normal que Google réponde avec l'erreur 301, pas de panique (on va chercher http://google.com, google.com nous répond d'aller voir à http://www.google.com).

Félicitations, vous avez un proxy HTTP. J'insiste sur le fait que ce n'est que HTTP car le trafic entre le proxy et le client est en clair :

serveur web <-------> proxy web <------> client
              https               http

Ce genre de protocole n'étant pas acceptable, nous allons essayer de le résoudre dans la suite de ce guide. Un moyen simple de résoudre ce problème est de passer par un VPN. Nous ne traiterons pas ce cas dans ce guide.

Enfin, maintenant que nous avons la base d'un proxy, il serait interessant que la navigation ne soit pas anonyme afin de journaliser le trafic.

Authentification des clients

apt install apache2-utils -y

Nous allons ensuite créer un fichier qui va contenir les mots de passe :

touch /etc/squid/passwd
chown proxy /etc/squid/passwd

Nous allons créer un utilisateur pour le proxy, ici proxyuser :

htpasswd /etc/squid/passwd proxyuser

La commande demandera le mot de passe.

Enfin, ouvrir /etc/squid/squid.conf :

vim /etc/squid/squid.conf

Ajouter les règles suivantes dans le fichier :

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid Basic Authentication
auth_param basic credentialsttl 2 hours
acl auth_users proxy_auth REQUIRED
http_access allow auth_users

Penser à recharger Squid :

systemctl restart squid

Pour tester :

curl -x http://<ip du proxy>:<port> --proxy-user proxyuser:<mot de passe> \
https://www.google.com

ATTENTION, si vous n'utilisez pas de VPN chiffré ou un proxy https, les identifiants transittent en clair dans le réseau !

Proxy HTTPS

Il est nécessaire d'utiliser un serveur mandataire qui fonctionne en HTTPS afin que les flux entre les clients et le serveur soit chiffré.

Il est nécessaire d'avoir un bi-clé pour faire fonctionner un serveur mandataire en HTTPS et de mettre dans les autorités de certification de confiance le certificat. En effet, le proxy va signer à la volée des certificats pour qu'un flux HTTPS entre le client et le proxy soit possible sans erreur.

http_port 3128 tls-cert=/etc/ssl/certs/squid-cert.pem tls-key=/etc/ssl/private/squid-key.pem generate-host-certificates=on cipher=HIGH:!MEDIUM:!LOW:!IDEA:!3DES:!MD5 options=NO_TLSv1,NO_SSLv3,NO_SSLv2,SINGLE_DH_USE,SINGLE_ECDH_USE

Références

Site officiel de Squid
Recommandation de l'ANSSI sur l'interconnexion d'un SI avec Internet
Recommandation de l'ANSSI sur l'analyse des flux HTTPS

Interception TLS

On parle ici d'interception TLS et non d'interception SSL car SSL n'est plus sensé être utilisé aujourd'hui. Voir les recommandations de l'ANSSI concernant la cryptographie.

Il est possible de lire sur un serveur mandataire les flux des clients grâce à une interception TLS. En effet, le serveur mandataire possède une extrémité du tunnel TLS, ainsi il peut lire les données.

Configuration

Pour réaliser des interceptions TLS, une version particulière de Squid est nécessaire. Sous Debian, il faut installer le paquet squid-openssl. Il est cependant possible de recompiler squid directement avec les options qui sont intéressantes.

Voici la configuration nécessaire :

http_port 3128 ssl-bump tls-cert=/etc/ssl/certs/squid-cert.pem tls-key=/etc/ssl/private/squid-key.pem generate-host-certificates=on dynamic_cert_mem_cache_size=128MB cipher=HIGH:!MEDIUM:!LOW:!IDEA:!3DES:!MD5 options=NO_TLSv1,NO_SSLv3,NO_SSLv2,SINGLE_DH_USE,SINGLE_ECDH_USE

ssl_bump bump all

sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/spool/squid/ssl_db -M 128MB
sslcrtd_children 32 startup=10 idle=5

Il est nécessaire d'avoir une base de donnée pour la création dynamique de certificat, ici /var/spool/squid/ssl_db. La commande suivante est nécessaire pour sa création :

/usr/lib/squid/security_file_certgen -c -s /var/spool/squid/ssl_db -M 128 MB

Cela permet de voir les méta-données des flux, comme ci-dessous :

1688376761.272    699 192.168.1.9 TCP_MISS/200 5508 GET https://wiki.salo.pe/archlinux/shell.html - HIER_DIRECT/149.56.15.239 text/html

La partie URL ou contentMIME est normalement chiffré, mais ici on peut de voir grâce à l'interception.

Utilisation

Cette interception toute seul ne sert qu'à des fins de journalisation. Cependant, elle permet d'ajouter des outils de filtrage des flux. On va aborder squidGuard et squidClamav.

Il est important d'avoir à l'esprit que le chiffrement/déchiffrement des flux à la volée est couteux au niveau des performances machines. Ainsi, il est peut-être souhaitable d'installer des exceptions à l'interception TLS. On peut par exemple citer les sites faisant du flux vidéo comme YouTube ou Netflix. Il s'agit de sites relativement de confiance et qui envoient beaucoup de données par très utile à analyser.

squidGuard

Introduction

SquidGuard est un accessoire à ajouter à Squid afin de bloquer l'accès à certains sites ou contenus sur le serveur mandataire.

Nous verrons dans cette partie comment bloquer l'accès à wiki.salo.pe à une partie ou à l'ensemble des utilisateurs du serveur mandataire.

Installation

L'installation de squidGuard est simple. Il est tout d'abord possible de compiler le code source. Sinon, sous Debian, il faut trouver le paquet squidguard_1.6.0-2_amd64.deb (à l'heure où on rédige ces lignes).

Configuration

SquidGuard nécessaire plusieurs configurations pour fonctionner correctement.

Configuration de squidGuard

Le fichier de configuration de squidGuard est par défaut /etc/squidguard/squidGuard.conf.

Nous avons 4 parties à configurer :

  1. dbhome: le chemin vers la base de données de squidguard ;
  2. logdir: le chemin vers le dossier des journaux ;
  3. dest: définit les accès interdits et vers quel site rediriger les utilisateurs qui y accèdent ;
  4. acl: les acl.

Voici un exemple de /etc/squidguard/squidGuard.conf :

dbhome /var/lib/squidguard/db
logdir /var/log/squidguard

dest wikisalope {
    domainlist salope/domains
    redirect https://badway.local/
}

acl {
    default {
        pass !wikisalope any
    }
}

Ainsi, on trouvera dans /var/lib/squidguard/db/salope/domains :

wiki.salo.pe

Configuration de squid

Il est maintenant nécessaire d'indiquer à squid d'utiliser squidGuard (ici dans /etc/squid/squid.conf) :

url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
url_rewrite_children 5

Le site wiki.salo.pe est maintenant bloqué.

Aller plus loin

Il est possible de bloquer également des urls ou des expressions regulières.

Base en ligne

L'Université de Toulouse maintient une liste noire de sites, utile pour avoir une base des sites bloqués. Elle est disponible ici.

SquidClamav

SquidClamav permet l'envoi du contenu du serveur mandataire vers un antivirus (ici ClamAV) via un serveur ICAP.

Nous utiliserons c-icap ici.

Github de squidClamav

Fonctionnement

Squid est capable de communiquer avec un serveur ICAP. Nous allons ainsi lui envoyer les requêtes qui passent par le serveur afin de l'analyser par ClamAV.

Un serveur ICAP est capable de recevoir des flux chiffrés ou non. Ainsi, dans l'exemple qui suit, nous interagirons avec le serveur ICAP sur la loopback, ainsi il n'est pas nécessaire de chiffrer les flux. Il faut garder à l'esprit qu'ici, le client attend une réponse du serveur et celle-ci doit arriver le plus rapidement possible.

Enfin, le serveur ICAP enverra le flux à l'antivirus.

Installation

Il est nécessaire de compiler le code source présent sur le git. Il est conseillé de le faire sur la machine qui hébergera le serveur ICAP, afin d'être dans le bon environnement directement.

./configure --with-c-icap CFLAGS=-O2

make

make install

Maintenant que squidClamav est présent, il faut installer c-icap. Il suffit de prendre le paquet c-icap.

Configuration

c-icap

c-icap nécessite de connaitre squidClamav pour fonctionner. On va doc ajouter cette ligne dans /etc/c-icap/c-icap.conf :

Service squidclamav squidclamav.so

Ainsi, nous avons la configuration suivante :

PidFile /run/c-icap/c-icap.pid
CommandsSocket /run/c-icap/c-icap.ctl
Timeout 300
MaxKeepAliveRequests 100
KeepAliveTimeout 600
StartServers 3
MaxServers 10
MinSpareThreads     10
MaxSpareThreads     20
ThreadsPerChild     10
MaxRequestsPerChild  0
Port 127.0.0.1:1344
User proxy
Group proxy
ServerAdmin you@your.address
ServerName YourServerName
TmpDir /tmp
MaxMemObject 131072
DebugLevel 0
Pipelining on
SupportBuggyClients off
ModulesDir /usr/lib/x86_64-linux-gnu/c_icap
ServicesDir /usr/lib/x86_64-linux-gnu/c_icap
TemplateDir /usr/share/c_icap/templates/
TemplateDefaultLanguage en
LoadMagicFile /etc/c-icap/c-icap.magic
RemoteProxyUsers off
RemoteProxyUserHeader X-Authenticated-User
RemoteProxyUserHeaderEncoded on
Service echo srv_echo.so

Service squidclamav squidclamav.so

squidClamav

Ensuite, il faut configurer squidClamav pour envoyer les données à ClamAV dans /etc/c-icap/squidclamav.conf

maxsize 500M
redirect http://local.domain/virus.html
clamd_ip 192.168.10.100
clamd_port 3310
timeout 1
logredir 0
dnslookup 0
safebrowsing 0
multipart 0
scan_mode ScanAllExcept
enable_libarchive 0
banmaxsize 2M

Ici, ClamAV est hébergé sur le port 3310 sur le serveur 192.168.10.100.

squid

Enfin, il faut configurer squid pour utiliser le serveur ICAP :

icap_enable on
icap_send_client_ip on
icap_send_client_username on
icap_client_username_encode off
icap_client_username_header X-Authenticated-User
icap_preview_enable on
icap_preview_size 1024
icap_service service_avi_req reqmod_precache icap://127.0.0.1:1344/squidclamav bypass=off
adaptation_access service_avi_req allow all
icap_service service_avi_resp respmod_precache icap://127.0.0.1:1344/squidclamav bypass=on
adaptation_access service_avi_resp allow all

Tester

Pour tester le bon fonctionnement du serveur antivirus et de squidclamav, il est possible d'utiliser le site de l'EICAR qui possède un fichier de test, disponible ici.

Apache

Par l'intégralité des salops de ce wiki

Apache HTTP Server (aussi connu sous le nom de httpd ou Apache) est un serveur web open-source mutli-plateforme maintenu par la Apache Software Foundation.

Installation

L'exemple d'installation sera fait sur une machine Debian.

apt install nginx

Configuration

Voir le tutoriel de la saloperie de Nginx

Plus sérieusement

Nous déconseillons l'utilisation d'Apache, vu sa complexité de configuration et le nombre de vulnérabilités existantes sur ce service (voir les références).

Références

CVE details - Apache

NGINX

Par ce salop de FanfanlaTulipe, corrigé par ce salop de fl0w5

Nginx (s'écrit aussi NGINX, nginx ou NginX) est un serveur web qui peut servir de reverse-proxy, load-balancer ou mail-proxy. Nous verrons ici l'installation du service ainsi que sa configuration selon les recommandations de l'ANSSI.

Installation

L'exemple d'installation sera fait sur une machine Debian.

apt install nginx
apt install nginx-extras    # pour cacher le header de signature

systemctl status nginx      # On vérifie que le service fonctionne.

Architecture du service :

├── conf.d
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── modules-available
├── modules-enabled
│   └── [...]
├── nginx.conf          # Fichier de configuration du service
├── proxy_params
├── scgi_params
├── sites-available     # Dossier contenant tous les sites
│   ├── default
│   └── my_site.conf
├── sites-enabled       # Dossier contenant des liens symboliques vers les sites visibles
│   └── my_site.conf -> /etc/nginx/sites-available/my_site.conf
├── snippets
│   ├── fastcgi-php.conf
│   └── snakeoil.conf
├── uwsgi_params
└── win-utf

On travaillera principalement sur :

  • nginx.conf pour les configurations générales.
  • les fichiers de configuration des sites.

Configuration

nginx.conf

nginx.conf représente le fichier de configuration globale.

http {
    sendfile on;
    tcp_nopush on;
    types_hash_max_size 2048;

    ssl_protocols TLSv1.2 TLSv1.3;  # On accepte que les protocoles TLS récents
    ssl_prefer_server_ciphers on;   # On force l'utilisation des ciphers du serveur

    error_log /var/log/nginx/error.log notice;  # On est le plus verbose possible dans les logs

    gzip on;
}

Le site

Dans sites-available se trouve les configurations des sites. La convention veut que seuls des liens symboliques soit présents dans sites-enabled vers les sites "activés".

# On fait ses configurations pour cacher l'utilisation dans les headers d'un serveur nginx
server_tokens off;          # cache le numéro de version dans les headers
more_set_headers 'Server';  # cache le header Server

add_header X-XSS-Protection "1: mode=block" always; # évite les attaques XSS
add_header X-Frame_Options "SAMEORIGIN" always;     # évite le 'clickjacking'
add_header Permission-Policy "";                    # on utilise pas d'API
add_header Content-Security-Policy "default-src 'self';" always;    # On précise que tout le contenu du site proviendra de la même origine. Cette option est très souvent retirée car trop restrictive.
add_header X-Content-Type-Options "nosniff" always; # évite le 'sniffing' sur IE et Chrome

# Serveur HTTP classique, redirigeant sur le serveur HTTPS
# Pour des raisons évidentes, l'utilisation de HTTP est limitée au minimum.
server {
    listen 80;                              # IPv4, on écoute sur le port 80, http par défaut
    listen [::]:80;                         # IPv6

    return 301 https://$host$request_uri;   # On redirige le client vers la même page en https.
}

# Exemple de serveur reverse-proxy sur HTTPS
server {
    listen 443 ssl;             # IPv4, on écoute sur le port HTTPS (443)
    listen [::]:443;            # IPv6

    server_name wiki.salo.pe;   # Ce serveur répond au host 'wiki.salo.pe'

    location / {                # Pour n'importe quel fichier demandé
        proxy_pass http://localhost:8080/;  # On redirige la requete vers localhost sur le port 8080 en HTTP
    }

    ssl_certificate <chemin vers le certificat>;        # On spécifie le certificat
    ssl_certificate_key <chemin vers la clé privée>;    # et sa clé privée

    ssl_protocols TLSv1.2 TLSv1.3;      # On n'autorise que les protocoles récents
    ssl_prefer_server_ciphers on;       # On force l'utilisation de nos ciphers
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
    ssl_stapling on;            # On active la réponse OCSP
    ssl_stapling_verify on;     # et on la vérifie

    add_header Strict-Transport-Security "max-age=63072000" always; # On active HSTS contre les attaques d'Homme-du-Milieu
}

# Exemple de serveur web HTTPS
server {
    listen 443 ssl;
    listen [::]:443;

    server_name grosse.salo.pe;

    root /var/www/html;     # On spécifie la racine du serveur
    index index.html;       # On spécifie le fichier par défaut

    error_page 404 /error_404.html;     # On change la page 404
    location /error_404.html {          # et on spécifie sa localisation
        root /etc/nginx/ressources;
        internal;
    }

    ssl_certificate <chemin vers le certificat>;        # On spécifie le certificat
    ssl_certificate_key <chemin vers la clé privée>;    # et sa clé privée

    ssl_protocols TLSv1.2 TLSv1.3;      # On n'autorise que les protocoles récents
    ssl_prefer_server_ciphers on;       # On force l'utilisation de nos ciphers
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
    ssl_stapling on;            # On active la réponse OCSP
    ssl_stapling_verify on;     # et on la vérifie

    add_header Strict-Transport-Security "max-age=63072000" always; # On active HSTS contre les attaques d'Homme-du-Milieu
}

Références

ANSSI - Recommandations de sécurité relative à TLS

Fail2ban

Par ce salop de FanfanlaTulipe

Fail2ban est un service de parsing de journaux et de défense contre des signes d'attaques prédéterminés. Il s'agit d'une protection efficace pour des services exposés tels que SSH ou NGINX contre les attaques par force brute par exemple.

Dans le cas de SSH, sshguard est un autre service de défense intéressant. Il est cependant déconseillé de le mélanger avec fail2ban.

Installation

Nous verrons la suite de ce guide sur un Debian 11 (bien qu'il ne s'agisse pas de la meilleure distribution du monde, mais il fonctionne pour toutes les distributions Linux.

apt install fail2ban -y

Fail2ban s'appuie sur iptables (par défaut), assurez-vous qu'il soit installé.

Configuration

Nous arrivons sur la partie utile de ce guide, la configuration de fail2ban. Tous les fichiers/dossiers mentionnés ci-dessous sont dans /etc/fail2ban/.

Il existe 4 types de configurations :

  • La configuration générale du service, dans jail.conf.
  • La déclaration des jails, dans jail.conf et dans jail.d/.
  • La définition des filtres dans filter.d/.
  • La définition des actions dans action.d/.

Configuration générale

Tout d'abord, il est conseillé de toujours garder jail.conf d'origine et de créer jail.local pour faire des modifications :

cp jail.conf jail.local
ignoreip = 127.0.0.1/8 ::1      # Défini les IPs à ne pas bannir

bantime = 1m                    # Temps de bannissement
findtime = 15m                  # Défini l'intervalle de temps pendant lequel un
                                # utilisateur peut être banni s'il dépasse le nombre
                                # maximum d'essai
maxretry = 3                    # Défini le nombre maximal d'essai

La plupart des configurations suivantes sont des configurations par défaut des jails.

Par défaut, les jails sont désactivés.

Jail

Une jail est une combinaison d'un filtre et d'une ou plusieurs actions. On peut les ajouter dans jail.local ou créer un fichier dans jail.d/. On a ici jail.d/bad_method.conf :

[nginx-bad_method]                          # On définit la jail 'nginx-bad_method'
enabled     = true                          # On active la jail
port        = http,https                    # Elle est active sur les ports 80 et 443
filter      = bad_method                    # Nous utiliserons le filtre bad_method.conf
logpath     = /var/log/nginx/access.log     # Sur le fichier '/var/log/nginx/access.log'
maxretry    = 1                             # Redéfinit le nombre max d'essais

Filtre

Un filtre est un fichier qui définit les journaux qui correspondent à des signes d'attaques grâce à des regex. On trouve ces fichiers dans filter.d/, ici filter.d/bad_method.conf :

[Definition]

failregex = ^<HOST> - .*(POST|PUT|HEAD|CONNECT|DELETE|OPTIONS|PATCH)

ignoreregex =

Dans ce filtre, nous signalons toutes les requetes qui n'utilisent pas la méthode GET.

<HOST> permet de déterminer où se trouve l'IP à signaler/bannir. Par exemple, pour le journal suivant :

1.2.3.4 - - [20/Oct/2021:16:50:03 +0200] "POST /malware.php HTTP/1.1" 405 ...

<HOST> sera 1.2.3.4 et vu que la méthode utilisée est POST, l'utilisateur est signalé. De plus, nous avons défini que maxretry serait à 1. L'utilisateur est donc banni 1 minute.

Vérification du fonctionnement

Fail2ban embarque un programme, fail2ban-client, qui permet par exemple de regarder l'état des jails.

fail2ban-client status nginx-bad_method
Status for the jail: nginx-bad_method
|- Filter
|  |- Currently failed:	3
|  |- Total failed:	37
|  `- File list:	/var/log/nginx/access.log
`- Actions
   |- Currently banned:	2
   |- Total banned:	8
   `- Banned IP list:	47.242.195.12 8.210.90.76

Il permet de gérer fail2ban dans la globalité (redémarrage, débannissment, etc...).

Saloperie de synapse

Par ce salop d'anonyme bis

Le tutoriel qui suit porte sur l'installation et la configuration de Matrix synapse en utilisant docker (pour les saloperie de pauvres comme moi n'ayant pas assez de serveurs) et en utilisant portainer.

Préparation

Par ce salop de Croco et corrigé par ce salop de fl0w5

Nous allons commencer à créer une stack docker à laquelle nous rajouterons nos bridges par la suite. Il nous faudra donc créer:

  • Un network interne pour communiquer avec les futurs bridges et la database
  • Un volume pour stocker les données de façon permanente
  • Une base de données PostgreSQL pour plus de performances que sqlite.
  • Un service synapse

Installation

Tout d'abord, nous allons devoir générer les fichiers de configuration de synapse. Pour cela nous allons créer une stack docker avec la base de données postgresql afin de la configurer aussi. Il est évidemment possible d'utiliser une base de données externe à docker pour que cela fonctionne. Seulement Postgresql et sqlite sont supportés mais sqlite n'est pas adapté pour de la production.

version: "2.3"

networks:
  matrix:
    external: false

  volumes:
    matrix:
      driver: local
    postgreql:
      driver: local

  services:
    synapse:
      image: matrixdotorg/synapse
      container_name: matrix
      restart: always
      command: generate
      networks:
        - matrix
      ports:
        - 127.0.0.1:8008:8008
      volumes:
        - matrix:/data
      environment:
        - TZ=Europe/Paris
        - SYNAPSE_SERVER_NAME=<domain>
        - SYNAPSE_REPORT_STATS=no

  postgres:
    image: postgres:alpine
    restart: always
    container_name: postgres
    networks:
      - matrix
    volumes:
      - postgres:/var/lib/postgresql/data
      - <path to init.db>:/docker-entrypoint-initdb.d/init.sql
    environment:
      - TZ=Europe/Paris
      - PGTZ=Europe/Paris
      - POSTGRES_INITDB_ARGS="--auth=scram-sha-256"
      - POSTGRES_HOST_AUTH_METHOD=scram-sha-256
      - POSTGRES_PASSWORD=<synapse_password>
      - POSTGRES_USER=synapse

Le service Synapse est plutôt basique. Cependant, nous avons rajouter la commande command: generate afin de préciser que nous voulons générer la configuration par défaut avec les arguments SYNAPSE_SERVER_NAME=<domain> et SYNAPSE_REPORT_STATS=no.

Le service postgresql va créer l'utilisateur synapse ayant pour mot de passe <synapse_password>. Il faudra aussi créer un fichier init.db qui permettra de créer les bases de données nécessaires et les utilisateurs pour les différents bridges. Il faut donc prévoir en avance quels bridges seront créés. Il sera tout de même toujours possible de créer ces base de données et ces utilisateurs avec la commande psql par la suite. Le contenu du fichier init.db est le suivant (avec la creation d'un utilisateur mautrixfacebook et de sa db pour le bridge facebook par exemple):

CREATE DATABASE synapse
 ENCODING 'UTF8'
 LC_COLLATE='C'
 LC_CTYPE='C'
 template=template0
OWNER synapse;

CREATE USER mautrixfacebook WITH ENCRYPTED PASSWORD '<mautrixfb-password>';
CREATE DATABASE mautrixfacebook
 ENCODING 'UTF8'
 LC_COLLATE='C'
 LC_CTYPE='C'
 template=template0
OWNER mautrixfacebook;

Service synapse

Une fois que tout est préparé, nous pouvons déployer la stack sur portainer:

Aller dans les logs du containers matrix et attendre que le message suivant s'affiche:

Config file '/data/homeserver.yaml' already exists. Generating any missing config files.

Comment aller dans les logs:

Une fois que ce message est affiché, éteindre la stack.

Une fois la stack éteinte, aller sur le serveur avec une connexion SSH par exemple. Ouvrir le fichier de configuration du serveur synapse qui se trouve dans le volume monté:

vim /var/lib/docker/volumes/matrix_matrix/_data/homeserver.yaml

Ce fichier est très bien documenté et très complet. Cependant, des valeurs sont à vérifier:

  • server_name: "<matrix url desired>"
  • enable_registration: false

Aussi, il faut configurer la connexion à la base de données. Pour cela, commenter les lignes pour sqlite3 et ajouter postgresql:

database:
#  name: sqlite3
#  args:
#    database: /data/homeserver.db

 name: psycopg2
 txn_limit: 10000
 args:
   user: synapse
   password: <synapse_pasword>
   database: synapse
   host: postgres
   port: 5432
   cp_min: 5
   cp_max: 10

Service postgreql

Ici, nous allons autoriser ces saloperies de connexions venant de 'l'exterieur' représentées par les autres conteneurs.

vim /var/lib/docker/volumes/matrix_postgres/_data/pg_hba.conf

A la fin de ce fichier, ajouter la ligne:

host    all             all             all                     scram-sha-256

avant:

local   all             all                                     scram-sha-256

Ensuite, ouvrir le fichier postgresql.conf:

vim /var/lib/docker/volumes/matrix_postgres/_data/postgresql.conf

et dé-commenter la ligne listen_address:

listen_addresses = '0.0.0.0'

Lancement

Une fois tous ces changements faits, il est faut encore modifier la stack afin que le serveur synapse soit lancé et arrête d'essayer de regénerer les fichiers de configuration. Aussi, il est possible de supprimer le volume _init.sql _ qui n'est plus utile pour le conteneur postgres.

version: "2.3"

networks:
  matrix:
    external: false

  volumes:
    matrix:
      driver: local
    postgreql:
      driver: local

  services:
    synapse:
      image: matrixdotorg/synapse
      container_name: matrix
      restart: always
      networks:
        - matrix
      ports:
        - 127.0.0.1:8008:8008
      volumes:
        - matrix:/data
      environment:
        - TZ=Europe/Paris

  postgres:
    image: postgres:alpine
    restart: always
    container_name: postgres
    networks:
      - matrix
    volumes:
      - postgres:/var/lib/postgresql/data
    environment:
      - TZ=Europe/Paris
      - PGTZ=Europe/Paris
      - POSTGRES_INITDB_ARGS="--auth=scram-sha-256"
      - POSTGRES_HOST_AUTH_METHOD=scram-sha-256
      - POSTGRES_PASSWORD=<synapse_password>
      - POSTGRES_USER=synapse

Aussi, synapse possède un health check ce qui permet de vérifier que le conteneur tourne bien. Si au bout de 10 minutes, le conteneur n'affiche pas healthy, alors regarder les logs afin de trouver le problème.

Mise en ligne

Nginx

Il faudra un serveur proxy pour pouvoir atteindre le serveur synapse. En effet, la stack n'expose pour l'instant que le port 8008 sur localhost.

Pour cela, il y a le tutoriel Saloperie de NGINX.

Pour ma part, j'ai utilisé cette configuration:

server {
    listen 8080;
    listen [::]:8080;

    server_name <domain>;

    # enforce https
    return 301 https://$host:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen 8448 ssl http2; # For federation purpose

    server_name <domain>;

    ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;

    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;

    access_log            /var/log/nginx/matrix.access.log;


    client_max_body_size 128M;

    location ~* ^(\/_matrix|\/_synapse\/client) {
        proxy_set_header Host $host;
        proxy_set_header   X-Real-IP          $remote_addr;
        proxy_set_header   X-Forwarded-Proto  $scheme;
        proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;

        proxy_pass http://127.0.0.1:8008;
    }
}

Firewall

Afin que le serveur matrix soit accessible depuis l'exterieur, il faut que les règles de firewall laissent passer le port 8448 et 443 (optionnelement 80).

Le port 8448 sert à la fédération des serveurs et le port 443 est le port d'accès au serveur.

Par exemple, avec iptables, il faut utiliser ces règles:

iptables -I INPUT 1 -p tcp --dport 8448 -j ACCEPT -m comment --comment "Federation for matrix"
iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT -m comment --comment "WebServeur HTTPS"
#iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT -m comment --comment "WebServeur HTTP"

Serveur DNS

Afin de pouvoir bien fédérer le serveur matrix, il faut aussi ajouter un enregistrement DNS de type SRV:

_matrix._tcp.<domain> IN SRV 10 0 8448 <domain>

il est possible de vérifier que l'enregistrement fonctionne à l'aide de la commande:

nslookup -q=SRV _matrix._tcp.<domain>

Vérifier la fédération

Il est possible de vérifier que le serveur synapse est bien fédéré à l'aide du site federation tester.

Connexion à Matrix

Afin de se connecter à un serveur matrix, il faut utiliser un client. Le client le plus utilisé est element. Il existe un client web ou alors, selon la distribution utilisée ou l'OS utilisé, une application. Plus d'information ici.

Une fois l'application lancée, il faut modifier le homeserver de matrix.org vers votre domaine.

Ensuite, il suffit de créer un compte et ensuite de s'y connecter afin d'avoir accès au serveur matrix.

Attention

Suite à la création du compte utilisateur, il est suggéré de supprimer la possibilité de pouvoir créer un compte. Pour cela, il suffit d'éteindre la stack, modifier le fichier homeserver.yaml et changer la ligne éditée au début de ce tutoriel:

enable_registration: false

Principe

Par ce salop de Croco et corrigé par ce salop de fl0w5

Matrix permet de réaliser des bridges afin de centraliser tous les messages de certaines applications sur une simple application. Ainsi, il est possible de mettre en place un bot qui récupérera tous les messages de Facebook messenger et vous permettra, depuis le client Element, de recevoir, et envoyer de smessages, réagir aux messages et supprimer des messages. Il sera aussi possible de créer de nouvelles conversations avec d'autres utilisateurs Facebook. Cela sera transparent pour vous et pour eux.

Installation

Pour commencer, éteindre la stack matrix afin de pouvoir la modifier sereinement. Ensuite, l'éditer et ajouter ceci:

# ...

volumes:
  # ...
  mautrix-fb:
    driver: local

services:

 # ...

  mautrix-facebook:
  container_name: mautrix-facebook
  image: dock.mau.dev/mautrix/facebook
  restart: unless-stopped
  networks:
    - matrix
  depends_on:
    - synapse
  volumes:
    - mautrix-fb:/data
  environment:
    - TZ=Europe/Paris

Ce simple service va pouvoir créer les fichiers de configuration qu'il faudra éditer par la suite. Attendre une minute suite au lancement de la stack et l'éteindre afin de pouvoir modifier le fichier de configuration de mautrix-facebook.

Configuration

Ouvrir le fichier de configuration de mautrix-facebook qui est dans le volume mautrix-fb d'après la stack:

vim /var/lib/docker/volumes/matrix_mautrix-fb/_data/config.yaml

Dans ce fichier, il faudra modifier différentes parties:

  • Tout d'abord, il faut préciser les informations de notre serveur synapse:
homeserver:
#...
    address: http://synapse:8008
    domain: <domain>
#...
  • Ensuite, il faut mettre à jour la base de données que le bridge va utiliser. Le mot de passe <mautrixfb-password> est celui utilisé lors de la création de la base de données mautrix-fb dans le init.db ou alors il faudra créer une base de données avec ENCODING 'UTF8', LC_COLLATE='C' et LC_CTYPE='C'. Voici comment enregistrer la base de données pour le bot.
appservice:
    #...
    database: postgres://mautrixfacebook:<mautrixfb-password>@postgres:5432/mautrixfacebook
    #...
  • Enfin, il faut configurer les différents utilisateurs qui auront accès au bot. Ainsi, selon l'utilisateur créé lors de l'étape précédente:
bridge:
    #...
    permissions:
            '@<user>:<domain>': <admin/user>
    #...

Ici le <admin/user> est un choix à faire. Dans tous les cas, le bot marchera. Cependant, l'administrateur aura le droit de changer certains paramètres du bot (il n'est pas obligé d'avoir un compte admin pour le bon fonctionnement du bridge). Il est possible de rajouter autant d'utilisateurs et/ou d'admin que désiré mais un utilisateur doit être soit administrateur soit utilisateur. Les deux ne sont pas possibles.

Suite à cela, il faudra redémarrer la stack matrix, attendre une minute et l'éteindre à nouveau. En effet, mautrix-fb va nous créer un nouveau fichier de configuration prenant en compte nos changements dans le fichier config.yaml. A chaque changement de ce fichier, il faudra re-réaliser ces étapes.

Un nouveau fichier sera donc créé dans le volume mautrix-fb nommé registration.yaml. Il faudra alors le copier dans le volume monté de matrix:

cp /var/lib/docker/volumes/matrix_mautrix-fb/_data/registration.yaml /var/lib/docker/volumes/matrix_matrix/_data/mautrix-facebook-registration.yaml

Le changement du nom du fichier est arbitraire. En effet, nous allons surement installer d'autres bots donc nous allons avoir un fichier registration.yaml par bot.

Ensuite il faut éditer le fichier de configuration matrix homeserver.yaml afin d'ajouter le bot:

app_service_config_files:
  #...
  - /data/mautrix-facebook-registration.yaml

Il est alors possible de redémarrer la stack sur portainer. Cela peut prendre plusieurs minutes le temps de bien configurer la base de données pour le bot et d'enregistrer le bot dans le serveur synapse.

Création du bridge

Maintenant que le bot est contactable sur le serveur synapse, il faut configurer le bridge avec son compte messenger. Seulement les comptes renseignés comme user ou admin pourront communiquer avec l bot.

Sur Element, créer un nouvel espace afin de pouvoir inviter le bot facebook dessus:

Aller dans la room, inviter un utilisateur et saisir le nom d'utilisateur du bot:

@facebookbot:<domain>

Ensuite, ouvrir une conversation privée avec lui et à l'aide de la commande help vous aurez l'ensemble des commandes disponibles.

Pour vous connecter, il suffit de lui envoyer login et ensuite de suivre les instructions envoyées par le bot:

Et voila cette saloperie de bot va importer vos dernières discussions messenger (1:1 et de groupe) et il vous sera possible d'utiliser la commande search avec le bot pour ajouter des disucssions. Aussi, si une personne vous contacte, une nouvelle room sera créée afin de pouvoir discuter avec la personne.

Virtul Private Network

Un VPN (Virtual Private Network) est une technoligie qui permet d'établir des connexions point à point entre plusieurs réseaux locaux distants.

Cette technologie peut être utilisée à plusieurs fins :

  • Changer son IP publique et sa localisation aux yoeux du monde
  • Mettre en place du télétravail et simulé le fait d'être sur le réseau d'une entreprise

Contrairement à ce que certaines entreprises essaient de faire croire, un VPN n'est pas obligatoirement chiffré et n'a pas pour but premier de protéger des données de navigation. De plus, ces entreprises peuvent proposer des prix si bas car elles collectent les données utilisateurs et les revendent (amusant, pour une entreprise qui vous "protège" du vol de données).

Il existe plusieurs implémentations d'un VPN :

  • IPsec (Internet Protocol Security, par l'IETF)
  • SSL/TLS (OpenVPN)
  • DTLS (Cisco)
  • MPPE (Microsoft Point-to-Point Encryption)
  • SSTP (Microsoft Secure Socket Tunneling Protocol)
  • Secure Shell VPN
  • Wireguard

Il est important de noter que l'ANSSI recommande IPsec. En effet, d'un point de vue sécurité, IPsec est bien plus robuste.

Recommandations sur le nomadisme numérique de l'ANSSI

OpenVPN

Par ce salop de FanfanlaTulipe, avec les conseils de ce salop de Kuro

VPN SSL/TLS avec OpenVPN

Installation

Toutes les commandes concernant l'installation et la configuration du serveur OpenVPN seront faites sous Debian pour ce guide.

Nous utiliserons un script d'installation pour la génération du la configuration et l'installation des paquets :

wget https://git.io/vpn -O openvpn-install.sh   # Vous pouvez ouvrir le fichier pour vérifier son contenu.
sudo bash openvpn-install.sh

Le script installation va se dérouler. Nous ne ferrons que des recommandations concernant la configuration (les recommandations sont précédées d'un #) :

Welcome to this OpenVPN road warrior installer!

Which protocol should OpenVPN use?
   1) UDP (recommended)
   2) TCP
Protocol [1]: 1
# La plupart des VPN fonctionnent avec UDP, c'est plus rapide.

What port should OpenVPN listen to?
Port [1194]:
# On laisse le port par défaut, nous protègerons nos connexions avec des clés RSA.

Select a DNS server for the clients:
   1) Current system resolvers
   2) Google
   3) 1.1.1.1
   4) OpenDNS
   5) Quad9
   6) AdGuard
DNS server [1]: 3
# Simple choix personnel

Enter a name for the first client:
Name [client]: saloperie

OpenVPN installation is ready to begin.

...

Le script a créé le serveur, sa configuration (ainsi que toute la PKI et les règles iptables) et a lancé le service (gestion des services visibles ici).

Le script a également généré un fichier de configuration pour le premier utilisateur, ici saloperie. Le fichier se trouve normalement dans /root sous le nom saloperie.ovpn. Cependant, pour le trouver, faites :

sudo find / -type f -name "*.ovpn"

Vous pouvez maintenant extraire le fichier (avec scp par exemple) et le mettre sur votre machine cliente.

Ajout et Suppression de client

Pour créer/supprimer un client, relancer le script en tant que root et il vous donnera la possibilité de :

  • Créer un nouveau client
  • Supprimer un client existant
  • Désinstaller OpenVPN

GitHub à la base ce script

Client OpenVPN sous Linux

Les manipulations concernant le client seront faite sous Arch Linux.

Tout d'abord, il est nécessaire d'installer OpenVPN :

yay -S openvpn

Dans le cas d'Arch Linux et si vous utilisez NetworkManager, il est conseillé d'installer le paquet NetworkManager-openvpn

yay -S networkmanager-openvpn

Ensuite, après avoir extrait le fichier de configuration sur votre machine (ici saloperie.ovpn), mettez le dans le répertoire suivant /etc/openvpn/client/ afin de ranger le client correctement.

Tester votre VPN

Vous pouvez ensuite tester votre connexion VPN avec un terminal en entrant :

sudo openvpn --client --config /etc/openvpn/client/saloperie.ovpn

Vous pouvez ensuite allez par exemple sur <myip.wtf> pour voir où Internet pense que vous êtes.

nm-connection-editor

networkmanager-openvpn est requis.

Vous pouvez utiliser votre VPN uniquement avec la ligne de commande donnée plus haut mais il existe des alternatives plus "user-friendly".

nm-connection-editor est une alternative interressante pour NetworkManager. Il permet d'activer/désactiver la connexion en un clic.

Wireguard

Par ce salop de FanfanlaTulipe, sur la base d'un tutoriel de ses amis anonymes

Wireguard est un protocole de communication et un logiciel open source permettant de créer un VPN. Il a été conçu avec des objectifs de simplicité, de performance et de robustesse d'un point de vue sécurité. D'après la plupart des études, il est plus performant qu'IPsec et OpenVPN.

D'un point de vue cryptographique, Wireguard utilise :

Pour la suite de ce guide, l'appareil qui fait office de serveur sera sous Debian et le client sous Arch Linux.

Installation

Serveur

sudo apt install wireguard wireguard-tools

Client

yay -S wireguard wireguard-tools

Configuration

Ce système étant basé sur un biclé pour l'authentification, nous allons généré sur les deux machines un couple clé publique/privée.

umask 0077
wg genkey > private
wg pubkey < private > public

Pour les deux machines, il faudra créer un fichier de configuration, nous le mettrons dans /etc/wireguard/wg0.conf.

De plus, il faut choisir un bloc d'adresses privées (RFC 1918) pour choisir les deux IPv4 de nos machines. Nous utiliserons le bloc 192.168.66.0/24 ainsi que les adresses 192.168.66.1 pour le serveur et 192.168.66.10 pour le client.

Notes du Kuro décoiffé
Il peut être judicieux d'utiliser un bloc 100.64.0.0/10, afin d'avoir des IPs 'privées' sans collision avec les blocs RFC 1918. En effet, ce bloc n'est utilisé que par les opérateurs et n'est pas accessible sur Internet (RFC 6598).

Enfin, vous devrez choisir un port d'écoute pour le serveur. Il n'y a de port particulié à choisir, essayer simplement de prendre un port élevé pour éviter un scan Shodan.

Côté Serveur

[Interface]
Address = 192.168.66.1/24               # IP du serveur
PrivateKey = <clé privée du serveur>
ListenPort = <port d'écoute>
DNS = 1.1.1.1                           # Optionnel
SaveConfig = true                       # Optionnel, permet d'enregistrer dans ce fichier les modifications faites à la volée.
PostUp = /sbin/sysctl -w net.ipv4.ip_forward=1
PostUp = /sbin/sysctl -w net.ipv6.conf.all.forwarding=1
PostUp = /sbin/iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = /sbin/iptables -A FORWARD -o wg0 -j ACCEPT
PostUp = /sbin/iptables -t nat -A POSTROUTING -o <interface_de_sortie> -j MASQUERADE
PostDown = /sbin/iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = /sbin/iptables -D FORWARD -o wg0 -j ACCEPT
PostDown = /sbin/iptables -t nat -D POSTROUTING -o <interface_de_sortie> -j MASQUERADE

[Peer]                                  # Votre client
PublicKey = <clé publique du client>
AllowedIPs = 192.168.66.10/32           # IPs autorisées à utiliser ce serveur

Pensez à rendre ce fichier lisible uniquement par root, pour éviter la fuite de la clé privée du serveur.

Si vous utilisez un pare-feu, pensez à le mettre en jour en conséquence :

iptables -A INPUT -p udp --dport <port d'écoute> -m conntrack --ctstate NEW,ESTABLISHED,RELATED -m comment --comment Wireguard -j ACCEPT

Côté Client

[Interface]
Address = 192.168.66.10/32              # IP du client
PrivateKey = <clé privée du client>
DNS = 1.1.1.1                           # Optionel, mais recommandé pour ne pas faire fuiter l'adresse dans une requête DNS

[Peer]                                  # Le serveur
PublicKey = <clé publique du serveur>
Endpoint = <ip publique du serveur>
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepAlive = 30                # Optionnel, envoi de donnée périodique pour maintenir la session ouverte

De même, pensez à rendre ce fichier lisible uniquement par root.

Mise en place du tunnel

Pour activer le tunnel, exécuter la commande suivante sur les deux machines :

wg-quick up wg0

Vous pouvez voir le status du tunnel avec :

wg show

Vous pouvez vérifier que votre IP et votre localisation sont masquées avec les sites suivants :

Clé USB Chiffrée

Nous allons voir ici comment faire une clé USB chiffrée pour transporter vos données. En cas de perte ou de vol, les données stockées seront illisibles.

Cette clé sera utilisable sous Linux et Windows, avec une dépendance à Veracrypt pour Windows.

Création de la clé chiffrée

Nous créerons la clé sous Windows avec Veracrypt.

Nous n'aborderons pas l'installation de Veracrypt ici.
Téléchargement de Veracrypt pour Windows

Une fois Veracrypt installé, lancer le et cliquer sur Create Volume.

Sélectionner Create an encrypted file container et cliquer sur Next >.

Sélectionner Standard VeraCrypt volume et cliquer sur Next >.

Cliquer sur Select Device....

Sélectionner votre clé et cliquer sur OK.

Cliquer sur Next >.

Sélectionner Create encrypted volume and format it puis cliquer sur Next >.

Changer les algorithmes utilisés si vous le souhaitez et cliquer sur Next >.

Cliquer sur Next >.

Entrer votre mot de passe et cliquer sur Next >.

Choisir si vous comptez stocker des fichiers de plus de 4 Go et cliquer sur Next >.

Bouger votre souris de manière aléatoire pour générer un nombre aléatoire, sélectionner ou non le Quick Format et cliquer sur Format.

TOUS LES FICHIERS PRESENTS SUR LA CLE SERONT PERDUS.

Félicitations, votre clé est chiffrée.

Cliquer sur Exit.

Utilisation de la clé chiffrée sous Windows

Ouvrir la clé

Sous Windows, nous sommes dépendant de VeraCrypt pour déchiffrer la clé. Une fois la clé branchée, aller sur VeraCrypt et cliquer sur Select Device....

Sélectionner votre partition et cliquer sur OK.

Sélectionner un label de disque et cliquer sur Mount.

Entrer votre mot de passe et cliquer sur OK.

Si aucune erreur ne s'est produite, vous trouverez le volume monté dans votre explorateur de fichier.

Fermer la clé

Pour éjecter la clé, il faut d'abord la démonter. Pour cela, sur VeraCrypt, sélectionner la clé et cliquer sur Dismount.

Vous pouvez éjecter la clé de manière classique.

Utilisation de la clé chiffrée sous Linux

Ouvrir la clé

Sous Linux, l'utilisation de la clé est bien plus simple. Après avoir branché la clé, il suffit d'ouvrir la clé avec cryptsetup :

cryptsetup --type tcrypt open <volume-path> <name>

Avec fdisk -l, on trouve le chemin du volume, ici /dev/sda1 :

Disk /dev/sda: 57.3 GiB, 61530439680 bytes, 120176640 sectors
Disk model:  SanDisk 3.2Gen1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8a879de4

Device     Boot Start       End   Sectors  Size Id Type
/dev/sda1        2048 120174591 120172544 57.3G  7 HPFS/NTFS/exFAT

On va donc ouvrir la clé avec :

cryptsetup --type tcrypt open /dev/sda1 my-key

On vous demandera le mot de passe de la clé également.

Vous pouvez ensuite monter de manière classique le volume qui sera dans /dev/mapper/, dans notre cas /dev/mapper/my-key :

udisksctl mount -b "/dev/mapper/my-key"

Fermer la clé

Démonter la clé de manière classique :

udisksctl unmount -b "/dev/mapper/my-key"

Ensuite, on va fermer la clé avec cryptsetup :

cryptsetup --type tcrypt close /dev/mapper/my-key

Vous pouvez enfin retirer la clé.

Script

Personnelement, j'utilise udisksctl pour monter et démonter mes clés. Cependant, vous pouvez utiliser mount.

J'ai donc fais des scripts placés dans /usr/local/bin/ :

vim /usr/local/bin/cryptopen
#!/usr/bin/sh

set -e

if [ $# -lt 1 ]; then
    echo "usage: cryptopen <device>"
    exit 0
fi

if [ $(id -u) -eq 0 ]; then
	echo "Dont be root please"
	exit 1
fi

RAND=$(echo $RANDOM | md5sum | head -c 20)
NAME="encrypted-device-$RAND"

sudo cryptsetup --type tcrypt open $1 "$NAME"

udisksctl mount -b "/dev/mapper/$NAME"
vim /usr/local/bin/cryptclose
#!/usr/bin/sh

set -e

if [ $# -lt 1 ];then
    echo "usage: cryptclose <device>"
    exit 0
fi

if [ $(id -u) -eq 0 ]; then
	echo "Dont be root please"
	exit 1
fi

udisksctl unmount -b $1

sudo cryptsetup --type tcrypt close $1

Saloperie de Mentions Légales

Ce site est utilisé à titre non professionel.

Site hébergé par OVH SAS :
2 rue Kellermann
59100 Roubaix
France

Hébergement du domaine

Gandi SAS
63, 65 Boulevard Massena
75013 Paris
France
Tel : +33170377661

Licence

Ce site est sous licence Beer-ware.

THE BEER-WARE LICENSE (Revision 42) :

As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy us a beer in return.

Poul-Henning Kamp