Post

CWWK X86-P5 Intel N100 Serveur Debian 12

CWWK X86-P5 Intel N100 Serveur Debian 12

CWWK carte mère x86-P5 sous processeur Alder Lake-N + module de 4 ports NVMe PCIe x1 + 2 ports Ethernet 2.5 Gigabit avec des fonctions Wake On Lan et de démarrage automatique après reprise du courant, ou programmable. Un port M.2 pour ajouter un module Wi-Fi

Description matériel CWWK X86-P5

CWWK X86-P5 Intel N100 Alder Lake-N + 5 ports NVMe + 2 ports Ethernet 2.5Ghz

  • Model: CW-X86-P5(N100)
  • CPU: Intel N100
  • Main frequency: 6M Cache, Up to 3.40GHz
  • Cores: 4 (Threads: 4)
  • Network card: Intel* i226-V
  • Memory: SO-DIMM DDR5
  • Storage: M.2 NVMe 2242/2280
  • Graphics card: Intel UHD Graphics 24EU
  • Display: HDMI2.0 4K @60Hz
  • Power Consumption: 6W
  • Panel I/O:
    • 1xDC_IN power supply interface
    • 2xLAN interface
    • 2xHDMI 2.0 interface
    • 1xdouble-layer USB3.0 interface
    • 1xPWR_BTN button
  • Onboard pins:
    • 1x10pin GPIO interface (four in and four out)
    • 2xCPU FAN (4pin 12V power supply with temperature control)
    • 1xCOM pin
    • 2xUSB2.0 pin
    • 1xIncoming call self-starting jumper cap
  • BIOS: AMI BIOS supports network boot (PXE), wake-on-LAN (WOL), auto-start on incoming calls, and GPIO
  • Chassis: aluminum alloy material
  • Color: black/gray
  • Power supply mode: DC-IN 12V
  • Motherboard size: 90mm X90mm
  • Working temperature: -10℃~70℃
  • Working environment: 5%~90% relative temperature, no condensation


Serveur Debian 12

Installation avec clé USB ISO

Connecter la machine cwwk sur le réseau
Brancher un clavier USB
Connecter un écran HDMI
Insérer clé USB contenant image ISO debian-12.1.0-amd64-netinst.iso
Brancher le jack d’alimentation

Accès au BIOS par touche clavier DEL
Dans l’onglet “Boot” –> Boot Option #1 [USB Device]
Touche F10 pour sauver

Installation debian

Réseau: enp3s0

Machine : cwwk
root : root49600 (temporaire)
yick : yick49600 (temporaire)

Disque NVMe 128Go /dev/nvme0n1
Partitions LVM avec home séparé et 100Go utilisé
Serveur SSH
Utilitaires usuels du système

La machine reboot à la fin de l’installation
Se connecter avec l’utilisateur “yick”
Relever l’adresse ip : ip a , exemple 192.168.0.26

On peut également se connecter via ssh : ssh yick@192.168.0.26

Passer en su , installer sudo

1
2
3
su
apt install sudo
echo "yick     ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/yick

Interface Réseau enp3s0

Ip V4 statiques

Désactiver NetworkManager

1
2
systemctl stop NetworkManager
systemctl disable NetworkManager

configurer une adresse IPv4 en statique

1
nano /etc/network/interfaces
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp3s0
# iface enp3s0 inet dhcp
iface enp3s0 inet static
    address 192.168.0.205
    netmask 255.255.255.0
    gateway 192.168.0.254

Fichier résolution DNS /etc/resolv.conf

1
2
nameserver 1.1.1.1
nameserver 9.9.9.9

Redémarrer l’ordinateur

1
sudo reboot

IP V6 DHCP (DEFAUT)

Configuration /etc/network/interfaces

1
iface enp3s0 inet6 dhcp

Adresse IPV6 : 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45

IP V6 statique (PB DNS)

Route de lien local. Avec le protocole IPv6, la notion de trafic de diffusion (broadcast) disparaît. C’est le trafic anycast associé au Neighbor Discovery Protocol qui permet de contacter les hôtes du voisinage réseau. Pour que les messages ICMPv6 du protocole NDP puissent être échangés, il est nécessaire de disposer d’une route vers le réseau auquel une interface active est raccordé. Cette route utilise toujours le préfixe fe80::/64.

Relever la route de lien local pour le Next Hop: ip a |grep "inet6 fe80"
inet6 fe80::aab8:e0ff:fe04:ec45/64 scope link

FreeBox
Se connecter sur la freebox, paramètres avancés -> Configuration IPV6
Relever Adresse IPv6 lien local: fe80::8e97:eaff:fe39:66d6

Configurer le préfixe secondaire : 2a01:e0a:9c8:2085::/64
Next Hop : fe80::aab8:e0ff:fe04:ec45

PROBLEME AVEC NEXTHOP !!!

Paramétrage IPV6 machine cwwk
Ajouter ce qui suit au fichier /etc/network/interfaces

1
2
3
4
iface enp3s0 inet6 static
    address 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45
    netmask 64
    gateway fe80::8e97:eaff:fe39:66d6

Redémarrer la machine (sudo systemctl reboot) et vérifier (ip a)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether a8:b8:e0:04:ec:45 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.205/24 brd 192.168.0.255 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet6 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::aab8:e0ff:fe04:ec45/64 scope link 
       valid_lft forever preferred_lft forever
3: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether a8:b8:e0:04:ec:46 brd ff:ff:ff:ff:ff:ff

Connexion SSH 192.168.0.205

Se connecter sur la nouvelle adresse ip

1
ssh yick@192.168.0.205

Modifier les mots de passe “root” et utilisateur “yick”

Hostname + Date et heure + Groupe

Hostname Commande : hostnamectl

1
2
3
4
5
6
7
8
9
10
11
 Static hostname: cwwk
       Icon name: computer-desktop
         Chassis: desktop 🖥️
      Machine ID: 2ecf8ec9715a47ec90b45f1e796a7cf2
         Boot ID: 7ec81314da2c43e4a4992d69af26b588
Operating System: Debian GNU/Linux 12 (bookworm)  
          Kernel: Linux 6.1.0-28-amd64
    Architecture: x86-64
 Hardware Vendor: Default string
  Hardware Model: Default string
Firmware Version: 5.27

Date et heure Commande timedatectl

1
2
3
4
5
6
7
               Local time: jeu. 2024-12-12 20:15:50 CET
           Universal time: jeu. 2024-12-12 19:15:50 UTC
                 RTC time: jeu. 2024-12-12 19:15:50
                Time zone: Europe/Paris (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Groupe “users”
Vérifier si utilisateur appartient au groupe “users” : id yick

1
uid=1000(yick) gid=1000(yick) groupes=1000(yick),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev)

Si non appartenance, exécuter : sudo usermod -a -G users $USER

Pour visualiser tous les messages de journal, ajouter l’utilisateur au groupe existant adm

1
sudo usermod -a -G adm $USER

OpenSSH, clé et script

OpenSSH
OpenSSH

Générer une paire de clé sur l'ordinateur de bureau PC1
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) pour une liaison SSH avec le serveur.

1
2
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/yick-ed25519
chmod 600 /home/yann/.ssh/yick-ed25519

Envoyer les clés publiques sur le serveur yick

1
ssh-copy-id -i ~/.ssh/yick-ed25519.pub yick@192.168.0.205

On se connecte sur le serveur debian 12

1
ssh yick@192.168.0.205

Modifier la configuration serveur SSH

1
sudo nano /etc/ssh/sshd_config

Modifier

1
2
Port = 55205
PasswordAuthentication no

Relancer le serveur

1
sudo systemctl restart sshd

Test connexion

1
ssh -p 55205 -i ~/.ssh/yick-ed25519 yick@192.168.0.205

Utilitaires + Historique ligne de commande + Motd

Installer utilitaires

1
sudo apt install rsync curl tmux jq figlet git tree borgbackup nmap ldap-utils

Ajoutez la recherche d’historique de la ligne de commande au terminal
Se connecter en utilisateur debian
Tapez un début de commande précédent, puis utilisez shift + up (flèche haut) pour rechercher l’historique filtré avec le début de la commande.

1
2
3
# Global, tout utilisateur
echo '"\e[1;2A": history-search-backward' | sudo tee -a /etc/inputrc
echo '"\e[1;2B": history-search-forward' | sudo tee -a /etc/inputrc

Motd
Effacer et créer motd

1
sudo rm /etc/motd && sudo nano /etc/motd
1
2
3
4
5
6
7
8
9
10
11
12
                      _    __  __ ___   __       ___  ___ 
  __ __ __ ____ __ __| |__ \ \/ /( _ ) / /  ___ | _ \| __|
 / _|\ V  V /\ V  V /| / /  >  < / _ \/ _ \|___||  _/|__ \
 \__| \_/\_/  \_/\_/ |_\_\ /_/\_\\___/\___/     |_|  |___/
  ___        _     _               _  ___                 
 |   \  ___ | |__ (_) __ _  _ _   / ||_  )                
 | |) |/ -_)| '_ \| |/ _` || ' \  | | / /                 
 |___/ \___||_.__/|_|\__,_||_||_| |_|/___|                
  _  ___  ___     _   __  ___     __     ___  __   ___    
 / |/ _ \|_  )   / | / / ( _ )   /  \   |_  )/  \ | __|   
 | |\_, / / /  _ | |/ _ \/ _ \ _| () |_  / /| () ||__ \   
 |_| /_/ /___|(_)|_|\___/\___/(_)\__/(_)/___|\__/ |___/   

LVM - SSD NVMe 2To

Ajout d’un SSD NVMe 2To sur la machine cwwk

les commandes gdisk et sgdisk sont installées via le paquet gdisk

1
sudo apt install gdisk

Partitionner SSD NVMe 2To

Identifier le périphérique: lsblk

Périphérique /dev/nvme1n1

On efface tout

1
sudo sgdisk --zap-all /dev/nvme1n1

GPT data structures destroyed! You may now partition the disk using fdisk or other utilities.

Création partition

1
sudo sgdisk --clear --new=1:0:0 --typecode=1:8e00 /dev/nvme1n1

Creating new GPT entries in memory.
The operation has completed successfully.

PV - Volume physique

Un volume physique ou « PV » pour « physical volume » est tout simplement un disque ou une partition.

1
sudo pvcreate /dev/nvme1n1p1  # Physical volume "/dev/nvme1n1p1" successfully created.

VG - Groupe de volumes

Un groupe de volumes ou « VG » pour « volume group » est un ensemble de volumes physiques. On a donc un ou plusieurs volumes physiques dans un groupe de volumes, et pour utiliser LVM, il faut obligatoirement au moins un groupe de volumes.

1
2
# volume sur le SSD NVMe a
sudo vgcreate nvmea-vg /dev/nvme1n1p1  # Volume group "nvmea-vg" successfully created

LV - Volume logique

Un volume logique ou « LV » pour « logical volume » est un espace dans un groupe de volume où l’on peut mettre un système de fichiers.

Création des volumes logiques

1
2
3
4
5
6
# ncdata : pour les données de nextcloud
sudo lvcreate -L 150G -n ncdata nvmea-vg
# sharenfs : pour le partage NFS
sudo lvcreate -L 250G -n sharenfs nvmea-vg
# kvm : pour le virtuel 
sudo lvcreate -L 200G -n kvm nvmea-vg

Format des partitions

1
2
3
sudo mkfs.ext4 /dev/mapper/nvmea--vg-ncdata
sudo mkfs.ext4 /dev/mapper/nvmea--vg-sharenfs
sudo mkfs.ext4 /dev/mapper/nvmea--vg-kvm

Montages fstab

UUID des partitions logiques LVM :

1
2
3
sudo blkid |grep "/dev/mapper/nvmea--vg-ncdata"    # UUID="c8cbc005-259d-4642-863c-b753088cefc3"
sudo blkid |grep "/dev/mapper/nvmea--vg-sharenfs"  # UUID="eb2cfabe-8e1d-463d-a62d-9da921a747f3"
sudo blkid |grep "/dev/mapper/nvmea--vg-kvm"       # UUID="e2c983fd-588b-423c-b687-6346f1f81b0f"

Création des points de montage et modifier les propriétés pur le dossier partagé NFS

1
2
3
4
5
sudo mkdir -p /srv/{nextcloud-data,kvm}
sudo mkdir -p /sharenfs
# # Modifications possibles par les utilisateurs avec ID=1000
sudo chown -R $USER:$USER /sharenfs       
sudo chown -R $USER:$USER /srv/kvm       

Ajout au fichier /etc/fstab

1
2
3
4
5
6
# /dev/mapper/nvmea--vg-ncdata
UUID=c8cbc005-259d-4642-863c-b753088cefc3 /srv/nextcloud-data   ext4    defaults        0       2
# /dev/mapper/nvmea--vg-kvm 
UUID=e2c983fd-588b-423c-b687-6346f1f81b0f /srv/kvm 	ext4	defaults	0	2
#  /dev/mapper/nvmea--vg-sharenfs
UUID=eb2cfabe-8e1d-463d-a62d-9da921a747f3 /mnt/sharenfs ext4    defaults     0	2

Modifier le fichier /etc/fstab pour les UUID root,home et swap de l’installation debian

1
2
3
/dev/mapper/cwwk--vg-swap_1: UUID="9f71df16-af9d-49af-a204-0eb8fdcd0371" TYPE="swap"
/dev/mapper/cwwk--vg-home: UUID="996ee697-528b-4af6-9c4e-6d2a6c759303" BLOCK_SIZE="4096" TYPE="ext4"
/dev/mapper/cwwk--vg-root: UUID="3e842a93-ffd5-4257-b928-e9b6288064a7" BLOCK_SIZE="4096" TYPE="ext4"

Créer volume logique “var”

Le dossier /var contient , à terme, tous les chemins “root” du web. Il peut dépasser les 5Go

Le dossier /var est actuellement dans le volume logique root /dev//mapper/cwwk--vg-root

Création volume logique “var” de 10Go

1
sudo lvcreate -L 10G -n var cwwk-vg

Format partition

1
sudo mkfs.ext4 /dev/mapper/cwwk--vg-var

Relever son UUID

1
sudo blkid |grep "/dev/mapper/cwwk--vg-var"    # UUID="9d942292-a4d4-4fb3-b8e9-b945b8233d72"

Ajout au fichier /etc/fstab

1
2
#/dev/mapper/cwwk--vg-var
UUID=9d942292-a4d4-4fb3-b8e9-b945b8233d72 /var           ext4    defaults        0       2

Recharger et monter

1
2
sudo systemctl daemon-reload
sudo mount -a

Vérification lsblk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
NAME                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
nvme1n1                259:0    0   1,9T  0 disk 
└─nvme1n1p1            259:1    0   1,9T  0 part 
  ├─nvmea--vg-ncdata   254:0    0   150G  0 lvm  /srv/nextcloud-data
  ├─nvmea--vg-sharenfs 254:1    0   250G  0 lvm  /sharenfs
  └─nvmea--vg-kvm      254:2    0   200G  0 lvm  /srv/kvm
