Lundi 27 novembre 2017

KVM Debian Stretch serveur

Package: 4 GB Mémoire, 2 CPU, 30 GB SSD, 100 Mbps
Selected Location: Paris
Debian Stretch 64
Livraison : vps-26381 93.115.96.97

  • Domaine : xoyize.xyz
  • IPv4 du serveur : 93.115.96.97
  • IPv6 du serveur : 2a03:75c0:35:670d::1
  • Reverse DNS : xoyize.xyz
  • Certificats : Let’s Encrypt

Première connexion SSH

Via SSH
ssh root@93.115.96.97
Màj
apt update && apt upgrade
Nom de domaine xoyize.xyz et host
hostnamectl set-hostname "xoyize.xyz" Installer des outils
apt install rsync curl tree tmux jq figlet git -y

Locales

Locales : fr_FR.UTF-8
dpkg-reconfigure locales

Generating locales (this might take a while)...
  fr_FR.UTF-8... done
Generation complete.

Créer le fichier /etc/locale.conf

LANG=fr_FR.UTF-8

ou

localectl set-locale LANG=fr_FR.UTF-8

TimeZone

Europe/Paris
dpkg-reconfigure tzdata

Current default time zone: 'Europe/Paris'
Local time is now:      Wed Nov  8 10:00:53 CET 2017.
Universal Time is now:  Wed Nov  8 09:00:53 UTC 2017.

Création utilisateur

Utilisateur xo
useradd -m -d /home/xo/ -s /bin/bash xo
Mot de passe xo
passwd xo
Visudo pour les accès root via utilisateur xo

apt install sudo
echo "xo     ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Déconnexion puis connexion ssh en mode utilisateur
ssh xo@93.115.96.97

DNS OVH

Configuration des champs DNS domaine xoyize.xyz

$TTL 3600
@	IN SOA dns200.anycast.me. tech.ovh.net. (2017062601 86400 3600 3600000 300)
                       IN NS     dns200.anycast.me.
                       IN NS     ns200.anycast.me.
                       IN A      93.115.96.97
                       IN AAAA   2a03:75c0:35:670d::1
*                      IN CNAME  xoyize.xyz.

SSH

connexion avec clé
sur l'ordinateur de bureau Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) nommé kvm-vps-26381 pour une liaison SSH avec le serveur KVM.
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/kvm-vps-26381
Envoyer la clé publique sur le serveur KVM
scp ~/.ssh/kvm-vps-26381.pub xo@93.115.96.97:/home/xo/

sur le serveur KVM On se connecte
ssh xo@93.115.96.97
Copier le contenu de la clé publique dans /home/$USER/.ssh/authorized_keys
$ cd ~
Sur le KVM ,créer un dossier .ssh

pwd  #pour vérifier que l'on est sous /home/$USER
mkdir .ssh
cat /home/$USER/kvm-vps-26381.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/kvm-vps-26381.pub
Modifier la configuration serveur SSH
sudo nano /etc/ssh/sshd_config
Modifier

Port = 55028
PermitRootLogin no
PasswordAuthentication no
UsePAM no

Relancer openSSH
sudo systemctl restart sshd

Accès depuis le poste distant avec la clé privée
$ ssh -p 55028 -i ~/.ssh/kvm-vps-26381 xo@93.115.96.97

Exécution script sur connexion
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

Le batch
nano ~/.ssh/rc

#!/bin/bash

