VirtualBox

Debian Buster VirtualBox

Debian 10

  • Serveur virtuel 64 bits VirtualBox : Debian Buster
  • machine : vmbust
  • domaine :
  • root : ytreu49
  • Utilisateur : bust
  • Mot de passe : bust49
  • Adresse IP : 192.168.0.49
  • Accès
    • SSH : **ssh bust@192.168.0.49**
    • SSH + clé : ssh -i ~/.ssh/vbox-vmbust-ed25519 bust@192.168.0.49 (facultatif)
    • Transfert de fichier : scp -P 55022 -i ~/.ssh/vbox-vmbust-ed25519 fichiera fichierb bust@192.168.0.49:/home/bust (facultatif)

Image debian Buster avec VirtualBox

Pour info

VBoxManage startvm 'Debian Buster' --type headless  # Lancement VM sans l'application graphique 
VBoxManage controlvm 'Debian Buster' poweroff        # Pour arrêter une VM
VBoxManage controlvm 'Debian Buster' pause           # Pour mettre en pause une VM
VBoxManage controlvm 'Debian Buster' reset           # Pour réinitialiser une VM

Connexion SSH

ssh bust@192.168.0.49

Passer en root

su 

Mise à jour

apt update && apt upgrade -y

Installer sudo

apt install sudo

Visudo pour les accès root via utilisateur bust

echo "bust     ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Connexion ssh avec clé (facultatif)

Ajouter le contenu de la clé publique vbox-vmbust-ed25519.pub au fichier ~/.ssh/authorized_keys
Droit en lecture utilisateur uniquement, chmod 400 ~/.ssh/authorized_keys
Modification configuration serveur ssh , /etc/ssh/sshd_config -> PasswordAuthentication no
Relancer le service sudo systemctl restart sshd

VBox Additions Invité/Debian

Préalable
Configurer votre machine virtuelle pour un accès au réseau partagé.
'’Configuration’’ –> ‘‘Dossiers partagés’‘
Ajouter le dossier et cocher '’Montage automatique’‘

Texte alternatif

Texte alternatif

Installer les additions client dans un Debian en cours d’exécution dans une machine virtuelle.

  • Installez gcc ,make et kernel headers (installateur a besoin d’eux pour construire le module du noyau):
    • sudo apt install gcc make linux-headers-$(uname -r)
  • Allez dans le menu '’Périphériques’’ –> ‘‘Insérer l’image des additions invité…’‘ de la machine virtuelle en cours d’exécution ,si non présent , la télécharger.
  • Monter le cd dans la machine virtuelle : sudo mount /dev/cdrom /media/cdrom
  • Allez dans le dossier monté : cd /media/cdrom
  • Exécutez : sudo ./VBoxLinuxAdditions.run
    • Pas d’environnement graphique : ne pas tenir compte de l'erreur '’Could not find the X.Org or XFree86 Window System, skipping.’‘
  • Il faut ajouter le group vboxsf à votre utilisateur : sudo usermod -a -G vboxsf $USER
  • Pour la prise en compte, redémarrer la machine virtuelle : sudo reboot

/media/ est le répertoire qui contient le(s) dossier(s) partagé(s) Dans notre cas /media/sf_Partage

OpenSSH, clé et script

OpenSSH

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

ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/vbox-vmbust-ed25519

Envoyer la clé publique sur le serveur KVM

scp ~/.ssh/vbox-vmbust-ed25519.pub bust@192.168.0.49:/home/bust/

sur le serveur KVM On se connecte

ssh bust@192.168.0.49

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/vbox-vmbust-ed25519.pub >> $HOME/.ssh/authorized_keys

et donner les droits

chmod 600 $HOME/.ssh/authorized_keys

effacer le fichier de la clé

rm $HOME/vbox-vmbust-ed25519.pub

Modifier la configuration serveur SSH

Port = 55045 # changement numéro port , facultatif
PermitRootLogin no # Connexion par root NON autorisée
PasswordAuthentication no # Utilise la clé comme authentification

Exécuter les commande ci-dessous

#sudo sed -i 's/#Port 22/Port 55022/g' /etc/ssh/sshd_config
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/g' /etc/ssh/sshd_config
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config

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-get install libpam-systemd  # Installé par défaut sur debian buster

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.

Relancer openSSH

sudo systemctl restart sshd

Accès depuis le poste distant avec la clé privée

ssh -i ~/.ssh/vbox-vmbust-ed25519 bust@192.168.0.49

Gestion machine virtuelle VM

Démarrer la machine virtuelle VM en ligne de commande sans interface graphique VirtualBox

VBoxManage startvm "Debian Buster" --type headless

Arrêter une VM

VBoxManage controlvm "Debian Buster" poweroff

Mettre en pause une VM

VBoxManage controlvm "Debian Buster" pause

Réinitialiser une VM

VBoxManage controlvm "Debian Buster" reset

En savoir plus sur VBoxHeadless, regardez

VBoxHeadless --help 

Instantané (Snapshot)

Création d’un instantané Base Debian Buster + Partage + Clés SSH
Mise à jour debian buster
Création d’un instantané Debian 10.1 après mise à jour

Docker

“Docker” + “Docker Compose” sur Debian Stretch, installation et utilisation
Suivre les procédures énoncées en suivant le lien ci-dessus…


NON INSTALLE

Exécution script “neofetch” (facultatif)

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

Installer neofetch

sudo apt install  neofetch

Le lancement

neofetch 

Nginx + OpenSSL (TLS v1.3) + PHP7.3 + MariaDB


Debian , Compilation Nginx (modules-dynamiques) + TLSv1.3 + PHP7.3 + MariaDb

Avec le script téléchargeable

wget -O compil.sh https://static.cinay.xyz/files/debian10-compilation-nginx-lua-tls1.3-php7.3-MariaDB.sh
chmod +x compil.sh
sudo -s
./compil.sh

A la fin de la compilation…