nvme0n1                259:2    0 119,2G  0 disk 
├─nvme0n1p1            259:3    0   512M  0 part /boot/efi
├─nvme0n1p2            259:4    0   488M  0 part /boot
└─nvme0n1p3            259:5    0 118,3G  0 part 
  ├─cwwk--vg-root      254:3    0  27,9G  0 lvm  /
  ├─cwwk--vg-swap_1    254:4    0   976M  0 lvm  [SWAP]
  ├─cwwk--vg-home      254:5    0  64,2G  0 lvm  /home
  └─cwwk--vg-var       254:6    0    10G  0 lvm  /var

Script ssh_rc_bash

ATTENTION!!! Les scripts sur connexion peuvent poser des problèmes pour des appels externes autres que ssh

1
2
3
wget https://static.rnmkcy.eu/files/ssh_rc_bash
chmod +x ssh_rc_bash # rendre le bash exécutable
./ssh_rc_bash        # exécution

Journaux

Users in groups ‘adm’, ‘systemd-journal’ can see all messages. Pour visualiser tous les messages de journal, ajouter l’utilisateur au groupe existant adm

1
2
sudo usermod -a -G adm $USER
sudo usermod -a -G systemd-journal $USER

Pour voir les messages sans coupures

1
SYSTEMD_LESS=FRXMK journalctl -u caddy

Ajouter au .bashrc

1
echo "export SYSTEMD_LESS=FRXMK"

Parefeu UFW

ufw

UFW, ou pare - feu simple , est une interface pour gérer les règles de pare-feu dans Arch Linux, Debian ou Ubuntu. UFW est utilisé via la ligne de commande (bien qu’il dispose d’interfaces graphiques disponibles), et vise à rendre la configuration du pare-feu facile.

Installation Debian / Ubuntu

1
sudo apt install ufw

Par défaut, les jeux de règles d’UFW sont vides, de sorte qu’il n’applique aucune règle de pare-feu, même lorsque le démon est en cours d’exécution.

Les règles

1
2
sudo ufw allow 55205/tcp  # port SSH
sudo ufw allow https      # port 443

Activer le parefeu

1
sudo ufw enable
1
2
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Status

1
 sudo ufw status 
1
2
3
4
5
6
7
8
Status: active

To                         Action      From
--                         ------      ----
55205/tcp                  ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
55205/tcp (v6)             ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             

désactiver la journalisation

1
sudo ufw logging off

Configuration du second port Ethernet 2.5Gb enp4s0

Serveur Debian CWWK x86-P5 configuration du second port Ethernet 2.5 Gigabit enp4s0

Très largement inspiré de l’article Configuration du second réseau

  • Machine CWWK x86-P5 Debian 12 equioée de 2 ports ethernet
  • Accès internet
  • Switch pour le second réseau

Configuration Debian des cartes réseau

La machine CWWK Debian sert de passerelle entre lz réseau principal (192.168.0.0/24) et le réseau secondaire (192.168.20.0/24).
Cette configuration assure que le serveur CWWK peut communiquer à la fois avec les dispositifs internes sur les deux sous-réseaux et avec l’Internet externe.

Les interfaces réseau: ip link

1
2
3
4
5
6
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether a8:b8:e0:04:ec:45 brd ff:ff:ff:ff:ff:ff
3: enp4s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether a8:b8:e0:04:ec:46 brd ff:ff:ff:ff:ff:ff

Interfaces réseau enp3s0 et enp4s0

Configuration interfaces réseau avant modification

1
/etc/network/interfaces
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
# allow-hotplug enp3s0
allow-hotplug enp3s0
# iface enp3s0 inet dhcp
iface enp3s0 inet static
    address 192.168.0.205
    netmask 255.255.255.0
    gateway 192.168.0.254
#iface enp3s0 inet6 dhcp
iface enp3s0 inet6 static
    address 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45
    netmask 64
    gateway fe80::8e97:eaff:fe39:66d6

A - Interface bridge 192.168.10.0/24

Modification pour le second réseau , Interface enp4s0 192.168.10.0/24

Il faut relier le routeur Tenda avec CWWK enp4s0 par un câble ethernet

1
2
3
4
5
6
7
8
9
10
11
# Interface pour le réseau secondaire
# Bridge setup
auto br0
iface br0 inet static
    bridge_ports enp4s0
    address 192.168.10.100
    netmask 255.255.255.0
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
    # Pas de gateway spécifié pour cette interface, car elle ne se connecte pas directement à Internet
  • enp3s0 est configurée avec une adresse IP statique qui lui permet de communiquer avec le réseau principal.
  • La passerelle par défaut est également définie pour diriger le trafic Internet
  • Pour enp4s0, une adresse IP statique est configurée pour le réseau secondaire, mais sans passerelle spécifiée, car le trafic Internet passera par enp3s0

Sur le routeur tenda, ajouter une réservation IP statique sur br0 (link/ether 96:9c:89:a6:a0:8f)

Après redémarrage de la machine

1
2
3
4
5
6
7
8
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 96:9c:89:a6:a0:8f brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.100/24 brd 192.168.10.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2001:3::949c:89ff:fea6:a08f/64 scope global dynamic mngtmpaddr 
       valid_lft 115sec preferred_lft 115sec
    inet6 fe80::949c:89ff:fea6:a08f/64 scope link 
       valid_lft forever preferred_lft forever

B - Interface enp4s0 192.168.70.0/24

Modification pour le second réseau , Interface enp4s0 192.168.70.0/24

1
2
3
4
5
6
# Interface pour le réseau secondaire
auto enp4s0
iface enp4s0 inet static
    address 192.168.70.1
    netmask 255.255.255.0
    # Pas de gateway spécifié pour cette interface, car elle ne se connecte pas directement à Internet
  • enp3s0 est configurée avec une adresse IP statique qui lui permet de communiquer avec le réseau principal.
  • La passerelle par défaut est également définie pour diriger le trafic Internet
  • Pour enp4s0, une adresse IP statique est configurée pour le réseau secondaire, mais sans passerelle spécifiée, car le trafic Internet passera par enp3s0

Activation du routage IP

Pour permettre à notre serveur de transmettre le trafic entre les deux réseaux et vers Internet, on active le routage IP en modifiant le fichier /etc/sysctl.conf

1
net.ipv4.ip_forward=1

Après avoir modifié ce fichier, appliquer la modification avec la commande sudo sysctl -p

Configuration pare-feu UFW

Configurer ufw pour permettre et contrôler le trafic entre les réseaux.

Il faut autoriser le forwarding dans la configuration d’ufw.

1
nano /etc/default/ufw 

Recherchez la ligne commençant par DEFAULT_FORWARD_POLICY.
Remplacez la valeur DROP par ACCEPT. Enregistrez le fichier et quittez l’éditeur.

1
DEFAULT_FORWARD_POLICY="ACCEPT"

Avant de définir des règles spécifiques pour notre cas de routage, configurer les politiques par défaut de ufw pour refuser tout le trafic entrant et autoriser tout le trafic sortant

1
2
3
4
sudo ufw --force disable
sudo ufw --force reset
sudo ufw default deny incoming
sudo ufw default allow outgoing

Autoriser le flux ssh et dns

1
2
3
sudo ufw allow ssh
sudo ufw allow dns
sudo ufw allow out to any port 53

Ajouter les règles de forwarding entre l’interface enp4s0 et enp3s0 pour permettre la mise à jour des packages sur les machines du second réseau.

1
sudo nano /etc/ufw/before.rules

et ajouter ce bloc juste avant *filter :

1
2
3
4
5
6
7
8
9
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic through enp3s0 - Change to match you out-interface
-A POSTROUTING -s 192.168.70.0/24 -o enp3s0 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
COMMIT

Activer le service ufw

1
sudo ufw enable

Vérifions son status

1
sudo ufw status
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Status: active

To                         Action      From
--                         ------      ----
55205/tcp                  ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
2049                       ALLOW       192.168.0.0/24            
DNS                        ALLOW       Anywhere                  
55205/tcp (v6)             ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
DNS (v6)                   ALLOW       Anywhere (v6)             

53                         ALLOW OUT   Anywhere                  
53 (v6)                    ALLOW OUT   Anywhere (v6)             

55025/tcp : Port de communication SSH
2049 : Port NFS

Serveur DNS Unbound

DNS Unbound
Les serveurs DNS sont des machines discutant entre elles afin de se communiquer les correspondances entre nom de domaine et adresses IP.

Les quatre serveurs DNS qui chargent une page Web

  1. Le serveur DNS récursif (Resolving Name Server) : le serveur DNS récursif répond à une requête DNS et demande l’adresse à d’autres serveurs DNS, ou détient déjà un enregistrement de l’adresse IP du site.
    • Serveur racine du DNS (Root Name Server) : il s’agit du serveur de noms pour la zone racine. Il répond à des requêtes directes et peut renvoyer une liste de noms de serveurs faisant autorité pour le domaine de haut niveau correspondant.
    • Serveur DNS TLD : le serveur TLD (top-level domain : domaine de premier niveau) est l’un des serveurs DNS de haut niveau que l’on trouve sur Internet. Lorsque vous recherchez www.varonis.com, un serveur TLD répondra en premier pour le « .com », puis le DNS recherchera « varonis ».
    • Serveur de noms faisant autorité (Authoritative Name Server) : le serveur de noms faisant autorité constitue le terminus d’une requête DNS. Le serveur de noms faisant autorité contient l’enregistrement DNS répondant à la requête.

Si vous utilisez un résolveur local (par exemple bind, dnsmasq, unbound, etc), ou tout autre logiciel générant un fichier /etc/resolv.conf (par exemple resolvconf), le service systemd-resolved ne doit pas être utilisé. Pour désactiver systemd-resolved, exécutez la commande suivante : sudo systemctl disable systemd-resolved Effacer puis recréer un fichier /etc/resolv.conf avec une directive dns, par exemple : nameserver 1.1.1.1

Installation

Passage en mode super utilisateur

1
sudo -s 

Désinstaller bind si installé

1
2
apt remove --purge bind* -y
rm -r /var/cache/bind/

Installation des outils dns et du paquet Unbound :

1
apt install dnsutils unbound -y

Configuration des adresses des serveurs de nom racine

Récupération de la liste des DNS racines

1
2
curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
chown unbound:unbound /var/lib/unbound/root.hints

Indiquer l’adresse du fichier dans la configuration de unbound

1
nano /etc/unbound/unbound.conf.d/root-hints.conf
1
2
3
4
5
# Fichier des serveurs root à télécharger env tous les 6 mois :
# curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
# 
server:
root-hints: "/var/lib/unbound/root.hints"

Vérifier le fichier

1
unbound-checkconf /etc/unbound/unbound.conf.d/root-hints.conf 

unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/root-hints.conf

Configuration Unbound

Les fichiers de configuration sont situés sous /etc/unbound/unbound.conf.d/, créer la configuration cwwk-unbound.conf

1
/etc/unbound/unbound.conf.d/cwwk-unbound.conf

Configuration fonctionnelle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
server:
    # ne rien enregistrer dans les journaux hormis les erreurs
    verbosity: 0

    # n'écouter que sur l'interface locale en IPv4
    # unbound nécessite d'être relancé si modifié
    # interface enp3s0
    interface: 192.168.0.205
    # Adresse privée 
    #interface: 192.168.70.1

    port: 53

    # refuser tout le monde sauf les connexions locales (pas forcément
    # nécessaire vu que le serveur n'écoute que sur la boucle locale en IPv4)
    access-control: 0.0.0.0/0 refuse
    access-control: 127.0.0.1/32 allow
    access-control: 192.168.0.205/32 allow
    # Adresse privée 
    access-control: 192.168.70.0/16 allow

    # par défaut, unbound ne log pas les requêtes ni les réponses
    # on peut le rappeler au cas où
    log-queries: no
    log-replies: no

    # imposer la QNAME minimisation (RFC 7816)
    # Pour mieux protéger la vie privée
    qname-minimisation: yes
    # même si le serveur faisant autorité ne le veut pas
    #   après discussion, il est possible que cette option ne soit
    #   pas recommandée dans le cadre d'un résolveur ouvert
    qname-minimisation-strict: yes
    
    local-zone: "home.arpa." transparent
    # IPv4
    local-data: "cwwk.home.arpa.  86400 IN A 192.168.0.205"
    local-data: "alpine.home.arpa 86400 IN A 192.168.70.110"
    # IPv6
    local-data: "cwwk.home.arpa.  86400 IN AAAA 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45"
    # On ajoute les enregistrements PTR
    # PTR IPv4
    local-data-ptr: "192.168.0.205  86400 cwwk.home.arpa."
    local-data-ptr: "192.168.70.110 86400 alpine.home.arpa."
    # PTR IPv6
    local-data-ptr: "2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45  86400 cwwk.home.arpa."

    ###########################################################################
    # PERFORMANCE SETTINGS
    ###########################################################################
    # https://nlnetlabs.nl/documentation/unbound/howto-optimise/

    # Number of slabs in the infrastructure cache. Slabs reduce lock contention
    # by threads. Must be set to a power of 2.
    infra-cache-slabs: 4

    # Number of slabs in the key cache. Slabs reduce lock contention by
    # threads. Must be set to a power of 2. Setting (close) to the number
    # of cpus is a reasonable guess.
    key-cache-slabs: 4

    # Number  of  bytes  size  of  the  message  cache.
    # Unbound recommendation is to Use roughly twice as much rrset cache memory
    # as you use msg cache memory.
    msg-cache-size: 128525653

    # Number of slabs in the message cache. Slabs reduce lock contention by
    # threads. Must be set to a power of 2. Setting (close) to the number of
    # cpus is a reasonable guess.
    msg-cache-slabs: 4

    # The number of queries that every thread will service simultaneously. If
    # more queries arrive that need servicing, and no queries can be jostled
    # out (see jostle-timeout), then the queries are dropped.
    # This is best set at half the number of the outgoing-range.
    # This Unbound instance was compiled with libevent so it can efficiently
    # use more than 1024 file descriptors.
    num-queries-per-thread: 4096

    # The number of threads to create to serve clients.
    # This is set dynamically at run time to effectively use available CPUs
    # resources
    num-threads: 3

    # Number of ports to open. This number of file descriptors can be opened
    # per thread.
    # This Unbound instance was compiled with libevent so it can efficiently
    # use more than 1024 file descriptors.
    outgoing-range: 8192

    # Number of bytes size of the RRset cache.
    # Use roughly twice as much rrset cache memory as msg cache memory
    rrset-cache-size: 257051306

    # Number of slabs in the RRset cache. Slabs reduce lock contention by
    # threads. Must be set to a power of 2.
    rrset-cache-slabs: 4

    # Do no insert authority/additional sections into response messages when
    # those sections are not required. This reduces response size
    # significantly, and may avoid TCP fallback for some responses. This may
    # cause a slight speedup.
    minimal-responses: yes

    # # Fetch the DNSKEYs earlier in the validation process, when a DS record
    # is encountered. This lowers the latency of requests at the expense of
    # little more CPU usage.
    prefetch: yes

    # Fetch the DNSKEYs earlier in the validation process, when a DS record is
    # encountered. This lowers the latency of requests at the expense of little
    # more CPU usage.
    prefetch-key: yes

    # Have unbound attempt to serve old responses from cache with a TTL of 0 in
    # the response without waiting for the actual resolution to finish. The
    # actual resolution answer ends up in the cache later on.
    serve-expired: yes

    # Open dedicated listening sockets for incoming queries for each thread and
    # try to set the SO_REUSEPORT socket option on each socket. May distribute
    # incoming queries to threads more evenly.
    so-reuseport: yes

