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>
Hyperlink
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 title1 | cell title 2 |
---|---|
A | B |
C | D |
Footnotes
In the text I place [^1] a footnotes \
[^1]: this is a footnote
In the text I place 1 a footnotes
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.
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.
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.
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 toucheCapture 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, etip6tables
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 :
- RFC 4252 - Protocole d'authentification du client
- RFC 4253 - Protocole d'authentification sécurisé du serveur et établissement d'un canal de communication sécurisé
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.
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 :
- Recommandations sur la portection des systèmes d'information essentiels
- Recommandations relatives à l'administration sécurisée des systèmes d'information
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.
Plusieurs fichiers sont intéressants concernant le service bind9 :
named.conf
et ses dérivés (named.conf.local
etnamed.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 zonenotify
: 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 listealso-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.
- Installation d'un Dualboot Windows 10 / Arch Linux chiffré
- Network Manager, outil de gestion des réseaux
- Yet Another Yogurt, excellent gestionnaire de paquet
- Zsh, meilleur shell
- i3, best window manager ever
- Multi-écran
- Système de notification
- Systemd
- Optimisation de la durée de vie de la batterie
- Luminosité de l'écran
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.
- Installation d'un Dualboot Windows 10 / Arch Linux chiffré
- Network Manager, outil de gestion des réseaux
- Yet Another Yogurt, excellent gestionnaire de paquet
- Zsh, meilleur shell
- i3, best window manager ever
- Multi-écran
- Système de notification
- Systemd
- Optimisation de la durée de vie de la batterie
- Luminosité de l'écran
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 partition | Point de montage | Partition | Taille suggérée |
---|---|---|---|
boot | /boot | /dev/nvme0n1p5 | 512 Mo |
root | / | /dev/nvme0n1p6 | >= 50 Go |
home | /home | /dev/nvme0n1p7 | Le 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 partition Point de montage Taille 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 noyaulinux-firmware
ou 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
, ajouterdiscard
aprèsluks
:
crypt_hdd UUID=4517ff0f-deab-4564-90ca-e4f4947b8ca3 /root/keyfile luks discards
- dans
/mnt/etc/lvm/lvm.conf
, activerissue_discards
. (S'il n'existe pas, copier/etc/lvm/lvm.conf
d'abord) systemctl enable fstrim.service
etsystemctl 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
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écisantGRUB_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 lignesavedefault
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
Gestion de la résolution et du multi-écran
xrandr
Nous utiliserons xrandr
pour gérer l'affichage via un terminal.
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.
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
Action | Commande |
---|---|
Reboot | systemctl reboot |
Eteindre (avec les scripts d'arret) | systemctl shutdown |
Eteindre (sans les scripts d'arret) | systemctl poweroff |
Mettre en veille | systemctl suspend |
Mettre en hibernation | systemctl 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 :
Les commandes suivantes sont à connaitre concernant les services :
Action | Commande |
---|---|
Voir l'état d'un service | systemctl status service |
Lancer un service | systemctl start service |
Arrêter un service | systemctl stop service |
Relancer un service | systemctl restart service |
Recharger un service | systemctl reload service |
Lancer un serice au démarrage | systemctl enable service |
Ne pas lancer un service au démarrage | systemctl disable service |
Masque un service | systemctl mask service |
Démasque un service | systemctl 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 :
dbhome
: le chemin vers la base de données de squidguard ;logdir
: le chemin vers le dossier des journaux ;dest
: définit les accès interdits et vers quel site rediriger les utilisateurs qui y accèdent ;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.
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
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 dansjail.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 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.
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 :
- Curve25519 pour l'échange de clé
- ChaCha20 pour la cryptographie symétrique
- Poly1305 pour le code d'authentification de message
- SipHash pour les tables de hachage
- BLAKE2s pour les fonctions de hachages
- UDP pour des échanges plus rapides
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 bloc100.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