[...]
Versions Nginx OpenSSL MariaDB et PHP
nginx version: nginx/1.16.1
OpenSSL 1.1.1c  28 May 2019
mysql  Ver 15.1 Distrib 10.3.15-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Mot de passe MySql/MariaDB : /etc/mysql/mdp
PHP 7.3.8-1+0~20190807.43+debian10~1.gbp7731bf (cli) (built: Aug  7 2019 19:47:21) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.8-1+0~20190807.43+debian10~1.gbp7731bf, Copyright (c) 1999-2018, by Zend Technologies
********** FIN EXECUTION SCRIPT ************

Adressage ipv6

Réseau actuel

ip addr
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 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:96:9d:94 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.49/24 brd 192.168.0.255 scope global dynamic enp0s3
       valid_lft 38231sec preferred_lft 38231sec
    inet6 2a01:e34:eebf:df0:a00:27ff:fe96:9d94/64 scope global dynamic mngtmpaddr 
       valid_lft 85891sec preferred_lft 85891sec
    inet6 fe80::a00:27ff:fe96:9d94/64 scope link 
       valid_lft forever preferred_lft forever

La carte n’est joignable de l’internet que par son adresse IPV6
NextHop Freebox permet d’attribuer une adresse IPV6
Adresse IPV6 Box fe80::224:d4ff:fea6:aa20
Préfixe 2a01:e34:ee6a:b274::/64
NextHop fe80::a00:27ff:fe96:9d94

sudo nano /etc/network/interfaces
# 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 enp0s3
iface enp0s3 inet dhcp
# This is an autoconfigured IPv6 interface
# iface enp0s3 inet6 auto
iface enp0s3 inet6 static
  address 2a01:e34:ee6a:b274::1
  netmask 64
  post-up ip -6 route add default via fe80::224:d4ff:fea6:aa20 dev enp0s3

Redémarrer la machine

sudo systemctl reboot

Vérifier l’adresse inet6

ip addr
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 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:96:9d:94 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.49/24 brd 192.168.0.255 scope global dynamic enp0s3
       valid_lft 43034sec preferred_lft 43034sec
    inet6 2a01:e34:ee6a:b274::1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 2a01:e34:eebf:df0:a00:27ff:fe96:9d94/64 scope global dynamic mngtmpaddr 
       valid_lft 86230sec preferred_lft 86230sec
    inet6 fe80::a00:27ff:fe96:9d94/64 scope link 
       valid_lft forever preferred_lft forever

DNS

Le domaine ouestline.xyz pointe sur l’adresse IPV6 2a01:e34:ee6a:b274::1

depuis un poste distant
ping -6 -c5 2a01:e34:ee6a:b274::1
ping -6 -c5 ouestline.xyz

OVH

$TTL 3600
@	IN SOA dns111.ovh.net. tech.ovh.net. (2018110102 86400 3600 3600000 300)
         3600 IN NS     ns111.ovh.net.
         3600 IN NS     dns111.ovh.net.
         3600 IN AAAA   2a01:e34:ee6a:b274::1
*        3600 IN CNAME  ouestline.xyz.

Certificats SSL letsencrypt (acme)

SSL Letsencrypt

Exporter les clés OVH

Domaine ouestline.xyz

acme.sh --dns dns_ovh --issue --keylength ec-384 -d 'ouestline.xyz' -d '*.ouestline.xyz'

La procédure complète

bust@vmbust:~$ acme.sh --dns dns_ovh --issue --keylength ec-384 -d 'ouestline.xyz' -d '*.ouestline.xyz'
[vendredi 23 août 2019, 13:33:03 (UTC+0200)] Create account key ok.
[vendredi 23 août 2019, 13:33:03 (UTC+0200)] Registering account
[vendredi 23 août 2019, 13:33:05 (UTC+0200)] Registered
[vendredi 23 août 2019, 13:33:05 (UTC+0200)] ACCOUNT_THUMBPRINT='lwew42g-q_vdLUoEnk1pr4sc9hkZnPrm2v3eQ63i9E4'
[vendredi 23 août 2019, 13:33:05 (UTC+0200)] Creating domain key
[vendredi 23 août 2019, 13:33:05 (UTC+0200)] The domain key is here: /home/bust/.acme.sh/ouestline.xyz_ecc/ouestline.xyz.key
[vendredi 23 août 2019, 13:33:05 (UTC+0200)] Multi domain='DNS:ouestline.xyz,DNS:*.ouestline.xyz'
[vendredi 23 août 2019, 13:33:05 (UTC+0200)] Getting domain auth token for each domain
[vendredi 23 août 2019, 13:33:07 (UTC+0200)] Getting webroot for domain='ouestline.xyz'
[vendredi 23 août 2019, 13:33:07 (UTC+0200)] Getting webroot for domain='*.ouestline.xyz'
[vendredi 23 août 2019, 13:33:07 (UTC+0200)] Adding txt value: ZHHFDhWhgP1svOEPfwDHeJBrXBrEUY5TeRPr43iApIw for domain:  _acme-challenge.ouestline.xyz
[vendredi 23 août 2019, 13:33:07 (UTC+0200)] Using OVH endpoint: ovh-eu
[vendredi 23 août 2019, 13:33:07 (UTC+0200)] OVH consumer key is empty, Let's get one:
[vendredi 23 août 2019, 13:33:08 (UTC+0200)] Please open this link to do authentication: https://eu.api.ovh.com/auth/?credentialToken=i2G3SQBWY3XfLJiIavacdG1MmiF3fralBdH8sd31hZzAD4z6vxZiIvHebn3DEDs4
[vendredi 23 août 2019, 13:33:08 (UTC+0200)] Here is a guide for you: https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api
[vendredi 23 août 2019, 13:33:08 (UTC+0200)] Please retry after the authentication is done.
[vendredi 23 août 2019, 13:33:08 (UTC+0200)] Error add txt for domain:_acme-challenge.ouestline.xyz
[vendredi 23 août 2019, 13:33:08 (UTC+0200)] Please add '--debug' or '--log' to check more details.
[vendredi 23 août 2019, 13:33:08 (UTC+0200)] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh

