https://doc.ycharbi.fr/api.php?action=feedcontributions&user=Ycharbi&feedformat=atomWiki doc - Contributions [fr]2024-03-29T05:10:55ZContributionsMediaWiki 1.40.0https://doc.ycharbi.fr/index.php?title=Matrix_synapse&diff=1517Matrix synapse2024-03-24T11:17:19Z<p>Ycharbi : Ajout de la section "Réinitialisation de mot de passe"</p>
<hr />
<div>[[Category:Service_communication]]<br />
<br />
{{chantier}}<br />
<br />
[https://github.com/matrix-org/synapse/ Synapse] est une implémentation serveur libre (licence ''Apache 2.0'') du protocole [https://fr.wikipedia.org/wiki/Matrix_(protocole) Matrix] écrit en ''Python''. Le projet, initié en 2014, est maintenu par la fondation [https://matrix.org Matrix.org] et passe en version stable (''1.0.0'') en 2019. Il est disponible dans les dépôts ''Bullseye-Backports'' et ''Testing'' de ''Debian''.<br />
<br />
Il permet la communication électronique textuelle, orale et vidéo entre plusieurs interlocuteurs au travers de réseaux ''IP''. Il propose en outre la possibilité d'envoyer des fichiers et de partager les écrans des correspondants. Une attention toute particulière est porté sur la sécurité des échanges avec un système de chiffrement de bout en bout obligatoire, tant entre clients (pair à pair) que lors de transactions avec le serveur (client/serveur).<br />
<br />
Il est nécessaire de permettre la communication vers les ports suivants :<br />
* Fédération ''Synapse'' : 8448 ''TCP''<br />
* ''TURN'' : 3478 ''TCP/UDP''<br />
<br />
=Service Synapse=<br />
==Installation==<br />
Ajout des dépôts ''Backports'' pour ''Debian 11''<br />
<br />
<syntaxhighlight lang="bash"><br />
echo "deb http://ftp2.fr.debian.org/debian bullseye-backports main" >> /etc/apt/sources.list<br />
apt update<br />
apt install --no-install-recommends -t bullseye-backports matrix-synapse<br />
</syntaxhighlight><br />
<br />
La réponse aux questions n'a pas d'importance car les fichiers de configuration seront re-générés plus loin.<br />
<br />
==Configuration==<br />
Le domaine utilisé pour l'exemple est le suivant<br />
export DNS_SYNAPSE=synapse.exemple.fr<br />
<br />
Génération des fichiers configuration et de la clé de signature<br />
<br />
<syntaxhighlight lang="bash"><br />
synapse_generate_config --server-name ${DNS_SYNAPSE} --config-dir /etc/matrix-synapse --data-dir /etc/matrix-synapse/ --report-stats no --generate-secrets -o /etc/matrix-synapse/homeserver.yaml<br />
synapse_generate_log_config -o /etc/matrix-synapse/${DNS_SYNAPSE}.log.config<br />
synapse_generate_signing_key -o /etc/matrix-synapse/${DNS_SYNAPSE}.signing.key<br />
<br />
echo 'report_stats: false' > /etc/matrix-synapse/conf.d/report_stats.yaml<br />
echo "server_name: \"${DNS_SYNAPSE}\"" > /etc/matrix-synapse/conf.d/server_name.yaml<br />
</syntaxhighlight><br />
<br />
Écouter les requêtes clientes sur toutes les adresses ''IP'' du serveur<br />
sed -i "s/bind_addresses: \[.*\]/bind_addresses: ['0.0.0.0']/g" /etc/matrix-synapse/homeserver.yaml<br />
<br />
Redémarrer le service<br />
systemctl restart matrix-synapse.service<br />
<br />
Vous devriez voir un port 8008 ''TCP'' en écoute avec un <syntaxhighlight lang="bash" inline>ss -ltn</syntaxhighlight>. Celui-ci permet aux outils d'administrations d'utiliser les ''API'' de ''Synapse'' pour interagir avec lui.<br />
<br />
==Gestion des utilisateurs==<br />
Actuellement, seule la création d'un utilisateur est possible avec les outils fournis. Leur suppression ou modification (ou même leur listage) n'est pas supporté (oui c'est aberrant). Ce sujet est traité dans ce [https://github.com/matrix-org/synapse/issues/1707 ticket].<br />
<br />
La syntaxe d'un utilisateurs dans les différents clients ''Matrix'' est <syntaxhighlight lang="bash" inline>@michel:synapse.exemple.fr</syntaxhighlight>. Ceci est utile pour en ajouter comme contact depuis un logiciel client (pourquoi faire simple ?).<br />
<br />
===Création d'un utilisateur===<br />
synapse_register_new_matrix_user http://127.0.0.1:8008 -c /etc/matrix-synapse/homeserver.yaml<br />
<br />
===Source de la section===<br />
* https://matrix-org.github.io/synapse/latest/setup/installation.html<br />
<br />
=Service TURN=<br />
Dans la mesure où le vrai monde est peuplé de ''NAT'' à profusion et qu'aucun protocole de communication en temps réel ne sais gérer cette situation correctement (la raison m'échappe toujours...), il est indispensable d'employer un service mitigeant cette contrainte. Ceci est le rôle des protocoles [https://en.wikipedia.org/wiki/Traversal_Using_Relays_around_NAT TURN]/[https://en.wikipedia.org/wiki/STUN STUN] implémenté dans le logiciel [https://github.com/coturn/coturn Coturn].<br />
<br />
==Installation==<br />
Le paquet est disponible dans les dépôts ''Sable''<br />
apt install --no-install-recommends coturn<br />
<br />
==Configuration==<br />
Les informations spécifiques à l'instance de cette documentations seront les suivantes<br />
<br />
<syntaxhighlight lang="bash"><br />
export DNS_COTURN=turn.exemple.fr<br />
export SECRET_COTURN=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1)<br />
export IP_EXTERNE=$(wget -qO - ifconfig.co)<br />
export IP_INTERNE=192.168.0.100<br />
</syntaxhighlight><br />
<br />
Le fichier de configuration du service se composera comme suit<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << _EOF_ > /etc/turnserver.conf<br />
use-auth-secret<br />
static-auth-secret=${SECRET_COTURN}<br />
realm=${DNS_COTURN}<br />
<br />
# Le trafic VoIP est entièrement UDP. Il n'y a aucune raison de laisser les utilisateurs se connecter à des points d'extrémité TCP arbitraires via le relais<br />
no-tcp-relay<br />
<br />
# Ne laissez pas le relais essayer de se connecter à des plages d'adresses IP privées au sein de votre réseau (s'il y en a)<br />
# Étant donné que le serveur tournant est probablement derrière votre pare-feu, n'oubliez pas d'inclure également toutes les adresses IP publiques privilégiées<br />
denied-peer-ip=10.0.0.0-10.255.255.255<br />
denied-peer-ip=192.168.0.0-192.168.255.255<br />
denied-peer-ip=172.16.0.0-172.31.255.255<br />
<br />
# À recommandé, blocage de pairs locaux supplémentaires, afin de limiter l'accès externe aux services internes<br />
# https://www.rtcsec.com/article/slack-webrtc-turn-compromise-and-bug-bounty/#how-to-fix-an-open-turn-relay-to-address-this-vulnerability<br />
no-multicast-peers<br />
denied-peer-ip=0.0.0.0-0.255.255.255<br />
denied-peer-ip=100.64.0.0-100.127.255.255<br />
denied-peer-ip=127.0.0.0-127.255.255.255<br />
denied-peer-ip=169.254.0.0-169.254.255.255<br />
denied-peer-ip=192.0.0.0-192.0.0.255<br />
denied-peer-ip=192.0.2.0-192.0.2.255<br />
denied-peer-ip=192.88.99.0-192.88.99.255<br />
denied-peer-ip=198.18.0.0-198.19.255.255<br />
denied-peer-ip=198.51.100.0-198.51.100.255<br />
denied-peer-ip=203.0.113.0-203.0.113.255<br />
denied-peer-ip=240.0.0.0-255.255.255.255<br />
<br />
# Cas particulier : le serveur TURN lui-même pour que les flux client->TURN->TURN->client fonctionnent<br />
# Il doit s'agir de l'une des adresses IP d'écoute du serveur TURN<br />
allowed-peer-ip=${IP_INTERNE}<br />
<br />
# Examinez si vous souhaitez limiter le quota de flux relayés par utilisateur (ou total) pour éviter les risques de DoS<br />
user-quota=12 # 4 flux par appel vidéo, donc 12 flux = 3 appels relayés simultanés par utilisateur<br />
total-quota=1200<br />
<br />
# Certificats TLS, y compris les certificats intermédiaires<br />
# Pour les certificats Let's Encrypt, utilisez 'fullchain.pem' ici<br />
cert=/srv/tls/corturn.pem<br />
<br />
# Fichier TLS de clé privée<br />
pkey=/srv/tls/corturn.key<br />
<br />
# Assurez-vous que les lignes de configuration qui désactivent TLS/DTLS sont commentées ou supprimées.<br />
#no-tls<br />
#no-dtls<br />
<br />
external-ip=${IP_EXTERNE}<br />
listening-ip=${IP_INTERNE}<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
===Support du TLS===<br />
Créer le répertoire d'accueil des éléments de chiffrement<br />
mkdir /srv/tls<br />
<br />
Ces éléments peuvent être issus d'une autorité de certification publique comme [[Letsencrypt|Letsencrypt]] (mettre la clé et le certificat '''chaînés''') ou privée, via [[Openssl|OpenSSL]] par exemple.<br />
<br />
<syntaxhighlight lang="bash"><br />
chown -R root:root /srv/tls<br />
chmod 500 /srv/tls<br />
chmod 400 /srv/tls/*<br />
</syntaxhighlight><br />
<br />
Redémarrer le service<br />
systemctl restart coturn.service<br />
<br />
Le service écoute sur le port 3478 ''TCP/UDP''.<br />
<br />
Il est à présent possible de configurer ''Synapse'' afin qu'il informe les clients d'utiliser notre service ''TURN'' lors de l'établissement des communications pair à pair entre eux.<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << _EOF_ >> /etc/matrix-synapse/homeserver.yaml<br />
<br />
turn_uris: [ "turn:${DNS_COTURN}?transport=udp", "turn:${DNS_COTURN}?transport=tcp" ]<br />
turn_shared_secret: "${SECRET_COTURN}"<br />
turn_user_lifetime: 86400000<br />
turn_allow_guests: True<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
systemctl restart matrix-synapse.service<br />
<br />
==Enregistrement DNS==<br />
Cette section est totalement facultative et n'apporte rien. Il existe peut-être une configuration de ''Synapse'' permettant de trouver automatiquement le serveur ''TURN'' via ''DNS''...<br />
<br />
Enregistrements ''DNS SRV'' (à ajouter dans la configuration de votre zone)<br />
<br />
<syntaxhighlight lang="bash"><br />
_stun._udp 10800 IN SRV 0 5 3478 exemple.fr.<br />
_turn._udp 10800 IN SRV 0 5 3478 exemple.fr.<br />
</syntaxhighlight><br />
<br />
Il est possible de requêter le serveur de noms sur ces champs précis via les commandes suivantes<br />
<br />
<syntaxhighlight lang="bash"><br />
dig +short _stun._udp._tcp 10800 IN SRV 0 5 3478 exemple.fr.<br />
dig +short _turn._udp._tcp 10800 IN SRV 0 5 3478 exemple.fr.<br />
</syntaxhighlight><br />
<br />
==Test de fonctionnement==<br />
Voici une [https://nextcloud-talk.readthedocs.io/en/latest/TURN/#6-testing-the-turn-server méthode] permettant de tester le fonctionnement du service en ligne de commande. Elle peut aider à deceler des problèmes simplement.<br />
turnutils_uclient -p 3478 -W <CLÉ_SERVEUR_TURN> -v -y turn.exemple.fr<br />
<br />
==Source de la section==<br />
* https://matrix-org.github.io/synapse/latest/setup/turn/coturn.html<br />
<br />
=Client WEB Element=<br />
[https://github.com/vector-im/element-web Element] est un client WEB pour ''Matrix''. Anciennement connu sous le nom de ''Riot'', il existe aussi sous forme d'application ''IOS'' et ''Android''.<br />
<br />
==Installation==<br />
N'étant pas dans les dépôts ''Debian'', nous utiliserons la version ''Git''<br />
<br />
<syntaxhighlight lang="bash"><br />
apt install --no-install-recommends apache2<br />
<br />
wget https://github.com/vector-im/element-web/releases/download/v1.10.14/element-v1.10.14.tar.gz -P /tmp<br />
<br />
tar xf /tmp/element-v1.10.14.tar.gz -C /var/www/<br />
ln -s /var/www/element-v1.10.14/ /var/www/element<br />
chown -R www-data: /var/www/element*<br />
</syntaxhighlight><br />
<br />
==Configuration==<br />
L'hôte virtuel d{{'}}''Apache'' doit pointer vers le programme<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/apache2/sites-available/element.conf<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@localhost<br />
DocumentRoot /var/www/element<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
</VirtualHost><br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Désactivation de l'hôte virtuel par défaut et activation du nouveau<br />
<syntaxhighlight lang="bash"><br />
a2dissite 000-default.conf<br />
a2ensite element.conf<br />
</syntaxhighlight><br />
<br />
Le domaine utilisé sera le suivant<br />
export DNS_ELEMENT=element.exemple.fr<br />
<br />
La configuration de notre instance sera celle-ci<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << _EOF_ > /var/www/element/config.json<br />
{<br />
"default_server_config": {<br />
"m.homeserver": {<br />
"base_url": "https://${DNS_SYNAPSE}",<br />
"server_name": "${DNS_SYNAPSE}"<br />
},<br />
"m.identity_server": {<br />
"base_url": "https://vector.im"<br />
}<br />
},<br />
"disable_custom_urls": false,<br />
"disable_guests": false,<br />
"disable_login_language_selector": false,<br />
"disable_3pid_login": false,<br />
"brand": "Element",<br />
"bug_report_endpoint_url": "https://element.io/bugreports/submit",<br />
"uisi_autorageshake_app": "element-auto-uisi",<br />
"default_country_code": "FR",<br />
"show_labs_settings": false,<br />
"features": { },<br />
"default_federate": false,<br />
"default_theme": "light",<br />
"enable_presence_by_hs_url": {<br />
"https://matrix.org": false,<br />
"https://matrix-client.matrix.org": false<br />
},<br />
"setting_defaults": {<br />
"breadcrumbs": true<br />
},<br />
"features": {<br />
"feature_you_want_to_turn_on": true,<br />
"feature_you_want_to_keep_off": false<br />
}<br />
}<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Redémarrer ''Apache''<br />
systemctl restart apache2.service<br />
<br />
==Source==<br />
* https://github.com/vector-im/element-web/tree/develop/docs<br />
<br />
=Fédération=<br />
Un des atouts de cette solution est la décentralisation. En effet, il est possible d'interconnecter plusieurs serveurs afin de permettre la communication d'utilisateurs enregistrés sur des instances différentes. Ces interconnexions doivent êtres explicitement spécifiées dans la configuration de ''Synapse''.<br />
<br />
Le domaine du serveur distant sera le suivant<br />
export DNS_SRV_DISTANT_SYNAPSE=synapse.toto.fr<br />
<br />
Ajout de celui-ci dans la configuration de ''Synapse'' (ceci doit être fait des deux côtés)<br />
<br />
<syntaxhighlight lang="bash"><br />
sed -i "s/^trusted_key_servers:/trusted_key_servers:\n - server_name: \"${DNS_SRV_DISTANT_SYNAPSE}\"/g" /etc/matrix-synapse/homeserver.yaml<br />
sed -i "s/^#federation_domain_whitelist:/federation_domain_whitelist:\n - ${DNS_SRV_DISTANT_SYNAPSE}/g" /etc/matrix-synapse/homeserver.yaml<br />
</syntaxhighlight><br />
<br />
systemctl restart matrix-synapse.service<br />
<br />
=Cas d'une connexion mandaté=<br />
Dans la mesure où il est courant qu'un serveur ne soit jamais relié directement à Internet (comprendre par la qu'il ne dispose pas d'IP publique), le cas d'un [[:Category:Reverse_proxy|mandataire inverse]] officiant entre les clients du ''WAN'' et le serveur ''Element'' du ''LAN'' est le plus probable. Ce point complique la transparence des échanges entre les machines et doit être géré au niveau de cet intermédiaire. Deux services ont étés testés en production avec succès. Leur configuration est donnée ci-après.<br />
<br />
==Traefik==<br />
Ajout d'un point d'entrer dans Traefik pour le port 8448<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << _EOF_ >> /etc/traefik/config/vhosts/matrix.toml<br />
[http]<br />
[http.routers]<br />
[http.routers.synapse]<br />
entryPoints = ["websecure"]<br />
rule = "Host(\`${DNS_SYNAPSE}\`)"<br />
service = "synapse"<br />
[http.routers.synapse.tls]<br />
certResolver = "myresolver"<br />
<br />
[http.routers.element]<br />
entryPoints = ["websecure"]<br />
rule = "Host(\`${DNS_ELEMENT}\`)"<br />
service = "element"<br />
[http.routers.element.tls]<br />
certResolver = "myresolver"<br />
<br />
[http.routers.synapsefed]<br />
entryPoints = ["synapsefed"]<br />
rule = "Host(\`${DNS_SYNAPSE}\`)"<br />
service = "synapse"<br />
[http.routers.synapsefed.tls]<br />
certResolver = "myresolver"<br />
<br />
[http.services]<br />
[http.services.synapse.loadBalancer]<br />
[[http.services.synapse.loadBalancer.servers]]<br />
url = "http://${IP_INTERNE}:8008"<br />
[http.services.element.loadBalancer]<br />
[[http.services.element.loadBalancer.servers]]<br />
url = "http://${IP_INTERNE}:80"<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
==HAProxy==<br />
<syntaxhighlight lang="bash"><br />
cat << _EOF_ >> /etc/haproxy/haproxy.cfg<br />
frontend matrix-federation<br />
bind *:8448,[::]:8448 ssl crt /etc/haproxy/tls/ alpn h2,http/1.1<br />
http-request set-header X-Forwarded-Proto https if { ssl_fc }<br />
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }<br />
http-request set-header X-Forwarded-For %[src]<br />
default_backend synapse<br />
<br />
frontend https<br />
http-response add-header X-Frame-Options SAMEORIGIN<br />
<br />
bind :443 ssl crt /etc/haproxy/tls/ alpn h2,http/1.1<br />
<br />
acl host_synapse hdr(host) -i synapse.exemple.fr<br />
<br />
use_backend synapse if host_synapse<br />
<br />
<backend synapse<br />
option forwardfor except 127.0.0.1<br />
option http-server-close<br />
server synapse 192.168.170.178:8008 check maxconn 32<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
=Débogage=<br />
La configuration de ''Synapse'' est quelque peu imbuvable et les problèmes, difficiles à corriger. Il est possible de s'appuyer sur les journaux du service afin de cibler l'origine des disfonctionnements.<br />
tail -f /var/log/matrix-synapse/homeserver.log<br />
<br />
Un outil permettant de determiner les caractéristiques du serveur est disponible à l'adresse https://federationtester.matrix.org/. Il peut s'avérer d'une aide précisieuse (surtout le rapport ''Json'').<br />
<br />
=Réinitialisation de mot de passe=<br />
Aussi étrange que cela puisse parraitre, il n'existe pas de fonction pour réinitialiser le mot de passe d'un utilisateur (incroyable) ! Les développeurs de cette solution doivent ignorer que ces derniers perdent régulièrement leur mot de passe et qu'il s'agit donc d'une fonctionnalité indispensable en production.<br />
Heureusement, la structure de l'authentification étant très simple, il est triviale de réaliser cette opération [https://paritoshbh.me/blog/reset-user-password-synapse-matrix-homeserver soit-même] dans la base de données après génération d'un mot de passe haché .<br />
<br />
# Génération du mot de passe haché<br />
su - matrix-synapse -s /bin/sh -c 'python3 /usr/libexec/matrix-synapse/hash_password -c /etc/matrix-synapse/homeserver.yaml'<br />
# connexion à la base de donnée de Synapse<br />
su - matrix-synapse -s /bin/sh -c 'sqlite3 /etc/matrix-synapse/homeserver.db'<br />
<br />
Après avoir identifié l'utilisateur dont le mot de passe doit être réinitialisé ("michel" pour l'exemple), utiliser le hachi généré pour remplacer l'ancien<br />
<syntaxhighlight lang="sql"><br />
SELECT * FROM users;<br />
UPDATE users SET password_hash='$2b$12$OkrnSR1hOCj0xjb7mDnvf.OXVQ0P/EU8u4lUpMuU5YepvHXpv3sxm' WHERE name='@michel:synapse.exemple.fr';<br />
</syntaxhighlight><br />
<br />
Le changement est instantané.</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Unbound&diff=1516Unbound2024-03-11T18:52:45Z<p>Ycharbi : Ajout d'une astuce pour autoriser un ensemble de sous-domaines dans une liste RPZ</p>
<hr />
<div>[[Category:Service_dns]]<br />
<br />
[https://www.nlnetlabs.nl/projects/unbound/about/ Unbound] est un serveur ''DNS'' faisant office de résolveur récursif et pouvant faire autorité sur des domaines locaux. Il est développé par [https://www.nlnetlabs.nl/ NLnet Labs] et se veut à la fois complet en fonctionnalité, léger (grâce à la modularité de ces dernières) et simple à configurer.<br />
<br />
=Installation et configuration=<br />
Installation du service avec une ''Debian Bullseye''<br />
apt install --no-install-recommends unbound<br />
<br />
Afin d'utiliser directement les serveurs racines pour la résolution récursive des requêtes clientes, il faut télécharger [https://{{SERVERNAME}}/fichiers/services/dns/root.hints la liste] contenant leurs adresses<br />
wget https://www.internic.net/domain/named.root -O /var/lib/unbound/root.hints && chown unbound:unbound /var/lib/unbound/root.hints<br />
<br />
Le fichier de configuration suivant sera utilisé<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf<br />
# Fichier de configuration d'Unbound pour Debian.<br />
#<br />
# Référez-vous à la page de manuel unbound.conf(5).<br />
#<br />
# Voyez /usr/share/doc/unbound/examples/unbound.conf pour un<br />
# fichier de configuration de référence commenté.<br />
#<br />
# La ligne suivante permet d'inclure les fichiers de configuration<br />
# additionnels depuis le répertoire /etc/unbound/unbound.conf.d.<br />
include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"<br />
<br />
server:<br />
statistics-interval: 0<br />
extended-statistics: yes<br />
statistics-cumulative: yes<br />
verbosity: 3<br />
<br />
# Paramètres réseau<br />
interface: 127.0.0.1<br />
interface: 192.168.1.5<br />
port: 53<br />
do-ip4: yes<br />
do-ip6: no<br />
do-udp: yes<br />
do-tcp: no<br />
<br />
# Contrôle d'accès<br />
access-control: 127.0.0.0/8 allow<br />
access-control: 192.168.0.0/16 allow<br />
access-control: 0.0.0.0/0 refuse<br />
<br />
# DNSSEC<br />
# auto-trust-anchor-file: "/var/lib/unbound/root.key"<br />
harden-dnssec-stripped: yes<br />
<br />
# Adresses des serveurs racine<br />
root-hints: "/var/lib/unbound/root.hints"<br />
<br />
# Paramètres système<br />
hide-identity: yes<br />
hide-version: yes<br />
harden-glue: yes<br />
use-caps-for-id: yes<br />
cache-min-ttl: 3600<br />
cache-max-ttl: 86400<br />
prefetch: yes<br />
num-threads: 6<br />
msg-cache-slabs: 16<br />
rrset-cache-slabs: 16<br />
infra-cache-slabs: 16<br />
key-cache-slabs: 16<br />
rrset-cache-size: 256m<br />
msg-cache-size: 128m<br />
so-rcvbuf: 1m<br />
unwanted-reply-threshold: 10000<br />
do-not-query-localhost: yes<br />
val-clean-additional: yes<br />
<br />
# Journalisation<br />
use-syslog: no<br />
logfile: /var/log/unbound.log<br />
<br />
# Paramètres du cache<br />
cache-min-ttl: 3600<br />
cache-max-ttl: 86400<br />
prefetch: yes<br />
prefetch-key: yes<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Il est possible de servir des domaines locaux (faire autorité)<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf.d/ycharbi.yo.conf<br />
server:<br />
local-zone: "ycharbi.yo." static<br />
local-data: "ycharbi.yo. IN A 192.168.1.1"<br />
local-data: "toto1.ycharbi.yo. IN A 192.168.1.25"<br />
local-data: "ycharbi.yo. IN MX 10 toto1.ycharbi.yo."<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Il est également possible de rediriger des requêtes clientes après modification (''DNS'' menteur aussi appelée ''Reponse Policy Zone'' ou ''RPZ'') afin d’interdire l'accès à certains domaines. J'utilise cette fonctionnalité à deux fins :<br />
* Servir mon [[Debmirror|miroir de dépôt local]] à toute mes machines sans avoir à changer leur [[Sources.list|configuration]]<br />
* Éviter certains sites irrespectueux des données personnelles (utilisation d'une liste automatique [[#Liste_RPZ_automatique|plus bas]])<br />
<br />
Il est à noter que tous les sous-domaines de chaque entrée sont automatiquement pris en compte.<br />
<br />
{{astuce|Si vous voulez [https://serverfault.com/questions/1104690/how-to-whitelist-domain-in-unbound autoriser] un ensemble de sous-domaines inclus dans un sous-domaine bloqué, vous pouvez utiliser une ligne comportant la syntaxe suivante (exemple pour ''Gmail'') : <code>local-zone: "l.google.com" always_transparent</code>.}}<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf.d/rpz.conf<br />
server:<br />
# Miroirs de dépôts APT Debian<br />
local-zone: "ftp.fr.debian.org" redirect<br />
local-data: "ftp.fr.debian.org A 192.168.1.77"<br />
local-zone: "http.debian.net" redirect<br />
local-data: "http.debian.net A 192.168.1.77"<br />
local-zone: "deb.debian.org" redirect<br />
local-data: "deb.debian.org A 192.168.1.77"<br />
local-zone: "security.debian.org" redirect<br />
local-data: "security.debian.org A 192.168.1.77"<br />
local-zone: "httpredir.debian.org" redirect<br />
local-data: "httpredir.debian.org A 192.168.1.77"<br />
local-zone: "debian.map.fastlydns.net" redirect<br />
local-data: "debian.map.fastlydns.net A 192.168.1.77"<br />
<br />
# APT utilise aussi des champs SRV pour résoudre l'adresse des miroirs<br />
local-zone: "prod.debian.map.fastly.net" redirect<br />
local-data: "prod.debian.map.fastly.net A 192.168.1.77"<br />
local-zone: "dpvctowv9b08b.cloudfront.net" redirect<br />
local-data: "dpvctowv9b08b.cloudfront.net A 192.168.1.77"<br />
local-zone: "_http._tcp.deb.debian.org." redirect<br />
local-data: "_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 prod.debian.map.fastly.net."<br />
local-data: "_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 dpvctowv9b08b.cloudfront.net."<br />
<br />
# Saloperies à supprimer<br />
local-zone: "doubleclick.net" redirect<br />
local-data: "doubleclick.net A 127.0.0.1"<br />
local-zone: "googlesyndication.com" redirect<br />
local-data: "googlesyndication.com A 127.0.0.1"<br />
local-zone: "googleadservices.com" redirect<br />
local-data: "googleadservices.com A 127.0.0.1"<br />
local-zone: "google-analytics.com" redirect<br />
local-data: "google-analytics.com A 127.0.0.1"<br />
local-zone: "ads.youtube.com" redirect<br />
local-data: "ads.youtube.com A 127.0.0.1"<br />
local-zone: "adserver.yahoo.com" redirect<br />
local-data: "adserver.yahoo.com A 127.0.0.1"<br />
local-zone: "ask.com" redirect<br />
local-data: "ask.com A 127.0.0.1"<br />
local-zone: "facebook.com" redirect<br />
local-data: "facebook.com A 127.0.0.1"<br />
local-zone: "truste-svc.net" redirect<br />
local-data: "truste-svc.net A 127.0.0.1"<br />
local-zone: "trustarc.com" redirect<br />
local-data: "trustarc.com A 127.0.0.1"<br />
local-zone: "gstatic.com" redirect<br />
local-data: "gstatic.com A 127.0.0.1"<br />
local-zone: "consent.google.com" redirect<br />
local-data: "consent.google.com A 127.0.0.1"<br />
local-zone: "consent.youtube.com" redirect<br />
local-data: "consent.youtube.com A 127.0.0.1"<br />
local-zone: "cdn.privacy-mgmt.com" redirect<br />
local-data: "cdn.privacy-mgmt.com A 127.0.0.1"<br />
local-zone: "privacy-mgmt.com" redirect<br />
local-data: "privacy-mgmt.com A 127.0.0.1"<br />
local-zone: "cdn.cookielaw.org" redirect<br />
local-data: "cdn.cookielaw.org A 127.0.0.1"<br />
local-zone: "digitalfeedback.us.confirmit.com" redirect<br />
local-data: "digitalfeedback.us.confirmit.com A 127.0.0.1"<br />
<br />
# Télémétrie Mozilla<br />
local-zone: "incoming.telemetry.mozilla.org" redirect<br />
local-data: "incoming.telemetry.mozilla.org A 127.0.0.1"<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Vérification de la configuration du service<br />
unbound-checkconf<br />
<br />
Redémarrage du service<br />
systemctl restart unbound<br />
<br />
Il est également possible de recharger la configuration sans relancer le logiciel. Cela a pour effet de ne pas le faire planter si jamais un fichier de configuration contient une erreur<br />
unbound-control reload<br />
<br />
Enfin, il est possible de configurer le système du serveur pour utiliser notre résolveur local et ne pas dépendre d'un résolveur de plus haut niveau (celui de notre ''FAI'' par exemple)<br />
echo "nameserver 127.0.0.1" > /etc/resolv.conf<br />
<br />
==Sources de la section==<br />
* https://memo-linux.com/debian-installer-le-serveur-dns-unbound/<br />
* https://memo-linux.com/ubuntu-serveur-dns-unbound/<br />
* https://lists.nlnetlabs.nl/pipermail/unbound-users/2014-October/003573.html<br />
* https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html<br />
<br />
=Convertir une liste de domaines en RPZ=<br />
Il est possible de trouver des listes de domaines générées par des tiers sur Internet ([https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt exemple] d'une liste de domaine utilisés par ''Windows 10'' - [https://github.com/schrebra/Windows.10.DNS.Block.List source]).<br />
<br />
Pour les convertir en fichier de configuration ''RPZ'' avec syntaxe ''Unbound'', vous pouvez utiliser mon script :<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/bash<br />
<br />
# Via un fichier distant<br />
unbound_rbl_src=$(wget -qO - https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt)<br />
# ou via un fichier local<br />
# unbound_rbl_src=$(cat /tmp/windows10-rbl.txt)<br />
unbound_rbl_dst="/tmp/windows10-rbl-unbound.conf"<br />
<br />
echo "server:" > "${unbound_rbl_dst}"<br />
for i in $unbound_rbl_src; do<br />
echo -e "\tlocal-zone: \"${i}\" redirect\n\tlocal-data: \"${i} A 127.0.0.1\"" >> "${unbound_rbl_dst}"<br />
done <br />
</syntaxhighlight><br />
<br />
Ce fichier sera à placer dans le répertoire des configurations du résolveur ''DNS'' <code>/etc/unbound/unbound.conf.d/</code> avant rechargement <code>unbound-control reload</code>.<br />
<br />
=Liste RPZ automatique=<br />
Le site [https://pgl.yoyo.org pgl.yoyo.org] met à jour et publie une [https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext liste de domaines] à interdire au format ''Unbound''. Ceci peut être utile afin de filtrer les sites irrespectueux de la vie privée des utilisateurs<br />
<br />
{{info|De façon générale, il est préférable de laisser ce filtrage être opéré par les utilisateurs eux-même afin de maintenir un [https://www.arcep.fr/nos-sujets/la-neutralite-du-net.html réseau aussi neutre que possible]. Il est important également de considérer l'aspect sécuritaire au fait de récupérer une liste de résolution canonique sur un site tiers. Rien ne garanti que son administrateur (ou un pirate) n'utilisera cette liste pour faire rediriger un site légitime vers une adresse externe et compromettre l'authenticité de vos communications avec celui-ci. Cette solution est à adapter à la situation locale.}}<br />
<br />
Le script suivant (écrit par [https://zestedesavoir.com/@sgble sgble] et adapté par mes soins) permet de récupérer la dernière version de la liste tout en sauvegardant sa copie actuelle, d'en vérifier la syntaxe et ainsi de soit recharger le service, soit restaurer sa version fonctionnelle :<br />
<br />
<syntaxhighlight lang="php"><br />
cat << _EOF_ > /usr/local/sbin/maj-rbl-unbound<br />
#!/bin/bash<br />
<br />
# Lien de la liste<br />
yoyo_url="https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext"<br />
<br />
# Localisation de la configuration Unbound<br />
unbound_confs="/etc/unbound/unbound.conf.d/"<br />
<br />
# Si le fichier précédent existe déjà, le garder en réserver au cas où<br />
if [ -f "${unbound_confs}"/yoyo_blocus.conf ]; then<br />
cp "${unbound_confs}"/yoyo_blocus.conf /tmp/yoyo_blocus.conf.sauv<br />
fi<br />
<br />
# Télécharger et placer la liste au bon endroit<br />
wget "${yoyo_url}" -O "${unbound_confs}"/yoyo_blocus.conf && sed -i '1 s/^/server:\n/' "${unbound_confs}"/yoyo_blocus.conf<br />
<br />
# Vérifier que Unbound ne rencontre aucun problème avec la liste et recharger si vrai<br />
if unbound-checkconf; then<br />
echo "La nouvelle liste est bonne"<br />
unbound-control reload<br />
echo "Unbound a été rechargé"<br />
# Sinon, rétablir l'ancien fichier qu'on a gardé en réserve<br />
else<br />
echo "La nouvelle liste semble mal formaté"<br />
mv /tmp/yoyo_blocus.conf.sauv "${unbound_confs}"/yoyo_blocus.conf<br />
echo "Une restauration de l'ancienne liste a été effectuée"<br />
fi<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
chmod +x /usr/local/sbin/maj-rbl-unbound<br />
<br />
Création d'un [[Minuteur - systemd|minuteur Systemd]] afin d'automatiser l'actualisation de la liste (tous les jours)<br />
mkdir -p /usr/local/etc/systemd/system<br />
<br />
<syntaxhighlight lang="ini"><br />
cat << _EOF_ > /usr/local/etc/systemd/system/maj-rbl-unbound.service<br />
[Unit]<br />
Description=Actualisation de la liste RPZ d'Unbound<br />
After=network.target<br />
<br />
[Service]<br />
Type=oneshot<br />
ExecStart=maj-rbl-unbound<br />
RemainAfterExit=yes<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="ini"><br />
cat << _EOF_ > /usr/local/etc/systemd/system/maj-rbl-unbound.timer<br />
[Unit]<br />
Description=Exécution journalière de l'actualisation de la liste RPZ d'Unbound<br />
<br />
[Timer]<br />
OnCalendar=daily<br />
Persistent=true<br />
<br />
[Install]<br />
WantedBy=timers.target<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.service /etc/systemd/system/<br />
ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.timer /etc/systemd/system/<br />
<br />
systemctl daemon-reload<br />
<br />
systemctl enable maj-rbl-unbound.timer<br />
systemctl start maj-rbl-unbound.timer<br />
<br />
=Sources de la section=<br />
* https://zestedesavoir.com/billets/3908/avoir-son-dns-local-securite-controle-et-performance/</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Ffmpeg&diff=1515Ffmpeg2024-03-05T17:27:58Z<p>Ycharbi : /* Redimensionner une vidéo */ Correction d'une mise en gras non terminée</p>
<hr />
<div>[[Category:linux]]<br />
[https://fr.wikipedia.org/wiki/FFmpeg FFmpeg] est une collection de logiciels libres destinés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre). Cette bibliothèque est utilisée par de nombreux autres logiciels ou services comme ''VLC'', ''iTunes'' ou ''YouTube''.<br />
<br />
Développé sur ''GNU/Linux'', ''FFmpeg'' peut être compilé sur la plupart des systèmes d'exploitation, y compris [[:Category:Windows|Windows]]. Le projet est distribué sous licence libre, [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU GPL] 2+ ou [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_limit%C3%A9e_GNU LGPL] 2.1+ en fonction des options de compilation du projet.<br />
<br />
=Extraire le son=<br />
Voici comment [http://www.loopsbeats.com/convert/extract-audio-with-ffmpeg.html extraire le son] d'une vidéo ''mp4'' en ''mp3'' :<br />
ffmpeg -i toto.mp4 -vn -ar 44100 -ac 2 -ab 192 -f mp3 toto.mp3<br />
<br />
=Extraire la jaquette=<br />
Les fichiers audios embarquent souvent une image (communément la jaquette de l'album). Voici comment la [https://unix.stackexchange.com/questions/41287/how-to-extract-album-cover-image-from-mp3-file récupérer] :<br />
ffmpeg -i fichier.mp3 -an -c:v copy fichier.jpg<br />
<br />
=Couper un extrait=<br />
Il est possible de [https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video#704118 découper un morceau] de fichier avec ceci :<br />
ffmpeg -ss 00:00:53 -i Pas\ de\ manières-5hjNP5dNNs4.m4a -t 00:00:11 -c copy Ta_cherie.m4a<br />
<br />
Explications :<br />
* '''-ss''' : début de la découpe<br />
* '''-i''' : fichier source<br />
* '''-t''' : temps à garder à partir de '''-ss'''<br />
* '''-c''' : action à effectuer<br />
<br />
Il est aussi possible de préciser le nombre de trames à conserver à partir d'un temps donnée (plus précis) :<br />
ffmpeg -y -ss 00:01:28 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 100 /tmp/titi.mp4<br />
<br />
Paramètres différents :<br />
* '''-c:v libx264''' : codec vidéo de transcodage (facultatif)<br />
* '''-c:a aac''' : codec audio de transcodage (facultatif)<br />
* '''-frames:v 100''' : garder 100 trames (le "v" peut être remplacé par un "a" en cas de fichier uniquement audio)<br />
<br />
Dans le cas d'une vidéo comportant [https://stackoverflow.com/questions/60445661/ffmpeg-how-do-i-choose-the-correct-audio-track plusieurs] pistes audios, il est possible de sélectionner la désirée de la manière suivante :<br />
ffmpeg -y -ss 00:27:26 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 530 -map 0:v:0 -map 0:a:2 /tmp/titi.mp4.mp4<br />
<br />
Paramètres différents :<br />
* '''-map 0:v:0''' : première piste vidéo<br />
* '''-map 0:a:2''' : troisième piste audio<br />
<br />
=Convertir un fichier=<br />
Pour [https://fr.wikihow.com/utiliser-FFmpeg convertir un fichier] dans un autre format :<br />
ffmpeg -i Ni_flic_ni_pd.ogg Ni_flic_ni_pd.mp3<br />
<br />
''Note: L'outil détecte automatiquement le format du fichier voulu en lisant l'extension de destination.''<br />
<br />
Il est possible d'ajouter des paramètres afin de préciser des [https://trac.ffmpeg.org/wiki/Encode/H.264 caractéristiques d'encodage]. [https://emirchouchane.com/h264-ffmpeg/ Par exemple], pour une conversion vidéo en ''h264'' :<br />
ffmpeg -i vidéo.m4v -c:v libx264 -crf 23 vidéo.mp4<br />
<br />
Explications :<br />
* '''-c:v libx264''' : sélection du codec (''-c'') vidéo ('':v'') h264 (''libx264'')<br />
* '''-crf 23''' : facteur de taux constant (''Constant Rate Factor'') à 23. Permet de définir le débit binaire de la vidéo<br />
<br />
<br />
<img src="https://{{SERVERNAME}}/fichiers/multim%c3%a9dia/conversion/ffmpeg/%c3%89chelle_Constant_Rate_Factor.svg"></img><br />
<br />
Autre exemple avec une conversion en [https://trac.ffmpeg.org/wiki/Encode/H.265 h265] :<br />
ffmpeg -i vidéo.mp4 -c:v libx265 -crf 26 -preset fast -c:a eac3 -b:a 640k /tmp/vidéo.mp4<br />
<br />
* '''-c:v libx265''' : codec vidéo en ''h265''<br />
* '''-preset fast''' : vitesse d'encodage et profile de compression (énumérés [https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF ici])<br />
* '''-c:a eac3''' : codec audio en ''eac3''<br />
* '''-b:a 640k''' : débit binaire du flux audio<br />
<br />
=Redimensionner une vidéo=<br />
Outre le codec à utiliser et le ''CRF'' à modifier, il est possible d'alléger une vidéo en réduisant ses dimensions. Les différentes techniques combinées peuvent permettre d'arriver à envoyer péniblement une vidéo par [https://fr.wikipedia.org/wiki/Multimedia_Messaging_Service MMS]...<br />
ffmpeg -y -i /tmp/a.mp4 -crf 33 -vf "scale=iw/2:ih/2" /tmp/b.mp4<br />
<br />
Explications :<br />
* '''-y''' : écrase la destination sans demander de confirmation<br />
* '''-i''' : fichier source<br />
* '''-crf 33''' : forte compression (destructrice) de la vidéo<br />
* '''-vf "scale=iw/2:ih/2"''' : réduction par deux des dimensions de la vidéo<br />
<br />
=Fusionner une bande vidéo et une bande son=<br />
Il est possible de [https://qastack.fr/superuser/277642/how-to-merge-audio-and-video-file-in-ffmpeg regrouper] dans un même fichier multimédia ([https://fr.wikipedia.org/wiki/Format_conteneur conteneur]) une bande vidéo et une bande son. Un cas typique est le téléchargement d'une vidéo sur le site [https://crowdbunker.com crowdbunker.com] via les fichiers <syntaxhighlight lang="bash" inline>.m3u</syntaxhighlight> capturés dans le trafic réseau. La vidéo est découplé du son (deux téléchargements séparés) et c'est le lecteur vidéo ''WEB'' qui se charge de lire les deux en même temps. Pour fusionner les deux après téléchargement en local, la commande suivante peut être utilisée :<br />
ffmpeg -i Vidéo_source.mp4 -i Audio_source.mp4 -c:v copy -c:a aac -strict experimental Vidéo_et_audio_destination.mp4</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Ffmpeg&diff=1514Ffmpeg2024-03-05T16:58:12Z<p>Ycharbi : /* Couper un extrait */ Ajout d'une méthode pour sélectionner une piste audio + correction typographique</p>
<hr />
<div>[[Category:linux]]<br />
[https://fr.wikipedia.org/wiki/FFmpeg FFmpeg] est une collection de logiciels libres destinés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre). Cette bibliothèque est utilisée par de nombreux autres logiciels ou services comme ''VLC'', ''iTunes'' ou ''YouTube''.<br />
<br />
Développé sur ''GNU/Linux'', ''FFmpeg'' peut être compilé sur la plupart des systèmes d'exploitation, y compris [[:Category:Windows|Windows]]. Le projet est distribué sous licence libre, [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU GPL] 2+ ou [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_limit%C3%A9e_GNU LGPL] 2.1+ en fonction des options de compilation du projet.<br />
<br />
=Extraire le son=<br />
Voici comment [http://www.loopsbeats.com/convert/extract-audio-with-ffmpeg.html extraire le son] d'une vidéo ''mp4'' en ''mp3'' :<br />
ffmpeg -i toto.mp4 -vn -ar 44100 -ac 2 -ab 192 -f mp3 toto.mp3<br />
<br />
=Extraire la jaquette=<br />
Les fichiers audios embarquent souvent une image (communément la jaquette de l'album). Voici comment la [https://unix.stackexchange.com/questions/41287/how-to-extract-album-cover-image-from-mp3-file récupérer] :<br />
ffmpeg -i fichier.mp3 -an -c:v copy fichier.jpg<br />
<br />
=Couper un extrait=<br />
Il est possible de [https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video#704118 découper un morceau] de fichier avec ceci :<br />
ffmpeg -ss 00:00:53 -i Pas\ de\ manières-5hjNP5dNNs4.m4a -t 00:00:11 -c copy Ta_cherie.m4a<br />
<br />
Explications :<br />
* '''-ss''' : début de la découpe<br />
* '''-i''' : fichier source<br />
* '''-t''' : temps à garder à partir de '''-ss'''<br />
* '''-c''' : action à effectuer<br />
<br />
Il est aussi possible de préciser le nombre de trames à conserver à partir d'un temps donnée (plus précis) :<br />
ffmpeg -y -ss 00:01:28 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 100 /tmp/titi.mp4<br />
<br />
Paramètres différents :<br />
* '''-c:v libx264''' : codec vidéo de transcodage (facultatif)<br />
* '''-c:a aac''' : codec audio de transcodage (facultatif)<br />
* '''-frames:v 100''' : garder 100 trames (le "v" peut être remplacé par un "a" en cas de fichier uniquement audio)<br />
<br />
Dans le cas d'une vidéo comportant [https://stackoverflow.com/questions/60445661/ffmpeg-how-do-i-choose-the-correct-audio-track plusieurs] pistes audios, il est possible de sélectionner la désirée de la manière suivante :<br />
ffmpeg -y -ss 00:27:26 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 530 -map 0:v:0 -map 0:a:2 /tmp/titi.mp4.mp4<br />
<br />
Paramètres différents :<br />
* '''-map 0:v:0''' : première piste vidéo<br />
* '''-map 0:a:2''' : troisième piste audio<br />
<br />
=Convertir un fichier=<br />
Pour [https://fr.wikihow.com/utiliser-FFmpeg convertir un fichier] dans un autre format :<br />
ffmpeg -i Ni_flic_ni_pd.ogg Ni_flic_ni_pd.mp3<br />
<br />
''Note: L'outil détecte automatiquement le format du fichier voulu en lisant l'extension de destination.''<br />
<br />
Il est possible d'ajouter des paramètres afin de préciser des [https://trac.ffmpeg.org/wiki/Encode/H.264 caractéristiques d'encodage]. [https://emirchouchane.com/h264-ffmpeg/ Par exemple], pour une conversion vidéo en ''h264'' :<br />
ffmpeg -i vidéo.m4v -c:v libx264 -crf 23 vidéo.mp4<br />
<br />
Explications :<br />
* '''-c:v libx264''' : sélection du codec (''-c'') vidéo ('':v'') h264 (''libx264'')<br />
* '''-crf 23''' : facteur de taux constant (''Constant Rate Factor'') à 23. Permet de définir le débit binaire de la vidéo<br />
<br />
<br />
<img src="https://{{SERVERNAME}}/fichiers/multim%c3%a9dia/conversion/ffmpeg/%c3%89chelle_Constant_Rate_Factor.svg"></img><br />
<br />
Autre exemple avec une conversion en [https://trac.ffmpeg.org/wiki/Encode/H.265 h265] :<br />
ffmpeg -i vidéo.mp4 -c:v libx265 -crf 26 -preset fast -c:a eac3 -b:a 640k /tmp/vidéo.mp4<br />
<br />
* '''-c:v libx265''' : codec vidéo en ''h265''<br />
* '''-preset fast''' : vitesse d'encodage et profile de compression (énumérés [https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF ici])<br />
* '''-c:a eac3''' : codec audio en ''eac3''<br />
* '''-b:a 640k''' : débit binaire du flux audio<br />
<br />
=Redimensionner une vidéo=<br />
Outre le codec à utiliser et le ''CRF'' à modifier, il est possible d'alléger une vidéo en réduisant ses dimensions. Les différentes techniques combinées peuvent permettre d'arriver à envoyer péniblement une vidéo par [https://fr.wikipedia.org/wiki/Multimedia_Messaging_Service MMS]...<br />
ffmpeg -y -i /tmp/a.mp4 -crf 33 -vf "scale=iw/2:ih/2" /tmp/b.mp4<br />
<br />
Explications :<br />
* '''-y''' : écrase la destination sans demander de confirmation<br />
* '''-i''' : fichier source<br />
* '''-crf 33''' : forte compression (destructrice) de la vidéo<br />
* '''-vf "scale=iw/2:ih/2" réduction par deux des dimensions de la vidéo<br />
<br />
=Fusionner une bande vidéo et une bande son=<br />
Il est possible de [https://qastack.fr/superuser/277642/how-to-merge-audio-and-video-file-in-ffmpeg regrouper] dans un même fichier multimédia ([https://fr.wikipedia.org/wiki/Format_conteneur conteneur]) une bande vidéo et une bande son. Un cas typique est le téléchargement d'une vidéo sur le site [https://crowdbunker.com crowdbunker.com] via les fichiers <syntaxhighlight lang="bash" inline>.m3u</syntaxhighlight> capturés dans le trafic réseau. La vidéo est découplé du son (deux téléchargements séparés) et c'est le lecteur vidéo ''WEB'' qui se charge de lire les deux en même temps. Pour fusionner les deux après téléchargement en local, la commande suivante peut être utilisée :<br />
ffmpeg -i Vidéo_source.mp4 -i Audio_source.mp4 -c:v copy -c:a aac -strict experimental Vidéo_et_audio_destination.mp4</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Shred&diff=1513Shred2024-02-29T20:27:28Z<p>Ycharbi : Correction de fautes</p>
<hr />
<div>[[Category:Linux]]<br />
<br />
[https://www.man7.org/linux/man-pages/man1/shred.1.html Shred] (déchiqueter) est un outil des [https://www.gnu.org/software/coreutils/coreutils.html GNU coreutils] permettant l’effacement sécurisé de données sur un système de fichiers monté en lecture/écriture. Il permet de s'assurer qu'un fichier a bien été totalement écrasé sans laisser de trace dans les blocs l'ayant accueilli en écrivant des caractères pseudos-aléatoires par dessus celui-ci (3 fois par défaut). Il agit donc comme une déchiqueteuse de papier physique.<br />
<br />
En effet, la suppression traditionnelle ainsi que les formatages rapides se contentent généralement de vider les nœuds d'index (''inodes'') correspondants aux blocs contenants l'information et non les données elles mêmes. Les fichiers sont alors récupérables via des outils dédiés.<br />
<br />
Le programme n'intégrant pas d'option de récursivité, il faut passer par une boucle pour supprimer le contenu d'un répertoire. La [https://unix.stackexchange.com/questions/27027/how-do-i-recursively-shred-an-entire-directory-tree commande] <code>find</code> peut être employée pour réaliser cette tâche finement<br />
find <rèp> -type f -exec shred -uvz {} \;<br />
<br />
Options :<br />
* '''-u''' : dés-alloue les blocs et supprime le fichier après réécriture (par défaut, il le laisse rempli avec des caractères pseudos-aléatoires)<br />
* '''-v''' : affiche les opérations en cours<br />
* '''-z''' : ajoute une passe de zéro pour masquer le déchiquetage</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Shred&diff=1512Shred2024-02-29T16:15:10Z<p>Ycharbi : Correction d'une faute de frappe dans la catégorie de la page</p>
<hr />
<div>[[Category:Linux]]<br />
<br />
[https://www.man7.org/linux/man-pages/man1/shred.1.html Shred] (déchiqueter) est un outil des [https://www.gnu.org/software/coreutils/coreutils.html GNU coreutils] permettant l’efficacement sécurisé de données sur un système de fichiers monté en lecture/écriture. Il permet de s'assurer qu'un fichier a bien été totalement écrasé sans laisser de trace dans les blocs l'ayant accueilli en réécrivant des caractères pseudos-aléatoires par dessus celui-ci (3 fois par défaut). Il agit donc comme une déchiqueteuse de papier physique.<br />
<br />
En effet, la suppression traditionnelle ainsi que les formatages rapides se contentent généralement vider les nœud d'index (''inodes'') correspondant aux blocs contenant les données et non les données elles mêmes. Les fichiers sont alors récupérables via des outils dédiés.<br />
<br />
Le programme n'intégrant pas d'option de récursivité, il faut passer par une boucle pour supprimer le contenu d'un répertoire. La [https://unix.stackexchange.com/questions/27027/how-do-i-recursively-shred-an-entire-directory-tree commande] <code>find</code> peut être employée pour réaliser cette tâche finement<br />
find <rèp> -type f -exec shred -uvz {} \;<br />
<br />
Options :<br />
* '''-u''' : dés-alloue les blocs et supprime le fichier après réécriture (par défaut, il le laisse rempli des caractères pseudos-aléatoires)<br />
* '''-v''' : affiche les opérations en cours<br />
* '''-z''' : ajoute une passe de zéro pour masquer le déchiquetage</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Shred&diff=1511Shred2024-02-29T16:14:09Z<p>Ycharbi : Page créée avec « Linux [https://www.man7.org/linux/man-pages/man1/shred.1.html Shred] (déchiqueter) est un outil des [https://www.gnu.org/software/coreutils/coreutils.html GNU coreutils] permettant l’efficacement sécurisé de données sur un système de fichiers monté en lecture/écriture. Il permet de s'assurer qu'un fichier a bien été totalement écrasé sans laisser de trace dans les blocs l'ayant accueilli en réécrivant des caractères pseudos-aléatoire... »</p>
<hr />
<div>[[Categoy|Linux]]<br />
<br />
[https://www.man7.org/linux/man-pages/man1/shred.1.html Shred] (déchiqueter) est un outil des [https://www.gnu.org/software/coreutils/coreutils.html GNU coreutils] permettant l’efficacement sécurisé de données sur un système de fichiers monté en lecture/écriture. Il permet de s'assurer qu'un fichier a bien été totalement écrasé sans laisser de trace dans les blocs l'ayant accueilli en réécrivant des caractères pseudos-aléatoires par dessus celui-ci (3 fois par défaut). Il agit donc comme une déchiqueteuse de papier physique.<br />
<br />
En effet, la suppression traditionnelle ainsi que les formatages rapides se contentent généralement vider les nœud d'index (''inodes'') correspondant aux blocs contenant les données et non les données elles mêmes. Les fichiers sont alors récupérables via des outils dédiés.<br />
<br />
Le programme n'intégrant pas d'option de récursivité, il faut passer par une boucle pour supprimer le contenu d'un répertoire. La [https://unix.stackexchange.com/questions/27027/how-do-i-recursively-shred-an-entire-directory-tree commande] <code>find</code> peut être employée pour réaliser cette tâche finement<br />
find <rèp> -type f -exec shred -uvz {} \;<br />
<br />
Options :<br />
* '''-u''' : dés-alloue les blocs et supprime le fichier après réécriture (par défaut, il le laisse rempli des caractères pseudos-aléatoires)<br />
* '''-v''' : affiche les opérations en cours<br />
* '''-z''' : ajoute une passe de zéro pour masquer le déchiquetage</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Ffmpeg&diff=1510Ffmpeg2024-02-28T21:42:48Z<p>Ycharbi : Ajout d'une méthode supplémentaire pour couper un extrait de média + ajout de la section "Redimensionner une vidéo"</p>
<hr />
<div>[[Category:linux]]<br />
[https://fr.wikipedia.org/wiki/FFmpeg FFmpeg] est une collection de logiciels libres destinés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre). Cette bibliothèque est utilisée par de nombreux autres logiciels ou services comme ''VLC'', ''iTunes'' ou ''YouTube''.<br />
<br />
Développé sur ''GNU/Linux'', ''FFmpeg'' peut être compilé sur la plupart des systèmes d'exploitation, y compris [[:Category:Windows|Windows]]. Le projet est distribué sous licence libre, [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU GPL] 2+ ou [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_limit%C3%A9e_GNU LGPL] 2.1+ en fonction des options de compilation du projet.<br />
<br />
=Extraire le son=<br />
Voici comment [http://www.loopsbeats.com/convert/extract-audio-with-ffmpeg.html extraire le son] d'une vidéo ''mp4'' en ''mp3'' :<br />
ffmpeg -i toto.mp4 -vn -ar 44100 -ac 2 -ab 192 -f mp3 toto.mp3<br />
<br />
=Extraire la jaquette=<br />
Les fichiers audios embarquent souvent une image (communément la jaquette de l'album). Voici comment la [https://unix.stackexchange.com/questions/41287/how-to-extract-album-cover-image-from-mp3-file récupérer] :<br />
ffmpeg -i fichier.mp3 -an -c:v copy fichier.jpg<br />
<br />
=Couper un extrait=<br />
Il est possible de [https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video#704118 découper un morceau] de fichier avec ceci :<br />
ffmpeg -ss 00:00:53 -i Pas\ de\ manières-5hjNP5dNNs4.m4a -t 00:00:11 -c copy Ta_cherie.m4a<br />
<br />
Explications :<br />
* '''-ss''' : début de la découpe<br />
* '''-i''' : fichier source<br />
* '''-t''' : temps à garder à partir de '''-ss'''<br />
* '''-c''' : action à effectuer<br />
<br />
Il est aussi possible de préciser le nombre de trames à conserver à partir d'un temps donnée (plus précis)<br />
ffmpeg -y -ss 00:01:28 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 100 /tmp/titi.mp4<br />
<br />
Paramètres différents :<br />
* '''-c:v libx264''' : codec vidéo de transcodage (facultatif)<br />
* '''-c:a aac''' : codec audio de transcodage (facultatif)<br />
* '''-frames:v 100''' : garder 100 trames (le "v" peut être remplacé par un "a" en cas de fichier uniquement audio)<br />
<br />
=Convertir un fichier=<br />
Pour [https://fr.wikihow.com/utiliser-FFmpeg convertir un fichier] dans un autre format :<br />
ffmpeg -i Ni_flic_ni_pd.ogg Ni_flic_ni_pd.mp3<br />
<br />
''Note: L'outil détecte automatiquement le format du fichier voulu en lisant l'extension de destination.''<br />
<br />
Il est possible d'ajouter des paramètres afin de préciser des [https://trac.ffmpeg.org/wiki/Encode/H.264 caractéristiques d'encodage]. [https://emirchouchane.com/h264-ffmpeg/ Par exemple], pour une conversion vidéo en ''h264'' :<br />
ffmpeg -i vidéo.m4v -c:v libx264 -crf 23 vidéo.mp4<br />
<br />
Explications :<br />
* '''-c:v libx264''' : sélection du codec (''-c'') vidéo ('':v'') h264 (''libx264'')<br />
* '''-crf 23''' : facteur de taux constant (''Constant Rate Factor'') à 23. Permet de définir le débit binaire de la vidéo<br />
<br />
<br />
<img src="https://{{SERVERNAME}}/fichiers/multim%c3%a9dia/conversion/ffmpeg/%c3%89chelle_Constant_Rate_Factor.svg"></img><br />
<br />
Autre exemple avec une conversion en [https://trac.ffmpeg.org/wiki/Encode/H.265 h265] :<br />
ffmpeg -i vidéo.mp4 -c:v libx265 -crf 26 -preset fast -c:a eac3 -b:a 640k /tmp/vidéo.mp4<br />
<br />
* '''-c:v libx265''' : codec vidéo en ''h265''<br />
* '''-preset fast''' : vitesse d'encodage et profile de compression (énumérés [https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF ici])<br />
* '''-c:a eac3''' : codec audio en ''eac3''<br />
* '''-b:a 640k''' : débit binaire du flux audio<br />
<br />
=Redimensionner une vidéo=<br />
Outre le codec à utiliser et le ''CRF'' à modifier, il est possible d'alléger une vidéo en réduisant ses dimensions. Les différentes techniques combinées peuvent permettre d'arriver à envoyer péniblement une vidéo par [https://fr.wikipedia.org/wiki/Multimedia_Messaging_Service MMS]...<br />
ffmpeg -y -i /tmp/a.mp4 -crf 33 -vf "scale=iw/2:ih/2" /tmp/b.mp4<br />
<br />
Explications :<br />
* '''-y''' : écrase la destination sans demander de confirmation<br />
* '''-i''' : fichier source<br />
* '''-crf 33''' : forte compression (destructrice) de la vidéo<br />
* '''-vf "scale=iw/2:ih/2" réduction par deux des dimensions de la vidéo<br />
<br />
=Fusionner une bande vidéo et une bande son=<br />
Il est possible de [https://qastack.fr/superuser/277642/how-to-merge-audio-and-video-file-in-ffmpeg regrouper] dans un même fichier multimédia ([https://fr.wikipedia.org/wiki/Format_conteneur conteneur]) une bande vidéo et une bande son. Un cas typique est le téléchargement d'une vidéo sur le site [https://crowdbunker.com crowdbunker.com] via les fichiers <syntaxhighlight lang="bash" inline>.m3u</syntaxhighlight> capturés dans le trafic réseau. La vidéo est découplé du son (deux téléchargements séparés) et c'est le lecteur vidéo ''WEB'' qui se charge de lire les deux en même temps. Pour fusionner les deux après téléchargement en local, la commande suivante peut être utilisée :<br />
ffmpeg -i Vidéo_source.mp4 -i Audio_source.mp4 -c:v copy -c:a aac -strict experimental Vidéo_et_audio_destination.mp4</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Unified_kernel_image&diff=1509Unified kernel image2024-02-28T11:46:40Z<p>Ycharbi : /* Secure Boot */ Ajout d'une recommandation sur le mot de passe UEFI</p>
<hr />
<div>[[Category:Noyau_linux]]<br />
<br />
Une Image Noyau Unifiée (INU) ou ''Unified Kernel Image'' (''UKI'') est la combinaison d'un programme de démarrage ''UEFI'', d'une image noyau ''Linux'', d'un ''initrd'' ainsi que d'autres ressources optionnelles dans un seul fichier ''UEFI [https://fr.wikipedia.org/wiki/Portable_Executable PE]''. Il peut alors être invoqué directement par :<br />
* le micrologiciel ''UEFI'' : utile notamment dans certains environnements d'informatique en nuage ou confidentiels<br />
* un chargeur de démarrage : généralement utile pour permettre plusieurs versions de noyau avec une sélection interactive ou automatique de la version dans laquelle démarrer ([[Systemd-boot]] ou [[Grub]] permettent cela)<br />
<br />
L'amorçage de cette image unifiée est permise par le ''stub'', programme logé dans celle-ci et pouvant être interprété par l{{'}}''UEFI''. Il constitue donc la partie exécutable initiale de l'image combinée et charge par la suite d'autres ressources à partir du reste de l{{'}}''INU'', en particulier le noyau et l{{'}}''initrd''.<br />
<br />
La [https://uapi-group.org/specifications/specs/unified_kernel_image/ spécification officielle] définit le format et les composants (obligatoires et optionnels) des ''UKI'' qui sont fournis en tant que sections ''PE/COFF'' de l'exécutable.<br />
<br />
L'intérêt principal de cette approche est qu'elle permet de mieux sécuriser le démarrage d'un système en exposant un unique binaire (''UEFI PE'') en clair sur le disque d'amorçage (''EFI System Partition'' - ''ESP'') au lieu d'une multitude de fichiers pouvant être modifiés par le premier pirate venu. Cet exécutable pourra alors être signé par ''Secure Boot'' et permettre, entre-autre, le déchiffrement de la racine en s'assurant de l’absence de sa propre altération (enregistreur de frappes par exemple).<br />
<br />
=Image Noyau Unifiée=<br />
==Installation des outils==<br />
La génération d'une ''INU'' nécessite quelques outils. Le projet ''Systemd'' met à disposition un programme ''Python'' nommé <code>Ukify</code> à partir de la version 253 de l{{'}}''init''. Il est logé à l'emplacement <code>/usr/lib/systemd/ukify</code> mais nécessite la bibliothèque <code>python3-pefile</code> et ses dépendances pour fonctionner. L'approche exposé dans ce document visant la frugalité (''Ukify'' apporte surtout une configuration épurée mais l'aspect fonctionnel est identique), le strict nécessaire sera installé.<br />
apt install --no-install-recommends systemd-boot-efi binutils gawk sbsigntool<br />
<br />
Détails des paquets installés :<br />
* '''systemd-boot-efi''' : fournit le ''stub <code>/usr/lib/systemd/boot/efi/linuxx64.efi.stub</code><br />
* '''binutils''' : fournit le programme de construction du binaire ''PE'' <code>objdump</code><br />
* '''gawk''' : fournit la version ''GNU'' de l'interpréteur de langage ''AWK'' afin de ne pas avoir l'erreur de fonction non définie <code>function strtonum never defined</code> du <code>awk</code> de base<br />
* '''sbsigntool''' : permet de signer l{{'}}''UKI'' en vu d'une validation ''Secure Boot'' (optionnel)<br />
<br />
==Script de génération==<br />
La génération d'une ''UKI'' nécessitant la concaténation d'une multitude d'éléments, il n'est pas envisageable de renseigner l'ensemble des paramètres manuellement. Je vous propose un script permettant la création d'une image ainsi que sa rotation sur trois versions différentes (l'une écrase la précédente à chaque nouvelle exécution). <br />
vim /mnt/usr/local/sbin/gen-uki<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/bash<br />
<br />
# Récupération de la version du noyau en cours d'utilisation<br />
if [[ -n "${1}" ]]; then<br />
version_noyau="${1}"<br />
else<br />
version_noyau="$(uname -r)"<br />
fi<br />
<br />
# Chemin vers l'initrd de travail<br />
if [[ -n "${2}" ]]; then<br />
chemin_initrd="${2}"<br />
else<br />
chemin_initrd="/boot/initrd.img-${version_noyau}"<br />
fi<br />
<br />
# Chemin vers le noyau de travail<br />
if [[ -n "${2}" ]]; then<br />
chemin_noyau="/boot/vmlinuz-${1}"<br />
else<br />
chemin_noyau="/boot/vmlinuz-${version_noyau}"<br />
fi<br />
<br />
# Définition des variables du script<br />
chemin_lsb="/usr/lib/os-release"<br />
chemin_stub="/usr/lib/systemd/boot/efi/linuxx64.efi.stub"<br />
chemin_cmdline="/etc/kernel/cmdline"<br />
chemin_splash="/dev/null"<br />
nom_uki1="1-debian.efi"<br />
nom_uki2="2-debian.efi"<br />
nom_uki3="3-debian.efi"<br />
chemin_base="/boot/efi/EFI/Linux/"<br />
chemin_dst_uki="${chemin_base}/${nom_uki1}"<br />
chemin_sb_clef="/usr/local/lib/secureboot/mok/MOK.priv"<br />
chemin_sb_cert="/usr/local/lib/secureboot/mok/MOK.pem"<br />
<br />
# Création de l'arborescence des UKI<br />
mkdir -p "${chemin_base}"<br />
<br />
# Préparation de l'UKI<br />
align="$(objdump -p ${chemin_stub} | awk '{ if ($1 == "SectionAlignment"){print $2} }')"<br />
align=$((16#$align))<br />
osrel_offs="$(objdump -h "${chemin_stub}" | awk 'NF==7 {size=strtonum("0x"$3); offset=strtonum("0x"$4)} END {print size + offset}')"<br />
osrel_offs=$((osrel_offs + "$align" - osrel_offs % "$align"))<br />
cmdline_offs=$((osrel_offs + $(stat -Lc%s "${chemin_lsb}")))<br />
cmdline_offs=$((cmdline_offs + "$align" - cmdline_offs % "$align"))<br />
splash_offs=$((cmdline_offs + $(stat -Lc%s "${chemin_cmdline}")))<br />
splash_offs=$((splash_offs + "$align" - splash_offs % "$align"))<br />
initrd_offs=$((splash_offs + $(stat -Lc%s "${chemin_splash}")))<br />
initrd_offs=$((initrd_offs + "$align" - initrd_offs % "$align"))<br />
linux_offs=$((initrd_offs + $(stat -Lc%s "${chemin_initrd}")))<br />
linux_offs=$((linux_offs + "$align" - linux_offs % "$align"))<br />
<br />
# Roulement, si elle existe et n'est pas vide, de l'UKI 2 en 3<br />
if [[ -s "${chemin_base}${nom_uki2}" ]]; then<br />
echo "Copie de l'UKI 2 en 3..."<br />
cp -v "${chemin_base}${nom_uki2}" "${chemin_base}${nom_uki3}"<br />
fi<br />
<br />
# Roulement, si elle existe et n'est pas vide, de l'UKI 1 en 2<br />
if [[ -s "${chemin_dst_uki}" ]]; then<br />
echo "Copie de l'UKI 1 en 2..."<br />
cp -v "${chemin_dst_uki}" "${chemin_base}${nom_uki2}"<br />
fi<br />
<br />
echo "Génération de l'image noyau combinée (UKI) numéro 1..."<br />
objcopy \<br />
--add-section .osrel="${chemin_lsb}" --change-section-vma .osrel=$(printf 0x%x $osrel_offs) \<br />
--add-section .cmdline="${chemin_cmdline}" --change-section-vma .cmdline=$(printf 0x%x $cmdline_offs) \<br />
--add-section .splash="${chemin_splash}" --change-section-vma .splash=$(printf 0x%x $splash_offs) \<br />
--add-section .initrd="${chemin_initrd}" --change-section-vma .initrd=$(printf 0x%x $initrd_offs) \<br />
--add-section .linux="${chemin_noyau}" --change-section-vma .linux=$(printf 0x%x $linux_offs) \<br />
"${chemin_stub}" "${chemin_dst_uki}"<br />
<br />
# Signature de l'UKI pour la vérification Secure Boot seulement si la clé et son certificat son présents<br />
if [[ -r "${chemin_sb_clef}" && -r "${chemin_sb_cert}" ]]; then<br />
sbsign --key "${chemin_sb_clef}" --cert "${chemin_sb_cert}" --output "${chemin_dst_uki}" "${chemin_dst_uki}"<br />
sbverify --cert "${chemin_sb_cert}" "${chemin_dst_uki}"<br />
fi<br />
</syntaxhighlight><br />
<br />
Les [[Paramètres linux|paramètres]] du noyau (de la variable <code>$chemin_cmdline</code>) doivent contenir les informations sur votre système de fichier racine afin que ''Linux'' puisse l'amorcer. Vous pouvez vous appuyer sur l'exemple ci-dessous qui comprend une partition chiffrée contenant un sous-volume ''BTRFS''.<br />
<br />
<syntaxhighlight lang="bash"><br />
echo "root=UUID=${uuid_racine} cryptdevice=UUID=${uuid_luks} ro rootflags=subvol=@rootfs console=tty0 console=ttyS0,115200n8" > /mnt/etc/kernel/cmdline<br />
</syntaxhighlight><br />
<br />
Pensez bien entendu à remplacer les variables par vos propres valeurs...<br />
<br />
Vous pouvez également vous appuyer sur le <code>/proc/cmdline</code> pour visualiser les paramètres utilisés par votre propre système afin de vous en inspirer. La liste des paramètres possible est visualisable dans la [https://www.kernel.org/doc/html/v6.5/admin-guide/kernel-parameters.html documentation] du noyau.<br />
<br />
chmod u+x /usr/local/sbin/gen-uki<br />
<br />
==Automatisation==<br />
Le script ainsi créé peut être lancé manuellement mais il est préférable qu'il soit appelé à chaque mise à jour de noyau ou d{{'}}''initrd'' afin de garantir un démarrage sur la dernière version disponible. Cette dépendance se créée en l'exposant dans les répertoire de post-construction de nos deux composants d'intérêts.<br />
<br />
mkdir -p /etc/initramfs/post-update.d<br />
ln -s /usr/local/sbin/gen-uki /etc/initramfs/post-update.d/zz-gen-uki<br />
ln -s /usr/local/sbin/gen-uki /etc/kernel/postinst.d/zz-gen-uki<br />
chmod u+x /etc/initramfs/post-update.d/zz-gen-uki /etc/kernel/postinst.d/zz-gen-uki<br />
<br />
{{info|Le répertoire <code>/etc/initramfs/post-update.d</code> n'est pas créé par défaut dans ''GNU/Linux Debian'' mais est bien parcouru lors de la génération d'une nouvelle archive d{{'}}''init''.}}<br />
<br />
==Création des entrées de démarrage==<br />
Dans l'optique d'optimiser au mieux le démarrage de notre machine, nous n'utiliserons aucun chargeur d'amorçage. Nous créerons alors des entrées de démarrage dans notre ''UEFI'' pointant directement sur nos ''UKI'' (son menu nous permettra de sélectionner la version à lancer). Pour se faire, il est possible de passer par l'interface de celui-ci (lorsque l'option est disponible) ou via l'outil [[Efibootmgr]] (universel). Voici un exemple pour les trois générées par le script (il est possible de créer les entrées avant les images) :<br />
<br />
<syntaxhighlight lang="bash"><br />
disque_systeme=/dev/nvme0n1<br />
<br />
efibootmgr -c -d "${disque_systeme}" -p 1 -l '\EFI\Linux\1-debian.efi' -L "Debian UKI 1"<br />
efibootmgr -c -d "${disque_systeme}" -p 1 -l '\EFI\Linux\2-debian.efi' -L "Debian UKI 2"<br />
efibootmgr -c -d "${disque_systeme}" -p 1 -l '\EFI\Linux\3-debian.efi' -L "Debian UKI 3"<br />
</syntaxhighlight><br />
<br />
Ainsi, dans le cas malencontreux où une mise à jour de noyau ou une reconstruction d{{'}}''initrd'' occasionne une impossibilité à démarrer, les versions précédentes de votre image vous permettront de vous en sortir.<br />
<br />
==Sources de la section==<br />
* https://uapi-group.org/specifications/specs/unified_kernel_image/<br />
* https://0pointer.de/blog/brave-new-trusted-boot-world.html<br />
* https://wiki.debian.org/EFIStub#Setting_up_a_Unified_Kernel_Image<br />
<br />
=Secure Boot=<br />
<br />
{{info|Cette section est facultative.}}<br />
<br />
''Secure Boot'' ([https://uefi.org/sites/default/files/resources/UEFI_Spec_2_3_1.pdf chapitre 27] des spécification ''UEFI'') est une fonctionnalité apparue avec la version 2.3.1 de l{{'}}''UEFI'' permettant de borner l'amorçage aux seuls systèmes dont la signature cryptographique est reconnue par sa base interne. Son intérêt principal est d'empêcher l'exécution de code ayant été ajouté à l{{'}}''UEFI PE'' à l'insu de l'administrateur de la machine mais il peut également servir, entre-autre, à empêcher tout autre système (amorçage ''USB'' par exemple) de démarrer.<br />
<br />
Afin que cette fonction ai un sens, il est préférable de n'autoriser que vos propres clés. Ceci n'est malheureusement pas possible sur la plupart des ''PC'' du marcher. En effet, les ''UEFI'' des machines grand publique embarquent celles de ''Microsoft'' pour le démarrage de ''Windows'' (obligatoire pour bénéficier de la certification idoine) et elles ne proposent pas (dans toutes celles que j'ai vu) de fonction pour gérer la base interne de clés (elles ne proposent bien souvent même pas d'administrer les entrées de démarrage...). Il est peut-être possible de contourner cette limitation avec l'outil <code>mokutil</code> mais je n'ai pas creusé cette piste... La problématique des clés ''Microsoft'' est bien entendu que leur présence rend caduc l'exclusivité de la validité de vos signatures. Qui peut utiliser leur clé ? L'administration de ce paramètre semble donc réservée aux ordinateurs professionnels (les ''DELL XPS'' le permettent) et aux plateformes serveurs.<br />
<br />
Il convient en outre de s'assurer qu'aucun accès physique non autorisé à la machine n'a lieu car les gros malins qui ont rédigés les spécifications de l{{'}}''UEFI'' n'ont pas crus bon d'imposer le stockage de sa configuration en mémoire morte... L'utilisation d'une mémoire vive maintenue par une pile comme sur l'antique ''BIOS'' ayant retenu leur préférence, le débranchement de cette dernière engendrera une réinitialisation complète des paramètres et de la base de clés ''Secure Boot'' (permettant ainsi l'introduction de toute forme de charges utiles au démarrage). Ceci aura donc pour effet de ruiner la mince barrière de sécurité que nous venons de mettre en place...<br />
<br />
Enfin, un mot de passe d'accès aux paramètres de l{{'}}''UEFI'' reste tout de même une pratique à suivre afin de vous assurer qu'aucune injection de clé non autorisée n'ai lieu. Dans le cas d'une réinitialisation par débranchement de la pile, vous saurez au moins qu'une action physique a été opérée sur la machine et pourrez entreprendre les mesures qui s'imposent (à commencer par ne surtout pas taper votre phrase de passe [[Cryptsetup|LUKS]] !). Vous pourrez par la suite vérifier la signature de votre ''UKI'' via un autre système pour s'assurer de son intégrité (pensez également à vérifier la présence d'enregistreurs de frappes [https://www.youtube.com/watch?v=AMzv6ymmUcw matériels]).<br />
<br />
==Glossaire==<br />
La base de clés de ''Secure Boot'' comporte cinq [https://www.malekal.com/quest-ce-que-secure-boot-protection-pc-uefi-comment-ca-marche/ sections] :<br />
* '''MOK''' (''Machine Owner Key'') : base de données contenant les clés de l'utilisateur - inutile pour cette procédure<br />
* '''PK''' (''Plateform Key'') : base de données contenant les clés de la machine - utile pour cette procédure<br />
* '''DB''' (''Data Base'') : base de données des clés autorisées (liste blanche) - utile pour cette procédure<br />
* '''KEK''' (''Key Exchange Keys'') : aucune idée - inutile pour cette procédure<br />
* '''DBX''' : (''Data Base'' <introuvable dans les specs mais probablement ''Exclusion''>) : base de données des clés interdites (liste noire) - inutile pour cette procédure<br />
<br />
==Génération de clés==<br />
Création du répertoire de travail<br />
mkdir -p /usr/local/lib/secureboot/mok<br />
<br />
Génération d'une clé privée ''RSA'' 4096 bits (le maximum possible avec ''Shim'' - que nous n'utilisons pas - est, aux dernières nouvelles ([https://wiki.debian.org/SecureBoot#Generating_a_new_key 21/06/2022]) 2048 bits) et d'un certificat public associé<br />
openssl req -nodes -new -x509 -newkey rsa:4096 -keyout /usr/local/lib/secureboot/mok/MOK.priv -outform DER -out /usr/local/lib/secureboot/mok/MOK.der -days 36500 -subj "/CN=Mon Nom/"<br />
<br />
Conversion du certificat en ''PEM'' afin d'être utilisable par <code>sbsign</code><br />
openssl x509 -inform der -in /usr/local/lib/secureboot/mok/MOK.der -out /usr/local/lib/secureboot/mok/MOK.pem<br />
<br />
Empêcher la lecture de ces fichiers par un autre utilisateur que root<br />
chmod 400 /usr/local/lib/secureboot/mok/{MOK.priv,MOK.der,MOK.pem}<br />
<br />
Les étapes qui suivent sont réalisées automatiquement par le script créé plus haut et sont notées à titre indicatif.<br />
<br />
Le certificat au format ''PEM'' est utilisé par les commandes du paquet <code>sbsigntool</code> alors que la ''DER'' est utilisée par les ''UEFI'' (pourquoi utiliser le même format hein ?). il doit être renseignée deux fois dans les menus de gestion des clés de votre carte mère :<br />
* une fois dans ''Plateform Key'' (''PK'')<br />
* l'autre dans ''DB'' (''Authorized Signatures'')<br />
<br />
Le certificat ''DER'' doit être accessible à l{{'}}''UEFI'' pour injection. Vous pouvez le mettre dans toute partition ''FAT'' comme votre ''ESP'' <code>/boot/efi/EFI/</code> ou sur une clé ''USB'' afin de l'y sélectionner depuis le menu dédié (peut être supprimé à l'issue).<br />
<br />
==Signature de l'image==<br />
Dans la commande qui suit, la signature de l'image va réécrir par dessus l'originale (sa somme de contrôle va changer). Ce comportement est volontaire mais peut être changé en modifiant la valeur de <code>--output</code><br />
sbsign --key /usr/local/lib/secureboot/mok/MOK.priv --cert /usr/local/lib/secureboot/mok/MOK.pem --output /boot/efi/EFI/Linux/1-debian.efi /boot/efi/EFI/Linux/1-debian.efi<br />
<br />
Vérification de la signature<br />
sbverify --cert /usr/local/lib/secureboot/mok/MOK.pem /boot/efi/EFI/Linux/1-debian.efi<br />
<br />
Une fois ''Secure Boot'' activé et votre système démarré, vous pouvez vérifier l'effectivité de cette fonctionnalité via la commande suivante du paquet <code>mokutil</code><br />
mokutil --sb-state<br />
<br />
{{astuce|La signature d'un module noyau complilé par vous même peut se faire via la commande suivante (exemple pour le pilote <code>ixgbe</code>) : <code>/usr/lib/linux-kbuild-6.1/scripts/sign-file sha512 /usr/local/lib/secureboot/mok/MOK.{priv,der} /lib/modules/6.1.0-17-amd64/updates/drivers/net/ethernet/intel/ixgbe/ixgbe.ko /tmp/ixgbe.ko</code>.}}<br />
<br />
==Sources de la section==<br />
* https://uefi.org/specifications<br />
* https://wiki.debian.org/SecureBoot#Generating_a_new_key<br />
* https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance?view=windows-11</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Ipxe&diff=1508Ipxe2024-02-28T11:17:51Z<p>Ycharbi : Ajout d'une explication sur la compilation multi-plateforme + remplacement des balises sources obsolètes + ajout d'un lien en introduction + corrections typographiques</p>
<hr />
<div>[[Category:pxe]]<br />
[https://ipxe.org/start IPXE] est une ''ROM'' contenant un micrologiciel permettant d'amorcer un système depuis le réseau (comme celui intégré aux cartes mères). Sa particularité réside dans le fait qu'il ne se limite pas à une utilisation basique du protocole ''PXE'' mais va beaucoup plus loin. Il est notamment possible d'amorcer un système via ''HTTP/HTTPS'', ''FTP'', ''SLAM'', ''NFS'' et ''ISCSI'' en plus du ''TFTP/TFTP-Multicast'' traditionnel. Il est également capable d’exécuter des scripts et on peut le personnaliser avant sa compilation pour intégrer plus ou moins de fonctionnalité en fonction des besoins.<br />
<br />
Une image IPXE pré-compilée est disponible sur le [http://ipxe.org site officiel] à [http://boot.ipxe.org/ipxe.iso cette adresse]. Nous allons détailler les étapes de compilation manuelles. Il est à noter que l'usage de l'outil en ligne ([https://github.com/xbgmsharp/ipxe-buildweb/ auto-hébergeable]) https://rom-o-matic.eu/ permet une compilation à distance en cliquant sur les éléments que l'on veut intégrer à notre image.<br />
<br />
=Compilation=<br />
'''Installation des dépendances'''<br />
apt install git make gcc perl binutils liblzma-dev genisoimage<br />
<br />
'''Téléchargement des sources'''<br />
git clone git://git.ipxe.org/ipxe.git<br />
<br />
'''Édition du fichier de configuration'''<br />
<br />
L'outil ''make'' lit le fichier de configuration <code>./src/config/general.h</code> pour déterminer les modules à intégrer à la compilation.<br />
<br />
Tout les paramètres à prendre en compte doivent être précédés par un croisillon (<code>#</code>). Les modules à définir doivent êtres passés en paramètre à <code>define</code> et ceux qui ne doivent pas l'être, à <code>undefine</code>.<br />
<br />
Aussi, voici ce que nous avons pour la gestion de l{{'}}''IPv6'', du ''NFS'' et de l{{'}}''ISCSI'' (fichier partiel, j'ai juste mis ce que j'ai modifié en remplaçant les autres lignes par <code>...</code>) :<br />
<br />
cd ./ipxe/src/<br />
vim config/general.h<br />
<br />
<syntaxhighlight lang="bash"><br />
...<br />
#define NET_PROTO_IPV6 /* IPv6 protocol */<br />
...<br />
#define DOWNLOAD_PROTO_NFS<br />
...<br />
#define SANBOOT_PROTO_ISCSI<br />
...<br />
</syntaxhighlight><br />
<br />
make -j 9<br />
<br />
Un fichier <code>bin/ipxe.iso</code> a été créé. Nous y trouvons également d'autre fichiers tel que des ''ROM'' pour cartes réseau et un noyau Linux ''iPXE'' (''ipxe.lkrn'') permettant l'amorçage par le réseau via ''pxelinux'' (nous utilisons ce dernier dans notre documentation sur l'[[Installation Windows via PXE|Installation de Windows via PXE]]).<br />
<br />
'''Multi-plateforme'''<br />
<br />
Pour compiler l'outil sur les plateformes ''UEFI'' (32 et 64 bits) et ''Bios'' pour amorçage ''PXE'', les commandes suivantes peuvent êtres utilisées :<br />
make bin-x86_64-efi/ipxe.efi -j 9<br />
make bin-i386-efi/ipxe.efi -j 9<br />
make bin-i386-pcbios/ipxe.pxe -j 9<br />
<br />
Les binaires d'amorçage sont disponibles aux noms indiqués dans les commandes pour leur plateforme respective. La liste supportés est disponible sur la page de [https://ipxe.org/appnote/buildtargets documentation] du projet.<br />
<br />
=Test=<br />
Dés à présent, l'ISO généré peut être utilisé dans un média amorçable, un [[serveur PXE]] ou testé via [[Qemu]] comme suit :<br />
qemu-system-x86_64 -m 1024 -vga qxl -fda /tmp/ipxe/src/bin/ipxe.iso -tftp /tmp/pxe -bootp lpxelinux.0 -boot n -net user -net nic,model=e1000,macaddr=00:11:22:33:44:55 -net tap,ifname=qtap0 -netdev tap,id=t0,ifname=vnet0,script=no,downscript=no -device e1000,netdev=t0 --enable-kvm -cpu host -smp cores=2,threads=1,sockets=1<br />
<br />
J'ai copié les fichiers nécessaires au démarrage ''PXE'' de mon serveur dans le <code>/tmp/pxe</code> (créé pour l'occasion) de mon hôte. L'interface réseau '''vnet0''' se créée toute seule sur l'hôte et permet une communication paire à paire avec la machine virtuelle (c'est avec ce lien que l'amorçage s'effectue). La deuxième interface permet à la ''MV'' de sortir sur le ''WAN'' si un routage est effectué dans votre réseau ou si vous utilisez du ''NAT'' comme ceci :<br />
<br />
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE<br />
echo 1 > /proc/sys/net/ipv4/ip_forward<br />
ip a a 172.16.1.1/24 dev vnet0<br />
ip l set vnet0 up<br />
<br />
Ne pas oublié le serveur ''HTTP'' sur l'hôte (un [[Busybox#Serveur_WEB|busybox httpd]] fait très bien l'affaire) :<br />
busybox httpd -fvv -h /tmp/pxe/<br />
<br />
=Sources=<br />
* http://ipxe.org/download<br />
* https://blog.widodh.nl/2015/11/pxe-boot-over-ipv6-with-ipxe/</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Unified_kernel_image&diff=1507Unified kernel image2024-02-28T00:34:12Z<p>Ycharbi : Page créée avec « Category:Noyau_linux Une Image Noyau Unifiée (INU) ou ''Unified Kernel Image'' (''UKI'') est la combinaison d'un programme de démarrage ''UEFI'', d'une image noyau ''Linux'', d'un ''initrd'' ainsi que d'autres ressources optionnelles dans un seul fichier ''UEFI [https://fr.wikipedia.org/wiki/Portable_Executable PE]''. Il peut alors être invoqué directement par : * le micrologiciel ''UEFI'' : utile notamment dans certains environnements d'informatique en... »</p>
<hr />
<div>[[Category:Noyau_linux]]<br />
<br />
Une Image Noyau Unifiée (INU) ou ''Unified Kernel Image'' (''UKI'') est la combinaison d'un programme de démarrage ''UEFI'', d'une image noyau ''Linux'', d'un ''initrd'' ainsi que d'autres ressources optionnelles dans un seul fichier ''UEFI [https://fr.wikipedia.org/wiki/Portable_Executable PE]''. Il peut alors être invoqué directement par :<br />
* le micrologiciel ''UEFI'' : utile notamment dans certains environnements d'informatique en nuage ou confidentiels<br />
* un chargeur de démarrage : généralement utile pour permettre plusieurs versions de noyau avec une sélection interactive ou automatique de la version dans laquelle démarrer ([[Systemd-boot]] ou [[Grub]] permettent cela)<br />
<br />
L'amorçage de cette image unifiée est permise par le ''stub'', programme logé dans celle-ci et pouvant être interprété par l{{'}}''UEFI''. Il constitue donc la partie exécutable initiale de l'image combinée et charge par la suite d'autres ressources à partir du reste de l{{'}}''INU'', en particulier le noyau et l{{'}}''initrd''.<br />
<br />
La [https://uapi-group.org/specifications/specs/unified_kernel_image/ spécification officielle] définit le format et les composants (obligatoires et optionnels) des ''UKI'' qui sont fournis en tant que sections ''PE/COFF'' de l'exécutable.<br />
<br />
L'intérêt principal de cette approche est qu'elle permet de mieux sécuriser le démarrage d'un système en exposant un unique binaire (''UEFI PE'') en clair sur le disque d'amorçage (''EFI System Partition'' - ''ESP'') au lieu d'une multitude de fichiers pouvant être modifiés par le premier pirate venu. Cet exécutable pourra alors être signé par ''Secure Boot'' et permettre, entre-autre, le déchiffrement de la racine en s'assurant de l’absence de sa propre altération (enregistreur de frappes par exemple).<br />
<br />
=Image Noyau Unifiée=<br />
==Installation des outils==<br />
La génération d'une ''INU'' nécessite quelques outils. Le projet ''Systemd'' met à disposition un programme ''Python'' nommé <code>Ukify</code> à partir de la version 253 de l{{'}}''init''. Il est logé à l'emplacement <code>/usr/lib/systemd/ukify</code> mais nécessite la bibliothèque <code>python3-pefile</code> et ses dépendances pour fonctionner. L'approche exposé dans ce document visant la frugalité (''Ukify'' apporte surtout une configuration épurée mais l'aspect fonctionnel est identique), le strict nécessaire sera installé.<br />
apt install --no-install-recommends systemd-boot-efi binutils gawk sbsigntool<br />
<br />
Détails des paquets installés :<br />
* '''systemd-boot-efi''' : fournit le ''stub <code>/usr/lib/systemd/boot/efi/linuxx64.efi.stub</code><br />
* '''binutils''' : fournit le programme de construction du binaire ''PE'' <code>objdump</code><br />
* '''gawk''' : fournit la version ''GNU'' de l'interpréteur de langage ''AWK'' afin de ne pas avoir l'erreur de fonction non définie <code>function strtonum never defined</code> du <code>awk</code> de base<br />
* '''sbsigntool''' : permet de signer l{{'}}''UKI'' en vu d'une validation ''Secure Boot'' (optionnel)<br />
<br />
==Script de génération==<br />
La génération d'une ''UKI'' nécessitant la concaténation d'une multitude d'éléments, il n'est pas envisageable de renseigner l'ensemble des paramètres manuellement. Je vous propose un script permettant la création d'une image ainsi que sa rotation sur trois versions différentes (l'une écrase la précédente à chaque nouvelle exécution). <br />
vim /mnt/usr/local/sbin/gen-uki<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/bash<br />
<br />
# Récupération de la version du noyau en cours d'utilisation<br />
if [[ -n "${1}" ]]; then<br />
version_noyau="${1}"<br />
else<br />
version_noyau="$(uname -r)"<br />
fi<br />
<br />
# Chemin vers l'initrd de travail<br />
if [[ -n "${2}" ]]; then<br />
chemin_initrd="${2}"<br />
else<br />
chemin_initrd="/boot/initrd.img-${version_noyau}"<br />
fi<br />
<br />
# Chemin vers le noyau de travail<br />
if [[ -n "${2}" ]]; then<br />
chemin_noyau="/boot/vmlinuz-${1}"<br />
else<br />
chemin_noyau="/boot/vmlinuz-${version_noyau}"<br />
fi<br />
<br />
# Définition des variables du script<br />
chemin_lsb="/usr/lib/os-release"<br />
chemin_stub="/usr/lib/systemd/boot/efi/linuxx64.efi.stub"<br />
chemin_cmdline="/etc/kernel/cmdline"<br />
chemin_splash="/dev/null"<br />
nom_uki1="1-debian.efi"<br />
nom_uki2="2-debian.efi"<br />
nom_uki3="3-debian.efi"<br />
chemin_base="/boot/efi/EFI/Linux/"<br />
chemin_dst_uki="${chemin_base}/${nom_uki1}"<br />
chemin_sb_clef="/usr/local/lib/secureboot/mok/MOK.priv"<br />
chemin_sb_cert="/usr/local/lib/secureboot/mok/MOK.pem"<br />
<br />
# Création de l'arborescence des UKI<br />
mkdir -p "${chemin_base}"<br />
<br />
# Préparation de l'UKI<br />
align="$(objdump -p ${chemin_stub} | awk '{ if ($1 == "SectionAlignment"){print $2} }')"<br />
align=$((16#$align))<br />
osrel_offs="$(objdump -h "${chemin_stub}" | awk 'NF==7 {size=strtonum("0x"$3); offset=strtonum("0x"$4)} END {print size + offset}')"<br />
osrel_offs=$((osrel_offs + "$align" - osrel_offs % "$align"))<br />
cmdline_offs=$((osrel_offs + $(stat -Lc%s "${chemin_lsb}")))<br />
cmdline_offs=$((cmdline_offs + "$align" - cmdline_offs % "$align"))<br />
splash_offs=$((cmdline_offs + $(stat -Lc%s "${chemin_cmdline}")))<br />
splash_offs=$((splash_offs + "$align" - splash_offs % "$align"))<br />
initrd_offs=$((splash_offs + $(stat -Lc%s "${chemin_splash}")))<br />
initrd_offs=$((initrd_offs + "$align" - initrd_offs % "$align"))<br />
linux_offs=$((initrd_offs + $(stat -Lc%s "${chemin_initrd}")))<br />
linux_offs=$((linux_offs + "$align" - linux_offs % "$align"))<br />
<br />
# Roulement, si elle existe et n'est pas vide, de l'UKI 2 en 3<br />
if [[ -s "${chemin_base}${nom_uki2}" ]]; then<br />
echo "Copie de l'UKI 2 en 3..."<br />
cp -v "${chemin_base}${nom_uki2}" "${chemin_base}${nom_uki3}"<br />
fi<br />
<br />
# Roulement, si elle existe et n'est pas vide, de l'UKI 1 en 2<br />
if [[ -s "${chemin_dst_uki}" ]]; then<br />
echo "Copie de l'UKI 1 en 2..."<br />
cp -v "${chemin_dst_uki}" "${chemin_base}${nom_uki2}"<br />
fi<br />
<br />
echo "Génération de l'image noyau combinée (UKI) numéro 1..."<br />
objcopy \<br />
--add-section .osrel="${chemin_lsb}" --change-section-vma .osrel=$(printf 0x%x $osrel_offs) \<br />
--add-section .cmdline="${chemin_cmdline}" --change-section-vma .cmdline=$(printf 0x%x $cmdline_offs) \<br />
--add-section .splash="${chemin_splash}" --change-section-vma .splash=$(printf 0x%x $splash_offs) \<br />
--add-section .initrd="${chemin_initrd}" --change-section-vma .initrd=$(printf 0x%x $initrd_offs) \<br />
--add-section .linux="${chemin_noyau}" --change-section-vma .linux=$(printf 0x%x $linux_offs) \<br />
"${chemin_stub}" "${chemin_dst_uki}"<br />
<br />
# Signature de l'UKI pour la vérification Secure Boot seulement si la clé et son certificat son présents<br />
if [[ -r "${chemin_sb_clef}" && -r "${chemin_sb_cert}" ]]; then<br />
sbsign --key "${chemin_sb_clef}" --cert "${chemin_sb_cert}" --output "${chemin_dst_uki}" "${chemin_dst_uki}"<br />
sbverify --cert "${chemin_sb_cert}" "${chemin_dst_uki}"<br />
fi<br />
</syntaxhighlight><br />
<br />
Les [[Paramètres linux|paramètres]] du noyau (de la variable <code>$chemin_cmdline</code>) doivent contenir les informations sur votre système de fichier racine afin que ''Linux'' puisse l'amorcer. Vous pouvez vous appuyer sur l'exemple ci-dessous qui comprend une partition chiffrée contenant un sous-volume ''BTRFS''.<br />
<br />
<syntaxhighlight lang="bash"><br />
echo "root=UUID=${uuid_racine} cryptdevice=UUID=${uuid_luks} ro rootflags=subvol=@rootfs console=tty0 console=ttyS0,115200n8" > /mnt/etc/kernel/cmdline<br />
</syntaxhighlight><br />
<br />
Pensez bien entendu à remplacer les variables par vos propres valeurs...<br />
<br />
Vous pouvez également vous appuyer sur le <code>/proc/cmdline</code> pour visualiser les paramètres utilisés par votre propre système afin de vous en inspirer. La liste des paramètres possible est visualisable dans la [https://www.kernel.org/doc/html/v6.5/admin-guide/kernel-parameters.html documentation] du noyau.<br />
<br />
chmod u+x /usr/local/sbin/gen-uki<br />
<br />
==Automatisation==<br />
Le script ainsi créé peut être lancé manuellement mais il est préférable qu'il soit appelé à chaque mise à jour de noyau ou d{{'}}''initrd'' afin de garantir un démarrage sur la dernière version disponible. Cette dépendance se créée en l'exposant dans les répertoire de post-construction de nos deux composants d'intérêts.<br />
<br />
mkdir -p /etc/initramfs/post-update.d<br />
ln -s /usr/local/sbin/gen-uki /etc/initramfs/post-update.d/zz-gen-uki<br />
ln -s /usr/local/sbin/gen-uki /etc/kernel/postinst.d/zz-gen-uki<br />
chmod u+x /etc/initramfs/post-update.d/zz-gen-uki /etc/kernel/postinst.d/zz-gen-uki<br />
<br />
{{info|Le répertoire <code>/etc/initramfs/post-update.d</code> n'est pas créé par défaut dans ''GNU/Linux Debian'' mais est bien parcouru lors de la génération d'une nouvelle archive d{{'}}''init''.}}<br />
<br />
==Création des entrées de démarrage==<br />
Dans l'optique d'optimiser au mieux le démarrage de notre machine, nous n'utiliserons aucun chargeur d'amorçage. Nous créerons alors des entrées de démarrage dans notre ''UEFI'' pointant directement sur nos ''UKI'' (son menu nous permettra de sélectionner la version à lancer). Pour se faire, il est possible de passer par l'interface de celui-ci (lorsque l'option est disponible) ou via l'outil [[Efibootmgr]] (universel). Voici un exemple pour les trois générées par le script (il est possible de créer les entrées avant les images) :<br />
<br />
<syntaxhighlight lang="bash"><br />
disque_systeme=/dev/nvme0n1<br />
<br />
efibootmgr -c -d "${disque_systeme}" -p 1 -l '\EFI\Linux\1-debian.efi' -L "Debian UKI 1"<br />
efibootmgr -c -d "${disque_systeme}" -p 1 -l '\EFI\Linux\2-debian.efi' -L "Debian UKI 2"<br />
efibootmgr -c -d "${disque_systeme}" -p 1 -l '\EFI\Linux\3-debian.efi' -L "Debian UKI 3"<br />
</syntaxhighlight><br />
<br />
Ainsi, dans le cas malencontreux où une mise à jour de noyau ou une reconstruction d{{'}}''initrd'' occasionne une impossibilité à démarrer, les versions précédentes de votre image vous permettront de vous en sortir.<br />
<br />
==Sources de la section==<br />
* https://uapi-group.org/specifications/specs/unified_kernel_image/<br />
* https://0pointer.de/blog/brave-new-trusted-boot-world.html<br />
* https://wiki.debian.org/EFIStub#Setting_up_a_Unified_Kernel_Image<br />
<br />
=Secure Boot=<br />
<br />
{{info|Cette section est facultative.}}<br />
<br />
''Secure Boot'' ([https://uefi.org/sites/default/files/resources/UEFI_Spec_2_3_1.pdf chapitre 27] des spécification ''UEFI'') est une fonctionnalité apparue avec la version 2.3.1 de l{{'}}''UEFI'' permettant de borner l'amorçage aux seuls systèmes dont la signature cryptographique est reconnue par sa base interne. Son intérêt principal est d'empêcher l'exécution de code ayant été ajouté à l{{'}}''UEFI PE'' à l'insu de l'administrateur de la machine mais il peut également servir, entre-autre, à empêcher tout autre système (amorçage ''USB'' par exemple) de démarrer.<br />
<br />
Afin que cette fonction ai un sens, il est préférable de n'autoriser que vos propres clés. Ceci n'est malheureusement pas possible sur la plupart des ''PC'' du marcher. En effet, les ''UEFI'' des machines grand publique embarquent celles de ''Microsoft'' pour le démarrage de ''Windows'' (obligatoire pour bénéficier de la certification idoine) et elles ne proposent pas (dans toutes celles que j'ai vu) de fonction pour gérer la base interne de clés (elles ne proposent bien souvent même pas d'administrer les entrées de démarrage...). Il est peut-être possible de contourner cette limitation avec l'outil <code>mokutil</code> mais je n'ai pas creusé cette piste... La problématique des clés ''Microsoft'' est bien entendu que leur présence rend caduc l'exclusivité de la validité de vos signatures. Qui peut utiliser leur clé ? L'administration de ce paramètre semble donc réservée aux ordinateurs professionnels (les ''DELL XPS'' le permettent) et aux plateformes serveurs.<br />
<br />
Enfin, il convient de s'assurer qu'aucun accès physique non autorisé à la machine n'a lieu car les gros malins qui ont rédigés les spécifications de l{{'}}''UEFI'' n'ont pas crus bon d'imposer le stockage de sa configuration en mémoire morte... L'utilisation d'une mémoire vive maintenue par une pile comme sur l'antique ''BIOS'' ayant retenu leur préférence, le débranchement de cette dernière engendrera une réinitialisation complète des paramètres et de la base de clés ''Secure Boot'' (permettant ainsi l'introduction de toute forme de charges utiles au démarrage), ce qui ruinera la mince barrière de sécurité que nous venons de mettre en place...<br />
<br />
==Glossaire==<br />
La base de clés de ''Secure Boot'' comporte cinq [https://www.malekal.com/quest-ce-que-secure-boot-protection-pc-uefi-comment-ca-marche/ sections] :<br />
* '''MOK''' (''Machine Owner Key'') : base de données contenant les clés de l'utilisateur - inutile pour cette procédure<br />
* '''PK''' (''Plateform Key'') : base de données contenant les clés de la machine - utile pour cette procédure<br />
* '''DB''' (''Data Base'') : base de données des clés autorisées (liste blanche) - utile pour cette procédure<br />
* '''KEK''' (''Key Exchange Keys'') : aucune idée - inutile pour cette procédure<br />
* '''DBX''' : (''Data Base'' <introuvable dans les specs mais probablement ''Exclusion''>) : base de données des clés interdites (liste noire) - inutile pour cette procédure<br />
<br />
==Génération de clés==<br />
Création du répertoire de travail<br />
mkdir -p /usr/local/lib/secureboot/mok<br />
<br />
Génération d'une clé privée ''RSA'' 4096 bits (le maximum possible avec ''Shim'' - que nous n'utilisons pas - est, aux dernières nouvelles ([https://wiki.debian.org/SecureBoot#Generating_a_new_key 21/06/2022]) 2048 bits) et d'un certificat public associé<br />
openssl req -nodes -new -x509 -newkey rsa:4096 -keyout /usr/local/lib/secureboot/mok/MOK.priv -outform DER -out /usr/local/lib/secureboot/mok/MOK.der -days 36500 -subj "/CN=Mon Nom/"<br />
<br />
Conversion du certificat en ''PEM'' afin d'être utilisable par <code>sbsign</code><br />
openssl x509 -inform der -in /usr/local/lib/secureboot/mok/MOK.der -out /usr/local/lib/secureboot/mok/MOK.pem<br />
<br />
Empêcher la lecture de ces fichiers par un autre utilisateur que root<br />
chmod 400 /usr/local/lib/secureboot/mok/{MOK.priv,MOK.der,MOK.pem}<br />
<br />
Les étapes qui suivent sont réalisées automatiquement par le script créé plus haut et sont notées à titre indicatif.<br />
<br />
Le certificat au format ''PEM'' est utilisé par les commandes du paquet <code>sbsigntool</code> alors que la ''DER'' est utilisée par les ''UEFI'' (pourquoi utiliser le même format hein ?). il doit être renseignée deux fois dans les menus de gestion des clés de votre carte mère :<br />
* une fois dans ''Plateform Key'' (''PK'')<br />
* l'autre dans ''DB'' (''Authorized Signatures'')<br />
<br />
Le certificat ''DER'' doit être accessible à l{{'}}''UEFI'' pour injection. Vous pouvez le mettre dans toute partition ''FAT'' comme votre ''ESP'' <code>/boot/efi/EFI/</code> ou sur une clé ''USB'' afin de l'y sélectionner depuis le menu dédié (peut être supprimé à l'issue).<br />
<br />
==Signature de l'image==<br />
Dans la commande qui suit, la signature de l'image va réécrir par dessus l'originale (sa somme de contrôle va changer). Ce comportement est volontaire mais peut être changé en modifiant la valeur de <code>--output</code><br />
sbsign --key /usr/local/lib/secureboot/mok/MOK.priv --cert /usr/local/lib/secureboot/mok/MOK.pem --output /boot/efi/EFI/Linux/1-debian.efi /boot/efi/EFI/Linux/1-debian.efi<br />
<br />
Vérification de la signature<br />
sbverify --cert /usr/local/lib/secureboot/mok/MOK.pem /boot/efi/EFI/Linux/1-debian.efi<br />
<br />
Une fois ''Secure Boot'' activé et votre système démarré, vous pouvez vérifier l'effectivité de cette fonctionnalité via la commande suivante du paquet <code>mokutil</code><br />
mokutil --sb-state<br />
<br />
{{astuce|La signature d'un module noyau complilé par vous même peut se faire via la commande suivante (exemple pour le pilote <code>ixgbe</code>) : <code>/usr/lib/linux-kbuild-6.1/scripts/sign-file sha512 /usr/local/lib/secureboot/mok/MOK.{priv,der} /lib/modules/6.1.0-17-amd64/updates/drivers/net/ethernet/intel/ixgbe/ixgbe.ko /tmp/ixgbe.ko</code>.}}<br />
<br />
==Sources de la section==<br />
* https://uefi.org/specifications<br />
* https://wiki.debian.org/SecureBoot#Generating_a_new_key<br />
* https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance?view=windows-11</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Unbound&diff=1506Unbound2024-02-10T22:26:49Z<p>Ycharbi : Ajout de la section "Convertir une liste de domaines en RPZ"</p>
<hr />
<div>[[Category:Service_dns]]<br />
<br />
[https://www.nlnetlabs.nl/projects/unbound/about/ Unbound] est un serveur ''DNS'' faisant office de résolveur récursif et pouvant faire autorité sur des domaines locaux. Il est développé par [https://www.nlnetlabs.nl/ NLnet Labs] et se veut à la fois complet en fonctionnalité, léger (grâce à la modularité de ces dernières) et simple à configurer.<br />
<br />
=Installation et configuration=<br />
Installation du service avec une ''Debian Bullseye''<br />
apt install --no-install-recommends unbound<br />
<br />
Afin d'utiliser directement les serveurs racines pour la résolution récursive des requêtes clientes, il faut télécharger [https://{{SERVERNAME}}/fichiers/services/dns/root.hints la liste] contenant leurs adresses<br />
wget https://www.internic.net/domain/named.root -O /var/lib/unbound/root.hints && chown unbound:unbound /var/lib/unbound/root.hints<br />
<br />
Le fichier de configuration suivant sera utilisé<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf<br />
# Fichier de configuration d'Unbound pour Debian.<br />
#<br />
# Référez-vous à la page de manuel unbound.conf(5).<br />
#<br />
# Voyez /usr/share/doc/unbound/examples/unbound.conf pour un<br />
# fichier de configuration de référence commenté.<br />
#<br />
# La ligne suivante permet d'inclure les fichiers de configuration<br />
# additionnels depuis le répertoire /etc/unbound/unbound.conf.d.<br />
include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"<br />
<br />
server:<br />
statistics-interval: 0<br />
extended-statistics: yes<br />
statistics-cumulative: yes<br />
verbosity: 3<br />
<br />
# Paramètres réseau<br />
interface: 127.0.0.1<br />
interface: 192.168.1.5<br />
port: 53<br />
do-ip4: yes<br />
do-ip6: no<br />
do-udp: yes<br />
do-tcp: no<br />
<br />
# Contrôle d'accès<br />
access-control: 127.0.0.0/8 allow<br />
access-control: 192.168.0.0/16 allow<br />
access-control: 0.0.0.0/0 refuse<br />
<br />
# DNSSEC<br />
# auto-trust-anchor-file: "/var/lib/unbound/root.key"<br />
harden-dnssec-stripped: yes<br />
<br />
# Adresses des serveurs racine<br />
root-hints: "/var/lib/unbound/root.hints"<br />
<br />
# Paramètres système<br />
hide-identity: yes<br />
hide-version: yes<br />
harden-glue: yes<br />
use-caps-for-id: yes<br />
cache-min-ttl: 3600<br />
cache-max-ttl: 86400<br />
prefetch: yes<br />
num-threads: 6<br />
msg-cache-slabs: 16<br />
rrset-cache-slabs: 16<br />
infra-cache-slabs: 16<br />
key-cache-slabs: 16<br />
rrset-cache-size: 256m<br />
msg-cache-size: 128m<br />
so-rcvbuf: 1m<br />
unwanted-reply-threshold: 10000<br />
do-not-query-localhost: yes<br />
val-clean-additional: yes<br />
<br />
# Journalisation<br />
use-syslog: no<br />
logfile: /var/log/unbound.log<br />
<br />
# Paramètres du cache<br />
cache-min-ttl: 3600<br />
cache-max-ttl: 86400<br />
prefetch: yes<br />
prefetch-key: yes<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Il est possible de servir des domaines locaux (faire autorité)<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf.d/ycharbi.yo.conf<br />
server:<br />
local-zone: "ycharbi.yo." static<br />
local-data: "ycharbi.yo. IN A 192.168.1.1"<br />
local-data: "toto1.ycharbi.yo. IN A 192.168.1.25"<br />
local-data: "ycharbi.yo. IN MX 10 toto1.ycharbi.yo."<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Il est également possible de rediriger des requêtes clientes après modification (''DNS'' menteur aussi appelée ''Reponse Policy Zone'' ou ''RPZ'') afin d’interdire l'accès à certains domaines. J'utilise cette fonctionnalité à deux fins :<br />
* Servir mon [[Debmirror|miroir de dépôt local]] à toute mes machines sans avoir à changer leur [[Sources.list|configuration]]<br />
* Éviter certains sites irrespectueux des données personnelles (utilisation d'une liste automatique [[#Liste_RPZ_automatique|plus bas]])<br />
<br />
Il est à noter que tous les sous-domaines de chaque entrée sont automatiquement pris en compte.<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf.d/rpz.conf<br />
server:<br />
# Miroirs de dépôts APT Debian<br />
local-zone: "ftp.fr.debian.org" redirect<br />
local-data: "ftp.fr.debian.org A 192.168.1.77"<br />
local-zone: "http.debian.net" redirect<br />
local-data: "http.debian.net A 192.168.1.77"<br />
local-zone: "deb.debian.org" redirect<br />
local-data: "deb.debian.org A 192.168.1.77"<br />
local-zone: "security.debian.org" redirect<br />
local-data: "security.debian.org A 192.168.1.77"<br />
local-zone: "httpredir.debian.org" redirect<br />
local-data: "httpredir.debian.org A 192.168.1.77"<br />
local-zone: "debian.map.fastlydns.net" redirect<br />
local-data: "debian.map.fastlydns.net A 192.168.1.77"<br />
<br />
# APT utilise aussi des champs SRV pour résoudre l'adresse des miroirs<br />
local-zone: "prod.debian.map.fastly.net" redirect<br />
local-data: "prod.debian.map.fastly.net A 192.168.1.77"<br />
local-zone: "dpvctowv9b08b.cloudfront.net" redirect<br />
local-data: "dpvctowv9b08b.cloudfront.net A 192.168.1.77"<br />
local-zone: "_http._tcp.deb.debian.org." redirect<br />
local-data: "_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 prod.debian.map.fastly.net."<br />
local-data: "_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 dpvctowv9b08b.cloudfront.net."<br />
<br />
# Saloperies à supprimer<br />
local-zone: "doubleclick.net" redirect<br />
local-data: "doubleclick.net A 127.0.0.1"<br />
local-zone: "googlesyndication.com" redirect<br />
local-data: "googlesyndication.com A 127.0.0.1"<br />
local-zone: "googleadservices.com" redirect<br />
local-data: "googleadservices.com A 127.0.0.1"<br />
local-zone: "google-analytics.com" redirect<br />
local-data: "google-analytics.com A 127.0.0.1"<br />
local-zone: "ads.youtube.com" redirect<br />
local-data: "ads.youtube.com A 127.0.0.1"<br />
local-zone: "adserver.yahoo.com" redirect<br />
local-data: "adserver.yahoo.com A 127.0.0.1"<br />
local-zone: "ask.com" redirect<br />
local-data: "ask.com A 127.0.0.1"<br />
local-zone: "facebook.com" redirect<br />
local-data: "facebook.com A 127.0.0.1"<br />
local-zone: "truste-svc.net" redirect<br />
local-data: "truste-svc.net A 127.0.0.1"<br />
local-zone: "trustarc.com" redirect<br />
local-data: "trustarc.com A 127.0.0.1"<br />
local-zone: "gstatic.com" redirect<br />
local-data: "gstatic.com A 127.0.0.1"<br />
local-zone: "consent.google.com" redirect<br />
local-data: "consent.google.com A 127.0.0.1"<br />
local-zone: "consent.youtube.com" redirect<br />
local-data: "consent.youtube.com A 127.0.0.1"<br />
local-zone: "cdn.privacy-mgmt.com" redirect<br />
local-data: "cdn.privacy-mgmt.com A 127.0.0.1"<br />
local-zone: "privacy-mgmt.com" redirect<br />
local-data: "privacy-mgmt.com A 127.0.0.1"<br />
local-zone: "cdn.cookielaw.org" redirect<br />
local-data: "cdn.cookielaw.org A 127.0.0.1"<br />
local-zone: "digitalfeedback.us.confirmit.com" redirect<br />
local-data: "digitalfeedback.us.confirmit.com A 127.0.0.1"<br />
<br />
# Télémétrie Mozilla<br />
local-zone: "incoming.telemetry.mozilla.org" redirect<br />
local-data: "incoming.telemetry.mozilla.org A 127.0.0.1"<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Vérification de la configuration du service<br />
unbound-checkconf<br />
<br />
Redémarrage du service<br />
systemctl restart unbound<br />
<br />
Il est également possible de recharger la configuration sans relancer le logiciel. Cela a pour effet de ne pas le faire planter si jamais un fichier de configuration contient une erreur<br />
unbound-control reload<br />
<br />
Enfin, il est possible de configurer le système du serveur pour utiliser notre résolveur local et ne pas dépendre d'un résolveur de plus haut niveau (celui de notre ''FAI'' par exemple)<br />
echo "nameserver 127.0.0.1" > /etc/resolv.conf<br />
<br />
==Sources de la section==<br />
* https://memo-linux.com/debian-installer-le-serveur-dns-unbound/<br />
* https://memo-linux.com/ubuntu-serveur-dns-unbound/<br />
* https://lists.nlnetlabs.nl/pipermail/unbound-users/2014-October/003573.html<br />
* https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html<br />
<br />
=Convertir une liste de domaines en RPZ=<br />
Il est possible de trouver des listes de domaines générées par des tiers sur Internet ([https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt exemple] d'une liste de domaine utilisés par ''Windows 10'' - [https://github.com/schrebra/Windows.10.DNS.Block.List source]).<br />
<br />
Pour les convertir en fichier de configuration ''RPZ'' avec syntaxe ''Unbound'', vous pouvez utiliser mon script :<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/bash<br />
<br />
# Via un fichier distant<br />
unbound_rbl_src=$(wget -qO - https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt)<br />
# ou via un fichier local<br />
# unbound_rbl_src=$(cat /tmp/windows10-rbl.txt)<br />
unbound_rbl_dst="/tmp/windows10-rbl-unbound.conf"<br />
<br />
echo "server:" > "${unbound_rbl_dst}"<br />
for i in $unbound_rbl_src; do<br />
echo -e "\tlocal-zone: \"${i}\" redirect\n\tlocal-data: \"${i} A 127.0.0.1\"" >> "${unbound_rbl_dst}"<br />
done <br />
</syntaxhighlight><br />
<br />
Ce fichier sera à placer dans le répertoire des configurations du résolveur ''DNS'' <code>/etc/unbound/unbound.conf.d/</code> avant rechargement <code>unbound-control reload</code>.<br />
<br />
=Liste RPZ automatique=<br />
Le site [https://pgl.yoyo.org pgl.yoyo.org] met à jour et publie une [https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext liste de domaines] à interdire au format ''Unbound''. Ceci peut être utile afin de filtrer les sites irrespectueux de la vie privée des utilisateurs<br />
<br />
{{info|De façon générale, il est préférable de laisser ce filtrage être opéré par les utilisateurs eux-même afin de maintenir un [https://www.arcep.fr/nos-sujets/la-neutralite-du-net.html réseau aussi neutre que possible]. Il est important également de considérer l'aspect sécuritaire au fait de récupérer une liste de résolution canonique sur un site tiers. Rien ne garanti que son administrateur (ou un pirate) n'utilisera cette liste pour faire rediriger un site légitime vers une adresse externe et compromettre l'authenticité de vos communications avec celui-ci. Cette solution est à adapter à la situation locale.}}<br />
<br />
Le script suivant (écrit par [https://zestedesavoir.com/@sgble sgble] et adapté par mes soins) permet de récupérer la dernière version de la liste tout en sauvegardant sa copie actuelle, d'en vérifier la syntaxe et ainsi de soit recharger le service, soit restaurer sa version fonctionnelle :<br />
<br />
<syntaxhighlight lang="php"><br />
cat << _EOF_ > /usr/local/sbin/maj-rbl-unbound<br />
#!/bin/bash<br />
<br />
# Lien de la liste<br />
yoyo_url="https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext"<br />
<br />
# Localisation de la configuration Unbound<br />
unbound_confs="/etc/unbound/unbound.conf.d/"<br />
<br />
# Si le fichier précédent existe déjà, le garder en réserver au cas où<br />
if [ -f "${unbound_confs}"/yoyo_blocus.conf ]; then<br />
cp "${unbound_confs}"/yoyo_blocus.conf /tmp/yoyo_blocus.conf.sauv<br />
fi<br />
<br />
# Télécharger et placer la liste au bon endroit<br />
wget "${yoyo_url}" -O "${unbound_confs}"/yoyo_blocus.conf && sed -i '1 s/^/server:\n/' "${unbound_confs}"/yoyo_blocus.conf<br />
<br />
# Vérifier que Unbound ne rencontre aucun problème avec la liste et recharger si vrai<br />
if unbound-checkconf; then<br />
echo "La nouvelle liste est bonne"<br />
unbound-control reload<br />
echo "Unbound a été rechargé"<br />
# Sinon, rétablir l'ancien fichier qu'on a gardé en réserve<br />
else<br />
echo "La nouvelle liste semble mal formaté"<br />
mv /tmp/yoyo_blocus.conf.sauv "${unbound_confs}"/yoyo_blocus.conf<br />
echo "Une restauration de l'ancienne liste a été effectuée"<br />
fi<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
chmod +x /usr/local/sbin/maj-rbl-unbound<br />
<br />
Création d'un [[Minuteur - systemd|minuteur Systemd]] afin d'automatiser l'actualisation de la liste (tous les jours)<br />
mkdir -p /usr/local/etc/systemd/system<br />
<br />
<syntaxhighlight lang="ini"><br />
cat << _EOF_ > /usr/local/etc/systemd/system/maj-rbl-unbound.service<br />
[Unit]<br />
Description=Actualisation de la liste RPZ d'Unbound<br />
After=network.target<br />
<br />
[Service]<br />
Type=oneshot<br />
ExecStart=maj-rbl-unbound<br />
RemainAfterExit=yes<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="ini"><br />
cat << _EOF_ > /usr/local/etc/systemd/system/maj-rbl-unbound.timer<br />
[Unit]<br />
Description=Exécution journalière de l'actualisation de la liste RPZ d'Unbound<br />
<br />
[Timer]<br />
OnCalendar=daily<br />
Persistent=true<br />
<br />
[Install]<br />
WantedBy=timers.target<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.service /etc/systemd/system/<br />
ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.timer /etc/systemd/system/<br />
<br />
systemctl daemon-reload<br />
<br />
systemctl enable maj-rbl-unbound.timer<br />
systemctl start maj-rbl-unbound.timer<br />
<br />
=Sources de la section=<br />
* https://zestedesavoir.com/billets/3908/avoir-son-dns-local-securite-controle-et-performance/</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Unbound&diff=1505Unbound2024-02-10T21:03:03Z<p>Ycharbi : /* Liste RPZ automatique */ ajout du lien direct vers la RBL de yoyo.org</p>
<hr />
<div>[[Category:Service_dns]]<br />
<br />
[https://www.nlnetlabs.nl/projects/unbound/about/ Unbound] est un serveur ''DNS'' faisant office de résolveur récursif et pouvant faire autorité sur des domaines locaux. Il est développé par [https://www.nlnetlabs.nl/ NLnet Labs] et se veut à la fois complet en fonctionnalité, léger (grâce à la modularité de ces dernières) et simple à configurer.<br />
<br />
=Installation et configuration=<br />
Installation du service avec une ''Debian Bullseye''<br />
apt install --no-install-recommends unbound<br />
<br />
Afin d'utiliser directement les serveurs racines pour la résolution récursive des requêtes clientes, il faut télécharger [https://{{SERVERNAME}}/fichiers/services/dns/root.hints la liste] contenant leurs adresses<br />
wget https://www.internic.net/domain/named.root -O /var/lib/unbound/root.hints && chown unbound:unbound /var/lib/unbound/root.hints<br />
<br />
Le fichier de configuration suivant sera utilisé<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf<br />
# Fichier de configuration d'Unbound pour Debian.<br />
#<br />
# Référez-vous à la page de manuel unbound.conf(5).<br />
#<br />
# Voyez /usr/share/doc/unbound/examples/unbound.conf pour un<br />
# fichier de configuration de référence commenté.<br />
#<br />
# La ligne suivante permet d'inclure les fichiers de configuration<br />
# additionnels depuis le répertoire /etc/unbound/unbound.conf.d.<br />
include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"<br />
<br />
server:<br />
statistics-interval: 0<br />
extended-statistics: yes<br />
statistics-cumulative: yes<br />
verbosity: 3<br />
<br />
# Paramètres réseau<br />
interface: 127.0.0.1<br />
interface: 192.168.1.5<br />
port: 53<br />
do-ip4: yes<br />
do-ip6: no<br />
do-udp: yes<br />
do-tcp: no<br />
<br />
# Contrôle d'accès<br />
access-control: 127.0.0.0/8 allow<br />
access-control: 192.168.0.0/16 allow<br />
access-control: 0.0.0.0/0 refuse<br />
<br />
# DNSSEC<br />
# auto-trust-anchor-file: "/var/lib/unbound/root.key"<br />
harden-dnssec-stripped: yes<br />
<br />
# Adresses des serveurs racine<br />
root-hints: "/var/lib/unbound/root.hints"<br />
<br />
# Paramètres système<br />
hide-identity: yes<br />
hide-version: yes<br />
harden-glue: yes<br />
use-caps-for-id: yes<br />
cache-min-ttl: 3600<br />
cache-max-ttl: 86400<br />
prefetch: yes<br />
num-threads: 6<br />
msg-cache-slabs: 16<br />
rrset-cache-slabs: 16<br />
infra-cache-slabs: 16<br />
key-cache-slabs: 16<br />
rrset-cache-size: 256m<br />
msg-cache-size: 128m<br />
so-rcvbuf: 1m<br />
unwanted-reply-threshold: 10000<br />
do-not-query-localhost: yes<br />
val-clean-additional: yes<br />
<br />
# Journalisation<br />
use-syslog: no<br />
logfile: /var/log/unbound.log<br />
<br />
# Paramètres du cache<br />
cache-min-ttl: 3600<br />
cache-max-ttl: 86400<br />
prefetch: yes<br />
prefetch-key: yes<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Il est possible de servir des domaines locaux (faire autorité)<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf.d/ycharbi.yo.conf<br />
server:<br />
local-zone: "ycharbi.yo." static<br />
local-data: "ycharbi.yo. IN A 192.168.1.1"<br />
local-data: "toto1.ycharbi.yo. IN A 192.168.1.25"<br />
local-data: "ycharbi.yo. IN MX 10 toto1.ycharbi.yo."<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Il est également possible de rediriger des requêtes clientes après modification (''DNS'' menteur aussi appelée ''Reponse Policy Zone'' ou ''RPZ'') afin d’interdire l'accès à certains domaines. J'utilise cette fonctionnalité à deux fins :<br />
* Servir mon [[Debmirror|miroir de dépôt local]] à toute mes machines sans avoir à changer leur [[Sources.list|configuration]]<br />
* Éviter certains sites irrespectueux des données personnelles (utilisation d'une liste automatique [[#Liste_RPZ_automatique|plus bas]])<br />
<br />
Il est à noter que tous les sous-domaines de chaque entrée sont automatiquement pris en compte.<br />
<br />
<syntaxhighlight lang="nestedtext"><br />
cat << _EOF_ > /etc/unbound/unbound.conf.d/rpz.conf<br />
server:<br />
# Miroirs de dépôts APT Debian<br />
local-zone: "ftp.fr.debian.org" redirect<br />
local-data: "ftp.fr.debian.org A 192.168.1.77"<br />
local-zone: "http.debian.net" redirect<br />
local-data: "http.debian.net A 192.168.1.77"<br />
local-zone: "deb.debian.org" redirect<br />
local-data: "deb.debian.org A 192.168.1.77"<br />
local-zone: "security.debian.org" redirect<br />
local-data: "security.debian.org A 192.168.1.77"<br />
local-zone: "httpredir.debian.org" redirect<br />
local-data: "httpredir.debian.org A 192.168.1.77"<br />
local-zone: "debian.map.fastlydns.net" redirect<br />
local-data: "debian.map.fastlydns.net A 192.168.1.77"<br />
<br />
# APT utilise aussi des champs SRV pour résoudre l'adresse des miroirs<br />
local-zone: "prod.debian.map.fastly.net" redirect<br />
local-data: "prod.debian.map.fastly.net A 192.168.1.77"<br />
local-zone: "dpvctowv9b08b.cloudfront.net" redirect<br />
local-data: "dpvctowv9b08b.cloudfront.net A 192.168.1.77"<br />
local-zone: "_http._tcp.deb.debian.org." redirect<br />
local-data: "_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 prod.debian.map.fastly.net."<br />
local-data: "_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 dpvctowv9b08b.cloudfront.net."<br />
<br />
# Saloperies à supprimer<br />
local-zone: "doubleclick.net" redirect<br />
local-data: "doubleclick.net A 127.0.0.1"<br />
local-zone: "googlesyndication.com" redirect<br />
local-data: "googlesyndication.com A 127.0.0.1"<br />
local-zone: "googleadservices.com" redirect<br />
local-data: "googleadservices.com A 127.0.0.1"<br />
local-zone: "google-analytics.com" redirect<br />
local-data: "google-analytics.com A 127.0.0.1"<br />
local-zone: "ads.youtube.com" redirect<br />
local-data: "ads.youtube.com A 127.0.0.1"<br />
local-zone: "adserver.yahoo.com" redirect<br />
local-data: "adserver.yahoo.com A 127.0.0.1"<br />
local-zone: "ask.com" redirect<br />
local-data: "ask.com A 127.0.0.1"<br />
local-zone: "facebook.com" redirect<br />
local-data: "facebook.com A 127.0.0.1"<br />
local-zone: "truste-svc.net" redirect<br />
local-data: "truste-svc.net A 127.0.0.1"<br />
local-zone: "trustarc.com" redirect<br />
local-data: "trustarc.com A 127.0.0.1"<br />
local-zone: "gstatic.com" redirect<br />
local-data: "gstatic.com A 127.0.0.1"<br />
local-zone: "consent.google.com" redirect<br />
local-data: "consent.google.com A 127.0.0.1"<br />
local-zone: "consent.youtube.com" redirect<br />
local-data: "consent.youtube.com A 127.0.0.1"<br />
local-zone: "cdn.privacy-mgmt.com" redirect<br />
local-data: "cdn.privacy-mgmt.com A 127.0.0.1"<br />
local-zone: "privacy-mgmt.com" redirect<br />
local-data: "privacy-mgmt.com A 127.0.0.1"<br />
local-zone: "cdn.cookielaw.org" redirect<br />
local-data: "cdn.cookielaw.org A 127.0.0.1"<br />
local-zone: "digitalfeedback.us.confirmit.com" redirect<br />
local-data: "digitalfeedback.us.confirmit.com A 127.0.0.1"<br />
<br />
# Télémétrie Mozilla<br />
local-zone: "incoming.telemetry.mozilla.org" redirect<br />
local-data: "incoming.telemetry.mozilla.org A 127.0.0.1"<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Vérification de la configuration du service<br />
unbound-checkconf<br />
<br />
Redémarrage du service<br />
systemctl restart unbound<br />
<br />
Il est également possible de recharger la configuration sans relancer le logiciel. Cela a pour effet de ne pas le faire planter si jamais un fichier de configuration contient une erreur<br />
unbound-control reload<br />
<br />
Enfin, il est possible de configurer le système du serveur pour utiliser notre résolveur local et ne pas dépendre d'un résolveur de plus haut niveau (celui de notre ''FAI'' par exemple)<br />
echo "nameserver 127.0.0.1" > /etc/resolv.conf<br />
<br />
==Sources de la section==<br />
* https://memo-linux.com/debian-installer-le-serveur-dns-unbound/<br />
* https://memo-linux.com/ubuntu-serveur-dns-unbound/<br />
* https://lists.nlnetlabs.nl/pipermail/unbound-users/2014-October/003573.html<br />
* https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html<br />
<br />
=Liste RPZ automatique=<br />
Le site [https://pgl.yoyo.org pgl.yoyo.org] met à jour et publie une [https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext liste de domaines] à interdire au format ''Unbound''. Ceci peut être utile afin de filtrer les sites irrespectueux de la vie privée des utilisateurs<br />
<br />
{{info|De façon générale, il est préférable de laisser ce filtrage être opéré par les utilisateurs eux-même afin de maintenir un [https://www.arcep.fr/nos-sujets/la-neutralite-du-net.html réseau aussi neutre que possible]. Il est important également de considérer l'aspect sécuritaire au fait de récupérer une liste de résolution canonique sur un site tiers. Rien ne garanti que son administrateur (ou un pirate) n'utilisera cette liste pour faire rediriger un site légitime vers une adresse externe et compromettre l'authenticité de vos communications avec celui-ci. Cette solution est à adapter à la situation locale.}}<br />
<br />
Le script suivant (écrit par [https://zestedesavoir.com/@sgble sgble] et adapté par mes soins) permet de récupérer la dernière version de la liste tout en sauvegardant sa copie actuelle, d'en vérifier la syntaxe et ainsi de soit recharger le service, soit restaurer sa version fonctionnelle :<br />
<br />
<syntaxhighlight lang="php"><br />
cat << _EOF_ > /usr/local/sbin/maj-rbl-unbound<br />
#!/bin/bash<br />
<br />
# Lien de la liste<br />
yoyo_url="https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext"<br />
<br />
# Localisation de la configuration Unbound<br />
unbound_confs="/etc/unbound/unbound.conf.d/"<br />
<br />
# Si le fichier précédent existe déjà, le garder en réserver au cas où<br />
if [ -f "${unbound_confs}"/yoyo_blocus.conf ]; then<br />
cp "${unbound_confs}"/yoyo_blocus.conf /tmp/yoyo_blocus.conf.sauv<br />
fi<br />
<br />
# Télécharger et placer la liste au bon endroit<br />
wget "${yoyo_url}" -O "${unbound_confs}"/yoyo_blocus.conf && sed -i '1 s/^/server:\n/' "${unbound_confs}"/yoyo_blocus.conf<br />
<br />
# Vérifier que Unbound ne rencontre aucun problème avec la liste et recharger si vrai<br />
if unbound-checkconf; then<br />
echo "La nouvelle liste est bonne"<br />
unbound-control reload<br />
echo "Unbound a été rechargé"<br />
# Sinon, rétablir l'ancien fichier qu'on a gardé en réserve<br />
else<br />
echo "La nouvelle liste semble mal formaté"<br />
mv /tmp/yoyo_blocus.conf.sauv "${unbound_confs}"/yoyo_blocus.conf<br />
echo "Une restauration de l'ancienne liste a été effectuée"<br />
fi<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
chmod +x /usr/local/sbin/maj-rbl-unbound<br />
<br />
Création d'un [[Minuteur - systemd|minuteur Systemd]] afin d'automatiser l'actualisation de la liste (tous les jours)<br />
mkdir -p /usr/local/etc/systemd/system<br />
<br />
<syntaxhighlight lang="ini"><br />
cat << _EOF_ > /usr/local/etc/systemd/system/maj-rbl-unbound.service<br />
[Unit]<br />
Description=Actualisation de la liste RPZ d'Unbound<br />
After=network.target<br />
<br />
[Service]<br />
Type=oneshot<br />
ExecStart=maj-rbl-unbound<br />
RemainAfterExit=yes<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="ini"><br />
cat << _EOF_ > /usr/local/etc/systemd/system/maj-rbl-unbound.timer<br />
[Unit]<br />
Description=Exécution journalière de l'actualisation de la liste RPZ d'Unbound<br />
<br />
[Timer]<br />
OnCalendar=daily<br />
Persistent=true<br />
<br />
[Install]<br />
WantedBy=timers.target<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.service /etc/systemd/system/<br />
ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.timer /etc/systemd/system/<br />
<br />
systemctl daemon-reload<br />
<br />
systemctl enable maj-rbl-unbound.timer<br />
systemctl start maj-rbl-unbound.timer<br />
<br />
=Sources de la section=<br />
* https://zestedesavoir.com/billets/3908/avoir-son-dns-local-securite-controle-et-performance/</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Appimage&diff=1504Appimage2024-02-02T17:09:05Z<p>Ycharbi : Ajout d'une section "Sources de la section" + ajout des fichiers utilisés dans "nos fichiers" + corrections de quelques commandes + correction de fautes de français + suppression d'une balise "info" faisant doublon</p>
<hr />
<div>[[Category:Gestionnaire_paquets]]<br />
<br />
[https://appimage.org/ Appimage] est un format de paquets portable (dit "universel") pour les systèmes d'exploitations utilisant un [[:Category:Noyau_linux|noyau Linux]]. Son but est de permettre la mise à disposition de logiciels indépendamment d'une distribution en particulier. Il se présente sous la forme d'un unique fichier binaire [https://fr.wikipedia.org/wiki/Executable_and_Linkable_Format Executable and Linkable Format] (''ELF'') comportant une image [[Squashfs|SquashFS]]. Cette dernière contient alors toutes les dépendances nécessaires au fonctionnement du programme. On y trouvera une similitude avec certains programmes ''Windows'' ou ''Mac OS X''.<br />
<br />
=Avantages=<br />
Les intérêts d'une telle approche sont multiples, tant pour les éditeurs, les développeurs et les utilisateurs que pour les administrateurs.<br />
<br />
Habituellement, un logiciel doit être empaqueté dans un format spécifique à une [[:Category:Distributions_linux|distribution Linux]] (''.deb'', ''.rpm'', ''.pkg''...) et doit être livré sans intégrer ses dépendances. L'éditeur doit alors maintenir un paquets par distribution en gérant un nombre de paramètres insoutenable (la version du paquet pour une distribution donnée doit se contenter des librairies imposées dans les dépôts de chaque système !). Un mainteneur de paquet spécifique (bien souvent un bénévole indépendant du projet initial) est alors désigné pour se charger de l'empaquetage, la maintenance et la distribution dans les dépôts servants les différents [[:Category:Gestionnaire_paquets|gestionnaires de paquets]].<br />
<br />
L'approche ''AppImage'' réduit donc les intermédiaires intervenant dans le processus de distribution d'un logiciel. L'éditeur construit et met à disposition un paquet standardisé intégrant les composants spécifiques au fonctionnement de sa création sur le dépôt de son choix. Les utilisateurs peuvent alors se le procurer directement (téléchargement depuis leur navigateur ''Web'' par exemple) sans attendre que leur distribution l'embarque (chose qui peut ne jamais arriver en fonction de leur gouvernance). La charge de travail est moindre pour l'éditeur et certains utilisateurs.<br />
<br />
En effet, si un programme n'est pas disponible dans les dépôts de sa distribution, ce dernier doit entreprendre un périple qui n'est parfois pas sans conséquence sur son système :<br />
* ajout de dépôts tiers comportant au choix : des failles de sécurités ou du code malveillant, des librairies entrants en conflits avec celles présentes dans la distribution d'origine, une maintenance ne suivant pas la politique de cette dernière, etc... (je ne compte plus les fois où l'assistance à un débutant concerne des problèmes liés à cette liste et dont l'unique point de convergence est la gestion de paquet sous ''Linux''...)<br />
* installation depuis un paquet au format de la distribution d'origine : comme dit précédemment, un paquet standard ne vient pas avec ses dépendances, il s’appuie sur celles des dépôts officiels (modulos les technologies spécifiques comme ''GoLang'' ou ''Electron''). Il faut alors en premier lieu réaliser l'installation dédites dépendances à la main (ou via le gestionnaire de paquet si vous avez le cul bordé de nouilles) pour procéder à celle de votre logiciel. Si les dépendances ne sont pas disponibles dans les dépôts et que les externes rentrent en conflits avec ces dernières, vous ne pouvez pas installer votre logiciel sans risquer de tout casser<br />
* compilation depuis les sources : non content d'être une galère sans nom (sur 100, combien de fois cela a fonctionné pour vous ?), la gestion des mises à jours est au mieux, une plaie totale, au pire impossible (et je ne parle bien entendu pas de la désinstallation qui relève du mystère une fois que des milliers de fichiers se sont disséminés un peu partout sur votre disque...).<br />
<br />
Un autre avantage notoire est la non altération du logiciel entre l'éditeur et l'utilisateur par des mainteneurs modifiants les options de compilation ou appliquant des patch avant distribution. On peut noter par exemple certains codecs enfreignant les brevets logiciels aux États Unis d'Amérique alors que cette notion juridique est absente dans le droit Français. Dans ce cas, un paquets hébergé sur un serveur Français pourrait contenir l'ensemble des codecs et profiter à la totalité des utilisateurs mondiaux sans passer par un mainteneur spécifique.<br />
<br />
Enfin, il est relativement aisé de cloisonner l'exécution d'un programme contenu dans un unique binaire en comparaison de la méthode traditionnelle visant à en mettre partout sur le système de fichier d'exploitation. Nous utiliserons cette méthode chaque fois que cela est souhaité afin de ne pas pourrir notre machine de production (faites un <code>tree -a ~/.*</code> si vous ne voyez pas de quoi je veux parler...).<br />
<br />
=Inconvénients=<br />
Comme toute solution est rarement intégralement rose, les avantages apportés par ''AppImage'' viennent à leur tour contrecarrer ceux apporter par la gestion traditionnelle des paquets sous ''Linux'' :<br />
* pas d'installation et de mise à jour unifié : il n'y a pas d'unique dépôt comme sous une distribution classique centralisant tous les ''AppImage'' pour permettre leur installation et leur mise à jour en une unique commande ou via un magasin d'applications (ceci n'est cependant pas techniquement impossible à l'image de ce qui se fait sur le monde des [[:Category:Ordiphones|ordiphones]])<br />
* sécurité : aucun support de l'équipe de sécurité de la distribution n'est apporté sur le paquet que vous installez, tant concernant les patchs de sécurité que la revue de code (il faut faire plus attention à ce que l'on télécharge). Le cloisonnement est une bonne pratique pour se prémunir au mieux des actes de malveillance ou simplement de la collecte de données personnelles (sous ''Debian'', ce type de comportement non éthique est généralement supprimé par les mainteneurs à la compilation)<br />
* espace disque : taille globale du paquet bien plus importante que via les dépôts officiels puisque il embarque tous les composants nécessaires à son fonctionnement. Il n'y a aucune mutualisation des librairies utilisées par les différents programmes ''AppImage'' (contrairement, dans une [très] moindre mesure, à [https://www.flatpak.org/ Flatpak])<br />
<br />
La meilleure approche semble donc une utilisation hybride des deux solutions en privilégiant la méthode traditionnelle (gestionnaire de paquets) et en usant des paquets unifiés lorsque le besoin s'en fait sentir en combinaison d'un cloisonnement lorsque cela est possible/souhaitable.<br />
<br />
=Construction d'une image=<br />
==Dépendances==<br />
''AppImage'' n'a besoin pour fonctionner que de <code>libfuse2</code>. Il convient alors de l'installer sur votre système (''Debian 12'' pour l'exemple).<br />
apt install --no-install-recommends libfuse2<br />
<br />
L'[https://github.com/AppImage/AppImageKit outil] permettant la construction des images étant lui même un paquet ''AppImage'', il suffit de le télécharger et de le rendre exécutable pour pouvoir commencer à l'utiliser.<br />
wget https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -O /usr/local/bin/appimagetool<br />
chmod +x /usr/local/bin/appimagetool<br />
<br />
Vous trouverez la version de cette documentation en cache dans [https://{{SERVERNAME}}/fichiers/gestion_paquets/appimage/appimagetool-x86_64.AppImage nos fichiers].<br />
<br />
==Construction d'une image==<br />
L'empaquetage d'une application, bien que suivant une trame générique, comporte des spécificités inhérente au programme que vous traitez. Les grandes lignes de ce qui sera montré dans cette section sera transposable pour le votre mais il ne me sera pas possible de rédiger une procédure universelle. Il faudra inévitablement galérer un peu pour votre cas particulier.<br />
<br />
===Principes===<br />
La structure d'un paquet ''AppImage'' est globalement la [https://docs.appimage.org/packaging-guide/manual.html#creating-an-appdir-manually suivante] :<br />
AppDir/<br />
AppDir/AppRun<br />
AppDir/monprog.desktop<br />
AppDir/monprog.png<br />
AppDir/usr/bin/monprog<br />
AppDir/usr/lib/libfoo.so.0<br />
<br />
* la totalité des ressources nécessaires au fonctionnement du programme doit être contenue dans le dossier normalisé <code>AppDir/</code><br />
* les chemins aux ressources contenus dans celui-ci doivent obligatoirement êtres relatifs afin de s'assurer que la paquet ''AppImage'' ne va pas utiliser des données (comme des librairies) locales au système. Ce qui donnerait une fausse impression de portabilité (cesserai de fonctionner chez certains utilisateurs)<br />
* le fichier <code>AppRun</code> est ce qui est exécuté au lancement d'un paquet ''AppImage'' (point d'entrée). Il peut s'agir de n'importe quel exécutable<br />
<br />
Afin de convertir les chemins absolus en relatifs, les commandes <code>busybox strings AppDir/usr/bin/monprog | grep /usr</code> suivie de <code>sed -i -e 's#/usr#././#g' AppDir/usr/bin/monprog</code> sont données dans la documentation officielle. Il conviendra bien évidemment de s'assurer que cette commande ne casse pas tout.<br />
<br />
===VSCodium===<br />
[https://vscodium.com/ VSCodium] est une bifurcation de l'éditeur de code [https://code.visualstudio.com/ Visual Studio Code] de ''Microsoft'' purgée de toute références aux pratiques malveillantes de cette entreprise. De part sa nature ''Microsoftienne'' et ceux, malgré les efforts pour en faire un binaire saint, nous cloisonnerons ce logiciel afin qu'il n'ai pas accès à Internet ainsi qu'au répertoire personnel de notre utilisateur via une prison [https://manpages.debian.org/stretch/firejail/firejail.1.en.html Firejail].<br />
<br />
Cette application n'étant pas disponible dans ''Debian'', nous allons la construire nous même.<br />
<br />
Les étapes de cette section consisteront à télécharger le paquet ''Debian'' (''.deb'') depuis le site de l'éditeur dans un répertoire de travail et d'y transférer son contenu en vu d'un empaquetage ''AppImage''.<br />
<br />
====Préparation====<br />
Création d'une variable de chemin spécifique à notre projet (rendra plus facile les copier/coller pour un autre programme)<br />
export appimage="/tmp/VSCodium/"<br />
<br />
Création de l'espace de travail<br />
mkdir -p $appimage/{AppDir/usr/share/,DEB} && cd $appimage<br />
<br />
Téléchargement de ''VSCodium''<br />
wget https://github.com/VSCodium/vscodium/releases/download/1.85.2.24019/codium_1.85.2.24019_amd64.deb -P $appimage/DEB/<br />
<br />
Extraction de son contenu<br />
dpkg-deb -R $appimage/DEB/codium_1.85.2.24019_amd64.deb $appimage/DEB/<br />
<br />
Copie de l'icône et du raccourci pour environnement graphique du programme<br />
cp $appimage/DEB/usr/share/pixmaps/vscodium.png $appimage/AppDir/<br />
cp $appimage/DEB/usr/share/applications/codium.desktop $appimage/AppDir/<br />
<br />
Copie des fichiers nécessaires au fonctionnement du programme<br />
cp -rv $appimage/DEB/usr/share/codium $appimage/AppDir/usr/share/<br />
<br />
Création d'un point d'entrée à l'exécution de notre paquet<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > $appimage/AppDir/AppRun<br />
#!/bin/bash<br />
<br />
$(dirname "$0")/usr/share/codium/codium ~ --ms-enable-electron-run-as-node $@<br />
#$(dirname "$0")/usr/share/codium/codium $(dirname "$0") --ms-enable-electron-run-as-node $@<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
chmod +x $appimage/AppDir/AppRun<br />
<br />
====Empaquetage====<br />
Création du répertoire contenant le résultat<br />
mkdir $appimage/VSCodium<br />
<br />
Construction du ''AppImage''<br />
appimagetool $appimage/AppDir/ $appimage/VSCodium/VSCodium.appimage<br />
<br />
Votre application est prête à l'emploi !<br />
<br />
La section suivante concerne son cloisonnement. Il est complètement optionnel et vous pouvez vous arrêter là si vous n'en avez pas besoin.<br />
<br />
Il est possible d'extraire le contenu du paquet via un <code>./VSCodium.appimage --appimage-extract</code>.<br />
<br />
====Cloisonnement====<br />
Afin de cloisonner notre application, nous utiliserons le logiciel ''Firejail'', devenu une référence pour cette tâche (il comporte une option spécifique pour notre besoin).<br />
<br />
{{attention|L'utilisateur soucieux d'utiliser le cloisonnement devra installer ce programme : <code>apt install --no-install-recommends firejail</code>.}}<br />
<br />
Création du script d'exécution du paquet cloisonné<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > $appimage/VSCodium/vscodium<br />
#!/bin/bash<br />
<br />
firejail --quiet --noprofile --nonewprivs --net=none --private=$(dirname "$0") --private-dev --caps.drop=all --seccomp --appimage $(dirname "$0")/VSCodium.appimage --no-sandbox<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
chmod +x $appimage/VSCodium/vscodium<br />
<br />
Les paramètres utilisés sont les suivants :<br />
* <code>--quiet</code> : désactive les messages de sorties de <code>firejail</code>. Celles du programme cloisonné continues quant à elles de s'afficher. La variable d'environnement <code>FIREJAIL_QUIET=yes</code> permet le même résultat<br />
* <code>--noprofile</code> : ne pas utiliser de profile par défaut (ils foutent plus la merde qu'autre chose). Il est possible de créer les notre<br />
* <code>--nonewprivs</code> : permet de s'assurer via le [https://www.man7.org/linux/man-pages/man2/prctl.2.html prctl] <code>NO_NEW_PRIVS</code> que le processus fils (notre application) ne peut pas obtenir de nouveau privilèges <br />
* <code>--net=none</code> : coupe totalement l'accès au réseau de la prison<br />
* <code>--private=$(dirname "$0")</code> : monte le répertoire contenant le script d'exécution de la prison (<code>dirname "$0"</code>) comme répertoire personnel du programme cloisonné<br />
* <code>--private-dev</code> : créé un nouveau répertoire <code>/dev</code> ne contenant que les fichiers spéciaux ''disc'', ''dri'', ''dvb'', ''hidraw'', ''null'', ''full'', ''zero'', ''tty'', ''pts'', ''ptmx'', ''random'', ''snd'', ''urandom'', ''video'', ''log'', ''shm'', et ''usb''<br />
* <code>--caps.drop=all</code> : supprime toute les [https://www.man7.org/linux/man-pages/man7/capabilities.7.html capacités] du noyau. Cela répond au principe de moindre privilèges pour les applications ne nécessitant pas d'accès ''root''<br />
* <code>--seccomp</code> : active les filtres ''Secure computing mode'' (''Seccomp'') de la liste noir des appels système par défaut<br />
* <code>--appimage $(dirname "$0")/VSCodium.appimage --no-sandbox</code> : permet le cloisonnement d'un paquet ''AppImage''. L'option <code>--nonewprivs</code> et les filtres de capacités noyau par défaut sont activés avec cette option. Les paramètres qui suivent sont ceux spécifiques au programme cloisonné (notre ''AppImage'' en l’occurrence)<br />
<br />
Dans la mesure où le cloisonnement coupe l'accès au réseau, l'ajout de modules complémentaires (greffons) à ''VSCodium'' devra se faire via la méthode d'installation hors-ligne par fichier ''.vsix''. Ces fichiers pourront êtres disposés dans le répertoire de travail passé par <code>--private=</code> afin de les rendre accessibles à l'éditeur de code.<br />
<br />
Par commodité, nous pouvons proposer le [https://marketplace.visualstudio.com/_apis/public/gallery/publishers/MS-CEINTL/vsextensions/vscode-language-pack-fr/1.85.2024012409/vspackage pack de langue français] (site officiel des modules de ''Visual Studio Code'') dans l'archive que nous mettrons à disposition des utilisateurs. Pensez à vous chronométrer avant de cliquer sur le lien pour savoir combien de temps vous mettez à simplement trouver le bouton de téléchargement (L’ergonomie façon ''Microsoft''...). Vous pouvez récupérer ce fichier dans [https://{{SERVERNAME}}/fichiers/gestion_paquets/appimage/MS-CEINTL.vscode-language-pack-fr-1.85.2024013109.vsix nos fichiers] et le mettre dans votre répertoire de travail <code>$appimage/VSCodium/</code>.<br />
<br />
Génération de l'archive finale<br />
tar -czvf /tmp/VSCodium.tar.gz -C $appimage/ VSCodium<br />
<br />
Votre application est maintenant prête à être déployée et utilisée ! Vous pouvez récupérer l'archive finale de cette procédure dans [https://{{SERVERNAME}}/fichiers/gestion_paquets/appimage/VSCodium.tar.gz nos fichiers].<br />
<br />
Les utilisateurs devrons décompresser son contenu dans l'emplacement de leur choix et exécuter le script <code>vscodium</code>.<br />
<br />
==Sources de la section==<br />
* https://docs.appimage.org/packaging-guide/manual.html<br />
* https://docs.appimage.org/reference/appdir.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Appimage&diff=1503Appimage2024-01-28T16:32:29Z<p>Ycharbi : Page créée avec « Category:Gestionnaire_paquets [https://appimage.org/ Appimage] est un format de paquets portable (dit "universel") pour les systèmes d'exploitations utilisant un noyau Linux. Son but est de permettre la mise à disposition de logiciels indépendamment d'une distribution en particulier. Il se présente sous la forme d'un unique fichier binaire [https://fr.wikipedia.org/wiki/Executable_and_Linkable_Format Executable and Linkable Form... »</p>
<hr />
<div>[[Category:Gestionnaire_paquets]]<br />
<br />
[https://appimage.org/ Appimage] est un format de paquets portable (dit "universel") pour les systèmes d'exploitations utilisant un [[:Category:Noyau_linux|noyau Linux]]. Son but est de permettre la mise à disposition de logiciels indépendamment d'une distribution en particulier. Il se présente sous la forme d'un unique fichier binaire [https://fr.wikipedia.org/wiki/Executable_and_Linkable_Format Executable and Linkable Format] (''ELF'') comportant une image [[Squashfs|SquashFS]]. Cette dernière contient alors toutes les dépendances nécessaires au fonctionnement du programme. On y trouvera une similitude avec certains programmes ''Windows'' ou ''Mac OS X''.<br />
<br />
=Avantages=<br />
Les intérêts d'une telle approche sont multiples, tant pour les éditeurs, les développeurs et les utilisateurs que pour les administrateurs.<br />
<br />
Habituellement, un logiciel doit être empaqueté dans un format spécifique à une [[:Category:Distributions_linux|distribution Linux]] (''.deb'', ''.rpm'', ''.pkg''...) et doit être livré sans intégrer ses dépendances. L'éditeur doit alors maintenir un paquets par distribution en gérant un nombre de paramètres insoutenable (la version du paquet pour une distribution donnée doit se contenter des librairies imposées dans les dépôts de chaque système !). Un mainteneur de paquet spécifique (bien souvent un bénévole indépendant du projet initial) est alors désigné pour se charger de l'empaquetage, la maintenance et la distribution dans les dépôts servants les différents [[:Category:Gestionnaire_paquets|gestionnaires de paquets]].<br />
<br />
L'approche ''AppImage'' réduit donc les intermédiaires intervenant dans le processus de distribution d'un logiciel. L'éditeur construit et met à disposition un paquet standardisé intégrant les composants spécifiques au fonctionnement de sa création sur le dépôt de son choix. Les utilisateurs peuvent alors se le procurer directement (téléchargement depuis leur navigateur ''Web'' par exemple) sans attendre que leur distribution l'embarque (chose qui peut ne jamais arriver en fonction de leur gouvernance). La charge de travail est moindre pour l'éditeur et certains utilisateurs.<br />
<br />
En effet, si un programme n'est pas disponible dans les dépôts de sa distribution, ce dernier doit entreprendre un périple qui n'est parfois pas sans conséquence sur son système :<br />
* ajout de dépôts tiers comportant au choix : des failles de sécurités ou du code malveillant, des librairies entrants en conflits avec celles présentes dans la distribution d'origine, une maintenance ne suivant pas la politique de cette dernière, etc... (je ne compte plus les fois où l'assistance à un débutant concerne des problèmes liés à cette liste et dont l'unique point de convergence est la gestion de paquet sous ''Linux''...)<br />
* installation depuis un paquet au format de la distribution d'origine : comme dit précédemment, un paquet standard ne vient pas avec ses dépendances, il s’appuie sur celles des dépôts officiels (modulos les technologies spécifiques comme ''GoLang'' ou ''Electron''). Il faut alors en premier lieu réaliser l'installation dédites dépendances à la main (ou via le gestionnaire de paquet si vous avez le cul bordé de nouilles) pour procéder à celle de votre logiciel. Si les dépendances ne sont pas disponibles dans les dépôts et que les externes rentrent en conflits avec ces dernières, vous ne pouvez pas installer votre logiciel sans risquer de tout casser<br />
* compilation depuis les sources : non content d'être une galère sans nom (sur 100, combien de fois cela à fonctionner pour vous ?), la gestion des mises à jours est au mieux, une plaie totale, au pire impossible (et je ne parle bien entendu pas de la désinstallation qui relève du mystère une fois que des milliers de fichiers se sont disséminés un peu partout sur votre disque...).<br />
<br />
Un autre avantage notoire est la non altération du logiciel entre l'éditeur et l'utilisateur par des mainteneurs modifiants les options de compilation ou appliquant des patch avant distribution. On peut noter par exemple certains codecs enfreignant les brevets logiciels aux États Unis d'Amérique alors que cette notion juridique est absente dans le droit Français. Dans ce cas, un paquets hébergé sur un serveur Français pourrait contenir l'ensemble des codecs et profiter à la totalité des utilisateurs mondiaux sans passer par un mainteneur spécifique.<br />
<br />
Enfin, il est relativement aisé de cloisonner l'exécution d'un programme contenu dans un unique binaire en comparaison de la méthode traditionnelle visant à en mettre partout sur le système de fichier d'exploitation. Nous utiliserons cette méthode chaque fois que cela est souhaité afin de ne pas pourrir notre machine de production (faites un <code>tree -a ~/.*</code> si vous ne voyez pas de quoi je veux parler...).<br />
<br />
=Inconvénients=<br />
Comme toute solution est rarement intégralement rose, les avantages apportés par ''AppImage'' viennent à leur tour contrecarrer ceux apporter par la gestion traditionnelle des paquets sous ''Linux'' :<br />
* pas d'installation et de mise à jour unifié : il n'y a pas d'unique dépôt comme sous une distribution classique centralisant tous les ''AppImage'' pour permettre leur installation et leur mise à jour en une unique commande ou via un magasin d'applications (ceci n'est cependant pas techniquement impossible à l'image de ce qui se fait sur le monde des [[:Category:Ordiphones|ordiphones]])<br />
* sécurité : aucun support de l'équipe de sécurité de la distribution n'est apporté sur le paquet que vous installez, tant concernant les patchs de sécurité que la revue de code (il faut faire plus attention à ce que l'on télécharge). Le cloisonnement est une bonne pratique pour se prémunir au mieux des actes de malveillance ou simplement de la collecte de données personnelles (sous ''Debian'', ce types de comportement non éthique est généralement supprimé par les mainteneurs à la compilation)<br />
* espace disque : taille globale du paquet bien plus importante que via les dépôts officiels puisque il embarque tous les composants nécessaires à son fonctionnement. Il n'y a aucune mutualisation des librairies utilisées par les différents programmes ''AppImage'' (contrairement, dans une [très] moindre mesure, à [https://www.flatpak.org/ Flatpak])<br />
<br />
La meilleure approche semble donc une utilisation hybride des deux solutions en privilégiant la méthode traditionnelle (gestionnaire de paquets) et en usant des paquets unifiés lorsque le besoin s'en fait sentir en combinaison d'un cloisonnement lorsque cela est possible/souhaitable.<br />
<br />
=Construction d'une image=<br />
==Dépendances==<br />
''AppImage'' n'a besoin pour fonctionner que de <code>libfuse2</code>. Il convient alors de l'installer sur votre système (''Debian 12'' pour l'exemple).<br />
apt install --no-install-recommends libfuse2<br />
<br />
L'[https://github.com/AppImage/AppImageKit outil] permettant la construction des images étant lui même un paquet ''AppImage'', il suffit de le télécharger et de le rendre exécutable pour pouvoir commencer à l'utiliser.<br />
wget https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -O /usr/local/bin/appimagetool<br />
chmod +x /usr/local/bin/appimagetool<br />
<br />
==Construction d'une image==<br />
L'empaquetage d'une application, bien que suivant une trame générique, comporte des spécificités inhérente au programme que vous traitez. Les grandes lignes de ce qui sera montré dans cette section sera transposable pour le votre mais il ne me sera pas possible de rédiger une procédure universelle. Il faudra inévitablement galérer un peu pour votre cas particulier.<br />
<br />
===Principes===<br />
La structure d'un paquet ''AppImage'' est globalement la [https://docs.appimage.org/packaging-guide/manual.html#creating-an-appdir-manually suivante] :<br />
AppDir/<br />
AppDir/AppRun<br />
AppDir/myapp.desktop<br />
AppDir/myapp.png<br />
AppDir/usr/bin/myapp<br />
AppDir/usr/lib/libfoo.so.0<br />
<br />
* la totalité des ressources nécessaires au fonctionnement du programme doit être contenue dans le dossier normalisé <code>AppDir/</code><br />
* les chemins aux ressources contenus dans celui-ci doivent obligatoirement êtres relatifs afin de s'assurer que la paquet ''AppImage'' ne va pas utiliser des données (comme des librairies) locales au système. Ce qui donnerait une fausse impression de portabilité (cesserai de fonctionner chez certains utilisateurs)<br />
* le fichier <code>AppRun</code> est ce qui est exécuté au lancement d'un paquet ''AppImage'' (point d'entrée). Il peut s'agir de n'importe quel exécutable<br />
<br />
Afin de convertir les chemins absolus en relatifs, les commandes <code>busybox strings usr/share/codium/bin/monprog | grep /usr</code> suivie de <code>sed -i -e 's#/usr#././#g' AppDir/usr/bin/monprog</code> sont données dans la documentation officielle. Il conviendra bien évidemment de s'assurer que cette commande ne casse pas tout.<br />
<br />
===VSCodium===<br />
[https://vscodium.com/ VSCodium] est une bifurcation de l'éditeur de code [https://code.visualstudio.com/ Visual Studio Code] de ''Microsoft'' purgé de toute références aux pratiques malveillantes de cet éditeur. De part sa nature ''Microsoftienne'' et ceux, malgré les efforts pour en faire un binaire saint, nous cloisonnerons ce logiciel afin qu'il n'ai pas accès à Internet ainsi qu'au répertoire personnel de notre utilisateur via une prison [https://manpages.debian.org/stretch/firejail/firejail.1.en.html Firejail].<br />
<br />
Cette application n'étant pas disponible dans ''Debian'', nous allons la construire nous même.<br />
<br />
Les étapes de cette section consisteront à télécharger le paquet ''Debian'' (''.deb'') depuis le site de l'éditeur dans un répertoire de travail et d'y transférer son contenu en vu d'un empaquetage ''AppImage''.<br />
<br />
====Préparation====<br />
Création d'une variable de chemin spécifique à notre projet (rendra plus facile les copier/coller pour un autre programme)<br />
export appimage="/tmp/VSCodium/"<br />
<br />
Création de l'espace de travail<br />
mkdir -p $appimage/{AppDir/usr/share/,DEB} && cd $appimage<br />
<br />
Téléchargement de ''VSCodium''<br />
wget https://github.com/VSCodium/vscodium/releases/download/1.85.2.24019/codium_1.85.2.24019_amd64.deb -P $appimage/DEB/<br />
<br />
Extraction de son contenu<br />
dpkg-deb -R $appimage/DEB/codium_1.85.2.24019_amd64.deb $appimage/DEB/<br />
<br />
Copie de l'icône et du raccourci pour environnement graphique du programme<br />
cp $appimage/DEB/usr/share/pixmaps/vscodium.png $appimage/AppDir/<br />
cp $appimage/DEB/usr/share/applications/codium.desktop $appimage/AppDir/<br />
<br />
Copie des fichiers nécessaires au fonctionnement du programme<br />
cp -rv $appimage/DEB/usr/share/codium $appimage/AppDir/usr/share/<br />
<br />
Création d'un point d'entrée à l'exécution de notre paquet<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > $appimage/AppDir/AppRun<br />
#!/bin/bash<br />
<br />
$(dirname "$0")/usr/share/codium/codium ~ --ms-enable-electron-run-as-node $@<br />
#$(dirname "$0")/usr/share/codium/codium $(dirname "$0") --ms-enable-electron-run-as-node $@<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
{{info|le fichier <code>AppRun</code> est ce qui est exécuté au lancement d'un paquet ''AppImage''. Il peut s'agir de n'importe quel exécutable.}}<br />
<br />
chmod +x $appimage/AppDir/AppRun<br />
<br />
====Empaquetage====<br />
Création du répertoire contenant le résultat<br />
mkdir $appimage/VSCodium<br />
<br />
Construction du ''AppImage''<br />
appimagetool $appimage/AppDir/ $appimage/VSCodium/VSCodium.appimage<br />
<br />
Votre application est prête à l'emploi !<br />
<br />
La section suivante concerne son cloisonnement. Il est complètement optionnel et vous pouvez vous arrêter là si vous n'en avez pas besoin.<br />
<br />
Il est possible d'extraire le contenu du paquet via un <code>VSCodium.appimage --appimage-extract</code>.<br />
<br />
====Cloisonnement====<br />
Afin de cloisonner notre application, nous utiliserons le logiciel ''Firejail'', devenu une référence pour cette tâche (il comporte une option spécifique pour notre besoin).<br />
<br />
{{attention|L'utilisateur soucieux d'utiliser le cloisonnement devra installer ce programme : <code>apt install --no-install-recommends firejail</code>.}}<br />
<br />
Création du script d'exécution du paquet cloisonné<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > $appimage/VSCodium/vscodium<br />
#!/bin/bash<br />
<br />
firejail --quiet --noprofile --nonewprivs --net=none --private=$(dirname "$0") --private-dev --caps.drop=all --seccomp --appimage $(dirname "$0")/VSCodium.appimage --no-sandbox<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
chmod +x $appimage/VSCodium/vscodium<br />
<br />
Les paramètres utilisés sont les suivants :<br />
* <code>--quiet</code> : désactive les sorties de <code>firejail</code>. Les sorties du programme cloisonné continues quant à elles de s'afficher. La variable d'environnement <code>FIREJAIL_QUIET=yes</code> permet le même résultat<br />
* <code>--noprofile</code> : ne pas utiliser de profile par défaut (ils foutent plus la merde qu'autre chose). Il est possible de créer les notre<br />
* <code>--nonewprivs</code> : permet de s'assurer via le [https://www.man7.org/linux/man-pages/man2/prctl.2.html prctl] <code>NO_NEW_PRIVS</code> que le processus fils (notre application) ne peut pas obtenir de nouveau privilèges <br />
* <code>--net=none</code> : coupe totalement l'accès au réseau de la prison<br />
* <code>--private=$(dirname "$0")</code> : monte le répertoire contenant le script d'exécution de la prison (<code>dirname "$0"</code>) comme répertoire personnel du programme cloisonné<br />
* <code>--private-dev</code> : créé un nouveau répertoire <code>/dev</code> ne contenant que les fichiers spéciaux ''disc'', ''dri'', ''dvb'', ''hidraw'', ''null'', ''full'', ''zero'', ''tty'', ''pts'', ''ptmx'', ''random'', ''snd'', ''urandom'', ''video'', ''log'', ''shm'', et ''usb''<br />
* <code>--caps.drop=all</code> : supprime toute les [https://www.man7.org/linux/man-pages/man7/capabilities.7.html capacités] du noyau. Cela répond au principe de moindre privilèges pour les application ne nécessitant pas d'accès ''root''<br />
* <code>--seccomp</code> : active les filtres ''Secure computing mode'' (''Seccomp'') de la liste noir des appels système par défaut<br />
* <code>--appimage $(dirname "$0")/VSCodium.appimage --no-sandbox</code> : permet le cloisonnement d'un paquet ''AppImage''. L'option <code>--nonewprivs</code> et les filtres de capacités noyau par défaut sont activés avec cette option. Les param_tres qui suivent sont ceux spécifique au programme cloisonné (notre ''AppImage'' en l’occurrence)<br />
<br />
Dans la mesure où le cloisonnement coupe l'accès au réseau, l'ajout de modules complémentaires (greffons) à ''VSCodium'' devra se faire via la méthode d'installation hors-ligne par fichier ''.vsix''. Ces fichiers pourront êtres disposés dans le répertoire de travail passé par <code>--private=</code> afin de les rendre accessibles à l'éditeur de code.<br />
<br />
Par commodité, nous pouvons proposer le [https://marketplace.visualstudio.com/_apis/public/gallery/publishers/MS-CEINTL/vsextensions/vscode-language-pack-fr/1.85.2024012409/vspackage pack de langue français] (site officiel des modules de ''Visual Studio Code'') dans l'archive que nous mettrons à disposition des utilisateurs. Pensez à vous chronométrer avant de cliquer sur le lien pour savoir combien de temps vous mettez à simplement trouver le bouton de téléchargement (L’ergonomie façon ''Microsoft''...). Vous pouvez récupérer ce fichier dans l'archive de résultat de cette section le mettre dans votre répertoire de travail <code>$appimage/VSCodium/</code>.<br />
<br />
Génération de l'archive finale<br />
tar -czf /tmp/VSCodium.tar.gz -C $appimage/ VSCodium<br />
<br />
Votre application est maintenant prête à être déployée et utilisée !<br />
<br />
Les utilisateurs devrons décompresser son contenu dans l'emplacement de leur choix et exécuter le script <code>vscodium</code>.</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Busybox_init&diff=1502Busybox init2024-01-28T11:16:57Z<p>Ycharbi : /* Busybox */ Ajout d'un lien vers les sources de Busybox en caches dans nos fichiers</p>
<hr />
<div>[[Category:distributions_linux]]<br />
<br />
[[Busybox]] intègre <code>init</code>, un programme pouvant être amorcé directement par un noyau ''Linux'' au démarrage d'une machine. Il est ainsi possible de concevoir un système d'exploitation léger composé uniquement d'un noyau et de ''Busybox''. L'adjonction d'outils supplémentaires sur cette base minimaliste pourra engendrer une distribution spécifiquement conçue pour un besoin particulier. Cette association s’avère donc particulièrement intéressante dans des systèmes embarqués tel que les ''appliances'' réseau comme [https://openwrt.org/ OpenWRT] ou [https://dd-wrt.com/ DD-WRT].<br />
<br />
Nous verrons comment construire un tel système en partant des sources de chaque programmes depuis une ''GNU/Linux Debian 12 Bookworm''. Les compilations se feront avec l'ensemble des paramètres par défaut. Je recommande d'utiliser une machine (virtuelle ''amd64'' dans mon cas) spécifiquement installée pour cet usage car un grand nombre de dépendances est nécessaire et il serait dommage de pourrir votre environnement de travail...<br />
<br />
L'espace de travail sera le répertoire personnel de l'utilisateur ''root''.<br />
<br />
=Linux=<br />
Installation des dépendances<br />
apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libelf-dev libssl-dev libncurses-dev dwarves<br />
<br />
Téléchargement des sources du dernier noyau stable (01/11/2023)<br />
<br />
<syntaxhighlight lang="bash"><br />
# Code source<br />
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz -P ~<br />
# Signature GPG<br />
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.sign -P ~<br />
</syntaxhighlight><br />
<br />
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/noyaux/linux/linux-6.6.tar.xz nos fichiers].<br />
<br />
Décompression de l'archive des sources<br />
unxz -k ~/linux-6.6.tar.xz<br />
<br />
Vérification de la signature GPG de l'archive<br />
apt install gnupg2<br />
gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org<br />
gpg2 --tofu-policy good 38DBBDC86092693E<br />
gpg2 --tofu-policy good 79BE3E4300411886<br />
gpg2 --trust-model tofu --verify ~/linux-6.6.tar.sign<br />
<br />
Note : la dernière commande doit vous renvoyer plusieurs lignes de résultat dont <code>gpg: Bonne signature de « Greg Kroah-Hartman <gregkh@kernel.org> » [totale]</code>.<br />
<br />
Désarchivage des sources<br />
tar xvf ~/linux-6.6.tar<br />
cd ~/linux-6.6/<br />
<br />
Création d'une configuration de confection saine avec les paramètres par défaut et compilation avec 4 cœurs de processeur<br />
<br />
<syntaxhighlight lang="bash"><br />
make defconfig<br />
make -j4<br />
# Retour dans le répertoire personnel<br />
cd ~<br />
</syntaxhighlight><br />
<br />
Le noyau compilé pour notre architecture x86 64bits se trouve à l'emplacement suivant : <code>~/linux-6.6/arch/x86/boot/bzImage</code>.<br />
<br />
=Busybox=<br />
Téléchargement des sources<br />
<br />
<syntaxhighlight lang="bash"><br />
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2<br />
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2.sha256<br />
</syntaxhighlight><br />
<br />
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/applications/busybox/busybox-1.36.1.tar.bz2 nos fichiers].<br />
<br />
Vérification d'intégrité<br />
sha256sum -c ~/busybox-1.36.1.tar.bz2.sha256<br />
<br />
Note : la vérification d'intégrité doit renvoyer <code>Réussi</code>.<br />
<br />
Extraction de l'archive compressée<br />
tar xvf ~/busybox-1.36.1.tar.bz2<br />
cd ~/busybox-1.36.1/<br />
<br />
Configuration par défaut et compilation du code avec lien statique afin d'embarquer les dépendances dans le binaire final<br />
<br />
<syntaxhighlight lang="bash"><br />
make defconfig<br />
make -j4 LDFLAGS="--static"<br />
# Retour dans le répertoire personnel<br />
cd ~<br />
</syntaxhighlight><br />
<br />
''Busybox'' est désormais disponible ici : <code>~/busybox-1.36.1/busybox</code><br />
<br />
=Média d'amorce=<br />
Nous avons dés à présent en notre possession tous les programmes de notre future système d'exploitation. Vous pouvez préparer les vôtres en vue de les intégrer dans les sections qui suivent.<br />
<br />
Les méthodes d'amorçages peuvent varier selon les besoins et votre convenance. Je répertorie personnellement 3 cas d'usage :<br />
# mémoire morte avec système de fichier classique type ''EXT4''<br />
# [https://fr.wikipedia.org/wiki/Initrd initramfs]<br />
# ''PXE''<br />
<br />
Toute les démonstrations seront réalisées via [[Qemu]]. La mise en œuvre du réseau ne sera pas détaillée car j'utilise des scripts personnalisés avec mon système. La création d'une interface ''tap'' et son exploitation via la directive <code>-device virtio-net-pci,netdev=network0,mac=$tap_mac -netdev tap,id=network0,ifname=$int_tap,script=no,downscript=no</code> permet de lier la machine virtuel au réseau physique via l'adjonction d'un pont réseau.<br />
<br />
L'étape <code>1</code> fera office de tronc commun aux autres sections afin de ne pas alourdir le document avec une redondance inutile et difficilement maintenable. Seule celle-ci nécessite l'utilisation d'un périphérique de type bloc, les deux autres peuvent êtres réalisées directement dans <code>~/rootfs</code> si vous le désirez. La réalisation successive des trois étapes est toutefois possible. Il faudra simplement penser à remonter <code>~/rootfs</code> afin de ne pas travailler dans un répertoire vide...<br />
<br />
==1. Amorçage en mémoire morte==<br />
Cette façon de faire permet de modifier simplement le contenu de votre distribution après coup. Il suffit pour se faire de monter le système de fichier en écriture pour y actualiser son contenu à votre guise.<br />
<br />
Pour l'exemple, je créerai un fichier simulant un périphérique de type bloc du nom de <code>busybox.dd</code> au même titre qu'une mémoire morte. En condition réelle, remplacez celui-ci par votre périphérique physique : <code>/dev/sda</code>; <code>/dev/mmcblk</code>; <code>/dev/nvme0n1</code>...<br />
<br />
Création et formatage de la mémoire racine<br />
dd if=/dev/zero of=~/busybox.dd bs=1M count=1024<br />
mkfs.ext4 ~/busybox.dd<br />
<br />
Création et montage de l'environnement de travail<br />
mkdir -p ~/rootfs<br />
mount ~/busybox.dd ~/rootfs<br />
cd ~/busybox-1.36.1/<br />
<br />
Installation de l'arborescence du système ''Busybox'' dans notre système de fichiers avec [https://stackoverflow.com/questions/49369508/kernel-panic-not-syncing-requested-init-linuxrc-failed-error-2 lien statiques]<br />
make install CONFIG_PREFIX=../rootfs LDFLAGS="--static"<br />
cd ~<br />
<br />
Cette étape a créée les répertoires standards permettant d’accueillir les binaires usuels du système selon la [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] (''FHS''). L'exécutable <code>busybox</code> précédemment compilé a été copié dans le nouveau <code>/bin</code> et des liens symboliques ont étés créés pointant vers celui-ci avec le nom de tous les utilitaires qu'il contient.<br />
<br />
Création des points montages des pseudos systèmes de fichiers usuels, de la table de montages statiques et du répertoire accueillant notre futur script d'initialisation<br />
mkdir -p ~/rootfs/proc ~/rootfs/sys ~/rootfs/dev<br />
mkdir -p ~/rootfs/etc<br />
touch ~/rootfs/etc/fstab<br />
mkdir -p ~/rootfs/etc/init.d<br />
<br />
Script d'initialisation du système<br />
<br />
<syntaxhighlight lang="bash"><br />
bash -c "cat > ~/rootfs/etc/init.d/rcS" << _EOF_<br />
#!/bin/sh<br />
<br />
# Message d'accueil<br />
echo "Busybox ycharbi.fr"<br />
# Pseudos systèmes de fichiers usuels<br />
mount -t proc proc /proc<br />
mount -t sysfs sysfs /sys<br />
mount -t devtmpfs none /dev<br />
<br />
# Configuration réseau<br />
ip addr add 10.0.0.1/24 dev eth0<br />
ip link set dev eth0 up<br />
ip route add default via 10.0.0.254 dev eth0<br />
<br />
# Clavier en AZERTY<br />
loadkmap < /etc/fr.map<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Attribution du droit d'exécution au script d'initialisation<br />
chmod +x ~/rootfs/etc/init.d/rcS<br />
<br />
Configuration des Télétypes (''TTY'')<br />
<br />
<syntaxhighlight lang="bash"><br />
bash -c "cat > ~/rootfs/etc/inittab" << _EOF_<br />
::sysinit:/etc/init.d/rcS<br />
ttyS0::respawn:/bin/sh<br />
tty2::askfirst:-/bin/sh<br />
tty3::askfirst:-/bin/sh<br />
tty4::askfirst:-/bin/sh<br />
tty4::respawn:/sbin/getty 38400 tty5<br />
tty5::respawn:/sbin/getty 38400 tty6<br />
::ctrlaltdel:/sbin/reboot<br />
::shutdown:/sbin/swapoff -a<br />
::shutdown:/bin/umount -a -r<br />
::restart:/sbin/init<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Ce fichier définit les ''TTY'' qui doivent êtres invoqués au lancement de <code>init</code>. Vous devrez probablement adapter ceci à votre besoin. La documentation de ces lignes ainsi que de la configuration appliquée par défaut en cas d'absence du fichier est disponible dans <code>~/busybox-1.36.1/examples/inittab</code>.<br />
<br />
Création du binaire de traduction clavier afin d'utiliser l{{'}}''AZERTY''<br />
busybox dumpkmap > ~/rootfs/etc/fr.map<br />
<br />
À ce stade, notre mémoire morte est prête.<br />
<br />
Pour permettre son amorçage, un éventail de possibilités s'offre à vous : [[Grub]]; [[Systemd-boot]]; [[Efibootmgr#Création_d'une_entrée_de_type_STUB|UEFI stub]]; [[Ipxe]]; [[Installation_slax_-_UEFI_64bits#Préparation_de_l'environnement_hôte|Syslinux]]... Pour ma part et comme précisé en introduction, j'utiliserai [[Qemu#Démarrage_de_la_machine_virtuelle|Qemu]] afin de simplifier au maximum l'exposé.<br />
<br />
Démontage du système de fichier<br />
umount ~/rootfs<br />
<br />
Note : si vous comptez poursuivre les étapes des sections suivantes, pensez à remonter ce système de fichier ou à en copier le contenu dans un autre répertoire de travail afin de ne pas recommencer à zéro.<br />
<br />
Test du système avec ''Qemu'' (<code>apt install --no-install-recommends qemu-system-x86</code>)<br />
<br />
<syntaxhighlight lang="bash"><br />
qemu-system-x86_64 \<br />
--enable-kvm \<br />
-m 2048 \<br />
-device virtio-balloon \<br />
-kernel ~/linux-6.6/arch/x86/boot/bzImage \<br />
-append "ro root=/dev/sda console=ttyS0 quiet" \<br />
-cpu host -smp cores=2,threads=1,sockets=1 \<br />
-serial mon:stdio \<br />
-drive id=disk,file="${HOME}"/busybox.dd,format=raw,if=none \<br />
-device ahci,id=ahci \<br />
-device ide-hd,drive=disk,bus=ahci.0 \<br />
-display none<br />
</syntaxhighlight><br />
<br />
Pour un affichage sans port console, il faut supprimer le paramètre <code>console=ttyS0</code> de la directive <code>-append</code>; supprimer la directive <code>-display none</code> et remplacer la ligne <code>ttyS0::respawn:/bin/sh</code> par <code>tty1::respawn:/bin/sh</code> dans le <code>inittab</code>.<br />
<br />
==2. Amorçage en initramfs==<br />
L'utilisation d'un système de fichiers initial en mémoire à accès aléatoire apporte encore plus de légèreté à la solution. Un unique fichier compressé vient s'ajouter au noyau en cours d'exécution pour servir la racine construite précédemment. Le système est exécuté intégralement en mémoire vive et peut donc se voir distribué via des protocoles réseaux tel que ''TFTP'' ou ''HTTP''.<br />
<br />
Construction de l'archive compressée ''Initramfs''<br />
cd ~/rootfs && find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz && cd ~<br />
<br />
Test du système avec ''Qemu''<br />
<br />
<syntaxhighlight lang="bash"><br />
qemu-system-x86_64 \<br />
--enable-kvm \<br />
-m 2048 \<br />
-device virtio-balloon \<br />
-kernel ~/linux-6.6/arch/x86/boot/bzImage \<br />
-append "ro rootfstype=ramfs rdinit=/sbin/init console=ttyS0 quiet" \<br />
-initrd ~/initramfs.cpio.gz \<br />
-cpu host -smp cores=2,threads=1,sockets=1 \<br />
-serial mon:stdio \<br />
-display none<br />
</syntaxhighlight><br />
<br />
Les différences de lancement sont :<br />
* modification des paramètres noyau ([https://www.man7.org/linux/man-pages/man7/kernel-command-line.7.html cmdline]) de la directive <code>-append</code><br />
* ajout de la directive <code>-initrd</code><br />
* les directives concernant le disque ''SATA'' ont étés supprimées<br />
<br />
<br />
==3. Amorçage initramfs via PXE==<br />
Cette méthode d'amorçage ne varie pas beaucoup de la précédente puisque elle réutilise les mêmes éléments à savoir le noyau et l{{'}}''Initramfs''. Le delta sera sur la syntaxe du chargeur d'amorçage réseau utilisé ainsi que quelques paramètres passés au noyau. Voici la section fonctionnelle pour [[Ipxe]] :<br />
<br />
<syntaxhighlight lang="bash"><br />
#!ipxe<br />
<br />
set menu-timeout 10000<br />
set submenu-timeout ${menu-timeout}<br />
isset ${menu-defaut} || set menu-defaut Debian_Buster<br />
set serveur_ip 10.0.0.100<br />
<br />
menu<br />
item --gap -- -------------DEMARRAGE EN RAM----------------<br />
item busybox Lancer Busybox<br />
<br />
choose --timeout ${menu-timeout} --default ${menu-default} target && goto ${target}<br />
<br />
:busybox<br />
kernel http://${serveur_ip}/systemes/noyaux/busybox/bzImage ro initrd=initramfs.cpio.gz rootfstype=ramfs rdinit=/sbin/init console=ttyS0<br />
initrd http://${serveur_ip}/systemes/noyaux/busybox/initramfs.cpio.gz<br />
boot<br />
# https://ipxe.org/cmd/kernel<br />
</syntaxhighlight><br />
<br />
=Sources=<br />
* https://dev.to/donaldsebleung/hello-embedded-world-booting-a-minimal-linux-with-busybox-on-risc-v-from-source-2ne9<br />
* https://cs4118.github.io/dev-guides/debian-kernel-compilation.html<br />
* ''POSIX Base Specifications Issue 7'' :<br />
** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html<br />
** Paramètres du shell Sh : https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Param%C3%A8tres_linux&diff=1501Paramètres linux2024-01-28T10:59:52Z<p>Ycharbi : Ajout d'un lien vers la documentation officielle des paramètres Linux + remplacement des balises "source" obsolètes + corrections de typographies</p>
<hr />
<div>[[Category:noyau_linux]]<br />
Cette page regroupe quelques paramètres que l'on peut passer au noyau ''Linux'' lors de son démarrage.<br />
<br />
La [https://www.kernel.org/doc/html/v6.5/admin-guide/kernel-parameters.html documentation] officielle regroupe des informations utiles à ce sujet.<br />
<br />
=Passer des paramètres au noyau=<br />
==GRUB==<br />
Pour éditer les paramètres passés au noyau lors de son démarrage, il faut éditer le fichier <code>/etc/default/grub</code> et les ajouter dans la variable suivante : <code>GRUB_CMDLINE_LINUX=""</code> séparés par des espaces pour enfin mettre à jour le menu ''GRUB'' :<br />
update-grub<br />
<br />
==PXELinux==<br />
Avec PXELinux, les paramètres s'ajoutent après la section ''APPEND'' en les séparant par des espaces.<br />
<br />
=Liste de paramètres=<br />
==Shell sur un port série==<br />
===Activer un shell sur un port série===<br />
Afin de pouvoir ce connecter à une machine Linux via son port série, il faut passer l'argument suivant au noyau ([https://www.kernel.org/doc/Documentation/admin-guide/serial-console.rst source]) :<br />
console=ttyS0,115200n8 console=tty0<br />
<br />
{{info|Cette façon de faire semble spécifique à [[:Category:Systemd|Systemd]] comme expliqué [https://unix.stackexchange.com/questions/248287/how-can-i-stop-auto-login-console-and-getty-in-raspbian-jessie ici]. Pour [https://fr.wikipedia.org/wiki/Init init] et [https://fr.wikipedia.org/wiki/Init#%C2%AB_init_%C2%BB_de_Unix_System_V_(SysV_init) SystemV], il faut passer par le fichier <code>/etc/inittab</code> documenté [http://tldp.org/LDP/sag/html/config-init.html ici]. Pour [https://fr.wikipedia.org/wiki/Upstart Upstart], voir [https://help.ubuntu.com/community/SerialConsoleHowto ici].}}<br />
<br />
===Ajuster les dimensions du shell===<br />
Sur un port série, le shell a une dimension définie à 80x24 (colonnes*lignes) et ne peut être ajusté dynamiquement à la taille de votre terminal si vous jouez avec celle-ci. Il en résultera un cassage de votre prompte si votre ligne de commande dépasse 80 caractères de large ou si vous exécutez un programme en plein écran type ''Ncurse'' ; [[vim]]... (ceci est dû à un [http://lkml.iu.edu/hypermail/linux/noyau/2005.3/08168.html héritage historique]). Afin de changer les dimensions du ''TTY'', j'utilise deux méthodes. Une manuelle ou une automatique (à l'exécution du terminal lors de la connexion de l'utilisateur).<br />
<br />
====Ajustement manuel====<br />
Afin de définir une taille au ''TTY'', il faut prendre un terminal normal, le mettre à la taille voulue (plein écran par exemple) et [https://stackoverflow.com/questions/263890/how-do-i-find-the-width-height-of-a-terminal-window récupérer ses dimensions] avec <code>tput cols && tput lines</code>. Il suffit ensuite de définir cette taille dans la console série via [https://superuser.com/questions/1031272/how-to-extend-vim-editor-to-full-screen-in-putty la commande] <code>stty columns 213 rows 56</code>. Le terminal garde alors des dimensions normales après fermeture d'un programme plein écran et arrête de casser le prompt.<br />
<br />
====Ajustement automatique====<br />
Cette méthode définit les dimensions du ''TTY'' courant selon celles du terminal qui l'exécute. Ainsi, les valeurs renseignées sont directement les bonnes. Il n'est toutefois toujours pas possible de changer la taille de son terminal avec la souris et de voir cette modification se répercuter automatiquement dans le ''TTY''.<br />
<br />
Pour ce faire, il faut ajouter [https://unix.stackexchange.com/questions/16578/resizable-serial-console-window/283206 une fonction] au <code>~/.profile</code> et demander au shell de l'exécuter (dernière ligne) :<br />
<br />
<syntaxhighlight lang="bash"><br />
res() {<br />
<br />
old=$(stty -g)<br />
stty raw -echo min 0 time 5<br />
<br />
printf '\0337\033[r\033[999;999H\033[6n\0338' > /dev/tty<br />
IFS='[;R' read -r _ rows cols _ < /dev/tty<br />
<br />
stty "$old"<br />
<br />
# echo "cols:$cols"<br />
# echo "rows:$rows"<br />
stty cols "$cols" rows "$rows"<br />
}<br />
<br />
[ $(tty) = /dev/ttyS0 ] && res<br />
</syntaxhighlight><br />
<br />
Ceci s'exécute à la connexion de l'utilisateur.<br />
<br />
==Nom des interfaces réseaux==<br />
===Notion PNIN===<br />
Avec la version 197 de [[:Category:Systemd|Systemd]] (qui intègre désormais [https://fr.wikipedia.org/wiki/Udev Udev]), une nouvelle méthode de nommage des interfaces réseaux a été introduite, portant le nom de ''Predictable Network Interface Names''.<br />
<br />
Voici la [https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/7/html/networking_guide/ch-consistent_network_device_naming justification] de l'introduction de cette fonctionnalité :<br />
<br />
''Traditionnellement, les interfaces de réseau sous Linux sont énumérées eth[0123…], mais ces noms ne correspondent pas forcément à des étiquettes sur le châssis. Les plateformes des serveurs modernes avec de multiples adaptateurs réseau peuvent rencontrer des noms d'interfaces qui ne sont pas déterminants et contre-intuitifs. Ceci affecte les adaptateurs réseau intégrés à la carte mère (Lan-on-Motherboard, or LOM) et les adaptateurs add-in (uniques et multi-ports). Dans Red Hat Enterprise Linux 7, Udev prend en charge un certain nombre de schémas d'affectation de noms. Le comportement par défaut est d'assigner des noms fixes basés sur le microprogramme, la topologie et les informations sur l'emplacement. Ceci a pour avantage d'offrir des noms complètement automatiques et prévisibles, qui resteront fixes, même lorsque du matériel est ajouté ou supprimé (il ne se produit pas de ré-énumération) et le matériel endommagé peut être remplacé de façon transparente. L'inconvénient de ce comportement est que les noms sont parfois plus difficiles à lire que les noms traditionnellement utilisés au préalable comme eth0 ou wlan0. Exemple : enp5s0.''<br />
<br />
Personnellement je trouve ce système merdique car en plus de rendre les noms d'interfaces incroyablement complexes (si encore il n'y avait que ça...), il les nomment différemment en fonction de la machine sur laquelle est installé le système. Ce qui rend toute tentative d'automatisation par [[script bash|script]] impossible en plus d'obliger l'administrateur à lister ses interfaces avant de commencer à les configurer pour connaître leur nom car in-devinable. Et encore, imaginez quand vous êtes forcé d'utiliser une disposition clavier ''QWERTY'' sur un clavier ''AZERTY'' et que vous avez un nom d'interface comme celui-ci : ''wlx00c0ca4034'' ou celui-là : ''enx000ec6d8bdac''...<br />
<br />
À mon humble avis, il est déplorable qu'une "fonctionnalité" aussi chiante et qui doit concerner le 0,00001% des administrateurs systèmes ayant déjà rencontré LE cas (en fonction de l'alignement des astres dans une galaxie lointaine) où une interface réseau, suite à sont remplacement, a un truck chelou qui se produit avec son nom soit activé de base et face chier les 99,99999% restant...<br />
<br />
Pour le désactiver, il faut entrer le paramètre suivant :<br />
net.ifnames=0<br />
<br />
De plus, je recommande de le désactiver si vous voulez renommer vous-même vos interfaces réseaux comme sur [[Hotspot_wifirst#Changement des noms d'interface|cette documentation]] car sinon cet imbécile de ''Systemd'' ne va pas les prendre en compte (vu qu'il les renommes lui-même en dernière instance - ce que veut ''Systemd'' est toujours prioritaire sur ce que vous voulez, ne l'oubliez pas...).<br />
<br />
De plus amples informations sont disponibles (notamment sur les 3 méthodes possibles de désactivation) sur le [https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames site officiel].<br />
<br />
===Renommage par Iproute2===<br />
Notez qu'il est également possible de [https://serverfault.com/questions/247767/cannot-delete-gre-tunnel renommer manuellement] une interface réseau via <code>iproute2</code> :<br />
ip link set eth0 down<br />
ip link set dev eth0 name toto0<br />
ip link set toto0 up<br />
<br />
''Note : Il est impératif d'éteindre l'interface avant d'effectuer la modification (sinon on se tape un "RTNETLINK answers: Device or resource busy").''<br />
<br />
===Altname Iproute2===<br />
Depuis [https://lwn.net/Articles/806010/ Linux 5.5], il est possible de définir des noms alternatifs dépassants la limite des 15 caractères sur les interfaces réseaux (désormais limité à [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7a56493f0620 128 caractères]). Ainsi, une interface peut se voir attribuer des noms alternatifs (lire supplémentaires) longs qui seront utilisables dans les commandes au même titre que le nom principal.<br />
<br />
Prenons par exemple les interfaces suivantes :<br />
<br />
<syntaxhighlight lang="bash"><br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000<br />
link/ether ae:67:a9:67:46:86 brd ff:ff:ff:ff:ff:ff<br />
</syntaxhighlight><br />
<br />
Pour ajouter un nom alternatif à l'interface ''dummy0'', il faudra faire ceci :<br />
ip link prop add dummy0 altname lesdocumentaionsdecemecsonttropdelaballe<br />
<br />
Ce qui donnera :<br />
<br />
<syntaxhighlight lang="bash"><br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000<br />
link/ether ae:67:a9:67:46:86 brd ff:ff:ff:ff:ff:ff<br />
altname lesdocumentaionsdecemecsonttropdelaballe<br />
</syntaxhighlight><br />
<br />
Il donc possible d’interagir avec cette interface directement via ce nom alternatif :<br />
<br />
<syntaxhighlight lang="bash"><br />
ip link show lesdocumentaionsdecemecsonttropdelaballe<br />
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000<br />
link/ether ae:67:a9:67:46:86 brd ff:ff:ff:ff:ff:ff<br />
altname lesdocumentaionsdecemecsonttropdelaballe<br />
</syntaxhighlight><br />
<br />
==Rotation de la console==<br />
Si vous avez un écran monté en vertical, il est possible de préciser à la console ([https://www.noyau.org/doc/Documentation/fb/fbcon.txt fbcon]) de pivoter pour vous éviter un torticolis et avoir une plus grande surface d'affichage. La méthode utilisée est expliquée simplement [https://askubuntu.com/questions/237963/how-do-i-rotate-my-display-when-not-using-an-x-server ici].<br />
<br />
'''Ce qu'il faut savoir :'''<br />
* '''0''' : Rotation normale<br />
* '''1''' : Rotation horaire<br />
* '''2''' : Rotation anti-horaire<br />
* '''3''' : Inverser l'affichage<br />
<br />
<br />
'''Paramètre noyau :'''<br />
fbcon=rotate:1<br />
<br />
''Note : S'applique à tout les TTY.''<br />
<br />
'''Changement dynamique'''<br />
<br />
Pour le TTY actif :<br />
echo 1 > /sys/class/graphics/fbcon/rotate<br />
<br />
Pour tout les TTY :<br />
echo 1 > /sys/class/graphics/fbcon/rotate_all<br />
<br />
==Source de la section==<br />
* https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt<br />
<br />
=Désactiver la journalisation dans le shell=<br />
Lorsque la verbosité est passée en paramètre du noyau et que l'on branche une clé ''USB'', un câble réseau, etc... Ça crache les évènements journal directement dans le shell comme sur un équipement Cisco. Pour désactiver ça, il faut créer le fichier suivant avec ce contenu :<br />
vim /etc/sysctl.d/20-quiet-printk.conf<br />
<br />
kernel.printk = 3 3 3 3<br />
<br />
Un simple redémarrage suffit pour prendre en compte le changement. Si vous voulez appliquer le changement immédiatement (vous êtes en plein test et redémarrer n'est pas envisageable), exécutez simplement cette commande (non testé mais ça viens de la même source donc il n'y a pas de raison que cela ne fonctionne pas) :<br />
echo "3 3 3 3" > /proc/sys/kernel/printk<br />
<br />
==Sources de la section==<br />
* https://wiki.archlinux.org/index.php/Silent_boot#sysctl<br />
* https://unix.stackexchange.com/questions/44999/how-can-i-hide-messages-of-udev/45525#45525</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Vim&diff=1500Vim2024-01-27T12:01:17Z<p>Ycharbi : /* Quelque commandes */ Correction de la phrase de présentation + remplacement d'une prime inversée par une prime</p>
<hr />
<div>[[Category:éditeurs de texte]]<br />
[[Fichier:Vim logo.svg|100px]]<br />
<br />
[https://fr.wikipedia.org/wiki/Vim Vim] est un éditeur de texte, bifurcation de [https://fr.wikipedia.org/wiki/Vi_(logiciel) vi], signifiant "VI aMélioré" permettant d'éditer des documents de type texte (notamment des fichiers de configuration) dans un terminal ou une console (''shell''). Il ne nécessite pas d'interface graphique pour être exécuté, ce qui en fait un excellent outil sur un serveur, dépourvu d'[[:Category:Environnements bureau|environnements de bureau]].<br />
<br />
=Installation=<br />
apt install vim<br />
<br />
=Comportement=<br />
Vim possède 5 modes :<br />
# Le mode interactif<br />
# Le mode insertion<br />
# Le mode commande<br />
# Le mode visuel<br />
# Le mode recherche<br />
<br />
==Mode interactif==<br />
Lorsque ''Vim'' est exécuté, il est par défaut en mode interactif. Ce mode permet d'utiliser des combinaisons de touche pour interagir avec le texte du document en cours d'édition. Il est par exemple possible, en une combinaison, de couper 4 lignes de texte et de les coller dans un autre emplacement du document, voir dans un autre document.<br />
<br />
<span style="color:red;">Mettre un tableau avec les touches qu'on utilise souvent avec le mode interactif</span><br />
<br />
==Mode insertion==<br />
Le mode insertion est le mode classique d'édition de texte. C'est celui dans lequel on tape du texte comme dans n'importe quel autre éditeur.<br />
<br />
Pour revenir au mode interactif, il faut presser la touche <code><Echap></code>.<br />
<br />
==Mode commande==<br />
Ce mode permet d’interagir avec ''Vim'' par l'intermédiaire de commandes. Ces dernières vont permettre d'enregistrer le document, quitter ''Vim'', importer un document dans un autre, passer des expressions régulières, activer des options et bien d'autres choses...<br />
<br />
On entre une commande en étant au préalable en mode interactif et en tapant <code>:</code>.<br />
<br />
===Quelque commandes===<br />
Activer l'affichage des numéros de lignes<br />
<syntaxhighlight lang="vim"><br />
se nu<br />
</syntaxhighlight><br />
<br />
désactiver l'affichage des numéros de lignes<br />
<syntaxhighlight lang="vim"><br />
se nu!<br />
</syntaxhighlight><br />
<br />
Activer la coloration syntaxique<br />
<syntaxhighlight lang="vim"><br />
syn on<br />
</syntaxhighlight><br />
<br />
Désactiver la coloration syntaxique<br />
<syntaxhighlight lang="vim"><br />
syn off<br />
</syntaxhighlight><br />
<br />
Afficher la ligne où se trouve le curseur<br />
<syntaxhighlight lang="vim"><br />
set cursorline<br />
</syntaxhighlight><br />
<br />
Masquer le trait de soulignement<br />
<syntaxhighlight lang="vim"><br />
set cursorline!<br />
</syntaxhighlight><br />
<br />
Commenter plusieurs lignes<br />
<syntaxhighlight lang="vim"><br />
,+4 s/^/#/g<br />
</syntaxhighlight><br />
<br />
Dé-commenter plusieurs lignes<br />
<syntaxhighlight lang="vim"><br />
.,+4 s/^#//g<br />
</syntaxhighlight><br />
<br />
Plus simple, pour commenter (après une sélection des lignes à commenter en mode visuel bloc <code><maj>+<v></code> et un appui sur <code>:</code>)<br />
<syntaxhighlight lang="vim"><br />
s/^/#<br />
</syntaxhighlight><br />
<br />
Dé-commenter (après sélection <code><maj>+<v></code> + <code>:</code>)<br />
<syntaxhighlight lang="vim"><br />
s/#//<br />
</syntaxhighlight><br />
<br />
ou <code><maj>+<v></code> puis <code><x></code>.<br />
<br />
Ajouter en fin de ligne (après sélection <code><maj>+<v></code> + <code>:</code>)<br />
<syntaxhighlight lang="vim"><br />
s/$/\ :\ <br />
s/$/;<br />
</syntaxhighlight><br />
<br />
Ajouter au niveau du curseur (après sélection <code><ctrl>+<v></code> + <code>:</code>)<br />
<syntaxhighlight lang="vim"><br />
s/\%V/\ :<br />
s/\%V/^I<br />
</syntaxhighlight><br />
<br />
<span style="color:red;">vim ajouter à partir du curseur (À trouver) http://andrewradev.com/2011/05/08/vim-regexes/</span><br />
<br />
<span style="color:red;">Placer des curseur là ou on veut pour pouvoir utiliser les regex d'en haut de façon ultra puissante</span><br />
<br />
Remplacer un mot par un autre<br />
<syntaxhighlight lang="vim"><br />
%s/Mot_initial/Nouveau_mot/g<br />
</syntaxhighlight><br />
<br />
Changer encodage caractère<br />
<syntaxhighlight lang="vim"><br />
set fileencoding=latin1<br />
set fileencoding=utf-8<br />
</syntaxhighlight><br />
<br />
Auto complétion ''CSS'' (une fois renseigné, faire <code><ctrl>+<x></code> + <code><ctrl>+<o></code>)<br />
<syntaxhighlight lang="vim"><br />
set omnifunc=csscomplete#CompleteCSS<br />
</syntaxhighlight><br />
<br />
Exécuter une [[Shell bash|commande Bash]] sans quitter ''Vim''<br />
<syntaxhighlight lang="vim"><br />
!Commande_À_Exécuter<br />
</syntaxhighlight><br />
<br />
Importer un fichier depuis ''Vim''<br />
<syntaxhighlight lang="vim"><br />
r Chemin_fichier<br />
</syntaxhighlight><br />
<br />
Indentation automatique<br />
<syntaxhighlight lang="vim"><br />
se ai<br />
</syntaxhighlight><br />
<br />
Permettre un copier/coller respectant l'indentation avec <code>se ai</code><br />
<syntaxhighlight lang="vim"><br />
se paste<br />
</syntaxhighlight><br />
<br />
Activer/désactiver <code>se paste</code> en appuyant sur <code><F2></code><br />
<syntaxhighlight lang="vim"><br />
set pastetoggle=<F2><br />
</syntaxhighlight><br />
<br />
Insensibilité à la casse (utile pour le mode recherche notamment)<br />
<syntaxhighlight lang="vim"><br />
se ic<br />
</syntaxhighlight><br />
<br />
Activer le curseur de sélection avec la souris<br />
<syntaxhighlight lang="vim"><br />
se mouse=a<br />
</syntaxhighlight><br />
<br />
Désactiver le curseur de sélection avec la souris<br />
<syntaxhighlight lang="vim"><br />
se mouse=<br />
</syntaxhighlight><br />
<br />
Scinder l'écran pour ouvrir un autre fichier horizontalement<br />
<syntaxhighlight lang="vim"><br />
split [Nom_fichier] ou :sp<br />
</syntaxhighlight><br />
<br />
En vertical<br />
<syntaxhighlight lang="vim"><br />
vspli ou :vsp<br />
</syntaxhighlight><br />
<br />
{{info|Le couple <code><ctrl-w> + flèche</code> permet de passer d'un fichier à l'autre. }}<br />
<br />
Redéfinir l'espace de l'indentation (pour passer de 8 espaces à 3)<br />
<syntaxhighlight lang="vim"><br />
set tabstop=3<br />
set shiftwidth=3<br />
set softtabstop=3<br />
</syntaxhighlight><br />
<br />
Convertir des indentation "espace" en indentation "tabulation"<br />
<syntaxhighlight lang="vim"><br />
%retab!<br />
</syntaxhighlight><br />
Créer et gérer des onglets<br />
<syntaxhighlight lang="vim"><br />
tabnew [nom_fichier]<br />
</syntaxhighlight><br />
<br />
Se déplacer dans les onglets<br />
<br />
En avant : <code>gt</code>, en arrière : <code>gT</code>.<br />
<br />
Ouvrir plusieurs fichiers dans un onglet chacun (à exécuter dans ''Bash'') :<br />
vim -p fichier1 fichier2 fichier3<br />
<br />
Convertir du texte en majuscule ou en minuscule<br />
* Inverser la casse : sélectionner le texte avec <code>ctrl+v</code> et faire un <code>~</code><br />
<br />
ou<br />
<br />
* On peut utiliser <code>U</code> pour mettre en majuscule ou <code>u</code> pour mettre en minuscule<br />
<br />
Masquer les commentaires d'un fichier (à ajouter dans un [[#fichiers de configuration|fichier de configuration]])<br />
<syntaxhighlight lang="vim"><br />
set fdm=expr<br />
set fde=getline(v:lnum)=~'^\\s*#'?1:getline(prevnonblank(v:lnum))=~'^\\s*#'?1:getline(nextnonblank(v:lnum))=~'^\\s*#'?1:0<br />
</syntaxhighlight><br />
<br />
Pour '''déplier''' temporairement un bloc de commentaires (un bloc correspondant dans ce cas à plusieurs lignes consécutives commençant par le caractère '''#'''), placez votre curseur sur le pli correspondant au bloc compacté et tapez <code>zo</code> (ou pressez simplement sans sélection pour agir sur tout le document), et <code>zm</code> pour '''le replier'''. Si vous avez déplié plusieurs blocs, vous pouvez '''tous les replier''' d'un coup avec <code>zM</code> ; à l'inverse, vous pouvez '''déplier tous les blocs''' d'un seul coup avec <code>zi</code>.<br />
<br />
Utiliser Vim en tant qu'éditeur hexadécimale ([http://pellelatarte.fr/2010/10/utiliser-vi-en-editeur-hexadecimal/ source])<br />
%!xxd<br />
Revenir à la normal<br />
%!xxd -r<br />
<br />
{{attention|Un enregistrement en mode hexadécimale enregistrera le texte comme tel, il faudra alors désactiver ce mode et réenregistrer le document pour revenir à la normal.}}<br />
<br />
Garder la position du curseur là où il était à la [https://askubuntu.com/questions/202075/how-do-i-get-vim-to-remember-the-line-i-was-on-when-i-reopen-a-file fermeture] du fichier<br />
<syntaxhighlight lang="vim"><br />
if has("autocmd")<br />
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g'\"" | endif<br />
endif<br />
</syntaxhighlight><br />
<br />
===Désactiver les fonctions agaçantes===<br />
Avec les mises à jour de ''Vim'', de plus en plus de fonctions inutiles et contres-productives sont installées par défaut (''Debian Stretch'', si tu m'entends...). Ce qui suit a pour but de rendre ''Vim'' de nouveau utilisable comme dans le bon vieux temps.<br />
<br />
Désactiver l'ajout automatique de commentaires ([https://superuser.com/questions/271023/vim-can-i-disable-continuation-of-comments-to-the-next-line source])<br />
<syntaxhighlight lang="vim"><br />
set formatoptions-=cro<br />
</syntaxhighlight><br />
<br />
Désactiver la gestion de la souris (qui empêche le copier/coller !)<br />
<syntaxhighlight lang="vim"><br />
set mouse=<br />
</syntaxhighlight><br />
<br />
===Corrections de bogues===<br />
====Corriger le problème des flèches qui affichent A B C D====<br />
De façon totalement aléatoire et sur certaines configurations, l'utilisation des flèches au clavier enclenche automatiquement le monde insertion et tape les lettres A, B, C ou D en fonction de la flèche pressée. Il semble que la façon de régler ce problème diffère selon les configurations. Une liste impressionnante de palliatifs est trouvable [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell ici]. La solution [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell#Solution_24 n°24] a réglée celui rencontré sur une Debian 12 installée via ''PXE'' comme des centaines d'autres chaque années dans mon infrastructure (celle-là a décidée de me faire chier).<br />
<br />
Il faut re-cartographier les touches fléchées en ajoutant ceci dans le <code>~/.vimrc</code> :<br />
nnoremap <silent> <ESC>OA <UP><br />
nnoremap <silent> <ESC>OB <DOWN><br />
nnoremap <silent> <ESC>OC <RIGHT><br />
nnoremap <silent> <ESC>OD <LEFT><br />
inoremap <silent> <ESC>OA <UP><br />
inoremap <silent> <ESC>OB <DOWN><br />
inoremap <silent> <ESC>OC <RIGHT><br />
inoremap <silent> <ESC>OD <LEFT><br />
<br />
=Presses papiers=<br />
''Vim'' possèdes plusieurs presses papiers appelés registres (''register'' ou ''buffers'') qui peuvent être exploités afin de maintenir plusieurs copier/coller en mémoires. Il y en a un par lettre de l'alphabet. Ils s'utilisent en '''mode interactif''' avec les touches <code><">+<lettre>+<raccourci></code> de cette manière :<br />
<br />
{{attention|Le contenu des presses papiers est sauvegardé même après avoir quitté ''Vim'' (ces informations sont stockés dans le fichier <code>~/.viminfo</code>). Ceci peut avoir des conséquences en terme de confidentialité des informations. Au besoin, pensez à utiliser le registre poubelle ainsi que la suppression du contenu des registres expliqué plus bas.}} <br />
<br />
Copier des lignes dans des presses papiers différents<br />
<br />
<code>"ayy</code>, <code>"byy</code>, <code>"cyy</code>.<br />
<br />
Coller des lignes depuis des presses papiers différents<br />
<br />
<code>"ap</code>, <code>"bp</code>, <code>"cp</code>.<br />
<br />
Pour ajouter une ligne à un presse papier, il faut préciser la lettre du presse papier voulu, en majuscule <code>"Byy</code>.<br />
<br />
Pour copier/coller en prenant en compte le presse papier par défaut (celui que l'on à lors d'un simple <code>yy</code>)<br />
<br />
<code>"+yy</code> copie une ligne pour le presse papier par défaut, et <code>"+p</code> colle le presse papier par défaut (ceci n'a aucun intérêt...).<br />
<br />
Registre poubelle (équivalent du /dev/null). Permet de supprimer des lignes sans les conserver dans un registre<br />
<code>"_dd</code><br />
<br />
Pour vider le [https://stackoverflow.com/questions/19430200/how-to-clear-vim-registers-effectively contenu] d'un registre, il faut utiliser la commande <code>:let @a = ''</code> en remplaçant la lettre par celle de votre registre ( utiliser <code>"</code> pour le registre par défaut).<br />
<br />
=Historique=<br />
L'historique de l'éditeur est parsemé dans le fichier <code>~/.viminfo</code>.<br />
<br />
Pour [https://unix.stackexchange.com/questions/204689/how-to-clear-search-and-command-history-in-vim purger] intégralement celui des recherches, il est possible de faire <code>:call histdel('/')</code>. Pour celui des commandes, on fera <code>:call histdel(':')</code>. <br />
<br />
Il est également possible de ne supprimer qu'une entrée en particulier via un motif: <code>:call histdel(":", "MOT_CLÉ_CONTENU_DANS_VOTRE_COMMANDE")</code>.<br />
<br />
=Macros=<br />
Définir l'intérêt des macros...<br />
<br />
Créer des macros<br />
<code>q+<lettre></code> pour passer en mode enregistrement.<br />
<br />
<code>q</code> pour terminer l'enregistrement.<br />
<br />
<code>@+<lettre></code> pour la jouer (ça fait comme un presse papier).<br />
<br />
=Fichiers de configuration=<br />
Les fichiers de configuration de ''Vim'' permettent de définir des paramètres activés à chaque lancement de l'éditeur. Il en existe deux types :<br />
* Un général, actif pour tout les utilisateurs du système : <code>/etc/vim/vimrc</code><br />
* Un courant, pour chaque utilisateurs en particulier : <code>~/.vimrc</code><br />
Il suffit de renseigner des commandes Vim (sans les ''':''') dans ces fichiers pour que leur effet soit permanent.<br />
<br />
Pour exécuter ''Vim'' tout en [https://evanhahn.com/ignore-vimrc-with-vim/ ignorant] les fichiers de configuration :<br />
vim -u NONE<br />
<br />
=Greffons=<br />
Il est possible d'ajouter des fonctionnalités supplémentaires à ''Vim'' par l'intermédiaire de greffons (''plugins''). Il sont à mettre (selon le même principe que le ''vimrc'') dans le répertoire général <code>/etc/vim/</code> ou dans <code>~/.vim/</code> pour les rendre spécifiques à chaque utilisateur.<br />
<br />
==Greffons que j'utilise==<br />
Pour une configuration adaptée à un développement ''WEB'', les informations de ce [https://gitea.ycharbi.fr/ycharbi/vim-dev-web dépôt] peuvent-êtres utiles.<br />
<br />
===Emmet===<br />
Orienté programmation web, le greffon [http://emmet.io/ Emmet] (anciennement ''Zen Coding'') permet, en utilisant une syntaxe (très) raccourcie, d'écrire du code ''HTML'' et ''CSS'' de façon extrêmement efficace. De plus, il est disponible sur une [http://emmet.io/download/ multitude d'éditeurs]. Il s'installe de la façon suivante :<br />
<br />
# Télécharger ''Emmet'' depuis les [https://github.com/mattn/emmet-vim sources]<br />
# Décompresser les répertoires '''autoload''' et '''plugin''' dans <code>~/.vim/</code><br />
<br />
<br />
Pour utiliser ''Emmet'', il faut écrire dans un fichier les différentes [http://docs.emmet.io/cheat-sheet/ expressions possibles] et faire la combinaison de touches (en mode interactif) <code><c-y>,</code> (faire '''ctrl + y''' et ensuite sur ''',''').<br />
<br />
===IndentLine===<br />
''IndentLine'' permet d'afficher une ligne verticale marquant le niveau d'indentation de votre code. Il est très utile notamment lorsque les bloques de code sont imbriqués sur énormément de niveau (rendant le repérage visuel extrêmement difficile). Il s'installe de la façon suivante :<br />
<br />
# Télécharger ''IndentLine'' depuis les [https://github.com/Yggdroot/indentLine sources]<br />
# Décompresser le répertoire '''plugin''' dans <code>~/.vim/</code><br />
# Ajouter dans le ''.vimrc'' ce paramètre (l'espace de fin est important) : <code>set list lcs=tab:\|\ </code><br />
<br />
==Gestionnaire de greffons==<br />
===Vim-plug===<br />
Télécharger le greffon<br />
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim<br />
<br />
Ajouter les greffons à installer et ajouter dans le ''vimrc''<br />
<syntaxhighlight lang="vim"><br />
call plug#begin()<br />
Plug 'junegunn/vim-easy-align'<br />
Plug 'vim-airline/vim-airline'<br />
Plug 'vim-airline/vim-airline-themes'<br />
Plug 'hzchirs/vim-material'<br />
call plug#end()<br />
</syntaxhighlight><br />
<br />
''On trouve les noms de ces greffons sur leur page GIT.''<br />
<br />
Installer les greffons mis dans le ''vimrc'' (aller dans <code>vim</code>)<br />
:PlugInstall<br />
<br />
{{info|Tout est mis dans <code>.vim</code>. Le paquet <code>git</code> est nécessaire.}}<br />
<br />
Un exemple de ''.vimrc''<br />
<syntaxhighlight lang="vim"><br />
se nu<br />
se termguicolors<br />
set pastetoggle=<F2><br />
<br />
"L'indentation passe à 3 caractères<br />
set tabstop=3<br />
set shiftwidth=3<br />
set softtabstop=3<br />
<br />
"Activer les greffons<br />
call plug#begin()<br />
Plug 'junegunn/vim-easy-align'<br />
Plug 'vim-airline/vim-airline'<br />
Plug 'vim-airline/vim-airline-themes'<br />
Plug 'hzchirs/vim-material'<br />
call plug#end()<br />
<br />
"Appliquer le thème vim-matérial<br />
colorscheme vim-material<br />
let g:airline_theme='material'<br />
</syntaxhighlight><br />
<br />
====Sources de la section====<br />
* https://github.com/junegunn/vim-plug<br />
* http://vimcolors.com/<br />
<br />
=Couleurs 24bits=<br />
Pour avoir des couleurs plus sympas avec ''Vim'' (remplace le ''syn on''), il faut utiliser ''se termguicolors''. Attention, il faut que le terminal utilisé soit compatible. [https://github.com/termstandard/colors Cette page Github] peut aider à déterminer si c'est le cas.<br />
<br />
=Sources=<br />
* http://cfennajoui.net/vim/traduit/html/usr_30.txt.php<br />
* http://www.blogduwebdesign.com/developpement-vim/vim-astuce-pour-le-copier-coller/605<br />
* http://qsdqsd.free.fr/Vim/Vim_-_Un_pas_en_avant.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Serveur_de_courriels&diff=1499Serveur de courriels2024-01-27T11:48:14Z<p>Ycharbi : Replacement des balise de coloration syntaxique en ligne par des balises codes pour optimiser le chargement de la page + correction de fautes de frappes</p>
<hr />
<div>[[Category:service_courriels]]<br />
<br />
''Postfix'' est un serveur de messagerie électronique se chargeant de la livraison de courriels sur un réseau ''IP''. Il a été conçu comme une alternative plus rapide, plus facile à administrer et plus sécurisée que l'historique ''Sendmail''.<br />
<br />
L'environnement gravitant autour de ce thème étant assez complexe (avec son lot de technologies et de termes spécifiques), un [[#Glossaire|glossaire des notions]] utiles a été rédigé en bas de page. Il est recommandé d'aller y jeter un œil si vous n'êtes pas très familier avec le sujet.<br />
<br />
Dans ce document, nous mettrons en place :<br />
* Le service de courrier électronique [http://www.postfix.org/ Postfix] avec support d{{'}}''IPv4/IPv6'', négociation de chiffrement via ''TLS'' et ''STARTTLS'', utilisateurs ''Postfix'' et gestion de domaines via ''SQLite'', authentification ''SASL'', gestion des alias, des domaines secondaires, des listes noires ainsi que de ''Milter'' pour les liaisons avec ''OpenDKIM'' et ''Spamassassin''<br />
* Le service ''IMAP'' [https://www.dovecot.org/ Dovecot] avec gestion d{{'}}''IPv4/IPv6'', du ''TLS'' et de ''STARTTLS'' ainsi que des filtres ''Sieve''<br />
* La signature des messages via le protocole ''DKIM'' par l’intermédiaire du logiciel [http://www.opendkim.org/ OpenDKIM]<br />
* Du traitement du pourriel avec [https://spamassassin.apache.org/ SpamAssassin]<br />
<br />
<br />
Il faudra vous assurer d'avoir la main sur les éléments suivants :<br />
* Prérequis :<br />
** ''Debian'' 11 (''Bullseye'')<br />
** Un nom de domaine avec un enregistrement ''MX'' et ''A''<br />
** Une adresse ''IP'' publique fixe avec possibilité d'enregistrement ''PTR''<br />
<br />
* Permettre la communication en écoute des ports ''TCP'' suivants :<br />
** 25 (''SMTP'')<br />
** 465 (''SMTP'' sur ''TLS'' aussi appelé ''Submission'')<br />
** 587 (''SMTP'' ''STARTTLS'')<br />
** 143 (''IMAP'')<br />
** 993 (''IMAPS'')<br />
<br />
{{info|J'attire votre attention sur l'importance d'avoir un opérateur Internet faisant correctement son travail (ce qui commence à se faire rare en France...). Il est indispensable d'avoir une adresse ''IP'' fixe non listés par les principaux prestataires anti-pourriels (voir https://mxtoolbox.com/blacklists.aspx) ainsi que la possibilité d'ajouter un champ ''PTR'' (''DNS'' inversé ou ''reverse DNS'') dans le registre de nom de votre ''FAI''. Sans ces pré-requis, votre service sera difficilement fiable car une partie de vos messages risquent d'être bloqués par les serveurs destinataires. Si vous ne pouvez souscrire à un vrai accès Internet (avec un fournisseur sachant ce qu'est une adresse ''IP'' au lieu de vous fournir de la ''TV''...) comme ceux proposés par la [https://www.ffdn.org/ FFDN] ou [https://www.k-net.fr/ K-net] par exemple, il faudra vous tourner vers des hébergeurs en centre de données et opter pour un hébergement de votre serveur dans leurs locaux ou réaliser un tunnel afin d'utiliser leur ''IP'' chez vous (l'auto-hébergement étant la solution à privilégier dans une optique d'indépendance numérique).}}<br />
<br />
=Nom de domaine=<br />
==Prérequis DNS==<br />
La messagerie électronique étant dépendante du système de noms de domaine (''DNS''), il vous en faudra un et y définir un enregistrement de type [https://docs.gandi.net/fr/noms_domaine/faq/type_enregistrements_dns/mx_record.html MX] afin d'assurer la distribution de votre courrier.<br />
<br />
La façon de configurer les champs de votre zone ''DNS'' étant propre à votre fournisseur de noms, nous ne détaillerons pas cette partie. Sachez seulement que l'enregistrement associant votre nom d'hôte (le champ [https://docs.gandi.net/fr/noms_domaine/faq/type_enregistrements_dns/a_record.html A] pointant sur votre ''IP'' publique) et votre nom de domaine (à ne pas confondre avec le nom de domaine pleinement qualifié (''FQDN'')) devra être configuré pour espérer envoyer et recevoir des courriels.<br />
<br />
Il vous faudra donc, pour démarrer, un nom de domaine avec un champ ''A'' et ''MX'' (minimum obligatoire) auquel nous ajouterons, par la suite, un enregistrement ''TXT'' ''SPF'' et ''DKIM'' (facultatifs) afin de diminuer vos chances de finir dans les indésirables de vos destinataires.<br />
<br />
Enfin, et toujours dans un soucis de limiter le désagrément susmentionné, il faudra que vous adressiez une demande à votre fournisseur d'accès Internet pour ajouter votre ''FQDN'' à sa zone ''DNS'' inversée (ajout d'un champ de type ''PTR''). Ce point est le plus délicat car plus aucun "grands" ''FAI'' connus ne le permet en France (en 2021). ''Free'' ne propose plus l'option depuis 2019 (bien que toujours présente dans leur interface ''WEB'', celle-ci ne fonctionne plus depuis la migration de leur infrastructure vers ''IPv6'') et font les morts lorsqu'ils sont contactés à ce sujet ; ''SFR'' et ''Bouygues Telecom'' ne sont plus que des fournisseurs de services audiovisuels et ''Orange'' ne sais même pas ce qu'est une adresse ''IP'' fixe (même ''v6''...) alors du ''rDNS''... Internet étant réservé aux professionnels selon leur doctrine malgré leur service d'amateur...<br />
<br />
Installation des outils<br />
apt update && apt install --no-install-recommends openssl dnsutils<br />
<br />
Test de fonctionnement du champ ''MX''<br />
dig exemple.fr MX<br />
<br />
La réponse doit contenir une ''ANSWER SECTION'' avec ceci :<br />
exemple.fr 10800 IN MX 10 mail.exemple.fr<br />
<br />
Test de fonctionnement du champ ''A''<br />
dig mail.exemple.fr A<br />
<br />
La réponse doit contenir une ''ANSWER SECTION'' avec ceci :<br />
mail.exemple.fr. <TTL> IN A <VOTRE_IP_PUBLIQUE><br />
<br />
==Cas du NAT==<br />
Si votre serveur est placé juste derrière un NAT, il faudra ajouter une entrée dans votre fichier <code>/etc/hosts</code> afin de lui permettre de se résoudre lui-même. Ceci prendra la forme suivante :<br />
<IP_du_serveur> <FQDN><br />
<br />
=Éléments secrets=<br />
Comme tout moyen de communication moderne, les correspondances extérieurs seront chiffrées via des algorithmes négociés au travers du traditionnel protocole de sécurité de la couche transport (''TLS''). La génération d'éléments secrets se fera par le fameux logiciel libre [[openssl|OpenSSL]] que l'on ne présente plus. Nous avons pris le parti de réutiliser ces éléments secrets dans l'ensemble des outils faisant intervenir le chiffrement du système de messagerie. Dans l'idéal, un certificat différent doit être utilisée pour chaque module en nécessitant, conformément à la [https://{{SERVERNAME}}/fichiers/messagerie/courriel/serveur_courriels/anssi/anssi-guide-recommandations_de_securite_relatives_a_tls-v1.2.pdf recommandation] numéro 30 (page 46) du guide de [https://www.ssi.gouv.fr/entreprise/guide/recommandations-de-securite-relatives-a-tls/ recommandation de sécurité relative à TLS] (v1.2) des bonnes pratiques de l{{'}}''ANSSI''.<br />
<br />
Création du répertoire d'accueil pour les clés et le certificat x.509<br />
mkdir -p /etc/postfix/tls<br />
<br />
Génération du certificat et de la clé pour ''Postfix'' et ''Dovecot''<br />
openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -out /etc/postfix/tls/courriel.pem -keyout /etc/postfix/tls/courriel.key<br />
<br />
Pour cette étape, [[Letsencrypt]] peut très bien être utilisé mais sachez que contrairement au ''WEB'', le monde de la messagerie ne vérifie aucunement l'authenticité des certificats (ce qui rend de fait, le chiffrement caduc en cas d'espionnage ciblé...). Il n'est donc pas dérangeant d'utiliser des certificats auto-signés avec une durée de validité démentielle... Pour une confidentialité forte des échanges (en complément de ''TLS''), tournez-vous plutôt vers le protocole [https://fr.wikipedia.org/wiki/Pretty%20Good%20Privacy PGP] qui peut notamment, en plus d'une exploitation manuelle entre deux clients, être utilisé [https://jnphilipp.org/posts/post/auto-encrypt-all-incoming-email-with-postfix/ automatiquement] avec ''Postfix'' via le module ''gpgmail''.<br />
<br />
Génération de la clé ''Diffie-Hellman'' (si l'on ne le fait pas, ''Postfix'' utilise la sienne)<br />
openssl dhparam -out /etc/postfix/tls/dh4096.pem 4096<br />
<br />
{{info|Avec l'évolution des suites cryptographiques, il devient de plus en plus rare d'utiliser ''Diffie-Hellman'' (au travers des suites ''DHE''). Avec l’avènement de la faille [https://raccoon-attack.com/ Racoon attack], ce protocole est devenu désuet et peu sûr. L'usage de la cryptographie basée sur les courbes elliptiques (''ECC'') pour l'échange de clés de sessions l'a, dans la pratique, remplacé (notamment via ''ECDHE'' et ''ed25519''). Néanmoins (et vous vous en apercevrez peut-être à vos dépends), le monde de la messagerie électronique accuse d'un lourd héritage technologique et d'installations vieillissantes administrées, ou pas, par des gens généralement peu regardants sur l'évolution des standards et dont le principe de veille informatique échappe totalement. Aussi, il n'est pas rare (coucou ''Orange'', une fois de plus...) de devoir supporter des algorithmes et protocoles complètements dépassés pour pouvoir continuer d'échanger avec certains serveurs non mis à jours depuis plusieurs décennies...}}<br />
<br />
=Postfix=<br />
Comme présenté en début de page, ''Postfix'' est l'élément central de notre système de messagerie électronique. Il endosse le rôle de ''MTA'' tout en faisant le lien avec les autres composants de l'installation. S'il peut sembler austère à première vue, la complexité de sa configuration est à la hauteur du service qu'il rend car il n'est pas exagéré de dire que la messagerie est la pierre la plus importante d'un auto-hébergement. Logiciel fiable et très personnalisable, c'est l'un des composants qui, une fois mis en place, se fait le plus oublié dans une infrastructure numérique domestique.<br />
<br />
==Installation de Postfix==<br />
Installation du serveur ''SMTP''<br />
apt install --no-install-recommends postfix<br />
<br />
''Note : Les réponses aux choix proposés n'ont guère d'importance puisque elles ne font que remplir un fichier que nous remplacerons par la suite.''<br />
<br />
==Configuration de Postfix==<br />
La configuration principale de ''Postfix'' se fait par l'intermédiaire du fichier <code>main.cf</code> qui renseigne un petit sous-ensemble des paramètres contrôlant les opérations du système de messagerie. Les paramètres non explicitement renseignés sont initialisés avec leur valeur par défaut. Les paramètres appliqués explicitement par l'intermédiaire de ce fichier sont visibles après rechargement du service via la commande <code>postconf -n</code>. La commande <code>postconf -p</code> permet quand à elle de visualiser la totalité des paramètres appliqués, y compris ceux par défaut.<br />
<br />
===Main.cf===<br />
Édition du fichier de configuration principal<br />
vim /etc/postfix/main.cf<br />
<br />
La configuration suivante sera utilisée :<br />
<br />
<syntaxhighlight lang="bash"><br />
# smtpd : entrant/inbound <br />
# smtp : sortant/outbound<br />
<br />
# ------------------------------------ Connexion protocole SMTP ------------------------------------ #<br />
<br />
# Bannière affichée après le code 220 lorsque l'on se connecte en SMTP sur le serveur<br />
smtpd_banner = $myhostname ESMTP $mail_name<br />
# Désactive la commande SMTP VRFY. Ceci a pour effet d'empêcher de trouver les adresses existante sur le serveur<br />
disable_vrfy_command = yes<br />
# Impose au client SMTP de démarrer la session SMTP par une commande Helo ou ehlo (cette dernière servant au listage des capacités du serveur)<br />
smtpd_helo_required = yes<br />
<br />
# ------------------------------------ Gestion des messages locaux (inutile dans notre cas) ------------------------------------ #<br />
<br />
# Service qui envoie des notifications "nouveau message"<br />
biff = no<br />
# Avec le courrier local ça ajoute .NDD aux adresses incomplètes (seulement le nom d'hôte)<br />
append_dot_mydomain = no<br />
<br />
# ------------------------------------ Nom de machine et réseaux autorisés ------------------------------------ #<br />
<br />
# Le nom de la machine du système de messagerie<br />
# Par défaut c'est hôte.domaine.tld mais il est possible de mettre un nom de domaine inversé<br />
myhostname = mail.exemple.fr<br />
# Le domaine utilisé par défaut pour poster les messages<br />
myorigin = mail.exemple.fr<br />
# Liste des domaines pour lesquels le serveur doit accepter le courrier en local<br />
mydestination = mail.exemple.fr, localhost.exemple.fr, localhost<br />
# Relais par lequel notre serveur doit adresser son trafic (nous n'en utilisons aucun)<br />
relayhost =<br />
# Liste des réseaux locaux autorisés (leur permet d'outrepasser le SASL)<br />
mynetworks = 192.168.0.0/16, 127.0.0.0/8<br />
# Activation d'IPv4 et IPv6 (valeur par défaut)<br />
inet_protocols = all<br />
# Séparateur entre le nom d'utilisateur et les extensions d'adresses<br />
recipient_delimiter = +<br />
# Les utilisateurs locaux ne pourront pas envoyer de messages à "utilisateur@nom-de-domaine-partiel" mais devront spécifier le nom de domaine complet<br />
append_dot_mydomain = no<br />
# Interfaces réseaux à écouter (ici toutes)<br />
inet_interfaces = all<br />
<br />
# ------------------------------------ Règles SMTP ------------------------------------ #<br />
<br />
# Restrictions d'accès appliquées dans le contexte d'une commande RCPT TO<br />
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks<br />
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié<br />
# reject_non_fqdn_recipient : Rejette la requête lorsque l'adresse RCPT TO n'est pas de forme pleinement qualifiée (FQDN) <br />
# reject_unauth_destination : Rejette la requête sauf si l'une des propositions listés dans la documentation officielle est vraie<br />
# check_recipient_access : Rejette les messages à destination des adresses spécifiées dans le fichier correspondant (permet de ne pas envoyer de message à root)<br />
# reject_unknown_recipient_domain : Rejette la requête lorsque le RCPT TO ne correspond à aucun champ DNS A ou MX<br />
smtpd_recipient_restrictions =<br />
permit_mynetworks,<br />
permit_sasl_authenticated,<br />
reject_non_fqdn_recipient,<br />
reject_unauth_destination,<br />
check_recipient_access sqlite:/etc/postfix/sqlite-liste-noire-destinataires.cf,<br />
reject_unknown_recipient_domain,<br />
<br />
# Règles sur l'échange HELO qui survient avant la connexion<br />
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks<br />
# reject_invalid_helo_hostname : Refuser les échanges HELO invalides<br />
# reject_non_fqdn_helo_hostname : Refuser les noms d'hôte invalides (non FQDN)<br />
# reject_unknown_helo_hostname : Refuser les noms d'hôte qui n'ont pas de champ DNS A ou MX dans leurs DNS <br />
smtpd_helo_restrictions =<br />
permit_mynetworks,<br />
permit_sasl_authenticated,<br />
reject_invalid_helo_hostname,<br />
reject_non_fqdn_helo_hostname,<br />
# reject_unknown_helo_hostname<br />
<br />
# Règles de connexion des clients<br />
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks<br />
# permit_inet_interfaces : Accepte les requêtes des clients entrants par les interfaces listés dans $inet_interfaces<br />
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié<br />
# reject_rbl_client : Refuse les connexion des clients (IP) listés dans une liste RBL suite à des envois massifs de pourriels<br />
# reject_plaintext_session : Refuser les connexions non chiffrés<br />
# reject_unauth_pipelining : Vérifie si le drapeau de l'indicateur de session a été activé par Postfix. Si tel est le cas, cela signifierai que le client a utilisé une canalisation ESMTP incorrecte, ce qui est une justification suffisante pour le rejeter.<br />
smtpd_client_restrictions =<br />
permit_mynetworks,<br />
permit_inet_interfaces,<br />
permit_sasl_authenticated,<br />
# reject_rbl_client zen.spamhaus.org<br />
# reject_plaintext_session,<br />
# reject_unauth_pipelining # L'utilisation de reject_unauth_pipelining dans les autres contextes que smtpd_data_restrictions n'est pas recommandé<br />
<br />
# Règles sur les expéditeurs<br />
# reject_non_fqdn_sender : Refuser les expéditeurs invalides (non FQDN)<br />
# reject_unknown_sender_domain : Refuser les expéditeurs qui n'ont pas de champ DNS A ou MX dans leurs DNS <br />
# check_sender_access : Vérifie si l'adresse de courriel de l'expéditeur est dans notre fichier liste noire et applique la directive de celle-ci<br />
smtpd_sender_restrictions =<br />
reject_non_fqdn_sender,<br />
reject_unknown_sender_domain,<br />
check_sender_access sqlite:/etc/postfix/sqlite-liste-noire-expediteurs.cf<br />
<br />
# Restrictions d'accès optionnelles appliquées dans le contexte d'une commande SMTP DATA<br />
# reject_unauth_pipelining : Expliqué plus haut (trop long)<br />
# permit : Tout est autorisé par défaut<br />
smtpd_data_restrictions =<br />
reject_unauth_pipelining,<br />
permit<br />
<br />
# ------------------------------------ Gestion des boites aux lettres et des messages ------------------------------------ #<br />
<br />
# Taille des boîtes aux lettres (0 = illimité)<br />
mailbox_size_limit = 0 <br />
<br />
# Fixer la taille limite des messages (ici 30Mo)<br />
message_size_limit = 31457280<br />
<br />
# Répertoire de destination des courriers<br />
# home_mailbox = Maildir/<br />
virtual_mailbox_domains = sqlite:/etc/postfix/sqlite-domaines.cf<br />
virtual_mailbox_base = /var/mail/utilisateurs<br />
virtual_mailbox_maps = sqlite:/etc/postfix/sqlite-utilisateurs.cf<br />
virtual_minimum_uid = 3000<br />
virtual_uid_maps = static:3000<br />
virtual_gid_maps = static:3000<br />
virtual_transport = lmtp:unix:private/dovecot-lmtp<br />
<br />
#----------------------------------------------<br />
# Gestion des alias de comptes et de domaines |<br />
#----------------------------------------------<br />
<br />
# Emplacement du fichier des alias<br />
# Alias de comptes principaux<br />
alias_maps = sqlite:/etc/postfix/sqlite-alias.cf<br />
<br />
# Alias de domaines<br />
virtual_alias_maps = sqlite:/etc/postfix/sqlite-alias-vituels.cf<br />
# virtual_alias_domains = sqlite:/etc/postfix/sqlite-domaines.cf<br />
<br />
#--------------------<br />
# SASL serveur SMTP |<br />
#--------------------<br />
<br />
# Authentification SMTP (utilise les identifiants IMAP via SASL en passant par Dovecot)<br />
smtpd_sasl_auth_enable = yes<br />
smtpd_sasl_type = dovecot<br />
smtpd_sasl_path = private/auth<br />
# Interdit les méthodes qui autorisent l'authentification anonyme<br />
smtpd_sasl_security_options = noanonymous<br />
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options<br />
smtpd_sasl_local_domain = $mydomain<br />
# Reporte le nom d'utilisateur SASL authentifié dans l'en-tête de message "Received" du serveur<br />
smtpd_sasl_authenticated_header = yes<br />
# N'accepte pas le support de l'ancienne commande AUTH (Outlook 4 par exemple)<br />
broken_sasl_auth_clients = no<br />
<br />
# ------------------------------------ Chiffrement ------------------------------------ #<br />
<br />
# clés et certificats pour les sessions TLS<br />
smtpd_tls_cert_file = $config_directory/tls/courriel.pem<br />
smtpd_tls_key_file = $config_directory/tls/courriel.key<br />
smtpd_tls_dh1024_param_file = $config_directory/tls/dh4096.pem<br />
<br />
#------------------<br />
# TLS client SMTP |<br />
#------------------<br />
<br />
# Verbosité des journaux<br />
smtp_tls_loglevel = 1<br />
# Impose de se connecter à des serveurs SMTP via TLS<br />
smtp_tls_security_level = encrypt<br />
# N'autoriser que le TLS version 1.2 et 1.3<br />
smtp_tls_protocols = TLSv1.2:TLSv1.3<br />
# incompréhension exprimé plus haut<br />
smtp_tls_mandatory_protocols = TLSv1.2:TLSv1.3<br />
# Journaliser les pairs ne gérants que STARTTLS au lieu de TLS. Probablement pour permettre de réaliser des statistiques<br />
smtp_tls_note_starttls_offer = yes<br />
# N'autoriser que les chiffrements de la liste "medium" définie plus bas<br />
smtp_tls_mandatory_ciphers = medium<br />
# Exclure les algorithmes cryptographiques obsolètes ou insuffisants listés ci-dessous<br />
smtp_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH<br />
# Permet d'obliger le client à se conformer à la suite cryptographique du serveur et non l'inverse<br />
tls_preempt_cipherlist = yes<br />
# Cache TLS. Permet de mémoriser les anciennes sessions TLS afin d'effectuer une poignée de mains raccourcie. Ce qui améliore considérablement les performances<br />
# Inutile avec TLS 1.3 car compris dans la norme<br />
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache<br />
<br />
#-------------------<br />
# TLS serveur SMTP |<br />
#-------------------<br />
<br />
# Verbosité des journaux<br />
smtpd_tls_loglevel = 1 <br />
# Impose de se connecter à des serveurs SMTP via TLS<br />
smtpd_tls_security_level = encrypt<br />
# Refuse les authentifications SASL en clair si le serveur gère TLS de façon optionnelle (ça n'a aucun sens mais c'est ce qui est écrit dans la documentation officielle)<br />
smtpd_tls_auth_only = yes<br />
# Indique le chiffrement utilisé dans l'en-tête du message (ça ne sert pas à grand chose si on passe par plusieurs serveurs car les intermédiaires peuvent y mettre leur sauce donc ce n'est qu'indicatif)<br />
smtpd_tls_received_header = yes<br />
# Source du générateur de nombre aléatoire pour les algorithmes de chiffrement<br />
tls_random_source = dev:/dev/urandom<br />
# Versions de TLS autorisés (SSL refusé)<br />
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, TLSv1.2, TLSv1.3<br />
# Toujours aucune idée de l'utilité mais c'est activé par défaut de toute façon d'après la documentation<br />
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, TLSv1.2, TLSv1.3<br />
# N'autoriser que les chiffrements de la liste "medium" définie plus bas<br />
smtpd_tls_mandatory_ciphers = medium<br />
# Liste de chiffrements autorisés dans la liste "medium" exploité par "smtp_tls_mandatory_ciphers" et "smtpd_tls_mandatory_ciphers"<br />
tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384<br />
# Exclure les algorithmes obsolètes ou insufisants listés ci-dessous<br />
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH<br />
# Cache TLS. Permet de mémoriser les ancienne sessions TLS afin d'effectuer une poignée de mains raccourcie. Ce qui améliore considérablement les performances<br />
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache<br />
<br />
# ------------------------------------ En-têtes des courriels ------------------------------------ #<br />
<br />
# Emplacement des fichiers de suppression de certains en-têtes à caractère privé contenus dans les messages envoyés<br />
# Concrètement, cela supprime toute la section "Received: from" propre au client (contenant son IP par exemple) -> son SMTP. Seul le "Received: from" son SMTP -> SMTP distant reste<br />
mime_header_checks = regexp:/etc/postfix/header_checks<br />
header_checks = regexp:/etc/postfix/header_checks<br />
<br />
# ------------------------------------ OpenDKIM et Spamassassin ------------------------------------ #<br />
<br />
# Procédez comme si le filtre de courrier n'était pas présent<br />
milter_default_action = accept<br />
# Version du protocole mail filter<br />
milter_protocol = 6<br />
<br />
# Chemins des sockets pour la communication avec les modules opendkim et spamass<br />
smtpd_milters = unix:/var/run/opendkim/opendkim.sock unix:/spamass/spamass.sock<br />
non_smtpd_milters = unix:/var/run/opendkim/opendkim.sock unix:/spamass/spamass.sock<br />
<br />
# ------------------------------------ Sources de documentation ------------------------------------ #<br />
<br />
# http://postfix.traduc.org/index.php/postconf.5.html<br />
# http://www.postfix.org/postconf.5.html<br />
</syntaxhighlight><br />
<br />
N'oubliez pas d'adapter les réseaux autorisés de la section <code>mynetworks</code> ainsi que le nom de domaine à votre installation. Vous pouvez utiliser la commande <code>sed</code> comme suit pour vous aider :<br />
sed -i 's/exemple\.fr/domaine\.fr/g' /etc/postfix/main.cf<br />
<br />
Si vous voulez afficher pour comparaison la [https://www.mkssoftware.com/docs/man1/openssl_ciphers.1.asp suite cryptographique] ''MEDIUM'' d{{'}}''OpenSSL'' avec le paramètre <code>tls_medium_cipherlist</code> définit dans le fichier, vous pouvez utiliser la commande suivante :<br />
openssl ciphers MEDIUM | sed 's/:/\n/g'<br />
<br />
===En-têtes vie privée===<br />
On va créer une liste d'expressions régulières servant à supprimer automatiquement certains en-têtes contenant des informations personnelles sur le client émetteur lors de l'envoi du courriel (diminue la quantité d'informations personnelles transmises)<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/postfix/header_checks<br />
/^Received:.*with ESMTPSA/ IGNORE<br />
/^X-Originating-IP:/ IGNORE<br />
/^X-Mailer:/ IGNORE<br />
/^User-Agent:/ IGNORE<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Les directives contenues dans la section "En-têtes des courriels" du fichier [[#Main.cf|main.cf]] édité ci-dessus indiquent à ''Postfix'' l'emplacement de ces règles<br />
<br />
<syntaxhighlight lang="bash"><br />
mime_header_checks = regexp:/etc/postfix/header_checks<br />
header_checks = regexp:/etc/postfix/header_checks<br />
</syntaxhighlight><br />
<br />
Pour que Postfix les utilises, il faut reconstruire la table au format hachée avec la commande<br />
postmap /etc/postfix/header_checks<br />
<br />
===Master.cf===<br />
''Postfix'' est un outil dont le fonctionnement sous jacent est complexe et composé de multiples programmes (démons) ayants chacun leur rôle. Le fichier <code>master.cf</code> permet de gérer la façon dont se comportent les différents éléments du système de courrier.<br />
<br />
Le [http://www.postfix.org/master.5.html fichier] se présente sous forme de tableau. ''Postfix'' va le parcourir et interpréter chaque lignes, correspondants à un démon, colonne par colonne (avec leur signification en en-tête commenté). Voici le contenu du fichier par défaut, épuré de ses commentaires pour ne pas alourdir l'exposé :<br />
<br />
<syntaxhighlight lang="bash"><br />
smtp inet n - y - - smtpd<br />
pickup unix n - y 60 1 pickup<br />
cleanup unix n - y - 0 cleanup<br />
qmgr unix n - n 300 1 qmgr<br />
tlsmgr unix - - y 1000? 1 tlsmgr<br />
rewrite unix - - y - - trivial-rewrite<br />
bounce unix - - y - 0 bounce<br />
defer unix - - y - 0 bounce<br />
trace unix - - y - 0 bounce<br />
verify unix - - y - 1 verify<br />
flush unix n - y 1000? 0 flush<br />
proxymap unix - - n - - proxymap<br />
proxywrite unix - - n - 1 proxymap<br />
smtp unix - - y - - smtp<br />
relay unix - - y - - smtp<br />
-o syslog_name=postfix/$service_name<br />
showq unix n - y - - showq<br />
error unix - - y - - error<br />
retry unix - - y - - error<br />
discard unix - - y - - discard<br />
local unix - n n - - local<br />
virtual unix - n n - - virtual<br />
lmtp unix - - y - - lmtp<br />
anvil unix - - y - 1 anvil<br />
scache unix - - y - 1 scache<br />
postlog unix-dgram n - n - 1 postlogd<br />
maildrop unix - n n - - pipe<br />
flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}<br />
uucp unix - n n - - pipe<br />
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)<br />
ifmail unix - n n - - pipe<br />
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)<br />
bsmtp unix - n n - - pipe<br />
flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient<br />
scalemail-backend unix - n n - 2 pipe<br />
flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}<br />
mailman unix - n n - - pipe<br />
flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}<br />
</syntaxhighlight><br />
<br />
L'opération consiste à ajouter un socket ''TCP'' pour les communications ''STARTTLS'' et ''SMTPS'' ainsi qu'un socket ''UNIX'' pour la communication avec [[#Dovecot|Dovecot]]. Le chemin de l'exécutable de ce dernier sera lui aussi précisé en sous-section. Nous ajouterons donc en fin de fichier les trois sections suivantes :<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' >> /etc/postfix/master.cf<br />
<br />
submission inet n - y - - smtpd<br />
smtps inet n - y - - smtpd<br />
-o syslog_name=postfix/smtps<br />
-o smtpd_tls_wrappermode=yes<br />
-o smtpd_sasl_auth_enable=yes<br />
-o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject<br />
-o milter_macro_daemon_name=ORIGINATING<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Il est possible de spécifier des paramètres au différentes lignes via l'argument <code>-o</code> (répétable plusieurs fois). Placés ici, ils réécrivent les paramètres correspondants du fichier [[#Main.cf|main.cf]] et leur sont donc prioritaires. Ces arguments pourraient toutefois être placés dans ce dernier (cela reviendrait au même).<br />
<br />
==SQLite==<br />
Comme vous l'avez probablement constaté, certaines fonctionnalités utiliserons une base de données [https://fr.wikipedia.org/wiki/SQLite SQLite] (il est également possible de passer par d'autres [http://www.postfix.org/DATABASE_README.html méthode]). Cette technologie a le mérite d'être légère et de permettre la connexion d'outils tiers pour l'édition des données contenues dans la base. Avec la méthode des tables hachées utilisée auparavant, un accès ''root'' combiné à des bidouilles pas très sécurisées étaient nécessaires afin de les éditer sans devoir se connecter manuellement au serveur.<br />
<br />
Cette section traite de la création de la base ainsi que des fichiers d'exploitation pour ''Postfix''.<br />
<br />
===Installation et création de la base===<br />
<br />
Installation de ''SQLite''<br />
apt install --no-install-recommends sqlite3 postfix-sqlite<br />
<br />
Création du schéma de la base<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/postfix/postfix.sql<br />
CREATE TABLE IF NOT EXISTS postfix_alias (<br />
id INTEGER PRIMARY KEY AUTOINCREMENT,<br />
alias TEXT NOT NULL UNIQUE,<br />
destination TEXT NOT NULL,<br />
active INTEGER<br />
);<br />
CREATE TABLE IF NOT EXISTS postfix_alias_virtuels (<br />
id INTEGER PRIMARY KEY AUTOINCREMENT,<br />
courriel TEXT NOT NULL UNIQUE,<br />
destination TEXT NOT NULL,<br />
active INTEGER<br />
);<br />
CREATE TABLE IF NOT EXISTS postfix_domaines (<br />
id INTEGER PRIMARY KEY AUTOINCREMENT,<br />
domaine TEXT NOT NULL UNIQUE,<br />
defaut BOOLEAN NOT NULL CHECK (defaut IN (0, 1)),<br />
active INTEGER<br />
);<br />
CREATE TABLE IF NOT EXISTS postfix_liste_noire_destinataires (<br />
id INTEGER PRIMARY KEY AUTOINCREMENT,<br />
courriel TEXT NOT NULL UNIQUE,<br />
action TEXT NOT NULL,<br />
active INTEGER<br />
);<br />
CREATE TABLE IF NOT EXISTS postfix_liste_noire_expediteurs (<br />
id INTEGER PRIMARY KEY AUTOINCREMENT,<br />
courriel TEXT NOT NULL UNIQUE,<br />
code_retour INTEGER NOT NULL,<br />
message TEXT NOT NULL,<br />
active INTEGER<br />
);<br />
CREATE TABLE postfix_utilisateurs (<br />
id INTEGER PRIMARY KEY AUTOINCREMENT,<br />
utilisateur TEXT NOT NULL UNIQUE,<br />
mot_de_passe TEXT NOT NULL,<br />
nom_complet TEXT,<br />
rep_perso TEXT NOT NULL,<br />
uid INTEGER NOT NULL,<br />
gid INTEGER NOT NULL,<br />
privilege TEXT NOT NULL,<br />
prefixe TEXT,<br />
active INTEGER<br />
);<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Création de la base avec ce schéma<br />
mkdir /etc/postfix/bdd/<br />
# Pour un usage avec le portail WEB Courtail (voir plus bas), il faudra donner les permission de ce répertoire et de la base à www-data<br />
sqlite3 /etc/postfix/bdd/postfix.sqlite < /etc/postfix/postfix.sql<br />
<br />
===Création des fichiers d'exploitation de Postfix===<br />
Ces [http://www.postfix.org/SQLITE_README.html fichiers] permettent à ''Postfix'' d'avoir les éléments lui permettant d'exploiter la base. Nous y retrouverons donc naturellement l'emplacement de celle-ci ainsi que la [http://www.postfix.org/sqlite_table.5.html requête] à lui soumettre afin d'obtenir l'information voulue.<br />
<br />
Liaison à la table des alias<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/postfix/sqlite-alias.cf<br />
# Chemin de la base SQLite<br />
dbpath = /etc/postfix/bdd/postfix.sqlite<br />
# Requête passée à SQLite<br />
query = SELECT destination FROM postfix_alias WHERE alias='%s' AND active='1'<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Liason à la tables alias virtuels<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/postfix/sqlite-alias-vituels.cf<br />
# Chemin de la base SQLite<br />
dbpath = /etc/postfix/bdd/postfix.sqlite<br />
# Requête passée à SQLite<br />
query = SELECT destination FROM postfix_alias_virtuels WHERE courriel='%s' AND active='1'<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Les alias peuvent êtres utiles lors d'inscriptions sur des sites tiers ou d'une communication à des personnes de moyenne confiance. Le principe étant que les courriels envoyés sur ces adresses (connues uniquement des entités pour lesquelles elles ont étés créées) sont redirigés en interne vers votre vraie boite liée à l'alias. L'adresse de l'émetteur peut donc, par la stratégie que vous mettrez en place dans la diffusion de vos alias, être liée à une adresse de votre base et donc identifier une source d'émission. L'intérêt est double : lors de la réception de pourriels sur celui-ci, nous savons quelle entité l'a transmis ou utilisé puisqu'il est unique à chaque interlocuteur. Une action de désactivation de l'alias suivie d'un boycott et d'une possible plainte à la [https://www.cnil.fr/fr/plaintes CNIL] pour manquement au ''RGPD'' peut ainsi être entreprise.<br />
<br />
Si cette fonctionnalité est utilisé sérieusement, le risque de pourriels (''SPAM'') est quasiment nul. Couplé aux règles ''Sieve'' abordées plus loin dans la documentation, les alias vont être très utiles afin de classer les courriels reçus automatiquement dans des dossiers et ne pas se retrouver avec les éternelles boite de réception à plus de 2000 messages "non lus". En clair, vous ne subirez plus votre messagerie comme c'est, hélas, bien trop souvent le cas.<br />
<br />
{{info|La différence entre les alias et les alias virtuelles réside dans l'en-tête ''Delivered-To'' du message à la réception par ''Postfix''. Avec les alias, l'en-tête est inchangé lors de la distribution du message à la boite locale (et correspond donc à l'en-tête ''to'' du même message). Avec les alias virtuels, l'en-tête est modifié par l'adresse réelle de destination (inconnue de l'expéditeur). Dans les deux cas, cela n'influence pas l'acheminement du courrier mais les alias virtuelles permettent la distribution sur des domaines secondaires quand les alias se restreignent au seul domaine par défaut. Vous pouvez utiliser l'un et l'autre ou seulement l'un des deux (cela ne change rien aux bénéfices apportés à la fonctionnalité).}}<br />
<br />
Le champ ''destination'' '''doit être''' l'adresse réelle de l'utilisateur.<br />
<br />
Liaison à la table des domaines<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/postfix/sqlite-domaines.cf<br />
# Chemin de la base SQLite<br />
dbpath = /etc/postfix/bdd/postfix.sqlite<br />
# Requête passée à SQLite<br />
query = SELECT domaine FROM postfix_domaines WHERE domaine='%s' AND active='1'<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Liaison à la table de la liste noire des destinataires<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/postfix/sqlite-liste-noire-destinataires.cf<br />
# Chemin de la base SQLite<br />
dbpath = /etc/postfix/bdd/postfix.sqlite<br />
# Requête passée à SQLite<br />
query = SELECT action FROM postfix_liste_noire_destinataires WHERE courriel='%s' AND active='1'<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Liaison à la table de la liste noire des expéditeurs<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/postfix/sqlite-liste-noire-expediteurs.cf<br />
# Chemin de la base SQLite<br />
dbpath = /etc/postfix/bdd/postfix.sqlite<br />
# Requête passée a SQLite<br />
query = SELECT code_retour || ' ' || message FROM postfix_liste_noire_expediteurs WHERE courriel='%s' AND active='1'<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Liaison à la table des utilisateurs<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/postfix/sqlite-utilisateurs.cf<br />
# Chemin de la base SQLite<br />
dbpath = /etc/postfix/bdd/postfix.sqlite<br />
# Requête passée à SQLite<br />
query = SELECT rep_perso FROM postfix_utilisateurs WHERE utilisateur='%s' AND active='1'<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
===Administration de la base===<br />
Afin d'ajouter, modifier, supprimer et lister des informations dans la base ''SQLite'', le ''shell'' intégré à l'outil est une bonne première approche. Par la suite, un logiciel plus graphique (comme une application ''WEB'' par exemple), pourra remplir le rôle d'interface d'administration.<br />
<br />
Le ''shell'' de <code>sqlite3</code> se contrôle via la commande suivante :<br />
sqlite3 /etc/postfix/bdd/postfix.sqlite<br />
<br />
Les commandes suivantes permettent une utilisation basique de l'outil :<br />
<br />
{| class="wikitable"<br />
|-<br />
! Commande !! Signification<br />
|-<br />
| <code>.table</code> || Liste les tables de la base<br />
|-<br />
| <code>.shema <span><</span>table<span>></span></code> || Affiche la structure de la table (en-têtes et propriétés)<br />
|-<br />
| <code>.mode column</code> || Affiche le retour d'une requête sous forme de tableau<br />
|-<br />
| <code>.headers on</code> || Affiche les entêtes (clés) des valeurs retournés<br />
|-<br />
| <code>.quit</code> || Quitte l'outil<br />
|}<br />
<br />
Gestion des alias :<br />
<br />
{| class="wikitable"<br />
|-<br />
! Action !! Commande<br />
|-<br />
| Ajout || <syntaxhighlight lang="sql" inline>INSERT INTO postfix_alias (alias,destination,active) VALUES ("toto","test",1);</syntaxhighlight><br />
|-<br />
| Désactivation || <syntaxhighlight lang="sql" inline>UPDATE postfix_alias SET active = 0 WHERE alias = "toto";</syntaxhighlight><br />
|-<br />
| Activation || <syntaxhighlight lang="sql" inline>UPDATE postfix_alias SET active = 1 WHERE alias = "toto";</syntaxhighlight><br />
|-<br />
| Suppression || <syntaxhighlight lang="sql" inline>DELETE FROM postfix_alias WHERE alias = "toto";</syntaxhighlight><br />
|-<br />
| Listage || <syntaxhighlight lang="sql" inline>SELECT * FROM postfix_alias;</syntaxhighlight><br />
|}<br />
<br />
Gestion des alias virtuels :<br />
<br />
{| class="wikitable"<br />
|-<br />
! Action !! Commande<br />
|-<br />
| Ajout || <syntaxhighlight lang="sql" inline>INSERT INTO postfix_alias_virtuels (courriel,destination,active) VALUES ("ycharbi@exemple.fr","test@exemple.fr",1);</syntaxhighlight><br />
|-<br />
| Désactivation || <syntaxhighlight lang="sql" inline>UPDATE postfix_alias_virtuels SET active = 0 WHERE courriel = "ycharbi@exemple.fr";</syntaxhighlight><br />
|-<br />
| Activation || <syntaxhighlight lang="sql" inline>UPDATE postfix_alias_virtuels SET active = 1 WHERE courriel = "ycharbi@exemple.fr";</syntaxhighlight><br />
|-<br />
| Suppression || <syntaxhighlight lang="sql" inline>DELETE FROM postfix_alias_virtuels WHERE courriel = "ycharbi@exemple.fr";</syntaxhighlight><br />
|-<br />
| Listage || <syntaxhighlight lang="sql" inline>SELECT * FROM postfix_alias_virtuels;</syntaxhighlight><br />
|}<br />
<br />
Gestion des domaines :<br />
<br />
{| class="wikitable"<br />
|-<br />
! Action !! Commande<br />
|-<br />
| Ajout || <syntaxhighlight lang="sql" inline>INSERT INTO postfix_domaines (domaine,defaut,active) VALUES ("toto.fr",1,1);</syntaxhighlight><br />
|-<br />
| Désactivation || <syntaxhighlight lang="sql" inline>UPDATE postfix_domaines SET active = 0 WHERE domaine = "toto.fr";</syntaxhighlight><br />
|-<br />
| Activation || <syntaxhighlight lang="sql" inline>UPDATE postfix_domaines SET active = 1 WHERE domaine = "toto.fr";</syntaxhighlight><br />
|-<br />
| Suppression || <syntaxhighlight lang="sql" inline>DELETE FROM postfix_domaines WHERE domaine = "toto.fr";</syntaxhighlight><br />
|-<br />
| Listage || <syntaxhighlight lang="sql" inline>SELECT * FROM postfix_domaines;</syntaxhighlight><br />
|}<br />
<br />
{{attention|N'oubliez pas d'ajouter votre domaine à la base (un problème de correspondance de domaine peut entrainer l'erreur ''Relai access denied''). De plus, ne positionnez le drapeau ''defaut'' à ''1'' (pour le mettre en domaine par défaut) que sur un seul domaine. Cette notion n'est utile que pour un usage avec le portail ''WEB'' [https://gitea.ycharbi.fr/YC-NM/Courtail Courtail].}}<br />
<br />
Gestion de la liste noire des [http://www.postfix.org/access.5.html destinataires] :<br />
<br />
{| class="wikitable"<br />
|-<br />
! Action !! Commande<br />
|-<br />
| Ajout || <syntaxhighlight lang="sql" inline>INSERT INTO postfix_liste_noire_destinataires (courriel,action,active) VALUES ("root@mail.exemple.fr","REJECT",1);</syntaxhighlight><br />
|-<br />
| Désactivation || <syntaxhighlight lang="sql" inline>UPDATE postfix_liste_noire_destinataires SET active = 0 WHERE courriel = "root@mail.exemple.fr";</syntaxhighlight><br />
|-<br />
| Activation || <syntaxhighlight lang="sql" inline>UPDATE postfix_liste_noire_destinataires SET active = 1 WHERE courriel = "root@mail.exemple.fr";</syntaxhighlight><br />
|-<br />
| Suppression || <syntaxhighlight lang="sql" inline>DELETE FROM postfix_liste_noire_destinataires WHERE courriel = "root@mail.exemple.fr";</syntaxhighlight><br />
|-<br />
| Listage || <syntaxhighlight lang="sql" inline>SELECT * FROM postfix_liste_noire_destinataires;</syntaxhighlight><br />
|}<br />
<br />
Gestion de la liste noire des expéditeurs :<br />
<br />
{| class="wikitable"<br />
|-<br />
! Action !! Commande<br />
|-<br />
| Ajout || <syntaxhighlight lang="sql" inline>INSERT INTO postfix_liste_noire_expediteurs (courriel,code_retour,message,active) VALUES ("tata@tata.fr",554,"Parle à ma main, ma tête est malade.",1);</syntaxhighlight><br />
|-<br />
| Désactivation || <syntaxhighlight lang="sql" inline>UPDATE postfix_liste_noire_expediteurs SET active = 0 WHERE courriel = "tata@tata.fr";</syntaxhighlight><br />
|-<br />
| Activation || <syntaxhighlight lang="sql" inline>UPDATE postfix_liste_noire_expediteurs SET active = 1 WHERE courriel = "tata@tata.fr";</syntaxhighlight><br />
|-<br />
| Suppression || <syntaxhighlight lang="sql" inline>DELETE FROM postfix_liste_noire_expediteurs WHERE courriel = "tata@tata.fr";</syntaxhighlight><br />
|-<br />
| Listage || <syntaxhighlight lang="sql" inline>SELECT * FROM postfix_liste_noire_expediteurs;</syntaxhighlight><br />
|}<br />
<br />
Gestion des utilisateurs :<br />
<br />
{| class="wikitable"<br />
|-<br />
! Action !! Commande<br />
|-<br />
| Ajout || <syntaxhighlight lang="sql" inline>INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,prefixe,active) VALUES ("test@exemple.fr","{SHA512-CRYPT}$6$xWfisyC6fLawFcBr$zLm4hfRfs6Pn0RKArnyWcgliBy6lpnRUkDHfHMkvskShfLiv4pRIU6XC5ry0ysd.DeKhoAiZUfnNdmwIai2k50","Test <br />
Dupont","exemple.fr/test/",3000,3000,"administrateur","",1);</syntaxhighlight><br />
|-<br />
| Désactivation || <syntaxhighlight lang="sql" inline>UPDATE postfix_utilisateurs SET active = 0 WHERE utilisateur = "test@exemple.fr";</syntaxhighlight><br />
|-<br />
| Activation || <syntaxhighlight lang="sql" inline>UPDATE postfix_utilisateurs SET active = 1 WHERE utilisateur = "test@exemple.fr";</syntaxhighlight><br />
|-<br />
| Suppression || <syntaxhighlight lang="sql" inline>DELETE FROM postfix_utilisateurs WHERE utilisateur = "test@exemple.fr";</syntaxhighlight><br />
|-<br />
| Listage || <syntaxhighlight lang="sql" inline>SELECT * FROM postfix_utilisateurs;</syntaxhighlight><br />
|}<br />
<br />
{{Info|Le mot de passe est généré avec ''Dovecot'' dans la section suivante.}}<br />
<br />
=Dovecot=<br />
''Dovecot'' est un service gérant les protocoles ''IMAP'' et ''POP''. Il endosse donc le rôle d'intermédiaire entre les utilisateurs et le serveur de messagerie.<br />
<br />
==Installation de Dovecot==<br />
''POP'' ayant été totalement abandonné (tant dans son développement que dans l'usage), seul ''IMAP'' sera supporté.<br />
apt install --no-install-recommends dovecot-common dovecot-imapd dovecot-sqlite dovecot-lmtpd<br />
<br />
==Création d'un utilisateur==<br />
Comme précisé en introduction, nous exploitons des utilisateurs enregistrés dans la base ''SQLite''.<br />
<br />
Il faut tout d'abord générer un mot de passe à la l'aide de la commande suivante (du paquet <code>dovecot-core</code>, véritable nom de dovecot-common (paquet virtuel) installé plus haut)<br />
doveadm pw -s SHA512-CRYPT -p toto1234567890°+<br />
<br />
Création de l'utilisateur dans la base<br />
<br />
<syntaxhighlight lang="bash"><br />
sqlite3 /etc/postfix/bdd/postfix.sqlite 'INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,prefixe,active) VALUES ("test@exemple.fr","{SHA512-CRYPT}$6$xWfisyC6fLawFcBr$zLm4hfRfs6Pn0RKArnyWcgliBy6lpnRUkDHfHMkvskShfLiv4pRIU6XC5ry0ysd.DeKhoAiZUfnNdmwIai2k50","Test <br />
Dupont","exemple.fr/test/",3000,3000,"administrateur","",1)'<br />
</syntaxhighlight><br />
<br />
{{info|Le fait que l'utilisateur comporte le nom de domaine dans son nom fait qu'il faut renseigner la chaine complète (''utilisateur@domaine'') dans les clients ''IMAP''. Le champ ''privilege'' permet de définir les fonctions autorisées dans notre interface ''WEB'' [https://gitea.ycharbi.fr/YC-NM/Courtail Courtail] développé par nos soins. Si vous ne l'utilisez pas, ceci n'a pas d'importance. Les valeurs gérés sont ''administrateur'' et ''utilisateur''.}}<br />
<br />
Créer le répertoire utilisateurs<br />
mkdir /var/mail/utilisateurs<br />
chown 3000:3000 /var/mail/utilisateurs<br />
<br />
{{astuce|Dans le cadre d'une migration de serveur (monté en version de ''Debian'' par exemple), nous recommandons d'effectuer une archive ''tar.gz'' du contenu de l'ancien ''MailDir'' et de l'extraire dans le nouveau répertoire utilisateur. Ce répertoire n'existera pas (''Dovecot'' est censé le créer à la première utilisation de son propriétaire), il faudra donc le créer avec un <code>mkdir -p /var/spool/mail/utilisateurs/exemple.fr/votre_utilisateur</code> et lui donner les bons droits avec <code>chown -R 3000:3000 /var/spool/mail/utilisateurs/exemple.fr && chmod -R 700 /var/spool/mail/utilisateurs/exemple.fr</code>.}}<br />
<br />
==Configuration de Dovecot==<br />
Ce service utilise un fichier de configuration par fonctionnalité (ce qui en fait pas mal).<br />
<br />
===Gestion d'IPv6===<br />
Activation du support d'IPv6 (optionnel suivant votre configuration)<br />
echo -e '\nlisten = *, [::]' >> /etc/dovecot/dovecot.conf<br />
<br />
===Emplacement des dossiers utilisateurs===<br />
Configuration de l'[https://doc.dovecot.org/configuration_manual/mail_location/ emplacement du répertoire] des boites aux lettres des utilisateurs<br />
sed -i 's@mail_location = mbox:~/mail:INBOX=/var/mail/%u@mail_location = maildir:/var/mail/utilisateurs/%d/%n@g' /etc/dovecot/conf.d/10-mail.conf<br />
<br />
===Emploi du chiffrement===<br />
Configuration de la [https://doc.dovecot.org/configuration_manual/dovecot_ssl_configuration/ couche de chiffrement] (qui sera rendue obligatoire)<br />
mv /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.ori<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/dovecot/conf.d/10-ssl.conf<br />
ssl = required<br />
ssl_cert = </etc/postfix/tls/courriel.pem<br />
ssl_key = </etc/postfix/tls/courriel.key<br />
ssl_min_protocol = TLSv1.2<br />
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305<br />
ssl_prefer_server_ciphers = yes # Oblige l'utilisation de la suite du serveur au lieu du client (Dovecot > 2.2.x)<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
les valeurs sont précédées d'un chevron ouvert qui ne se ferme jamais (''<''). C'est louche mais normal (documentation [http://wiki2.dovecot.org/SSL/DovecotConfiguration officielle de Dovecot]). Il n'y a donc pas d'erreur dans les lignes mentionnées ci-dessus.<br />
<br />
{{info|Il est vivement recommandé de ne plus utiliser des algorithmes de cryptographie non ''ECC''. L'usage de ''Diffie-Hellman'' est de façon générale découragé de nos jours.}}<br />
<br />
===Configuration de l'authentification===<br />
Désactiver l'authentification en clair ainsi que ''POSIX'' et l'activer par ''SQLite''<br />
sed -i -e 's@#disable_plaintext_auth.*@disable_plaintext_auth = yes@g' -e 's@!include auth-system.conf.ext@#!include auth-system.conf.ext@g' -e 's@#!include auth-sql.conf.ext@!include auth-sql.conf.ext@g' /etc/dovecot/conf.d/10-auth.conf<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' >> /etc/dovecot/dovecot-sql.conf.ext<br />
driver = sqlite<br />
connect = /etc/postfix/bdd/postfix.sqlite<br />
<br />
password_query = SELECT utilisateur AS user, mot_de_passe AS password, '/var/mail/utilisateurs/%d/%n' AS userdb_home, 'maildir:/var/mail/utilisateurs/%d/%n' AS userdb_mail, 3000 AS userdb_uid, 3000 AS userdb_gid FROM postfix_utilisateurs WHERE utilisateur = '%u' AND active = 1<br />
user_query = SELECT '/var/mail/utilisateurs/%d/%n' AS home, 'maildir:/var/mail/utilisateurs/%d/%n' AS mail, 3000 AS uid, 3000 AS gid FROM postfix_utilisateurs WHERE utilisateur = '%u' AND active = 1 <br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Configuration de l'authentification<br />
mv /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.ori<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/dovecot/conf.d/10-master.conf<br />
service auth { <br />
unix_listener /var/spool/postfix/private/auth {<br />
mode = 0660<br />
user = postfix<br />
group = postfix<br />
}<br />
<br />
unix_listener auth-userdb {<br />
<br />
}<br />
}<br />
<br />
service lmtp {<br />
unix_listener /var/spool/postfix/private/dovecot-lmtp {<br />
group = postfix<br />
mode = 0600<br />
user = postfix<br />
}<br />
}<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Bien que le contenu proposé ne ressemble en rien à ce qui est préremplis dans celui-ci, il s'agit bien de la configuration décrite dans la [https://doc.dovecot.org/configuration_manual/howto/postfix_and_dovecot_sasl/?highlight=master documentation officielle].<br />
<br />
===Auto-création des répertoires utilisateurs===<br />
''Dovecot'' peut créer automatiquement les répertoires présents dans une boite au lettres (''/var/mail/utilisateurs/%d/%n@g'') à la connexion des utilisateurs. Ceci leur permet d'avoir un environnement pré-configuré comportant un dossier "envoyé", "brouillons", "Indésirables" et "corbeille" ("réception" est créé par Postfix).<br />
mv /etc/dovecot/conf.d/15-mailboxes.conf /etc/dovecot/conf.d/15-mailboxes.conf.ori<br />
<br />
Il faut que les sections correspondantes aux répertoires soient présentes et que l'argument "auto = create" (création du dossier dans l'arborescence) ou "auto = suscribe" (création du dossier et inscription automatique dans le client) soient spécifiées.<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/dovecot/conf.d/15-mailboxes.conf<br />
namespace inbox {<br />
mailbox Sent {<br />
auto = subscribe<br />
special_use = \Sent<br />
}<br />
mailbox Drafts {<br />
auto = subscribe<br />
special_use = \Drafts<br />
}<br />
mailbox Trash {<br />
auto = subscribe<br />
special_use = \Trash<br />
}<br />
mailbox Spam {<br />
auto = subscribe<br />
special_use = \Junk<br />
}<br />
mailbox Archive {<br />
auto = subscribe<br />
special_use = \Archive<br />
}<br />
mailbox Notes {<br />
auto = create<br />
}<br />
}<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
==Sieve==<br />
===Installation de ManageSieve===<br />
''Sieve'' est un système de filtrage du courrier coté serveur permettant l'application d'actions suivant des règles prés-établies. Sa mise en œuvre passe par le service [https://wiki1.dovecot.org/ManageSieve ManageSieve] agissant comme une extension de ''Dovecot''. Les scripts sont créables à la fois sur le serveur et sur les clients (ce sont de simples instructions dans un fichier texte synchronisés par ''IMAP'').<br />
apt install --no-install-recommends dovecot-sieve dovecot-managesieved<br />
<br />
Ces deux paquets vont créer les 3 fichiers <code>90-sieve.conf</code>, <code>90-sieve-extprograms.conf</code> et <code>20-managesieve.conf</code>.<br />
<br />
===Configuration de ManageSieve===<br />
Édition du fichier <code>20-lmtp.conf</code> pour dire à ''Dovecot'' d'[https://wiki2.dovecot.org/HowTo/PostfixDovecotLMTP utiliser] le greffon ''Sieve'' via [https://doc.dovecot.org/configuration_manual/protocols/lmtp_server/ LMTP]<br />
mv /etc/dovecot/conf.d/20-lmtp.conf /etc/dovecot/conf.d/20-lmtp.conf.ori<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/dovecot/conf.d/20-lmtp.conf<br />
protocol lmtp {<br />
postmaster_address = postmaster@exemple.fr<br />
mail_plugins = quota sieve<br />
}<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Définition du répertoire de destination des scripts ''Sieve'' (par défaut c'est le ''~'') en modifiant le fichier <code>90-sieve.conf</code><br />
mv /etc/dovecot/conf.d/90-sieve.conf /etc/dovecot/conf.d/90-sieve.conf.ori<br />
<br />
On demande à ''Dovecot'' de créer le dossier ''Sieve'' dans la boite aux lettres (''Maildir'') de l'utilisateur lors de sa première connexion. De plus, il est demandé à l'outil d'utiliser les scripts qui seront ajoutés côté client par l'intermédiaire du [[#Glossaire|MUA]].<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/dovecot/conf.d/90-sieve.conf<br />
plugin {<br />
sieve = ~/sieve/.dovecot.sieve<br />
sieve_before = /var/mail/sieve/before/spam.sieve<br />
sieve_dir = ~/sieve<br />
}<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Créer l’arborescence pour les scripts ''Sieve'' globaux (actifs pour tous les utilisateurs et s'exécutant avant leurs scripts personnels) et définir les bons droits pour celle-ci<br />
mkdir -p /var/mail/sieve/before && chown -R dovecot: /var/mail/sieve<br />
<br />
Redémarrer le service ''Dovecot''<br />
systemctl restart dovecot.service<br />
<br />
===Règle globale de gestion du pourriel===<br />
Mise en place d'un script ''Sieve'' global et actif pour tout les utilisateurs. Il va permettre de placer tout les courriels détectés comme du pourriel par ''SpamAssassin'' dans le dossier ''Maildir'' ''"Spam"'' :<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /var/mail/sieve/before/spam.sieve<br />
require "fileinto";<br />
if header :contains "X-Spam-Flag" "YES" {<br />
fileinto "Spam";<br />
}<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Compiler le fichier de règle afin de ne pas avoir un message d'avertissement (non bloquant) dans les journaux concernant les droits<br />
sievec /var/mail/sieve/before/spam.sieve<br />
<br />
Cette commande compile le fichier de règles dans le même répertoire que la source sous le nom <code>spam.svbin</code>.<br />
<br />
Donner les droits aux fichiers<br />
chown dovecot: /var/mail/sieve/before/spam.*<br />
<br />
=OpenDKIM=<br />
''OpenDKIM'' est un logiciel libre implémentant le protocole [https://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail DKIM] (''DomainKeys Identified Mail''). Son rôle est d'authentifier le domaine de l'expéditeur (tant en émission qu'en réception) et d'assurer l'intégrité du message. Chaque courriel est alors signé lors de sa transmission initiale et la vérification de celle-ci à la réception permet d'appliquer une politique de traitement (via l'anti pourriel notamment). Couplé à [https://fr.wikipedia.org/wiki/Sender_Policy_Framework SPF] (''Sender Policy Framework''). Il participe donc à réduire la distribution de courriels indésirables aux utilisateurs.<br />
<br />
{{info|La mise en œuvre de ''DKIM'' étant plus complexe et lourde à mettre en place qu'un simple enregistrement ''DNS'' ''SPF'', son absence est bien moins pénalisante que ce dernier lors du traitement de vos message par les ''MTA'' destinataires (leur politique est beaucoup plus laxiste à ce sujet).<br />
<br />
À titre personnel, je n'ai pas mis en place cette technologie pendant 7 ans et cela ne m'a jamais handicapé. En revanche, ''SPF'' et un enregistrement ''PTR'' ''rDNS'' sont eux, réellement utiles. ''DKIM'' peut jouer si votre message passe tout juste les critères établis par le serveur distant et qu'un point de plus vous permet de ne pas être considéré comme non désiré.}}<br />
<br />
Nous nous sommes principalement inspirés de la documentation idoine de ce [https://wiki.debian-fr.xyz/Opendkim Wiki] pour réaliser cette section.<br />
<br />
==Installation des paquets==<br />
Nous installons l'outil qui sera exploité par ''Postfix'' afin de signé/vérifier les courriels ainsi que celui permettant de générer nos clés<br />
apt install --no-install-recommends opendkim opendkim-tools<br />
<br />
==Création d'un couple de clés==<br />
Notez que nous écrivons cette documentation afin de permettre un usage multi-domaines. Dans cette optique, nous utiliserons un script de génération des clés se basant sur un tableau listant chacun d'eux. Toutefois, nous documentons ci-après la méthode permettant la création manuelle d'un couple de clés si vous privilégiez une approche plus directe. Nous vous invitons tout de même à considérer l'usage de la méthode scripté qui s'accommode aussi bien d'un ou plusieurs domaine.<br />
<br />
===Méthode manuelle===<br />
Le paquet ''OpenDKIM'' crée automatiquement le répertoire <code>/etc/dkimkeys</code>. Nous allons donc l'exploiter. La génération d'un couple de clés s'effectue via la commande <code>opendkim-genkey</code> :<br />
<br />
<syntaxhighlight lang="bash"><br />
mkdir -p /etc/dkimkeys/clefs/exemple.fr<br />
opendkim-genkey -b 4096 -D /etc/dkimkeys/clefs/exemple.fr -r -d exemple.fr -s mail<br />
echo "mail._domainkey.exemple.fr exemple.fr:mail:/etc/dkimkeys/clefs/exemple.fr/mail.private" >> /etc/dkimkeys/TableClefs<br />
echo "exemple.fr mail._domainkey.exemple.fr" >> /etc/dkimkeys/TableSignatures<br />
echo "exemple.fr" >> /etc/dkimkeys/HotesDeConfiance<br />
chown -R opendkim:opendkim /etc/dkimkeys/clefs/exemple.fr<br />
</syntaxhighlight><br />
<br />
===Méthode scripté===<br />
Le script suivant permet la création des clés de façon récursive en parcourant une liste de domaines initialisée dans le tableau <code>domaines</code>. Il constitue automatiquement l'arborescence à raison d'un répertoire par occurrence afin d'y ranger les fichiers conçus. Bien sûr, vous pouvez réaliser ces opérations vous mêmes via la commande de la section précédente.<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/dkimkeys/genClefs.sh<br />
#!/bin/bash<br />
# Script de génération des clés DKIM pour du multi-domaine<br />
<br />
selecteur=mail<br />
repertoire=/etc/dkimkeys<br />
domaines="exemple.fr toto.fr"<br />
<br />
for domaine in $domaines; do<br />
mkdir -p $repertoire/clefs/$domaine<br />
opendkim-genkey -b 4096 -D $repertoire/clefs/$domaine -r -d $domaine -s $selecteur<br />
echo "$selecteur._domainkey.$domaine $domaine:$selecteur:$repertoire/clefs/$domaine/$selecteur.private" >> $repertoire/TableClefs<br />
echo "$domaine $selecteur._domainkey.$domaine" >> $repertoire/TableSignatures<br />
echo "$domaine" >> $repertoire/HotesDeConfiance<br />
chown -R opendkim:opendkim $repertoire/clefs/$domaine<br />
done<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
chmod 740 /etc/dkimkeys/genClefs.sh<br />
/etc/dkimkeys/genClefs.sh<br />
<br />
===Attribution des droits===<br />
chown opendkim:opendkim /etc/dkimkeys/clefs/<br />
chown opendkim:opendkim /etc/dkimkeys/{TableClefs,TableSignatures,HotesDeConfiance}<br />
chmod 660 /etc/dkimkeys/{TableClefs,TableSignatures,HotesDeConfiance}<br />
<br />
==Configuration d'OpenDKIM==<br />
Le fichier est assez simple et reprend les éléments abordés précédemment.<br />
mv /etc/opendkim.conf /etc/opendkim.conf.ori<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/opendkim.conf<br />
Syslog yes<br />
SyslogSuccess yes<br />
Canonicalization relaxed/simple<br />
OversignHeaders From<br />
UserID opendkim<br />
UMask 007<br />
Socket local:/var/spool/postfix/var/run/opendkim/opendkim.sock<br />
PidFile /run/opendkim/opendkim.pid<br />
TrustAnchorFile /usr/share/dns/root.key<br />
# Table des clés<br />
KeyTable /etc/dkimkeys/TableClefs<br />
# Liste les domaines à signer<br />
SigningTable /etc/dkimkeys/TableSignatures<br />
# SigningTable = Donne la correspondance entre les domaines et les selecteurs<br />
ExternalIgnoreList /etc/dkimkeys/HotesDeConfiance<br />
# Donne la correspondance entre les selecteurs et les clés à utiliser<br />
InternalHosts /etc/dkimkeys/HotesDeConfiance<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Création du répertoire d'accueil pour le socket<br />
mkdir -p /var/spool/postfix/var/run/opendkim<br />
<br />
''Note : ce socket permet la communication entre Postfix et OpenDKIM. Le [https://unix.stackexchange.com/questions/74477/postfix-smtpd-warning-connect-to-milter-service-unix-var-run-opendkim-opendki choix] du chemin est guidé par la [http://www.postfix.org/BASIC_CONFIGURATION_README.html#chroot_setup racine d'exécution] du MTA selon les directives du fichier <code>master.cf</code>.''<br />
<br />
Don de propriété dessus<br />
chown opendkim:opendkim /var/spool/postfix/var/run/opendkim<br />
<br />
Ajout de l'utilisateur ''opendkim'' au groupe ''postfix'' afin de permettre la communication via le socket<br />
usermod -a -G opendkim postfix<br />
<br />
Si vous avez été attentif lors de l'édition du fichier [[#Main.cf|main.cf]], vous avez dû remarqué les valeurs se rapportant à cette section. Je vous invite à y lire les commentaires afin de comprendre chacune d'elles.<br />
<br />
Tous les éléments locaux sont prêts, nous pouvons redémarrer le service<br />
systemctl restart opendkim.service<br />
<br />
==Enregistrement DNS DKIM==<br />
Il ne vous a pas échappé que ce protocole se base lui aussi sur le ''DNS''. Il va falloir publier votre clé publique dans un enregistrement dédié sur votre zone. Ajoutez-en un de type ''TXT'' ou ''DKIM'' comportant le contenu du fichier <code><selecteur>.txt</code> généré avec votre clé tout à l'heure. Du fait de la longueur de la clé (4096 bits), son contenu est tronqué en plusieurs lignes. Cet aspect ne dérange nullement les implémentations ''DNS'' que j'ai pu rencontrer. Il est donc possible d'ajouter la clé à votre zone par un simple copier/coller de celle-ci :<br />
<br />
<syntaxhighlight lang="bash"><br />
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; s=email; "<br />
"p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnjMYbRgp+0a7BY5pUdQ2lgMWlnsWCL94nwMfcZ0weEHQoL+ip1s7m95L0HqIjCi3yPn5lL4Lx0wZ8ujPKVhXB3R+E/rjBOUXo26vTULCDdpqfg+IzxvyqjM+644Y8NYb+fRu4WkpBMkptMmogRhHnu3uDS+4/IyEqAH4OOy5SZHW5atwm87KCEDH8LcffLedr/nV22gXe5Wd2M"<br />
"z3RqLPyaOgOxoIqOZKOIy5Xs5x1FCV8MNRdj8xT65GKsriN5/RSXK1NU1dvhnmTl/zuXP95F21YZPbwZEy3EXsyQuiyb1westiXy4fkWi0qV9vdYvyNZLn+wUk6tvY1mQ/OBewnrqGfHR/Tf8r+6Ku29CAYt4k6DXEmlEmZlM3d8Vg7/krlsYdlZIqDmOktxelGg3Oey5IJeqknHZh0lxxNjGm1zPjUKbF0MgMP1DZzlDgHJKIk558IyBV"<br />
"3zNDMIvVbbWNzOyeU5513n0AOx7D8jayHvc3R9GkhyeHDH4XBExcobKPZstsGdEdLLTFnT7fDVAqur53HSuLSAum+0IK8VkC5K0QN21A6DNlzKvCbN4l4blVNg7qlnViqFB9g3ZfAsdCfgca1Dq4iFWS+Z9yuwkfWxdQbKYfcwD8Zb8sLpmTYZmjbk9CcD8jTFkJwKpLaT2Beo8YJdKh31V/Fkd6MXbI5gECAwEAAQ==" ) ; ----- DKIM key mail for exemple.fr<br />
</syntaxhighlight><br />
<br />
Pour vérifier la prise en compte de votre modification, vous pouvez utiliser la commande suivante pour requêter le serveur ''DNS'' :<br />
dig mail._domainkey.exemple.fr TXT<br />
<br />
Nous utiliserons des [[#Outils_WEB|outils WEB]] à la fin pour tester ceci de façon plus approfondie.<br />
<br />
=Spamassassin=<br />
''Spamassassin'' est un programme écrit en ''Perl'' et en ''C'' diffusé sous la licence libre ''Apache'' version 2.0. Il a pour rôle de filtrer le trafic des courriels transitant par un ''MTA'' (''Postfix'' dans notre cas) dans l'optique d'identifier pour traitement les messages indésirables. Celui-ci peut prendre diverses formes dans la mesure où l'outil donne la possibilité à l'administrateur de réaliser ces propres filtres. Les actions les plus courantes sont de rejeter le message ou de le marquer pour trie via ''Sieve'' (solution retenue). Gardez en tête qu'il n'est pas impossible de faire face à des faux positifs et que le rejet de tels messages peuvent avoir des conséquences pour vos utilisateurs. Il convient alors d'appliquer les mesures adéquates à votre situation selon le flux que représente les pourriels.<br />
<br />
Pour chaque message filtrés, une note est attribuée au courriel selon des critères arbitraires tels que ceux énoncés en prérequis et sera utilisée lors de la lecture des règles afin de déterminer le sort réservé à celui-ci. Vous comprenez alors l'importance de respecter les standards de "propreté" énoncés en début de page pour que vos propres messages ne soient pas mal-traités par vos destinataires.<br />
<br />
Les sources suivantes ont, entre autres, permis d'écrire cette section :<br />
* https://wiki.debian.org/DebianSpamAssassin<br />
* https://www.malekal.com/installer-configurer-spamassassin-debian/<br />
* https://www.linuxbabe.com/redhat/spamassassin-centos-rhel-block-email-spam<br />
<br />
==Installation de Spamassassin==<br />
Le système de gestion des indésirables fonctionne au travers de trois composantes. Un module (''spamass-milter'') lié à ''Postfix'' écoutant sur un socket via le protocole ''Milter'' les messages provenant de celui-ci; un client nommé ''spamc'' exécuté par le module et chargé de transmettre les messages à ''spamd'' via un autre socket; un démon (''spamd'') chargé de la qualification des messages ainsi que de leur traitement.<br />
<br />
Installation des composants<br />
apt install --no-install-recommends spamassassin spamc spamass-milter<br />
<br />
Création d'un utilisateur dédié au service<br />
useradd --system --home-dir /run/spamassassin --shell /usr/sbin/nologin --user-group spamassassin<br />
<br />
Activation du service au démarrage<br />
systemctl enable spamassassin.service<br />
<br />
==Configuration de spamd==<br />
Par défaut, le démon ''spamd'' s'exécute avec l'utilisateur <code>postfix</code> et communique au module ''spamass-milter'' via un socket ''TCP''. Dans le respect du [https://fr.wikipedia.org/wiki/Principe_de_moindre_privil%C3%A8ge principe de moindre privilège], un utilisateur dédié a été ajouté et pour des raisons d'optimisation, de sécurité ainsi que de bon sens, le socket ''TCP'' laissera sa place à un socket ''UNIX''. Ce dernier est bien plus rapide (ne se tape pas tout le modèle ''OSI'' pour réaliser une communication locale...) et plus sécurisé (pas d'écoute ni de redirection de trames réseau possible).<br />
<br />
''Spamassassin'' ne créant pas lui-même le répertoire d'accueil de son socket, que nous situerons, [https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s15.html conformément] au [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] (''FHS''), dans le <code>/run</code> (qui est monté en ''tmpfs'' dans ''Debian''), nous ajouterons une [https://unix.stackexchange.com/questions/74477/postfix-smtpd-warning-connect-to-milter-service-unix-var-run-opendkim-opendki configuration] pour [https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html systemd-tmpfiles] afin de le fabriquer au démarrage.<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /usr/lib/tmpfiles.d/spamassassin.conf<br />
d /run/spamassassin 0750 spamassassin spamassassin - -<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Pour la session active, nous créerons ce répertoire manuellement afin de ne pas avoir à redémarrer tout de suite<br />
mkdir -p /var/run/spamassassin<br />
chown spamassassin:spamassassin /var/run/spamassassin<br />
<br />
''Note : <code>/var/run</code> est un lien symbolique du tmpfs <code>/run</code> présent de base dans le système.''<br />
<br />
Configuration du service<br />
<br />
<syntaxhighlight lang="bash"><br />
# Commenter toutes les lignes existantes<br />
sed -i '/^$/!s/^/#/g' /etc/default/spamassassin<br />
<br />
# Configuration du démon pour utiliser l'utilisateur spamassassin, un PID à un emplacement donné et un socket personnalisé du type UNIX<br />
cat << '_EOF_' >> /etc/default/spamassassin<br />
<br />
OPTIONS="--username spamassassin --create-prefs --max-children 5 --helper-home-dir --socketpath=/run/spamassassin/spamassassin.sock --socketowner=spamassassin --socketgroup=spamassassin --socketmode=0660"<br />
PIDFILE="/var/run/spamassassin/spamd.pid"<br />
CRON=0<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Ajout d'une action en cas de détection de pourriel<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' >> /etc/spamassassin/local.cf<br />
<br />
rewrite_header Subject *****SPAM*****<br />
report_safe 0<br />
whitelist_from *@exemple.fr<br />
<br />
add_header all Report _REPORT_<br />
add_header spam Flag _YESNOCAPS_<br />
add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_<br />
add_header all Level _STARS(*)_<br />
add_header all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_<br />
<br />
skip_rbl_checks 1<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Cette action ajoutera le préfixe ''*****SPAM*****'' au sujet du message considéré comme indésirable ainsi que des en-têtes de marquage (notamment ''X-Spam-Flag: YES''). Ceci aura pour effet de déclencher l'action de la règle ''Sieve'' globale écrite plus haut et de placer le message dans le dossier approprié. La dernière ligne désactive quant à elle la vérification des adresses ''IP'' émétrices via les [https://www.altospam.com/glossaire/listes-noires.php RBL] intégrées au logiciel (vous pouvez l'enlever si vous en voulez mais je ne sais pas ce qu'ils font des traces que vous laissez).<br />
<br />
==Configuration de spamass-milter==<br />
<syntaxhighlight lang="bash"><br />
# Commenter toutes les lignes existantes<br />
sed -i '/^$/!s/^/#/g' /etc/default/spamass-milter<br />
<br />
# Configuration du démon pour utiliser l'utilisateur spamassassin, un PID à un emplacement donné et un socket personnalisé du type UNIX<br />
cat << '_EOF_' >> /etc/default/spamass-milter<br />
<br />
OPTIONS="-u spamass-milter -i 127.0.0.1 -- -s 10485760 --socket=/run/spamassassin/spamassassin.sock"<br />
SOCKET="/var/spool/postfix/spamass/spamass.sock"<br />
SOCKETOWNER="spamass-milter:spamass-milter"<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
{{info|Si vous désirez rejeter les messages identifiés comme indésirables, vous pouvez ajouter le paramètre <code>-r <note></code> à la suite de l'adresse ''IP'' de lien local où ''<note>'' correspond à la note attribué au message par ''Spamassassin'' que vous considérez comme étant le seuil d'acceptabilité. Tout courriel ayant une note égale ou supérieur à ce seuil sera alors rejeté avec un code 550 à l'expéditeur.}}<br />
<br />
Ajout des utilisateurs <code>spamassassin</code> et <code>postfix</code> au groupe <code>spamass-milter</code> pour permettre la communication inter-socket<br />
usermod -a -G spamassassin spamass-milter<br />
usermod -a -G spamass-milter postfix<br />
<br />
''Note : la communication entre Postfix et Spamass-milter se fait à la fin du fichier [[#Main.cf|main.cf]] sur la même ligne que pour le socket d'OpenDKIM.''<br />
<br />
==Automatisation de l'apprentissage==<br />
L'outil dispose d'une fonctionnalité d'apprentissage basée sur l'[https://fr.wikipedia.org/wiki/Inf%C3%A9rence_bay%C3%A9sienne inférence bayésienne]. Afin d'entraîner le moteur sur les messages reçus, vous pouvez utiliser la tâche planifiée suivante (nécessite le logiciel [[Cron]]) :<br />
<br />
<syntaxhighlight lang="bash"><br />
cat << '_EOF_' > /etc/cron.daily/Spamassassin-bayés<br />
#!/bin/bash<br />
# Script de mise à jour automatique de la base bayésienne de Spamassassin<br />
<br />
# Mise à jour des règles de spamassassin<br />
# Pour utiliser cette fonctionnalité, il faut importer la clé GPG d'un canal de règles anti-pourriels.<br />
# Dans la mesure où, comme expliqué, nous ne recevons pas de messages non désirés, nous n'avons pas explorer cette piste.<br />
# /usr/bin/sa-update<br />
<br />
# Auto-apprentissage de Spamassassin sur les messages existants dans les boites aux lettres<br />
/usr/bin/sa-learn --ham /var/spool/mail/utilisateurs/*/*/cur/*<br />
/usr/bin/sa-learn --spam /var/spool/mail/utilisateurs/*/*/.Spam/cur/*<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
chmod +x /etc/cron.daily/Spamassassin-bayés<br />
<br />
{{info|La [https://cwiki.apache.org/confluence/display/SPAMASSASSIN/SiteWideBayesSetup documentation officielle] conseille de ne réaliser cette tâche que manuellement après vérification des messages présents dans votre boite aux lettres. Ceci dans une optique de ne pas apprendre de fausses données. Vous pouvez par exemple effectuer manuellement les commandes de cette section après un épisode de réception non désiré afin d'améliorer la détection. Si vous souhaitez suivre cette recommandation, pensez à ne pas le laisser dans ce répertoire afin que ''Cron'' ne l'exécute pas quotidiennement.}}<br />
<br />
=Tests de fonctionnement=<br />
Nous voici arrivé au grand moment : celui du test !<br />
<br />
Il va falloir redémarrer tous les services configurés précédemment afin de valider leur bon fonctionnement. Habituellement, j'aurai procédé par étape au file des sections mais l'écosystème abordé ayant la particularité de faire appel à des composants inter-dépendants, il est difficile de réaliser des tests d'intégration continue sans devoir revenir modifier des configurations tout au long du cheminement, ce qui aurai rendu la lecture exécrable. Ayant conscience de la difficulté de suivre une procédure aussi conséquente (et en vous assurant de la tâche encore plus importante qu'a été sa rédaction), j'ai préféré faire le choix d'une configuration en une traite, quitte à devoir vous faire corriger les quelques erreurs d'inattentions dans la lecture par la suite en vous appuyant sur les journaux du système. Soyez sûr que l'idée d'user au maximum de copier/coller pour l'application de ce document a été la trame directrice de sa rédaction afin de faciliter la mise en place de votre propre messagerie électronique.<br />
<br />
==Redémarrage des services==<br />
<br />
{{astuce|Il peut être judicieux d'afficher les journaux concernant la messagerie dans un second terminal pendant que vous redémarrez les services via un <code>tail -f /var/log/mail.log</code>.}}<br />
<br />
systemctl restart spamass-milter.service<br />
systemctl restart spamassassin.service<br />
systemctl restart opendkim.service<br />
systemctl restart dovecot.service<br />
systemctl restart postfix.service<br />
<br />
Vous pouvez naturellement afficher le statut de chacun des services via la commande <code>systemctl status <service></code> afin de vérifier l'état de leur exécution ainsi que la commande <code>journalctl -feu <service></code> pour en afficher les journaux propres dans leur intégralité.<br />
<br />
==Tests de communication==<br />
Quoi de mieux pour tester le fonctionnement que l'envoi d'un message ? Utilisez un client ''IMAP'' comme [[Rainloop]] ou [https://www.thunderbird.net/fr/ Thunderbird] (vous pouvez également configurer l'[[Thunderbird#Auto-configuration|auto-configuration]] pour celui-ci) et pensez à regarder le code source des messages sur la boite de destination afin de regarder leurs en-têtes. Vous y verrez la suite cryptographique utilisée pour la transmission, la note attribuée par ''Spamassassin'' ainsi que la signature ''DKIM''.<br />
<br />
==Outils WEB==<br />
Après avoir validé l'aspect fonctionnel de votre installation, il peut être judicieux de s'attarder sur l'aspect qualitatif au regard des standards de l'époque.<br />
<br />
Pour ce faire, vous pouvez utiliser les outils ''WEB'' suivant qui vous attribueront des notes et vous détailleront les divers points examinés dans le but de vous améliorer :<br />
* https://mxtoolbox.com pour vérifier vos résolutions DNS ainsi que la présence de votre adresse ''IP'' dans une liste noire d'indésirable<br />
* https://www.mail-tester.com afin de visualiser les points attrayants à l'acceptabilité de vos messages (cela peut être l'occasion d'utiliser un alias...)<br />
* https://cryptcheck.fr pour lister les suites cryptographiques ayant pu être négocier par le serveur distant<br />
<br />
{{astuce|Vous pouvez [https://rtcamp.com/tutorials/mail/server/testing/smtp/ vérifier] si votre serveur [https://fr.wikipedia.org/wiki/Open_relay relaie ouvertement] les courriels sur Internet (il ne doit pas le faire) via l'outil <code>swaks</code> utilisée comme suit depuis un client :<br />
swaks --server mail.exemple.fr --to toto@tutu.org<br />
}}<br />
<br />
==Test de détection de pourriels==<br />
Il est possible de simuler un courriel frauduleux en envoyant un message contenant la chaîne de caractère suivante :<br />
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X<br />
<br />
Vous verrez dans le journal <code>/var/log/mail.log</code> la phrase <code>stored mail into mailbox 'Spam'</code> informant de l'application de la règle ''Sieve'' de rangement.<br />
<br />
Depuis votre client de messagerie, vous verrez le message précédemment envoyé placé dans la boite "indésirables".<br />
<br />
=Débogage=<br />
==Messages d'erreurs connus==<br />
Cette section regroupe quelques erreurs qui ont déjà étés rencontrés et observables dans le fichier <code>/var/log/mail.log</code>.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Message !! Signification<br />
|-<br />
| <code>mail for exemple.fr loops back to myself</code> || Le nom de domaine du champ MX n'est pas renseigné au paramètre "mydestination" dans le main.cf<br />
|-<br />
| <code>postfix warning: SASL: Connect to private/auth failed: No such file or directory</code> || Indique un problème avec ''Dovecot'' (gérant l'authentification). Il faut repasser dans les fichiers de configuration de celui-ci<br />
|}<br />
<br />
=Commandes utiles=<br />
==Affichage des configurations==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Commande !! Signification<br />
|-<br />
| <code>postconf -d</code> || Renvoie le contenu du fichier [[#Main.cf|main.cf]] par défaut<br />
|-<br />
| <code>postconf -n</code> || Renvoie le contenu actuel du fichier [[#Main.cf|main.cf]] sans les commentaires<br />
|-<br />
| <code>postconf -p</code> || Renvoie la configuration totale de ''Postfix'', valeurs par défaut comprises<br />
|-<br />
| <code>doveconf -n</code> ou <code>dovecot -n</code> || Renvoie l'ensemble de la configuration de ''Dovecot''<br />
|}<br />
<br />
==Requêter la base de donnée==<br />
Afin de tester les différents fichiers de liaison de la base de données ''SQLite'' à ''Postfix'', il est possible d'utiliser la commande <code>postmap</code> sous cette forme<br />
postmap -q chaine_à_tester sqlite:/etc/postfix/sqlite-FONCTION.cf<br />
<br />
Pour vérifier l'existance d'un utilisateur ou d'un domaine, nous utiliserons la commande de cette façon<br />
postmap -q test@exemple sqlite:/etc/postfix/sqlite-utilisateurs.cf<br />
postmap -q jmador.yo sqlite:/etc/postfix/sqlite-domaines.cf<br />
<br />
==Gestion de la file d'attente de courrier==<br />
La file d'attente des messages de ''Postfix'' (''mail queue'') est l'endroit où sont stockés les courriels en cours d'envoi/réception ou qui sont revenus au serveur suite à un [[#Glossaire|message de non-délivrance]]. Les commandes utiles permettant de la gérer sont les suivantes (tirées de [https://www.system-linux.eu/index.php?post/2009/01/27/Traitement-de-Queue-mail-Postfix ce document]) :<br />
<br />
{| class="wikitable"<br />
|-<br />
! Commande !! Signification<br />
|-<br />
| <code>postqueue -p</code> || Liste les messages en queue<br />
|-<br />
| <code>postsuper -d DBB3F1A7</code> || Supprime un message en queue<br />
|-<br />
| <code>postsuper -d ALL</code> || Supprime tous les messages en queue<br />
|-<br />
| <code>postsuper -h DBA3F1A7</code> || Mettre un messages en attente<br />
|-<br />
| <code>postsuper -H DBA3F1A7</code> || Remettre un messages en mode normale<br />
|-<br />
| <code>postsuper -r DBA3F1A7</code> || Remettre en queue un message<br />
|-<br />
| <code>postsuper -r ALL</code> || Remettre en queue tous les messages<br />
|-<br />
| <code>postcat -q DBA3F1A9</code> || Afficher le contenu d'un message<br />
|-<br />
| <code>postqueue -f</code> || Forcer l'envoi des messages en queue <br />
|}<br />
<br />
=Glossaire=<br />
Le lexique entourant le domaine de la messagerie électronique est assez singulier. Voici quelques éléments de vocabulaire.<br />
<br />
==Rôles de messageries==<br />
* Agent de Transport du Courriel ou ''MTA'' (''Mail Transport Agent'') : service chargé d'acheminer les courriels vers un service de distribution du courrier (''MDA''). Ce service est assuré par le protocole ''SMTP'' (utilisé par ''Postfix'' dans notre cas)<br />
* Agent de Distribution du Courriel ou ''MDA'' (''Mail Delivery Agent'') : service chargé de déposer le courriel dans la boite aux lettres d'un utilisateur. Il s'occupe également des contraintes d'espace disque (quota, disque plein..) ou de corruption et prévient le ''MTA'' des erreurs de distribution. Cette tâche est assurée par les protocoles ''POP'', ''IMAP'' et ''JMAP'' (utilisés par ''Dovecot dans notre cas)<br />
* Agent Utilisateur du Courriel ou ''MUA'' (''Mail User Agent'') : logiciel client de messagerie électronique (''Rainloop'', ''Roundcube'', ''Thenderbird'', ''Outlook''...) chargé de présenter les courriels aux utilisateurs et de permettre leur rédaction. Il parle directement au ''MDA'' pour les requêtes de réception et au ''MTA'' pour l'envoi de ses messages<br />
<br />
<br />
==Protocoles mis en œuvre==<br />
* ''Simple Mail Transfer Protocol'' ([https://fr.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol SMTP]) : protocole de communication utilisé pour transférer le courriel vers les serveurs de messagerie électronique<br />
* ''Internet Message Access Protocol'' ([https://fr.wikipedia.org/wiki/Internet_Message_Access_Protocol IMAP]) : protocole permettant à un client d'accéder à ses courriels directement sur les serveurs de messagerie via un logiciel de consultation<br />
* ''Transport Layer Security'' ([https://fr.wikipedia.org/wiki/Transport_Layer_Security TLS]) : protocole de négociation d'éléments secrets entre deux correspondant. Son objectif est de permettre l'établissement d'une communication sécurisée<br />
* ''DomainKeys Identified Mail'' ([https://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail DKIM]) : norme d'authentification fiable du nom de domaine de l'expéditeur d'un courriel. Permet également de garantir l'intégrité d'un message. Plus de détails sur ces balises [https://help.returnpath.com/hc/fr/articles/222481088-Aper%C3%A7u-du-DNS-record-pour-la-signature-DKIM ici]<br />
** Selecteur : élément de l'en-tête ''DKIM'' indiquant l'emplacement de la clé dans la zone ''DNS'' du domaine. Cet élément est concaténé avec le domaine pour effectuer une requête de résolution comme vu [[#Enregistrement_DNS_DKIM|précédemment]]<br />
* ''GNU Privacy Guard'' ([https://fr.wikipedia.org/wiki/GNU_Privacy_Guard GPG]) : implémentation libre du standard [https://fr.wikipedia.org/wiki/OpenPGP OpenPGP] permettant d'assurer la confidentialité et l'intégrité d'un message par un secret connu des seuls correspondants<br />
* Milter : [http://www.postfix.org/MILTER_README.html extension] présente sous forme d'[https://fr.wikipedia.org/wiki/Interface_de_programmation interface de programmation] du ''MTA'' permettant d'intégrer un programme dans la file de traitement des courriels. C'est le mécanisme qui nous permet de traiter les pourriels ainsi que les signatures ''DKIM'' mais peut aussi servir à l'analyse [https://www.clamav.net/ anti-virale]<br />
* ''Domain Name System'' ([https://fr.wikipedia.org/wiki/Domain_Name_System DNS]) : service d'annuaire distribué stockant des informations textuelles dans des enregistrements de différents types<br />
** Enregistrement de type ''A'' et ''AAAA'' : fournit la correspondance entre un nom d'hôte et une adresse ''IP'' (respectivement version 4 et version 6)<br />
** Enregistrement de type ''MX'' : fournit la correspondance entre le nom d'hôte du serveur de messagerie et un domaine. La concaténation de ces deux informations donne le nom pleinement qualifié (''FQDN'') et permet aux ''MTA'' distants de résoudre l'adresse ''IP'' du serveur de destination d'un messsage avec comme seule information le domaine de destination contenu dans le champ ''X-Original-to'' d'un courriel<br />
** Enregistrement de type ''TXT'' : champ de texte libre destiné principalement à rendre le ''DNS'' fléxible aux nouveaux usages. Un autre protocole n'a alors qu'à lire le contenu du champ pour obtenir l'information à traiter selon un formatage qu'aura respecté son rédacteur<br />
* ''Local Mail Transfer Protocol'' ([https://fr.wikipedia.org/wiki/Local_Mail_Transfer_Protocol LMTP]) : protocole ''SMTP'' simplifié destiné aux seuls échange de courriels entre utilisateurs d'un même ''MTA''<br />
<br />
<br />
==Divers==<br />
* Pourriel ou ''SPAM'' : message non désiré et souvent nuisible (hameçonnage, virus, arnaque...). Ils viennent rarement seuls car leurs expéditeurs ont pour habitude d'en envoyer massivement. les pourriels représentaient tout de même entre [https://fr.wikipedia.org/wiki/Spam#Spam_publicitaire 90 et 97%] du trafic total des courriels fin des années 2000. L'[https://fr.wikipedia.org/wiki/Spam#Origine_du_terme_%C2%AB_spam_%C2%BB origine du mot] ''SPAM'' provient d'une marque de viande dont les pratiques publicitaires se rapprochaient de la pratique moderne. Sur un serveur personnel, il reste tout de même assez simple de s'en prémunir en respectant une politique stricte de transmission de vos adresses ([[#Cr.C3.A9ation_des_fichiers_d.27exploitation_de_Postfix|alias]]).<br />
* ''HAM'' : désigne les courriels désirés. Cette notion est utilisée par le logiciel anti-pourriels ''Spamassassin'' lors de son usage de l'[https://fr.wikipedia.org/wiki/Inf%C3%A9rence_bay%C3%A9sienne inférence bayésienne]. Le terme est issue d'une partie du jambon en référence aux origines du mot ''SPAM'' et représente son opposé<br />
* Boites aux lettres (BAL) : répertoire de messagerie personnelle d'un utilisateur destinée à accueillir ses correspondances (répertoire <code>~/Maildir</code> de la documentation)<br />
* Message de non-délivrance ([https://www.altospam.com/glossaire/bounce.php bounce]) : courrier émis par un ''MTA'' à l'émetteur d'un message lorsque celui-ci n'a pu être délivré afin de l'en informer<br />
* Relais de courrier ouvert : serveur ''SMTP'' permettant à n'importe qui sur Internet d'envoyer un courriel par son intermédiaire<br />
* Liste noire en temps réel ([https://www.altospam.com/glossaire/listes-noires.php Realtime Blackhole List] ou ''RBL'') : listes de serveurs ou de réseaux IP connus pour aider, accueillir, produire ou retransmettre des pourriels ou fournir un service pouvant en émettre (relais ouverts)</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Vim&diff=1498Vim2024-01-27T11:17:29Z<p>Ycharbi : Replacement des balise de coloration syntaxique en ligne par des balises codes pour optimiser le chargement de la page + correction de fautes de Français + actualisation du lien pour les couleurs 24 bits + ajout d'un lien vers le dépôt Gitea vim-dev-web</p>
<hr />
<div>[[Category:éditeurs de texte]]<br />
[[Fichier:Vim logo.svg|100px]]<br />
<br />
[https://fr.wikipedia.org/wiki/Vim Vim] est un éditeur de texte, bifurcation de [https://fr.wikipedia.org/wiki/Vi_(logiciel) vi], signifiant "VI aMélioré" permettant d'éditer des documents de type texte (notamment des fichiers de configuration) dans un terminal ou une console (''shell''). Il ne nécessite pas d'interface graphique pour être exécuté, ce qui en fait un excellent outil sur un serveur, dépourvu d'[[:Category:Environnements bureau|environnements de bureau]].<br />
<br />
=Installation=<br />
apt install vim<br />
<br />
=Comportement=<br />
Vim possède 5 modes :<br />
# Le mode interactif<br />
# Le mode insertion<br />
# Le mode commande<br />
# Le mode visuel<br />
# Le mode recherche<br />
<br />
==Mode interactif==<br />
Lorsque ''Vim'' est exécuté, il est par défaut en mode interactif. Ce mode permet d'utiliser des combinaisons de touche pour interagir avec le texte du document en cours d'édition. Il est par exemple possible, en une combinaison, de couper 4 lignes de texte et de les coller dans un autre emplacement du document, voir dans un autre document.<br />
<br />
<span style="color:red;">Mettre un tableau avec les touches qu'on utilise souvent avec le mode interactif</span><br />
<br />
==Mode insertion==<br />
Le mode insertion est le mode classique d'édition de texte. C'est celui dans lequel on tape du texte comme dans n'importe quel autre éditeur.<br />
<br />
Pour revenir au mode interactif, il faut presser la touche <code><Echap></code>.<br />
<br />
==Mode commande==<br />
Ce mode permet d’interagir avec ''Vim'' par l'intermédiaire de commandes. Ces dernières vont permettre d'enregistrer le document, quitter ''Vim'', importer un document dans un autre, passer des expressions régulières, activer des options et bien d'autres choses...<br />
<br />
On entre une commande en étant au préalable en mode interactif et en tapant <code>:</code>.<br />
<br />
===Quelque commandes===<br />
Activer l'affichage des numéros de lignes<br />
<syntaxhighlight lang="vim"><br />
se nu<br />
</syntaxhighlight><br />
<br />
désactiver l'affichage des numéros de lignes<br />
<syntaxhighlight lang="vim"><br />
se nu!<br />
</syntaxhighlight><br />
<br />
Activer la coloration syntaxique<br />
<syntaxhighlight lang="vim"><br />
syn on<br />
</syntaxhighlight><br />
<br />
Désactiver la coloration syntaxique<br />
<syntaxhighlight lang="vim"><br />
syn off<br />
</syntaxhighlight><br />
<br />
Afficher la ligne où se trouve le curseur<br />
<syntaxhighlight lang="vim"><br />
set cursorline<br />
</syntaxhighlight><br />
<br />
Masquer le trait de soulignement<br />
<syntaxhighlight lang="vim"><br />
set cursorline!<br />
</syntaxhighlight><br />
<br />
Commenter plusieurs lignes<br />
<syntaxhighlight lang="vim"><br />
,+4 s/^/#/g<br />
</syntaxhighlight><br />
<br />
Dé-commenter plusieurs lignes<br />
<syntaxhighlight lang="vim"><br />
.,+4 s/^#//g<br />
</syntaxhighlight><br />
<br />
Plus simple, pour commenter (après une sélection des lignes à commenter en mode visuel bloc <code><maj>+<v></code> et un appui sur <code>:</code>)<br />
<syntaxhighlight lang="vim"><br />
s/^/#<br />
</syntaxhighlight><br />
<br />
Dé-commenter (après sélection <code><maj>+<v></code> + <code>:</code>)<br />
<syntaxhighlight lang="vim"><br />
s/#//<br />
</syntaxhighlight><br />
<br />
ou <code><maj>+<v></code> puis <code><x></code>.<br />
<br />
Ajouter en fin de ligne (après sélection <code><maj>+<v></code> + <code>:</code>)<br />
<syntaxhighlight lang="vim"><br />
s/$/\ :\ <br />
s/$/;<br />
</syntaxhighlight><br />
<br />
Ajouter au niveau du curseur (après sélection <code><ctrl>+<v></code> + <code>:</code>)<br />
<syntaxhighlight lang="vim"><br />
s/\%V/\ :<br />
s/\%V/^I<br />
</syntaxhighlight><br />
<br />
<span style="color:red;">vim ajouter à partir du curseur (À trouver) http://andrewradev.com/2011/05/08/vim-regexes/</span><br />
<br />
<span style="color:red;">Placer des curseur là ou on veut pour pouvoir utiliser les regex d'en haut de façon ultra puissante</span><br />
<br />
Remplacer un mot par un autre<br />
<syntaxhighlight lang="vim"><br />
%s/Mot_initial/Nouveau_mot/g<br />
</syntaxhighlight><br />
<br />
Changer encodage caractère<br />
<syntaxhighlight lang="vim"><br />
set fileencoding=latin1<br />
set fileencoding=utf-8<br />
</syntaxhighlight><br />
<br />
Auto complétion ''CSS'' (une fois renseigné, faire <code><ctrl>+<x></code> + <code><ctrl>+<o></code>)<br />
<syntaxhighlight lang="vim"><br />
set omnifunc=csscomplete#CompleteCSS<br />
</syntaxhighlight><br />
<br />
Exécuter une [[Shell bash|commande Bash]] sans quitter ''Vim''<br />
<syntaxhighlight lang="vim"><br />
!Commande_À_Exécuter<br />
</syntaxhighlight><br />
<br />
Importer un fichier depuis ''Vim''<br />
<syntaxhighlight lang="vim"><br />
r Chemin_fichier<br />
</syntaxhighlight><br />
<br />
Indentation automatique<br />
<syntaxhighlight lang="vim"><br />
se ai<br />
</syntaxhighlight><br />
<br />
Permettre un copier/coller respectant l'indentation avec <code>se ai</code><br />
<syntaxhighlight lang="vim"><br />
se paste<br />
</syntaxhighlight><br />
<br />
Activer/désactiver <code>se paste</code> en appuyant sur <code><F2></code><br />
<syntaxhighlight lang="vim"><br />
set pastetoggle=<F2><br />
</syntaxhighlight><br />
<br />
Insensibilité à la casse (utile pour le mode recherche notamment)<br />
<syntaxhighlight lang="vim"><br />
se ic<br />
</syntaxhighlight><br />
<br />
Activer le curseur de sélection avec la souris<br />
<syntaxhighlight lang="vim"><br />
se mouse=a<br />
</syntaxhighlight><br />
<br />
Désactiver le curseur de sélection avec la souris<br />
<syntaxhighlight lang="vim"><br />
se mouse=<br />
</syntaxhighlight><br />
<br />
Scinder l'écran pour ouvrir un autre fichier horizontalement<br />
<syntaxhighlight lang="vim"><br />
split [Nom_fichier] ou :sp<br />
</syntaxhighlight><br />
<br />
En vertical<br />
<syntaxhighlight lang="vim"><br />
vspli ou :vsp<br />
</syntaxhighlight><br />
<br />
{{info|Le couple <code><ctrl-w> + flèche</code> permet de passer d'un fichier à l'autre. }}<br />
<br />
Redéfinir l'espace de l'indentation (pour passer de 8 espaces à 3)<br />
<syntaxhighlight lang="vim"><br />
set tabstop=3<br />
set shiftwidth=3<br />
set softtabstop=3<br />
</syntaxhighlight><br />
<br />
Convertir des indentation "espace" en indentation "tabulation"<br />
<syntaxhighlight lang="vim"><br />
%retab!<br />
</syntaxhighlight><br />
Créer et gérer des onglets<br />
<syntaxhighlight lang="vim"><br />
tabnew [nom_fichier]<br />
</syntaxhighlight><br />
<br />
Se déplacer dans les onglets<br />
<br />
En avant : <code>gt</code>, en arrière : <code>gT</code>.<br />
<br />
Ouvrir plusieurs fichiers dans un onglet chacun (à exécuter dans ''Bash'') :<br />
vim -p fichier1 fichier2 fichier3<br />
<br />
Convertir du texte en majuscule ou en minuscule<br />
* Inverser la casse : sélectionner le texte avec <code>ctrl+v</code> et faire un <code>~</code><br />
<br />
ou<br />
<br />
* On peut utiliser <code>U</code> pour mettre en majuscule ou <code>u</code> pour mettre en minuscule<br />
<br />
Masquer les commentaires d'un fichier (à ajouter dans un [[#fichiers de configuration|fichier de configuration]])<br />
<syntaxhighlight lang="vim"><br />
set fdm=expr<br />
set fde=getline(v:lnum)=~'^\\s*#'?1:getline(prevnonblank(v:lnum))=~'^\\s*#'?1:getline(nextnonblank(v:lnum))=~'^\\s*#'?1:0<br />
</syntaxhighlight><br />
<br />
Pour '''déplier''' temporairement un bloc de commentaires (un bloc correspondant dans ce cas à plusieurs lignes consécutives commençant par le caractère '''#'''), placez votre curseur sur le pli correspondant au bloc compacté et tapez <code>zo</code> (ou pressez simplement sans sélection pour agir sur tout le document), et <code>zm</code> pour '''le replier'''. Si vous avez déplié plusieurs blocs, vous pouvez '''tous les replier''' d'un coup avec <code>zM</code> ; à l'inverse, vous pouvez '''déplier tous les blocs''' d'un seul coup avec <code>zi</code>.<br />
<br />
Utiliser Vim en tant qu'éditeur hexadécimale ([http://pellelatarte.fr/2010/10/utiliser-vi-en-editeur-hexadecimal/ source])<br />
%!xxd<br />
Revenir à la normal<br />
%!xxd -r<br />
<br />
{{attention|Un enregistrement en mode hexadécimale enregistrera le texte comme tel, il faudra alors désactiver ce mode et réenregistrer le document pour revenir à la normal.}}<br />
<br />
Garder la position du curseur là où il était à la [https://askubuntu.com/questions/202075/how-do-i-get-vim-to-remember-the-line-i-was-on-when-i-reopen-a-file réouverture] du fichier<br />
<syntaxhighlight lang="vim"><br />
if has("autocmd")<br />
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif<br />
endif<br />
</syntaxhighlight><br />
<br />
===Désactiver les fonctions agaçantes===<br />
Avec les mises à jour de ''Vim'', de plus en plus de fonctions inutiles et contres-productives sont installées par défaut (''Debian Stretch'', si tu m'entends...). Ce qui suit a pour but de rendre ''Vim'' de nouveau utilisable comme dans le bon vieux temps.<br />
<br />
Désactiver l'ajout automatique de commentaires ([https://superuser.com/questions/271023/vim-can-i-disable-continuation-of-comments-to-the-next-line source])<br />
<syntaxhighlight lang="vim"><br />
set formatoptions-=cro<br />
</syntaxhighlight><br />
<br />
Désactiver la gestion de la souris (qui empêche le copier/coller !)<br />
<syntaxhighlight lang="vim"><br />
set mouse=<br />
</syntaxhighlight><br />
<br />
===Corrections de bogues===<br />
====Corriger le problème des flèches qui affichent A B C D====<br />
De façon totalement aléatoire et sur certaines configurations, l'utilisation des flèches au clavier enclenche automatiquement le monde insertion et tape les lettres A, B, C ou D en fonction de la flèche pressée. Il semble que la façon de régler ce problème diffère selon les configurations. Une liste impressionnante de palliatifs est trouvable [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell ici]. La solution [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell#Solution_24 n°24] a réglée celui rencontré sur une Debian 12 installée via ''PXE'' comme des centaines d'autres chaque années dans mon infrastructure (celle-là a décidée de me faire chier).<br />
<br />
Il faut re-cartographier les touches fléchées en ajoutant ceci dans le <code>~/.vimrc</code> :<br />
nnoremap <silent> <ESC>OA <UP><br />
nnoremap <silent> <ESC>OB <DOWN><br />
nnoremap <silent> <ESC>OC <RIGHT><br />
nnoremap <silent> <ESC>OD <LEFT><br />
inoremap <silent> <ESC>OA <UP><br />
inoremap <silent> <ESC>OB <DOWN><br />
inoremap <silent> <ESC>OC <RIGHT><br />
inoremap <silent> <ESC>OD <LEFT><br />
<br />
=Presses papiers=<br />
''Vim'' possèdes plusieurs presses papiers appelés registres (''register'' ou ''buffers'') qui peuvent être exploités afin de maintenir plusieurs copier/coller en mémoires. Il y en a un par lettre de l'alphabet. Ils s'utilisent en '''mode interactif''' avec les touches <code><">+<lettre>+<raccourci></code> de cette manière :<br />
<br />
{{attention|Le contenu des presses papiers est sauvegardé même après avoir quitté ''Vim'' (ces informations sont stockés dans le fichier <code>~/.viminfo</code>). Ceci peut avoir des conséquences en terme de confidentialité des informations. Au besoin, pensez à utiliser le registre poubelle ainsi que la suppression du contenu des registres expliqué plus bas.}} <br />
<br />
Copier des lignes dans des presses papiers différents<br />
<br />
<code>"ayy</code>, <code>"byy</code>, <code>"cyy</code>.<br />
<br />
Coller des lignes depuis des presses papiers différents<br />
<br />
<code>"ap</code>, <code>"bp</code>, <code>"cp</code>.<br />
<br />
Pour ajouter une ligne à un presse papier, il faut préciser la lettre du presse papier voulu, en majuscule <code>"Byy</code>.<br />
<br />
Pour copier/coller en prenant en compte le presse papier par défaut (celui que l'on à lors d'un simple <code>yy</code>)<br />
<br />
<code>"+yy</code> copie une ligne pour le presse papier par défaut, et <code>"+p</code> colle le presse papier par défaut (ceci n'a aucun intérêt...).<br />
<br />
Registre poubelle (équivalent du /dev/null). Permet de supprimer des lignes sans les conserver dans un registre<br />
<code>"_dd</code><br />
<br />
Pour vider le [https://stackoverflow.com/questions/19430200/how-to-clear-vim-registers-effectively contenu] d'un registre, il faut utiliser la commande <code>:let @a = ''</code> en remplaçant la lettre par celle de votre registre ( utiliser <code>"</code> pour le registre par défaut).<br />
<br />
=Historique=<br />
L'historique de l'éditeur est parsemé dans le fichier <code>~/.viminfo</code>.<br />
<br />
Pour [https://unix.stackexchange.com/questions/204689/how-to-clear-search-and-command-history-in-vim purger] intégralement celui des recherches, il est possible de faire <code>:call histdel('/')</code>. Pour celui des commandes, on fera <code>:call histdel(':')</code>. <br />
<br />
Il est également possible de ne supprimer qu'une entrée en particulier via un motif: <code>:call histdel(":", "MOT_CLÉ_CONTENU_DANS_VOTRE_COMMANDE")</code>.<br />
<br />
=Macros=<br />
Définir l'intérêt des macros...<br />
<br />
Créer des macros<br />
<code>q+<lettre></code> pour passer en mode enregistrement.<br />
<br />
<code>q</code> pour terminer l'enregistrement.<br />
<br />
<code>@+<lettre></code> pour la jouer (ça fait comme un presse papier).<br />
<br />
=Fichiers de configuration=<br />
Les fichiers de configuration de ''Vim'' permettent de définir des paramètres activés à chaque lancement de l'éditeur. Il en existe deux types :<br />
* Un général, actif pour tout les utilisateurs du système : <code>/etc/vim/vimrc</code><br />
* Un courant, pour chaque utilisateurs en particulier : <code>~/.vimrc</code><br />
Il suffit de renseigner des commandes Vim (sans les ''':''') dans ces fichiers pour que leur effet soit permanent.<br />
<br />
Pour exécuter ''Vim'' tout en [https://evanhahn.com/ignore-vimrc-with-vim/ ignorant] les fichiers de configuration :<br />
vim -u NONE<br />
<br />
=Greffons=<br />
Il est possible d'ajouter des fonctionnalités supplémentaires à ''Vim'' par l'intermédiaire de greffons (''plugins''). Il sont à mettre (selon le même principe que le ''vimrc'') dans le répertoire général <code>/etc/vim/</code> ou dans <code>~/.vim/</code> pour les rendre spécifiques à chaque utilisateur.<br />
<br />
==Greffons que j'utilise==<br />
Pour une configuration adaptée à un développement ''WEB'', les informations de ce [https://gitea.ycharbi.fr/ycharbi/vim-dev-web dépôt] peuvent-êtres utiles.<br />
<br />
===Emmet===<br />
Orienté programmation web, le greffon [http://emmet.io/ Emmet] (anciennement ''Zen Coding'') permet, en utilisant une syntaxe (très) raccourcie, d'écrire du code ''HTML'' et ''CSS'' de façon extrêmement efficace. De plus, il est disponible sur une [http://emmet.io/download/ multitude d'éditeurs]. Il s'installe de la façon suivante :<br />
<br />
# Télécharger ''Emmet'' depuis les [https://github.com/mattn/emmet-vim sources]<br />
# Décompresser les répertoires '''autoload''' et '''plugin''' dans <code>~/.vim/</code><br />
<br />
<br />
Pour utiliser ''Emmet'', il faut écrire dans un fichier les différentes [http://docs.emmet.io/cheat-sheet/ expressions possibles] et faire la combinaison de touches (en mode interactif) <code><c-y>,</code> (faire '''ctrl + y''' et ensuite sur ''',''').<br />
<br />
===IndentLine===<br />
''IndentLine'' permet d'afficher une ligne verticale marquant le niveau d'indentation de votre code. Il est très utile notamment lorsque les bloques de code sont imbriqués sur énormément de niveau (rendant le repérage visuel extrêmement difficile). Il s'installe de la façon suivante :<br />
<br />
# Télécharger ''IndentLine'' depuis les [https://github.com/Yggdroot/indentLine sources]<br />
# Décompresser le répertoire '''plugin''' dans <code>~/.vim/</code><br />
# Ajouter dans le ''.vimrc'' ce paramètre (l'espace de fin est important) : <code>set list lcs=tab:\|\ </code><br />
<br />
==Gestionnaire de greffons==<br />
===Vim-plug===<br />
Télécharger le greffon<br />
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim<br />
<br />
Ajouter les greffons à installer et ajouter dans le ''vimrc''<br />
<syntaxhighlight lang="vim"><br />
call plug#begin()<br />
Plug 'junegunn/vim-easy-align'<br />
Plug 'vim-airline/vim-airline'<br />
Plug 'vim-airline/vim-airline-themes'<br />
Plug 'hzchirs/vim-material'<br />
call plug#end()<br />
</syntaxhighlight><br />
<br />
''On trouve les noms de ces greffons sur leur page GIT.''<br />
<br />
Installer les greffons mis dans le ''vimrc'' (aller dans <code>vim</code>)<br />
:PlugInstall<br />
<br />
{{info|Tout est mis dans <code>.vim</code>. Le paquet <code>git</code> est nécessaire.}}<br />
<br />
Un exemple de ''.vimrc''<br />
<syntaxhighlight lang="vim"><br />
se nu<br />
se termguicolors<br />
set pastetoggle=<F2><br />
<br />
"L'indentation passe à 3 caractères<br />
set tabstop=3<br />
set shiftwidth=3<br />
set softtabstop=3<br />
<br />
"Activer les greffons<br />
call plug#begin()<br />
Plug 'junegunn/vim-easy-align'<br />
Plug 'vim-airline/vim-airline'<br />
Plug 'vim-airline/vim-airline-themes'<br />
Plug 'hzchirs/vim-material'<br />
call plug#end()<br />
<br />
"Appliquer le thème vim-matérial<br />
colorscheme vim-material<br />
let g:airline_theme='material'<br />
</syntaxhighlight><br />
<br />
====Sources de la section====<br />
* https://github.com/junegunn/vim-plug<br />
* http://vimcolors.com/<br />
<br />
=Couleurs 24bits=<br />
Pour avoir des couleurs plus sympas avec ''Vim'' (remplace le ''syn on''), il faut utiliser ''se termguicolors''. Attention, il faut que le terminal utilisé soit compatible. [https://github.com/termstandard/colors Cette page Github] peut aider à déterminer si c'est le cas.<br />
<br />
=Sources=<br />
* http://cfennajoui.net/vim/traduit/html/usr_30.txt.php<br />
* http://www.blogduwebdesign.com/developpement-vim/vim-astuce-pour-le-copier-coller/605<br />
* http://qsdqsd.free.fr/Vim/Vim_-_Un_pas_en_avant.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Vim&diff=1497Vim2024-01-27T10:52:49Z<p>Ycharbi : Ajout de la section "Corrections de bogues"</p>
<hr />
<div>[[Category:éditeurs de texte]]<br />
[[Fichier:Vim logo.svg|100px]]<br />
<br />
[https://fr.wikipedia.org/wiki/Vim Vim] est un éditeur de texte, bifurcation de [https://fr.wikipedia.org/wiki/Vi_(logiciel) vi], signifiant "VI aMélioré" permettant d'éditer des documents de type texte (notamment des fichiers de configuration) dans un terminal ou une console (''shell''). Il ne nécessite pas d'interface graphique pour être exécuté, ce qui en fait un excellent outil sur un serveur, dépourvu d'[[:Category:Environnements bureau|environnements de bureau]].<br />
<br />
=Installation=<br />
apt install vim<br />
<br />
=Comportement=<br />
Vim possède 5 modes :<br />
# Le mode interactif<br />
# Le mode insertion<br />
# Le mode commande<br />
# Le mode visuel<br />
# Le mode recherche<br />
<br />
==Mode interactif==<br />
Lorsque ''Vim'' est exécuté, il est par défaut en mode interactif. Ce mode permet d'utiliser des combinaisons de touche pour interagir avec le texte du document en cours d'édition. Il est par exemple possible, en une combinaison, de couper 4 lignes de texte et de les coller dans un autre emplacement du document, voir dans un autre document.<br />
<br />
<span style="color:red;">Mettre un tableau avec les touches qu'on utilise souvent avec le mode interactif</span><br />
<br />
==Mode insertion==<br />
Le mode insertion est le mode classique d'édition de texte. C'est celui dans lequel on tape du texte comme dans n'importe quel autre éditeur.<br />
<br />
Pour revenir au mode interactif, il faut presser la touche <syntaxhighlight lang="bash" inline><Echap></syntaxhighlight>.<br />
<br />
==Mode commande==<br />
Ce mode permet d’interagir avec ''Vim'' par l'intermédiaire de commandes. Ces dernières vont permettre d'enregistrer le document, quitter ''Vim'', importer un document dans un autre, passer des expressions régulières, activer des options et bien d'autres choses...<br />
<br />
On entre une commande en étant au préalable en mode interactif et en tapant <syntaxhighlight lang="bash" inline>:</syntaxhighlight>.<br />
<br />
===Quelque commandes===<br />
Activer l'affichage des numéros de lignes<br />
<syntaxhighlight lang="vim"><br />
se nu<br />
</syntaxhighlight><br />
<br />
désactiver l'affichage des numéros de lignes<br />
<syntaxhighlight lang="vim"><br />
se nu!<br />
</syntaxhighlight><br />
<br />
Activer la coloration syntaxique<br />
<syntaxhighlight lang="vim"><br />
syn on<br />
</syntaxhighlight><br />
<br />
Désactiver la coloration syntaxique<br />
<syntaxhighlight lang="vim"><br />
syn off<br />
</syntaxhighlight><br />
<br />
Afficher la ligne où se trouve le curseur<br />
<syntaxhighlight lang="vim"><br />
set cursorline<br />
</syntaxhighlight><br />
<br />
Masquer le trait de soulignement<br />
<syntaxhighlight lang="vim"><br />
set cursorline!<br />
</syntaxhighlight><br />
<br />
Commenter plusieurs lignes<br />
<syntaxhighlight lang="vim"><br />
,+4 s/^/#/g<br />
</syntaxhighlight><br />
<br />
Dé-commenter plusieurs lignes<br />
<syntaxhighlight lang="vim"><br />
.,+4 s/^#//g<br />
</syntaxhighlight><br />
<br />
Plus simple, pour commenter (après une sélection des lignes à commenter en mode visuel bloc <syntaxhighlight lang="bash" inline><maj>+<v></syntaxhighlight> et un appui sur <syntaxhighlight lang="bash" inline>:</syntaxhighlight>)<br />
<syntaxhighlight lang="vim"><br />
s/^/#<br />
</syntaxhighlight><br />
<br />
Dé-commenter (après sélection <syntaxhighlight lang="bash" inline><maj>+<v></syntaxhighlight> + <syntaxhighlight lang="bash" inline>:</syntaxhighlight>)<br />
<syntaxhighlight lang="vim"><br />
s/#//<br />
</syntaxhighlight><br />
<br />
ou <syntaxhighlight lang="bash" inline><maj>+<v></syntaxhighlight> puis <syntaxhighlight lang="bash" inline><x></syntaxhighlight>.<br />
<br />
Ajouter en fin de ligne (après sélection <syntaxhighlight lang="bash" inline><maj>+<v></syntaxhighlight> + <syntaxhighlight lang="bash" inline>:</syntaxhighlight>)<br />
<syntaxhighlight lang="vim"><br />
s/$/\ :\ <br />
s/$/;<br />
</syntaxhighlight><br />
<br />
Ajouter au niveau du curseur (après sélection <syntaxhighlight lang="bash" inline><ctrl>+<v></syntaxhighlight> + <syntaxhighlight lang="bash" inline>:</syntaxhighlight>)<br />
<syntaxhighlight lang="vim"><br />
s/\%V/\ :<br />
s/\%V/^I<br />
</syntaxhighlight><br />
<br />
<span style="color:red;">vim ajouter à partir du curseur (À trouver) http://andrewradev.com/2011/05/08/vim-regexes/</span><br />
<br />
<span style="color:red;">Placer des curseur là ou on veut pour pouvoir utiliser les regex d'en haut de façon ultra puissante</span><br />
<br />
Remplacer un mot par un autre<br />
<syntaxhighlight lang="vim"><br />
%s/Mot_initial/Nouveau_mot/g<br />
</syntaxhighlight><br />
<br />
Changer encodage caractère<br />
<syntaxhighlight lang="vim"><br />
set fileencoding=latin1<br />
set fileencoding=utf-8<br />
</syntaxhighlight><br />
<br />
Auto complétion ''CSS'' (une fois renseigné, faire <syntaxhighlight lang="bash" inline><ctrl>+<x></syntaxhighlight> + <syntaxhighlight lang="bash" inline><ctrl>+<o></syntaxhighlight>)<br />
<syntaxhighlight lang="vim"><br />
set omnifunc=csscomplete#CompleteCSS<br />
</syntaxhighlight><br />
<br />
Exécuter une [[Shell bash|commande Bash]] sans quitter ''Vim''<br />
<syntaxhighlight lang="vim"><br />
!Commande_À_Exécuter<br />
</syntaxhighlight><br />
<br />
Importer un fichier depuis ''Vim''<br />
<syntaxhighlight lang="vim"><br />
r Chemin_fichier<br />
</syntaxhighlight><br />
<br />
Indentation automatique<br />
<syntaxhighlight lang="vim"><br />
se ai<br />
</syntaxhighlight><br />
<br />
Permettre un copier/coller respectant l'indentation avec <syntaxhighlight lang="vim" inline>se ai</syntaxhighlight><br />
<syntaxhighlight lang="vim"><br />
se paste<br />
</syntaxhighlight><br />
<br />
Activer/désactiver <syntaxhighlight lang="vim" inline>se paste</syntaxhighlight> en appuyant sur <syntaxhighlight lang="bash" inline><F2></syntaxhighlight><br />
<syntaxhighlight lang="vim"><br />
set pastetoggle=<F2><br />
</syntaxhighlight><br />
<br />
Insensibilité à la casse (utile pour le mode recherche notamment)<br />
<syntaxhighlight lang="vim"><br />
se ic<br />
</syntaxhighlight><br />
<br />
Activer le curseur de sélection avec la souris<br />
<syntaxhighlight lang="vim"><br />
se mouse=a<br />
</syntaxhighlight><br />
<br />
Désactiver le curseur de sélection avec la souris<br />
<syntaxhighlight lang="vim"><br />
se mouse=<br />
</syntaxhighlight><br />
<br />
Scinder l'écran pour ouvrir un autre fichier horizontalement<br />
<syntaxhighlight lang="vim"><br />
split [Nom_fichier] ou :sp<br />
</syntaxhighlight><br />
<br />
En vertical<br />
<syntaxhighlight lang="vim"><br />
vspli ou :vsp<br />
</syntaxhighlight><br />
<br />
{{info|Le couple <syntaxhighlight lang="bash" inline><ctrl-w> + flèche</syntaxhighlight> permet de passer d'un fichier à l'autre. }}<br />
<br />
Redéfinir l'espace de l'indentation (pour passer de 8 espaces à 3)<br />
<syntaxhighlight lang="vim"><br />
set tabstop=3<br />
set shiftwidth=3<br />
set softtabstop=3<br />
</syntaxhighlight><br />
<br />
Convertir des indentation "espace" en indentation "tabulation"<br />
<syntaxhighlight lang="vim"><br />
%retab!<br />
</syntaxhighlight><br />
Créer et gérer des onglets<br />
<syntaxhighlight lang="vim"><br />
tabnew [nom_fichier]<br />
</syntaxhighlight><br />
<br />
Se déplacer dans les onglets<br />
<br />
En avant : <syntaxhighlight lang="vim" inline>gt</syntaxhighlight>, en arrière : <syntaxhighlight lang="vim" inline>gT</syntaxhighlight>.<br />
<br />
Ouvrir plusieurs fichiers dans un onglet chacun (à exécuter dans ''Bash'') :<br />
vim -p fichier1 fichier2 fichier3<br />
<br />
Convertir du texte en majuscule ou en minuscule<br />
* Inverser la casse : sélectionner le texte avec <syntaxhighlight lang="bash" inline>ctrl+v</syntaxhighlight> et faire un <syntaxhighlight lang="bash" inline>~</syntaxhighlight><br />
<br />
ou<br />
<br />
* On peut utiliser <syntaxhighlight lang="bash" inline>U</syntaxhighlight> pour mettre en majuscule ou <syntaxhighlight lang="bash" inline>u</syntaxhighlight> pour mettre en minuscule<br />
<br />
Masquer les commentaires d'un fichier (à ajouter dans un [[#fichiers de configuration|fichier de configuration]])<br />
<syntaxhighlight lang="vim"><br />
set fdm=expr<br />
set fde=getline(v:lnum)=~'^\\s*#'?1:getline(prevnonblank(v:lnum))=~'^\\s*#'?1:getline(nextnonblank(v:lnum))=~'^\\s*#'?1:0<br />
</syntaxhighlight><br />
<br />
Pour '''déplier''' temporairement un bloc de commentaires (un bloc correspondant dans ce cas à plusieurs lignes consécutives commençant par le caractère '''#'''), placez votre curseur sur le pli correspondant au bloc compacté et tapez <syntaxhighlight lang="bash" inline>zo</syntaxhighlight> (ou pressez simplement sans sélection pour agir sur tout le document), et <syntaxhighlight lang="bash" inline>zm</syntaxhighlight> pour '''le replier'''. Si vous avez déplié plusieurs blocs, vous pouvez '''tous les replier''' d'un coup avec <syntaxhighlight lang="bash" inline>zM</syntaxhighlight> ; à l'inverse, vous pouvez '''déplier tous les blocs''' d'un seul coup avec <syntaxhighlight lang="bash" inline>zi</syntaxhighlight>.<br />
<br />
Utiliser Vim en tant qu'éditeur hexadécimale ([http://pellelatarte.fr/2010/10/utiliser-vi-en-editeur-hexadecimal/ source])<br />
%!xxd<br />
Revenir à la normal<br />
%!xxd -r<br />
<br />
{{attention|Un enregistrement en mode hexadécimale enregistrera le texte comme tel, il faudra alors désactiver ce mode et réenregistrer le document pour revenir à la normal.}}<br />
<br />
Garder la position du curseur là où il était à la [https://askubuntu.com/questions/202075/how-do-i-get-vim-to-remember-the-line-i-was-on-when-i-reopen-a-file réouverture] du fichier<br />
<syntaxhighlight lang="vim"><br />
if has("autocmd")<br />
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif<br />
endif<br />
</syntaxhighlight><br />
<br />
===Désactiver les fonctions agaçantes===<br />
Avec les mises à jour de ''Vim'', de plus en plus de fonctions inutiles et contres-productives sont installées par défaut (''Debian Stretch'', si tu m'entends...). Ce qui suit a pour but de rendre ''Vim'' de nouveau utilisable comme dans le bon vieux temps.<br />
<br />
Désactiver l'ajout automatique de commentaires ([https://superuser.com/questions/271023/vim-can-i-disable-continuation-of-comments-to-the-next-line source])<br />
<syntaxhighlight lang="vim"><br />
set formatoptions-=cro<br />
</syntaxhighlight><br />
<br />
Désactiver la gestion de la souris (qui empêche le copier/coller !)<br />
<syntaxhighlight lang="vim"><br />
set mouse=<br />
</syntaxhighlight><br />
<br />
===Corrections de bogues===<br />
====Corriger le problème des flêches qui affichent A B C D====<br />
De façon totalement aléatoire et sur certaines configurations, l'utilisation des flèches au clavier enclenche automatiquement le monde insertion et tape les lettres A, B, C ou D en fonction de la flèche préssée. Il semble que la façon de régler ce problème diffère selon les configurations. Une liste impressionnante de paliatifs est trouvable [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell ici]. La solution [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell#Solution_24 n°24] a réglée celui rencontré sur une Débian 12 installée via ''PXE'' comme des centaines d'autres chaque années dans mon infrastructure (celle-là a décidée de me faire chier).<br />
<br />
Il faut recartographier les touches flèchées en ajoutant ceci dans le <code>~/.vimrc</code> :<br />
nnoremap <silent> <ESC>OA <UP><br />
nnoremap <silent> <ESC>OB <DOWN><br />
nnoremap <silent> <ESC>OC <RIGHT><br />
nnoremap <silent> <ESC>OD <LEFT><br />
inoremap <silent> <ESC>OA <UP><br />
inoremap <silent> <ESC>OB <DOWN><br />
inoremap <silent> <ESC>OC <RIGHT><br />
inoremap <silent> <ESC>OD <LEFT><br />
<br />
=Presses papiers=<br />
''Vim'' possèdes plusieurs presses papiers appelés registres (''register'' ou ''buffers'') qui peuvent être exploités afin de maintenir plusieurs copier/coller en mémoires. Il y en a un par lettre de l'alphabet. Ils s'utilisent en '''mode interactif''' avec les touches <syntaxhighlight lang="bash" inline><">+<lettre>+<raccourci></syntaxhighlight> de cette manière :<br />
<br />
{{attention|Le contenu des presses papiers est sauvegardé même après avoir quitté ''Vim'' (ces informations sont stockés dans le fichier <syntaxhighlight lang="bash" inline>~/.viminfo</syntaxhighlight>). Ceci peut avoir des conséquences en terme de confidentialité des informations. Au besoin, pensez à utiliser le registre poubelle ainsi que la suppression du contenu des registres expliqué plus bas.}} <br />
<br />
Copier des lignes dans des presses papiers différents<br />
<br />
<syntaxhighlight lang="bash" inline>"ayy</syntaxhighlight>, <syntaxhighlight lang="bash" inline>"byy</syntaxhighlight>, <syntaxhighlight lang="bash" inline>"cyy</syntaxhighlight>.<br />
<br />
Coller des lignes depuis des presses papiers différents<br />
<br />
<syntaxhighlight lang="bash" inline>"ap</syntaxhighlight>, <syntaxhighlight lang="bash" inline>"bp</syntaxhighlight>, <syntaxhighlight lang="bash" inline>"cp</syntaxhighlight>.<br />
<br />
Pour ajouter une ligne à un presse papier, il faut préciser la lettre du presse papier voulu, en majuscule <syntaxhighlight lang="bash" inline>"Byy</syntaxhighlight>.<br />
<br />
Pour copier/coller en prenant en compte le presse papier par défaut (celui que l'on à lors d'un simple <syntaxhighlight lang="bash" inline>yy</syntaxhighlight>)<br />
<br />
<syntaxhighlight lang="bash" inline>"+yy</syntaxhighlight> copie une ligne pour le presse papier par défaut, et <syntaxhighlight lang="bash" inline>"+p</syntaxhighlight> colle le presse papier par défaut (ceci n'a aucun intérêt...).<br />
<br />
Registre poubelle (équivalent du /dev/null). Permet de supprimer des lignes sans les conserver dans un registre<br />
<syntaxhighlight lang="bash" inline>"_dd</syntaxhighlight><br />
<br />
Pour vider le [https://stackoverflow.com/questions/19430200/how-to-clear-vim-registers-effectively contenu] d'un registre, il faut utiliser la commande <syntaxhighlight lang="bash" inline>:let @a = ''</syntaxhighlight> en remplaçant la lettre par celle de votre registre ( utiliser <syntaxhighlight lang="bash" inline>"</syntaxhighlight> pour le registre par défaut).<br />
<br />
=Historique=<br />
L'historique de l'éditeur est parsemé dans le fichier <syntaxhighlight lang="bash" inline>~/.viminfo</syntaxhighlight>.<br />
<br />
Pour [https://unix.stackexchange.com/questions/204689/how-to-clear-search-and-command-history-in-vim purger] intégralement celui des recherches, il est possible de faire <syntaxhighlight lang="vim" inline>:call histdel('/')</syntaxhighlight>. Pour celui des commandes, on fera <syntaxhighlight lang="vim" inline>:call histdel(':')</syntaxhighlight>. <br />
<br />
Il est également possible de ne supprimer qu'une entrée en particulier via un motif: <syntaxhighlight lang="vim" inline>:call histdel(":", "MOT_CLÉ_CONTENU_DANS_VOTRE_COMMANDE")</syntaxhighlight>.<br />
<br />
=Macros=<br />
Définir l'intérêt des macros...<br />
<br />
Créer des macros<br />
<syntaxhighlight lang="bash" inline>q+<lettre></syntaxhighlight> pour passer en mode enregistrement.<br />
<br />
<syntaxhighlight lang="bash" inline>q</syntaxhighlight> pour terminer l'enregistrement.<br />
<br />
<syntaxhighlight lang="bash" inline>@+<lettre></syntaxhighlight> pour la jouer (ça fait comme un presse papier).<br />
<br />
=Fichiers de configuration=<br />
Les fichiers de configuration de ''Vim'' permettent de définir des paramètres activés à chaque lancement de l'éditeur. Il en existe deux types :<br />
* Un général, actif pour tout les utilisateurs du système : <syntaxhighlight lang="bash" inline>/etc/vim/vimrc</syntaxhighlight><br />
* Un courant, pour chaque utilisateurs en particulier : <syntaxhighlight lang="bash" inline>~/.vimrc</syntaxhighlight><br />
Il suffit de renseigner des commandes Vim (sans les ''':''') dans ces fichiers pour que leur effet soit permanent.<br />
<br />
Pour exécuter ''Vim'' tout en [https://evanhahn.com/ignore-vimrc-with-vim/ ignorant] les fichiers de configuration :<br />
vim -u NONE<br />
<br />
=Greffons=<br />
Il est possible d'ajouter des fonctionnalités supplémentaires à ''Vim'' par l'intermédiaire de greffons (''plugins''). Il sont à mettre (selon le même principe que le ''vimrc'') dans le répertoire général <syntaxhighlight lang="bash" inline>/etc/vim/</syntaxhighlight> ou dans <syntaxhighlight lang="bash" inline>~/.vim/</syntaxhighlight> pour les rendre spécifiques à chaque utilisateur.<br />
<br />
==Greffons que j'utilise==<br />
===Emmet===<br />
Orienté programmation web, le greffon [http://emmet.io/ Emmet] (anciennement ''Zen Coding'') permet, en utilisant une syntaxe (très) raccourcie, d'écrire du code ''HTML'' et ''CSS'' de façon extrêmement efficace. De plus, il est disponible sur une [http://emmet.io/download/ multitude d'éditeurs]. Il s'installe de la façon suivante :<br />
<br />
# Télécharger ''Emmet'' depuis les [https://github.com/mattn/emmet-vim sources]<br />
# Décompresser les répertoires '''autoload''' et '''plugin''' dans <syntaxhighlight lang="bash" inline>~/.vim/</syntaxhighlight><br />
<br />
<br />
Pour utiliser ''Emmet'', il faut écrire dans un fichier les différentes [http://docs.emmet.io/cheat-sheet/ expressions possibles] et faire la combinaison de touches (en mode interactif) <syntaxhighlight lang="bash" inline><c-y>,</syntaxhighlight> (faire '''ctrl + y''' et ensuite sur ''',''').<br />
<br />
===IndentLine===<br />
''IndentLine'' permet d'afficher une ligne verticale marquant le niveau d'indentation de votre code. Il est très utile notamment lorsque les bloques de code sont imbriqués sur énormément de niveau (rendant le repérage visuel extrêmement difficile). Il s'installe de la façon suivante :<br />
<br />
# Télécharger ''IndentLine'' depuis les [https://github.com/Yggdroot/indentLine sources]<br />
# Décompresser le répertoire '''plugin''' dans <syntaxhighlight lang="bash" inline>~/.vim/</syntaxhighlight><br />
# Ajouter dans le ''.vimrc'' ce paramètre (l'espace de fin est important) : <syntaxhighlight lang="bash" inline>set list lcs=tab:\|\ </syntaxhighlight><br />
<br />
==Gestionnaire de greffons==<br />
===Vim-plug===<br />
Télécharger le greffon<br />
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim<br />
<br />
Ajouter les greffons à installer et ajouter dans le ''vimrc''<br />
<syntaxhighlight lang="vim"><br />
call plug#begin()<br />
Plug 'junegunn/vim-easy-align'<br />
Plug 'vim-airline/vim-airline'<br />
Plug 'vim-airline/vim-airline-themes'<br />
Plug 'hzchirs/vim-material'<br />
call plug#end()<br />
</syntaxhighlight><br />
<br />
''On trouve les noms de ces greffons sur leur page GIT.''<br />
<br />
Installer les greffons mis dans le ''vimrc'' (aller dans <syntaxhighlight lang="bash" inline>vim</syntaxhighlight>)<br />
:PlugInstall<br />
<br />
{{info|Tout est mis dans <syntaxhighlight lang="bash" inline>.vim</syntaxhighlight>. Le paquet <syntaxhighlight lang="bash" inline>git</syntaxhighlight> est nécessaire.}}<br />
<br />
Un exemple de ''.vimrc''<br />
<syntaxhighlight lang="vim"><br />
se nu<br />
se termguicolors<br />
set pastetoggle=<F2><br />
<br />
"L'indentation passe à 3 caractères<br />
set tabstop=3<br />
set shiftwidth=3<br />
set softtabstop=3<br />
<br />
"Activer les greffons<br />
call plug#begin()<br />
Plug 'junegunn/vim-easy-align'<br />
Plug 'vim-airline/vim-airline'<br />
Plug 'vim-airline/vim-airline-themes'<br />
Plug 'hzchirs/vim-material'<br />
call plug#end()<br />
<br />
"Appliquer le thème vim-matérial<br />
colorscheme vim-material<br />
let g:airline_theme='material'<br />
</syntaxhighlight><br />
<br />
====Sources de la section====<br />
* https://github.com/junegunn/vim-plug<br />
* http://vimcolors.com/<br />
<br />
=Couleurs 24bits=<br />
Pour avoir des couleurs plus sympas avec ''Vim'' (remplace le ''syn on''), il faut utiliser ''se termguicolors''. Attention, il faut que le terminal utilisé soit compatible. [https://gist.github.com/XVilka/8346728 Cette page Github] peut aider à déterminer si c'est le cas.<br />
<br />
=Sources=<br />
* http://cfennajoui.net/vim/traduit/html/usr_30.txt.php<br />
* http://www.blogduwebdesign.com/developpement-vim/vim-astuce-pour-le-copier-coller/605<br />
* http://qsdqsd.free.fr/Vim/Vim_-_Un_pas_en_avant.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Base_de_registre_-_windows&diff=1496Base de registre - windows2024-01-16T19:49:23Z<p>Ycharbi : Ajout de la section "Activer la visionneuse Windows"</p>
<hr />
<div>[[Category:windows]]<br />
<br />
La [https://www.malekal.com/registre-windows/ base de registre Windows] ou registre ''Windows'' est une base de données structurées où sont stockées un grand nombre d’informations sous la forme de clé et de valeur.<br />
Elles sont utilisées par le système d'exploitation et ses composants ainsi que les programmes installés par l’utilisateur pour sauvegarder des données utiles à leurs fonctionnements.<br />
<br />
=Heure UTC=<br />
''Windows'' étant un système d'exploitation produit par une PME peu au fait de ce qui se fait en informatique, celui-ci ne gère pas son horloge en ''UTC''... Ceci a pour effet de faire perde 2h à l'horloge à chaque démarrage après un ''Linux''. Comble de malchance, il n'effectue qu'une seule requête ''NTP'' par jour (et non ce n'est pas au démarrage)... Ce qui ne permet pas au système de se caler correctement si on ne le laisse pas allumé 24h... Et il reperdra 2h au prochain démarrage succédant à un ''Linux'' de toute façon...<br />
<br />
Ce comportement n'est pas configurable dans les paramètres mais est modifiable au niveau de la base de registre en y ajoutant [https://{{SERVERNAME}}/fichiers/windows/base_registre/RealTimeIsUniversal.reg la clé suivante] et en redémarrant.<br />
<br />
<syntaxhighlight lang="reg"><br />
Windows Registry Editor Version 5.00<br />
<br />
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]<br />
"RealTimeIsUniversal"=hex(b):01,00,00,00,00,00,00,00<br />
</syntaxhighlight><br />
<br />
==Source de la section==<br />
* https://superuser.com/questions/975717/does-windows-10-support-utc-as-bios-time#975764<br />
<br />
=Activer la visionneuse Windows=<br />
Pour une raison inconnue, la visionneuse d'images intégrée à ''Windows'' n'est plus présente depuis la version 10 du [https://www.gnu.org/proprietary/malware-microsoft.html maliciel] de ''Microsoft'', ces derniers estimant que ''Paint'' remplit plus efficacement ce rôle... Cette estimation n'étant pas du goût des gens "normaux" (normaux étant à pondérer au vu du système d'exploitation qu'ils utilisent...), nous allons la réactiver (car oui elle est toujours livrée de base...).<br />
<br />
Télécharger l'archive [https://{{SERVERNAME}}/fichiers/windows/base_registre/Activer_Visionneuse_de_photos_Windows_sur_Windows_11_et_10-616e74209fd5d.zip suivante] et exécuter le fichier de registre <code>Activer_Visionneuse_de_photos_Windows.reg</code>.<br />
<br />
La visionneuse d'image est de nouveau opérationnelle.<br />
<br />
==Source de la section==<br />
* https://lecrabeinfo.net/restaurer-la-visionneuse-de-photos-windows-sur-windows-11-et-10.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Firefox&diff=1495Firefox2024-01-14T16:50:27Z<p>Ycharbi : Ajout de la section "Désactiver le rafraîchissement automatique" + remplacement des balises de coloration syntaxique</p>
<hr />
<div>[[Category:navigateurs web]]<br />
<br />
=Activer la gestion du tactile=<br />
Comme beaucoup de fonctions dans Firefox, la gestion des écrans tactile n'est pas activée par défaut dans nombre d’environnements (c'est le cas de Debian). Pour l'activer, il faut définir une variable d'environnement et activer l'option dans la section dédiée de Firefox.<br />
<br />
==Définir la variable d'environnement==<br />
echo 'MOZ_USE_XINPUT2=1' >> /etc/environment<br />
<br />
La modification prend effet au redémarrage. Il est possible de lancer Firefox avec la définition de cette variable manuellement via le terminal en attendant: <code>MOZ_USE_XINPUT2=1 firefox</code>.<br />
<br />
==Activation de l'option dans Firefox==<br />
<br />
Il faut se rendre dans <code>about:config</code> et mettre le paramètre '''dom.w3c_touch_events.enabled''' à '''1'''. La modification est active instantanément. Vous pouvez profiter du défilement, de la sélection et du zoom au doigt.<br />
<br />
==Source de la section==<br />
* https://support.mozilla.org/es/questions/1091627<br />
<br />
=Utiliser Wayland=<br />
Il est possible d'utiliser ''Firefox'' avec [[Wayland]] en définissant la [https://www.reddit.com/r/firefox/comments/c8itj2/enabling_wayland_on_linux/ variable d'environnement] <code>MOZ_ENABLE_WAYLAND=1</code> dans <code>/etc/environment</code>. Un redémarrage du programme est nécessaire et il faut s'assurer que la variable est bien définie lors de son lancement (le plus simple est de redémarrer le système).<br />
<br />
=Désactiver le détachement d'un onglet=<br />
Une fonctionne ultra casse couilles avec Firefox c'est bien le [https://www.askvg.com/firefox-tip-disable-tabs-drag-n-drop-feature-to-move-to-new-window/ glisser/déposer d'un onglet] qui en fait une nouvelle fenêtre. Juste insupportable. Pour désactiver cette merde, il faut passer la valeur <code>browser.tabs.allowTabDetach</code> à '''false'''.<br />
<br />
=Restaurer la fenêtre de téléchargement=<br />
Avec Firefox 98 (et comme avec chaque nouvelle version), une fonctionnalité indispensable a été supprimée : la possibilité d'ouvrir un fichier sans l'enregistrer quelque part sur le disque (il va simplement dans le <code>/tmp</code>). Pour restaurer ce comportement, il faut passer la valeur <code>browser.download.improvements_to_download_panel</code> à <code>false</code> dans le <code>about:config</code>.<br />
<br />
=Forcer l'usage du presse papier=<br />
Certains sites ''WEB'' se croient malins en interdisant l'utilisation du copier/coller dans les formulaires (réinitialisation de mots de passe par exemple). Cette pratique, en plus d'être une atteinte à notre liberté d'utiliser nos outils informatiques comme nous l'entendons, nous empêche de gérer nos [[Génération de mots de passe|mots de passe]] à notre guise (la meilleur clé est celle que vous ne connaissez pas et donc que vous ne pouvez pas taper dans un champ de formulaire...). Comme souvent, sous couvert de sécurité, le résultat est l'exact opposé. Aux développeurs ''WEB'' : laissez-nous gérer nos outils informatiques comme nous l'entendons, nous sommes bien plus à même de savoir ce qui est bon pour nous que vous !<br />
<br />
Pour dire à ''Firefox'' de ne pas respecter le ''Javascript'' qui lui dit d'adopter un comportement aussi débile, il faut passer la [https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/ valeur] <code>about:config</code>dom.event.clipboardevents.enabled</code> à '''false'''.<br />
<br />
Vous pouvez alors de nouveau de vous prendre pour un [https://fr.wikipedia.org/wiki/Pasteur_(christianisme) pasteur] en usant de ''copy/paste'' !<br />
<br />
{{attention|La désactivation de cette fonction empêche le [https://github.com/element-hq/element-web/issues/25695 collage de textes] dans le champ de discutions de [[Matrix_synapse#Client_WEB_Element|element-web]] (un <code>ctrl+v</code> n'a donc plus aucun effet).}}<br />
<br />
=Désactiver le rafraîchissement automatique=<br />
Certains sites non respectueux de leurs utilisateurs (les sites de presse en tête), utilisent du ''Javascript'' pour rafraîchir automatiquement les pages de leur site (probablement pour générer du revenu avec la publicité).<br />
Cette pratique, outre le fait de consommer de la bande passante et du ''CPU'' (donc de l'électricité), engendre un comportement non désiré et inattendu de l'utilisateur (seul maître légitime de son ordinateur).<br />
<br />
Pour faire cesser ça, il faut initier la clé <code>accessibility.blockautorefresh</code> à ''true'' dans <code>about:config</code>.</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Infiniband_-_linux&diff=1494Infiniband - linux2024-01-14T16:15:16Z<p>Ycharbi : /* Partie PC-1 */ Ajout de détails concernant le module noyau "ib_ipoib" + don de méthodes pour afficher des informations sur la carte IB</p>
<hr />
<div>[[Category:réseaux linux]]<br />
<br />
[https://fr.wikipedia.org/wiki/Bus_InfiniBand Infiniband] est un bus haut débit permettant le transfert de données entre machines. Il agit au niveau 1 et 2 du modèle OSI et permet une communication à faible latence via le protocole Infiniband ou via l'une des 3 surcouches supportés:<br />
* IP sur InfiniBand (IPoIB): présente une couche IP au-dessus de l'Infiniband<br />
* Sockets Direct Protocol (SDP): présente une couche socket au-dessus de l'Infiniband avec transferts zéro-copie par RDMA<br />
* SCSI RDMA Protocol (SRP): encapsulation de SCSI dans de l'Infiniband<br />
<br />
Pour chacune de ces surcouches, il faudra que la couche Infiniband (1 et 2) soit montée correctement pour qu'elle fonctionne. Infiniband est un protocole prévu pour fonctionner avec des commutateurs spécifiques agissant comme des gestionnaires de sous-réseau. Toute connexion entre machine doit en avoir au moins un (si plusieurs, une relation maitre/esclave se définit entre eux). En cas de connexion directe de PC à PC sans commutateur, il faudra utiliser un gestionnaire de sous-réseau virtuel (''opensm'' dans notre cas).<br />
<br />
{{Info|Cette documentation a été testé sous Debian Buster via deux cartes Infiniband Mellanox ConnectX. Une 1 port et l'autre 2 ports. Leur référence exacte est introuvable (même avec <source lang="bash" inline>lspci</source> - les deux cartes affichent les mêmes informations alors qu'elles sont différentes) mais je crois que c'est des ConnectX première génération.}}<br />
<br />
<br />
=Visualisation=<br />
Il est possible de visualiser l'état des connexions Infiniband via les commandes contenus dans le paquet <source lang="bash" inline>opensm</source>.<br />
<br />
ibstat<br />
ibstatus<br />
ibhosts et ibnodes<br />
ibnetdiscover<br />
<br />
Il est possible de réaliser un PING entre deux machines via les commandes suivantes:<br />
<br />
'''Sur un PC'''<br />
ibping -S<br />
<br />
'''Sur l'autre'''<br />
ibping 2<br />
<br />
''Le numéro correspond à celui de l'interface en partant de 1.''<br />
<br />
=IP sur Infiniband=<br />
l'IPoIB (Internet Protocol over Infiniband) est une surcouche permettant l’utilisation des protocoles IPv4 et IPv6 sur un lien Infiniband.<br />
<br />
Cette section va être divisé en deux partie étant donnée que le gestionnaire de sous-réseau n'a besoin d'être installé que sur une des deux machines. Nous les nommerons PC-1 et PC-2 (PC-1 étant le gestionnaire de sous-réseau).<br />
<br />
==Partie PC-1==<br />
'''Activation des modules noyau'''<br />
modprobe ib_ipoib<br />
modprobe ib_umad<br />
<br />
{{info|le module <code>ib_ipoib</code> peut être chargé pour utiliser le mode <br />
[https://docs.nvidia.com/networking/display/mlnxofedv551032/ip+over+infiniband+(ipoib) IPoIB amélioré] via le paramètre <code>ipoib_enhanced{{=}}1</code>. On chargera alors le module comme suit : <code>modprobe ib_ipoib ipoib_enhanced{{=}}1</code>}}<br />
<br />
Les interfaces Infiniband sont désormais visibles via un <code>ip link</code>. Il est à noter que le module <code>ib_umad</code> n'est utile que sur le gestionnaire de sous-réseau (''OpenSM'').<br />
<br />
Des détails sur les interfaces sont visibles via la commande <code>ibstat</code> des pilotes [https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ Mellanox OFED] disponible via l'archive de leur site ou via le paquet ''Debian'' <code>mstflint</code>. Cette commande met simplement en [https://wiki.archlinux.org/title/InfiniBand#Software_subnet_manager forme] les informations contenues dans <code>/sys/class/infiniband/''<pilote>''/ports/''<num_iface>''/</code>.<br />
<br />
'''Instalaltion d'OpenSM'''<br />
apt install opensm<br />
<br />
''Par défaut, le service ne se lance ni automatiquement, ni au démarrage.''<br />
<br />
'''Définir une adresse IP sur l'interface'''<br />
ip a a 192.168.151.1/24 dev ibp4s0d1<br />
<br />
'''L'allumée administrativement'''<br />
ip l set ibp4s0d1 up<br />
<br />
'''Démarrer le gestionnaire de sous-réseau'''<br />
systemctl start opensm<br />
<br />
''L'interface montera lorsque PC-2 sera prêt.''<br />
<br />
<br />
'''Amélioration des performances'''<br />
<br />
Il est possible d'augmenter significativement les performances en mettant l'interface en mode "connecté" en lieu et place de "datagram". Ceci a pour effet de débrider la MTU maximale attribuable à cette dernière (passant de 2044 à 65520). Personnellement, je passe de 1,29 Go/s à 2,39 Go/s sur [[Iperf]] avec ce mode. Je n'ai trouvé aucun aspect négatif à ce changement (c'est à ce demander pourquoi il n'est pas activé par défaut... d'autant plus que le protocole se démerde pour fonctionner si ce n'est mis que d'un côté).<br />
echo connected > /sys/class/net/ibp4s0d1/mode<br />
<br />
Pour repasser en mode ''datagram'':<br />
echo datagram > /sys/class/net/ibp4s0d1/mode<br />
<br />
''La MTU se change d'elle même.''<br />
<br />
===Automatisation===<br />
Il est possible de faire en sorte que ces étapes soient automatiques au démarrage de la machine en activant le service (''enable''), ajoutant les module à l'image de mémoire initiale (''initrd'') et en configurant l'adresse IP dans le fichier idoine (''/etc/network/interfaces'').<br />
<br />
'''Activer le service au démarrage'''<br />
systemctl enable opensm<br />
<br />
'''Ajouter les modules à l'image de mémoire initiale'''<br />
echo -e "ip_ipoib\nib_umad" >> /etc/modules<br />
update-initramfs -u<br />
et mettre à jour votre chargeur d'amorçage ([[Grub|GRUB]] dans l'exemple suivant):<br />
update-grub<br />
<br />
'''Figer la configuration réseau'''<br />
echo -e "\nauto ibp4s0d1\niface ibp4s0d1 inet static\n\taddress 192.168.151.1/24" >> /etc/network/interfaces<br />
<br />
==Partie PC-2==<br />
Cette partie est similaire à la première, les étapes nécessaires au gestionnaire de sous-réseau en moins.<br />
<br />
modprob ip_ipoib<br />
ip a a 192.168.151.1/24 dev ibp1s0<br />
ip l set ibp1s0 up<br />
echo connected > /sys/class/net/ibp4s0d1/mode<br />
<br />
Les machines sont opérationnelles.<br />
<br />
==Sources de la section==<br />
* https://serverfault.com/questions/678532/connect-two-infiniband-cards-to-each-other-without-a-switch<br />
* https://www.servethehome.com/configure-ipoib-mellanox-hcas-ubuntu-12041-lts/<br />
Voir aussi:<br />
* https://www.kernel.org/doc/html/latest/infiniband/ipoib.html<br />
<br />
=Sources=<br />
* http://serveur.ipgirl.com/rseau-infiniband-entre-3-serveurs-ferm.html<br />
* https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_the_subnet_manager<br />
* https://helios.himmelbauer-it.at/blogs/general/infiniband-mellanox-40gbit-link-on-debian-7/<br />
* https://www.slideshare.net/FarkhandaKiran/infini-band-and-ethernet</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Infiniband_-_linux&diff=1493Infiniband - linux2024-01-14T11:40:04Z<p>Ycharbi : /* Partie PC-1 */ correction de fautes de frappe sur l'activation des modules noyaux + changement de la balise code "ip link"</p>
<hr />
<div>[[Category:réseaux linux]]<br />
<br />
[https://fr.wikipedia.org/wiki/Bus_InfiniBand Infiniband] est un bus haut débit permettant le transfert de données entre machines. Il agit au niveau 1 et 2 du modèle OSI et permet une communication à faible latence via le protocole Infiniband ou via l'une des 3 surcouches supportés:<br />
* IP sur InfiniBand (IPoIB): présente une couche IP au-dessus de l'Infiniband<br />
* Sockets Direct Protocol (SDP): présente une couche socket au-dessus de l'Infiniband avec transferts zéro-copie par RDMA<br />
* SCSI RDMA Protocol (SRP): encapsulation de SCSI dans de l'Infiniband<br />
<br />
Pour chacune de ces surcouches, il faudra que la couche Infiniband (1 et 2) soit montée correctement pour qu'elle fonctionne. Infiniband est un protocole prévu pour fonctionner avec des commutateurs spécifiques agissant comme des gestionnaires de sous-réseau. Toute connexion entre machine doit en avoir au moins un (si plusieurs, une relation maitre/esclave se définit entre eux). En cas de connexion directe de PC à PC sans commutateur, il faudra utiliser un gestionnaire de sous-réseau virtuel (''opensm'' dans notre cas).<br />
<br />
{{Info|Cette documentation a été testé sous Debian Buster via deux cartes Infiniband Mellanox ConnectX. Une 1 port et l'autre 2 ports. Leur référence exacte est introuvable (même avec <source lang="bash" inline>lspci</source> - les deux cartes affichent les mêmes informations alors qu'elles sont différentes) mais je crois que c'est des ConnectX première génération.}}<br />
<br />
<br />
=Visualisation=<br />
Il est possible de visualiser l'état des connexions Infiniband via les commandes contenus dans le paquet <source lang="bash" inline>opensm</source>.<br />
<br />
ibstat<br />
ibstatus<br />
ibhosts et ibnodes<br />
ibnetdiscover<br />
<br />
Il est possible de réaliser un PING entre deux machines via les commandes suivantes:<br />
<br />
'''Sur un PC'''<br />
ibping -S<br />
<br />
'''Sur l'autre'''<br />
ibping 2<br />
<br />
''Le numéro correspond à celui de l'interface en partant de 1.''<br />
<br />
=IP sur Infiniband=<br />
l'IPoIB (Internet Protocol over Infiniband) est une surcouche permettant l’utilisation des protocoles IPv4 et IPv6 sur un lien Infiniband.<br />
<br />
Cette section va être divisé en deux partie étant donnée que le gestionnaire de sous-réseau n'a besoin d'être installé que sur une des deux machines. Nous les nommerons PC-1 et PC-2 (PC-1 étant le gestionnaire de sous-réseau).<br />
<br />
==Partie PC-1==<br />
'''Activation des modules noyau'''<br />
modprobe ib_ipoib<br />
modprobe ib_umad<br />
<br />
''Les interfaces Infiniband sont désormais visibles via un <code>ip link</code>. Il est à noter que le module "ib_umad" n'est utile que sur le gestionnaire de sous-réseau.''<br />
<br />
'''Instalaltion d'OpenSM'''<br />
apt install opensm<br />
<br />
''Par défaut, le service ne se lance ni automatiquement, ni au démarrage.''<br />
<br />
'''Définir une adresse IP sur l'interface'''<br />
ip a a 192.168.151.1/24 dev ibp4s0d1<br />
<br />
'''L'allumée administrativement'''<br />
ip l set ibp4s0d1 up<br />
<br />
'''Démarrer le gestionnaire de sous-réseau'''<br />
systemctl start opensm<br />
<br />
''L'interface montera lorsque PC-2 sera prêt.''<br />
<br />
<br />
'''Amélioration des performances'''<br />
<br />
Il est possible d'augmenter significativement les performances en mettant l'interface en mode "connecté" en lieu et place de "datagram". Ceci a pour effet de débrider la MTU maximale attribuable à cette dernière (passant de 2044 à 65520). Personnellement, je passe de 1,29 Go/s à 2,39 Go/s sur [[Iperf]] avec ce mode. Je n'ai trouvé aucun aspect négatif à ce changement (c'est à ce demander pourquoi il n'est pas activé par défaut... d'autant plus que le protocole se démerde pour fonctionner si ce n'est mis que d'un côté).<br />
echo connected > /sys/class/net/ibp4s0d1/mode<br />
<br />
Pour repasser en mode ''datagram'':<br />
echo datagram > /sys/class/net/ibp4s0d1/mode<br />
<br />
''La MTU se change d'elle même.''<br />
<br />
===Automatisation===<br />
Il est possible de faire en sorte que ces étapes soient automatiques au démarrage de la machine en activant le service (''enable''), ajoutant les module à l'image de mémoire initiale (''initrd'') et en configurant l'adresse IP dans le fichier idoine (''/etc/network/interfaces'').<br />
<br />
'''Activer le service au démarrage'''<br />
systemctl enable opensm<br />
<br />
'''Ajouter les modules à l'image de mémoire initiale'''<br />
echo -e "ip_ipoib\nib_umad" >> /etc/modules<br />
update-initramfs -u<br />
et mettre à jour votre chargeur d'amorçage ([[Grub|GRUB]] dans l'exemple suivant):<br />
update-grub<br />
<br />
'''Figer la configuration réseau'''<br />
echo -e "\nauto ibp4s0d1\niface ibp4s0d1 inet static\n\taddress 192.168.151.1/24" >> /etc/network/interfaces<br />
<br />
==Partie PC-2==<br />
Cette partie est similaire à la première, les étapes nécessaires au gestionnaire de sous-réseau en moins.<br />
<br />
modprob ip_ipoib<br />
ip a a 192.168.151.1/24 dev ibp1s0<br />
ip l set ibp1s0 up<br />
echo connected > /sys/class/net/ibp4s0d1/mode<br />
<br />
Les machines sont opérationnelles.<br />
<br />
==Sources de la section==<br />
* https://serverfault.com/questions/678532/connect-two-infiniband-cards-to-each-other-without-a-switch<br />
* https://www.servethehome.com/configure-ipoib-mellanox-hcas-ubuntu-12041-lts/<br />
Voir aussi:<br />
* https://www.kernel.org/doc/html/latest/infiniband/ipoib.html<br />
<br />
=Sources=<br />
* http://serveur.ipgirl.com/rseau-infiniband-entre-3-serveurs-ferm.html<br />
* https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_the_subnet_manager<br />
* https://helios.himmelbauer-it.at/blogs/general/infiniband-mellanox-40gbit-link-on-debian-7/<br />
* https://www.slideshare.net/FarkhandaKiran/infini-band-and-ethernet</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Firefox&diff=1492Firefox2023-12-19T19:25:16Z<p>Ycharbi : /* Forcer l'usage du presse papier */ Ajout d'une bannière attention concernant le dysfonctionnement du collage dans element-web</p>
<hr />
<div>[[Category:navigateurs web]]<br />
<br />
=Activer la gestion du tactile=<br />
Comme beaucoup de fonctions dans Firefox, la gestion des écrans tactile n'est pas activée par défaut dans nombre d’environnements (c'est le cas de Debian). Pour l'activer, il faut définir une variable d'environnement et activer l'option dans la section dédiée de Firefox.<br />
<br />
==Définir la variable d'environnement==<br />
echo 'MOZ_USE_XINPUT2=1' >> /etc/environment<br />
<br />
La modification prend effet au redémarrage. Il est possible de lancer Firefox avec la définition de cette variable manuellement via le terminal en attendant: <syntaxhighlight lang="bash" inline>MOZ_USE_XINPUT2=1 firefox</syntaxhighlight>.<br />
<br />
==Activation de l'option dans Firefox==<br />
<br />
Il faut se rendre dans <syntaxhighlight lang="bash" inline>about:config</syntaxhighlight> et mettre le paramètre '''dom.w3c_touch_events.enabled''' à '''1'''. La modification est active instantanément. Vous pouvez profiter du défilement, de la sélection et du zoom au doigt.<br />
<br />
==Source de la section==<br />
* https://support.mozilla.org/es/questions/1091627<br />
<br />
=Utiliser Wayland=<br />
Il est possible d'utiliser ''Firefox'' avec [[Wayland]] en définissant la [https://www.reddit.com/r/firefox/comments/c8itj2/enabling_wayland_on_linux/ variable d'environnement] <syntaxhighlight lang="ini" inline>MOZ_ENABLE_WAYLAND=1</syntaxhighlight> dans <syntaxhighlight lang="bash" inline>/etc/environment</syntaxhighlight>. Un redémarrage du programme est nécessaire et il faut s'assurer que la variable est bien définie lors de son lancement (le plus simple est de redémarrer le système).<br />
<br />
=Désactiver le détachement d'un onglet=<br />
Une fonctionne ultra casse couilles avec Firefox c'est bien le [https://www.askvg.com/firefox-tip-disable-tabs-drag-n-drop-feature-to-move-to-new-window/ glisser/déposer d'un onglet] qui en fait une nouvelle fenêtre. Juste insupportable. Pour désactiver cette merde, il faut passer la valeur <syntaxhighlight lang="bash" inline>browser.tabs.allowTabDetach</syntaxhighlight> à '''false'''.<br />
<br />
=Restaurer la fenêtre de téléchargement=<br />
Avec Firefox 98 (et comme avec chaque nouvelle version), une fonctionnalité indispensable a été supprimée : la possibilité d'ouvrir un fichier sans l'enregistrer quelque part sur le disque (il va simplement dans le <syntaxhighlight lang="bash" inline>/tmp</syntaxhighlight>). Pour restaurer ce comportement, il faut passer la valeur <syntaxhighlight lang="bash" inline>browser.download.improvements_to_download_panel</syntaxhighlight> à <syntaxhighlight lang="bash" inline>false</syntaxhighlight> dans le <syntaxhighlight lang="bash" inline>about:config</syntaxhighlight>.<br />
<br />
=Forcer l'usage du presse papier=<br />
Certains sites ''WEB'' se croient malins en interdisant l'utilisation du copier/coller dans les formulaires (réinitialisation de mots de passe par exemple). Cette pratique, en plus d'être une atteinte à notre liberté d'utiliser nos outils informatiques comme nous l'entendons, nous empêche de gérer nos [[Génération de mots de passe|mots de passe]] à notre guise (la meilleur clé est celle que vous ne connaissez pas et donc que vous ne pouvez pas taper dans un champ de formulaire...). Comme souvent, sous couvert de sécurité, le résultat est l'exact opposé. Aux développeurs ''WEB'' : laissez-nous gérer nos outils informatiques comme nous l'entendons, nous sommes bien plus à même de savoir ce qui est bon pour nous que vous !<br />
<br />
Pour dire à ''Firefox'' de ne pas respecter le ''Javascript'' qui lui dit d'adopter un comportement aussi débile, il faut passer la [https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/ valeur] <syntaxhighlight lang="bash" inline>about:config</syntaxhighlight> <syntaxhighlight lang="bash" inline>dom.event.clipboardevents.enabled</syntaxhighlight> à '''false'''.<br />
<br />
Vous pouvez alors de nouveau de vous prendre pour un [https://fr.wikipedia.org/wiki/Pasteur_(christianisme) pasteur] en usant de ''copy/paste'' !<br />
<br />
{{attention|La désactivation de cette fonction empêche le [https://github.com/element-hq/element-web/issues/25695 collage de textes] dans le champ de discutions de [[Matrix_synapse#Client_WEB_Element|element-web]] (un <code>ctrl+v</code> n'a donc plus aucun effet).}}</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Installation_automatique_d%27un_paquet_Debian&diff=1491Installation automatique d'un paquet Debian2023-11-18T19:09:11Z<p>Ycharbi : /* Usage pratique */ Ajout d'une bannière d'information listant les valeurs possibles de DEBIAN_FRONTEND</p>
<hr />
<div>[[Category:apt]]<br />
Lors de l'installation de paquets avec [[:Category:apt|APT]], certain d'entre eux posent des questions via une interface ''ncurses'', ce qui gène leur installation via des scripts (et ceux, même avec l'option '''-y'''). Pour y remédier, il faut soit désactiver complètement cette interaction ''ncurses'' afin d'utiliser les valeurs par défaut ou soit configurer ''debconf'' afin de préciser nous même les paramètres à appliquer par défaut pour un paquet.<br />
<br />
=Désactivation de l’interaction=<br />
Il faut définir la variable ''DEBIAN_FRONTEND'' comme suit<br />
export DEBIAN_FRONTEND=noninteractive<br />
<br />
et la réactiver quand on en a plus besoin<br />
unset DEBIAN_FRONTEND<br />
<br />
==Usage pratique==<br />
export DEBIAN_FRONTEND=noninteractive<br />
apt -y install foopackage<br />
apt -y install barpackage<br />
unset DEBIAN_FRONTEND<br />
<br />
{{info|La variable [https://fr.linux-console.net/?p{{=}}17177 DEBIAN_FRONTEND] supporte les valeurs <code>noninteractive</code> : ne pose aucune questions et utilise les valeurs par défaut ; <code>dialogue</code> : pose les questions via une interface ''ncurses'' (valeur par défaut) ; <code>texte</code> : pose les questions via une interface teste simple ; <code>gtk</code> : pose les questions via une interface graphique ''GTK'' (nécessite les paquets cdebconf-gtk et gkdebconf).}}<br />
<br />
=Configuration de debconf=<br />
Pour cette partie, il va falloir passer des arguments au programme debconf (qui définit les variables à passer à DPKG lors des installations). Afin de connaître les valeurs possibles, il faut installer le paquet debconf-utils (inutile si vous connaissez les valeurs à l'avance)<br />
apt install debconf-utils<br />
<br />
La commande ''debconf-get-selection'' permet de lister l'ensemble des variables possibles. On peut l'utiliser avec un pipe pour filtrer ce qui nous intéresse. Personnellement, je l'utilise avec ''less'' et sa fonction de recherche '''/''' afin de trouver ce qui m'intéresse.<br />
debconf-get-selection | less<br />
<br />
Pour définir une valeur personnalisé, on l'utilise comme suit (exemple avec Wireshark)<br />
echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections<br />
<br />
Il suffit ensuite d'installer le paquet (ici ''wireshark'') et constater que le paquet ne pose plus la question qui faisait chier<br />
apt install -y wireshark<br />
<br />
=Source=<br />
* http://languor.us/disable-pop-ups-unattended-non-interactive-apt-get-install-ubuntu-debian</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Openssh&diff=1490Openssh2023-11-11T15:09:59Z<p>Ycharbi : Ajout de la section "SSH inversé"</p>
<hr />
<div>[[Category:service_ssh]]<br />
[[Category:shell]]<br />
<br />
=Authentification par clef SSH=<br />
Au lieu de s'authentifier par mot de passe, les utilisateurs peuvent s'authentifier grâce à la cryptographie asymétrique et son couple de clefs privée/publique, comme le fait le serveur ''SSH'' auprès du client ''SSH''.<br />
<br />
==Générer ses clefs==<br />
Pour générer un couple de clefs, tapez sur le client :<br />
ssh-keygen -t ed25519<br />
<br />
ou avec plus de paramètres :<br />
<br />
ssh-keygen -a 100 -t ed25519 -f ~/.ssh/id_ed25519<br />
<br />
Paramètres :<br />
* -a : nombre d'itérations de la [https://fr.wikipedia.org/wiki/Fonction_de_d%C3%A9rivation_de_cl%C3%A9 fonction de dérivation de clé]. Permet de rendre la clé plus résistante aux attaques par force brut. La valeur par défaut est définie à 16<br />
* -t : type de clé. La taille d'une clé ''ed25519'' est fixée dans le code d{{'}}''OpenSSH''. Le paramètre <syntaxhighlight lang="bash" inline>-b</syntaxhighlight> permet de la spécifier pour les autres formats<br />
* -f : fichier de destination<br />
<br />
<br />
Ensuite, il faut envoyer le fichier '''~/.ssh/id_ed25519.pub''' du client sur le serveur, tapez sur le client :<br />
scp /home/user/.ssh/id_ed25519.pub UTILISATEUR@SERVEUR:/home/user/.ssh/authorized_keys<br />
<br />
ou<br />
<br />
ssh-copy-id -i ~/.ssh/id_ed25519.pub UTILISATEUR@SERVEUR<br />
<br />
''Note: le même paramètre <syntaxhighlight lang="bash" inline>-i</syntaxhighlight> peut être utilisé avec la commande <syntaxhighlight lang="bash" inline>ssh</syntaxhighlight> afin de spécifier la clé à utiliser si plusieurs sont présentes.''<br />
<br />
{{astuce|Pour [https://www.phcomp.co.uk/Tutorials/Unix-And-Linux/ssh-check-server-fingerprint.html vérifier l'empreinte] d'une clef, il faut utiliser la [https://linux.die.net/man/1/ssh-keygen commande] <syntaxhighlight lang="bash" inline>ssh-keygen -lf /chemin/de/la/clef</syntaxhighlight>. Le hachis résultant est à comparer avec celui de la clef qui est présenté lors de la première connexion à un serveur (les deux doivent bien sûr être identiques).}}<br />
<br />
==Restreindre l'usage d'une clef==<br />
Il est possible de limiter le périmètre d'usage d'une clef ''SSH'' via quelques paramètres dans le fichier ''authorized_keys'' du client. Il est ainsi possible de permettre la connexion d'un client avec une clef spécifique seulement depuis une liste d'''IP'' tout en forçant une commande précise. Par exemple:<br />
vim ~/.ssh/authorized_keys<br />
<br />
<syntaxhighlight lang="bash"><br />
from="192.168.1.4,192.168.1.10",command="ls -al --color /" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKWbjAEe0X+NFr0WjEgdJ2vKAIYwYSW6WkJvP2Zg/M4q root@toto<br />
</syntaxhighlight><br />
<br />
Le client n'effectuera alors automatiquement la commande définie par le paramètre ''command'' avant que la connexion ne se ferme d'elle même. De plus, la clef ne sera utilisable que depuis les adresses ''IP'' listés.<br />
<br />
===Sources de la section===<br />
* https://stackoverflow.com/questions/402615/how-to-restrict-ssh-users-to-a-predefined-set-of-commands-after-login<br />
* https://www.linuxjournal.com/article/8257<br />
* http://man.openbsd.org/OpenBSD-current/man5/sshd_config.5#ForceCommand<br />
<br />
<br />
==Déactiver l'authentification par mot de passe==<br />
Si nous voulons déactiver l'accès par mot de passe, il faut ajouter la ligne suivante au fichier '''/etc/ssh/sshd_config''':<br />
<span style="color:#808080">[...]</span><br />
PasswordAuthentication no<br />
<br />
Vous pouvez vous référer à la section traitant du fichier de configuration d{{'}}''OpenSSH'' [[#Fichier sshd_config|plus bas]].<br />
<br />
=Déactiver known hosts de SSH=<br />
==Problème==<br />
<br />
Lors d'une exécution d'un script contenant du ''SSH'', et lorsque vous avez changé une de vos machines sur la quelle vous vous connectez, ssh demande une intervention humaine:<br />
<br />
The authenticity of host '192.168.1.2 (192.168.1.2)' can't be established.<br />
ECDSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.<br />
Are you sure you want to continue connecting (yes/no)?<br />
<br />
Lorsque vous avez change l'ordinateur en gardant la même ''IP'' :<br />
<br />
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<br />
@ WARNING: POSSIBLE DNS SPOOFING DETECTED! @<br />
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<br />
The RSA host key for foo-bar.net has changed,<br />
and the key for the corresponding IP address 127.0.0.1<br />
is unchanged. This could either mean that<br />
DNS SPOOFING is happening or the IP address for the host<br />
and its host key have changed at the same time.<br />
Offending key for IP in /home/user/.ssh/known_hosts:6<br />
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<br />
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @<br />
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<br />
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!<br />
<br />
Le problème avec cette intervention est que le script n'avance pas sans vous.<br />
Pour ma part, j'ai un script qui se lance lors d'une coupure électrique, sans mon intervention mon script qui permet l'extinction de mes machines virtuelles ne ce termine pas... c'est pas cool.<br />
<br />
==Résolution==<br />
<br />
Voici une solution que j'ai trouvé: il faut passer des paramètres a notre commande ''SSH'':<br />
<br />
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@192.168.1.2<br />
<br />
{{attention|Ceci désactive la vérification de la somme de contrôle des clés ''SSH''. Ne faîtes ceci que si vous savez ce que vous faîtes car cela rend votre connexion plus sensible à des attaques [https://fr.wikipedia.org/wiki/Attaque_de_l'homme_du_milieu man in the middle].}}<br />
<br />
=Séquences d'échappement=<br />
Parfois lors de la perte d'une session ''SSH'' (problème de connexion ou bug coté serveur) le SHELL ne renvoi pas de ''broken pipe'', ce qui fait que l'on se retrouve avec un terminal bloqué (hyper casse couille) et la seule façon de s'en sortir est d'user de la commande <syntaxhighlight lang="bash" inline>kill</syntaxhighlight>. La seule ? Pas tout à fait.<br />
<br />
Il existe un truc qui déchire et qu'on ne trouve nul par (c'est toujours les meilleurs choses les mieux gardées) : les séquences d'échappement.<br />
<br />
Ces séquences permettent d'interagir avec le SHELL se trouvant en dessous de la session ''SSH'' via le client ''OpenSSH'' lui même. Ainsi, on peu demander à ce cher client de tuer lui même la session au lieu de devoir le faire à sa place quand rien ne va plus (sympa non ?).<br />
<br />
==Liste==<br />
Voici la liste exhaustive de ces merveilles (à précéder par la touche <syntaxhighlight lang="bash" inline><Entrer></syntaxhighlight>):<br />
* '''~.''' : Termine la connexion (et toute les sessions multiplexées)<br />
* '''~B''' : Envoi un ''BREAK'' au système distant<br />
* '''~C''' : Ouvre un prompt ''ssh'' (la commande <syntaxhighlight lang="bash" inline>?</syntaxhighlight> permet de lister ce que l'on peut y faire)<br />
* '''~R''' : Renégocie la clé de session (SSH version 2 uniquement)<br />
* '''~V/v''' : Augmente/diminue le degré de verbosity (LogLevel)<br />
* '''~^Z''' : Met ''SSH'' en pause<br />
* '''~#''' : Liste toute les connexions redirigées<br />
* '''~&''' : Quitte la session ''SSH'' sans la fermer. On ne peut pas revenir dessus, ça ne sert donc complètement à rien (je ne vois pas pourquoi quelqu'un à développer ça ?!)<br />
* '''~?''' : Écrit cette liste en anglais avec le vrai texte<br />
* '''~~''' : Dans le cas ou le tild (''~'') entre en conflit avec quelque chose, il est possible de le taper 2 fois avant une séquence d'échappement pour l'envoyer.<br />
<br />
{{info|Ceci ne fonctionne que lorsque le SHELL ne nous donne pas la main. Vous pouvez tester sur une page de <syntaxhighlight lang="bash" inline>man</syntaxhighlight> pour tester par exemple.}}<br />
<br />
==Sources de la section==<br />
* https://askubuntu.com/questions/29942/how-can-i-break-out-of-ssh-when-it-locks<br />
* https://lonesysadmin.net/2011/11/08/ssh-escape-sequences-aka-kill-dead-ssh-sessions/amp/<br />
<br />
=Absence de broken pipe après un redémarrage=<br />
Sur une Debian 8 (Jessie), le fait de redémarrer une machine alors que l'on est connecté en ''SSH'' sur celle-ci ne renvoi pas de broken pipe (la session n'est pas clôturée à l'extinction). Ceci est très énervant car on se retrouve avec un terminal bloqué sur un prompt inactif et l'arrivé du fameux broken pipe se fait, dans le meilleur des cas, attendre une bonne minute, dans le pire, pour toujours... Pour régler cette merde il suffit d'installer la librairie systemd qui gère se comportement et de redémarrer la machine.<br />
apt install libpam-systemd<br />
reboot<br />
<br />
=Tunnel SSH=<br />
Faire un tunnel ''SSH'' :<br />
ssh -L 5232:localhost:5232 root@192.168.180.32<br />
* -L : Rediriger un flux TCP ou un socket UNIX sur le client local<br />
* Format : ''<port local que l'on utilisera sur notre machine>''''':'''''<adresse de l'hôte distant>''''':'''''<port du service distant>''<br />
Ceci mérite une explication pour être clair. Parfois, on installe un programme ([http://radicale.org Radicale] pour mon exemple) qui écoute exclusivement sur son localhost (127.0.0.1) via le port 5232. Quand le serveur n'a pas d'interface graphique (ce qui est normalement le cas si on est pas Windobien), on a pas de navigateur internet. Il peut être utile d'accéder quand même à l'interface d'admin du service (en fait on en a absolument besoin). Il faut donc rediriger le trafic du localhost de l'hôte distant sur notre machine pour l'administration. On prend donc le trafic localhost:5232 du serveur et on le balance sur le localhost:5232 de notre PC local d'admin.<br />
<br />
=Relai SSH=<br />
Dans le cas d'une machine accessible seulement depuis une autre (cas d'un PC derrière un routeur ''NAT'' par exemple) embarquant un serveur ''SSH'', il est possible de l'utiliser comme ''Proxy SSH'' afin de joindre celle-ci. Ceci m'est utile pour administrer des machines virtuelles opérants dans un ''VLAN NATté'' par l'hyperviseur avec ma [[#Authentification_par_clef_SSH|clé SSH]]. Pour ce faire, depuis le client:<br />
ssh -J titi@relai toto@destination<br />
<br />
==Source de la section==<br />
* https://tuxicoman.jesuislibre.net/2017/02/connexion-ssh-a-travers-un-ordinateur-relai-avec-proxyjump.html<br />
<br />
=SSH inversé=<br />
Il est possible de se connecter au client ayant initié une session ''SSH'' via la création d'un socket spécifique. Cette technique se nomme le ''reverse SSH''. Cela peut-être utile dans le cas d'un dépannage ou pour transférer des fichiers à une machine ne disposant pas d'un accès publique à Internet (cas d'un ''NAT'' par exemple). Cette méthode permet alors la prise en main d'un client sans redirection de port au niveau de son accès ''WAN''.<br />
<br />
Depuis le client vers le dépanneur :<br />
ssh -NR 12345:localhost:22 utilisateur-dépanneur@ip-dépanneur<br />
<br />
Paramètres :<br />
* -N : n'exécute ni aucune commande ni aucun shell. Cela permet de n'utiliser la session ''SSH'' que pour ouvrir un socket distant et non pour administrer la destination. Dans notre cas, la session sert juste à créer le socket sur lequel nous allons nous connecter<br />
* -R : redirige le socket local vers le socket distant. C'est ce paramètre qui permettra au dépanneur de se connecter au client via un socket local créé pour l'occasion<br />
* 12345:localhost:22 : socket-sur-dépanneur:adresse-d'écoute-du-socket:socket-à-rediriger-vers-12345<br />
<br />
Depuis le dépanneur vers le client en passant par le socket redirigé :<br />
ssh -p 12345 utilisateur-client@localhost<br />
<br />
Il est aussi possible d'y transférer des fichiers :<br />
scp -P 12345 /chemin/fichier/dépanneur utilisateur-client@localhost:/destination/fichier/pour/le/client<br />
<br />
==Source de la section==<br />
* https://doc.ubuntu-fr.org/tutoriel/reverse_ssh#connexion_directe<br />
<br />
=Agent SSH=<br />
Le serveur ''OpenSSH'' embarque un agent capable d'enregistrer le mot de passe de vos clés ''SSH''. Vous pouvez donc initier des connexion sans avoir à renseigner cette information à chaque fois.<br />
<br />
Initialiser l'agent pour le [[Shell bash|shell]] courant<br />
eval "$(ssh-agent -s)"<br />
<br />
Enregistrer le mot de passe de votre clé<br />
ssh-add /root/.ssh/id_ed25519<br />
<br />
{{Info|Utilisée sans argument, la commande <syntaxhighlight lang="bash" inline>ssh-add</syntaxhighlight> va chercher les clés dans le répertoire personnel de votre utilisateur local courant.}}<br />
<br />
==Sources de la section==<br />
* https://rabexc.org/posts/using-ssh-agent<br />
* https://mytrashcode.com/open-connection-authentication-agent<br />
<br />
=Fichier sshd_config=<br />
Voici quelques paramètres qu'il peut être utile d'appliquer sur un serveur ''SSH'' (<syntaxhighlight lang="bash" inline>/etc/ssh/sshd_config</syntaxhighlight>):<br />
<br />
==Généralités==<br />
<syntaxhighlight lang="bash"><br />
PermitRootLogin no<br />
PasswordAuthentication no<br />
<br />
AllowUsers toto sauvegardes<br />
ClientAliveInterval 1800<br />
<br />
UseDNS no<br />
</syntaxhighlight><br />
<br />
Description des paramètres :<br />
* '''PermitRootLogin''' : ''{no|yes|prohibit-password}'': définit si l'utilisateur ''root'' peut se connecter. La directive '''prohibit-password''' permet de n'autoriser que l'utilisation de [[#Authentification par clef SSH|clés SSH]] avec ce dernier<br />
* '''PasswordAuthentication''' : ''{no|yes}'': définit si la connexion par mot de passe est autorisé pour tous les utilisateurs (''root'' à part) ou si seulement les clés SSH sont permises<br />
* '''AllowUsers''' : liste blanche des utilisateurs autorisés à ce connecter<br />
* '''ClientAliveInterval''' : si le paramètre est définit, ''OpenSSH'' compte le temps (en secondes) depuis le dernier paquet reçu du client et envoi une demande de réponse à celui-ci. Couplé au paramètre '''ClientAliveCountMax''' (valeur par défaut à ''3''), le serveur fermera automatiquement la session en cas de non réponse prolongée de ce dernier (nombre de fois compté depuis la dernière réponse). Ceci n'est utile que si la connexion entre les deux paires est interrompu (plus de réseau)<br />
* '''UseDNS''' : ''{no|yes}'' : définit si ''OpenSSH'' doit résoudre les noms de domaine. Ce paramètre, non content d'être inutile, ralenti CONSIDÉRABLEMENT l'établissement de la connexion dans le cas ou le serveur DNS est injoignable (fréquent dans des LAB de tests)<br />
<br />
==Chiffrement==<br />
N'utiliser que des [https://cipherli.st/ chiffrements sérieux] :<br />
<syntaxhighlight lang="bash"><br />
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256<br />
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr<br />
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com<br />
</syntaxhighlight><br />
<br />
Je vous conseil également d'utiliser que des clés ''RSA'' et ''ed25519'' en commentant les lignes <syntaxhighlight lang="bash" inline>HostKey /etc/ssh/ssh_host_dsa_key</syntaxhighlight> et <syntaxhighlight lang="bash" inline>HostKey /etc/ssh/ssh_host_ecdsa_key</syntaxhighlight>.<br />
<br />
Vérifiez également que la version de ''SSH'' utilisée est la 2 via le paramètre <syntaxhighlight lang="bash" inline>Protocol 2</syntaxhighlight>.<br />
<br />
N'oubliez pas de recharger le service :<br />
systemctl reload ssh<br />
<br />
=Fichier ssh_config=<br />
Le client ''SSH'' peut aussi être configuré par utilisateur du système. Il sera alors possible de définir des paramètres personnalisés en fonction de celui se connectant à une machine. Le fichier est ) créer dans le répertoire personnel de chaque utilisateur le nécessitant (<syntaxhighlight lang="bash" inline>~/.ssh/config</syntaxhighlight>).<br />
<br />
Pour utiliser une clé spécifique pour la connexion à une machine :<br />
<syntaxhighlight><br />
Host nomMachine<br />
Hostname fc00:0:0:1::2<br />
User root<br />
Port 22<br />
IdentityFile ~/.ssh/id_ed25519-sauv<br />
IdentitiesOnly yes<br />
IgnoreUnknown UseKeychain,AddKeysToAgent<br />
AddKeysToAgent yes<br />
</syntaxhighlight><br />
<br />
Description des paramètres :<br />
* '''Host nomMachine''' : Ouvre une section concernant un hôte en particulier. La valeur ''nomMachine'' vient créer un nom d'hôte utilisable par ''OpenSSH'' au même titre que si l'on avait rentré une ligne dans le fichier ''hosts''<br />
* '''Hostname''' : adresse de la machine distante<br />
* '''User''' : utilisateur de la machine distante<br />
* '''Port''' : port ''SSH'' de la machine distante<br />
* '''IdentityFile''' : clé ''SSH'' à utiliser (par défaut, seul les noms de clés par défaut sont recherchés)<br />
* '''IdentitiesOnly''' : n'utilise que la clé spécifiée dans le paramètre précédent. Si omis, le client ''SSH'' va tester une connexion distante avec toute les clés qu'il trouvera (occasionnant autant d'échec de connexion sur la machine distante)<br />
* '''IgnoreUnknown''' : permet d'ignorer les paramètres inexistants. Les deux valeurs sont des paramètres faisant la même chose mais sur deux systèmes différents. La première est pour MacOSX et la deuxième pour Linux. Cela permet de faire des copier/coller de configuration sans réfléchir<br />
* '''AddKeysToAgent''' : si la clé ''SSH'' utilisée contient une phrase de passe, elle ne sera demandée que la première fois et stockée dans l'agent ''SSH''<br />
<br />
==Sources de la section==<br />
* https://www.man7.org/linux/man-pages/man5/ssh_config.5.html<br />
* https://computingforgeeks.com/managing-ssh-connections-on-linux-unix-using-ssh-config-file/</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Busybox_init&diff=1489Busybox init2023-11-02T10:41:31Z<p>Ycharbi : Suppression d'un "cd ~" inutile + ajout de la commande permettant d'installer Qemu sans tout le bordel associé afin de réaliser les tests + ajout du code source de linux dans nos fichiers</p>
<hr />
<div>[[Category:distributions_linux]]<br />
<br />
[[Busybox]] intègre <code>init</code>, un programme pouvant être amorcé directement par un noyau ''Linux'' au démarrage d'une machine. Il est ainsi possible de concevoir un système d'exploitation léger composé uniquement d'un noyau et de ''Busybox''. L'adjonction d'outils supplémentaires sur cette base minimaliste pourra engendrer une distribution spécifiquement conçue pour un besoin particulier. Cette association s’avère donc particulièrement intéressante dans des systèmes embarqués tel que les ''appliances'' réseau comme [https://openwrt.org/ OpenWRT] ou [https://dd-wrt.com/ DD-WRT].<br />
<br />
Nous verrons comment construire un tel système en partant des sources de chaque programmes depuis une ''GNU/Linux Debian 12 Bookworm''. Les compilations se feront avec l'ensemble des paramètres par défaut. Je recommande d'utiliser une machine (virtuelle ''amd64'' dans mon cas) spécifiquement installée pour cet usage car un grand nombre de dépendances est nécessaire et il serait dommage de pourrir votre environnement de travail...<br />
<br />
L'espace de travail sera le répertoire personnel de l'utilisateur ''root''.<br />
<br />
=Linux=<br />
Installation des dépendances<br />
apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libelf-dev libssl-dev libncurses-dev dwarves<br />
<br />
Téléchargement des sources du dernier noyau stable (01/11/2023)<br />
<br />
<syntaxhighlight lang="bash"><br />
# Code source<br />
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz -P ~<br />
# Signature GPG<br />
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.sign -P ~<br />
</syntaxhighlight><br />
<br />
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/noyaux/linux/linux-6.6.tar.xz nos fichiers].<br />
<br />
Décompression de l'archive des sources<br />
unxz -k ~/linux-6.6.tar.xz<br />
<br />
Vérification de la signature GPG de l'archive<br />
apt install gnupg2<br />
gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org<br />
gpg2 --tofu-policy good 38DBBDC86092693E<br />
gpg2 --tofu-policy good 79BE3E4300411886<br />
gpg2 --trust-model tofu --verify ~/linux-6.6.tar.sign<br />
<br />
Note : la dernière commande doit vous renvoyer plusieurs lignes de résultat dont <code>gpg: Bonne signature de « Greg Kroah-Hartman <gregkh@kernel.org> » [totale]</code>.<br />
<br />
Désarchivage des sources<br />
tar xvf ~/linux-6.6.tar<br />
cd ~/linux-6.6/<br />
<br />
Création d'une configuration de confection saine avec les paramètres par défaut et compilation avec 4 cœurs de processeur<br />
<br />
<syntaxhighlight lang="bash"><br />
make defconfig<br />
make -j4<br />
# Retour dans le répertoire personnel<br />
cd ~<br />
</syntaxhighlight><br />
<br />
Le noyau compilé pour notre architecture x86 64bits se trouve à l'emplacement suivant : <code>~/linux-6.6/arch/x86/boot/bzImage</code>.<br />
<br />
=Busybox=<br />
Téléchargement des sources<br />
<br />
<syntaxhighlight lang="bash"><br />
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2<br />
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2.sha256<br />
</syntaxhighlight><br />
<br />
Vérification d'intégrité<br />
sha256sum -c ~/busybox-1.36.1.tar.bz2.sha256<br />
<br />
Note : la vérification d'intégrité doit renvoyer <code>Réussi</code>.<br />
<br />
Extraction de l'archive compressée<br />
tar xvf ~/busybox-1.36.1.tar.bz2<br />
cd ~/busybox-1.36.1/<br />
<br />
Configuration par défaut et compilation du code avec lien statique afin d'embarquer les dépendances dans le binaire final<br />
<br />
<syntaxhighlight lang="bash"><br />
make defconfig<br />
make -j4 LDFLAGS="--static"<br />
# Retour dans le répertoire personnel<br />
cd ~<br />
</syntaxhighlight><br />
<br />
''Busybox'' est désormais disponible ici : <code>~/busybox-1.36.1/busybox</code><br />
<br />
=Média d'amorce=<br />
Nous avons dés à présent en notre possession tous les programmes de notre future système d'exploitation. Vous pouvez préparer les vôtres en vue de les intégrer dans les sections qui suivent.<br />
<br />
Les méthodes d'amorçages peuvent varier selon les besoins et votre convenance. Je répertorie personnellement 3 cas d'usage :<br />
# mémoire morte avec système de fichier classique type ''EXT4''<br />
# [https://fr.wikipedia.org/wiki/Initrd initramfs]<br />
# ''PXE''<br />
<br />
Toute les démonstrations seront réalisées via [[Qemu]]. La mise en œuvre du réseau ne sera pas détaillée car j'utilise des scripts personnalisés avec mon système. La création d'une interface ''tap'' et son exploitation via la directive <code>-device virtio-net-pci,netdev=network0,mac=$tap_mac -netdev tap,id=network0,ifname=$int_tap,script=no,downscript=no</code> permet de lier la machine virtuel au réseau physique via l'adjonction d'un pont réseau.<br />
<br />
L'étape <code>1</code> fera office de tronc commun aux autres sections afin de ne pas alourdir le document avec une redondance inutile et difficilement maintenable. Seule celle-ci nécessite l'utilisation d'un périphérique de type bloc, les deux autres peuvent êtres réalisées directement dans <code>~/rootfs</code> si vous le désirez. La réalisation successive des trois étapes est toutefois possible. Il faudra simplement penser à remonter <code>~/rootfs</code> afin de ne pas travailler dans un répertoire vide...<br />
<br />
==1. Amorçage en mémoire morte==<br />
Cette façon de faire permet de modifier simplement le contenu de votre distribution après coup. Il suffit pour se faire de monter le système de fichier en écriture pour y actualiser son contenu à votre guise.<br />
<br />
Pour l'exemple, je créerai un fichier simulant un périphérique de type bloc du nom de <code>busybox.dd</code> au même titre qu'une mémoire morte. En condition réelle, remplacez celui-ci par votre périphérique physique : <code>/dev/sda</code>; <code>/dev/mmcblk</code>; <code>/dev/nvme0n1</code>...<br />
<br />
Création et formatage de la mémoire racine<br />
dd if=/dev/zero of=~/busybox.dd bs=1M count=1024<br />
mkfs.ext4 ~/busybox.dd<br />
<br />
Création et montage de l'environnement de travail<br />
mkdir -p ~/rootfs<br />
mount ~/busybox.dd ~/rootfs<br />
cd ~/busybox-1.36.1/<br />
<br />
Installation de l'arborescence du système ''Busybox'' dans notre système de fichiers avec [https://stackoverflow.com/questions/49369508/kernel-panic-not-syncing-requested-init-linuxrc-failed-error-2 lien statiques]<br />
make install CONFIG_PREFIX=../rootfs LDFLAGS="--static"<br />
cd ~<br />
<br />
Cette étape a créée les répertoires standards permettant d’accueillir les binaires usuels du système selon la [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] (''FHS''). L'exécutable <code>busybox</code> précédemment compilé a été copié dans le nouveau <code>/bin</code> et des liens symboliques ont étés créés pointant vers celui-ci avec le nom de tous les utilitaires qu'il contient.<br />
<br />
Création des points montages des pseudos systèmes de fichiers usuels, de la table de montages statiques et du répertoire accueillant notre futur script d'initialisation<br />
mkdir -p ~/rootfs/proc ~/rootfs/sys ~/rootfs/dev<br />
mkdir -p ~/rootfs/etc<br />
touch ~/rootfs/etc/fstab<br />
mkdir -p ~/rootfs/etc/init.d<br />
<br />
Script d'initialisation du système<br />
<br />
<syntaxhighlight lang="bash"><br />
bash -c "cat > ~/rootfs/etc/init.d/rcS" << _EOF_<br />
#!/bin/sh<br />
<br />
# Message d'accueil<br />
echo "Busybox ycharbi.fr"<br />
# Pseudos systèmes de fichiers usuels<br />
mount -t proc proc /proc<br />
mount -t sysfs sysfs /sys<br />
mount -t devtmpfs none /dev<br />
<br />
# Configuration réseau<br />
ip addr add 10.0.0.1/24 dev eth0<br />
ip link set dev eth0 up<br />
ip route add default via 10.0.0.254 dev eth0<br />
<br />
# Clavier en AZERTY<br />
loadkmap < /etc/fr.map<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Attribution du droit d'exécution au script d'initialisation<br />
chmod +x ~/rootfs/etc/init.d/rcS<br />
<br />
Configuration des Télétypes (''TTY'')<br />
<br />
<syntaxhighlight lang="bash"><br />
bash -c "cat > ~/rootfs/etc/inittab" << _EOF_<br />
::sysinit:/etc/init.d/rcS<br />
ttyS0::respawn:/bin/sh<br />
tty2::askfirst:-/bin/sh<br />
tty3::askfirst:-/bin/sh<br />
tty4::askfirst:-/bin/sh<br />
tty4::respawn:/sbin/getty 38400 tty5<br />
tty5::respawn:/sbin/getty 38400 tty6<br />
::ctrlaltdel:/sbin/reboot<br />
::shutdown:/sbin/swapoff -a<br />
::shutdown:/bin/umount -a -r<br />
::restart:/sbin/init<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Ce fichier définit les ''TTY'' qui doivent êtres invoqués au lancement de <code>init</code>. Vous devrez probablement adapter ceci à votre besoin. La documentation de ces lignes ainsi que de la configuration appliquée par défaut en cas d'absence du fichier est disponible dans <code>~/busybox-1.36.1/examples/inittab</code>.<br />
<br />
Création du binaire de traduction clavier afin d'utiliser l{{'}}''AZERTY''<br />
busybox dumpkmap > ~/rootfs/etc/fr.map<br />
<br />
À ce stade, notre mémoire morte est prête.<br />
<br />
Pour permettre son amorçage, un éventail de possibilités s'offre à vous : [[Grub]]; [[Systemd-boot]]; [[Efibootmgr#Création_d'une_entrée_de_type_STUB|UEFI stub]]; [[Ipxe]]; [[Installation_slax_-_UEFI_64bits#Préparation_de_l'environnement_hôte|Syslinux]]... Pour ma part et comme précisé en introduction, j'utiliserai [[Qemu#Démarrage_de_la_machine_virtuelle|Qemu]] afin de simplifier au maximum l'exposé.<br />
<br />
Démontage du système de fichier<br />
umount ~/rootfs<br />
<br />
Note : si vous comptez poursuivre les étapes des sections suivantes, pensez à remonter ce système de fichier ou à en copier le contenu dans un autre répertoire de travail afin de ne pas recommencer à zéro.<br />
<br />
Test du système avec ''Qemu'' (<code>apt install --no-install-recommends qemu-system-x86</code>)<br />
<br />
<syntaxhighlight lang="bash"><br />
qemu-system-x86_64 \<br />
--enable-kvm \<br />
-m 2048 \<br />
-device virtio-balloon \<br />
-kernel ~/linux-6.6/arch/x86/boot/bzImage \<br />
-append "ro root=/dev/sda console=ttyS0 quiet" \<br />
-cpu host -smp cores=2,threads=1,sockets=1 \<br />
-serial mon:stdio \<br />
-drive id=disk,file="${HOME}"/busybox.dd,format=raw,if=none \<br />
-device ahci,id=ahci \<br />
-device ide-hd,drive=disk,bus=ahci.0 \<br />
-display none<br />
</syntaxhighlight><br />
<br />
Pour un affichage sans port console, il faut supprimer le paramètre <code>console=ttyS0</code> de la directive <code>-append</code>; supprimer la directive <code>-display none</code> et remplacer la ligne <code>ttyS0::respawn:/bin/sh</code> par <code>tty1::respawn:/bin/sh</code> dans le <code>inittab</code>.<br />
<br />
==2. Amorçage en initramfs==<br />
L'utilisation d'un système de fichiers initial en mémoire à accès aléatoire apporte encore plus de légèreté à la solution. Un unique fichier compressé vient s'ajouter au noyau en cours d'exécution pour servir la racine construite précédemment. Le système est exécuté intégralement en mémoire vive et peut donc se voir distribué via des protocoles réseaux tel que ''TFTP'' ou ''HTTP''.<br />
<br />
Construction de l'archive compressée ''Initramfs''<br />
cd ~/rootfs && find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz && cd ~<br />
<br />
Test du système avec ''Qemu''<br />
<br />
<syntaxhighlight lang="bash"><br />
qemu-system-x86_64 \<br />
--enable-kvm \<br />
-m 2048 \<br />
-device virtio-balloon \<br />
-kernel ~/linux-6.6/arch/x86/boot/bzImage \<br />
-append "ro rootfstype=ramfs rdinit=/sbin/init console=ttyS0 quiet" \<br />
-initrd ~/initramfs.cpio.gz \<br />
-cpu host -smp cores=2,threads=1,sockets=1 \<br />
-serial mon:stdio \<br />
-display none<br />
</syntaxhighlight><br />
<br />
Les différences de lancement sont :<br />
* modification des paramètres noyau ([https://www.man7.org/linux/man-pages/man7/kernel-command-line.7.html cmdline]) de la directive <code>-append</code><br />
* ajout de la directive <code>-initrd</code><br />
* les directives concernant le disque ''SATA'' ont étés supprimées<br />
<br />
<br />
==3. Amorçage initramfs via PXE==<br />
Cette méthode d'amorçage ne varie pas beaucoup de la précédente puisque elle réutilise les mêmes éléments à savoir le noyau et l{{'}}''Initramfs''. Le delta sera sur la syntaxe du chargeur d'amorçage réseau utilisé ainsi que quelques paramètres passés au noyau. Voici la section fonctionnelle pour [[Ipxe]] :<br />
<br />
<syntaxhighlight lang="bash"><br />
#!ipxe<br />
<br />
set menu-timeout 10000<br />
set submenu-timeout ${menu-timeout}<br />
isset ${menu-defaut} || set menu-defaut Debian_Buster<br />
set serveur_ip 10.0.0.100<br />
<br />
menu<br />
item --gap -- -------------DEMARRAGE EN RAM----------------<br />
item busybox Lancer Busybox<br />
<br />
choose --timeout ${menu-timeout} --default ${menu-default} target && goto ${target}<br />
<br />
:busybox<br />
kernel http://${serveur_ip}/systemes/noyaux/busybox/bzImage ro initrd=initramfs.cpio.gz rootfstype=ramfs rdinit=/sbin/init console=ttyS0<br />
initrd http://${serveur_ip}/systemes/noyaux/busybox/initramfs.cpio.gz<br />
boot<br />
# https://ipxe.org/cmd/kernel<br />
</syntaxhighlight><br />
<br />
=Sources=<br />
* https://dev.to/donaldsebleung/hello-embedded-world-booting-a-minimal-linux-with-busybox-on-risc-v-from-source-2ne9<br />
* https://cs4118.github.io/dev-guides/debian-kernel-compilation.html<br />
* ''POSIX Base Specifications Issue 7'' :<br />
** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html<br />
** Paramètres du shell Sh : https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Busybox&diff=1488Busybox2023-11-02T10:24:11Z<p>Ycharbi : Mise à jour de la version de busybox utilisée + ajout de son code source dans nos fichiers + ajout d'un lien vers la page busybox init remplacement de toutes les balises <syntaxhighlight> non nécessaires par <code> afin d'optimiser le chargement de la page</p>
<hr />
<div>[[Category:linux]]<br />
[https://fr.wikipedia.org/wiki/BusyBox Busybox] est un exécutable regroupant une multitude d'utilitaires généralement disponibles via [https://fr.wikipedia.org/wiki/GNU_Core_Utilities GNU Core Utilities]. Il a l'avantage de ne prendre que très peu de place et peut être utilisé pour faire des [[Busybox_init|systèmes embarqués très simples]].<br />
<br />
=Installation=<br />
==Via le gestionnaire de paquet==<br />
apt install busybox<br />
<br />
==Via les sources==<br />
Le paquet <code lang="bash" inline>build-essential</code> est nécessaire pour utiliser la commande <code lang="bash" inline>make</code>.<br />
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2<br />
tar xf busybox-1.36.1.tar.bz2<br />
cd busybox-1.36.1/<br />
make defconfig<br />
make<br />
<br />
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/applications/busybox/busybox-1.36.1.tar.bz2 nos fichiers].<br />
<br />
{{astuce|Il est possible d'embarquer les dépendances nécessaires au fonctionnement de l'ensemble directement dans le binaire via la commande de compilation <syntaxhighlight lang="bash" inline>make LDFLAGS="--static"</syntaxhighlight> (ce dernier sera par conséquent plus lourd). Ceci est utile lorsque ''Busybox'' est intégré à un système dépourvu des bibliothèques en question.}}<br />
<br />
Un exécutable ''busybox'' a été créé dans le répertoire courant.<br />
<br />
La commande <code lang="bash" inline>make defconfig</code> permet de créer le fichier de configuration pour <code lang="bash" inline>make</code> (''.config''). Les commandes de pré-configurations possibles sont :<br />
* '''make defconfig''' : Créé la configuration la plus saine possible. Ça active la plupart des fonctionnalités sans quelques outils de débogage ainsi que les outils nécessitants des modifications du système comme les noms de périphériques ''selinux'' ou ''devfs''. Utiliser cette option si vous voulez démarrer depuis un ''Busybox'' complet pour, par la suite, écrémer les fonctionnalités pour en avoir un plus petit.<br />
* '''make allnoconfig''' : Désactive tout. Cela crée une petite version de ''Busybox'' qui ne fait rien. Commencez ici si vous savez exactement ce que vous voulez et que vous souhaitez sélectionner uniquement ces fonctionnalités.<br />
* '''make menuconfig''' : Modifie interactivement le fichier ''.config'' via une interface de menu à plusieurs niveaux. Utilisez-le après l'un des deux précédents.<br />
Les autres options sont :<br />
* '''make oldconfig''' : Mettre à jour un vieux fichier ''.config'' pour une nouvelle version de ''Busybox''.<br />
* '''make allyesconfig''' : Sélectionnez absolument tout. Cela crée une version statiquement liée de ''Busybox'' remplie de code de débogage, avec des dépendances sur ''selinux'', en utilisant des noms de ''devfs''... Cela s'assure que tout est compilé. Que le résultat fasse quelque chose d'utile ou non est une question ouverte.<br />
* '''make randconfig''' : Créer une configuration aléatoire à des fins de tests.<br />
<br />
=Socket réseau en utilisateur standard=<br />
Par défaut, un système ''Linux'' n'autorise la création et la gestion d'un socket réseau que par l'utilisateur ''root''. Il peut être pratique de permettre certains exécutables à le faire via un utilisateur standard (c'est chiant d'avoir à taper le mot de passe ''root'' tout le temps). Pour ce faire, nous utiliserons les [[Linux capabilities]].<br />
<br />
'''Autorisation de redirection réseau'''<br />
setcap CAP_NET_BIND_SERVICE=+eip /bin/busybox<br />
<br />
{{Astuce|On peut voir cette autorisation avec la commande <code lang="bash" inline>getcap /bin/busybox</code>.}}<br />
<br />
Les utilisateurs standards peuvent désormais utiliser le serveur ''HTTP'' ou autres intégré à ''Busybox''.<br />
<br />
==Source de la section==<br />
* https://superuser.com/questions/710253/allow-non-root-process-to-bind-to-port-80-and-443/892391<br />
<br />
=Usage=<br />
Nous allons partir du principe que l'emplacement de notre binaire ''busybox'' se trouve dans notre variable d'environnement <code lang="bash" inline>$PATH</code>.<br />
<br />
'''Lister les programmes disponibles dans notre Busybox'''<br />
busybox<br />
<br />
'''Afficher le manuel des outils contenus dans Busybox'''<br />
man busybox<br />
<br />
''Avec un <code lang="bash" inline>/</code> suivi du nom de la commande + <code lang="bash" inline>entrer</code> + <code lang="bash" inline>n</code> on tombe directement sur le manuel de l'outil désiré.''<br />
<br />
==Serveur WEB==<br />
'''Utiliser le serveur WEB intégré'''<br />
busybox httpd -f -v -h /tmp/foo/<br />
<br />
''Le serveur httpd ne liste pas les fichiers, il faut entrer une URL complète comme pour le TFTP. Cependant, il redirige automatiquement sur un index.html si présent.''<br />
<br />
Paramètres :<br />
* '''-f''' : Ne rend pas la main. Ça permet de fermer le serveur web avec un <code lang="bash" inline>ctrl+c</code> au lieu de ce faire chier avec les commandes <code lang="bash" inline>ps</code> et <code lang="bash" inline>kill</code><br />
* '''-v''' : affiche les IP des clients se connectant et le message renvoyé par le serveur<br />
* '''-h''' : Spécifie le répertoire de travail du serveur. Si ce paramètre n'est pas renseigné, le répertoire courant est utilisé<br />
<br />
==Serveur DHCP==<br />
'''Créer le fichiers du processus'''<br />
touch /tmp/udhcpd.pid<br />
<br />
'''Créer le fichier contenant les baux DHCP'''<br />
touch /tmp/udhcpd.leases<br />
<br />
'''Créer un fichier de configuration'''<br />
<syntaxhighlight lang="python"><br />
cat > /tmp/udhcpd.conf << _EOF_<br />
# Plage d'adresse attribuable<br />
start 192.168.0.1 # Par défaut: 192.168.0.20<br />
end 192.168.0.253 # Par défaut: 192.168.0.254<br />
<br />
# Interface réseau d'écoute<br />
interface eth1 # Par défaut: eth0<br />
<br />
# Nombre maximum de baux <br />
max_leases 253 # Par défaut: 254<br />
<br />
# Stocker le temps restant pour chaque bail dans le fichier des baux<br />
# C'est utile sur les systèmes embarqués ne pouvant garder l'heure après un redémarrage<br />
# Si cette valeur est définie à "no", l'heure de fin de bail sera stocker dans le fichier<br />
# des baux au lieu du temps restant avant expiration<br />
<br />
#remaining yes # Par défaut: yes<br />
<br />
# Localisation du fichier des baux<br />
lease_file /tmp/udhcpd.leases<br />
<br />
# Localisation du fichier processus<br />
pidfile /tmp/udhcpd.pid # Par défaut: /var/run/udhcpd.pid<br />
<br />
# Les options suivantes sont pour le PXE<br />
#siaddr 192.168.0.22 # Par défaut: 0.0.0.0<br />
#sname zorak # Par défaut: (none)<br />
#boot_file /var/nfs_root # Par défaut: (none)<br />
<br />
# Options DHCP<br />
# Elles peuvent être spécifiées via le mot clé "option" ou "opt" qui est un alias.<br />
# La seule options définie par défaut est "lease" pour définir la durée des baux<br />
opt dns 192.168.170.171 80.67.169.12<br />
option subnet 255.255.255.0<br />
opt router 192.168.0.254<br />
#opt wins 192.168.10.10 # Ajoute un serveur WINS<br />
#option dns 129.219.13.81 # Ajoute un autre DNS aux 2 autres ci-dessus<br />
option domain local<br />
option lease 864000 # 10 jours en secondes<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Vous pouvez adapter les adresses et nom d'interface avec les commande suivante en remplaçant ''toto'' par la donnée appropriée:<br />
sed -i 's/192\.168\.0\./192\.168\.toto./g' /tmp/udhcpd.conf<br />
sed -i 's/eth1/toto/g' /tmp/udhcpd.conf<br />
<br />
Paramètres possibles :<br />
{| class="wikitable"<br />
|-<br />
! Paramètre !! Effet !! Valeur par défaut<br />
|-<br />
| Paramètre 1 || Il fait ça || yes<br />
|}<br />
<br />
Liste exhaustive des options supportés. Voir le fichier source ''options.c'' :<br />
{| class="wikitable"<br />
|-<br />
! Option !! Effet<br />
|-<br />
| toto || titi<br />
|}<br />
<br />
'''Exécuter le serveur DHCP'''<br />
busybox udhcpd -fv /tmp/udhcpd.conf<br />
<br />
Paramètres :<br />
* '''-f''' : Ne rend pas la main. Ça permet de fermer le serveur DHCP avec un <code lang="bash" inline>ctrl+c</code> au lieu de ce faire chier avec les commandes <code lang="bash" inline>ps</code> et <code lang="bash" inline>kill</code><br />
* '''-v''' : affiche les requêtes ''ACK'' et ''OFFER'' entre le serveur et les clients (on voit l'IP attribué de ce fait)<br />
<br />
'''Sources de la section'''<br />
* Page officielle de udhcpd: https://udhcp.busybox.net/<br />
* Fichier de configuration exemple: https://udhcp.busybox.net/udhcpd.conf<br />
<br />
==NTP==<br />
===Serveur NTP===<br />
Définir l'horloge système depuis une source réseau<br />
busybox ntpd -d -n -I eth0 -l -p 0.debian.pool.ntp.org<br />
<br />
Paramètres :<br />
* '''-d''' : mode verbeux<br />
* '''-n''' : ne pas démoniser (ne pas exécuter en arrière plan)<br />
* '''-I''' : écouter sur l'interface spécifiée pour les requêtes clientes<br />
* '''-l''' : ouvre le socket ''UDP'' sur le port 123 pour les requêtes clientes<br />
* '''-p''' : serveur de référence sur lequel se synchronise notre serveur<br />
<br />
==TFTP==<br />
===Client TFTP===<br />
Télécharger un fichier via ''TFTP''<br />
busybox tftp -r toto.txt 192.168.100.2 -g<br />
<br />
Téléverser un fichier via ''TFTP''<br />
busybox tftp -l toto.txt 192.168.100.2 -p<br />
<br />
===Serveur TFTP===<br />
Le serveur ''TFTP'' est rarement embarqué dans le ''Busybox'' des distributions ''Linux''. Dans ce cas, il faudra le compilé soit même (testé avec la version 1.36.1).<br />
<br />
''Busybox tftpd'' a besoin de s'appuyer sur un programme (lui même présent dans ''Busybox'') d'ouverture de socket réseau : <code lang="bash" inline>udpsvd</code>.<br />
<br />
/tmp/busybox-1.36.1/busybox udpsvd -vE 0.0.0.0 69 /tmp/busybox-1.36.1/busybox tftpd -c /tmp/tftp/<br />
<br />
Paramètres :<br />
* '''-r''' : lecture seule<br />
* '''-c''' : téléversements autorisés<br />
* '''-u''' : rendre l'utilisateur passé en paramètre propriétaire des fichiers téléversés<br />
* '''-l''' : journaliser dans ''Syslog'' en plus du ''Stdout'' (non fonctionnel d'après mes tests)<br />
<br />
==Netcat==<br />
Les commandes [[netcat]] sont identique à la version ''APT'' (avec quelques options en moins).<br />
busybox nc -l -p 2323<br />
<br />
busybox nc ipserver 2323<br />
<br />
'''Envoyer un [https://tutorials.technology/tutorials/How-to-transfer-files-over-the-network-using-Netcat.html fichier]'''<br />
<br />
Sur le serveur :<br />
busybox nc -l -p 9999 > /tmp/titi.dat<br />
<br />
Sur le client :<br />
busybox nc 192.168.0.1 9999 < /tmp/titi/titi.dat<br />
<br />
==Terminal série==<br />
On peut remplacer l'usage de [[Minicom]] par ''Busybox'' avec l'outil embarqué ''Microcom''.<br />
busybox microcom -s 9600 /dev/ttyUSB0<br />
<br />
Pour quitter ''Microcom'', faites la séquence d'échappement <code lang="bash" inline>ctrl+x</code>.<br />
<br />
=Sources=<br />
* https://busybox.net/FAQ.html#configure<br />
* https://busybox.net/downloads/BusyBox.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Busybox_init&diff=1487Busybox init2023-11-01T19:25:44Z<p>Ycharbi : /* Linux */ Suppression de la dépendance inutile "git"</p>
<hr />
<div>[[Category:distributions_linux]]<br />
<br />
[[Busybox]] intègre <code>init</code>, un programme pouvant être amorcé directement par un noyau ''Linux'' au démarrage d'une machine. Il est ainsi possible de concevoir un système d'exploitation léger composé uniquement d'un noyau et de ''Busybox''. L'adjonction d'outils supplémentaires sur cette base minimaliste pourra engendrer une distribution spécifiquement conçue pour un besoin particulier. Cette association s’avère donc particulièrement intéressante dans des systèmes embarqués tel que les ''appliances'' réseau comme [https://openwrt.org/ OpenWRT] ou [https://dd-wrt.com/ DD-WRT].<br />
<br />
Nous verrons comment construire un tel système en partant des sources de chaque programmes depuis une ''GNU/Linux Debian 12 Bookworm''. Les compilations se feront avec l'ensemble des paramètres par défaut. Je recommande d'utiliser une machine (virtuelle ''amd64'' dans mon cas) spécifiquement installée pour cet usage car un grand nombre de dépendances est nécessaire et il serait dommage de pourrir votre environnement de travail...<br />
<br />
L'espace de travail sera le répertoire personnel de l'utilisateur ''root''.<br />
<br />
=Linux=<br />
Installation des dépendances<br />
apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libelf-dev libssl-dev libncurses-dev dwarves<br />
<br />
Téléchargement des sources du dernier noyau stable (01/11/2023)<br />
<br />
<syntaxhighlight lang="bash"><br />
# Code source<br />
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz -P ~<br />
# Signature GPG<br />
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.sign -P ~<br />
</syntaxhighlight><br />
<br />
Décompression de l'archive des sources<br />
unxz -k ~/linux-6.6.tar.xz<br />
<br />
Vérification de la signature GPG de l'archive<br />
apt install gnupg2<br />
gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org<br />
gpg2 --tofu-policy good 38DBBDC86092693E<br />
gpg2 --tofu-policy good 79BE3E4300411886<br />
gpg2 --trust-model tofu --verify ~/linux-6.6.tar.sign<br />
<br />
Note : la dernière commande doit vous renvoyer plusieurs lignes de résultat dont <code>gpg: Bonne signature de « Greg Kroah-Hartman <gregkh@kernel.org> » [totale]</code>.<br />
<br />
Désarchivage des sources<br />
tar xvf ~/linux-6.6.tar<br />
cd ~/linux-6.6/<br />
<br />
Création d'une configuration de confection saine avec les paramètres par défaut et compilation avec 4 cœurs de processeur<br />
<br />
<syntaxhighlight lang="bash"><br />
make defconfig<br />
make -j4<br />
# Retour dans le répertoire personnel<br />
cd ~<br />
</syntaxhighlight><br />
<br />
Le noyau compilé pour notre architecture x86 64bits se trouve à l'emplacement suivant : <code>~/linux-6.6/arch/x86/boot/bzImage</code>.<br />
<br />
=Busybox=<br />
Téléchargement des sources<br />
<br />
<syntaxhighlight lang="bash"><br />
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2<br />
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2.sha256<br />
</syntaxhighlight><br />
<br />
Vérification d'intégrité<br />
sha256sum -c ~/busybox-1.36.1.tar.bz2.sha256<br />
<br />
Note : la vérification d'intégrité doit renvoyer <code>Réussi</code>.<br />
<br />
Extraction de l'archive compressée<br />
tar xvf ~/busybox-1.36.1.tar.bz2<br />
cd ~/busybox-1.36.1/<br />
<br />
Configuration par défaut et compilation du code avec lien statique afin d'embarquer les dépendances dans le binaire final<br />
<br />
<syntaxhighlight lang="bash"><br />
make defconfig<br />
make -j4 LDFLAGS="--static"<br />
# Retour dans le répertoire personnel<br />
cd ~<br />
</syntaxhighlight><br />
<br />
''Busybox'' est désormais disponible ici : <code>~/busybox-1.36.1/busybox</code><br />
<br />
=Média d'amorce=<br />
Nous avons dés à présent en notre possession tous les programmes de notre future système d'exploitation. Vous pouvez préparer les vôtres en vue de les intégrer dans les sections qui suivent.<br />
<br />
Les méthodes d'amorçages peuvent varier selon les besoins et votre convenance. Je répertorie personnellement 3 cas d'usage :<br />
# mémoire morte avec système de fichier classique type ''EXT4''<br />
# [https://fr.wikipedia.org/wiki/Initrd initramfs]<br />
# ''PXE''<br />
<br />
Toute les démonstrations seront réalisées via [[Qemu]]. La mise en œuvre du réseau ne sera pas détaillée car j'utilise des scripts personnalisés avec mon système. La création d'une interface ''tap'' et son exploitation via la directive <code>-device virtio-net-pci,netdev=network0,mac=$tap_mac -netdev tap,id=network0,ifname=$int_tap,script=no,downscript=no</code> permet de lier la machine virtuel au réseau physique via l'adjonction d'un pont réseau.<br />
<br />
L'étape <code>1</code> fera office de tronc commun aux autres sections afin de ne pas alourdir le document avec une redondance inutile et difficilement maintenable. Seule celle-ci nécessite l'utilisation d'un périphérique de type bloc, les deux autres peuvent êtres réalisées directement dans <code>~/rootfs</code> si vous le désirez. La réalisation successive des trois étapes est toutefois possible. Il faudra simplement penser à remonter <code>~/rootfs</code> afin de ne pas travailler dans un répertoire vide...<br />
<br />
==1. Amorçage en mémoire morte==<br />
Cette façon de faire permet de modifier simplement le contenu de votre distribution après coup. Il suffit pour se faire de monter le système de fichier en écriture pour y actualiser son contenu à votre guise.<br />
<br />
Pour l'exemple, je créerai un fichier simulant un périphérique de type bloc du nom de <code>busybox.dd</code> au même titre qu'une mémoire morte. En condition réelle, remplacez celui-ci par votre périphérique physique : <code>/dev/sda</code>; <code>/dev/mmcblk</code>; <code>/dev/nvme0n1</code>...<br />
<br />
Création et formatage de la mémoire racine<br />
cd ~<br />
dd if=/dev/zero of=~/busybox.dd bs=1M count=1024<br />
mkfs.ext4 ~/busybox.dd<br />
<br />
Création et montage de l'environnement de travail<br />
mkdir -p ~/rootfs<br />
mount ~/busybox.dd ~/rootfs<br />
cd ~/busybox-1.36.1/<br />
<br />
Installation de l'arborescence du système ''Busybox'' dans notre système de fichiers avec [https://stackoverflow.com/questions/49369508/kernel-panic-not-syncing-requested-init-linuxrc-failed-error-2 lien statiques]<br />
make install CONFIG_PREFIX=../rootfs LDFLAGS="--static"<br />
cd ~<br />
<br />
Cette étape a créée les répertoires standards permettant d’accueillir les binaires usuels du système selon la [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] (''FHS''). L'exécutable <code>busybox</code> précédemment compilé a été copié dans le nouveau <code>/bin</code> et des liens symboliques ont étés créés pointant vers celui-ci avec le nom de tous les utilitaires qu'il contient.<br />
<br />
Création des points montages des pseudos systèmes de fichiers usuels, de la table de montages statiques et du répertoire accueillant notre futur script d'initialisation<br />
mkdir -p ~/rootfs/proc ~/rootfs/sys ~/rootfs/dev<br />
mkdir -p ~/rootfs/etc<br />
touch ~/rootfs/etc/fstab<br />
mkdir -p ~/rootfs/etc/init.d<br />
<br />
Script d'initialisation du système<br />
<br />
<syntaxhighlight lang="bash"><br />
bash -c "cat > ~/rootfs/etc/init.d/rcS" << _EOF_<br />
#!/bin/sh<br />
<br />
# Message d'accueil<br />
echo "Busybox ycharbi.fr"<br />
# Pseudos systèmes de fichiers usuels<br />
mount -t proc proc /proc<br />
mount -t sysfs sysfs /sys<br />
mount -t devtmpfs none /dev<br />
<br />
# Configuration réseau<br />
ip addr add 10.0.0.1/24 dev eth0<br />
ip link set dev eth0 up<br />
ip route add default via 10.0.0.254 dev eth0<br />
<br />
# Clavier en AZERTY<br />
loadkmap < /etc/fr.map<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Attribution du droit d'exécution au script d'initialisation<br />
chmod +x ~/rootfs/etc/init.d/rcS<br />
<br />
Configuration des Télétypes (''TTY'')<br />
<br />
<syntaxhighlight lang="bash"><br />
bash -c "cat > ~/rootfs/etc/inittab" << _EOF_<br />
::sysinit:/etc/init.d/rcS<br />
ttyS0::respawn:/bin/sh<br />
tty2::askfirst:-/bin/sh<br />
tty3::askfirst:-/bin/sh<br />
tty4::askfirst:-/bin/sh<br />
tty4::respawn:/sbin/getty 38400 tty5<br />
tty5::respawn:/sbin/getty 38400 tty6<br />
::ctrlaltdel:/sbin/reboot<br />
::shutdown:/sbin/swapoff -a<br />
::shutdown:/bin/umount -a -r<br />
::restart:/sbin/init<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Ce fichier définit les ''TTY'' qui doivent êtres invoqués au lancement de <code>init</code>. Vous devrez probablement adapter ceci à votre besoin. La documentation de ces lignes ainsi que de la configuration appliquée par défaut en cas d'absence du fichier est disponible dans <code>~/busybox-1.36.1/examples/inittab</code>.<br />
<br />
Création du binaire de traduction clavier afin d'utiliser l{{'}}''AZERTY''<br />
busybox dumpkmap > ~/rootfs/etc/fr.map<br />
<br />
À ce stade, notre mémoire morte est prête.<br />
<br />
Pour permettre son amorçage, un éventail de possibilités s'offre à vous : [[Grub]]; [[Systemd-boot]]; [[Efibootmgr#Création_d'une_entrée_de_type_STUB|UEFI stub]]; [[Ipxe]]; [[Installation_slax_-_UEFI_64bits#Préparation_de_l'environnement_hôte|Syslinux]]... Pour ma part et comme précisé en introduction, j'utiliserai [[Qemu#Démarrage_de_la_machine_virtuelle|Qemu]] afin de simplifier au maximum l'exposé.<br />
<br />
Démontage du système de fichier<br />
umount ~/rootfs<br />
<br />
Note : si vous comptez poursuivre les étapes des sections suivantes, pensez à remonter ce système de fichier ou à en copier le contenu dans un autre répertoire de travail afin de ne pas recommencer à zéro.<br />
<br />
Test du système avec ''Qemu''<br />
<br />
<syntaxhighlight lang="bash"><br />
qemu-system-x86_64 \<br />
--enable-kvm \<br />
-m 2048 \<br />
-device virtio-balloon \<br />
-kernel ~/linux-6.6/arch/x86/boot/bzImage \<br />
-append "ro root=/dev/sda console=ttyS0 quiet" \<br />
-cpu host -smp cores=2,threads=1,sockets=1 \<br />
-serial mon:stdio \<br />
-drive id=disk,file="${HOME}"/busybox.dd,format=raw,if=none \<br />
-device ahci,id=ahci \<br />
-device ide-hd,drive=disk,bus=ahci.0 \<br />
-display none<br />
</syntaxhighlight><br />
<br />
Pour un affichage sans port console, il faut supprimer le paramètre <code>console=ttyS0</code> de la directive <code>-append</code>; supprimer la directive <code>-display none</code> et remplacer la ligne <code>ttyS0::respawn:/bin/sh</code> par <code>tty1::respawn:/bin/sh</code> dans le <code>inittab</code>.<br />
<br />
==2. Amorçage en initramfs==<br />
L'utilisation d'un système de fichiers initial en mémoire à accès aléatoire apporte encore plus de légèreté à la solution. Un unique fichier compressé vient s'ajouter au noyau en cours d'exécution pour servir la racine construite précédemment. Le système est exécuté intégralement en mémoire vive et peut donc se voir distribué via des protocoles réseaux tel que ''TFTP'' ou ''HTTP''.<br />
<br />
Construction de l'archive compressée ''Initramfs''<br />
cd ~/rootfs && find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz && cd ~<br />
<br />
Test du système avec ''Qemu''<br />
<br />
<syntaxhighlight lang="bash"><br />
qemu-system-x86_64 \<br />
--enable-kvm \<br />
-m 2048 \<br />
-device virtio-balloon \<br />
-kernel ~/linux-6.6/arch/x86/boot/bzImage \<br />
-append "ro rootfstype=ramfs rdinit=/sbin/init console=ttyS0 quiet" \<br />
-initrd ~/initramfs.cpio.gz \<br />
-cpu host -smp cores=2,threads=1,sockets=1 \<br />
-serial mon:stdio \<br />
-display none<br />
</syntaxhighlight><br />
<br />
Les différences de lancement sont :<br />
* modification des paramètres noyau ([https://www.man7.org/linux/man-pages/man7/kernel-command-line.7.html cmdline]) de la directive <code>-append</code><br />
* ajout de la directive <code>-initrd</code><br />
* les directives concernant le disque ''SATA'' ont étés supprimées<br />
<br />
<br />
==3. Amorçage initramfs via PXE==<br />
Cette méthode d'amorçage ne varie pas beaucoup de la précédente puisque elle réutilise les mêmes éléments à savoir le noyau et l{{'}}''Initramfs''. Le delta sera sur la syntaxe du chargeur d'amorçage réseau utilisé ainsi que quelques paramètres passés au noyau. Voici la section fonctionnelle pour [[Ipxe]] :<br />
<br />
<syntaxhighlight lang="bash"><br />
#!ipxe<br />
<br />
set menu-timeout 10000<br />
set submenu-timeout ${menu-timeout}<br />
isset ${menu-defaut} || set menu-defaut Debian_Buster<br />
set serveur_ip 10.0.0.100<br />
<br />
menu<br />
item --gap -- -------------DEMARRAGE EN RAM----------------<br />
item busybox Lancer Busybox<br />
<br />
choose --timeout ${menu-timeout} --default ${menu-default} target && goto ${target}<br />
<br />
:busybox<br />
kernel http://${serveur_ip}/systemes/noyaux/busybox/bzImage ro initrd=initramfs.cpio.gz rootfstype=ramfs rdinit=/sbin/init console=ttyS0<br />
initrd http://${serveur_ip}/systemes/noyaux/busybox/initramfs.cpio.gz<br />
boot<br />
# https://ipxe.org/cmd/kernel<br />
</syntaxhighlight><br />
<br />
=Sources=<br />
* https://dev.to/donaldsebleung/hello-embedded-world-booting-a-minimal-linux-with-busybox-on-risc-v-from-source-2ne9<br />
* https://cs4118.github.io/dev-guides/debian-kernel-compilation.html<br />
* ''POSIX Base Specifications Issue 7'' :<br />
** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html<br />
** Paramètres du shell Sh : https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Busybox_init&diff=1486Busybox init2023-11-01T19:24:46Z<p>Ycharbi : Page créée avec « Category:distributions_linux Busybox intègre <code>init</code>, un programme pouvant être amorcé directement par un noyau ''Linux'' au démarrage d'une machine. Il est ainsi possible de concevoir un système d'exploitation léger composé uniquement d'un noyau et de ''Busybox''. L'adjonction d'outils supplémentaires sur cette base minimaliste pourra engendrer une distribution spécifiquement conçue pour un besoin particulier. Cette association s’a... »</p>
<hr />
<div>[[Category:distributions_linux]]<br />
<br />
[[Busybox]] intègre <code>init</code>, un programme pouvant être amorcé directement par un noyau ''Linux'' au démarrage d'une machine. Il est ainsi possible de concevoir un système d'exploitation léger composé uniquement d'un noyau et de ''Busybox''. L'adjonction d'outils supplémentaires sur cette base minimaliste pourra engendrer une distribution spécifiquement conçue pour un besoin particulier. Cette association s’avère donc particulièrement intéressante dans des systèmes embarqués tel que les ''appliances'' réseau comme [https://openwrt.org/ OpenWRT] ou [https://dd-wrt.com/ DD-WRT].<br />
<br />
Nous verrons comment construire un tel système en partant des sources de chaque programmes depuis une ''GNU/Linux Debian 12 Bookworm''. Les compilations se feront avec l'ensemble des paramètres par défaut. Je recommande d'utiliser une machine (virtuelle ''amd64'' dans mon cas) spécifiquement installée pour cet usage car un grand nombre de dépendances est nécessaire et il serait dommage de pourrir votre environnement de travail...<br />
<br />
L'espace de travail sera le répertoire personnel de l'utilisateur ''root''.<br />
<br />
=Linux=<br />
Installation des dépendances<br />
apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev git libelf-dev libssl-dev libncurses-dev dwarves<br />
<br />
Téléchargement des sources du dernier noyau stable (01/11/2023)<br />
<br />
<syntaxhighlight lang="bash"><br />
# Code source<br />
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz -P ~<br />
# Signature GPG<br />
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.sign -P ~<br />
</syntaxhighlight><br />
<br />
Décompression de l'archive des sources<br />
unxz -k ~/linux-6.6.tar.xz<br />
<br />
Vérification de la signature GPG de l'archive<br />
apt install gnupg2<br />
gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org<br />
gpg2 --tofu-policy good 38DBBDC86092693E<br />
gpg2 --tofu-policy good 79BE3E4300411886<br />
gpg2 --trust-model tofu --verify ~/linux-6.6.tar.sign<br />
<br />
Note : la dernière commande doit vous renvoyer plusieurs lignes de résultat dont <code>gpg: Bonne signature de « Greg Kroah-Hartman <gregkh@kernel.org> » [totale]</code>.<br />
<br />
Désarchivage des sources<br />
tar xvf ~/linux-6.6.tar<br />
cd ~/linux-6.6/<br />
<br />
Création d'une configuration de confection saine avec les paramètres par défaut et compilation avec 4 cœurs de processeur<br />
<br />
<syntaxhighlight lang="bash"><br />
make defconfig<br />
make -j4<br />
# Retour dans le répertoire personnel<br />
cd ~<br />
</syntaxhighlight><br />
<br />
Le noyau compilé pour notre architecture x86 64bits se trouve à l'emplacement suivant : <code>~/linux-6.6/arch/x86/boot/bzImage</code>.<br />
<br />
=Busybox=<br />
Téléchargement des sources<br />
<br />
<syntaxhighlight lang="bash"><br />
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2<br />
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2.sha256<br />
</syntaxhighlight><br />
<br />
Vérification d'intégrité<br />
sha256sum -c ~/busybox-1.36.1.tar.bz2.sha256<br />
<br />
Note : la vérification d'intégrité doit renvoyer <code>Réussi</code>.<br />
<br />
Extraction de l'archive compressée<br />
tar xvf ~/busybox-1.36.1.tar.bz2<br />
cd ~/busybox-1.36.1/<br />
<br />
Configuration par défaut et compilation du code avec lien statique afin d'embarquer les dépendances dans le binaire final<br />
<br />
<syntaxhighlight lang="bash"><br />
make defconfig<br />
make -j4 LDFLAGS="--static"<br />
# Retour dans le répertoire personnel<br />
cd ~<br />
</syntaxhighlight><br />
<br />
''Busybox'' est désormais disponible ici : <code>~/busybox-1.36.1/busybox</code><br />
<br />
=Média d'amorce=<br />
Nous avons dés à présent en notre possession tous les programmes de notre future système d'exploitation. Vous pouvez préparer les vôtres en vue de les intégrer dans les sections qui suivent.<br />
<br />
Les méthodes d'amorçages peuvent varier selon les besoins et votre convenance. Je répertorie personnellement 3 cas d'usage :<br />
# mémoire morte avec système de fichier classique type ''EXT4''<br />
# [https://fr.wikipedia.org/wiki/Initrd initramfs]<br />
# ''PXE''<br />
<br />
Toute les démonstrations seront réalisées via [[Qemu]]. La mise en œuvre du réseau ne sera pas détaillée car j'utilise des scripts personnalisés avec mon système. La création d'une interface ''tap'' et son exploitation via la directive <code>-device virtio-net-pci,netdev=network0,mac=$tap_mac -netdev tap,id=network0,ifname=$int_tap,script=no,downscript=no</code> permet de lier la machine virtuel au réseau physique via l'adjonction d'un pont réseau.<br />
<br />
L'étape <code>1</code> fera office de tronc commun aux autres sections afin de ne pas alourdir le document avec une redondance inutile et difficilement maintenable. Seule celle-ci nécessite l'utilisation d'un périphérique de type bloc, les deux autres peuvent êtres réalisées directement dans <code>~/rootfs</code> si vous le désirez. La réalisation successive des trois étapes est toutefois possible. Il faudra simplement penser à remonter <code>~/rootfs</code> afin de ne pas travailler dans un répertoire vide...<br />
<br />
==1. Amorçage en mémoire morte==<br />
Cette façon de faire permet de modifier simplement le contenu de votre distribution après coup. Il suffit pour se faire de monter le système de fichier en écriture pour y actualiser son contenu à votre guise.<br />
<br />
Pour l'exemple, je créerai un fichier simulant un périphérique de type bloc du nom de <code>busybox.dd</code> au même titre qu'une mémoire morte. En condition réelle, remplacez celui-ci par votre périphérique physique : <code>/dev/sda</code>; <code>/dev/mmcblk</code>; <code>/dev/nvme0n1</code>...<br />
<br />
Création et formatage de la mémoire racine<br />
cd ~<br />
dd if=/dev/zero of=~/busybox.dd bs=1M count=1024<br />
mkfs.ext4 ~/busybox.dd<br />
<br />
Création et montage de l'environnement de travail<br />
mkdir -p ~/rootfs<br />
mount ~/busybox.dd ~/rootfs<br />
cd ~/busybox-1.36.1/<br />
<br />
Installation de l'arborescence du système ''Busybox'' dans notre système de fichiers avec [https://stackoverflow.com/questions/49369508/kernel-panic-not-syncing-requested-init-linuxrc-failed-error-2 lien statiques]<br />
make install CONFIG_PREFIX=../rootfs LDFLAGS="--static"<br />
cd ~<br />
<br />
Cette étape a créée les répertoires standards permettant d’accueillir les binaires usuels du système selon la [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] (''FHS''). L'exécutable <code>busybox</code> précédemment compilé a été copié dans le nouveau <code>/bin</code> et des liens symboliques ont étés créés pointant vers celui-ci avec le nom de tous les utilitaires qu'il contient.<br />
<br />
Création des points montages des pseudos systèmes de fichiers usuels, de la table de montages statiques et du répertoire accueillant notre futur script d'initialisation<br />
mkdir -p ~/rootfs/proc ~/rootfs/sys ~/rootfs/dev<br />
mkdir -p ~/rootfs/etc<br />
touch ~/rootfs/etc/fstab<br />
mkdir -p ~/rootfs/etc/init.d<br />
<br />
Script d'initialisation du système<br />
<br />
<syntaxhighlight lang="bash"><br />
bash -c "cat > ~/rootfs/etc/init.d/rcS" << _EOF_<br />
#!/bin/sh<br />
<br />
# Message d'accueil<br />
echo "Busybox ycharbi.fr"<br />
# Pseudos systèmes de fichiers usuels<br />
mount -t proc proc /proc<br />
mount -t sysfs sysfs /sys<br />
mount -t devtmpfs none /dev<br />
<br />
# Configuration réseau<br />
ip addr add 10.0.0.1/24 dev eth0<br />
ip link set dev eth0 up<br />
ip route add default via 10.0.0.254 dev eth0<br />
<br />
# Clavier en AZERTY<br />
loadkmap < /etc/fr.map<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Attribution du droit d'exécution au script d'initialisation<br />
chmod +x ~/rootfs/etc/init.d/rcS<br />
<br />
Configuration des Télétypes (''TTY'')<br />
<br />
<syntaxhighlight lang="bash"><br />
bash -c "cat > ~/rootfs/etc/inittab" << _EOF_<br />
::sysinit:/etc/init.d/rcS<br />
ttyS0::respawn:/bin/sh<br />
tty2::askfirst:-/bin/sh<br />
tty3::askfirst:-/bin/sh<br />
tty4::askfirst:-/bin/sh<br />
tty4::respawn:/sbin/getty 38400 tty5<br />
tty5::respawn:/sbin/getty 38400 tty6<br />
::ctrlaltdel:/sbin/reboot<br />
::shutdown:/sbin/swapoff -a<br />
::shutdown:/bin/umount -a -r<br />
::restart:/sbin/init<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Ce fichier définit les ''TTY'' qui doivent êtres invoqués au lancement de <code>init</code>. Vous devrez probablement adapter ceci à votre besoin. La documentation de ces lignes ainsi que de la configuration appliquée par défaut en cas d'absence du fichier est disponible dans <code>~/busybox-1.36.1/examples/inittab</code>.<br />
<br />
Création du binaire de traduction clavier afin d'utiliser l{{'}}''AZERTY''<br />
busybox dumpkmap > ~/rootfs/etc/fr.map<br />
<br />
À ce stade, notre mémoire morte est prête.<br />
<br />
Pour permettre son amorçage, un éventail de possibilités s'offre à vous : [[Grub]]; [[Systemd-boot]]; [[Efibootmgr#Création_d'une_entrée_de_type_STUB|UEFI stub]]; [[Ipxe]]; [[Installation_slax_-_UEFI_64bits#Préparation_de_l'environnement_hôte|Syslinux]]... Pour ma part et comme précisé en introduction, j'utiliserai [[Qemu#Démarrage_de_la_machine_virtuelle|Qemu]] afin de simplifier au maximum l'exposé.<br />
<br />
Démontage du système de fichier<br />
umount ~/rootfs<br />
<br />
Note : si vous comptez poursuivre les étapes des sections suivantes, pensez à remonter ce système de fichier ou à en copier le contenu dans un autre répertoire de travail afin de ne pas recommencer à zéro.<br />
<br />
Test du système avec ''Qemu''<br />
<br />
<syntaxhighlight lang="bash"><br />
qemu-system-x86_64 \<br />
--enable-kvm \<br />
-m 2048 \<br />
-device virtio-balloon \<br />
-kernel ~/linux-6.6/arch/x86/boot/bzImage \<br />
-append "ro root=/dev/sda console=ttyS0 quiet" \<br />
-cpu host -smp cores=2,threads=1,sockets=1 \<br />
-serial mon:stdio \<br />
-drive id=disk,file="${HOME}"/busybox.dd,format=raw,if=none \<br />
-device ahci,id=ahci \<br />
-device ide-hd,drive=disk,bus=ahci.0 \<br />
-display none<br />
</syntaxhighlight><br />
<br />
Pour un affichage sans port console, il faut supprimer le paramètre <code>console=ttyS0</code> de la directive <code>-append</code>; supprimer la directive <code>-display none</code> et remplacer la ligne <code>ttyS0::respawn:/bin/sh</code> par <code>tty1::respawn:/bin/sh</code> dans le <code>inittab</code>.<br />
<br />
==2. Amorçage en initramfs==<br />
L'utilisation d'un système de fichiers initial en mémoire à accès aléatoire apporte encore plus de légèreté à la solution. Un unique fichier compressé vient s'ajouter au noyau en cours d'exécution pour servir la racine construite précédemment. Le système est exécuté intégralement en mémoire vive et peut donc se voir distribué via des protocoles réseaux tel que ''TFTP'' ou ''HTTP''.<br />
<br />
Construction de l'archive compressée ''Initramfs''<br />
cd ~/rootfs && find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz && cd ~<br />
<br />
Test du système avec ''Qemu''<br />
<br />
<syntaxhighlight lang="bash"><br />
qemu-system-x86_64 \<br />
--enable-kvm \<br />
-m 2048 \<br />
-device virtio-balloon \<br />
-kernel ~/linux-6.6/arch/x86/boot/bzImage \<br />
-append "ro rootfstype=ramfs rdinit=/sbin/init console=ttyS0 quiet" \<br />
-initrd ~/initramfs.cpio.gz \<br />
-cpu host -smp cores=2,threads=1,sockets=1 \<br />
-serial mon:stdio \<br />
-display none<br />
</syntaxhighlight><br />
<br />
Les différences de lancement sont :<br />
* modification des paramètres noyau ([https://www.man7.org/linux/man-pages/man7/kernel-command-line.7.html cmdline]) de la directive <code>-append</code><br />
* ajout de la directive <code>-initrd</code><br />
* les directives concernant le disque ''SATA'' ont étés supprimées<br />
<br />
<br />
==3. Amorçage initramfs via PXE==<br />
Cette méthode d'amorçage ne varie pas beaucoup de la précédente puisque elle réutilise les mêmes éléments à savoir le noyau et l{{'}}''Initramfs''. Le delta sera sur la syntaxe du chargeur d'amorçage réseau utilisé ainsi que quelques paramètres passés au noyau. Voici la section fonctionnelle pour [[Ipxe]] :<br />
<br />
<syntaxhighlight lang="bash"><br />
#!ipxe<br />
<br />
set menu-timeout 10000<br />
set submenu-timeout ${menu-timeout}<br />
isset ${menu-defaut} || set menu-defaut Debian_Buster<br />
set serveur_ip 10.0.0.100<br />
<br />
menu<br />
item --gap -- -------------DEMARRAGE EN RAM----------------<br />
item busybox Lancer Busybox<br />
<br />
choose --timeout ${menu-timeout} --default ${menu-default} target && goto ${target}<br />
<br />
:busybox<br />
kernel http://${serveur_ip}/systemes/noyaux/busybox/bzImage ro initrd=initramfs.cpio.gz rootfstype=ramfs rdinit=/sbin/init console=ttyS0<br />
initrd http://${serveur_ip}/systemes/noyaux/busybox/initramfs.cpio.gz<br />
boot<br />
# https://ipxe.org/cmd/kernel<br />
</syntaxhighlight><br />
<br />
=Sources=<br />
* https://dev.to/donaldsebleung/hello-embedded-world-booting-a-minimal-linux-with-busybox-on-risc-v-from-source-2ne9<br />
* https://cs4118.github.io/dev-guides/debian-kernel-compilation.html<br />
* ''POSIX Base Specifications Issue 7'' :<br />
** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html<br />
** Paramètres du shell Sh : https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Cat%C3%A9gorie:Archlinux&diff=1485Catégorie:Archlinux2023-11-01T11:00:16Z<p>Ycharbi : Changement de casse de la catégorie afin de respect notre convention de nommage</p>
<hr />
<div>[[Category:distributions linux]]</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Cat%C3%A9gorie:Centos&diff=1484Catégorie:Centos2023-11-01T11:00:02Z<p>Ycharbi : Changement de casse de la catégorie afin de respect notre convention de nommage</p>
<hr />
<div>[[Category:distributions linux]]</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Cat%C3%A9gorie:Debian&diff=1483Catégorie:Debian2023-11-01T10:59:45Z<p>Ycharbi : Changement de casse de la catégorie afin de respect notre convention de nommage</p>
<hr />
<div>[[Category:distributions linux]]]</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Cat%C3%A9gorie:Distributions_linux&diff=1482Catégorie:Distributions linux2023-11-01T10:58:55Z<p>Ycharbi : Ycharbi a déplacé la page Catégorie:Distributions Linux vers Catégorie:Distributions linux sans laisser de redirection : Changement de casse de la catégorie afin de respect notre convention de nommage</p>
<hr />
<div>[[Category:linux]]<br />
Une [https://fr.wikipedia.org/wiki/Distribution_Linux distribution Linux], aussi appelée distribution GNU/Linux pour faire référence aux logiciels du projet GNU, est un ensemble cohérent de logiciels, la plupart étant des logiciels libres, assemblés autour du noyau Linux.<br />
<br />
Le terme « distribution » est calqué sur l’anglais software distribution qui signifie « collection de logiciels » en français. On préférera ainsi en français le terme de « système GNU/Linux ».<br />
<br />
La distribution GNU/Linux la plus utilisée dans ce Wiki est [https://www.debian.org/ GNU/Linux Debian].</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Cat%C3%A9gorie:Slax&diff=1481Catégorie:Slax2023-11-01T10:58:07Z<p>Ycharbi : Changement de casse de la catégorie afin de respect notre convention de nommage</p>
<hr />
<div>[[Category:distributions_linux]]<br />
<br />
[https://fr.wikipedia.org/wiki/Slax Slax] est une distribution ''Linux'' destinée à être amorcée sur un média amovible. Elle est pionnière dans son domaine puisqu'elle est l'une des toutes premières à être apparue au début des années 2000. Elle a ainsi participé à la diffusion des [https://fr.wikipedia.org/wiki/Live_CD live CD].<br />
<br />
Elle s’appelait à l'origine ''Slackware-Live'' et a été conçue à partir de la distribution ''Linux'' [https://fr.wikipedia.org/wiki/Slackware Slackware]. Fruit du travail de Tomas Matejicek, spécialiste de la création de ''live CD'', elle est depuis la version 9 (sortie en novembre 2017) basé sur [https://fr.wikipedia.org/wiki/Debian Debian].<br />
<br />
L'atout principal de cette distribution est son système de paquet basé sur un concept de modules (similaires aux [https://fr.wikipedia.org/wiki/AppImage Appimages]). Ceux-ci se présentent sous forme d'archive ''squashfs'' compressés en [https://fr.wikipedia.org/wiki/LZMA LZMA] (depuis la version 6) et chargeable à la volée si ils sont placés dans un répertoire approprié.</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Busybox&diff=1480Busybox2023-11-01T10:54:48Z<p>Ycharbi : /* Via les sources */ Ajout d'une astuce pour la compilation statique + remplacement des balises syntaxhighlight par code afin d'optimiser le chargement de la page</p>
<hr />
<div>[[Category:linux]]<br />
[https://fr.wikipedia.org/wiki/BusyBox Busybox] est un exécutable regroupant une multitude d'utilitaires généralement disponibles via [https://fr.wikipedia.org/wiki/GNU_Core_Utilities GNU Core Utilities]. Il a l'avantage de ne prendre que très peu de place et peut être utilisé pour faire des systèmes embarqués très simples.<br />
<br />
=Installation=<br />
==Via le gestionnaire de paquet==<br />
apt install busybox<br />
<br />
==Via les sources==<br />
Le paquet <code lang="bash" inline>build-essential</code> est nécessaire pour utiliser la commande <code lang="bash" inline>make</code>.<br />
wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2<br />
tar xf busybox-1.31.1.tar.bz2<br />
cd busybox-1.31.1/<br />
make defconfig<br />
make<br />
<br />
{{astuce|Il est possible d'embarquer les dépendances nécessaires au fonctionnement de l'ensemble directement dans le binaire via la commande de compilation <syntaxhighlight lang="bash" inline>make LDFLAGS="--static"</syntaxhighlight> (ce dernier sera par conséquent plus lourd). Ceci est utile lorsque ''Busybox'' est intégré à un système dépourvu des bibliothèques en question.}}<br />
<br />
Un exécutable ''busybox'' a été créé dans le répertoire courant.<br />
<br />
La commande <code lang="bash" inline>make defconfig</code> permet de créer le fichier de configuration pour <code lang="bash" inline>make</code> (''.config''). Les commandes de pré-configurations possibles sont :<br />
* '''make defconfig''' : Créé la configuration la plus saine possible. Ça active la plupart des fonctionnalités sans quelques outils de débogage ainsi que les outils nécessitants des modifications du système comme les noms de périphériques ''selinux'' ou ''devfs''. Utiliser cette option si vous voulez démarrer depuis un ''Busybox'' complet pour, par la suite, écrémer les fonctionnalités pour en avoir un plus petit.<br />
* '''make allnoconfig''' : Désactive tout. Cela crée une petite version de ''Busybox'' qui ne fait rien. Commencez ici si vous savez exactement ce que vous voulez et que vous souhaitez sélectionner uniquement ces fonctionnalités.<br />
* '''make menuconfig''' : Modifie interactivement le fichier ''.config'' via une interface de menu à plusieurs niveaux. Utilisez-le après l'un des deux précédents.<br />
Les autres options sont :<br />
* '''make oldconfig''' : Mettre à jour un vieux fichier ''.config'' pour une nouvelle version de ''Busybox''.<br />
* '''make allyesconfig''' : Sélectionnez absolument tout. Cela crée une version statiquement liée de ''Busybox'' remplie de code de débogage, avec des dépendances sur ''selinux'', en utilisant des noms de ''devfs''... Cela s'assure que tout est compilé. Que le résultat fasse quelque chose d'utile ou non est une question ouverte.<br />
* '''make randconfig''' : Créer une configuration aléatoire à des fins de tests.<br />
<br />
=Socket réseau en utilisateur standard=<br />
Par défaut, un système ''Linux'' n'autorise la création et la gestion d'un socket réseau que par l'utilisateur ''root''. Il peut être pratique de permettre certains exécutables à le faire via un utilisateur standard (c'est chiant d'avoir à taper le mot de passe ''root'' tout le temps). Pour ce faire, nous utiliserons les [[Linux capabilities]].<br />
<br />
'''Autorisation de redirection réseau'''<br />
setcap CAP_NET_BIND_SERVICE=+eip /bin/busybox<br />
<br />
{{Astuce|On peut voir cette autorisation avec la commande <syntaxhighlight lang="bash" inline>getcap /bin/busybox</syntaxhighlight>.}}<br />
<br />
Les utilisateurs standards peuvent désormais utiliser le serveur ''HTTP'' ou autres intégré à ''Busybox''.<br />
<br />
==Source de la section==<br />
* https://superuser.com/questions/710253/allow-non-root-process-to-bind-to-port-80-and-443/892391<br />
<br />
=Usage=<br />
Nous allons partir du principe que l'emplacement de notre binaire ''busybox'' se trouve dans notre variable d'environnement <syntaxhighlight lang="bash" inline>$PATH</syntaxhighlight>.<br />
<br />
'''Lister les programmes disponibles dans notre Busybox'''<br />
busybox<br />
<br />
'''Afficher le manuel des outils contenus dans Busybox'''<br />
man busybox<br />
<br />
''Avec un <syntaxhighlight lang="bash" inline>/</syntaxhighlight> suivi du nom de la commande + <syntaxhighlight lang="bash" inline>entrer</syntaxhighlight> + <syntaxhighlight lang="bash" inline>n</syntaxhighlight> on tombe directement sur le manuel de l'outil désiré.''<br />
<br />
==Serveur WEB==<br />
'''Utiliser le serveur WEB intégré'''<br />
busybox httpd -f -v -h /tmp/foo/<br />
<br />
''Le serveur httpd ne liste pas les fichiers, il faut entrer une URL complète comme pour le TFTP. Cependant, il redirige automatiquement sur un index.html si présent.''<br />
<br />
Paramètres :<br />
* '''-f''' : Ne rend pas la main. Ça permet de fermer le serveur web avec un <syntaxhighlight lang="bash" inline>ctrl+c</syntaxhighlight> au lieu de ce faire chier avec les commandes <syntaxhighlight lang="bash" inline>ps</syntaxhighlight> et <syntaxhighlight lang="bash" inline>kill</syntaxhighlight><br />
* '''-v''' : affiche les IP des clients se connectant et le message renvoyé par le serveur<br />
* '''-h''' : Spécifie le répertoire de travail du serveur. Si ce paramètre n'est pas renseigné, le répertoire courant est utilisé<br />
<br />
==Serveur DHCP==<br />
'''Créer le fichiers du processus'''<br />
touch /tmp/udhcpd.pid<br />
<br />
'''Créer le fichier contenant les baux DHCP'''<br />
touch /tmp/udhcpd.leases<br />
<br />
'''Créer un fichier de configuration'''<br />
<syntaxhighlight lang="python"><br />
cat > /tmp/udhcpd.conf << _EOF_<br />
# Plage d'adresse attribuable<br />
start 192.168.0.1 # Par défaut: 192.168.0.20<br />
end 192.168.0.253 # Par défaut: 192.168.0.254<br />
<br />
# Interface réseau d'écoute<br />
interface eth1 # Par défaut: eth0<br />
<br />
# Nombre maximum de baux <br />
max_leases 253 # Par défaut: 254<br />
<br />
# Stocker le temps restant pour chaque bail dans le fichier des baux<br />
# C'est utile sur les systèmes embarqués ne pouvant garder l'heure après un redémarrage<br />
# Si cette valeur est définie à "no", l'heure de fin de bail sera stocker dans le fichier<br />
# des baux au lieu du temps restant avant expiration<br />
<br />
#remaining yes # Par défaut: yes<br />
<br />
# Localisation du fichier des baux<br />
lease_file /tmp/udhcpd.leases<br />
<br />
# Localisation du fichier processus<br />
pidfile /tmp/udhcpd.pid # Par défaut: /var/run/udhcpd.pid<br />
<br />
# Les options suivantes sont pour le PXE<br />
#siaddr 192.168.0.22 # Par défaut: 0.0.0.0<br />
#sname zorak # Par défaut: (none)<br />
#boot_file /var/nfs_root # Par défaut: (none)<br />
<br />
# Options DHCP<br />
# Elles peuvent être spécifiées via le mot clé "option" ou "opt" qui est un alias.<br />
# La seule options définie par défaut est "lease" pour définir la durée des baux<br />
opt dns 192.168.170.171 80.67.169.12<br />
option subnet 255.255.255.0<br />
opt router 192.168.0.254<br />
#opt wins 192.168.10.10 # Ajoute un serveur WINS<br />
#option dns 129.219.13.81 # Ajoute un autre DNS aux 2 autres ci-dessus<br />
option domain local<br />
option lease 864000 # 10 jours en secondes<br />
_EOF_<br />
</syntaxhighlight><br />
<br />
Vous pouvez adapter les adresses et nom d'interface avec les commande suivante en remplaçant ''toto'' par la donnée appropriée:<br />
sed -i 's/192\.168\.0\./192\.168\.toto./g' /tmp/udhcpd.conf<br />
sed -i 's/eth1/toto/g' /tmp/udhcpd.conf<br />
<br />
Paramètres possibles :<br />
{| class="wikitable"<br />
|-<br />
! Paramètre !! Effet !! Valeur par défaut<br />
|-<br />
| Paramètre 1 || Il fait ça || yes<br />
|}<br />
<br />
Liste exhaustive des options supportés. Voir le fichier source ''options.c'' :<br />
{| class="wikitable"<br />
|-<br />
! Option !! Effet<br />
|-<br />
| toto || titi<br />
|}<br />
<br />
'''Exécuter le serveur DHCP'''<br />
busybox udhcpd -fv /tmp/udhcpd.conf<br />
<br />
Paramètres :<br />
* '''-f''' : Ne rend pas la main. Ça permet de fermer le serveur DHCP avec un <syntaxhighlight lang="bash" inline>ctrl+c</syntaxhighlight> au lieu de ce faire chier avec les commandes <syntaxhighlight lang="bash" inline>ps</syntaxhighlight> et <syntaxhighlight lang="bash" inline>kill</syntaxhighlight><br />
* '''-v''' : affiche les requêtes ''ACK'' et ''OFFER'' entre le serveur et les clients (on voit l'IP attribué de ce fait)<br />
<br />
'''Sources de la section'''<br />
* Page officielle de udhcpd: https://udhcp.busybox.net/<br />
* Fichier de configuration exemple: https://udhcp.busybox.net/udhcpd.conf<br />
<br />
==NTP==<br />
===Serveur NTP===<br />
Définir l'horloge système depuis une source réseau<br />
busybox ntpd -d -n -I eth0 -l -p 0.debian.pool.ntp.org<br />
<br />
Paramètres :<br />
* '''-d''' : mode verbeux<br />
* '''-n''' : ne pas démoniser (ne pas exécuter en arrière plan)<br />
* '''-I''' : écouter sur l'interface spécifiée pour les requêtes clientes<br />
* '''-l''' : ouvre le socket ''UDP'' sur le port 123 pour les requêtes clientes<br />
* '''-p''' : serveur de référence sur lequel se synchronise notre serveur<br />
<br />
==TFTP==<br />
===Client TFTP===<br />
Télécharger un fichier via ''TFTP''<br />
busybox tftp -r toto.txt 192.168.100.2 -g<br />
<br />
Téléverser un fichier via ''TFTP''<br />
busybox tftp -l toto.txt 192.168.100.2 -p<br />
<br />
===Serveur TFTP===<br />
Le serveur ''TFTP'' est rarement embarqué dans le ''Busybox'' des distributions ''Linux''. Dans ce cas, il faudra le compilé soit même (testé avec la version 1.31.1).<br />
<br />
''Busybox tftpd'' a besoin de s'appuyer sur un programme (lui même présent dans ''Busybox'') d'ouverture de socket réseau : <syntaxhighlight lang="bash" inline>udpsvd</syntaxhighlight>.<br />
<br />
/tmp/busybox-1.31.1/busybox udpsvd -vE 0.0.0.0 69 /tmp/busybox-1.31.1/busybox tftpd -c /tmp/tftp/<br />
<br />
Paramètres :<br />
* '''-r''' : lecture seule<br />
* '''-c''' : téléversements autorisés<br />
* '''-u''' : rendre l'utilisateur passé en paramètre propriétaire des fichiers téléversés<br />
* '''-l''' : journaliser dans ''Syslog'' en plus du ''Stdout'' (non fonctionnel d'après mes tests)<br />
<br />
==Netcat==<br />
Les commandes [[netcat]] sont identique à la version ''APT'' (avec quelques options en moins).<br />
busybox nc -l -p 2323<br />
<br />
busybox nc ipserver 2323<br />
<br />
'''Envoyer un [https://tutorials.technology/tutorials/How-to-transfer-files-over-the-network-using-Netcat.html fichier]'''<br />
<br />
Sur le serveur :<br />
busybox nc -l -p 9999 > /tmp/titi.dat<br />
<br />
Sur le client :<br />
busybox nc 192.168.0.1 9999 < /tmp/titi/titi.dat<br />
<br />
==Terminal série==<br />
On peut remplacer l'usage de [[Minicom]] par ''Busybox'' avec l'outil embarqué ''Microcom''.<br />
busybox microcom -s 9600 /dev/ttyUSB0<br />
<br />
Pour quitter ''Microcom'', faites la séquence d'échappement <syntaxhighlight lang="bash" inline>ctrl+x</syntaxhighlight>.<br />
<br />
=Sources=<br />
* https://busybox.net/FAQ.html#configure<br />
* https://busybox.net/downloads/BusyBox.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Macsec_-_linux&diff=1479Macsec - linux2023-09-23T17:22:01Z<p>Ycharbi : Correction de la commande d'ajout d'IP sur les deux machines</p>
<hr />
<div>[[Category:Réseaux_linux]]<br />
<br />
''MACsec'' ou [https://fr.wikipedia.org/wiki/IEEE_802.1AE IEEE 802.1AE] est la norme de sécurisation de la [https://fr.wikipedia.org/wiki/Couche_liaison_de_donn%C3%A9es couche] [https://fr.wikipedia.org/wiki/Media_access_control MAC] de l{{'}}[https://fr.wikipedia.org/wiki/IEEE IEEE]. Il permet le chiffrement des trames ''Ethernet'' (entre deux pairs sur un [https://fr.wikipedia.org/wiki/R%C3%A9seau_local LAN]) au sein d'un même réseau local et, par extension, dans n'importe quel protocole d{{'}}[[:Category:Tunnelisation|encapsulation en surcouche]] de niveau 2.<br />
<br />
Publié en 2006 (''802.1AE-2006''), la norme prévoyait un chiffrement des trames via le protocole ''GCM-AES-128'' (128 bits) et un amendement de 2011 (''802.1AEbn-2011'') a apporté le support des clés de 256 bits. Il a par la suite été complété en 2013 (''802.1AEbw-2013'') par l'ajout des suites cryptographiques ''GCM-AES-XPN-128'' et ''GCM-AES-XPN-256''. Intégré depuis le noyau ''Linux'' 4.6 (2016), ''IEEE 802.1AE'' est utilisable via le paquet <syntaxhighlight lang="bash" inline>iproute2</syntaxhighlight>.<br />
<br />
''MACSec'' vient se substituer à la trame ''Ethernet'' standard en reprenant ses champs d'origines et en y ajoutant deux supplémentaires :<br />
* '''Security Tag''' : extension du champ [https://fr.wikipedia.org/wiki/EtherType EtherType]<br />
* '''Message Authentication Code''' (''Integrity Check Value'' ou ''ICV'') : somme de contrôle de la trame déchiffrée<br />
<br />
Une trame 802.1Q passe donc de la structure :<br />
{| class="wikitable"<br />
<br />
|-----<br />
| adresse MAC dst.<br />
| adresse MAC src.<br />
| 802.1Q<br />
| EtherType/Size<br />
| Data <br />
| [https://fr.wikipedia.org/wiki/Frame_check_sequence FCS]<br />
|}<br />
<br />
à la suivante :<br />
{| class="wikitable"<br />
|-----<br />
| colspan="6" align="center" | Authentifié || || <br />
|-----<br />
|| || || || colspan="3" align="center" | Chiffré || || <br />
|-----<br />
| adresse MAC dst.<br />
| adresse MAC src.<br />
| MACSec Security Tag<br />
| 802.1Q<br />
| EtherType/Size<br />
| Data <br />
| ICV<br />
| FCS<br />
|}<br />
<br />
=Mise en œuvre=<br />
Deux machines seront utilisées dans l'exemple qui suit. Elles comportent chacune les adresses ''MAC'' suivantes :<br />
* '''Machine 1''' : 44:9a:5b:fe:64:cc<br />
* '''Machine 2''' : 44:9a:5b:ea:2b:08<br />
<br />
==Machine 1==<br />
Création de l'interface virtuel de chiffrement du trafic<br />
ip link add link eth0 macsec0 type macsec encrypt on<br />
<br />
Dans la mesure où les trames sont bornées au domaine de diffusion local d'une interface existante, celle nouvellement créée y est attachée et sera à utiliser lorsque les trames devront êtres chiffrées avant envoi (la communication sortant directement d{{'}}''eth0'' est toujours en clair).<br />
<br />
La commande suivante détail les informations des interfaces ''MACSec''. Plusieurs appairages chiffrés peuvent êtres configurés afin de réaliser une topologie en étoile confidentielle<br />
ip macsec show<br />
<br />
Retour de la commande<br />
<br />
<syntaxhighlight lang="bash"><br />
3: macsec0: protect on validate strict sc off sa off encrypt on send_sci on end_station off scb off replay off <br />
cipher suite: GCM-AES-128, using ICV length 16<br />
TXSC: 449a5bfe64cc0001 on SA 0<br />
offload: off <br />
</syntaxhighlight><br />
<br />
Ajout d'un pair<br />
ip macsec add macsec0 rx port 1 address 44:9a:5b:ea:2b:08<br />
<br />
ip macsec show<br />
<br />
Une ligne <syntaxhighlight lang="bash" inline>RXSC</syntaxhighlight> a été ajouté<br />
<br />
<syntaxhighlight lang="bash"><br />
3: macsec0: protect on validate strict sc off sa off encrypt on send_sci on end_station off scb off replay off <br />
cipher suite: GCM-AES-128, using ICV length 16<br />
TXSC: 449a5bfe64cc0001 on SA 0<br />
RXSC: 449a5bea2b080001, state on<br />
offload: off<br />
</syntaxhighlight><br />
<br />
Création d'une clé destinée au chiffrement symétrique<br />
dd if=/dev/urandom count=16 bs=1 2>/dev/null | hexdump | cut -c 9- | tr -d ' \n'<br />
<br />
Attribution de cette clé dans la configuration d'appairage avec la machine 2 pour l'interface <syntaxhighlight lang="bash" inline>macsec0</syntaxhighlight><br />
ip macsec add macsec0 tx sa 0 pn 1 on key 00 a150a57510be82fc8c732aa899a28c17<br />
<br />
Injection de la clé du pair dans cette même configuration<br />
ip macsec add macsec0 rx port 1 address 44:9a:5b:ea:2b:08 sa 0 pn 1 on key 01 ff4c9f44769823abe910326dd8cc8d77<br />
<br />
Allumage de l'interface<br />
ip link set macsec0 up<br />
<br />
Comme précisé plus haut, le trafic ne sera chiffré entre les deux pairs que si l'interface source de l'échange est <syntaxhighlight lang="bash" inline>macsec0</syntaxhighlight>, aussi, il convient de lui attribuer une adresse ''IP''<br />
ip address add 10.0.0.1/24 dev macsec0<br />
<br />
==Machine 2==<br />
Les étapes sont les mêmes en adaptant les spécificités liées au pair différent<br />
<br />
ip link add link eth0 macsec0 type macsec encrypt on<br />
ip macsec add macsec0 rx port 1 address 44:9a:5b:fe:64:cc<br />
<br />
dd if=/dev/urandom count=16 bs=1 2>/dev/null | hexdump | cut -c 9- | tr -d ' \n'<br />
ip macsec add macsec0 tx sa 0 pn 1 on key 01 ff4c9f44769823abe910326dd8cc8d77<br />
ip macsec add macsec0 rx port 1 address 44:9a:5b:fe:64:cc sa 0 pn 1 on key 00 a150a57510be82fc8c732aa899a28c17<br />
<br />
ip link set macsec0 up<br />
ip address add 10.0.0.2/24 dev macsec0<br />
<br />
=Sources=<br />
* https://developers.redhat.com/blog/2016/10/14/macsec-a-different-solution-to-encrypt-network-traffic<br />
* https://www.man7.org/linux/man-pages/man8/ip-macsec.8.html<br />
* https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9200/software/release/16-10/configuration_guide/sec/b_1610_sec_9200_cg/macsec_encryption.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Dropbear&diff=1478Dropbear2023-09-23T07:59:48Z<p>Ycharbi : </p>
<hr />
<div>[[Category:service_ssh]]<br />
[[Category:shell]]<br />
<br />
Dropbear est un client et serveur SSH libre prévu pour des environnements légers (le plus souvent embarqués). Il comporte l'avantage de pouvoir être intégré à l{{'}}''initramfs'' d'un système ''Linux''. Ce caractéristique est notamment utile pour le déchiffrement des disques [[Cryptsetup|Luks]] via ''SSH''.<br />
<br />
==Dropbear-initramfs==<br />
Comme précisé en introduction, le serveur ''SSH'' peut être intégré à l{{'}}''initramfs'' d'un système afin d'effectuer des actions distantes. Le cas le plus répandu étant le déchiffrement du disque racine.<br />
<br />
Installation du paquet<br />
apt install dropbear-initramfs<br />
<br />
{{attention|Depuis la version ''2022.83-1'' embarquée dans ''Debian'' 12, le chemin des fichiers de configuration a changé. L'emplacement <code>/etc/dropbear-initramfs/</code> devient <code>/etc/dropbear/initramfs/</code>. Le fichier principal a également été renommé de <code>config</code> à <code>dropbear.conf</code>. La documentation a été mise à jour en conséquence.}}<br />
<br />
Configuration des options du service<br />
echo 'DROPBEAR_OPTIONS="-I 180 -j -k -p 2222 -s"' >> /etc/dropbear/initramfs/dropbear.conf<br />
<br />
Explications :<br />
* <syntaxhighlight lang="bash" inline>-I 180</syntaxhighlight> : temps d'inactivité (en secondes) avant déconnexion automatique<br />
* <syntaxhighlight lang="bash" inline>-j</syntaxhighlight> : désactiver la redirection de port local<br />
* <syntaxhighlight lang="bash" inline>-k</syntaxhighlight> : désactiver la redirection de port distante<br />
* <syntaxhighlight lang="bash" inline>-p 2222</syntaxhighlight> : port d'écoute du service (22 par défaut)<br />
* <syntaxhighlight lang="bash" inline>-s</syntaxhighlight> : désactiver l'authentification par mot de passe (clé ''SSH'' uniquement)<br />
<br />
Configuration de l'adresse ''IP'' de l{{'}}''initramfs'' sur l'interface ''eth0''<br />
echo 'IP=192.168.1.20::192.168.1.1:255.255.255.0:debian:eth0' >> /etc/initramfs-tools/initramfs.conf<br />
<br />
Explications :<br />
* <syntaxhighlight lang="ini" inline>IP=</syntaxhighlight> : définition des paramètres réseaux de l{{'}}''initramfs'' (séparés par des <syntaxhighlight lang="ini" inline>:</syntaxhighlight>)<br />
* <syntaxhighlight lang="ini" inline>192.168.1.20</syntaxhighlight> : adresse IP<br />
* <syntaxhighlight lang="ini" inline>::</syntaxhighlight> : champ destiné au serveur ''NFS'' (aucun rapport avec notre sujet)<br />
* <syntaxhighlight lang="ini" inline>192.168.1.1</syntaxhighlight> : passerelle du réseau<br />
* <syntaxhighlight lang="ini" inline>255.255.255.0</syntaxhighlight> : masque de sous-réseau<br />
* <syntaxhighlight lang="ini" inline>debian</syntaxhighlight> : nom d'hôte<br />
* <syntaxhighlight lang="ini" inline>eth0</syntaxhighlight> : interface à configurer<br />
<br />
{{info|La documentation [https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt suivante] explique en détaille ce paramètre.}}<br />
<br />
Comme nous n'avons autorisé que la connexion pas clé, nous allons ajouter la notre (générée de [[Openssh#Générer_ses_clefs|cette manière]])<br />
<br />
Transfert de la clé ''SSH'' du client au serveur<br />
scp ~/.ssh/id_ed25519.pub root@192.168.1.20:/etc/dropbear/initramfs/authorized_keys<br />
<br />
Mise à jour de l{{'}}''initramfs''<br />
update-initramfs -u<br />
<br />
Redémarrage<br />
reboot<br />
<br />
Connexion au serveur<br />
ssh root@192.168.1.20 -p 2222<br />
<br />
Déchiffrement du disque<br />
cryptroot-unlock<br />
<br />
==Source de la section==<br />
* https://www.cyberciti.biz/security/how-to-unlock-luks-using-dropbear-ssh-keys-remotely-in-linux/</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Minuteur_-_systemd&diff=1477Minuteur - systemd2023-08-30T19:28:52Z<p>Ycharbi : Ajout de la commande permettant de lister les minuteurs</p>
<hr />
<div>[[Category:systemd]]<br />
[[Category:service ordonnancement]]<br />
<br />
''Systemd'' permet de créer des unités de type ''timer'' permettant d'ordonnancer des tâches au même titre que [[Cron]]. Ils s'appuient sur les services standards pour fonctionner et doivent porter le même nom que celui à exécuter automatiquement.<br />
<br />
Pour la compréhension générale de la fonctionnalité, vous pouvez vous référer aux sources en [[#sources|bas de page]]. Dans notre cas, un exemple sera plus parlant. Celui-ci vise à exécuter une commande de synchronisation [[Rsync]] à une heure donnée tous les jours de l'année. Un service modèle permettra de réutiliser la même commande de synchronisation pour plusieurs machines et un minuteur (''timer'') les déclenchera au moment voulu.<br />
<br />
Création du répertoire d'accueil des unités personnalisées de l'utilisateur<br />
mkdir -p /usr/local/etc/systemd/system<br />
<br />
Création d'un service modèle<br />
vim /usr/local/etc/systemd/system/synchro_fichiers@.service<br />
<br />
<syntaxhighlight lang="bash"><br />
[Unit]<br />
Description=Synchronisation des fichiers de Mediawiki<br />
After=network.target<br />
<br />
[Service]<br />
Type=oneshot<br />
ExecStart=rsync -av --progress --delete-after fichiers_dav/ www-data@%i:/<br />
RemainAfterExit=no<br />
</syntaxhighlight><br />
<br />
Il est très important que le service ne soit pas à l'état ''active'' lorsque le minuteur se déclenchera. Si tel est le cas, ce dernier passera sa programmation (''Trigger'') à ''n/a'' et n'exécutera jamais la tâche.<br />
<br />
Pour se faire, plusieurs mesures sont mises en œuvres. L'absence de directive <syntaxhighlight lang="bash" inline>[Install]</syntaxhighlight> au service empêche la possibilité de l'activer manuellement au démarrage du système (il est alors totalement dépendant du minuteur). Le paramètre <syntaxhighlight lang="bash" inline>RemainAfterExit</syntaxhighlight> est quant à lui passé à ''no'' afin de ne pas garder le service actif après exécution.<br />
<br />
Création du minuteur associé<br />
vim /usr/local/etc/systemd/system/synchro_fichiers@.timer<br />
<br />
<syntaxhighlight lang="bash"><br />
[Unit]<br />
Description=Exécution journalière de la synchronisation des fichiers Mediawiki<br />
<br />
[Timer]<br />
OnCalendar=daily<br />
Persistent=true<br />
<br />
[Install]<br />
WantedBy=timers.target<br />
</syntaxhighlight><br />
<br />
Le paramètre <syntaxhighlight lang="bash" inline>OnCalendar</syntaxhighlight> accepte les données suivantes :<br />
* '''minutely''' : *-*-* *:*:00<br />
* '''hourly''' : *-*-* *:00:00<br />
* '''daily''' : *-*-* 00:00:00<br />
* '''monthly''' : *-*-01 00:00:00<br />
* '''weekly''' : Mon *-*-* 00:00:00<br />
* '''yearly''' : *-01-01 00:00:00<br />
* '''quarterly''' : *-01,04,07,10-01 00:00:00<br />
* '''semiannually''' : *-01,07-01 00:00:00<br />
<br />
Une date complète peut être donnée. Différents exemples sont décrits dans la [https://www.freedesktop.org/software/systemd/man/systemd.time.html page de manuel].<br />
<br />
Mise à disposition des éléments à ''Systemd''<br />
ln -s /usr/local/etc/systemd/system/synchro_fichiers@.service /etc/systemd/system/<br />
ln -s /usr/local/etc/systemd/system/synchro_fichiers@.timer /etc/systemd/system/<br />
<br />
Rechargement du gestionnaire de configuration de ''Systemd''<br />
systemctl daemon-reload<br />
<br />
Activation des minuteurs<br />
systemctl enable synchro_fichiers@galera2.timer<br />
systemctl enable synchro_fichiers@galera3.timer<br />
systemctl start synchro_fichiers@galera2.timer<br />
systemctl start synchro_fichiers@galera3.timer<br />
<br />
Lister les minuteurs<br />
systemctl list-timers<br />
<br />
==Sources==<br />
* https://www.freedesktop.org/software/systemd/man/systemd.timer.html<br />
* https://www.freedesktop.org/software/systemd/man/systemd.service.html<br />
* https://www.linuxtricks.fr/wiki/systemd-creer-des-services-timers-unites<br />
* https://www.redhat.com/sysadmin/replacing-rclocal-systemd</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Autocommand_-_cisco&diff=1476Autocommand - cisco2023-08-06T00:04:41Z<p>Ycharbi : Page créée avec « Category:cisco Sur Cisco IOS, <syntaxhighlight lang="bash" inline>autocommand</syntaxhighlight> est une méthode permettant d'exécuter une (et une seule) commande automatiquement lors de la connexion à une ligne ou à un utilisateur en particulier. Cette fonctionnalité peut répondre à plusieurs besoins comme l'affichage d'informations à la connexion (possibilité de dédier un utilisateur à cette tâche ou en complément d'une Configura... »</p>
<hr />
<div>[[Category:cisco]]<br />
<br />
Sur [[Ios - cisco|Cisco IOS]], <syntaxhighlight lang="bash" inline>autocommand</syntaxhighlight> est une méthode permettant d'exécuter une (et une seule) commande automatiquement lors de la connexion à une ligne ou à un utilisateur en particulier.<br />
<br />
Cette fonctionnalité peut répondre à plusieurs besoins comme l'affichage d'informations à la connexion (possibilité de dédier un utilisateur à cette tâche ou en complément d'une [[Configuration_de_base_-_commutateur_cisco#Banni%C3%A8re_d'accueil|bannière d'accueil]] par exemple) ou permettre la persistance de configurations éphémères (tel les paramètres de la commande <syntaxhighlight lang="bash" inline>terminal</syntaxhighlight>).<br />
<br />
L'<syntaxhighlight lang="bash" inline>autocommand</syntaxhighlight> ne supportant qu'une seule commande, son utilité peut s'en retrouver fortement limité. Heureusement, il est possible de contourner ce handicap par l'usage d'un script ''Tool Command Language'' (''TCL'').<br />
<br />
=Usage=<br />
==Par utilisateur==<br />
Il est possible d'avoir un utilisateur dédié à la visualisation d'une information en particulier (l'état des interfaces réseau ou des utilisateurs connectés par exemple). L'<syntaxhighlight lang="bash" inline>autocommand</syntaxhighlight> peut être configuré pour un utilisateur à sa création afin de le dédier à l'exécution d'une seule commande avant déconnexion immédiate et automatique. L'administration sera alors impossible avec cet utilisateur (uniquement en <syntaxhighlight lang="bash" inline>line console 0</syntaxhighlight>, ce qui en fait une fonctionnalité pas mal bancale...).<br />
username interfaces secret interfaces<br />
username interfaces autocommand show interface status<br />
<br />
L'utilisateur ''interfaces'' avec le mot de passe ''interfaces'' exécutera automatiquement la commande <syntaxhighlight lang="bash" inline>show interface status</syntaxhighlight> avant de se déconnecter immédiatement de lui même. Notez qu'il est tout à fait possible d'utiliser une [[Ssh_-_cisco#Authentification_par_cl%C3%A9_publique|clé SSH]] à la place d'un mot de passe pour la connexion à l'utilisateur.<br />
<br />
Comme à l'accoutumé, il est recommandé de désactiver l'accès à la commande <syntaxhighlight lang="bash" inline>enable</syntaxhighlight> pour les utilisateurs non privilégiés afin d'écarter une élévation de privilège par ce biais<br />
privilege exec level 15 enable<br />
<br />
==Par ligne==<br />
Un <syntaxhighlight lang="bash" inline>autocommand</syntaxhighlight> affecté à une ligne exécutera automatiquement une commande à la connexion via ladite ligne (typiquement via [[Liaisons rs232|console]], ''Telnet'' ou [[Ssh - cisco|SSH]]). Le comportement par défaut est de fermer la session après la commande mais il est possible de changer cela.<br />
<br />
# Configuration des lignes 0 à 3<br />
line vty 0 3<br />
<br />
# Désactivation du comportement de déconnexion automatique à l'exécution<br />
autocommand-options nohangup<br />
<br />
# Exécution de la commande "who" à la connexion<br />
autocommand who<br />
<br />
=Commandes multiples=<br />
Afin de contourner la limitation de la commande unique, il est possible d'exécuter un script ''TCL'' contenant autant d'instructions que désirée. C'est dans ce cas de figure que la technique devient particulièrement intéressante.<br />
<br />
Dans la mesure où ''IOS'' ne dispose pas d'éditeur de texte intégré, il est possible de rédiger votre script sur un ordinateur et de le transférer sur l'équipement réseau via un protocole de transfert de fichiers tel que ''TFTP'' ou ''HTTP''.<br />
<br />
{{astuce|Rédigez votre script sur une machine et rendez-le disponible via un protocole de transfert de fichiers supporté par l{{'}}''IOS'' de votre équipement. Il vous sera alors possible de l'exécuter directement depuis le dépôt distant et ainsi gagner en temps lors de vos tests. Ce n'est que lorsque vous serez arrivé au résultat voulu que vous aurez à le transférer en local pour une exécution depuis la ''flash''.}}<br />
<br />
Contenu du script <syntaxhighlight lang="tcl" inline>terminal.tcl</syntaxhighlight> :<br />
<br />
<syntaxhighlight lang="tcl"><br />
proc terminal-defaut x {<br />
terminal monitor<br />
terminal length 0<br />
}<br />
<br />
terminal-defaut 1<br />
</syntaxhighlight><br />
<br />
Le processus (fonction) <syntaxhighlight lang="tcl" inline>terminal-defaut</syntaxhighlight> n'attendant aucun argument (on en met un par ce que c'est obligatoire...) exécutera les deux commandes contenues dans ses accolades permettant respectivement d'activer la journalisation dans le ''VTY'' et de désactiver la pagination lors d'un retour ''stdout'' conséquent. Ce processus est appelé à la dernière ligne afin d'en exécuter son contenu.<br />
<br />
# Exécution du script depuis le dépôt distant<br />
tclsh tftp://2001:db8::/terminal.tcl<br />
<br />
# Lorsque le comportement est validé, rapatriement du script en local<br />
copy tftp://2001:db8::/terminal.tcl flash:<br />
<br />
# Configuration des lignes 0 à 3<br />
line vty 0 3<br />
<br />
# Désactivation de la déconnexion automatique à la fin de la commande et configuration de l'autocommand sur le script TCL<br />
autocommand-options nohangup<br />
autocommand tclsh flash:terminal.tcl<br />
<br />
=Sources=<br />
* https://community.cisco.com/t5/network-management/quot-terminal-monitor-quot-on-by-default/td-p/2885504<br />
* https://blog.ipspace.net/2007/03/executing-command-upon-user-login.html<br />
* https://blog.ipspace.net/kb/Tclsh/10-commands.html<br />
* https://blog.ipspace.net/kb/Tclsh/<br />
* https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ios_tcl/configuration/12-4t/ios-tcl-12-4t-book/nm-script-tcl.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Ssh_-_cisco&diff=1475Ssh - cisco2023-08-05T23:58:04Z<p>Ycharbi : Ajout du paramètre usage-keys pour la génération des clés SSH + ajout d'une section pour l'authentification via clé publique + remplacement des balises sources obsolètes + correction de fautes de français</p>
<hr />
<div>[[Category:cisco]]<br />
<br />
L'administration d'un équipement ''Cisco'' se fait généralement via le protocole [https://fr.wikipedia.org/wiki/Secure_Shell Secure SHell] (''SSH''). Il est nécessaire d'appliquer quelques paramètre pour l'activer.<br />
<br />
=Session SSH=<br />
L'activation de ''SSH'' sous [[Ios - cisco|Cisco IOS]] passe par quelques commandes comprenant notamment, la création d'un utilisateur, d'une clé ainsi que des critères de sessions.<br />
<br />
<syntaxhighlight lang="bash"><br />
configure terminal<br />
# Création de l'utilisateur<br />
username <utilisateur> privilege 15 secret <motdepasse><br />
# Création des la clés<br />
crypto key generate rsa modulus 4096 usage-keys label <FQDN><br />
# Activation de la version 2 du protocole SSH (normalement c'est automatique)<br />
ip ssh version 2<br />
# Paramétrage des sessions SSH sur les consoles virtuelles<br />
line vty 0 4<br />
# Activation des connexions en utilisant la base utilisateur locale<br />
login local<br />
# Modification de la durée de la session (définie à 3 minutes)<br />
exec-timeout 0 3<br />
# Activation des connexions entrantes<br />
transport input ssh<br />
# Activation des connexions sortantes<br />
transport output ssh<br />
<br />
# Il est également possible de journaliser les évènements en rapport avec SSH lorsque l'on est connecté via ce protocole (sinon cela se fait uniquement via le port série)<br />
configure terminal<br />
ip ssh logging events<br />
</syntaxhighlight><br />
<br />
Bien que ce protocole serve principalement à établir une sessions distante à un équipements, elle ne se limite pas à ça et certaines autres fonctions peuvent êtres utilisées avec les matériels réseau de cette marque.<br />
<br />
==Authentification par clé publique==<br />
Afin de limiter considérablement les intrusions, une bonne pratique est l'utilisation de clés ''SSH'' en lieu et place d'un mot de passe pour l'authentification (et donc la connexion) d'un utilisateur.<br />
<br />
===Création de la clé===<br />
Sur une machine ''Linux'' avec [[Openssh|OpenSSH]], générer une clé ''RSA'' 4096 bits (on ne peut malheureusement pas utiliser de clés à courbes elliptiques pour ''SSH'' sur ''IOS''...) :<br />
ssh-keygen -t rsa -b 4096<br />
<br />
La clé doit être entrée tronquée à 72 caractères par ligne dans la configuration de l'équipement réseau :<br />
fold -b -w 72 ~/.ssh/id_rsa.pub<br />
<br />
''Note : le retour de cette commande devra être utilisé comme paramètre de <syntaxhighlight lang="bash" inline>key-string</syntaxhighlight> dans la section suivante (un exemple y est exposé).''<br />
<br />
{{info|Il est possible d'afficher l'empreinte de la clé via la commande <syntaxhighlight lang="bash" inline>ssh-keygen -l -f ~/.ssh/id_rsa.pub</syntaxhighlight>.}}<br />
<br />
===Injection de la clé===<br />
Sur ''IOS'', la clé précédemment créée doit être injecté pour un utilisateur en particulier. Elle servira à la connexion sans mot de passe utilisateur (une phrase de passe peut être définie sur la clé elle-même).<br />
<br />
<syntaxhighlight lang="bash"><br />
ip ssh pubkey-chain<br />
username <utilisateur><br />
key-string<br />
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCum86GEuj2OA23LWMUX+jExuLhbhGNDijv<br />
TZG3wtfObh5PSoLHXAq7CeKAb+bpqr17IXXcaBeAKnX+IFEOlq4iTslfjcBaDuzi5fi+o62k<br />
1kr0gM4/lK9FCsDFShtkUf29+wIe9JXolaEFXnq49ErsouSkll71l78Tc2DoWIZGKvRbNqDN<br />
kfRA1a50dNga/10WxuANqvlIdOyuS2koO/FeopFgADWH69GRSOlsv7NvHRUXj+kzLpQfoJvL<br />
sYk2yyhcAI0zWCSwy1cCMeUIsfxQGZW+jf3w6ronAorw9iz8A8IItXoQRrVOYddZXmOSBxBs<br />
jP4aFn9HSsDv+SY43xnRl5oj/1iveVwPah1V2exzZgRmFfMSygDx4fPIelQdaq/o4kA2fqHD<br />
bQhO2w2hUciYsbTx4zs4MoGfGFfhK0rBOX8FMf+1bNBORrQu2HbbwRdhEMrQ9yNMxpRKzeyP<br />
QjBDIKEOSR0muRBDk9/avCUa0l6iiaFclTumbdHhPoZkvbjkE/FjEQ4a7X3dg9BgnPi2H/Ci<br />
RzrwZm+C/WAqubsmVbig/oSiB/vI4qf0ckyhWa9ntq3pene82/2B4vj2sv4IfMp6+yMsfK4A<br />
OHdRtQie94Fkrt9hXVQsWoTedKr03U6nwbjOtso8MxHbN9uEU3eOAg9PWKO0P/MtLZ5VEpDq<br />
kw== root@debian<br />
dxpSoWLwQPvRDqHjuADR<br />
exit<br />
exit<br />
exit<br />
</syntaxhighlight><br />
<br />
Cette clé peut être visualisée avec la commande suivante :<br />
show running-config | section pubkey<br />
<br />
===Source de la section===<br />
* https://networklessons.com/uncategorized/ssh-public-key-authentication-cisco-ios<br />
<br />
=Transferts de fichiers via SSH=<br />
Les transferts de fichiers au travers d'''SSH'' permettent un échange chiffré de données. ''IOS'' gère [https://fr.wikipedia.org/wiki/Secure_copy Secure Copy] (''SCP''), un protocole se basant sur ''UNIX BSD'' [https://fr.wikipedia.org/wiki/Rcp_(Unix) RCP] et utilisant ''SSH'' pour le chiffrement. Il faut au préalable avoir activé ce dernier pour que ''SCP'' fonctionne.<br />
<br />
Une petite précision qui a son importance. L'implémentation d'''SCP'' dans ''IOS'' ne gère pas la récursivité (<syntaxhighlight lang="bash" inline>-r</syntaxhighlight>) contrairement à son homologue UNIX/Linux. Si vous avez un répertoire à transférer, baaah, bon courage...<br />
<br />
==En tant que client==<br />
L'utilitaire ''copy'' permet d'initier des transferts avec un serveur. En voici la syntaxe :<br />
copy <fichier_source> scp://<utilisateur>@<adresse>:<destination><br />
<br />
{{attention|La ''<destination>'' doit être précédée de deux <syntaxhighlight lang="bash" inline>/</syntaxhighlight> dans le cas d'un chemin partant de la racine distante.<br />
copy flash:/c3560cx-universalk9-mz.152-4.E5/c3560cx-universalk9-mz.152-4.E5.bin scp://toto@192.168.1.10://tmp/<br />
}}<br />
<br />
==En tant que serveur==<br />
Afin de réceptionner des transferts initiés par un hôte distant, ''Cisco IOS'' intègre un module serveur [https://fr.wikipedia.org/wiki/Secure_copy Secure Copy] (''SCP''). Pour l'activer, rien de plus simple :<br />
ip scp server enable<br />
<br />
{{Astuce|Depuis un client ''OpenSSH'', il faudra user de la syntaxe suivante : <syntaxhighlight lang="bash" inline>scp c3560cx-universalk9-mz.152-7.E2.bin toto@192.168.1.53:c3560cx-universalk9-mz.152-7.E2/c3560cx-universalk9-mz.152-7.E2.bin</syntaxhighlight> ou bien en précisant les paramètres cryptographiques ainsi que le périphérique de destination: <syntaxhighlight lang="bash" inline>scp -oKexAlgorithms=+diffie-hellman-group1-sha1 -c aes128-cbc c3560cx-universalk9-mz.152-7.E2.bin toto@192.168.1.53:flash:/c3560cx-universalk9-mz.152-7.E2/c3560cx-universalk9-mz.152-7.E2.bin</syntaxhighlight>. Notez bien que le nom final du fichier doit être précisé en destination, sous peine d'avoir un avortement de la connexion avec le message '''''ETAlost connection'''''. Aucun '''''/''''' ne doit être précisé au début du chemin.}}<br />
<br />
=Connexion depuis OpenSSH=<br />
Pour des raisons de sécurité, avec les versions d'[[Openssh|OpenSSH]] récentes, les suites cryptographiques utilisées par ''IOS'' ne correspondent pas à celles définies dans la configuration par défaut du célèbre client libre (depuis ''GNU/Linux Debian'' >= ''Jessie''). En effet, comme à son habitude, ''Cisco'' est à la traîne dans le support des standards. Les algorithmes tant de chiffrement que de signature supportés sont complètements obsolètes (car dangereux) et sortis des recommandations internationales depuis plus de 10 ans (N'utilisez pas le ''SSH'' des équipements de cette marque depuis Internet) ! Il est possible de fixer manuellement ce paramètre sur l'équipement réseau (si supporté par votre modèle) et de préciser au client quel algorithme utiliser pour la connexion. Enfin, avec les modèles derniers cris, ces problèmes ne devraient pas se manifester (chez ''Cisco'', la "sécurité", ça se paie).<br />
<br />
==Sur IOS==<br />
Afin de définir la suite cryptographique que l'on souhaite utiliser lors des sessions ''SSH'', on peut utiliser la commande [https://community.cisco.com/t5/switching/ssh-error-message-quot-no-matching-ciphers-found-quot/td-p/3373105 suivante] en mode "configuration" :<br />
ip ssh server algorithm encryption aes256-cbc aes192-cbc aes128-cbc<br />
<br />
''Note : les algorithmes sont visibles avec le traditionnel <syntaxhighlight lang="bash" inline>?</syntaxhighlight>.''<br />
<br />
==Sur OpenSSH==<br />
===Client OpenSSH===<br />
====Dans la commande====<br />
ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -c aes128-cbc <utilisateur>@<adresse><br />
<br />
====Dans la configuration====<br />
Il est également possible de préciser au client d'utiliser cette configuration directement dans [https://unix.stackexchange.com/questions/340844/how-to-enable-diffie-hellman-group1-sha1-key-exchange-on-debian-8-0 son fichier]. Ainsi, la commande standard pourra être utilisée de façon transparente.<br />
vim ~/.ssh/config<br />
<br />
<syntaxhighlight lang="bash"><br />
Host 10.0.0.1<br />
KexAlgorithms +diffie-hellman-group1-sha1<br />
</syntaxhighlight><br />
<br />
===Serveur OpenSSH===<br />
Si c'est le matériel réseau qui doit se connecter au ''Linux'', il faut éditer la configuration du service ''SSHd'' et ajouter les deux algorithmes supportés par ''IOS'' tout en conservant ceux par défaut (afin de continuer à pouvoir se connecter au serveur) :<br />
<br />
<syntaxhighlight lang="bash"><br />
echo -e "Ciphers +aes128-cbc\nKexAlgorithms +diffie-hellman-group1-sha1" >> /etc/ssh/sshd_config<br />
systemctl restart ssh.service<br />
</syntaxhighlight><br />
<br />
Vous pouvez en afficher la liste exhaustive avec les commandes suivantes :<br />
<br />
ssh -Q server<br />
ssh -Q kex<br />
<br />
Afin de vous éviter le supplice de faire des copier/coller dans tous les sens en supprimant les retours chariots et en joutant des virgules pour les ajouter dans la configuration, vous pouvez utiliser les scripts suivants dans l'ordre respectif :<br />
<br />
<syntaxhighlight lang="bash"><br />
for i in $(ssh -Q cipher); do suite=$suite$(echo "${i}," | tr -d "\n"); done; echo "${suite%?}"<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="bash"><br />
for i in $(ssh -Q kex); do suite=$suite$(echo "${i}," | tr -d "\n"); done; echo "${suite%?}"<br />
</syntaxhighlight><br />
<br />
Enfin, il est possible de [https://unix.stackexchange.com/questions/333728/ssh-how-to-disable-weak-ciphers lister les valeurs] actuellement appliquées au service ''SSHd'' :<br />
<br />
sshd -T | grep ciphers<br />
sshd -T | grep kex</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=P%C3%A2tes_%C3%A0_l%27eau&diff=1474Pâtes à l'eau2023-08-01T17:36:31Z<p>Ycharbi : Correction d'une faute de frappe</p>
<hr />
<div>[[Category:plats]]<br />
Plat de base de l'alimentation masculine, cette recette est simple et rapide à préparer. Elles peuvent servir de composant a une recette plus complexe ou simplement être dressées avec une sauce différente afin de faire varier les plaisirs.<br />
<br />
{| class="wikitable"<br />
! Préparation !! Cuisson !! Par portion<br />
|-<br />
| N/A || ~12 minutes || N/C<br />
|}<br />
<br />
=Ingrédients=<br />
Pour une personne :<br />
* 100g de pâtes crues<br />
* 1L d'eau<br />
* 7g de gros sel<br />
<br />
=Ustensiles=<br />
* Casserole<br />
<br />
=Recette=<br />
# Commencez par mettre l'eau à bouillir.<br />
# À la première ébullition, verser le sel dans l'eau suivi des pâtes.<br />
# Touiller régulièrement.<br />
# Goûter la préparation afin d'estimer si la cuisson est suffisante.<br />
<br />
=Liens=<br />
https://cuisine.journaldesfemmes.fr/astuces-termes-et-tournemains/1195857-comment-faire-cuire-des-pates/</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Macsec_-_linux&diff=1473Macsec - linux2023-07-23T14:37:12Z<p>Ycharbi : Page créée avec « Category:Réseaux_linux ''MACsec'' ou [https://fr.wikipedia.org/wiki/IEEE_802.1AE IEEE 802.1AE] est la norme de sécurisation de la [https://fr.wikipedia.org/wiki/Couche_liaison_de_donn%C3%A9es couche] [https://fr.wikipedia.org/wiki/Media_access_control MAC] de l{{'}}[https://fr.wikipedia.org/wiki/IEEE IEEE]. Il permet le chiffrement des trames ''Ethernet'' (entre deux pairs sur un [https://fr.wikipedia.org/wiki/R%C3%A9seau_local LAN]) au sein d'un même réseau... »</p>
<hr />
<div>[[Category:Réseaux_linux]]<br />
<br />
''MACsec'' ou [https://fr.wikipedia.org/wiki/IEEE_802.1AE IEEE 802.1AE] est la norme de sécurisation de la [https://fr.wikipedia.org/wiki/Couche_liaison_de_donn%C3%A9es couche] [https://fr.wikipedia.org/wiki/Media_access_control MAC] de l{{'}}[https://fr.wikipedia.org/wiki/IEEE IEEE]. Il permet le chiffrement des trames ''Ethernet'' (entre deux pairs sur un [https://fr.wikipedia.org/wiki/R%C3%A9seau_local LAN]) au sein d'un même réseau local et, par extension, dans n'importe quel protocole d{{'}}[[:Category:Tunnelisation|encapsulation en surcouche]] de niveau 2.<br />
<br />
Publié en 2006 (''802.1AE-2006''), la norme prévoyait un chiffrement des trames via le protocole ''GCM-AES-128'' (128 bits) et un amendement de 2011 (''802.1AEbn-2011'') a apporté le support des clés de 256 bits. Il a par la suite été complété en 2013 (''802.1AEbw-2013'') par l'ajout des suites cryptographiques ''GCM-AES-XPN-128'' et ''GCM-AES-XPN-256''. Intégré depuis le noyau ''Linux'' 4.6 (2016), ''IEEE 802.1AE'' est utilisable via le paquet <syntaxhighlight lang="bash" inline>iproute2</syntaxhighlight>.<br />
<br />
''MACSec'' vient se substituer à la trame ''Ethernet'' standard en reprenant ses champs d'origines et en y ajoutant deux supplémentaires :<br />
* '''Security Tag''' : extension du champ [https://fr.wikipedia.org/wiki/EtherType EtherType]<br />
* '''Message Authentication Code''' (''Integrity Check Value'' ou ''ICV'') : somme de contrôle de la trame déchiffrée<br />
<br />
Une trame 802.1Q passe donc de la structure :<br />
{| class="wikitable"<br />
<br />
|-----<br />
| adresse MAC dst.<br />
| adresse MAC src.<br />
| 802.1Q<br />
| EtherType/Size<br />
| Data <br />
| [https://fr.wikipedia.org/wiki/Frame_check_sequence FCS]<br />
|}<br />
<br />
à la suivante :<br />
{| class="wikitable"<br />
|-----<br />
| colspan="6" align="center" | Authentifié || || <br />
|-----<br />
|| || || || colspan="3" align="center" | Chiffré || || <br />
|-----<br />
| adresse MAC dst.<br />
| adresse MAC src.<br />
| MACSec Security Tag<br />
| 802.1Q<br />
| EtherType/Size<br />
| Data <br />
| ICV<br />
| FCS<br />
|}<br />
<br />
=Mise en œuvre=<br />
Deux machines seront utilisées dans l'exemple qui suit. Elles comportent chacune les adresses ''MAC'' suivantes :<br />
* '''Machine 1''' : 44:9a:5b:fe:64:cc<br />
* '''Machine 2''' : 44:9a:5b:ea:2b:08<br />
<br />
==Machine 1==<br />
Création de l'interface virtuel de chiffrement du trafic<br />
ip link add link eth0 macsec0 type macsec encrypt on<br />
<br />
Dans la mesure où les trames sont bornées au domaine de diffusion local d'une interface existante, celle nouvellement créée y est attachée et sera à utiliser lorsque les trames devront êtres chiffrées avant envoi (la communication sortant directement d{{'}}''eth0'' est toujours en clair).<br />
<br />
La commande suivante détail les informations des interfaces ''MACSec''. Plusieurs appairages chiffrés peuvent êtres configurés afin de réaliser une topologie en étoile confidentielle<br />
ip macsec show<br />
<br />
Retour de la commande<br />
<br />
<syntaxhighlight lang="bash"><br />
3: macsec0: protect on validate strict sc off sa off encrypt on send_sci on end_station off scb off replay off <br />
cipher suite: GCM-AES-128, using ICV length 16<br />
TXSC: 449a5bfe64cc0001 on SA 0<br />
offload: off <br />
</syntaxhighlight><br />
<br />
Ajout d'un pair<br />
ip macsec add macsec0 rx port 1 address 44:9a:5b:ea:2b:08<br />
<br />
ip macsec show<br />
<br />
Une ligne <syntaxhighlight lang="bash" inline>RXSC</syntaxhighlight> a été ajouté<br />
<br />
<syntaxhighlight lang="bash"><br />
3: macsec0: protect on validate strict sc off sa off encrypt on send_sci on end_station off scb off replay off <br />
cipher suite: GCM-AES-128, using ICV length 16<br />
TXSC: 449a5bfe64cc0001 on SA 0<br />
RXSC: 449a5bea2b080001, state on<br />
offload: off<br />
</syntaxhighlight><br />
<br />
Création d'une clé destinée au chiffrement symétrique<br />
dd if=/dev/urandom count=16 bs=1 2>/dev/null | hexdump | cut -c 9- | tr -d ' \n'<br />
<br />
Attribution de cette clé dans la configuration d'appairage avec la machine 2 pour l'interface <syntaxhighlight lang="bash" inline>macsec0</syntaxhighlight><br />
ip macsec add macsec0 tx sa 0 pn 1 on key 00 a150a57510be82fc8c732aa899a28c17<br />
<br />
Injection de la clé du pair dans cette même configuration<br />
ip macsec add macsec0 rx port 1 address 44:9a:5b:ea:2b:08 sa 0 pn 1 on key 01 ff4c9f44769823abe910326dd8cc8d77<br />
<br />
Allumage de l'interface<br />
ip link set macsec0 up<br />
<br />
Comme précisé plus haut, le trafic ne sera chiffré entre les deux pairs que si l'interface source de l'échange est <syntaxhighlight lang="bash" inline>macsec0</syntaxhighlight>, aussi, il convient de lui attribuer une adresse ''IP''<br />
ip address add macsec0 10.0.0.1/24 dev macsec0<br />
<br />
==Machine 2==<br />
Les étapes sont les mêmes en adaptant les spécificités liées au pair différent<br />
<br />
ip link add link eth0 macsec0 type macsec encrypt on<br />
ip macsec add macsec0 rx port 1 address 44:9a:5b:fe:64:cc<br />
<br />
dd if=/dev/urandom count=16 bs=1 2>/dev/null | hexdump | cut -c 9- | tr -d ' \n'<br />
ip macsec add macsec0 tx sa 0 pn 1 on key 01 ff4c9f44769823abe910326dd8cc8d77<br />
ip macsec add macsec0 rx port 1 address 44:9a:5b:fe:64:cc sa 0 pn 1 on key 00 a150a57510be82fc8c732aa899a28c17<br />
<br />
ip link set macsec0 up<br />
ip address add macsec0 10.0.0.2/24 dev macsec0<br />
<br />
=Sources=<br />
* https://developers.redhat.com/blog/2016/10/14/macsec-a-different-solution-to-encrypt-network-traffic<br />
* https://www.man7.org/linux/man-pages/man8/ip-macsec.8.html<br />
* https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9200/software/release/16-10/configuration_guide/sec/b_1610_sec_9200_cg/macsec_encryption.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Debmirror&diff=1472Debmirror2023-07-18T20:19:04Z<p>Ycharbi : Remplacement de la balise "source" obsolète + ajout d'un chevron redirecteur dans le script de synchronisation des dépôts principaux afin de ne pas tronquer le début du journal</p>
<hr />
<div>[[Category:miroir_apt]]<br />
''Debmirror'' permet de réaliser un miroir des dépôts ''Debian'' en utilisant le protocole [[Rsync]] à l'image de [[Ftpsync]]. La différence majeure qui le distingue de celui-ci est sa capacité à sélectionner les branches à synchroniser. Il n'est donc pas destiné à faire un miroir complet du dépôt distant (même s'il le permet tout à fait). L'outil est plus adapté à la mise à disposition des paquets nécessaires au fonctionnement des machines de votre réseau local. Il leur permettra d'avoir accès aux paquets dont elles ont besoin sans avoir à interroger de serveur sur Internet. De par sa capacité à discriminer les branches à copier, il est plus économe en espace disque ainsi qu'en bande passante lors des opérations de synchronisation. À titre d'exemple, voici la place occupée par le résultat de ce document au 29/12/2020 :<br />
<br />
root@debmirror:~# du -hs /var/www/dépôts/*<br />
152G /var/www/dépôts/debian<br />
11G /var/www/dépôts/debian-security<br />
<br />
=Installation et préparation=<br />
Comme à notre habitude lors de la mise en place de ce type d'outil, nous mettrons à disposition les paquets téléchargés via [[Apache2]] et automatiserons la synchronisation avec [[Cron]].<br />
<br />
==Préparation de l'environnement==<br />
'''Installation des dépendances'''<br />
apt install --no-install-recommends apache2 debmirror debian-keyring cron<br />
<br />
'''Création d'un utilisateur dédié à la synchronisation'''<br />
useradd --system --home-dir /var/www/dépôts/ --user-group debmirror<br />
<br />
'''Création des répertoires d'accueil'''<br />
mkdir -p /var/www/dépôts/{debian,debian-security} /var/log/debmirror/<br />
<br />
==Configuration d'Apache==<br />
'''Création de l'hôte virtuel'''<br />
vim /etc/apache2/sites-available/debmirror.conf<br />
<br />
<syntaxhighlight lang="apache"><br />
<VirtualHost *:80><br />
<br />
ServerAdmin webmaster@localhost<br />
DocumentRoot /var/www/dépôts/<br />
<br />
<Directory /> <br />
Options FollowSymLinks <br />
AllowOverride none <br />
Order allow,deny <br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error-debmirror.log<br />
CustomLog ${APACHE_LOG_DIR}/access-debmirror.log combined<br />
<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
'''Désactivation de l'hôte virtuel par défaut'''<br />
a2dissite 000-default.conf<br />
<br />
'''Activation du nouveau et rechargement du service'''<br />
a2ensite debmirror.conf<br />
systemctl reload apache2.service<br />
<br />
==Configuration de debmirror==<br />
L'outil a besoin d'un fichier de configuration par dépôt à synchroniser. Nous en créerons donc deux : un pour le dépôt ''debian'', l'autre pour ''debian-security'', le tout en ''amd64''. Je ne synchroniserai que les branches ''main'', ''contrib'', ''non-free'' et ''main/debian-installer'' pour le premier dépôt ainsi que ''buster/updates'' pour le deuxième.<br />
<br />
vim /usr/local/bin/debmirror_debian<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/bash<br />
<br />
# Définition des variables pour Debian<br />
hote="ftp.fr.debian.org"<br />
racine="debian/"<br />
methode="rsync" # au choix ftp|http|https|rsync<br />
<br />
distributions="buster,buster-updates,sid"<br />
sections="main,contrib,non-free,main/debian-installer"<br />
<br />
cible="/var/www/dépôts/debian/"<br />
architecture="amd64" # « i386,amd64 »<br />
<br />
jour_semaine=$(date +%u)<br />
<br />
echo "--- Début de la synchronisation le $(date +%x) à $(date +%T) ---" > /var/log/debmirror/debmirror."${jour_semaine}".log<br />
<br />
# Commande pour synchroniser le miroir avec Debian<br />
/usr/bin/debmirror --nosource --passive --method="${methode}" \<br />
--root="${racine}" --dist="${distributions}" --host="${hote}" \<br />
--section="${sections}" --arch="${architecture}" "${cible}" \<br />
--getcontents --keyring /usr/share/keyrings/debian-archive-keyring.gpg \<br />
--i18n --postcleanup --progress --rsync-extra=doc,tools --diff=none >> /var/log/debmirror/debmirror."${jour_semaine}".log<br />
<br />
# Commande pour obtenir le sous répertoire "installer-amd64" (facultatif). Je n'ai pas trouvé une autre façon de faire...<br />
rsync -a "${hote}"::debian/dists/buster/main/installer-amd64 "${cible}"/dists/buster/main/<br />
<br />
echo "--- Fin de la synchronisation à $(date +%T) ---" >> /var/log/debmirror/debmirror."${jour_semaine}".log<br />
</syntaxhighlight><br />
<br />
vim /usr/local/bin/debmirror_debian-security<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/bash<br />
<br />
# Définition des variables pour Debian<br />
hote="ftp.fr.debian.org"<br />
racine="debian-security"<br />
methode="rsync"<br />
<br />
distributions="buster/updates"<br />
sections="main,contrib,non-free"<br />
<br />
cible="/var/www/dépôts/debian-security/"<br />
architecture="amd64"<br />
<br />
jour_semaine=$(date +%u)<br />
<br />
echo "--- Début de la synchronisation le $(date +%x) à $(date +%T) ---" > /var/log/debmirror/debmirror-security."${jour_semaine}".log<br />
<br />
# Commande pour synchroniser le mirroir avec Debian<br />
/usr/bin/debmirror --nosource --passive --method="${methode}" \<br />
--root="${racine}" --dist="${distributions}" --host="${hote}" \<br />
--section="${sections}" --arch="${architecture}" "${cible}" \<br />
--getcontents --keyring /usr/share/keyrings/debian-archive-keyring.gpg \<br />
--i18n --postcleanup --progress --diff=none >> /var/log/debmirror/debmirror-security."${jour_semaine}".log<br />
<br />
echo "--- Fin de la synchronisation à $(date +%T) ---" >> /var/log/debmirror/debmirror-security."${jour_semaine}".log<br />
</syntaxhighlight><br />
<br />
'''Attribution des droits'''<br />
chmod ug+x /usr/local/bin/debmirror_debian /usr/local/bin/debmirror_debian-security<br />
chown -R debmirror:debmirror /var/www/dépôts /var/log/debmirror /usr/local/bin/debmirror_debian*<br />
<br />
=Synchronisation du miroir=<br />
Il convient désormais de lancer une synchronisation. Prennez en compte que cette étape va prendre un certain temps au vu de la quantité de données à rappatrier. Sachez également que le serveur ''ftp.fr.debian.org'' limite les téléchargements aux environs de 10Mo/s.<br />
<br />
'''Dépôt debian'''<br />
su - debmirror -c '/usr/local/bin/debmirror_debian'<br />
<br />
'''Dépôt debian-security'''<br />
su - debmirror -c '/usr/local/bin/debmirror_debian-security'<br />
<br />
=Automatisation=<br />
Afin de maintenir un miroir à jour, la mise en place d'une synchronisation automatique et périodique s'impose. Les dépôts ''Debian'' se répliques quatres fois par jours. Nous en ferrons de même.<br />
<br />
'''Création de la crontab'''<br />
<br />
crontab -e -u debmirror<br />
<br />
00 4,10,16,22 * * * /usr/local/bin/debmirror_debian 2>&1<br />
10 4,10,16,22 * * * /usr/local/bin/debmirror_debian-security 2>&1<br />
<br />
=Sources=<br />
* https://www.carta.tech/man-pages/man1/debmirror.1.html<br />
* http://wiki.dane.ac-versailles.fr/index.php?title=Utiliser_debmirror<br />
* https://lists.debian.org/debian-user/2008/09/msg00267.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Gestion_des_utilisateurs_windows&diff=1471Gestion des utilisateurs windows2023-07-18T20:16:15Z<p>Ycharbi : Remplacement de la balise "source" obsolète</p>
<hr />
<div>[[Category:windows]]<br />
<br />
Cette documentation traite de la gestion locale des utilisateurs sous les systèmes d'exploitation Windows. Elle est très majoritairement issue de la [[#Source|source cité en pied de page]].<br />
<br />
=Net user=<br />
La commande <syntaxhighlight lang="bash" inline>net user</syntaxhighlight> permet de gérer les utilisateurs sous Windows indépendamment de la version/édition du système (méthode universelle). Elle a le mérite de fonctionner quand l'interface graphique sort l'habituel message d'impossibilité que les Windowsiens connaissent bien...<br />
<br />
==Lister les utilisateurs==<br />
Lister tout les utilisateurs du système:<br />
net user<br />
<br />
==Création d'un utilisateur==<br />
Création de l'utilisateur "toto" avec comme mot de passe "toto123":<br />
net user toto toto123 /add<br />
<br />
==Changement de mot de passe==<br />
Changement du mot de passe de l'utilisateur "toto":<br />
net user toto toto456<br />
<br />
==Suppression de l'utilisateur==<br />
Suppression de l'utilisateur "toto":<br />
net user toto /del<br />
<br />
=Net localgroup=<br />
La commande <syntaxhighlight lang="bash" inline>net localgroup</syntaxhighlight> permet de gérer l'appartenance d'un utilisateur à un groupe. Cette commande ne permet à priori pas de créer un groupe.<br />
<br />
==Lister les groupes==<br />
Pour lister tous les groupes utilisateurs du système:<br />
net localgroup<br />
<br />
==Mettre un utilisateur dans un groupe==<br />
Pour mettre l'utilisateur "toto" dans le groupe "Administrateur":<br />
net localgroup Administrateurs toto /add<br />
<br />
On peut également en mettre plusieurs dans un même groupe via la même commande:<br />
net localgroup Administrateurs toto titi tata /add<br />
<br />
==Retirer un utilisateur d'un groupe==<br />
Pour retirer un utilisateur d'un groupe, faire ceci:<br />
net localgroup Administrateurs toto /delete<br />
<br />
On peut le faire pour une liste d'utilisateurs comme pour l'ajout:<br />
net localgroup Administrateurs toto titi tata /delete<br />
<br />
=Net accounts=<br />
La commande <syntaxhighlight lang="bash" inline>net accounts</syntaxhighlight> permet de définir les paramètres de session des utilisateurs.<br />
<br />
Les paramètres possibles sont:<br />
* '''/forcelogoff''': ''{ minutes | no }'': Définit le temps en minute d’inactivité. Avant que la session ne se ferme tout seul, la valeur par défaut est ''no''.<br />
* '''/minpwlen''': ''longueur'': Définit le minimum de caractères pour le mot de passe d’un utilisateur. La valeur par défaut est ''6''.<br />
* '''/maxpwage''': ''{ jours | unlimited }'': Définit le temps en jour de la validité d’un mot de passe. ''unlimited'' indique aucun délai. La valeur de '''/maxpwage''' doit être supérieure à '''/minpwage'''. L’intervalle est définit entre ''1'' et ''49,710 jours''. La valeur par défaut est ''90 jours''.<br />
* '''/minpwage''': ''jours'': Définit le nombre de jours minimaux avant qu’un utilisateur puisse définir un nouveau mot de passe. Par défaut, aucun délai n’est configuré.<br />
* '''/uniquepw''': ''nombre'': Définit le nombre minimal de changement de mot de passe avant qu’un utilisateur puisse réutiliser un mot de passe déjà utilisé auparavant. L’intervalle est ''0'' à ''24'' mots de passe, par défaut la valeur est à ''5''.<br />
* '''/domain''': indique le domaine Windows à utiliser, si non spécifié, Windows utilisera le ''nom d’ordinateur local''.<br />
<br />
Il est possible d'utiliser cette commande pour empêcher les comptes de changer les mots de passe au minimum tous les 7 jours, les à changer leur mots de passe tous les 30 jours, et forcer la fermeture de session après 5 minutes d’inactivité:<br />
net accounts /minpwage:7 /maxpwage:30 /forcelogoff:5<br />
<br />
=Gestion via WMIC=<br />
WMIC (Windows Management Instrumentation Command-line) est une extension WMI qui permet d’interroger ce dernier en ligne de commandes de Windows.<br />
<br />
==Lister les utilisateurs==<br />
wmic useraccount<br />
<br />
pour une liste plus complète avec tous les détails :<br />
wmic useraccount list full<br />
<br />
==Renommer un utilisateur==<br />
wmic useraccount where name='nomutilisateur' rename nouveaunomutilisateur<br />
<br />
Il est possible de verrouiller/déverrouiller un utilisateur ou modifier l’expiration de mots de passe comme avec <syntaxhighlight lang="bash" inline>net accounts</syntaxhighlight>:<br />
wmic useraccount where "name='nomutilisateur'" set passwordexpires=FALSE<br />
<br />
==Source de la section==<br />
* https://www.malekal.com/tutoriel-wmic/#Gestion_des_utilisateurs<br />
<br />
=Gestion via PowerShell=<br />
Lister les utilisateurs via Powershell:<br />
get-wmiobject win32_useraccount<br />
<br />
Je ne suis pas aller plus loin. Voir la [https://www.malekal.com/gestion-utilisateurs-windows-en-ligne-de-commandes/#Gerer_les_utilisateurs_en_Powershell source de la section] pour plus de détails.<br />
<br />
=Source=<br />
* https://www.malekal.com/gestion-utilisateurs-windows-en-ligne-de-commandes/</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Transition_AHCI_-_windows&diff=1470Transition AHCI - windows2023-07-18T20:15:08Z<p>Ycharbi : </p>
<hr />
<div>[[Category:Windows_8]]<br />
[[Category:Windows_8.1]]<br />
<br />
Lorsque l'on passe un contrôleur ''SATA'' du mode ''IDE'' au mode ''AHCI'' et que ''Windows'' a été installé depuis le mode ''IDE'', il faut effectuer une action particulière pour ne pas obtenir un ''kernel panic'' (c'est bien développé n'es pas ?). À ma connaissance, il existe deux façons de faire:<br />
<br />
* Via le [[mode sans échec|mode ''sans échec'']]<br />
* Via la ''base de registre''<br />
<br />
J'ai une préférence pour le mode ''sans échec''. C'est donc cette méthode que j'ai utilisé (j'ai déjà utilisé l'autre il y a longtemps mais je ne l'ai pas refaite, je ne garanti pas son fonctionnement avec cette procédure).<br />
<br />
=Via le mode sans échec=<br />
'''Testé''':<br />
# Exécuter une ''cmd'' en administrateur<br />
# Activer le mode ''sans échec'' au démarrage (équivalent de l'entrée par défaut dans GRUB j'imagine): <syntaxhighlight lang="bash" inline>bcdedit /set {current} safeboot minimal</syntaxhighlight><br />
# Redémarrer le PC et passer le contrôleur ''SATA'' en ''AHCI'' dans le BIOS (enregistrer et redémarrer)<br />
# Windows va se lancé automatiquement en mode ''sans échec''<br />
# Relancer une ''cmd'' en administrateur<br />
# Exécuter cette commande pour réactiver le démarrage normal: <syntaxhighlight lang="bash" inline>bcdedit /deletevalue {current} safeboot</syntaxhighlight><br />
# Redémarrer encore une fois et c'est bon. Le tout est en ''AHCI'' sans plantages.<br />
<br />
==Source de la section==<br />
* https://www.tenforums.com/drivers-hardware/15006-attn-ssd-owners-enabling-ahci-mode-after-windows-10-installation.html<br />
<br />
=Via la base de registre=<br />
'''Non testé''':<br />
# Lancer <syntaxhighlight lang="bash" inline>regedit.exe</syntaxhighlight><br />
# Aller dans <syntaxhighlight lang="bash" inline>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci</syntaxhighlight><br />
# Passer sa valeur à <syntaxhighlight lang="bash" inline>0</syntaxhighlight><br />
# Aller dans <syntaxhighlight lang="bash" inline>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\pciide</syntaxhighlight><br />
# Passer sa valeur à <syntaxhighlight lang="bash" inline>0</syntaxhighlight><br />
# Redémarrer le PC et passer le contrôleur ''SATA'' en ''AHCI'' dans le BIOS (enregistrer et redémarrer)<br />
# Redémarrer encore une fois et c'est bon. Le tout est en ''AHCI'' sans plantages.<br />
<br />
==Source de la section==<br />
* http://www.tplpc.com/faq/passer-de-ide-ahci-sans-reinstaller-windows-7-02240.html</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Mode_sans_%C3%A9chec&diff=1469Mode sans échec2023-07-18T20:12:52Z<p>Ycharbi : </p>
<hr />
<div>[[Category:Windows_8]]<br />
[[Category:Windows_8.1]]<br />
<br />
Voici 5 façons de démarrer en mode ''sans échec'' avec ''Windows 8'' (c'est fou que les devs aient pensés à autant de façon pour réagir face aux "échecs" de Windows...). Cette documentation est une retranscription de [https://answers.microsoft.com/fr-fr/windows/forum/windows8_1-update/mode-sans-%c3%a9chec-windows-8-et-81/49609ab5-8cc7-4d92-bcea-22c954f39957 ce document].<br />
<br />
{{attention|Je n'ai pas testé ces techniques. Elles sont notés pour y avoir un accès rapide et je corrigerai à la volé si besoin.}}<br />
<br />
=Méthode historique avec F8=<br />
Par défaut, la méthode classique d'entrée dans le mode sans échec (via la touche <syntaxhighlight lang="bash" inline>F8</syntaxhighlight>) est désactivée dans les nouvelles versions de Windows (cela devait être trop efficace et cela faisait donc tâche...).<br />
<br />
* Allez dans l'Explorateur Windows et cliquer sur <syntaxhighlight lang="bash" inline>C:\</syntaxhighlight> ensuite sur '''Fichier''' et cliquer '''Ouvrir l'invite de Commandes''' et prendre '''Ouvrir l'invite de commandes en tant qu'administrateur'''.<br />
* Mettre la ligne: <syntaxhighlight lang="bash" inline>bcdedit /set {default} bootmenupolicy legacy</syntaxhighlight><br />
* Redémarrer et le mode ''sans échec'' <syntaxhighlight lang="bash" inline>F8</syntaxhighlight> fonctionne comme avec ''Windows 7''.<br />
<br />
Faire ceci pour revenir comme avant:<br />
<br />
* Allez dans l'Explorateur Windows et cliquer sur <syntaxhighlight lang="bash" inline>C:\</syntaxhighlight> ensuite sur '''Fichier''' et cliquer '''Ouvrir l'invite de Commandes''' et prendre '''Ouvrir l'invite de commandes en tant qu'administrateur'''.<br />
* Mettre la ligne: <syntaxhighlight lang="bash" inline>bcdedit /set {default} bootmenupolicy standard</syntaxhighlight><br />
<br />
=Méthode avec une autre touche=<br />
==Avec la touche Maj==<br />
Redémarrer '''Windows 8''' en tenant la touche <syntaxhighlight lang="bash" inline>Maj</syntaxhighlight> enfoncée.<br />
<br />
Une fois redémarrer, cliquer sur l'option '''Dépannage''' > '''Options avancées''' > '''Paramètres''' > '''Redémarrer''' et choisir le numéro correspondant à ce que vous cherchez comme mode ''sans échec'':<br />
* <syntaxhighlight lang="bash" inline>F4</syntaxhighlight> pour démarrer en mode ''sans échec'' sans prise en charge réseau<br />
* <syntaxhighlight lang="bash" inline>F5</syntaxhighlight> pour démarrer en mode ''sans échec'' avec prise en charge du réseau<br />
* <syntaxhighlight lang="bash" inline>F6</syntaxhighlight> pour démarrer en mode ''sans échec'' avec invite de commandes<br />
<br />
==Avec la barre des charmes==<br />
{{info|La barre des charmes est le nom du menu latéral droit de l'interface Windows. Elle apparaît lors du passage de la souris sur le coté droit de l'écran.}}<br />
<br />
Faire apparaître la barre des charmes > '''Paramètres''' > '''Modifier les paramètres du PC'''.<br />
<br />
{{astuce|Vous pouvez avoir accès à la barre des Charmes via la touches <syntaxhighlight lang="bash" inline>Windows + i</syntaxhighlight>}}<br />
<br />
* Pour ''Windows 8'' : Dans le menu, cliquer sur '''Général''' et en bas de page sur l'option '''Démarrage avancé''' et '''Redémarrer maintenant'''<br />
* Pour ''Windows 8.1'' : Dans le menu, cliquer sur '''Mise à jour et récupération''' > '''Récupération''' et en bas de page sur l'option '''Démarrage avancé''' et '''Redémarrer maintenant'''<br />
<br />
Une fois redémarré, cliquer sur l'option '''Dépannage''' > '''Options avancées''' > '''Paramètres''' > '''Redémarrer''' et choisir le numéro correspondant à ce que vous cherchez comme mode ''sans échec'':<br />
* <syntaxhighlight lang="bash" inline>F4</syntaxhighlight> pour démarrer en mode ''sans échec'' sans prise en charge réseau<br />
* <syntaxhighlight lang="bash" inline>F5</syntaxhighlight> pour démarrer en mode ''sans échec'' avec prise en charge du réseau<br />
* <syntaxhighlight lang="bash" inline>F6</syntaxhighlight> pour démarrer en mode ''sans échec'' avec invite de commandes<br />
<br />
=Méthode via un gestionnaire démarrage=<br />
* Allez dans l'Explorateur Windows et cliquer sur <syntaxhighlight lang="bash" inline>C:\</syntaxhighlight> ensuite sur '''Fichier''' et cliquer sur '''Ouvrir l'invite de Commandes''' et prendre '''Ouvrir l'invite de commandes en tant qu"administrateur'''<br />
* Écrire ou copier/coller ceci: <syntaxhighlight lang="bash" inline>bcdedit /set {bootmgr} displaybootmenu yes</syntaxhighlight><br />
* Redémarrez le système et à chaque démarrage, le menu du ''gestionnaire de démarrage Windows'' apparaît<br />
* La touche <syntaxhighlight lang="bash" inline>F8</syntaxhighlight> permet d'accéder aux '''Options de démarrage avancées''' et de choisir le mode désiré comme le ''sans échec'':<br />
** <syntaxhighlight lang="bash" inline>F4</syntaxhighlight> pour démarrer en mode ''sans échec'' sans prise en charge réseau<br />
** <syntaxhighlight lang="bash" inline>F5</syntaxhighlight> pour démarrer en mode ''sans échec'' avec prise en charge du réseau<br />
** <syntaxhighlight lang="bash" inline>F6</syntaxhighlight> pour démarrer en mode ''sans échec'' avec invite de commandes<br />
<br />
Pour revenir à la normal, faire ceci:<br />
* Allez dans l'Explorateur Windows et cliquer sur <syntaxhighlight lang="bash" inline>C:\</syntaxhighlight> ensuite sur '''Fichier''' et cliquer sur '''Ouvrir l'invite de Commandes''' et prendre '''Ouvrir l'invite de commandes en tant qu'administrateur'''<br />
* Écrire ou copier/coller ceci: <syntaxhighlight lang="bash" inline>bcdedit /set {bootmgr} displaybootmenu no</syntaxhighlight><br />
<br />
=Méthode du double démarrage=<br />
* Allez dans l'Explorateur Windows et cliquer sur <syntaxhighlight lang="bash" inline>C:\</syntaxhighlight> ensuite sur '''Fichier''' et cliquer sur '''Ouvrir l'invite de Commandes''' et prendre '''Ouvrir l'invite de commandes en tant qu'administrateur'''<br />
* Écrire ou copier/coller ceci: <syntaxhighlight lang="bash" inline>bcdedit /enum /v</syntaxhighlight> et faire '''Entrer'''<br />
* Identifier la ligne encadrée<br />
<br />
Toujours dans l'invite de commandes, mettre pour le mode ''sans échec'':<br />
* <syntaxhighlight lang="bash" inline>bcdedit / copy {Entrer les chiffres et lettres de l'encadré} /d "Windows 8 (Mode sans échec)"</syntaxhighlight> et faire '''Entrer'''<br />
<br />
ou pour le mode sans échec avec prise en charge réseau:<br />
* <syntaxhighlight lang="bash" inline>bcdedit / copy {Entrer les chiffres et lettres de l'encadré} /d "Windows 8 (Mode sans Échec avec prise en charge réseau)"</syntaxhighlight> et faire '''Entrer'''<br />
<br />
Maintenant nous allons aller dans ''Msconfig''.<br />
* Faire touche <syntaxhighlight lang="bash" inline>Windows+r</syntaxhighlight> et dans le champ, mettre: <syntaxhighlight lang="bash" inline>Msconfig</syntaxhighlight><br />
* Aller dans l'onglet '''Démarrer''' et cocher les cases: '''Démarrage sécurisé''' et sélectionner '''Minimal''' pour le mode ''sans échec'' ou '''Réseau''' selon le quel vous avez choisis.<br />
* Pour finir cocher: '''Rendre permanents tous les paramètres de démarrage'''<br />
* '''Appliquer'''<br />
* Redémarrez et vous allez avoir le menu pour choisir le mode ''sans échec''<br />
<br />
=Source=<br />
* https://answers.microsoft.com/fr-fr/windows/forum/windows8_1-update/mode-sans-%c3%a9chec-windows-8-et-81/49609ab5-8cc7-4d92-bcea-22c954f39957</div>Ycharbihttps://doc.ycharbi.fr/index.php?title=Installation_de_Windows_8_/_8.1&diff=1468Installation de Windows 8 / 8.12023-07-18T20:08:24Z<p>Ycharbi : Remplacement de la balise "source" obsolète + aération du code + correction de la mise en page de la section "Sources"</p>
<hr />
<div>[[Category:Windows_8]]<br />
[[Category:Windows_8.1]]<br />
<br />
=Éviter la clé produit=<br />
Lorsque l'on veut installer Windows 8 / 8.1, on se retrouve confronté à un problème bloquant non présent dans les anciennes version de l'OS. En effet, l'installeur exige la clé de licence du produit pour commencer l'installation. Nous allons voir comment outrepasser cet écran pour installer le système comme avant.<br />
<br />
==Méthode clé USB==<br />
* Préparer une clé USB Windows 8 avec l'utilitaire de Microsoft<br />
* Ouvrir de dossier "sources"<br />
* Créer un nouveau fichier au nom de "ei.cfg"<br />
* Éditer le fichier : <br />
[EditionID]<br />
Core<br />
[Channel] <br />
Retail<br />
[VL]<br />
0<br />
<br />
{{astuce|Remplacer '''Core''' par '''Pro''' si vous avez une version Pro de Windows 8}}<br />
* Enregistrez et profitez<br />
<br />
==Méthode création d'un ISO==<br />
Dans le cas où vous souhaitez refaire un ISO d'installation de Windows 8.1 pour le mettre sur un DVD ou pour ne pas avoir à refaire la manipulation à chaque fois, vous pouvez suivre les étapes suivante.<br />
* Télécharger l'utilitaire Windows [http://www.microsoft.com/fr-fr/download/details.aspx?id=39982 ADK 8.1 sur le site de Microsoft] ou récupérez directement le fichier depuis [https://{{SERVERNAME}}/fichiers/windows/windows_8/installation_windows_8_et_8.1/Windows_Kits.zip nos fichiers]<br />
* L'installer<br />
* Extraire le contenu de l'ISO officiel dans un dossier (C:\Windows8.1 dans mon exemple) avec un outil comme [http://www.7-zip.org/ 7zip]<br />
* Récupérez la version exacte du Windows<br />
Dism /Get-WimInfo /WimFile:C:\Windows8.1\sources\install.wim<br />
* Remplacer le "1" par un "0" pour afficher le menu de choix de licence dans le fichier <syntaxhighlight lang="bash" inline>C:\windows8.1\sources\ei.cfg</syntaxhighlight><br />
[EditionID]<br />
Professional<br />
[Channel]<br />
Retail<br />
[VL]<br />
1<br />
* Recompiler l'ISO (cmd en mode administrateur)<br />
C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\oscdimg.exe" -u2 -bC:\Windows_8.1\boot\etfsboot.com C:\Windows_8.1 c:\Win8.1.iso<br />
<br />
=Sources=<br />
* http://www.tt-hardware.com/test/dossiers/modifier-liso-de-windows-8-1-et-integrer-des-pilotes<br />
* https://www.microsoft.com/fr-fr/download/details.aspx?id=39982</div>Ycharbi