# configurer Unbound en tant que résolveur DNS pour vos réseaux locaux
forward-zone:
    name: "."
    forward-addr: 1.1.1.1
    forward-addr: 9.9.9.9

Vérifier la configuration

1
unbound-checkconf /etc/unbound/unbound.conf.d/cwwk-unbound.conf

unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/cwwk-unbound.conf

Redémarrer Unbound

1
systemctl restart unbound

La machine utilise son propre serveur DNS

1
/etc/resolv.conf
1
nameserver 192.168.0.205

si DHCP editer plutôt le bon fichier (plutôt que /etc/resolv.conf)

1
2
3
vim /etc/dhcp/dhclient.conf
# au dessus du bloc request
supersede domain-name-servers 192.168.x.x;

Mise à jour automatique adresses des serveurs de nom racine

Serveur racine du DNS (Root Name Server) : il s’agit du serveur de noms pour la zone racine. Il répond à des requêtes directes et peut renvoyer une liste de noms de serveurs faisant autorité pour le domaine de haut niveau correspondant.

Fichier service /etc/systemd/system/roothints.service

1
2
3
4
5
[Unit]
Description=Update root hints for unbound
After=network.target
[Service]
ExecStart=/usr/bin/curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache

Fichier timer /etc/systemd/system/roothints.timer

1
2
3
4
5
6
7
[Unit]
Description=Run root.hints semiannually
[Timer]
OnCalendar=semiannually
Persistent=true     
[Install]
WantedBy=timers.target

Tester le chargement du fichier :

1
2
3
mv /var/lib/unbound/root.hints /var/lib/unbound/root.hints.BU
systemctl start roothints.service
ls -ls /var/lib/unbound/root.hints*

Démarrer le timer roothints.timer

1
sudo systemctl enable roothints.timer --now

Created symlink /etc/systemd/system/timers.target.wants/roothints.timer → /etc/systemd/system/roothints.timer.

Serveur DHCP

Après avoir configuré ufw pour permettre le routage sécurisé entre les réseaux, l’étape suivante consiste à mettre en place isc-dhcp-server sur notre serveur Debian. Ce serveur DHCP distribuera automatiquement des adresses IP, des masques de sous-réseau, des gateways et des informations de serveurs DNS aux dispositifs connectés au réseau secondaire.

Installer isc-dhcp-server

installer le paquet isc-dhcp-server :

1
2
sudo apt update
sudo apt install isc-dhcp-server

Configurer interface réseau secondaire enp4s0

Configure isc-dhcp-server pour spécifier sur quelle interface écouter les requêtes DHCP.
Dans notre cas, il s’agit de enp4s0, l’interface connectée au réseau secondaire.
Modifier le fichier /etc/default/isc-dhcp-server pour y ajouter l’interface

1
2
INTERFACESv4="enp4s0"
INTERFACESv6=""

Configuration serveur DHCP

Comment installer et configurer un serveur DHCP sur Debian ?
La partie la plus importante de la configuration de isc-dhcp-server consiste à définir la plage d’adresses IP à distribuer, ainsi que d’autres options pour le réseau.
Modifier le fichier /etc/dhcp/dhcpd.conf pour ajouter la configuration spécifique au réseau secondaire

1
2
3
4
5
6
7
8
9
10
11
# dhcpd.conf
#
subnet 192.168.70.0 netmask 255.255.255.0 {
  range 192.168.70.10 192.168.70.100;
  option routers 192.168.70.1;
  option subnet-mask 255.255.255.0;
  option domain-name-servers 192.168.70.1;
  # option domain-name "yann.priv";
  default-lease-time 600;
  max-lease-time 7200;
}

Dans cette configuration

  • range : plage d’adresses IP disponibles pour la distribution aux clients DHCP.
  • option routers : passerelle par défaut, qui est l’adresse IP de notre serveur sur enp4s0.
  • option domain-name-servers : serveur DNS que les clients utiliseront, que nous avons également configuré pour pointer vers notre serveur Debian, agissant comme serveur DNS avec bind9.
  • Les options default-lease-time et max-lease-time définissent la durée de bail par défaut et maximale en secondes.

Démarrage et vérification du service

Après avoir configuré le serveur DHCP, démarrer le service et vérifier

1
2
sudo systemctl restart isc-dhcp-server
sudo systemctl status isc-dhcp-server

Le status

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
● isc-dhcp-server.service - LSB: DHCP server
     Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
     Active: active (running) since Tue 2025-01-14 18:22:12 CET; 12s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 2331 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
      Tasks: 1 (limit: 38143)
     Memory: 7.1M
        CPU: 30ms
     CGroup: /system.slice/isc-dhcp-server.service
             └─2343 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf enp4s0

janv. 14 18:22:10 cwwk systemd[1]: Starting isc-dhcp-server.service - LSB: DHCP server...
janv. 14 18:22:10 cwwk isc-dhcp-server[2331]: Launching IPv4 server only.
janv. 14 18:22:10 cwwk dhcpd[2343]: Wrote 0 leases to leases file.
janv. 14 18:22:10 cwwk dhcpd[2343]: Server starting service.
janv. 14 18:22:12 cwwk isc-dhcp-server[2331]: Starting ISC DHCPv4 server: dhcpd.
janv. 14 18:22:12 cwwk systemd[1]: Started isc-dhcp-server.service - LSB: DHCP server.

Test de la configuration DHCP

Pour tester que le serveur DHCP fonctionne correctement, connecter un appareil au réseau secondaire et vérifie qu’il reçoit une adresse IP dans la plage définie, ainsi que les informations correctes de passerelle et de serveur DNS.

Pont Réseau (bridge network)

Le réseau par défaut offre un moyen très simple d’obtenir une connectivité lors de la création de machines virtuelles : tout est « prêt » et fonctionne dès la sortie de la boîte. Parfois, cependant, nous souhaitons obtenir une connexion Bridge où les VM sont connectés au réseau local de l’hôte sans utiliser NAT.(Installing and Using KVM for Virtualization on Debian 12)

en mode su

Pour configurer le mode Bridge, vous devez créer un pont virtuel et partager l’une des interfaces Ethernet physiques de l’hôte.

Le programme dont vous aurez besoin s’appelle brctl et est inclus dans bridge-utils.

1
apt install bridge-utils

Configuration passerelle br0

Pour rendre votre configuration permanente, vous devez éditer le fichier /etc/network/interfaces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
# allow-hotplug enp3s0
allow-hotplug enp3s0
# iface enp3s0 inet dhcp
iface enp3s0 inet static
    address 192.168.0.205
    netmask 255.255.255.0
    gateway 192.168.0.254
#iface enp3s0 inet6 dhcp
iface enp3s0 inet6 static
    address 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45
    netmask 64
    gateway fe80::8e97:eaff:fe39:66d6

# Interface pour le réseau secondaire
#auto enp4s0
#iface enp4s0 inet static
#    address 192.168.70.1
#    netmask 255.255.255.0
    # Pas de gateway spécifié pour cette interface, car elle ne se connecte pas directement à Internet

# Bridge setup
auto br0
iface br0 inet static
    bridge_ports enp4s0
    address 192.168.70.1
    netmask 255.255.255.0
    bridge_ports eth0
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0

Modifier serveur DHCP
Remplacer enp4s0 par br0 pour le dhcp /etc/default/isc-dhcp-server

1
2
3
4
5
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1".
#INTERFACESv4="enp4s0"
INTERFACESv4="br0"
INTERFACESv6=""

Redémarrer serveur dhcp

1
2
sudo systemctl restart isc-dhcp-server
sudo systemctl status isc-dhcp-server

Redémarrer le réseau

Utilisez la commande systemctl restart networking pour appliquer vos changements (patienter quelques instants…).

Partages

NFS

NFS serveur

  1. Installation serveur NFSv4
  2. Parefeu UFW
  3. Partage Sans pseudo système de fichiers
    sudo mkdir -p /sharenfs
    sudo chown $USER:$USER -R /sharenfs

Ouvrez le fichier /etc/exports à l’aide de la commande d’éditeur nano suivante.

1
sudo nano /etc/exports

Ajoutez la ligne suivante au fichier.

1
/sharenfs    192.168.0.0/255.255.255.0(rw,no_root_squash,no_subtree_check)

Enregistrez et fermez le fichier lorsque vous avez terminé.

Vous trouverez ci-dessous quelques options NFS utilisées pour ce cas :

  • rw : autorise l’accès en lecture et en écriture pour le serveur et le client NFS au volume/répertoire.
  • no_subtree_check : désactive la vérification des sous-arbres, ce qui a de légères implications en matière de sécurité, mais peut améliorer la fiabilité dans certaines circonstances.
  • no_root_sqash : désactive le squashing de la racine. Cette option est principalement utile pour les clients sans disque.
  • fsid=0 : pour NFSv4, si utilisé, ce paramètre est utilisé pour informer le serveur NFS que cette exportation est la racine de tous les systèmes de fichiers exportés.

Ensuite, exécutez la commande suivante pour redémarrer le service nfs-server et appliquer les modifications. Puis, vérifiez le serveur nfs pour vous assurer que le service est en cours d’exécution.

1
2
sudo systemctl restart nfs-server 
sudo systemctl status nfs-server

Enfin, exécutez la commande suivante pour vérifier le répertoire et le système de fichiers exportés sur le serveur NFS à l’aide de la commande suivante.

1
2
sudo showmount -e 192.168.0.205 
#sudo showmount -e

Si tout se passe bien, vous devriez voir que le répertoire //mnt/sharenfs est exporté sur le serveur NFS.
/sharenfs 192.168.0.0/255.255.255.0

Créer des liens

1
2
ln -s /sharenfs $HOME/sharenfs
ln -s /sharenfs/scripts $HOME/scripts

NFS client

Installez le paquetage du client NFS

1
2
sudo apt install nfs-common # debian
sudo pacman -S nfs-utils    # archlinux

Créer dossier cible

1
sudo mkdir -p /mnt/cwwk

Montage manuel

1
sudo mount.nfs4 192.168.0.205:/sharenfs /mnt/cwwk

Démontage

1
sudo umount /mnt/cwwk

Montage /etc/fstab

1
2
# Serveur debian 12 cwwk 192.168.0.205
192.168.0.205:/sharenfs	/mnt/cwwk nfs4 nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10s,rsize=8192,wsize=8192 0 0

Rechargement et montage

1
2
sudo systemctl daemon-reload
sudo mount -a

Samba FreeUSB2To (Freebox)

Partage disque USB 2To monté sur FreeboX

Accés partage samba depuis linux

Installation paquet cifs-utils

1
2
sudo apt install cifs-utils  # Debian
sudo pacman -S cifs-utils    # Archlinux 

Création répertoire de montage et lien

1
2
sudo mkdir /mnt/FreeUSB2To   
sudo ln -s /mnt/FreeUSB2To $HOME/FreeUSB2To

Création fichier caché pour login et mot de passe

1
sudo nano /root/.smbcredentials

Dans le fichier, ajoutez les lignes suivantes (remplacez les XXXX par votre login et mot de passe)

1
2
username=XXXXXX
password=XXXXXX

Donnez les droits adéquats au fichier

1
2
sudo chown -R root:root /root/.smbcredentials
sudo chmod -R 600 /root/.smbcredentials

Montage linux du disque USB Freebox

Résumé
Partage : //192.168.0.254/FreeUSB2To
Point de montage local : sudo mkdir -p /mnt/FreeUSB2To
Outil cifs : sudo apt install cifs-utils
Utlisateur mot de passe: /root/.smbcredentials
Lien: ln -s /mnt/FreeUSB2To/ $HOME/FreeUSB2To

Trois options de montage, via systemd.mount, systemd.automount ou fstab

**A-Montage avec systemd mount

Fichier /etc/systemd/system/mnt-FreeUSB2To.mount**

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
  Description=cifs mount script
  Requires=network-online.target
  After=network-online.service

[Mount]
  What=//192.168.0.254/FreeUSB2To
  Where=/mnt/FreeUSB2To
  Options=credentials=/root/.smbcredentials,rw,uid=1000,gid=1000,vers=3.0
  Type=cifs

[Install]
  WantedBy=multi-user.target

Lancement et activation

1
sudo systemctl enable mnt-FreeUSB2To.mount --now

Vérifier : ls /mnt/FreeUSB2To/

B-Montage avec systemd automount

Fichier /etc/systemd/system/mnt-FreeUSB2To.mount

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
  Description=cifs mount script
  Requires=network-online.target
  After=network-online.service

[Mount]
  What=//192.168.0.254/FreeUSB2To
  Where=/mnt/FreeUSB2To
  Options=credentials=/root/.smbcredentials,rw,uid=1000,gid=1000,vers=3.0
  Type=cifs

[Install]
  WantedBy=multi-user.target

Fichier /etc/systemd/system/mnt-FreeUSB2To.automount

1
2
3
4
5
6
7
8
9
10
11
[Unit]
  Description=cifs mount script
  Requires=network-online.target
  After=network-online.service

[Automount]
  Where=/mnt/FreeUSB2To
  TimeoutIdleSec=0

[Install]
  WantedBy=multi-user.target

Lancement et activation

1
sudo systemctl enable mnt-FreeUSB2To.automount --now

Vérifier : ls /mnt/FreeUSB2To/

C-Montage via fstab

Modèle pour fstab

1
//[Serveur]/[Partage]  [PointDeMontage]  cifs  noauto,x-systemd.automount,_netdev,file_mode=0750,dir_mode=0750,uid=[Mon_UID],gid=[Mon_GID],credentials=~/.smbcredentials  0  0

Explication des options:

  • //[Serveur]/[Partage]: Adresse du serveur et nom du partage CIFS. Exemple: //192.168.1.10/Documents.
  • [PointDeMontage]: Chemin du dossier local où le partage sera monté. Exemple: /mnt/partage_documents.
  • cifs: Indique que le système de fichiers à monter est de type CIFS.
  • noauto: Empêche le montage automatique du partage au démarrage du système.
  • x-systemd.automount: Active le montage automatique à la demande via Systemd.
  • _netdev: Indique que le partage se trouve sur un périphérique réseau.
  • file_mode=0750: Définit les permissions des fichiers sur le partage monté (lecture, écriture et exécution pour le propriétaire et le groupe, aucune permission pour les autres).
  • dir_mode=0750: Définit les permissions des dossiers sur le partage monté.
  • uid=[Mon_UID]: ID utilisateur qui sera propriétaire des fichiers et dossiers sur le partage monté.
  • gid=[Mon_GID]: ID du groupe qui sera propriétaire des fichiers et dossiers sur le partage monté.
  • credentials=~/.smbcredentials: Chemin vers le fichier contenant les informations d’identification.

Ajout de la ligne suivante au fichier /etc/fstab