Authentification OVH avec le lien https://eu.api.ovh.com/auth/?credentialToken=i2G3SQBWY3XfLJiIavacdG1MmiF3fralBdH8sd31hZzAD4z6vxZiI pour valider la DNS

bust@vmbust:~$ acme.sh --dns dns_ovh --issue --keylength ec-384 -d 'ouestline.xyz' -d '*.ouestline.xyz'
[vendredi 23 août 2019, 13:34:03 (UTC+0200)] Multi domain='DNS:ouestline.xyz,DNS:*.ouestline.xyz'
[vendredi 23 août 2019, 13:34:03 (UTC+0200)] Getting domain auth token for each domain
[vendredi 23 août 2019, 13:34:06 (UTC+0200)] Getting webroot for domain='ouestline.xyz'
[vendredi 23 août 2019, 13:34:06 (UTC+0200)] Getting webroot for domain='*.ouestline.xyz'
[vendredi 23 août 2019, 13:34:07 (UTC+0200)] Adding txt value: 3kY6vAMc2ezmZCIrSzdBCXgFUwSq5VPO8x1JJwjCgAw for domain:  _acme-challenge.ouestline.xyz
[vendredi 23 août 2019, 13:34:07 (UTC+0200)] Using OVH endpoint: ovh-eu
[vendredi 23 août 2019, 13:34:07 (UTC+0200)] Checking authentication
[vendredi 23 août 2019, 13:34:07 (UTC+0200)] Consumer key is ok.
[vendredi 23 août 2019, 13:34:08 (UTC+0200)] Adding record
[vendredi 23 août 2019, 13:34:09 (UTC+0200)] Added, sleep 10 seconds.
[vendredi 23 août 2019, 13:34:20 (UTC+0200)] The txt record is added: Success.
[vendredi 23 août 2019, 13:34:20 (UTC+0200)] Adding txt value: ABfmOPvV3udBVZ6y9rGtlIXpndPGbYXAMLK1Ge6zKro for domain:  _acme-challenge.ouestline.xyz
[vendredi 23 août 2019, 13:34:20 (UTC+0200)] Using OVH endpoint: ovh-eu
[vendredi 23 août 2019, 13:34:20 (UTC+0200)] Checking authentication
[vendredi 23 août 2019, 13:34:21 (UTC+0200)] Consumer key is ok.
[vendredi 23 août 2019, 13:34:21 (UTC+0200)] Adding record
[vendredi 23 août 2019, 13:34:23 (UTC+0200)] Added, sleep 10 seconds.
[vendredi 23 août 2019, 13:34:34 (UTC+0200)] The txt record is added: Success.
[vendredi 23 août 2019, 13:34:34 (UTC+0200)] Let's check each dns records now. Sleep 20 seconds first.
[vendredi 23 août 2019, 13:34:55 (UTC+0200)] Checking ouestline.xyz for _acme-challenge.ouestline.xyz
[vendredi 23 août 2019, 13:34:55 (UTC+0200)] Domain ouestline.xyz '_acme-challenge.ouestline.xyz' success.
[vendredi 23 août 2019, 13:34:55 (UTC+0200)] Checking ouestline.xyz for _acme-challenge.ouestline.xyz
[vendredi 23 août 2019, 13:34:56 (UTC+0200)] Domain ouestline.xyz '_acme-challenge.ouestline.xyz' success.
[vendredi 23 août 2019, 13:34:56 (UTC+0200)] All success, let's return
[vendredi 23 août 2019, 13:34:56 (UTC+0200)] Verifying: ouestline.xyz
[vendredi 23 août 2019, 13:34:59 (UTC+0200)] Success
[vendredi 23 août 2019, 13:34:59 (UTC+0200)] Verifying: *.ouestline.xyz
[vendredi 23 août 2019, 13:35:03 (UTC+0200)] Success
[vendredi 23 août 2019, 13:35:03 (UTC+0200)] Removing DNS records.
[vendredi 23 août 2019, 13:35:03 (UTC+0200)] Removing txt: 3kY6vAMc2ezmZCIrSzdBCXgFUwSq5VPO8x1JJwjCgAw for domain: _acme-challenge.ouestline.xyz
[vendredi 23 août 2019, 13:35:03 (UTC+0200)] Using OVH endpoint: ovh-eu
[vendredi 23 août 2019, 13:35:03 (UTC+0200)] Checking authentication
[vendredi 23 août 2019, 13:35:04 (UTC+0200)] Consumer key is ok.
[vendredi 23 août 2019, 13:35:07 (UTC+0200)] Removed: Success
[vendredi 23 août 2019, 13:35:07 (UTC+0200)] Removing txt: ABfmOPvV3udBVZ6y9rGtlIXpndPGbYXAMLK1Ge6zKro for domain: _acme-challenge.ouestline.xyz
[vendredi 23 août 2019, 13:35:07 (UTC+0200)] Using OVH endpoint: ovh-eu
[vendredi 23 août 2019, 13:35:07 (UTC+0200)] Checking authentication
[vendredi 23 août 2019, 13:35:07 (UTC+0200)] Consumer key is ok.
[vendredi 23 août 2019, 13:35:10 (UTC+0200)] Removed: Success
[vendredi 23 août 2019, 13:35:10 (UTC+0200)] Verify finished, start to sign.
[vendredi 23 août 2019, 13:35:10 (UTC+0200)] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/64076798/947349915
[vendredi 23 août 2019, 13:35:12 (UTC+0200)] Download cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/038d0cc2ff050a72afd145594055583b058e
[vendredi 23 août 2019, 13:35:12 (UTC+0200)] Cert success.
-----BEGIN CERTIFICATE-----
MIIEtjCCA56gAwIBAgISA40Mwv8FCnKv0UVZQFVYOwWOMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xOTA4MjMxMDM1MTFaFw0x
[...]
N1ZILb50kuFHkeQyH1vSSXcWu60aQa8/BeOuulG14xsVTGDYES5q8siYDDzMz20/
r9ubkKt7X5fNfpXYNsC61wp6k2K6O8ZLEkW2pjBxh3KeECONudD2ftfAi1oDdhp1
7Va+F88j8wZwEeAE0LY/J6aJbQofnWd1+uCSZuAd+ZkqimalXAPW/Pn3jWQQu1cz
z4eQEhyiRDCmUw==
-----END CERTIFICATE-----
[vendredi 23 août 2019, 13:35:12 (UTC+0200)] Your cert is in  /home/bust/.acme.sh/ouestline.xyz_ecc/ouestline.xyz.cer 
[vendredi 23 août 2019, 13:35:12 (UTC+0200)] Your cert key is in  /home/bust/.acme.sh/ouestline.xyz_ecc/ouestline.xyz.key 
[vendredi 23 août 2019, 13:35:12 (UTC+0200)] The intermediate CA cert is in  /home/bust/.acme.sh/ouestline.xyz_ecc/ca.cer 
[vendredi 23 août 2019, 13:35:12 (UTC+0200)] And the full chain certs is there:  /home/bust/.acme.sh/ouestline.xyz_ecc/fullchain.cer 