#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
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`

echo "\033[0m\033[1;31m"  
figlet "xoyize.xyz"
echo "\033[0m"
echo "\033[1;35m  \033[1;37mHostname \033[1;35m= \033[1;32m`hostname`
\033[1;35m  \033[1;37mWired Ip \033[1;35m= \033[1;32m`ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1`
\033[1;35m    \033[1;37mKernel \033[1;35m= \033[1;32m`uname -r`
\033[1;35m    \033[1;37mDebian \033[1;35m= \033[1;32m`cat /etc/debian_version`
\033[1;35m    \033[1;37mUptime \033[1;35m= \033[1;32m`uptime | sed 's/.*up ([^,]*), .*/1/' | sed -e 's/^[ \t]*//'`
\033[1;35m       \033[1;37mCPU \033[1;35m= \033[1;32m`echo $cpuname`
\033[1;35m\033[1;37mMemory Use \033[1;35m= \033[1;32m`free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'`
\033[1;35m  \033[1;37mUsername \033[1;35m= \033[1;32m`whoami`
\033[1;35m  \033[1;37mSessions \033[1;35m= \033[1;32m`who | grep $USER | wc -l`
\033[1;35m\033[1;37mPublic Ip  \033[1;35m= \033[1;32m`echo $publicip $pays`
\033[0m"
#curl fr.wttr.in/Paris?0

Effacer motd
sudo rm /etc/motd
Déconnexion puis connexion

Certificats SSL letsencrypt (acme)

Installation client acme.sh

cd ~
sudo -s  # en mode super utilisateur
apt install netcat  # prérequis
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install # --nocron 
cd ..
rm -rf acme.sh/
# le client est installé dans /root/.acme.sh/

OVH DNS-Api

# application key
export OVH_AK="6b1Smj4kFgQd"
# application secret
export OVH_AS="32vap928M627TztX8t7zBBqMXDW7US" 

Génération des certificats
/root/.acme.sh/acme.sh --dns dns_ovh --issue --keylength 4096 -d xoyize.xyz -d static.xoyize.xyz

Récupérer le lien pour validation

...
[Wed Nov  8 10:31:37 CET 2017] Please open this link to do authentication: https://eu.api.ovh.com/auth/?credentialToken=E6WdT7ox1BplPeTHcL2umr2PD2FJ7gp03KUsSfSXj7IOTsLhUCWCjPWbILPJ1a01
[Wed Nov  8 10:31:37 CET 2017] Here is a guide for you: https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api
[Wed Nov  8 10:31:37 CET 2017] Please retry after the authentication is done.
...

Ouvrir le lien , saisir login/password OVH , validity Unlimited puis Login
Si OVH authentication Success !, relancer le script et patienter quelques minutes
/root/.acme.sh/acme.sh --dns dns_ovh --issue --keylength 4096 -d xoyize.xyz -d static.xoyize.xyz

Certificats

[Wed Nov  8 10:39:04 CET 2017] Your cert is in  /root/.acme.sh/xoyize.xyz/xoyize.xyz.cer 
[Wed Nov  8 10:39:04 CET 2017] Your cert key is in  /root/.acme.sh/xoyize.xyz/xoyize.xyz.key 
[Wed Nov  8 10:39:04 CET 2017] The intermediate CA cert is in  /root/.acme.sh/xoyize.xyz/ca.cer 
[Wed Nov  8 10:39:04 CET 2017] And the full chain certs is there:  /root/.acme.sh/xoyize.xyz/fullchain.cer 

Mise à jour automatique des certificats
crontab -e

21 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Création des liens sur /etc/ssl/private pour nginx

sudo -s
ln -s /root/.acme.sh/xoyize.xyz/fullchain.cer /etc/ssl/private/xoyize.xyz-fullchain-cert.pem
ln -s /root/.acme.sh/xoyize.xyz/xoyize.xyz.key /etc/ssl/private/xoyize.xyz-key.pem
ln -s /root/.acme.sh/xoyize.xyz/xoyize.xyz.cer /etc/ssl/private/xoyize.xyz-cert.pem
ln -s /root/.acme.sh/xoyize.xyz/ca.cer /etc/ssl/private/xoyize.xyz-ca.pem

Site statique

Voir le lien https://gitlab.cinay.pw/spm/wikistatic pour installation

Vérification que le serveur statique est lancé

sudo systemctl status jekyll

Nginx proxy

Nginx Proxy

On passe en mode su

sudo -s

Installation nginx

apt install nginx

Configuration /etc/nginx/nginx.conf

Ajouter dans la balise http

#Disables emitting nginx version
          server_tokens off;
 
#Avoid timeout client need to upload big files
        client_max_body_size 3M;
        proxy_connect_timeout       600;
        proxy_send_timeout          600;
        proxy_read_timeout          600;
        send_timeout                600;
 
#Enforce ssl ciphers
        ssl_session_timeout 1d;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
 
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK;
 
#Enforce EDH ciphers
        ssl_dhparam /etc/ssl/private/dhparam.pem;

Créer le paramètre Diffie-Hellmann

openssl dhparam -out /etc/ssl/private/dhparam.pem 4096

Effacement site par défaut

rm /etc/nginx/sites-enabled/*

Créer un nouveau site

nano /etc/nginx/sites-available/xoyize.xyz
server {
      listen 80;
      server_name static.xoyize.xyz;
      return 301 https://$server_name$request_uri;
}
 
 
#Default ssl server
server {
      listen 443 ssl default_server;
      server_name static.xoyize.xyz;
 
      ssl_certificate           /etc/ssl/private/xoyize.xyz-fullchain-cert.pem;
      ssl_certificate_key       /etc/ssl/private/xoyize.xyz-key.pem;
 
      access_log /var/log/nginx/static.access.log;
      error_log /var/log/nginx/static.error.log;
 
 
      location / {
      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
 
      proxy_pass http://127.0.0.1:4000;
      }
}

Activation site

ln -s /etc/nginx/sites-available/xoyize.xyz /etc/nginx/sites-enabled/

Vérification

nginx -t

Redémarrer le serveur nginx

systemctl restart nginx