1
//192.168.0.254/FreeUSB2To /mnt/FreeUSB2To cifs _netdev,noauto,x-systemd.automount,uid=1000,gid=1000,credentials=/root/.smbcredentials 0 0

Le partage CIFS sera automatiquement monté lorsque vous accéderez au dossier de montage /mnt/FreeUSB2To. Il sera démonté automatiquement après une période d’inactivité.

Recharger

1
2
sudo systemctl daemon-reload
sudo mount -a

Forcer le démontage FreeUSB2To avant arrêt ou redémarrage machine

PROBLEME DE DEMONTAGE PARTITION CIFS

Comment exécuter un script avec systemd juste avant l’arrêt sous Linux
How to run script with systemd right before shutdown in Linux

Le script va forcer le démontage de /mnt/FreeUSB2To

1
nano /home/yick/scripts/umount_force.sh
1
2
3
4
5
#!/bin/bash
# Pour éviter que le montage ne se bloque et se débarrasser du montage lui-même
# nous pouvons forcer (-f) un démontage paresseux (-l) :
echo "Forcer démontage FreeUSB2To" | systemd-cat -t cwwk -p info
umount -f -l /mnt/FreeUSB2To

Rendre exécutable

1
chmod u+x 

Créer un service run-before-shutdown.service

1
sudo nano /etc/systemd/system/run-before-shutdown.service
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Force umount
DefaultDependencies=no
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/home/yick/scripts/umount_force.sh
TimeoutStartSec=0

[Install]
WantedBy=shutdown.target

Rafraîchir les fichiers de configuration de systemd

1
sudo systemctl daemon-reload

Activer le script pour qu’il démarre automatiquement au prochain démarrage

1
sudo systemctl enable run-before-shutdown.service

Alias (.bash_aliases)

Le fichier des alias ~/.bash_aliases

1
2
3
alias borglist='$HOME/scripts/borglist.sh'
alias etat='$HOME/scripts/etat_des_lieux.sh'
alias sshm='$HOME/scripts/ssh-manager.sh'

Virtualisation KVM


KVM, acronyme de Kernel-based Virtual Machine, est un outil de virtualisation complet et opensource pour les systèmes Linux avec des extensions de virtualisation matérielle basées sur les processeurs Intel-VT ou AMD-V.

Vérifiez la prise en charge de la virtualisation matérielle sur votre système avec la commande grep --color -iE 'vmx|svm' /proc/cpuinfo qui recherche les drapeaux du processeur : Intel vmx (Virtual Machine Extension) ou AMD svm (Secure virtual Machine).

Installer KVM sur un serveur

Sur un serveur headless sans interface graphique, il suffit d’exécuter la commande ci-dessous

1
sudo apt install qemu-system libvirt-daemon-system virtinst qemu-utils

Une fois l’installation terminée, vérifiez si les modules KVM sont chargés

1
lsmod | grep -i kvm
1
2
3
kvm_intel             380928  0
kvm                  1146880  1 kvm_intel
irqbypass              16384  1 kvm

Démarrer le démon de gestion libvirt (libvirtd)

le programme libvirtd est le composant démon côté serveur du système de gestion de la virtualisation libvirt. Ce démon s’exécute sur les serveurs hôtes et exécute les tâches de gestion requises pour les invités virtualisés. Cela inclut des activités telles que le démarrage, l’arrêt et la migration des invités entre les serveurs hôtes, la configuration et la manipulation du réseau, et la gestion du stockage pour l’utilisation par les invités. Les bibliothèques et utilitaires clients libvirt se connectent à ce démon pour exécuter des tâches et collecter des informations sur la configuration et les ressources du système hôte et des invités.

Il convient donc de lancer et d’activer ce service au démarrage du système

1
sudo systemctl enable --now libvirtd

Vérifier l’état

1
systemctl  status libvirtd

le service libvirtd est activé et démarré !

Par défaut, le démon libvirtd écoute les requêtes sur un socket local de domaine Unix. En utilisant l’option de ligne de commande -l | --listen, il est possible de demander au démon libvirtd d’écouter également sur une socket TCP/IP. Le socket TCP/IP à utiliser est défini dans le fichier de configuration de libvirtd.

Ajouter en fin de fichier /etc/libvirt/qemu.conf

1
2
user = "yick"
group = "yick"

Ajoutez maintenant votre utilisateur actuel aux groupes libvirt-qemu et libvirt afin qu’il puisse créer et gérer des VM à l’aide de virsh utilitaire de ligne de commande ou Virt-manager interface graphique.

1
2
sudo usermod -aG libvirt-qemu $USER
sudo usermod -aG libvirt $USER

Recharger l’appartenance à un groupe Linux à l’aide de la commande newgrp

1
2
newgrp libvirt
newgrp libvirt-qemu

La connexion “virsh” par défaut dans la configuration globale: uri_default = "qemu:///system"
Pour tester, se connecter à l’hyperviseur en exécutant

1
virsh list

Le résultat est une liste vide de machines virtuelles.

1
2
3
 ID   Nom   État
------------------

PC1 Virt Manager

La boîte de dialogue GUI de virt-manager ne permet pas de spécifier un port ssh autre que celui par défaut ou la clé privée à utiliser lors de la connexion au serveur distant, mais cela est facilement réalisable en démarrant virt-manager avec le paramètre ‘-c’

1
virt-manager -c 'qemu+ssh://yick@192.168.0.205:55205/system?keyfile=/home/yann/.ssh/yick-ed25519'

Sur PC1

Créer un stockage nommé machines

Modifier le réseau par défaut

pour démarrer le réseau

Modifier la plage DHCP <range start="192.168.110.128" end="192.168.110.254"/>

KVM - Pont réseau vituel

Créez un fichier XML qui définit le pont virtuel : bridged-network.xml

1
2
3
4
5
<network>
    <name>bridged-network</name>
    <forward mode="bridge" />
    <bridge name="br0" />
</network>

Pour définir un réseau à partir d’un fichier XML sans le démarrer

1
sudo virsh net-define bridged-network.xml

Réseau bridged-network défini depuis bridged-network.xml

Pour démarrer un réseau inactif (précédemment défini)

1
sudo virsh net-start bridged-network

Réseau bridged-network démarré

Pour configurer le réseau de manière à ce qu’il démarre automatiquement au démarrage du service

1
sudo virsh net-autostart bridged-network

Réseau bridged-network marqué en démarrage automatique

Vérifier pour confirmer que le drapeau de démarrage automatique est à oui - Persistent devrait aussi lire oui.

1
sudo virsh net-list --all

Résultat

1
2
3
4
 Nom               État    Démarrage automatique   Persistent
---------------------------------------------------------------
 bridged-network   actif   Oui                     Oui
 network-nat       actif   Oui                     Oui

Créer une machine virtuelle alpine linux

1
2
3
4
5
6
7
8
9
10
11
sudo virt-install \
--osinfo alpinelinux3.17 \
--name vm-alpine01 \
--memory 2048 \
--vcpus 1 \
--cpu host \
--hvm \
--disk path=/srv/kvm/libvirt/images/vm-alpine01.qcow2,format=qcow2,size=5 \
--cdrom /home/yick/FreeUSB2To/iso/alpine-standard-3.21.0-x86_64.iso \
--network bridge=br0 \
--graphics vnc  

Prendre la main en VNC

1
ssh -L 9500:127.0.0.1:5005 yick@192.168.0.205 -p 55205 -i /home/yann/.ssh/yick-ed25519

Structure des dossiers KVM

Les dossiers libvirt : sudo find / -name "libvirt" -type d

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/sys/fs/cgroup/machine.slice/machine-qemu\x2d4\x2dalpine\x2dsearx.scope/libvirt
/sys/fs/cgroup/machine.slice/machine-qemu\x2d1\x2dalpine\x2dvm.scope/libvirt
/sys/fs/cgroup/machine.slice/machine-qemu\x2d2\x2dvm\x2dntfy.scope/libvirt
/sys/fs/cgroup/machine.slice/machine-qemu\x2d3\x2dvm\x2ddebian12.scope/libvirt
/etc/apparmor.d/libvirt
/etc/libvirt
/var/log/libvirt
/var/log/swtpm/libvirt
/var/cache/libvirt
/var/lib/libvirt
/dev/hugepages/libvirt
/usr/lib/x86_64-linux-gnu/libvirt
/usr/lib/libvirt
/usr/share/libvirt
/home/yick/.cache/libvirt
/home/yick/.config/libvirt
/srv/kvm/libvirt
/run/libvirt

Les configurations xml réseau et machines virtuelles : tree -L 3 /etc/libvirt/qemu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/etc/libvirt/qemu
├── alpine-searx.xml
├── alpine-vm.xml
├── autostart
│   ├── alpine-searx.xml -> /etc/libvirt/qemu/alpine-searx.xml
│   ├── alpine-vm.xml -> /etc/libvirt/qemu/alpine-vm.xml
│   ├── vm-debian12.xml -> /etc/libvirt/qemu/vm-debian12.xml
│   └── vm-ntfy.xml -> /etc/libvirt/qemu/vm-ntfy.xml
├── networks
│   ├── autostart
│   │   ├── bridged-network.xml -> /etc/libvirt/qemu/networks/bridged-network.xml
│   │   └── network-nat.xml -> /etc/libvirt/qemu/networks/network-nat.xml
│   ├── bridged-network.xml
│   └── network-nat.xml
├── vm-alpine01.xml
├── vm-alpine02.xml
├── vm-debian12.xml
├── vm-lldap.xml
└── vm-ntfy.xml

PHP8 + MariaDB


Installer la dernière version PHP8 sur debian 12

Ajout dépôt sury

Pour installer la version de 8 de php, ajouter le dépôt sury.

1
2
3
sudo apt install -y lsb-release apt-transport-https ca-certificates wget
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" |sudo tee /etc/apt/sources.list.d/php.list

Mise à jour des dépôts :

1
sudo apt update && sudo apt upgrade -y

Installation PHP8.3 + Modules nécessaires à Nextcloud

Installer php8.3 et modules

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sudo apt -y install \
   php8.3 \
   php8.3-fpm \
   php8.3-sqlite3 \
   php8.3-cli \
   php8.3-gd \
   php8.3-imap \
   php8.3-mysql \
   php8.3-soap \
   php8.3-apcu \
   php8.3-common \
   php8.3-gmp  \
   php8.3-intl \
   php8.3-opcache \
   php8.3-xml \
   php8.3-curl \
   php8.3-igbinary \
   php8.3-readline  \
   php8.3-zip \
   php8.3-bcmath \
   php8.3-imagick \
   php8.3-mbstring \
   php8.3-redis \
   php8.3-bz2 \
   php8.3-smbclient \
   imagemagick libmagickcore-6.q16-6-extra 

Vérifiez votre installation PHP en vérifiant sa version : php --version