Les liens pour les certificats

sudo ln -s/home/bust/.acme.sh/ouestline.xyz_ecc/ouestline.xyz.cer /etc/ssl/private/ouestline.xyz-chain.pem   # cert domain
sudo ln -s /home/bust/.acme.sh/ouestline.xyz_ecc/ouestline.xyz.key /etc/ssl/private/ouestline.xyz-key.pem     # cert key
sudo ln -s /home/bust/.acme.sh/ouestline.xyz_ecc/ca.cer /etc/ssl/private/ouestline.xyz-ca.pem                 # intermediate CA cert
sudo ln -s /home/bust/.acme.sh/ouestline.xyz_ecc/fullchain.cer /etc/ssl/private/ouestline.xyz-fullchain.pem   # full chain certs

Nginx + SSL + Diffie-Hellmann + Entêtes

ssl
Il faut préalablement demander des certificats (ca+key) SSL pour le domaine auprès d’une autorité de certification (let’s encrypt ou autre)
Le fichier de configuration

sudo nano /etc/nginx/ssl_params
    ssl_certificate /etc/ssl/private/ouestline.xyz-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/ouestline.xyz-key.pem;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;

    # Ciphers with modern compatibility
    # New protocol TLSv1.3
    ssl_protocols TLSv1.3 TLSv1.2;
    ssl_ciphers 'TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

Diffie-Hellmann
Générer une clé Diffie-Hellmann
L’algorithme Diffie-Hellman est un algorithme d’échange de clés, utilisé notamment lors de l’ouverture d’une connexion à un site sécurisé via le protocole SSL/TLS.

Générer une clé Diffie Hellman (patienter quelques minutes)

sudo openssl dhparam -out /etc/ssl/private/dh2048.pem -outform PEM -2 2048

Ajouter la ligne suivante au fichier ssl_params

ssl_dhparam /etc/ssl/private/dh2048.pem;

Entêtes
Le fichier de configuration

sudo nano /etc/nginx/header_params
    # 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/ 
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; 
    add_header Content-Security-Policy "upgrade-insecure-requests";
    add_header Content-Security-Policy-Report-Only "default-src https: data: 'unsafe-inline' 'unsafe-eval'";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header X-Frame-Options "SAMEORIGIN";

On change le dossier racine

sudo mkdir /var/www/default-www
sudo mv /var/www/{index.html,info.php} /var/www/default-www/

Configuration de base avec SSL et sécurité + letsencrypt (renouvellement)

sudo nano /etc/nginx/conf.d/ouestline.xyz.conf
server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name ouestline.xyz;
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ouestline.xyz;

    ####    Locations
    # On cache les fichiers statiques
    location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg|eot|woff|ttf)$ { expires max; }
    # On interdit les dotfiles
    location ~ /\. { deny all; }

    include ssl_params;
    include header_params;

    root /var/www/default-www ;
    index index.php index.html index.htm;
        location ~ \.php$ {
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_pass unix:/run/php/php7.3-fpm.sock;   # PHP7.3
           fastcgi_index index.php;
           include fastcgi_params;
	   fastcgi_param SCRIPT_FILENAME $request_filename;
        }

    # if folder ouestline.xyz.d , uncomment the following directive
    #include conf.d/ouestline.xyz.d/*.conf;

    access_log /var/log/nginx/ouestline.xyz-access.log;
    error_log /var/log/nginx/ouestline.xyz-error.log;
}

Vérifier

sudo nginx -t

Relancer

sudo systemctl reload nginx

Test redirection http/https avec curl depuis un poste distant

curl -I ouestline.xyz
HTTP/1.1 301 Moved Permanently
Server: nginx/1.16.1
Date: Fri, 23 Aug 2019 11:58:55 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://ouestline.xyz/

Tester le lien https://ouestline.xyz

Vérifier les entêtes depuis un autre poste

curl -I https://ouestline.xyz
HTTP/2 200 
server: nginx/1.16.1
date: Fri, 23 Aug 2019 11:59:35 GMT
content-type: text/html
content-length: 867
last-modified: Fri, 23 Aug 2019 07:11:20 GMT
etag: "5d5f9198-363"
expires: Thu, 31 Dec 2037 23:55:55 GMT
cache-control: max-age=315360000
strict-transport-security: max-age=63072000; includeSubDomains; preload
content-security-policy: upgrade-insecure-requests
content-security-policy-report-only: default-src https: data: 'unsafe-inline' 'unsafe-eval'
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
x-download-options: noopen
x-permitted-cross-domain-policies: none
x-frame-options: SAMEORIGIN
accept-ranges: bytes

script ssh_rc

Exécuter un fichier utilisateur nommé $HOME/.ssh/rc si présent
Pour tous les utilisateurs exécuter un fichier nommé /etc/ssh/sshrc si présent
Installer les utilitaires curl jq figlet

