Afficher/cacher Sommaire
Virtualisation linux KVM/QEMU
- How To Install KVM Hypervisor on Debian 10 (Buster)
- Installing KVM on Debian 10
- VirtualNetworking (libvirt virsh)
- Qemu (archlinux)
- La Gestion réseau dans une machine virtuelle
Prérequis
- Poste linux avec tous les utilitaires graphiques QEMU/KVM
- Serveur hoteserveur.tld sur lequel les vm vont être lancées
-
**A MODIFIER SUIVANT VOTRE CONFIGURATION**
- Adresses IP publiques et domaines
- IP Publique Box IPV4 : **79.45.252.154**
- IP Publique Box IPV6 : **2bef:a51:ced9:fc3::**
- Serveur hôte : **hoteserveur.tld**
- Virtual Machine : **vmserveur.tld**
- Adresses IP publiques et domaines
1 - Terminal serveur
KVM supporté par le CPU ?
Exécutez la commande egrep suivante pour vérifier que Intel VMX ou AMD SVM est supporté sur votre CPU
egrep --color 'vmx|svm' /proc/cpuinfo
vmx (Intel) ou svm (Amd) doit apparaître d’une autre couleur dans le résultat
Installer KVM/QEMU sur le serveur
Serveur hoteserveur.tld (srvxo 192.168.0.45)
On utilise ssh pour se connecter au serveur
Installation, exécuter la commande suivante
sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils libguestfs-tools genisoimage virtinst libosinfo-bin
Chargez et activez le module vhost_net
sudo modprobe vhost_net
lsmod | grep vhost
vhost_net 24576 0
tun 49152 1 vhost_net
vhost 49152 1 vhost_net
tap 28672 1 vhost_net
Vérifier si le service libvirtd est lancé et activé (enabled)
sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2019-12-12 11:28:02 CET; 2 days ago
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 759 (libvirtd)
Tasks: 17 (limit: 32768)
Memory: 34.7M
CGroup: /system.slice/libvirtd.service
└─759 /usr/sbin/libvirtd
déc. 12 11:28:00 hoteserveur.tld systemd[1]: Starting Virtualization daemon...
déc. 12 11:28:02 hoteserveur.tld systemd[1]: Started Virtualization daemon.
Ajout utilisateur au groupe libvirt
Si vous voulez que l’utilisateur normal/régulier puisse gérer les machines virtuelles. Ajouter l’utilisateur $USER à libvirt et libvirt-qemu en utilisant la commande usermod
sudo adduser $USER libvirt
sudo adduser $USER libvirt-qemu
Recharger l’adhésion à un groupe avec l’aide de la commande newgrp
newgrp libvirt
newgrp libvirt-qemu
Vérifiez votre appartenance à un groupe à l’aide de la commande id
$ id
gid=64055(libvirt-qemu) groupes=64055(libvirt-qemu),118(libvirt)
Veuillez noter que vous devez utiliser une des commandes suivantes pour vous connecter au serveur KVM
virsh --connect qemu:///system
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh #
virsh --connect qemu:///system list --all # avec la commande list par exemple
Réseau par défaut
Il n’est pas actif
sudo virsh net-list --all
Name State Autostart Persistent
----------------------------------------------
default inactive no yes
Editer et modifier la configuration par défaut
sudo virsh net-edit default
<network>
<name>default</name>
<uuid>81e35158-b288-46bb-9536-53b0f97d1748</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:06:87:ba'/>
<ip address='192.168.55.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.55.2' end='192.168.55.10'/>
</dhcp>
</ip>
</network>
Avant la création d’une machine virtuelle, le réseau doit être actif
sudo virsh net-start default # virsh net-autostart default
Configurer le réseau pour un lancement au démarrage du serveur
sudo virsh net-autostart default # Network default marked as autostarted
Vérifications
sudo virsh net-list --all
Name State Autostart Persistent
--------------------------------------------
default active yes yes
ip a
[...]
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:06:87:ba brd ff:ff:ff:ff:ff:ff
inet 192.168.55.1/24 brd 192.168.55.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:06:87:ba brd ff:ff:ff:ff:ff:ff
Arrêt du réseau
sudo virsh net-destroy default # Network default destroyed
Pas de lancement au démarrage
sudo virsh net-autostart default --disable # Network default unmarked as autostarted
Création machine virtuelle “yunohost”
Image iso yunohost-stretch-3.6.4.6-amd64-stable.iso dans le dossier /srv/data/virtuel/iso/
Virtuel yunouest
Linux Debian 9
Ram 4 Go
Disque 12 Go SSD /srv/data/virtuel/vm/yunouest.img
cdrom /srv/data/virtuel/iso/yunohost-stretch-3.6.4.6-amd64-stable.iso
boot cdrom,hd
Ouvrir un terminal en mode su sur hoteserveur.tld copier/coller ce qui suit puis entrée
sudo virt-install --name yunouest \
--os-type linux \
--os-variant debian9 \
--ram=4096 \
--disk /srv/data/virtuel/vm/yunouest.img,device=disk,bus=virtio,size=12,format=qcow2 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--hvm \
--cdrom /srv/data/virtuel/iso/yunohost-stretch-3.6.4.6-amd64-stable.iso \
--boot cdrom,hd
2 - Poste linux
Poursuite installation “yunohost” via VNC/SSH
Après quelques minutes , on poursuit l’installation
ssh -p 55035 -i /home/yannick/.ssh/vbox-srvbust-ed25519 -L 55444:localhost:5900 -N -f -l xoyi 192.168.0.45
vncviewer localhost:55444
Lancement installation
Virtual Manager
Saisir Alt F2 sur poste client linux , puis saisir:
virt-manager -c 'qemu+ssh://xoyi@192.168.0.45:55035/system?keyfile=/home/yannick/.ssh/vbox-srvbust-ed25519'
Démarrer la machine
Démarrage de la machine virtuelle au démarrage de l’hôte
Mettre le disque dur en premier au boot
Arrêter puis redémarrer la machine
Connexion VNC/SSH
ssh -p 55035 -i /home/yannick/.ssh/vbox-srvbust-ed25519 -L 55444:localhost:5900 -N -f -l xoyi 192.168.0.45
vncviewer localhost:55444
Lancer la post-installation
domaine : vmserveur.tld
Mot de passe admin : *****
Après reboot , relever l’adresses ip : 192.168.55.9
NE PAS OUBLIER de tuer la tâche après fermeture du “viewer” VNC
kill $(pidof -s ssh)
3 - Terminal serveur
Connexion SSH (avec clés) entre le serveur hoteserveur.tld et la vm “yunohost”
Depuis le terminal hoteserveur.tld , on se connecte SSH sur la VM 192.168.55.9
ssh admin@192.168.55.9
connexion avec clé
**hoteserveur.tld**
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) nommé vm-ouestline pour une liaison SSH avec le serveur KVM.
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/vm-ouestline
Envoyer la clé publique sur la VM
scp ~/.ssh/vm-ouestline.pub admin@192.168.55.9:/home/admin/
**VM 192.168.55.9 (vmserveur.tld)**
On se connecte
ssh admin@192.168.55.9
Copier le contenu de la clé publique dans /home/$USER/.ssh/authorized_keys
cd ~
Sur le KVM ,créer un dossier .ssh
mkdir .ssh
cat /home/$USER/vm-ouestline.pub >> /home/$USER/.ssh/authorized_keys
et donner les droits
chmod 600 /home/$USER/.ssh/authorized_keys
effacer le fichier de la clé
rm /home/$USER/vm-ouestline.pub
Modifier la configuration serveur SSH
sudo nano /etc/ssh/sshd_config
Modifier
#Port = 22 # si changement de port, oter le commentaire (#)
PermitRootLogin no
PasswordAuthentication no
session SSH ne se termine pas correctement lors d'un "reboot" à distance
Si vous tentez de redémarrer/éteindre une machine distance par ssh, vous pourriez constater que votre session ne se termine pas correctement, vous laissant avec un terminal inactif jusqu’à l’expiration d’un long délai d’inactivité. Il existe un bogue 751636 à ce sujet. Pour l’instant, la solution de contournement à ce problème est d’installer :
sudo apt install libpam-systemd
cela terminera la session ssh avant que le réseau ne tombe.
Veuillez noter qu’il est nécessaire que PAM soit activé dans sshd.
UNIQUEMENT si changement de port Ouvrir le port 55040 et fermer le port 22
sudo yunohost firewall allow TCP 55040
sudo yunohost firewall disallow TCP 22
Relancer openSSH
sudo systemctl restart sshd
**hoteserveur.tld**
Accès depuis srvxo (192.168.0.45) avec la clé privée
ssh -i ~/.ssh/vm-ouestline admin@192.168.55.9
4 - Poste linux
Connexion ssh entre le “Poste linux” et la vm “yunohost via proxy serveur hoteserveur.tld
Effectuer plusieurs sauts SSH avec la configuration SSH et un hôte de saut-Lien HS
Poste client linux –> Bastion (hoteserveur.tld 192.168.0.45) –> VM vmserveur.tld 192.168.55.9
Poste client
1- Il faut copier la clé privée d’accès au VM depuis hoteserveur.tld (~/.ssh/vm-ouestline) dans le dossier ~/.ssh/ du poste client avec un autre nom ( vm-proxy-ouestline)
cat >> ~/.ssh/vm-proxy-ouestline
Copier/coller le contenu du fichier du fichier de clé privée (fichier ~/.ssh/vm-ouestline de la machine hoteserveur.tld ) dans ce terminal, et presser [Ctrl]+[D] pour valider.
Modifier les droits
chmod 600 ~/.ssh/vm-proxy-ouestline
2- Modifier ou créer la configuration SSH ~/.ssh/config du poste client (PC1 , Portable,etc…)
Host bastion
Hostname hoteserveur.tld
User xoyi
IdentityFile ~/.ssh/vbox-srvbust-ed25519
Port 55035
Host vmyuno
Hostname 192.168.55.9
User admin
IdentityFile ~/.ssh/vm-proxy-ouestline
ProxyCommand ssh bastion -W %h:%p
La connexion du poste client vers la vm se fera via le proxy bastion (xoxize.xyz) avec la commande suivante :
sshm vmyuno
La ligne de commande pour un proxy ssh
---------------- ------------------ -------------------
| Poste client | | Proxy SSH | | Destinataire |
| Linux |<-------->| hoteserveur.tld|<--------->| vm vmserveur.tld|
| | | 192.168.0.45 | | 192.168.55.9 |
---------------- ------------------ -------------------
Syntaxe
ssh -o ProxyCommand="ssh -W %h:%p userprox@proxy.tld" userdest@destinataire.tld
La commande complète avec les clés
ssh -o ProxyCommand="ssh -W %h:%p -p 55035 -i /home/yannick/.ssh/vbox-srvbust-ed25519 xoyi@192.168.0.45" -i /home/yannick/.ssh/vm-proxy-ouestline admin@192.168.55.9
VMM (Virtual Machine Manager, gestion graphique des vm)
Ouvrir “Virtual Machine Manager” , pour afficher les information sur la vm “yunouest”
Se connecter SSH sur vmserveur.tld directement depuis lun terminal du “poste linux”
ssh vmyuno
Réseau
KVM/QEMU - Réseau IPV4/IPV6 accessible depuis l’internet via box free.fr
Partage de dossiers/fichiers entre le l’hôte et la vm
KVM/QEMU - Partage de répertoires avec des machines virtuelles et libvirt
Yunohost
Connexion ssh et passage en su
Système
DNS
Le domaine vmserveur.tld pointe sur l’adresse IPV6 2bef:a51:ced9:fc3::3
Ajout MX ,spf,dmarc et dkim (gestion Mail)
Ajout CAA pour lets’t encrypt
Les infos pour la mise à jour DNS
yunohost domain dns-conf vmserveur.tld
Info : Cette page montre la configuration *recommandée*. Elle ne configure *pas* le DNS pour vous. Il est de votre responsabilité que de configurer votre zone DNS chez votre fournisseur/registrar DNS avec cette recommandation.
; Basic ipv4/ipv6 records
@ 3600 IN A 79.45.252.154
* 3600 IN A 79.45.252.154
@ 3600 IN AAAA 2bef:a51:ced9:fc3::3
* 3600 IN AAAA 2bef:a51:ced9:fc3::3
; XMPP
_xmpp-client._tcp 3600 IN SRV 0 5 5222 vmserveur.tld.
_xmpp-server._tcp 3600 IN SRV 0 5 5269 vmserveur.tld.
muc 3600 IN CNAME @
pubsub 3600 IN CNAME @
vjud 3600 IN CNAME @
; Mail
@ 3600 IN MX 10 vmserveur.tld.
@ 3600 IN TXT "v=spf1 a mx ip4:79.45.252.154 ip6:2bef:a51:ced9:fc3::3 -all"
mail._domainkey 3600 IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/mZh/yIqQDzO3eAqD7AMA6FPzhOqlw+VEbkPTvrV0vS5qZseJ9gtefgKQi+gj63eU4WUjxmMacX+X25ERPRxkdnDR1P13IIy/ujz0nzfg6wK46Dn/wp86L2P4nV77WT8lXVP0yf+b21ZdqKMI9JhKEwqlwLiFW9nXhQrRMRlfqQIDAQAB"
_dmarc 3600 IN TXT "v=DMARC1; p=none"
; Extra
@ 3600 IN CAA 128 issue "letsencrypt.org"
DNS OVH , les ajouts
$TTL 3600
@ IN SOA dns111.ovh.net. tech.ovh.net. (2020040300 86400 3600 3600000 300)
IN NS ns111.ovh.net.
IN NS dns111.ovh.net.
IN MX 10 vmserveur.tld.
IN AAAA 2bef:a51:ced9:fc3::3
IN CAA 128 issue "letsencrypt.org"
600 IN TXT "v=spf1 mx ip4:79.45.252.154 ip6:2bef:a51:ced9:fc3::3 -all"
* IN CNAME vmserveur.tld.
_dmarc IN TXT "v=DMARC1;p=none;"
mail._domainkey IN TXT ( "v=DKIM1;h=sha256;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/mZh/yIqQDzO3eAqD7AMA6FPzhOqlw+VEbkPTvrV0vS5qZseJ9gtefgKQi+gj63eU4WUjxmMacX+X25ERPRxkdnDR1P13IIy/ujz0nzfg6wK46Dn/wp86L2P4nV77WT8lXVP0yf+b21ZdqKMI9JhKEwqlwLiFW9nXhQrRMRlfqQIDAQAB;" )
Créer un utilisateur
yunohost user create ouest
fullname: ouest line
mail: ouest@vmserveur.tld
username: ouest
Bash ,motd
Affichage informations
Exécuter un fichier utilisateur nommé $HOME/.ssh/rc si présent (NON PRESENT)
Pour tous les utilisateurs exécuter un fichier nommé /etc/ssh/sshrc si présent (NON PRESENT)
Installer les utilitaires curl jq figlet tmux
sudo apt install curl jq figlet tmux tree # outils supplémentaires
Créer le fichier ~/ssh_rc_bash
#!/bin/bash
get_infos() {
seconds="$(< /proc/uptime)"
seconds="${seconds/.*}"
days="$((seconds / 60 / 60 / 24)) jour(s)"
hours="$((seconds / 60 / 60 % 24)) heure(s)"
mins="$((seconds / 60 % 60)) minute(s)"
# Remove plural if < 2.
((${days/ *} == 1)) && days="${days/s}"
((${hours/ *} == 1)) && hours="${hours/s}"
((${mins/ *} == 1)) && mins="${mins/s}"
# Hide empty fields.
((${days/ *} == 0)) && unset days
((${hours/ *} == 0)) && unset hours
((${mins/ *} == 0)) && unset mins
uptime="${days:+$days, }${hours:+$hours, }${mins}"
uptime="${uptime%', '}"
uptime="${uptime:-${seconds} seconds}"
if [[ -f "/sys/devices/virtual/dmi/id/board_vendor" ||
-f "/sys/devices/virtual/dmi/id/board_name" ]]; then
model="$(< /sys/devices/virtual/dmi/id/board_vendor)"
model+=" $(< /sys/devices/virtual/dmi/id/board_name)"
fi
if [[ -f "/sys/devices/virtual/dmi/id/bios_vendor" ||
-f "/sys/devices/virtual/dmi/id/bios_version" ]]; then
bios="$(< /sys/devices/virtual/dmi/id/bios_vendor)"
bios+=" $(< /sys/devices/virtual/dmi/id/bios_version)"
bios+=" $(< /sys/devices/virtual/dmi/id/bios_date)"
fi
}
#clear
PROCCOUNT=`ps -Afl | wc -l` # nombre de lignes
PROCCOUNT=`expr $PROCCOUNT - 5` # on ote les non concernées
GROUPZ=`users`
ipinfo=$(curl -s ipinfo.io) # info localisation format json
#ipinfo=$(curl -s iplocality.com) # info localisation format json
publicip=$(echo $ipinfo | jq -r '.ip') # extraction des données , installer préalablement "jq"
ville=$(echo $ipinfo | jq -r '.city')
pays=$(echo $ipinfo | jq -r '.country')
cpuname=`cat /proc/cpuinfo |grep 'model name' | cut -d: -f2 | sed -n 1p`
iplink=`ip link show |grep -m 1 "2:" | awk '{print $2}' | cut -d: -f1`
if [[ $GROUPZ == *irc* ]]; then
ENDSESSION=`cat /etc/security/limits.conf | grep "@irc" | grep maxlogins | awk {'print $4'}`
PRIVLAGED="IRC Account"
else
ENDSESSION="Unlimited"
PRIVLAGED="Regular User"
fi
get_infos
logo=$(figlet "`hostname --fqdn`")
meteo=$(curl fr.wttr.in/$ville?0)
lvm_entet="Sys. fichiers\tTaille\tUtilisé\tDispo\tUti%\tMonté sur"
lvm=$(df -h |grep mapper) # les montages lvm
sdx=$(df -h |grep "/dev/sd") # les montages /dev/sd
distri=$(lsb_release -sd)
distri+=" $(uname -m)"
echo -e "
\e[1;31m$logo
\e[1;35m \e[1;37mHostname \e[1;35m= \e[1;32m`hostname`
\e[1;35m \e[1;37mWired IpV4 \e[1;35m= \e[1;32m`ip addr show $iplink | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1`
\e[1;35m \e[1;37mWired IpV6 \e[1;35m= \e[1;32m`ip addr show $iplink | grep -E 'inet6' |grep -E 'scope link' | awk '{print $2}' | cut -d/ -f1`
\e[1;35m \e[1;37mKernel \e[1;35m= \e[1;32m`uname -r`
\e[1;35m \e[1;37mDistrib \e[1;35m= \e[1;32m$distri
\e[1;35m \e[1;37mUptime \e[1;35m= \e[1;32m`echo $uptime`
\e[1;35m \e[1;37mBios \e[1;35m= \e[1;32m`echo $bios`
\e[1;35m \e[1;37mBoard \e[1;35m= \e[1;32m`echo $model`
\e[1;35m \e[1;37mCPU \e[1;35m= \e[1;32m`echo $cpuname`
\e[1;35m \e[1;37mMemory Use \e[1;35m= \e[1;32m`free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'`
\e[1;35m \e[1;37mUsername \e[1;35m= \e[1;32m`whoami`
\e[1;35m \e[1;37mSessions \e[1;35m= \e[1;32m`who | grep $USER | wc -l`
\e[1;35m\e[1;37mPublic IpV4 \e[1;35m= \e[1;32m`echo $publicip`
\e[1;35m\e[1;37mPublic IpV6 \e[1;35m= \e[1;32m`ip addr show $iplink | grep -m 1 'inet6\b' | awk '{print $2}' | cut -d/ -f1`
\e[1;35m\e[1;96m$lvm_entet\e[1;35m\e[1;49m
\e[1;35m\e[1;33m$sdx
\e[1;35m\e[1;33m$lvm
\e[1;35m\e[1;32m$meteo
\e[1;0m
"
Le rendre exécutable
chmod +x ~/ssh_rc_bash
Recréer motd
sudo rm /etc/motd && sudo nano /etc/motd
__ __ __ __ _
\ \ / /| \/ | _ _ _ _ _ _ ___ _ _ ___ ___| |_
\ V / | |\/| | | || || || || ' \ / _ \| || |/ -_)(_-<| _|
\_/ |_| |_| \_, | \_,_||_||_|\___/ \_,_|\___|/__/ \__|
___ _ _ ___ |__/ |_ | |(_) _ _ ___ _ _ ___ | |_
/ _ \| || |/ -_)(_-<| _|| || || ' \ / -_) _ | ' \ / -_)| _|
\___/ \_,_|\___|/__/ \__||_||_||_||_|\___|(_)|_||_|\___| \__|
Déconnexion puis connexion
Certificats SSL letsencrypt (acme)
On ne peut valider pas les certificats par la commande yunohost car elle utilise le lien publique IPV4 qui n’existe pas var le domaine est seulement accessible en IPV6
yunohost domain cert-install
Info : Now attempting install of certificate for domain vmserveur.tld!
Erreur : Aucun enregistrement DNS 'A' n’a été trouvé pour vmserveur.tld. Vous devez faire pointer votre nom de domaine vers votre machine pour être en mesure d’installer un certificat Let’s Encrypt ! (Si vous savez ce que vous faites, utilisez --no-checks pour désactiver ces contrôles)
l’accès est uniquement IPV6 !!!
On utilise acme qui installe les certificats DNS via une API OVH
Prérequis
sudo apt install socat # prérequis
Installation gestionnaire des certificats Let’s Encrypt
cd ~
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install
Se déconnecter puis se reconnecter pou la prise en compte
Se connecter sur l’api OVH pour les paramètres (clé et secret)
export OVH_AK="votre application key"
export OVH_AS="votre application secret"
Domaine ouestline.xyz
acme.sh --dns dns_ovh --issue --keylength ec-384 -d 'vmserveur.tld' -d '*.vmserveur.tld'
Les certificats
[vendredi 3 avril 2020, 14:21:51 (UTC+0200)] Your cert is in /home/admin/.acme.sh/vmserveur.tld_ecc/vmserveur.tld.cer
[vendredi 3 avril 2020, 14:21:51 (UTC+0200)] Your cert key is in /home/admin/.acme.sh/vmserveur.tld_ecc/vmserveur.tld.key
[vendredi 3 avril 2020, 14:21:51 (UTC+0200)] The intermediate CA cert is in /home/admin/.acme.sh/vmserveur.tld_ecc/ca.cer
[vendredi 3 avril 2020, 14:21:51 (UTC+0200)] And the full chain certs is there: /home/admin/.acme.sh/vmserveur.tld_ecc/fullchain.cer
On ne peut pas installer des certificats let’s encrypt sans adresse IPV4 ,erreur Aucun enregistrement DNS 'A' n’a été trouvé pour vmserveur.tld
Solution
Pour contourner le problème , on va créer un dossier de la forme aaaammdd.hhmmss-letsencrypt (en mode su),avec la date et heure du jour
sudo mkdir -p /etc/yunohost/certs/vmserveur.tld-history/20200403.142000-letsencrypt
Puis on va créer les liens
Les liens pour les certificats
sudo ln -s /home/admin/.acme.sh/vmserveur.tld_ecc/vmserveur.tld.key /etc/yunohost/certs/vmserveur.tld-history/20200403.142000-letsencrypt/key.pem # cert key
sudo ln -s /home/admin/.acme.sh/vmserveur.tld_ecc/fullchain.cer /etc/yunohost/certs/vmserveur.tld-history/20200403.142000-letsencrypt/crt.pem # full chain certs
Enfin on va informer yunohost par un lien que l’on utilise des certificats let’s encrypt
sudo rm /etc/yunohost/certs/vmserveur.tld # efface le lien certificat non signé
sudo ln -s /etc/yunohost/certs/vmserveur.tld-history/20200403.142000-letsencrypt /etc/yunohost/certs/vmserveur.tld # Création lien sur les certificats let's encrypt
Structure yunohost pour les certificats
/etc/yunohost/certs/
/etc/yunohost/certs/
├── vmserveur.tld -> /etc/yunohost/certs/vmserveur.tld-history/20200403.142000-letsencrypt
├── vmserveur.tld-history
│ ├── 20200402.212217-selfsigned
│ │ ├── ca.pem -> /etc/ssl/certs/ca-yunohost_crt.pem
│ │ ├── crt.pem
│ │ ├── key.pem
│ │ └── openssl.cnf
│ └── 20200403.142000-letsencrypt
│ ├── crt.pem -> /home/admin/.acme.sh/vmserveur.tld_ecc/fullchain.cer
│ └── key.pem -> /home/admin/.acme.sh/vmserveur.tld_ecc/vmserveur.tld.key
└── yunohost.org
├── ca.pem
├── crt.pem
└── key.pem
SSL + Diffie-Hellmann + Entêtes
Toutes les commandes se font en mode su
Générer Diffie-Hellman
openssl dhparam -out /etc/ssl/private/dh2048.pem -outform PEM -2 2048
Modification fichier de configuration /etc/nginx/conf.d/vmserveur.tld.conf
- Décommenter la ligne
ssl_dhparam /etc/ssl/private/dh2048.pem;
Le fichier /etc/nginx/conf.d/vmserveur.tld.conf après les modifications
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name vmserveur.tld;
access_by_lua_file /usr/share/ssowat/access.lua;
include /etc/nginx/conf.d/vmserveur.tld.d/*.conf;
location /yunohost/admin {
return 301 https://$http_host$request_uri;
}
location /.well-known/autoconfig/mail/ {
alias /var/www/.well-known/vmserveur.tld/autoconfig/mail/;
}
access_log /var/log/nginx/vmserveur.tld-access.log;
error_log /var/log/nginx/vmserveur.tld-error.log;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name vmserveur.tld;
ssl_certificate /etc/yunohost/certs/vmserveur.tld/crt.pem;
ssl_certificate_key /etc/yunohost/certs/vmserveur.tld/key.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
# As suggested by Mozilla : https://wiki.mozilla.org/Security/Server_Side_TLS and https://en.wikipedia.org/wiki/Curve25519
ssl_ecdh_curve secp521r1:secp384r1:prime256v1;
ssl_prefer_server_ciphers on;
# Ciphers with intermediate compatibility
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=intermediate
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
# Uncomment the following directive after DH generation
# > openssl dhparam -out /etc/ssl/private/dh2048.pem -outform PEM -2 2048
ssl_dhparam /etc/ssl/private/dh2048.pem;
# Follows the Web Security Directives from the Mozilla Dev Lab and the Mozilla Obervatory + Partners
# https://wiki.mozilla.org/Security/Guidelines/Web_Security
# https://observatory.mozilla.org/
more_set_headers "Content-Security-Policy : upgrade-insecure-requests";
more_set_headers "Content-Security-Policy-Report-Only : default-src https: data: 'unsafe-inline' 'unsafe-eval'";
more_set_headers "X-Content-Type-Options : nosniff";
more_set_headers "X-XSS-Protection : 1; mode=block";
more_set_headers "X-Download-Options : noopen";
more_set_headers "X-Permitted-Cross-Domain-Policies : none";
more_set_headers "X-Frame-Options : SAMEORIGIN";
# Disable gzip to protect against BREACH
# Read https://trac.nginx.org/nginx/ticket/1720 (text/html cannot be disabled!)
gzip off;
access_by_lua_file /usr/share/ssowat/access.lua;
include /etc/nginx/conf.d/vmserveur.tld.d/*.conf;
include /etc/nginx/conf.d/yunohost_admin.conf.inc;
include /etc/nginx/conf.d/yunohost_api.conf.inc;
access_log /var/log/nginx/vmserveur.tld-access.log;
error_log /var/log/nginx/vmserveur.tld-error.log;
Vérifier et relancer nginx
nginx -t
systemctl restart nginx
Vérifier ssl sur le lien https://vmserveur.tld
Ajouter un domaine
Il faut ajouter le domaine avec certificat auto signé
yunohost domain add nc.vmserveur.tld
Attention : Le fichier de configuration '/etc/nginx/conf.d/vmserveur.tld.conf' a été modifié manuellement et ne sera pas mis à jour
Succès ! Le certificat auto-signé est maintenant installé pour le domaine « nc.vmserveur.tld »
Succès ! La configuration a été mise à jour pour 'postfix'
Attention : Le fichier de configuration '/etc/nginx/conf.d/vmserveur.tld.conf' a été modifié manuellement et ne sera pas mis à jour
Succès ! La configuration a été mise à jour pour 'dnsmasq'
Succès ! La configuration a été mise à jour pour 'metronome'
Succès ! Le domaine a été créé
Yunohost erreur DNS A
On ne peut pas installer des certificats let’s encrypt sans adresse IPV4 ,erreur
**Solution**
Pour contourner le problème , on va créer un dossier de la forme domaine-history/aaaammdd.hhmmss-letsencrypt (en mode su),avec la date et heure du jour
Exemple
Créer un domaine nc.vmserveur.tld le 3 avril à 17h40
Le dossier se nomme nc.vmserveur.tld-history/20200403.165000-letsencrypt
en mode su , procédure semi auto
DOMAIN="nc.vmserveur.tld"
DATE="20200403"
HEURE="174000"
# Créer le dossier sur le système
mkdir -p /etc/yunohost/certs/$DOMAIN-history/$DATE.$HEURE-letsencrypt
# Les liens pour les certificats
#
# efface le lien certificat non signé si existant
rm -f /etc/yunohost/certs/$DOMAIN
# Création lien sur les certificats let's encrypt
ln -s /etc/yunohost/certs/$DOMAIN-history/$DATE.$HEURE-letsencrypt /etc/yunohost/certs/$DOMAIN
#
# créer les liens key et cert
# cert key
ln -s /home/admin/.acme.sh/vmserveur.tld_ecc/vmserveur.tld.key /etc/yunohost/certs/$DOMAIN-history/$DATE.$HEURE-letsencrypt/key.pem
# full chain certs
ln -s /home/admin/.acme.sh/vmserveur.tld_ecc/fullchain.cer /etc/yunohost/certs/$DOMAIN-history/$DATE.$HEURE-letsencrypt/crt.pem
#
# Vérification
tree /etc/yunohost/certs/$DOMAIN*
#
yunohost domain list
Applications
Nextcloud
Installation
yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh
root@ouestline:/home/admin# yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh
Domaines disponibles :
- vmserveur.tld
- nc.vmserveur.tld
Choisissez un domaine pour Nextcloud (default: vmserveur.tld) : nc.vmserveur.tld
Choisissez un chemin pour Nextcloud (default: /nextcloud) : /
Liste des utilisateurs disponibles :
- ouest
Choisissez l'administrateur de Nextcloud (doit être un utilisateur YunoHost existant) : ouest
Accéder au dossier personnel des utilisateurs depuis Nextcloud ? [yes | no] (default: no) : yes
Info : Installation de l'application nextcloud …
[...]
Attention : warning: commands will be executed using /bin/sh
Attention : job 1 at Fri Apr 3 18:17:00 2020
Info : [#################+..] > Adding multimedia directories...
Attention : 2020-04-03 18:07:13 URL:https://codeload.github.com/YunoHost-Apps/yunohost.multimedia/tar.gz/v1.2 [15921] -> "v1.2.tar.gz" [1]
Info : [##################..] > Configuring log rotation...
Info : [##################+.] > Configuring fail2ban...
Info : [###################.] > Configuring SSOwat...
Attention : /!\ Packagers! This app is still using the skipped/protected/unprotected_uris/regex settings which are now obsolete and deprecated... Instead, you should use the new helpers 'ynh_permission_{create,urls,update,delete}' and the 'visitors' group to initialize the public/private access. Check out the documentation at the bottom of yunohost.org/groups_and_permissions to learn how to use the new permission mechanism.
Attention : /!\ Packagers! This app is still using the skipped/protected/unprotected_uris/regex settings which are now obsolete and deprecated... Instead, you should use the new helpers 'ynh_permission_{create,urls,update,delete}' and the 'visitors' group to initialize the public/private access. Check out the documentation at the bottom of yunohost.org/groups_and_permissions to learn how to use the new permission mechanism.
Info : [###################.] > Reloading nginx web server...
Info : [####################] > Installation of nextcloud completed
Succès ! Installation terminée
Maintenance yunohost
Nextcloud
Avertissements de sécurité & configuration
Il est important pour la sécurité et la performance de votre instance que celle-ci soit correctement configurée. Afin de vous aider, votre instance Nextcloud effectue des vérifications automatiques. Pour de plus amples informations, veuillez consulter la documentation liée.
Il y a quelques avertissements concernant votre configuration.
MySQL est utilisée comme base de données mais ne supporte pas les caractères codés sur 4 octets. Pour pouvoir manipuler les caractères sur 4 octets (comme les émoticônes) sans problème dans les noms de fichiers ou les commentaires par exemple, il est recommandé d'activer le support 4 octets dans MySQL. Pour plus de détails, lisez la page de documentation à ce sujet
Merci de consulter les guides d'installation ↗ et de vérifier les erreurs ou avertissements des logs.
Vérifier la sécurité de votre Nextcloud grâce à notre scan de sécurité ↗
Corrections MariaDb/nextcloud
Ouvrir 2 terminaux sur le site
Respecter l’ordre des opérations
→ PREMIER TERMINAL
mysql -uroot -p$(cat /etc/yunohost/mysql )
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 76
Server version: 10.1.44-MariaDB-0+deb9u1 Debian 9.11
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like 'innodb_file_format';
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| innodb_file_format | Antelope |
+--------------------+----------+
1 row in set (0.01 sec)
MariaDB [nextcloud]> SET GLOBAL innodb_file_format=Barracuda;
Query OK, 0 rows affected (0.00 sec)
MariaDB [nextcloud]> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> quit
→ SECOND TERMINAL
ATTENTION /usr/bin/php7.3 est utilisé pour nextcloud
On passe en mode maintenance
cd /var/www/nextcloud
sudo -u nextcloud /usr/bin/php7.3 occ maintenance:mode --on
Maintenance mode enabled
Redémarrer mysql suite aux manipulations effectuées dans le premier terminal
systemctl restart mysqld
→ PREMIER TERMINAL
mysql -uroot -p$(cat /etc/yunohost/mysql )
MariaDB [(none)]> ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> quit
Pour éviter l’ERREUR
An exception occurred while executing ‘ALTER TABLE [TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;’:
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
mysql -uroot -p$(cat /etc/yunohost/mysql ) nextcloud
MariaDB [nextcloud]> set global innodb_large_prefix=on;
Query OK, 0 rows affected (0.00 sec)
MariaDB [nextcloud]> set global innodb_file_format=Barracuda;
Query OK, 0 rows affected (0.00 sec)
MariaDB [nextcloud]> quit
Bye
→ SECOND TERMINAL
sudo -u nextcloud /usr/bin/php7.3 occ config:system:set mysql.utf8mb4 --type boolean --value="true"
Nextcloud is in maintenance mode - no apps have been loaded
System config value mysql.utf8mb4 set to boolean true
sudo -u nextcloud /usr/bin/php7.3 occ maintenance:repair # patienter
désactiver la maintenance
sudo -u nextcloud /usr/bin/php7.3 occ maintenance:mode --off
Maintenance mode disabled
Correction tâche cron
La tâche cron n’est jamais exécuté (normalement tous les 5 minutes) car elle n’existe pas
Avertissements de sécurité & configuration
Il est important pour la sécurité et la performance de votre instance que celle-ci soit correctement configurée. Afin de vous aider, votre instance Nextcloud effectue des vérifications automatiques. Pour de plus amples informations, veuillez consulter la documentation liée.
Il y a quelques erreurs concernant votre configuration.
Dernière tâche de fond a fonctionné il y a Il y a 1 heure. Quelque chose s'est mal passé. Vérifier les paramètres des tâches de fond
Merci de consulter les guides d'installation ↗ et de vérifier les erreurs ou avertissements des logs.
Vérifier la sécurité de votre Nextcloud grâce à notre scan de sécurité ↗
Créer la tâche dans un “scheduleur” cron
sudo -s
crontab -u nextcloud -e
Ajouter
*/5 * * * * /usr/bin/php7.3 -f /var/www/nextcloud/cron.php > /dev/null 2>&1
Vérifier sur le site nextcloud