1
2
3
4
PHP 8.3.14 (cli) (built: Nov 25 2024 18:23:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.14, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.14, Copyright (c), by Zend Technologies

Remplacer l’utilisateur et le groupe par défaut par www-data dans le fichier de configuration PHP-FPM.

1
sudo nano /etc/php/8.3/fpm/pool.d/www.conf

Dans le fichier, recherchez les lignes ci-dessous et changez leur valeur en www-data :

1
2
3
4
5
6
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data

listen = /run/php/php8.3-fpm.sock

Redémarrer PHP-FPM pour appliquer les modifications :

1
sudo systemctl restart php8.3-fpm

MariaDB

Installer MariaDB :

1
2
sudo apt install mariadb-server -y
sudo mysql_secure_installation # Y à tout et nouveau mot de passe n

MariaDB: Modifier ou ajouter un mot de passe root
Basculer en su (root)

1
2
3
4
5
6
7
8
# ouvrir mariadb
mariadb -uroot
# sélection base mysql
use mysql;
# définir un nouveau mot de passe root
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NouveauMotDePasse');
flush privileges;
quit;

Développement

Go + Node

1
2
3
4
5
cd ~
wget https://go.dev/dl/go1.23.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin"  >> ~/.bashrc
source ~/.bashrc
1
2
3
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
source ~/.bashrc
nvm ls-remote  # affiche les versions

Now using node v20.10.0 (npm v10.2.3)
Creating default alias: default -> 20.10.0 (-> v20.10.0)

Nginx + Certificats + sites

nginx

Nginx extras

1
sudo apt install nginx-extras

Modifier la configuration /etc/nginx/nginx.com

1
2
3
4
5
6
7
8
variables_hash_max_size 2048;

# ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_protocols TLSv1.2 TLSv1.3;

        include /etc/nginx/conf.d/*.conf;
        #include /etc/nginx/sites-enabled/*;

Certificats Let’s Encrypt

Les dossiers

1
2
sudo mkdir -p /etc/ssl/private/
sudo chown $USER -R /etc/ssl/private/

acme.sh

Installer acme

1
2
3
4
5
6
7
cd ~
sudo apt install socat -y # prérequis
#git clone https://github.com/Neilpang/acme.sh.git
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install 
# déconnexion et reconnexion utilisateur

La création des certificats pour le domaine rnmkcy.eu Exporter les clés OVH

1
acme.sh --dns dns_ovh --server letsencrypt --issue --keylength ec-384 -d 'rnmkcy.eu' -d '*.rnmkcy.eu'

L’installation dans les dossiers locaux

1
acme.sh --ecc --install-cert -d rnmkcy.eu --key-file /etc/ssl/private/rnmkcy.eu-key.pem --fullchain-file /etc/ssl/private/rnmkcy.eu-fullchain.pem

Fichier pour ssl /etc/nginx/conf.d/security.conf.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    ssl_certificate /etc/ssl/private/rnmkcy.eu-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/rnmkcy.eu-key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    #add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/ssl/private/rnmkcy.eu-fullchain.pem;

    # replace with the IP address of your resolver
    resolver 1.1.1.1 9.9.9.9 valid=300s;
    resolver_timeout 5s;

Renouvellement des certificats

La tâche crontab qui vérifie si la date de renouvellement est atteinte pour regénérer les certificats

1
6 8 * * * "/home/yick/.acme.sh"/acme.sh --cron --home "$HOME/.acme.sh" > /dev/null

Les certificats changent de date à chaque renouvellement
Le dossier certificat rnmkcy.eu après le renouvellement du 6 février 2025

Le but est de copier les certificats nouvellement générés dans le dossier de destination puis de recharger le service nginx.Nous allons surveiller dans le dossier /home/yick/.acme.sh/rnmkcy.eu_ecc/ la modification du fichier fullchain.cer qui entrainera l’exécution d’un script. Cette modification de fichier ayant lieu au renouvellement des certificats Let’s Encrypt du domaine rnmkcy.eu

Création dossier systemd utilisateur

1
mkdir -p /home/yick/.config/systemd/user/

Dans le répertoire systemd utilisateur nous créons une unité de cheminement renew-cert-rnmkcy.path

1
nano /home/yick/.config/systemd/user/renew-cert-rnmkcy.path
1
2
3
4
5
6
7
8
9
[Unit]
Description=Renouvellement certificats Lets Encrypt

[Path]
PathChanged=/home/yick/.acme.sh/rnmkcy.eu_ecc/fullchain.cer
Unit=renew-cert-rnmkcy.service

[Install]
WantedBy=default.target

Dans la section [Path], PathChanged= indique le chemin absolu du fichier à surveiller, tandis que Unit= indique l’unité de service à exécuter si le fichier change. Cette unité (renew-cert-rnmkcy.path) doit être lancée lorsque le système est en mode multi-utilisateur.

Ensuite, nous créons l’unité de service correspondante, renew-cert-rnmkcy.service, dans le répertoire ~/.config/systemd/user/
Si le fichier sitemap.xml change (c’est-à-dire qu’il est à la fois écrit et fermé), l’unité de service suivante sera appelée pour exécuter le script spécifié :

1
nano /home/yick/.config/systemd/user/renew-cert-rnmkcy.service
1
2
3
4
5
[Unit] 
Description=Renouvellement certificats Lets Encrypt

[Service]
ExecStart=/home/yick/scripts/renew-cert-rnmkcy.sh

Création du script /home/yick/scripts/renew-cert-rnmkcy.sh pour l’installation des certificats et la recharge du service nginx

Etendre Réduire renew-cert-rnmkcy.sh
#!/bin/bash

/home/yick/.acme.sh/acme.sh --install-cert -d rnmkcy.eu \
 --key-file /etc/ssl/private/rnmkcy.eu-key.pem \
 --fullchain-file /etc/ssl/private/rnmkcy.eu-fullchain.pem \
 --reloadcmd "sudo systemctl reload nginx.service"

# Envoi information
curl \
    -H "Title: $(date '+%d/%m/%Y %H:%M')" \
    -H "Authorization: Bearer tk_xxxxxxxxxxxxxxxxxxxxxxxx" \
    -H prio:low \
    -H tags:information_source \
    -d "Renouvellement certificats Let's Encrypt domaine rnmkcy.eu" \
    https://noti.rnmkcy.eu/yan_infos

Le rendre exécutable

1
chmod +x /home/yick/scripts/renew-cert-rnmkcy.sh

Activation et lancement

1
2
systemctl --user daemon-reload
systemctl --user enable renew-cert-rnmkcy.path --now

il est possible de dire à systemd que l’instance d’un utilisateur soit tout le temps présente, du boot au shutdown, ce qui permet d’avoir des processus (services) utilisateurs qui tournent sans avoir de session ouverte.

1
sudo loginctl enable-linger $USER

Voir si path actif

LLDAP (lldap.rnmkcy.eu)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server {
    listen 80;
    listen [::]:80;
    server_name  lldap.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://lldap.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  lldap.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;

    # connexion nginx fermée si sous domaine inexistant
    if ($http_host != "lldap.rnmkcy.eu") {
     return 444;
    }

  location / { 
     proxy_pass              http://127.0.0.1:17170;
  } 

}

Vérifier et recharger nginx

1
2
sudo nginx -t
sudo systemctl reload nginx

Accès par le lien https://lldap.rnmkcy.eu

Nextcloud (cloud.rnmkcy.eu]

Base mysql nextcloud

en mode su

1
2
3
4
MOTPASSEDB="Mot_passe_base_bextcloud"
mysql -uroot -e "CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; \
   CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY '$MOTPASSEDB'; \
   GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost' IDENTIFIED BY '$MOTPASSEDB'; FLUSH PRIVILEGES;"

Pour info
Effacer une base : mysql -uroot -e 'DROP DATABASE nextcloud'
Effacer un utilisateur : mysql -uroot -e 'DROP USER "nextcloud"@"localhost";'

Nextcloud Nginx mimes

Les sections Activité et Logging dans le cadre de l’administration affiche des pages vierges

C’est une indication que votre serveur web n’est pas configuré pour gérer correctement les fichiers mjs.

Il faut modifier le fichier “mime.types” situé dans /etc/nginx/mime.type, remplaçer la ligne suivante:

1
application/javascript js;

par

1
application/javascript js mjs;

Puis redémarrer Nginx et php-fpm.

Installer dernière version nextcloud

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# mode su
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
# checksum et vérification
#wget https://download.nextcloud.com/server/releases/latest.tar.bz2.sha256
#sha256sum -c latest.tar.bz2.sha256 < latest.tar.bz2 
# Décompression, déplacement et effacement
tar -xvf latest.tar.bz2
mv nextcloud /var/www/
rm latest.tar.bz2
# Utilisateur nextcloud et droits
useradd -r nextcloud
chown -R nextcloud:www-data /var/www/nextcloud
chmod -R o-rwx /var/www/nextcloud
# Nextcloud data
mkdir -p /srv/nextcloud-data/
chown -R nextcloud:nextcloud /srv/nextcloud-data/
chmod -R o-rwx /srv/nextcloud-data/

Pool PHP-FPM Nextcloud

Pool PHP-FPM 8.3 Nextcloud : /etc/php/8.3/fpm/pool.d/nextcloud.conf en mode su

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[nextcloud]

user = nextcloud
group = nextcloud

chdir = /var/www/nextcloud

listen = /var/run/php/php8.3-fpm-nextcloud.sock
listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 16
pm.max_requests = 500
request_terminate_timeout = 1d


pm.start_servers = 6
pm.min_spare_servers = 5
pm.max_spare_servers = 8


; Additional php.ini defines, specific to this pool of workers.
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
php_admin_value[memory_limit] = 512M
php_value[upload_max_filesize] = 10G
php_value[post_max_size] = 10G
php_value[default_charset] = UTF-8
php_value[opcache.enable_cli]=1
php_value[opcache.memory_consumption]=256
php_value[opcache.interned_strings_buffer]=128
php_value[opcache.max_accelerated_files]=32530
php_value[opcache.save_comments]=1
php_value[opcache.revalidate_freq]=60
php_value[opcache.jit]=1255
php_value[opcache.jit_buffer_size]=128M
php_value[apc.enabled]=1
php_value[apc.enable_cli]=1

Avec ldap

1
sudo apt install php8.3-ldap

Relancer le service

1
sudo systemctl restart php8.3-fpm

Nextcloud Vhost nginx (cloud.rnmkcy.eu)

Nexcloud sur le domaine cloud.rnmkcy.eu avec certificats Let’s Encrypt

Le fichier de configuration web cloud.rnmkcy.eu.conf /etc/nginx/conf.d/cloud.rnmkcy.eu.conf

Etendre Réduire cloud.rnmkcy.eu.conf
  
upstream php-handler {
    server unix:/var/run/php/php8.3-fpm-nextcloud.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name cloud.rnmkcy.eu;
    # enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name cloud.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    more_set_headers "Strict-Transport-Security : max-age=63072000; includeSubDomains; preload";


#    include snippets/authelia-location.conf; # Authelia auth endpoint

  
location ^~ /.well-known {
  # The following 6 rules are borrowed from `.htaccess`

  # The following 2 rules are only needed for the user_webfinger app.
  # Uncomment it if you're planning to use this app.
  #rewrite ^/\.well-known/host-meta\.json  /public.php?service=host-meta-json  last;
  #rewrite ^/\.well-known/host-meta        /public.php?service=host-meta       last;

  location = /.well-known/carddav     { return 301 /remote.php/dav/; }
  location = /.well-known/caldav      { return 301 /remote.php/dav/; }

  location = /.well-known/webfinger     { return 301 /index.php$uri; }
  location = /.well-known/nodeinfo      { return 301 /index.php$uri; }

  try_files $uri $uri/ =404;
}

#sub_path_only rewrite ^/$ / permanent;
location ^~ / {

  # Path to source
  alias /var/www/nextcloud/;

  # Set max upload size
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  # Enable gzip but do not remove ETag headers
  gzip on;
  gzip_vary on;
  gzip_comp_level 4;
  gzip_min_length 256;
  gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
  gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application//+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

  # Pagespeed is not supported by Nextcloud, so if your server is built
  # with the `ngx_pagespeed` module, uncomment this line to disable it.
  #pagespeed off;

  # The settings allows you to optimize the HTTP2 bandwitdth.
  # See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
  # for tunning hints
  client_body_buffer_size 512k;

  # HTTP response headers borrowed from Nextcloud `.htaccess`
  #more_set_headers "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload;";
  more_set_headers "Referrer-Policy: no-referrer";
  more_set_headers "X-Content-Type-Options: nosniff";
  more_set_headers "X-Download-Options: noopen";
  more_set_headers "X-Frame-Options: SAMEORIGIN";
  more_set_headers "X-Permitted-Cross-Domain-Policies: none";
  more_set_headers "X-Robots-Tag: noindex, nofollow";
  more_set_headers "X-XSS-Protection: 1; mode=block";

  # Remove X-Powered-By, which is an information leak
  fastcgi_hide_header X-Powered-By;

  # Specify how to handle directories -- specifying `/nextcloud/index.php$request_uri`
  # here as the fallback means that Nginx always exhibits the desired behaviour
  # when a client requests a path that corresponds to a directory that exists
  # on the server. In particular, if that directory contains an index.php file,
  # that file is correctly served; if it doesn't, then the request is passed to
  # the front-end controller. This consistent behaviour means that we don't need
  # to specify custom rules for certain paths (e.g. images and other assets,
  # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus
  # `try_files $uri $uri/ /nextcloud/index.php$request_uri`
  # always provides the desired behaviour.
  index index.php index/ /index.php$request_uri;

  # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
  location = / {
      if ( $http_user_agent ~ ^DavClnt ) {
          return 302 /remote.php/webdav/$is_args$args;
      }
  }

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }

  # Rules borrowed from `.htaccess` to hide certain paths from clients
  location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)    { return 404; }
  location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                  { return 404; }

  # Ensure this block, which passes PHP files to the PHP process, is above the blocks
  # which handle static assets (as seen below). If this block is not declared first,
  # then Nginx will encounter an infinite rewriting loop when it prepends
  # `/nextcloud/index.php` to the URI, resulting in a HTTP 500 error response.
  location ~ \.php(?:$|/) {
    # Required for legacy support
    rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode\/proxy|.+\/richdocumentscode_arm64\/proxy) /index.php$request_uri;
    
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    set $path_info $fastcgi_path_info;
    
    try_files $fastcgi_script_name =404;
    
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param HTTPS on;

    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
    fastcgi_param front_controller_active true;     # Enable pretty urls
    fastcgi_param HTTP_ACCEPT_ENCODING "";          # Disable encoding of nextcloud response to inject ynh scripts
    fastcgi_pass php-handler;

    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;

    fastcgi_read_timeout 600;
    fastcgi_send_timeout 600;
    fastcgi_connect_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    proxy_read_timeout 600;
    send_timeout 600;
  }

  location ~ ^/(?:updater|ocs-provider)(?:$|/) {
       try_files $uri/ =404;
       index index.php;
  }

  # Serve static files
  location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
    try_files $uri / /index.php$request_uri;
    expires 6M;         # Cache-Control policy borrowed from `.htaccess`
    access_log off;     # Optional: Don't log access to assets

    location ~ \.wasm$ {
            default_type application/wasm;
    }
  }

  location ~ \.woff2?$ {
    try_files $uri / /index.php$request_uri;
    expires 7d;         # Cache-Control policy borrowed from `.htaccess`
    access_log off;     # Optional: Don't log access to assets
  }

  # Rule borrowed from `.htaccess`
    location /remote {
      return 301 /remote.php$request_uri;
    }

  location ~ / {
    if ($request_method ~ ^(PUT|DELETE|PATCH|PROPFIND|PROPPATCH)$) {
        rewrite ^ /index.php$request_uri last;
    }
    try_files $uri / /index.php$request_uri;
  }
# include snippets/authelia-authrequest.conf; # Protect this endpoint
}


    access_log /var/log/nginx/cloud.rnmkcy.eu-access.log;
    error_log /var/log/nginx/cloud.rnmkcy.eu-error.log;
}

Vérifier et recharger nginx : sudo nginx -t && sudo systemctl reload nginx

Finaliser installation Nextcloud

Tout est paramétré avec le domaine ouestyan.fr qu'il faut remplacer par votre domaine

Ouvrir le lien https://cloud.rnmkcy.eu
Créer un compte administrateur et son mot de passe
Renseigner les éléments de la base mysql

Se déconnecter…

Nextcloud Travaux cron
Vous pouvez programmer des tâches cron de trois façons : en utilisant AJAX, Webcron ou cron.
La méthode recommandée est cron</u>.

Note : Il n’est pas obligatoire de sélectionner l’option Cron dans le menu d’administration pour les travaux en arrière-plan, car une fois que cron.php est exécuté à partir de la ligne de commande ou du service cron, il sera automatiquement réglé sur Cron.

Il faut créer une tâche utilisateur nextcloud pour cron

1
2
su
sudo -u nextcloud crontab -e
1
2
# tous les 5 min
*/5  *  *  *  * php -f /var/www/nextcloud/cron.php

Modifier le fichier /var/www/nextcloud/config/config.php
Ajouter 'default_phone_region' => 'FR', et les lignes suivantes dans le fichier /var/www/nextcloud/config/config.php avant le tag de fin de fichier );

1
2
3
4
5
6
7
8
9
10
11
  'default_locale' => 'fr_FR',
  'default_phone_region' => 'FR',
  'filelocking.enabled' => true,
  'memcache.locking' => '\OC\Memcache\Redis',
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'redis' => array(
    'host' => 'localhost',
    'port' => 6379,
    'timeout' => 0.0,
    'password' => '',
  ),

Messagerie pour notifications

Serveur de messagerie, ajouter les lignes dans le fichier /var/www/nextcloud/config/config.php avant le tag de fin de fichier );

1
2
3
4
5
6
7
8
9
  'mail_from_address' => 'yick',
  'mail_smtpmode' => 'smtp',
  'mail_sendmailmode' => 'smtp',
  'mail_domain' => 'yanfi.net',
  'mail_smtphost' => 'mx1.xoyize.xyz',
  'mail_smtpport' => '587',
  'mail_smtpauth' => 1,
  'mail_smtpname' => 'yanfi@yanfi.net',
  'mail_smtppassword' => 'Mot_de_passe_smtp_yanfi',

Nextcloud maintenance_window_start

Le paramètre maintenance_window_start n’est pris en compte qu’en mode cron.

Dans le fichier config/config.php, vous pouvez spécifier cette configuration. Certaines tâches de fond ne s’exécutent qu’une fois par jour. Lorsqu’une heure est définie (le fuseau horaire est UTC) pour cette configuration, les tâches d’arrière-plan qui s’annoncent comme non sensibles au temps seront retardées pendant les heures “ouvrables” et ne s’exécuteront que dans les 4 heures suivant l’heure donnée. Ceci est par exemple utilisé pour l’expiration des activités, la formation aux connexions suspectes et les vérifications de mise à jour.

Une valeur de 1, par exemple, n’exécutera ces tâches d’arrière-plan qu’entre 01h00 UTC et 05h00 UTC.

Ajouter le paramètre au fichier /var/www/nextcloud/config/config.php

1
  'maintenance_window_start' => 1,

Avertissements

One or more mimetype migrations are available. Occasionally new mimetypes are added to better handle certain file types. Migrating the mimetypes take a long time on larger instances so this is not done automatically during upgrades. Use the command occ maintenance:repair --include-expensive to perform the migrations