sudo apt install curl jq figlet

Le batch

nano ~/ssh_rc
#!/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. de fichiers                      Taille Utilisé Dispo Uti% Monté sur"
lvm=$(df -h |grep mapper)
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$lvm
\e[1;35m\e[1;32m$meteo
\e[1;0m
"

Rendre exécutable

chlod +x ~/ssh_rc

NFS client

Installation

sudo apt install nfs-server

Les partages sur PC1

sudo showmount -e 192.168.0.28
Export list for 192.168.0.28:
/home/yannick/media/dplus/statique 192.168.0.0/24
/home/yannick/media/devel          192.168.0.0/24
/home/yannick/video                192.168.0.0/24

autofs

Montage auto pour la gestion des cartes

sudo apt install autofs

Modifier le fichier /etc/auto.master

sudo nano /etc/auto.master
+auto.master
/var/www        /etc/auto.nfs --ghost

Créer le fichier /etc/auto.nfs

sudo nano /etc/auto.nfs
map -fstype=nfs,rw,uid=1000,guid=1000,rsize=8192,wsize=8192  192.168.0.28:/home/yannick/media/devel/ouestline/osm-new
devel -fstype=nfs,rw,uid=1000,guid=1000,rsize=8192,wsize=8192  192.168.0.28:/home/yannick/media/devel

Recharger

sudo systemctl restart autofs

Vérifier

ls /var/www/map/
#   css  file  fonts  images  index.html  js
ls /var/www/devel
#   git-yunohost  lamalle  osm.tar.gz  ouestline  yannick

map.ouestline.xyz et dev.ouestline.xyz

Création d’un lien sur une application cartographique

sudo nano /etc/nginx/conf.d/map.ouestline.conf 
server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name map.ouestline.xyz;
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name map.ouestline.xyz;
    root /var/www/map/ ;

    ssl_certificate /etc/ssl/private/ouestline.xyz.fullchain.cer.pem;
    ssl_certificate_key /etc/ssl/private/ouestline.xyz.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
    # (this doesn't work on jessie though ...?)
    # ssl_ecdh_curve secp521r1:secp384r1:prime256v1;

    # As suggested by https://cipherli.st/
    ssl_ecdh_curve secp384r1;

    ssl_prefer_server_ciphers on;

    # Ciphers with modern compatibility
    #---------------------------------
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=modern
    # Uncomment the following to use modern ciphers, but remove compatibility with some old clients (android < 5.0, Internet Explorer < 10, ...)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AESGCM:EECDH+CHACHA20:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

    # 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/ 
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; 
    add_header Content-Security-Policy "upgrade-insecure-requests";
    add_header Content-Security-Policy-Report-Only "default-src https: data: 'unsafe-inline' 'unsafe-eval'";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header X-Frame-Options "SAMEORIGIN";

    index index.html index.php;
        location ~ \.php$ {
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_pass unix:/run/php/php7.3-fpm.sock;   # PHP7.3
           fastcgi_index index.php;
           include fastcgi_params;
           fastcgi_param SCRIPT_FILENAME $request_filename;
        }
}

Pour le développement

sudo nano /etc/nginx/conf.d/map.ouestline.conf 
server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name dev.ouestline.xyz;
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name dev.ouestline.xyz;
    root /var/www/devel/ ;

    ssl_certificate /etc/ssl/private/ouestline.xyz.fullchain.cer.pem;
    ssl_certificate_key /etc/ssl/private/ouestline.xyz.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
    # (this doesn't work on jessie though ...?)
    # ssl_ecdh_curve secp521r1:secp384r1:prime256v1;

    # As suggested by https://cipherli.st/
    ssl_ecdh_curve secp384r1;

    ssl_prefer_server_ciphers on;

    # Ciphers with modern compatibility
    #---------------------------------
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=modern
    # Uncomment the following to use modern ciphers, but remove compatibility with some old clients (android < 5.0, Internet Explorer < 10, ...)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AESGCM:EECDH+CHACHA20:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

    # 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/ 
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; 
    add_header Content-Security-Policy "upgrade-insecure-requests";
    add_header Content-Security-Policy-Report-Only "default-src https: data: 'unsafe-inline' 'unsafe-eval'";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header X-Frame-Options "SAMEORIGIN";

        location / {
          fancyindex on;              # Enable fancy indexes.
          fancyindex_exact_size off;  # Output human-readable file sizes.
        }

    index index.html index.php;
        location ~ \.php$ {
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_pass unix:/run/php/php7.3-fpm.sock;   # PHP7.3
           fastcgi_index index.php;
           include fastcgi_params;
           fastcgi_param SCRIPT_FILENAME $request_filename;
        }
}

Vérifier et relancer

sudo nginx -t
sudo systemctl restart nginx

Cartographie, les modifications se font en local sur PC1 dossier /home/yannick/media/devel/ouestline/osm-new/
Le développement , dossier /home/yannick/media/devel/

Site statique -> static.ouestline.xyz

Installation ruby + jekyll

sudo apt install build-essential ruby-full
sudo gem install bundler jekyll-feed

wikistatic

Installer dépendances Rmagick sur Debian

sudo apt install imagemagick libmagick++-dev ruby-rmagick 

Création dossier

sudo mkdir -p /srv     # création dossier

Les droits sur le dossier

sudo chown   $USER. -R /srv/

Clonage wikistatic par git

sudo apt install git 
cd /srv
git clone https://gitea.yanspm.com/yannick/wikistatic2.0 wikistatic 
cd wikistatic

Lancement “bundle” dans le dossier /srv/wikistatic pour la création de l’environnement

cd /srv/wikistatic
bundle

Les dossiers de l’hôte sont partagés sur la VBox debian (nfs+autofs)
Montage auto des dossiers pour le site statique ,ajout au fichier /etc/auto.master

sudo nano /etc/auto.master
# ligne à ajouter
/srv/nfs        /etc/statique.nfs --ghost

Créer le fichier /etc/statique.nfs

sudo nano /etc/statique.nfs
statique -fstype=nfs,rw,uid=1000,guid=1000,rsize=8192,wsize=8192  192.168.0.28:/home/yannick/media/dplus/statique

Recharger

sudo systemctl restart autofs

Vérifier

ls /srv/nfs/statique/
#   files  images  liens_pour_editeur_md  _posts

Création des liens avec le partage NFS VBox (files , images et _posts)
On efface les dossiers actuels (ils peuvent ne pas exister)

sudo rm -r /srv/wikistatic/{files,images,_posts}

Créer les liens avec le partage NFS

sudo ln -s /srv/nfs/statique/_posts /srv/wikistatic/_posts
sudo ln -s /srv/nfs/statique/images /srv/wikistatic/images
sudo ln -s /srv/nfs/statique/files /srv/wikistatic/files

Structure wikistatic

/srv/wikistatic/
├── 404.html
├── assets
├── categories.html
├── _config.yml
├── feed.xml
├── files -> /srv/nfs/statique/files
├── Gemfile
├── Gemfile.lock
├── images -> /srv/nfs/statique/images
├── _includes
├── index.html
├── js
├── _layouts
├── _posts -> /srv/nfs/statique/_posts
├── README.md
├── start_basicblog.sh
├── start_jekyll.sh
└── tags.html

Construire le site

cd /srv/wikistatic # aller au dossier avant construction
jekyll build  # construction du dossier statique _site
Configuration file: /srv/wikistatic/_config.yml
            Source: /srv/wikistatic
       Destination: /srv/wikistatic/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
                    done in 15.062 seconds.
 Auto-regeneration: disabled. Use --watch to enable.

Générer site automatiquement

Le dossier _site est regénéré à chaque création, modification ou suppression d’un fichier de type markdown dans le dossier _posts
Cette opération doit être lancée et en attente. Un bash et un service vont être utilisés.

Pour lancer le serveur Jekyll au démarrage , créer un bash sous /srv/wikistatic

nano /srv/wikistatic/start_jekyll.sh
#!/bin/sh
# Accès dossier 
cd /srv/wikistatic/
# lancement jekyll en mode auto génération sans serveur
/usr/local/bin/bundle exec jekyll build --watch --source "/srv/wikistatic"

Droits sur le bash

sudo chown $USER. /srv/wikistatic/start_jekyll.sh
chmod +x /srv/wikistatic/start_jekyll.sh

Pour lancer le serveur Jekyll au démarrage, utilisation d’un service systemd
ATTENTION! , remplacer User=utilisateur par votre nom d’utilisateur (echo $USER)

Création d’un service jekyll sous systemd

sudo nano /etc/systemd/system/jekyll.service

Contenu du fichier

[Unit]
Description=jekyll Service
After=network.target

[Service]
Type=simple
User=bust
ExecStart=/bin/sh /srv/wikistatic/start_jekyll.sh
Restart=on-abort


[Install]
WantedBy=multi-user.target

Lancer le service jekyll :

sudo systemctl daemon-reload
sudo systemctl start jekyll

Vérifier

systemctl status jekyll
● jekyll.service - jekyll Service
   Loaded: loaded (/etc/systemd/system/jekyll.service; disabled; vendor preset: enabled)
   Active: active (running) since Sat 2019-04-27 13:54:42 CEST; 52s ago
 Main PID: 28671 (sh)
    Tasks: 5 (limit: 4915)
   CGroup: /system.slice/jekyll.service
           ├─28671 /bin/sh /srv/wikistatic/start_jekyll.sh
           └─28672 /usr/local/bin/jekyll build --watch --source /srv/wikistatic

Valider le lancement du service jekyll au démarrage

sudo systemctl enable jekyll

nginx static.ouestline.conf

fichier /etc/nginx/conf.d/static.ouestline.conf

sudo nano /etc/nginx/conf.d/static.ouestline.conf
server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name static.ouestline.xyz;
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name static.ouestline.xyz;
    root /srv/wikistatic/_site/ ;

    ssl_certificate /etc/ssl/private/ouestline.xyz.fullchain.cer.pem;
    ssl_certificate_key /etc/ssl/private/ouestline.xyz.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
    # (this doesn't work on jessie though ...?)
    # ssl_ecdh_curve secp521r1:secp384r1:prime256v1;

    # As suggested by https://cipherli.st/
    ssl_ecdh_curve secp384r1;

    ssl_prefer_server_ciphers on;

    # Ciphers with modern compatibility
    #---------------------------------
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=modern
    # Uncomment the following to use modern ciphers, but remove compatibility with some old clients (android < 5.0, Internet Explorer < 10, ...)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AESGCM:EECDH+CHACHA20:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

    # 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/ 
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; 
    add_header Content-Security-Policy "upgrade-insecure-requests";
    add_header Content-Security-Policy-Report-Only "default-src https: data: 'unsafe-inline' 'unsafe-eval'";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header X-Frame-Options "SAMEORIGIN";

    index index.html;
}

Recharger le serveur nginx

sudo systemctl reload nginx

Ordinateur PC1

Créer un service systemd pour lancer debian vbox

Le but est de lancer l’image virtuelle au démarrage de la machine
Création d’un service utilisateur

$ mkdir -p ~/.config/systemd/user
$ nano ~/.config/systemd/user/debian-virtuel.service
[Unit]
Description=debian Buster vm service
After=network.target vboxdrv.service

[Service]
ExecStart=/usr/bin/vboxheadless -s 'Debian Buster'
ExecStop=/usr/bin/vboxmanage controlvm 'Debian Buster' poweroff

[Install]
WantedBy=default.target

Relancer systemd utilisateur

$ systemctl --user daemon-reload

Démarrer le service

$ systemctl start --user debian-virtuel.service

Status

$ systemctl status --user debian-virtuel.service
● debian-virtuel.service - debian Buster vm service
   Loaded: loaded (/home/yannick/.config/systemd/user/debian-virtuel.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-04-17 09:46:25 CEST; 11s ago
 Main PID: 6580 (VBoxHeadless)
   CGroup: /user.slice/user-1000.slice/user@1000.service/debian-virtuel.service
           ├─6580 /usr/lib/virtualbox/VBoxHeadless -s Debian Buster
           ├─6593 /usr/lib/virtualbox/VBoxXPCOMIPCD
           └─6598 /usr/lib/virtualbox/VBoxSVC --auto-shutdown

avril 17 09:46:25 yannick-pc systemd[931]: Started debian Buster vm service.

Activation

systemctl enable --user debian-virtuel.service

Site statique -> blog.ouestline.xyz

Liens

Prérequis

wikistatic est installé

Installer un “thème”

Clonage “thème” par git

cd /srv
sudo -s
git clone https://github.com/agusmakmun/agusmakmun.github.io.git
mv agusmakmun.github.io basicblog
exit

Les droits sur le dossier

sudo chown   $USER.$USER -R /srv/basicblog

Lancement “bundle” dans le dossier /srv/basicblog

cd /srv/basicblog
bundle update github-pages
bundle

Modifier le fichier de configuration

nano _config.yml
exclude: [start_basicblog.sh]

Créer service basicblog

Le script /srv/basicblog/start_basicblog.sh contenu dans le service

#!/bin/sh
# Accès dossier 
cd /srv/basicblog/
# lancement jekyll en mode auto génération sans serveur
/usr/local/bin/bundle exec jekyll build --watch --source "/srv/basicblog"

On va exécuter un service qui va mettre le générateur “jekyll” en attente de modifications dans le dossier _posts (création, modification ou suppression de fichier markdown)

sudo nano /etc/systemd/system/basicblog.service

Contenu du fichier (User debadm)

[Unit]
Description=jekyll Service
After=network.target

[Service]
Type=simple
User=bust
ExecStart=/bin/sh /srv/basicblog/start_basicblog.sh
Restart=on-abort


[Install]
WantedBy=multi-user.target

Créer les liens avec le partage NFS

sudo rm -r /srv/basicblog/{_posts,images,files}  # efface l'existant
sudo ln -s /srv/nfs/statique/_posts /srv/basicblog/_posts
sudo ln -s /srv/nfs/statique/images /srv/basicblog/images
sudo ln -s /srv/nfs/statique/files /srv/basicblog/files

Si on utilise les liens , il faut copier un fichier

cp /srv/wikistatic/_includes/video.html /srv/basicblog/_includes/

Lancer le service basicblog :

sudo systemctl daemon-reload
sudo systemctl start basicblog
# Valider le lancement du service basicblog au démarrage
sudo systemctl enable basicblog
#Vérifier
sudo systemctl status basicblog
● basicblog.service - basicblog Service
   Loaded: loaded (/etc/systemd/system/basicblog.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-01-29 20:07:14 CET; 8s ago
 Main PID: 18347 (sh)
    Tasks: 5 (limit: 4915)
   CGroup: /system.slice/basicblog.service
           ├─18347 /bin/sh /srv/basicblog/start_basicblog.sh
           └─18348 ruby2.3 /usr/local/bin/jekyll build --watch --source /srv/basicblog

jekyll génére un dossier statique /srv/basicblog/_site

nginx blog.ouestline.conf

fichier /etc/nginx/conf.d/blog.ouestline.conf

sudo nano /etc/nginx/conf.d/blog.ouestline.conf
server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name blog.ouestline.xyz;
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name blog.ouestline.xyz;
    root /srv/basicblog/_site/ ;

    ssl_certificate /etc/ssl/private/ouestline.xyz.fullchain.cer.pem;
    ssl_certificate_key /etc/ssl/private/ouestline.xyz.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
    # (this doesn't work on jessie though ...?)
    # ssl_ecdh_curve secp521r1:secp384r1:prime256v1;

    # As suggested by https://cipherli.st/
    ssl_ecdh_curve secp384r1;

    ssl_prefer_server_ciphers on;

    # Ciphers with modern compatibility
    #---------------------------------
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=modern
    # Uncomment the following to use modern ciphers, but remove compatibility with some old clients (android < 5.0, Internet Explorer < 10, ...)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AESGCM:EECDH+CHACHA20:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

    # 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/ 
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; 
    add_header Content-Security-Policy "upgrade-insecure-requests";
    add_header Content-Security-Policy-Report-Only "default-src https: data: 'unsafe-inline' 'unsafe-eval'";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header X-Frame-Options "SAMEORIGIN";

    index index.html;
}

Recharger le serveur nginx

sudo systemctl reload nginx

Remplacer thème existant

Si un thème est déjà installé

sudo mkdir -p /srv/archives/                      # dossier de sauvegarde 
sudo chown $USER.$USER -R /srv/archives/          # droits
sudo systemctl stop basicblog                     # arrêt du service
# on archive les fichiers communs à tous les thèmes
cp /srv/basicblog/_includes/video.html /srv/archives/
cp /srv/basicblog/start_basicblog.sh /srv/archives/
sudo rm -r /srv/basicblog/                        # effacer le thème en cours
# On installe le nouveau thème  
git clone https://github.com/aigarsdz/brume.git /srv/basicblog
# On copie les fichiers communs depuis archives
cp /srv/archives/video.html /srv/basicblog/_includes/ 
cp /srv/archives/start_basicblog.sh /srv/basicblog/ 
cp /srv/archives/_config.yml /srv/basicblog/ 
cp /srv/archives/Gemfile /srv/basicblog/ 
sudo rm -r /srv/basicblog/{_posts,images,files}  # efface les dossiers s'ils existent
# Créer les liens avec le partage NFS
sudo ln -s /srv/nfs/statique/_posts /srv/basicblog/_posts
sudo ln -s /srv/nfs/statique/images /srv/basicblog/images
sudo ln -s /srv/nfs/statique/files /srv/basicblog/files
# On installe
cd /srv/basicblog
sudo gem install jekyll-toc
bundle
sudo systemctl restart basicblog
cd ~

Recherche rapide avec fichier json et lunr.js

Pour rendre la recherche plus rapide , il faut utiliser un fichier json qui sera construit à chaque compilation.
Créez un fichier /basicblog.json à la racine de votre site Jekyll /srv/basicblog/

nano /srv/basicblog/basicblog.json

et remplissez-le avec ce qui suit:

---
layout: null
---
[
{% assign count = 0 %}
  {% for post in site.posts %}

    {
      "id": {{count}},
      "title": {{ post.title | jsonify }},
      "content"	 : {{post.content | strip_html | truncatewords: 20 | jsonify }},
      "url":  {{ post.url | jsonify }},
      "tags": "{% for tag in post.tags %}{{ tag }}{% unless forloop.last %}, {% endunless %}{% endfor %}",
      "categories": "{% for category in post.categories %}{{ category }}{% unless forloop.last %}, {% endunless %}{% endfor %}"
    }
    {% unless forloop.last %},{% endunless %}
   {% assign count = count | plus: 1 %}
  {% endfor %}
]

Chaque fois que vous exécutez le processus de compilation de Jekyll, Jekyll utilisera /basicblog.json pour déterminer où chercher et ce qu’il faut saisir et il génèrera un fichier _site/basicblog.json.

Page html de recherche

search.html situé sous la racine /srv/basicblog/ du site statique

nano /srv/basicblog/search.html
---
layout: search
---

<div class="page-header">
  <h1>vmbust "Debian Buster" (VirtualBox/PC1) </h1>
</div>
<div class="form-group">
	<input placeholder="Rechercher" type="search" id="search" class="form-control input-lg">
</div>
<div id="results" class="all-posts results"></div>
<script type="text/javascript" src="/assets/js/jquery.min.js"></script>
<script src="/assets/js/lunr.min.js"></script>
<script src="/assets/js/searchplus.js"></script>

Analyse json via lunr

Chargement et indexation du fichier pour la recherche , fichier javascript searchplus.js dans le dossier js/

nano /srv/basicblog/assets/js/searchplus.js
$(document).ready(function () {
var idx ;
var nbart = 0;
var fichier_json = 'basicblog.json';

//http://www.pureexample.com/jquery/get-json.html
function executerRequete(callback) {
   if (nbart === 0) {
        /* set no cache */
        $.ajaxSetup({ cache: false });

			  idx = lunr(function () {
			    this.field('id');
			    this.field('title');
             this.field('content', { boost: 10 });
			    this.field('url');
			  });

           var html = [];

	  // Get the generated search_data.json file so lunr.js can search it locally.
	  datas = $.getJSON(fichier_json);
	  // Wait for the data to load and add it to lunr
	  datas.then(function(loaded_data){
		    $.each(loaded_data, function(index, d){
		             idx.add({
						    id: index,
						    title: d.title,
						    content: d.content,
						    url: d.url
						  });
						  nbart=nbart + 1;
						/*	//stockage item du fichier	
		                html.push("Titre : ", d.title, ", ",
		                          "URL : ", d.url, ", ", 
		                          "Catégorie : ", d.categories, "<br>");
		               // fin */
		    });
 				
  			  /* // affichage des items
            $("#div381").html(html.join('')).css("background-color", "orange");
            */
            // on lance la fonction de callback, le json est chargé et indexé pour la recherche
            callback();

        });
        $.error(function(jqXHR, textStatus, errorThrown){ /* assign handler */
            /* alert(jqXHR.responseText) */
            alert("error occurred!");
        });
    } else {
        // on lance la fonction de callback avec le json déjà récupéré précédemment
        callback();
    }
 }

 $('input#search').focus();
  
	  // Event when the key
	  $('input#search').on('keyup', function () {
	      //event.preventDefault();
	      //var query = $("input#search").val(); // Get the value for the text field
	      var query = $(this).val();
	      var results = idx.search(query); // Get lunr to perform a search
	      display_search_results(results); // Hand the results off to be displayed
	  });

	  /*  fonction affichage des résultats   */
	  function display_search_results(results) {
	    var $search_results = $("#results");
	    // Wait for data to load
	    datas.then(function(loaded_data) {
	
	      // Are there any results?
	      if (results.length) {
	        $search_results.empty(); // Clear any old results
	
	        // Iterate over the results
	        results.forEach(function(result) {
	          var item = loaded_data[result.ref];
/*
var appendString = ';
*/	
	          // Build a snippet of HTML for this result
	          //var appendString = '<li><a href="' + item.url + '">' + item.title + '</a>   ' + item.content + '</li>';
				 var appendString = '<div class="result"><div class="result-body"><a href="'+item.url+'" class="post-title">'+item.title+'</a><div class="post-date small">'+'</div><p>'+item.content+'</p></div>'
	          // Add the snippet to the collection of results.
	          $search_results.append(appendString);
	        });
	      } else {
	        // If there are no results, let the user know.
	        $search_results.html('<li>Aucun élément trouvé...</li>');
	      }
	    });
	  }
  function lecture() {
    //$("#nombre").html(nbart);
  }

 // on initialise la lecture au premier élément
 executerRequete(lecture);
   
});

Accès depuis PC1 , liens https

Locale (PC1) vmbust (Vbox 192.168.0.49) lien
/home/yannick/media/devel/ /var/www/devel (nfs) dev.ouestline.xyz
/home/yannick/media/devel/ouestline/osm-new (nfs) /var/www/map map.ouestline.xyz
/home/yannick/media/dplus/statique/{images,files,_posts} /srv/wikistatic (images,files,_posts -> nfs) static.ouestline.xyz
/home/yannick/media/dplus/statique/{images,files,_posts} /srv/blog (images,files,_posts -> nfs) blog.ouestline.xyz

Pour un accès aux dossiers sur vmbust , sshm fson