1
2
3
# en mode su
cd /var/www/nextcloud
sudo -u nextcloud php occ maintenance:repair --include-expensive

Des indices facultatifs manquants ont été détectés. De nouveaux indices sont parfois ajoutés (par Nextcloud ou des applications installées) pour améliorer les performances de la base de données. L’ajout d’indices peut parfois prendre un certain temps et nuire temporairement aux performances. Cette opération n’est donc pas effectuée automatiquement lors des mises à niveau. Une fois les indices ajoutés, les requêtes sur ces tables devraient être plus rapides. Utilisez la commande occ db:add-missing-indices pour les ajouter.Index manquants : “systag_by_objectid” dans le tableau “systemtag_object_mapping”. Pour plus d’information, voir la documentation ↗.

1
sudo -u nextcloud php occ db:add-missing-indices

overwrite.cli.url
Utilisez ce paramètre de configuration pour spécifier l’URL de base pour toutes les URL qui sont générées dans Nextcloud en utilisant n’importe quel type d’outils de ligne de commande (cron ou occ). La valeur doit contenir l’URL de base complète

1
sudo -u nextcloud php occ config:system:set overwrite.cli.url --value=https://cloud.rnmkcy.eu

System config value overwrite.cli.url set to string https://cloud.rnmkcy.eu

Comptes utilisateurs nextcloud via LLDAP

On utilise LLDAP pour la gestion des utilisateurs
Se connecter sur nextcloud avec adminyann
Ci-dessous les paramètres

  1. Host: 127.0.0.1
  2. Port: 3890
  3. Utilisateur DN : uid=admin,ou=people,dc=rnmkcy,dc=eu
  4. Mot de passe admin LLDAP
  5. DN de base: dc=rnmkcy,dc=eu

Utilisateurs , requête LLDAP : (|(objectclass=inetOrgPerson) (memberOf=cn=nextcloud_users,ou=groups,dc=rnmkcy,dc=eu))

Suivre la procédure LLDAP - Gestion des utilisateurs

Synchronisations

Depuis le poste PC1, se connecter yann

HTTP Observatory Report

Cet outil, développé par Mozilla, est un observatoire qui vous aidera, en tant que propriètaire de site, à vérifier divers éléments de sécurité. Il effectuera des test pour vérifier de nombreux éléments de sécurité Donnera une note sous forme de lettre à votre site. Et vous donnera aussi des directives d’amélioration et de nombreuses explications.
https://observatory.mozilla.org/

Résultat

Authentification unique (SSO Authelia)

L’authentification unique, souvent désignée par le sigle anglais SSO (de single sign-on) est une méthode permettant à un utilisateur d’accéder à plusieurs applications informatiques (ou sites web sécurisés) en ne procédant qu’à une seule authentification.(Authentification unique WikipédiA )

Light Lightweight Directory Access Protocol (LLDAP) est à l’origine un protocole permettant l’interrogation et la modification des services d’annuaire. Ce protocole repose sur TCP/IP. Il a cependant évolué pour représenter une norme pour les systèmes d’annuaires, incluant un modèle de données, un modèle de nommage, un modèle fonctionnel basé sur le protocole LDAP, un modèle de sécurité et un modèle de réplication. C’est une structure arborescente dont chacun des nœuds est constitué d’attributs associés à leurs valeurs

Avec une solution SSO, le login est redirigé vers une seule application et l’utilisateur se verra toujours présenter la même page de connexion quelque soient les applications finales qu’il utilisera.

ATTENTION:Le service authelia est en erreur sytématiquement après un redémarrage car la machine virtuelle KVM lldap (hébergée dans le serveur Lenovo) n’est pas entièrement active lorsque le service authelia est lancé

SOLUTION: Il faut retarder le lancement du service authelia de 30s en ajoutant la ligne ExecStartPre=/bin/sleep 30 avant ExecStart=/usr/bin/authelia --config /etc/authelia/configuration.yml dans le fichier /lib/systemd/system/authelia.service

LLdap - Gestionnaire web (lldap.rnmkcy.eu)

Gestion de l’annuaire lldap des utilisateurs (LLdap serveur (Debian))

Création proxy nginx pour le gestionnaire web LLdap

1
/etc/nginx/conf.d/lldap.rnmkcy.eu.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server {
    listen 80;
    listen [::]:80;
    server_name  lldap.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://lldap.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  lldap.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;

    # connexion nginx fermée si sous domaine inexistant
    if ($http_host != "lldap.rnmkcy.eu") {
     return 444;
    }

  location / { 
     proxy_pass              http://127.0.0.1:17170;
  } 

}

Vérifier et recharger nginx: sudo nginx -t && sudo systemctl reload nginx
Accès par le lien https://lldap.rnmkcy.eu/

Authelia SSO+Nginx (auth.rnmkcy.eu)


Authelia pour gérer les autorisations d’accès à des applications en s’appuyant sur l’annuaire lldap (SSO Authelia)

Modifier authentication_backend dans le fichier de configuration authelia pour communiquer avec le serveur lldap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
authentication_backend:
  # Password reset through authelia works normally.
  password_reset:
    disable: false
  # How often authelia should check if there is an user update in LDAP
  refresh_interval: 1m
  ldap:
    implementation: custom
    # Pattern is ldap://HOSTNAME-OR-IP:PORT
    # Port de saut normal est 389, standard dans LLDAP est 3890
    url: ldap://127.0.0.1:3890
    # The dial timeout for LDAP.
    timeout: 5s
    # Utilisez StartTLS avec la connexion LDAP, TLS est non supporté maintenant
    start_tls: false
    #tls:
    #  skip_verify: false
    #  minimum_version: TLS1.2
    # Set base dn, like dc=google,dc.com
    base_dn: dc=rnmkcy,dc=eu
    username_attribute: uid
    # Vous devez configurer cela à ou=people, parce que tous les utilisateurs sont stockés dans cette ou!
    additional_users_dn: ou=people
    # Pour permettre la connexion avec le nom d'utilisateur et l'email
    # on peut utiliser un filtre comme
    # (&(|({username_attribute}={input})({mail_attribute}={input}))(objectClass=person))
    users_filter: "(&({username_attribute}={input})(objectClass=person))"
    # Définir ceci à ou=groups, parce que tous les groupes sont stockés dans cette ou
    additional_groups_dn: ou=groups
    # Les groupes ne sont pas affichés dans l'interface utilisateur, mais ce filtre fonctionne.
    groups_filter: "(member={dn})"
    # L'attribut tenant le nom du groupe.
    group_name_attribute: cn
    # Attribut email
    mail_attribute: mail
    # L'attribut tenant le nom d'affichage de l'utilisateur. 
    # Cela sera utilisé pour accueillir un utilisateur authentifié.
    display_name_attribute: displayName
    # Le nom d'utilisateur et mot de passe de l'utilisateur admin.
    # "admin" devrait être le nom d'utilisateur administrateur que vous définissez dans la configuration LLDAP
    user: uid=admin,ou=people,dc=rnmkcy,dc=eu
    # Le mot de passe peut également être défini en utilisant un secret:
    # https://www.authelia.com/docs/configuration/secrets/
    password: '<Mot de passe administrateur ldap>'

Le fichier complet de configuration authelia /etc/authelia/configuration.yml

Etendre Réduire configuration.yml
  
###############################################################################
#                           Authelia Configuration                            #
###############################################################################

theme: dark
##
## Identity Validation Configuration
##
## This configuration tunes the identity validation flows.
identity_validation:
  ## Reset Password flow. Adjusts how the reset password flow operates.
  reset_password:
    jwt_secret: "Générer avec la commande : tr -cd '[:alnum:]' < /dev/urandom | fold -w 64 | head -n 1 | tr -d '\n' ; echo"

server:
  #host: 127.0.0.1
  #port: 9091
  #path: ""
  address: 'tcp://127.0.0.1:9091/'
  disable_healthcheck: false
  tls:
    key: ""
    certificate: ""
  ## Server Endpoints configuration.
  ## This section is considered advanced and it SHOULD NOT be configured unless you've read the relevant documentation.
  endpoints:
    ## Enables the pprof endpoint.
    enable_pprof: false
    ## Enables the expvars endpoint.
    enable_expvars: false

log:
  level: info
  file_path: '/etc/authelia/authelia.log'

totp:
  issuer: rnmkcy.eu
  period: 30
  skew: 1

##
## WebAuthn Configuration
##
webauthn:
  ## Désactiver Webauthn.
  disable: false

  ## Ajuster le délai d'interaction pour les dialogues Webauthn.
  timeout: 60s

  ## Le nom d'affichage que le navigateur doit montrer à l'utilisateur lorsqu'il utilise
  ##  Webauthn pour se connecter ou s'enregistrer.
  display_name: Authelia

  ## La préférence de transmission contrôle si nous collectons la déclaration d'attestation,
  ##  y compris l'AAGUID, à partir de l'appareil.
  ## Les options sont none, indirect, direct.
  attestation_conveyance_preference: indirect

  ## Contrôle si l'utilisateur doit faire un geste ou une action pour confirmer sa présence.
  ## Les options sont : required, preferred, discouraged.
  user_verification: preferred


##
## authentification LLDAP
##
authentication_backend:
  password_reset:
    disable: false
  refresh_interval: 1m
  ldap:
    implementation: custom
    address: ldap://127.0.0.1:3890
    timeout: 5s
    start_tls: false
    base_dn: dc=rnmkcy,dc=eu
    additional_users_dn: ou=people
    users_filter: "(&({username_attribute}={input})(objectClass=person))"
    additional_groups_dn: ou=groups
    groups_filter: "(member={dn})"
    user: uid=admin,ou=people,dc=rnmkcy,dc=eu
    password: 'Mot_de_passe_LLDAP'
    attributes:
      mail: 'mail'
      username: 'uid'
      group_name: 'cn'
      display_name: 'displayName'

access_control:
  default_policy: deny
  rules:
    ## bypass rule
    - domain:
        - "auth.rnmkcy.eu"
        - "cloud.rnmkcy.eu"
        - "searx.rnmkcy.eu"
      policy: bypass
    ## catch-all
    - domain:
        - "calibre.rnmkcy.eu"
      policy: one_factor
    - domain:
        - "site.rnmkcy.eu"
        - "cockpit.rnmkcy.eu"
      policy: two_factor

session:
  secret: 'Générer avec la commande : tr -cd '[:alnum:]' < /dev/urandom | fold -w 64 | head -n 1 | tr -d '\n' ; echo'
  name: 'authelia_session'
  same_site: 'lax'
  inactivity: '45m'
  expiration: '12h'
  remember_me: '2M'
  cookies:
    - domain: 'rnmkcy.eu'
      authelia_url: 'https://auth.rnmkcy.eu'
      default_redirection_url: 'https://rnmkcy.eu'
      name: 'authelia_session'
      same_site: 'lax'
      inactivity: '45m'
      expiration: '12h'
      remember_me: '1d'
  redis:
    host: localhost
    port: 6379
    #password: ""
    database_index: 0
    maximum_active_connections: 10
    minimum_idle_connections: 0

regulation:
  max_retries: 3
  find_time: 10m
  ban_time: 12h

storage:
  encryption_key: "Générer avec la commande : tr -cd '[:alnum:]' < /dev/urandom | fold -w 64 | head -n 1 | tr -d '\n' ; echo"
  mysql:
    address: '127.0.0.1:3306'
    database: authelia
    username: authelia
    password: "Mot_de_passe_base_mysql_authelia"

#notifier:
#  disable_startup_check: false
#
#  filesystem:
#    filename: /etc/authelia/notification.txt

notifier:
  disable_startup_check: false

  smtp:
    username: "yanfi@yanfi.net"
    ## Password can also be set using a secret: https://www.authelia.com/docs/configuration/secrets/
    password: "Mot_de_passe_smtp_yanfi"
    address: "submission://mx1.xoyize.xyz:587"
    sender: "yanfi@yanfi.net"
    ## Subject configuration of the emails sent. {title} is replaced by the text from the notifier.
    subject: "[Authelia] {title}"

Les fichiers de configuration nginx pour authelia

Etendre Réduire /etc/nginx/snippets/authelia-authrequest.conf
  
# Basic Authelia Config
# Send a subsequent request to Authelia to verify if the user is authenticated
# and has the right permissions to access the resource.
auth_request /authelia;
# Set the `target_url` variable based on the request. It will be used to build the portal
# URL with the correct redirection parameter.
auth_request_set $target_url $scheme://$http_host$request_uri;
# Set the X-Forwarded-User and X-Forwarded-Groups with the headers
# returned by Authelia for the backends which can consume them.
# This is not safe, as the backend must make sure that they come from the
# proxy. In the future, it's gonna be safe to just use OAuth.
auth_request_set $user $upstream_http_remote_user;
auth_request_set $groups $upstream_http_remote_groups;
auth_request_set $name $upstream_http_remote_name;
auth_request_set $email $upstream_http_remote_email;
proxy_set_header Remote-User $user;
proxy_set_header Remote-Groups $groups;
proxy_set_header Remote-Name $name;
proxy_set_header Remote-Email $email;
# If Authelia returns 401, then nginx redirects the user to the login portal.
# If it returns 200, then the request pass through to the backend.
# For other type of errors, nginx will handle them as usual.
error_page 401 =302 https://auth.rnmkcy.eu/?rd=$target_url;
Etendre Réduire /etc/nginx/snippets/authelia-location.conf
  
# Virtual endpoint created by nginx to forward auth requests.
location /authelia {
    internal;
    set $upstream_authelia http://127.0.0.1:9091/api/verify;
    proxy_pass_request_body off;
    proxy_pass $upstream_authelia;    
    proxy_set_header Content-Length "";

    # Timeout if the real server is dead
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

    # [REQUIRED] Needed by Authelia to check authorizations of the resource.
    # Provide either X-Original-URL and X-Forwarded-Proto or
    # X-Forwarded-Proto, X-Forwarded-Host and X-Forwarded-Uri or both.
    # Those headers will be used by Authelia to deduce the target url of the     user.
    # Basic Proxy Config
    client_body_buffer_size 128k;
    proxy_set_header Host $host;
    proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr; 
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Uri $request_uri;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_redirect  http://  $scheme://;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_cache_bypass $cookie_session;
    proxy_no_cache $cookie_session;
    proxy_buffers 4 32k;

    # Advanced Proxy Config
    send_timeout 5m;
    proxy_read_timeout 240;
    proxy_send_timeout 240;
    proxy_connect_timeout 240;
}
Etendre Réduire /etc/nginx/snippets/proxy.conf
  
## Headers
proxy_set_header Host $host;
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";

## Basic Proxy Configuration
client_body_buffer_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; ## Timeout if the real server is dead.
proxy_redirect  http://  $scheme://;
proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
proxy_buffers 64 256k;

## Trusted Proxies Configuration
## Please read the following documentation before configuring this:
##     https://www.authelia.com/integration/proxies/nginx/#trusted-proxies
# set_real_ip_from 10.0.0.0/8;
# set_real_ip_from 172.16.0.0/12;
# set_real_ip_from 192.168.0.0/16;
# set_real_ip_from fc00::/7;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

## Advanced Proxy Configuration
send_timeout 5m;
proxy_read_timeout 360;
proxy_send_timeout 360;
proxy_connect_timeout 360;

Le sso est en place , il faut modifier les fichiers de configuration nginx des applications concernées

Protection des applications

  • Ne pas oublier de recharger nginx après chaque modification des fichiers de configuration : sudo systemctl reload nginx
  • Ajouter le site dans le fichier de configuration /etc/authelia/configuration.yml entre domain et policy: one_factor de la balise acces_control entre
  • Relancer le service authelia : sudo systemctl restart authelia

Domaines et sous Domaines rnmkcy.eu

Dossier racine rnmkcy.eu

1
/etc/nginx/conf.d/rnmkcy.eu.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    add_header Content-Security-Policy "script-src 'self' *.rnmkcy.eu; object-src 'self' *.rnmkcy.eu";

    root /sharenfs/rnmkcy/racine/ ;
        location / {
            index index.htm index/ index.php;
        }
  location ~ \.php(?:$|/) {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param HTTPS on;

    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
    fastcgi_param front_controller_active true;     # Enable pretty urls
    fastcgi_param HTTP_ACCEPT_ENCODING "";          # Disable encoding of nextcloud response to inject ynh scripts
    fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;
  }

}

Site statique jekyll (static.rnmkcy.eu)

Regroupe static site diceware et cartes

1
/etc/nginx/conf.d/static.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name static.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    root /sharenfs/multimedia/Divers/static/;

    location / {
      index index.htm index/ index.php;
		  location ~ \.php(?:$|/) {
		    include fastcgi_params;
		    fastcgi_param SCRIPT_FILENAME $request_filename;
		    fastcgi_split_path_info ^(.+\.php)(/.+)$;
		    fastcgi_param HTTPS on;
		
		    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
		    fastcgi_param front_controller_active true;     # Enable pretty urls
		    fastcgi_param HTTP_ACCEPT_ENCODING "";          # Disable encoding of nextcloud response to inject ynh scripts
		    fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
		    fastcgi_intercept_errors on;
		    fastcgi_request_buffering off;
		  }
    }
}

Site statique jekyll (chirpy.rnmkcy.eu)

1
/etc/nginx/conf.d/chirpy.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name chirpy.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    root /sharenfs/multimedia/Divers/_site/;

    location / {
      index index.html;
    }
}

Mot passe haute entropie (dice.rnmkcy.eu)

1
/etc/nginx/conf.d/dice.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name dice.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    root /sharenfs/multimedia/Divers/diceware/;

    location / {
      index index.htm index/;
    }
}

Leaflet cartographie osm-new (osm.rnmkcy.eu)

1
/etc/nginx/conf.d/osm.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name osm.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    root /sharenfs/multimedia/Divers/osm-new/;

    location / {
      index index.htm index/;
    }
}

Recharger : sudo systemctl reload nginx

Accès

Shaarli liens (shaarli.rnmkcy.eu)

Shaarli, le service personnel, minimaliste, super rapide, sans base de données, signet.

Installer Shaarli

Pour installer Shaarli, il suffit de placer les fichiers de la dernière archive .zip sous la racine du document de votre serveur web (directement à la racine du document, ou dans un sous-répertoire). Téléchargez l’archive shaarli-vX.X.X-full pour y inclure les dépendances.

1
2
3
wget https://github.com/shaarli/Shaarli/releases/download/v0.13.0/shaarli-v0.13.0-full.zip
unzip shaarli-v0.13.0-full.zip
sudo rsync -avP Shaarli/ /var/www/shaarli.rnmkcy.eu/

Définir les permissions de fichier

Quelle que soit la méthode d’installation, les autorisations de fichiers appropriées doivent être définies:

1
2
3
sudo chown -R root:www-data /var/www/shaarli.rnmkcy.eu
sudo chmod -R g+rX /var/www/shaarli.rnmkcy.eu
sudo chmod -R g+rwX /var/www/shaarli.rnmkcy.eu/{cache/,data/,pagecache/,tmp/}

nginx php-fpm

Installer si nécessaire nginx et php-fpm

1
sudo apt install nginx php-fpm

Extensions PHP nécessaires

Installer

1
sudo apt install php8.3-xml php8.3-common php8.3-gd php8.3-intl php8.3-curl php8.3-mbstring

Le fichier php fpm /etc/php/8.3/fpm/pool.d/shaarli.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[shaarli]

user = www-data
group = www-data

listen = /var/run/php/php8.3-fpm-shaarli.sock

listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

; Default Value: current directory or / when chroot
chdir = /var/www/shaarli.rnmkcy.eu

Modifier le fichier de configuration de virtualhost

1
sudo nano /etc/nginx/conf.d/shaarli.rnmkcy.eu.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
server {
    listen 80;
    listen [::]:80;
    server_name  shaarli.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://shaarli.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  shaarli.rnmkcy.eu;
    root         /var/www/shaarli.rnmkcy.eu;

    # log file locations
    # combined log format prepends the virtualhost/domain name to log entries
    access_log  /var/log/nginx/access.log combined;
    error_log   /var/log/nginx/error.log;

    include /etc/nginx/conf.d/security.conf.inc;
    #include snippets/authelia-location.conf; # Authelia auth endpoint

    # increase the maximum file upload size if needed: by default nginx limits file upload to 1MB (413 Entity Too Large error)
    client_max_body_size 100m;

    # relative path to shaarli from the root of the webserver
    # if shaarli is installed in a subdirectory of the main domain, edit the location accordingly
    location / {
        # default index file when no file URI is requested
        index index.php;
        try_files _ /index.php$is_args$args;
    }

    location ~ (index)\.php$ {
        try_files $uri =404;
        # slim API - split URL path into (script_filename, path_info)
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # pass PHP requests to PHP-FPM
        fastcgi_pass   unix:/var/run/php/php8.3-fpm-shaarli.sock;
        fastcgi_index  index.php;
        include        fastcgi.conf;
     #include snippets/authelia-authrequest.conf; # Protect this endpoint
    }

    location ~ /doc// {
        default_type "text/";
        try_files $uri $uri/ $uri/ =404;
    }

    location = /favicon.ico {
        # serve the Shaarli favicon from its custom location
        alias /var/www/shaarli/images/favicon.ico;
    }

    # allow client-side caching of static files
    location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ {
        expires    max;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        # HTTP 1.0 compatibility
        add_header Pragma public;
    }
}

Vérifier

1
sudo nginx -t

Recharger les configurations php-fpm nginx

1
sudo systemctl reload php8.3-fpm nginx

Configurer Shaarli

Ouvrir le lien https://shaarli.rnmkcy.eu


Après avoir cliqué sur “Install” on arrive sur la page de connexion

Pour une utilisation avec Lldap(A VERIFIER)
IP_SRV_LLDAP=127.0.0.1
Si utilisation serveur LLDAP, ajouter les lignes suivantes au fichier /var/www/shaarli.rnmkcy.eu/data/config.json.php

1
2
3
4
    "ldap": {
        "host": "ldap://127.0.0.1:3890",
        "dn": "uid=%s,ou=people,dc=domain,dc=com"
    }

Gitea (gitea.rnmkcy.eu)

Gitea est une forge logicielle libre en Go sous licence MIT, pour l’hébergement de développement logiciel, basé sur le logiciel de gestion de versions Git pour la gestion du code source, comportant un système de suivi des bugs, un wiki, ainsi que des outils pour la relecture de code.

/etc/nginx/conf.d/gitea.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
    listen 80;
    listen [::]:80;
    server_name  gitea.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://gitea.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  gitea.rnmkcy.eu;
    client_max_body_size 100M;
    include /etc/nginx/conf.d/security.conf.inc;

  location / { 
      proxy_pass              http://127.0.0.1:3000;
  } 

}

Gpx studio (gpx.rnmkcy.eu)

Après la construction on copie le dossier build sous /var/www/gpx

1
2
3
sudo cp -r /sharenfs/rnmkcy/gpx.studio/website/build /var/www/gpx.studio
# les droits
sudo chown www-data:www-data -R /var/www/gpx.studio

Le site est accessible dans le dossier /sharenfs/rnmkcy/gpx.studio/website/build/ Configuration nginx /etc/nginx/conf.d/gpx.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name gpx.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    root /var/www/gpx.studio/;

    location / {
      index index/;
    }
}

Vérifier et recharger nginx

1
2
sudo nginx -t
sudo systemctl reload nginx

Accès par le lien https://gpx.rnmkcy.eu

Divers et tests (site.rnmkcy.eu)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name site.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    # Authelia
    include snippets/authelia-location.conf; # Authelia auth endpoint
    root /sharenfs/rnmkcy/site/;

    location / {
      index index/ index.php /_h5ai/public/index.php;
		  location ~ \.php(?:$|/) {
		    include fastcgi_params;
		    fastcgi_param SCRIPT_FILENAME $request_filename;
		    fastcgi_split_path_info ^(.+\.php)(/.+)$;
		    fastcgi_param HTTPS on;
		
		    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
		    fastcgi_param front_controller_active true;     # Enable pretty urls
		    fastcgi_param HTTP_ACCEPT_ENCODING "";          # Disable encoding of nextcloud response to in>
		    fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
		    fastcgi_intercept_errors on;
		    fastcgi_request_buffering off;
		  }
          # Authelia
	  include snippets/authelia-authrequest.conf; # Protect this endpoint
	}
}

Accès par le lien https://site.rnmkcy.eu

Calibre web (calibre.rnmkcy.eu)

Les instructions pour une installation de calibre web

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo apt install python3-venv python3-dev 
sudo apt install build-essential libssl-dev libffi-dev 
sudo apt install libsasl2-dev libldap2-dev
# Création dossier puis un environnement virtuel pour calibre-web
sudo mkdir -p /sharenfs/rnmkcy/calibreweb
sudo chown $USER:$USER /sharenfs/rnmkcy/calibreweb
python3 -m venv /sharenfs/rnmkcy/calibreweb
# Activer l’environnement
source /sharenfs/rnmkcy/calibreweb/bin/activate
# nouveau prompt -> (calibreweb) yick@cwwk:~$ 
pip3 install --upgrade pip
pip3 install wheel
pip3 install cmake
pip3 install calibreweb
# ldap
pip3 install python-ldap
pip3 install Flask-SimpleLDAP

Utilisation fichier systemd pour le lancement automatique

1
sudo nano /etc/systemd/system/calibreweb.service

Contenu du fichier

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Service calibreweb
After=network.target

[Service]
Type=simple
User=yick
ExecStart=/sharenfs/rnmkcy/calibreweb/bin/cps

[Install]
WantedBy=multi-user.target

ATTENTION! , User est l’utilisateur connecté ($USER)

Recharger et activer le service calibreweb

1
2
sudo systemctl daemon-reload
sudo systemctl enable --now calibreweb

Vérifie

1
systemctl status calibreweb

proxy nginx + authelia

/etc/nginx/conf.d/calibre.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
    listen 80;
    listen [::]:80;
    server_name  calibre.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://calibre.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  calibre.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    include snippets/authelia-location.conf; # Authelia auth endpoint

#  location / { 
#     proxy_pass              http://127.0.0.1:8083;
#     include snippets/authelia-authrequest.conf; # Protect this endpoint
#  } 
            location / { # Reduced to "/"
                proxy_pass              http://127.0.0.1:8083;
                proxy_set_header        Host            $http_host;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Scheme        $scheme;
                include snippets/authelia-authrequest.conf; # Protect this endpoint
                # Removed proxy_set_header
        }

}

suite…

Traduction LibreTranslate (traduction.rnmkcy.eu)


https://github.com/LibreTranslate/LibreTranslate

Les instructions pour une installation rapide

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#sudo apt install python3-venv python3-dev 
#sudo apt install build-essential libssl-dev libffi-dev 
#sudo apt install libsasl2-dev libldap2-dev
sudo apt install python3-msgpack 
# Création dossier puis un environnement virtuel pour calibre-web
sudo mkdir -p /sharenfs/rnmkcy/libretranslate
sudo chown $USER:$USER /sharenfs/rnmkcy/libretranslate
python3 -m venv /sharenfs/rnmkcy/libretranslate
# Activer l’environnement
source /sharenfs/rnmkcy/libretranslate/bin/activate
# nouveau prompt -> (libretranslate) yick@cwwk:~$ 
pip3 install --upgrade pip
pip3 install libretranslate

Tester libretranslate

1
libretranslate [args]
1
2
Loaded support for 46 languages (92 models total)!
Running on http://127.0.0.1:5000

Puis ouvrez un navigateur Web à http://localhost:5000

1
ssh -L 9500:127.0.0.1:5000 yick@192.168.0.205 -p 55205 -i /home/yann/.ssh/yick-ed25519

Créer un service LibreTranslate
pour s’assurer que notre application fonctionne juste après le démarrage du système.

1
sudo nano /etc/systemd/system/LibreTranslate.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Traduction libre
 
[Service]
Type=exec
User=yick
WorkingDirectory=/sharenfs/rnmkcy/libretranslate
ExecStart=/sharenfs/rnmkcy/libretranslate/bin/libretranslate
Restart=on-failure
RestartSec=30s
 
# Optional hardening to improve security
ReadWritePaths=/sharenfs/rnmkcy/libretranslate
 
[Install]
WantedBy=multi-user.target

Le fichier d’unité, le fichier de configuration source ou les drop-ins de LibreTranslate.service ont changé sur le disque. Exécutez ‘sudo systemctl daemon-reload’ pour recharger les unités.

1
sudo systemctl daemon-reload

Activer et démarrer le service

1
sudo systemctl enable LibreTranslate --now

Status

1
sudo systemctl status LibreTranslate

Proxy nginx
Le fichier de configuration nginx /etc/nginx/conf.d/traduction.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
    listen 80;
    listen [::]:80;
    server_name  traduction.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://traduction.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  traduction.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;

  location / { 
      proxy_pass              http://127.0.0.1:5000;
  } 

}

Vérifier nginx

1
sudo nginx -t

Redémarrer nginx

1
sudo systemctl reload nginx

Lien https://traduction.rnmkcy.eu

Machines virtuelles

Machines virtuelles utilisées pour gérer les applications:

  • Collabora (vm debian12)
  • ntfy (vm Alpine Linux)
  • ttrss (vm Alpine Linux)
  • Searx (vm Alpine Linux)

Collabora Online (bora.rnmkcy.eu)

Installer collabora serveur sur une machine virtuelle debian 12

Proxy nginx /etc/nginx/conf.d/bora.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
server {
    listen 80;
    listen [::]:80;
    server_name  bora.rnmkcy.eu;

  # redirect all plain HTTP requests to HTTPS
  return 301 https://bora.rnmkcy.eu$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name bora.rnmkcy.eu;

    # Sécurité + https
    include /etc/nginx/conf.d/security.conf.inc;

    error_log /var/log/nginx/bora.error;

    # static files
    location ^~ /browser {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Host $http_host;
    }

    # WOPI discovery URL
    location ^~ /hosting/discovery {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Host $http_host;
    }

    # Capabilities
    location ^~ /hosting/capabilities {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Host $http_host;
    }

    # main websocket
    location ~ ^/cool/(.*)/ws$ {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $http_host;
    proxy_read_timeout 36000s;
    }

    # download, presentation and image upload
    location ~ ^/(c|l)ool {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Host $http_host;
    }

    # Admin Console websocket
    location ^~ /cool/adminws {
    proxy_pass http://192.168.100.40:9980;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $http_host;
    proxy_read_timeout 36000s;
    }
}

Notifications (noti.rnmkcy.eu)


Ntfy, qui se prononce “notify”, est un service de notification ultra léger, permettant d’envoyer des messages vers un smartphone ou un ordinateur via de simples scripts, sans besoin de compte et totalement gratuitement !
cwwk KVM - Service de notification ntfy (Alpine Linux vm-ntfy)

Proxy nginx noti.rnmkcy.eu

Sur le serveur cwwk rnmkcy.eu, créer un proxy /etc/nginx/conf.d/noti.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
server {
    listen 80;
    listen [::]:80;
    server_name  noti.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://noti.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  noti.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;

  location / { 
    proxy_pass              http://192.168.100.50:8080;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 3m;
    proxy_send_timeout 3m;
    proxy_read_timeout 3m;

    client_max_body_size 0; # Stream request body to backend
  } 

}

Recharger nginx

1
sudo systemctl reload nginx

Connexion depuis un navigateur https://noti.rnmkcy.eu

Envoi de notifications depuis le serveur cwwk avec curl en ligne de commande

1
curl -d "Backup successful 😀" https://noti.rnmkcy.eu/yan_infos

Flux Tiny Tiny RSS (rss.rnmkcy.eu)


cwwk KVM - Alpine Linux Tiny Tiny RSS (ttrss alpine-vm)

Fichier de configuration nginx

1
/etc/nginx/conf.d/rss.rnmkcy.eu.conf 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
    listen 80;
    listen [::]:80;
    server_name  rss.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://rss.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  rss.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;

   location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header X-Forwarded-Proto $scheme;
      
      proxy_pass http://192.168.100.60:8280/;
      break;
   }

}

Moteur de recherche (searx.rnmkcy.eu)


cwwk KVM - SearXNG Alpine Linux (alpine-searx)

Fichier de configuration nginx

1
/etc/nginx/conf.d/searx.rnmkcy.eu.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen 80;
    listen [::]:80;
    server_name  searx.rnmkcy.eu;

    # redirect all plain HTTP requests to HTTPS
    return 301 https://searx.rnmkcy.eu$request_uri;
}

server {
    # ipv4 listening port/protocol
    listen       443 ssl http2;
    # ipv6 listening port/protocol
    listen           [::]:443 ssl http2;
    server_name  searx.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;

    location / {
	proxy_pass http://192.168.100.70:8080;
    }
}

Cockpit Admin gestion serveurs (cockpit.rnmkcy.eu)

Cockpit est une interface d’administration de serveur interactive. Il est facile à utiliser et très léger. Il interagit directement avec le système d’exploitation depuis une vraie session Linux dans un navigateur.

Cockpit, installation, …
Résumé des instructions

1
2
sudo apt update && sudo apt install cockpit cockpit-machines
sudo usermod -aG sudo $USER

Proxy cat /etc/nginx/conf.d/cockpit.rnmkcy.eu.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server {
    listen 80;
    listen [::]:80;
    server_name  cockpit.rnmkcy.eu;
    return 301 https://cockpit.rnmkcy.eu$request_uri;
}

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  cockpit.rnmkcy.eu;

    include /etc/nginx/conf.d/security.conf.inc;
    include snippets/authelia-location.conf; # Authelia auth endpoint

    location / {
        # Required to proxy the connection to Cockpit
        proxy_pass https://127.0.0.1:9090;
        include snippets/authelia-authrequest.conf; # Protect this endpoint
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Required for web sockets to function
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Pass ETag header from Cockpit to clients.
        # See: https://github.com/cockpit-project/cockpit/issues/5239
        gzip off;
    }

}

Gestion cockpit des machines externes via SSH

Pour gérer les machines externes, il faut générer des clés SSH car la communication cockpit se fait via SSH

Liste de machines externes

  • PC1 Bureau EndeavourOS
  • e6230 DELL EndeavourOS
  • xoyaz.xyz Debian
  • xoyize.xyz Debian
  • iceyan.xyz debian

Se rendre dans le dossier $HOME de la machine cwwk

Générer les clés privées/publiques SSH

1
2
3
4
5
6
7
8
9
10
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/pc1-ed25519
chmod 600 ~/.ssh/pc1-ed25519
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/e6230-ed25519
chmod 600 ~/.ssh/e6230-ed25519
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/xoyaz.xyz-ed25519
chmod 600 ~/.ssh/xoyaz.xyz-ed25519
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/xoyize.xyz-ed25519
chmod 600 ~/.ssh/xoyize.xyz-ed25519
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/iceyan.xyz-ed25519
chmod 600 ~/.ssh/iceyan.xyz-ed25519

La clé publique (.pub) sera ajoutée au fichier authorized_keys de la machine correspondante

La connexion SSH est du type

1
2
ssh Utilisateur@<Adresse IP ou Domaine> -p N°_Port -i Clef
# Par défaut le chemin pour "Clef" est $HOME/.ssh/

Le fichier ~/.ssh.ssh_servers

1
2
3
4
5
6
Alias;Utilisateur;Adresse IP ou Domaine;Port;Clef;Opt;Chemin Local;Chemin Distant
iceyan;iceyan;185.112.146.46;55046;iceyan.xyz-ed25519;;;Y;;4
xoyaz;yani;37.60.230.30;55030;xoyaz.xyz-ed25519;;;Y;;4
xoyize;xouser;158.220.91.148;55148;xoyize.xyz-ed25519;;;Y;;4
pc1;yann;192.168.0.20;22;pc1-ed25519;;;Y;;4
e6230w;yano;192.168.10.90;56230;e6230-ed25519;;;Y;;4

Sauvegardes

BorgBackup dépôt cwwk

BorgBackup

  1. Installation

Création dossier borg sous root

1
sudo mkdir -p /root/.borg

Création dépôt dans la boîte de stockage (repository)

Dépôt distant à travers SSH

1
ssh://u326239@u326239.your-storagebox.de:23/./backup/borg/cwwk

Ajout de la phrase forte dans un fichier au dossier /root/.borg

1
2
# ajout phrase
sudo cp /sharenfs/pc1/.borg/cwwk.passphrase /root/.borg/

Initialisation dépôt distant en mode su

1
2
3
4
export BORG_PASSPHRASE="$(cat /root/.borg/cwwk.passphrase)"
export BORG_RSH='ssh -i /root/.ssh/id_borg_ed25519'
BORG_REPOSITORY=ssh://u326239@u326239.your-storagebox.de:23/./backup/borg/cwwk
borg init --encryption=repokey $BORG_REPOSITORY

Le fichier d’exclusion /root/.borg/cwwk.exclusions

1
2
3
4
5
6
7
8
9
10
11
12
/proc
/sys
/dev
/media
/mnt
/cdrom
/tmp
/run
/var/tmp
/var/run
/sharenfs
lost+found

Créer un script de sauvegarde (notez l’usage de borg prune pour supprimer les archives trop anciennes)

1
sudo nano /root/.borg/borg-backup.sh 
1
2
3
4
5
6
export BORG_PASSPHRASE=`cat /root/.borg/cwwk.passphrase`
export BORG_RSH='ssh -i /root/.ssh/id_borg_ed25519'
BACKUP_DATE=`date +%Y-%m-%d-%Hh%M`
BORG_REPOSITORY=ssh://u326239@u326239.your-storagebox.de:23/./backup/borg/cwwk
borg create -v --progress --stats --exclude-from /root/.borg/cwwk.exclusions ${BORG_REPOSITORY}::${BACKUP_DATE} /
borg prune -v --list --stats --keep-daily=7 --keep-weekly=4 --keep-monthly=6 $BORG_REPOSITORY

Le rendre exécutable

1
chmode +x /root/.borg/borg-backup.sh 

Exécution

1
/root/.borg/borg-backup.sh

Automatiser la sauvegarde en utilisant systemd timer

Le service /etc/systemd/system/autoborg.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=BorgBackup

[Service]
User=root
ExecStart=/usr/bin/bash /root/.borg/borg-backup.sh

[Install]
WantedBy=multi-user.target

Le timer /etc/systemd/system/autoborg.timer

1
2
3
4
5
6
7
8
9
[Unit]
Description=Exécution BorgBackup

[Timer]
Unit=autoborg.service
OnCalendar=*-*-* 02:50

[Install]
WantedBy=timers.target

Exécution tous les jours

Activez/démarrez le timer, puis vérifiez qu’il est chargé et actif

1
2
sudo systemctl enable autoborg.timer --now
systemctl status autoborg.timer

Vérifiez s’il apparaît dans la liste des minuteries :

1
systemctl list-timers
1
2
3
NEXT                         LEFT          LAST                         PASSED     UNIT                         ACTIVATES                     
Mon 2024-12-16 02:50:00 CET 18h left            -                           -             autoborg.timer               autoborg.service

Lorsque vous voulez voir si les sauvegardes se sont déroulées correctement, vous pouvez consulter le journal le plus récent

1
systemctl status autoborg

Ou afficher tous les journaux avec :

1
sudo journalctl -u autoborg

Synchronisation des backup borg

Synchronisation des backup borg entre le serveur de stockage (storage box) et le disque USB partagé monté sur la freebox en utilisant systemd timer.

Le script à exécuter en mode su /root/.borg/synchro-backup.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash

# Synchro BX11 --> FreeUSB2To
servers=$(cat /home/yick/scripts/borglist.serveurs)
 hote_array=(${servers// / })
 for hote in "${hote_array[@]}"
 do
  rsync -avz --delete --rsync-path='rsync' -e 'ssh -p 23 -i /root/.ssh/id_borg_ed25519' u326239@u326239.your-storagebox.de:backup/borg/$hote /mnt/FreeUSB2To/sauvegardes/borgbackup/
 done

Script exécutable

1
chmod +x /root/.borg/synchro-backup.sh

Le service /etc/systemd/system/storage-freedisk.service

1
2
3
4
5
6
[Unit]
Description=Rsync storagebox vers FreeUSB2To

[Service]
Type=oneshot
ExecStart=/usr/bin/bash /root/.borg/synchro-backup.sh

Le timer /etc/systemd/system/storage-freedisk.timer

1
2
3
4
5
6
7
8
9
[Unit]
Description=Rsync storagebox vers FreeUSB2To

[Timer]
OnCalendar=*-*-* 04:25
Persistent=true

[Install]
WantedBy=timers.target

Exécution tous les jours à 4h25 du matin

Activez/démarrez le timer, puis vérifiez qu’il est chargé et actif

1
2
sudo systemctl enable storage-freedisk.timer --now
systemctl status storage-freedisk.timer

Vérifiez qu’il a été démarré en vérifiant s’il apparaît dans la liste des minuteries :

1
systemctl list-timers
1
2
NEXT                        LEFT          LAST                        PASSED       UNIT                         ACTIVATES                     
Mon 2024-12-16 04:25:00 CET 20h left      -                           -            storage-freedisk.timer       storage-freedisk.service

Maintenance

Gérer un domaine local avec Unbound

Gérer un domaine local avec Unbound, créer un domaine local, pour le réseau privé, ce qui est bien plus pratique que de retenir des IPs ou maintenir un fichier hosts sur les machines où l’on y a accès

Domaine cwwk.home.arpa
Ajouter ce qui suit dans le fichier /etc/unbound/unbound.conf.d/cwwk-unbound.conf

1
2
3
4
5
6
7
8
9
10
    local-zone: "home.arpa." transparent
    # IPv4
    local-data: "cwwk.home.arpa.  86400 IN A 192.168.0.205"
    # IPv6
    local-data: "cwwk.home.arpa.  86400 IN AAAA 2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45"
    # On ajoute les enregistrements PTR
    # PTR IPv4
    local-data-ptr: "192.168.0.205  86400 cwwk.home.arpa."
    # PTR IPv6
    local-data-ptr: "2a01:e0a:9c8:2080:aab8:e0ff:fe04:ec45  86400 cwwk.home.arpa."

Vérifier la configuration

1
unbound-checkconf /etc/unbound/unbound.conf.d/cwwk-unbound.conf

Une fois tout configuré et Unbound relancé

1
systemctl restart unbound

on peut faire quelques tests

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ dig cwwk.home.arpa

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> cwwk.home.arpa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50239
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;cwwk.home.arpa.			IN	A

;; ANSWER SECTION:
cwwk.home.arpa.		86400	IN	A	192.168.0.205

;; Query time: 0 msec
;; SERVER: 192.168.0.205#53(192.168.0.205) (UDP)
;; WHEN: Fri Jan 17 09:25:55 CET 2025
;; MSG SIZE  rcvd: 59

$ dig -x 192.168.0.205

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> -x 192.168.0.205
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63949
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;205.0.168.192.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
205.0.168.192.in-addr.arpa. 86400 IN	PTR	cwwk.home.arpa.

;; Query time: 0 msec
;; SERVER: 192.168.0.205#53(192.168.0.205) (UDP)
;; WHEN: Fri Jan 17 09:26:59 CET 2025
;; MSG SIZE  rcvd: 79

Msmtp

Le MTA (Mail Transfer Agent) léger msmtp répond parfaitement à ce besoin. Si vous avez plusieurs serveurs et que vous avez sur l’un d’eux configuré un serveur de mail, il sera intéressant de faire en sorte que vos autres serveurs puissent l’utiliser pour acheminer leur courrier. Vous pouvez également vouloir utiliser le serveur de votre FAI, ou ceux d’une plateforme (Envoyer des mails depuis un serveur avec mSMTP )

Installation de msmtp, le programme est dans les dépôts Debian

1
sudo apt install msmtp # msmtp-mta

Configuration par défaut

Une configuration typique consisterait à définir pour tout le serveur un smarthost à utiliser, un utilisateur par défaut pour se connecter à ce smarthost, le port auquel se connecter, l’adresse mail figuant dans l’entête from du mail et l’obligation d’utiliser le chiffrement TLS pour les connexions (ou STARTTLS). Pour tous les utilisateurs n’ayant pas de fichier .msmtprc dans leur /home msmtp utilisera ce fichier par défaut. Toute cette configuration se trouvant dans le fichier /ets/msmtprc

Fichier de configuration $HOME/.msmtprc

1
2
3
4
5
6
7
8
9
10
11
12
13
account default
host mx1.xoyize.xyz
port 587
from yack@cinay.eu
user yack@cinay.eu
password mot_passe_yack
auto_from off
add_missing_from_header on
auth on
logfile ~/.msmtp.log
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

Envoi de message test

1
2
echo -e "Subject: msmtp en ligne de commande\r\nMIME-Version: 1.0\nContent-Type: text/; charset=utf-8\r\n\r\nLe contenu du message..." |msmtp --from=rnmkcy@cinay.eu -t rnmkcy@cinay.eu

Mises à jour automatiques sur debian

Mises à jour automatiques sur Debian

Cet article est sous licence CC BY 4.0 par l'auteur.