Afficher/cacher Sommaire
KVM Debian Stretch serveur (nginx+php7)
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
- 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 rsync, jq, figlet, curl et tmux
apt install rsync curl 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.
TimeZone
Europe/Paris
dpkg-reconfigure tzdata
Current default time zone: 'Europe/Paris'
Local time is now: Sun Dec 3 16:25:57 CET 2017.
Universal Time is now: Sun Dec 3 15:25:57 UTC 2017.
Création utilisateur
Utilisateur stret
useradd -m -d /home/stret/ -s /bin/bash stret
Mot de passe stret
passwd stret
Visudo pour les accès root via utilisateur stret
apt install sudo
echo "stret ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
Déconnexion puis connexion ssh en mode utilisateur
ssh stret@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 stret@93.115.96.97:/home/stret/
sur le serveur KVM
On se connecte
ssh stret@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 = 55026
PermitRootLogin no
PasswordAuthentication no
UsePAM 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-get install libpam-systemd #Installer par défaut sur debian stretch
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 -p 55026 -i ~/.ssh/kvm-vps-26381 stret@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
Nginx PHP7
Définition des chemins et fichiers de configuration nginx
/etc/nginx/conf.d/xoyize.xyz.conf configuration de base du domaine
Création dossier /etc/nginx/conf.d/xoyize.xyz.d/ pour les fichiers de configuration supplémentaires
sudo mkdir -p /etc/nginx/conf.d/xoyize.xyz.d
Déplacer et renommer le fichier de configuration par défaut
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/xoyize.xyz.conf
Modifier le fichier
sudo nano /etc/nginx/conf.d/xoyize.xyz.conf
server {
listen 80;
listen [::]:80;
root /var/www/ ;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock; # PHP7.0
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
include conf.d/xoyize.xyz.d/*.conf;
access_log /var/log/nginx/xoyize.xyz.log;
error_log /var/log/nginx/xoyize.xyz.log;
}
Recharger
sudo systemctl reload nginx
Certificats SSL letsencrypt (acme)
Certificats
[Sun Dec 3 17:03:33 CET 2017] Your cert is in /root/.acme.sh/xoyize.xyz/xoyize.xyz.cer
[Sun Dec 3 17:03:33 CET 2017] Your cert key is in /root/.acme.sh/xoyize.xyz/xoyize.xyz.key
[Sun Dec 3 17:03:33 CET 2017] The intermediate CA cert is in /root/.acme.sh/xoyize.xyz/ca.cer
[Sun Dec 3 17:03:33 CET 2017] And the full chain certs is there: /root/.acme.sh/xoyize.xyz/fullchain.cer
Création des liens sur /etc/ssl/private pour nginx
ln -s /root/.acme.sh/xoyize.xyz/fullchain.cer /etc/ssl/private/xoyize.xyz-fullchain.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-chain.pem
ln -s /root/.acme.sh/xoyize.xyz/ca.cer /etc/ssl/private/xoyize.xyz-cert.pem
Mise à jour automatique (généré à l’installation acme)
crontab -e
8 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
Nginx + SSL + header + diffie-hellmann
Structure serveur nginx
/etc/nginx/
├── conf.d/
│ ├── xoyize.xyz.conf
│ └── xoyize.xyz.d/
├── dh_param
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── header_params
├── koi-utf
├── koi-win
├── mime.types
├── mime.types.default
├── nginx.conf
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── ssl_params
├── uwsgi_params
├── uwsgi_params.default
└── win-utf
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/xoyize.xyz-fullchain.pem;
ssl_certificate_key /etc/ssl/private/xoyize.xyz-key.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!aNULL:!eNULL:!LOW:!EXP:!RC4:!3DES:+HIGH:+MEDIUM;
Entêtes
Le fichier de configuration
sudo nano /etc/nginx/header_params
#HSTS est un dispositif de sécurité par lequel un site web peut déclarer aux navigateurs qu’ils doivent communiquer avec lui en utilisant exclusivement le protocole HTTPS, au lieu du HTTP
add_header Strict-Transport-Security "max-age=31536000;";
#se protéger contre le détournement de clic (clickjacking)
add_header X-Frame-Options "SAMEORIGIN" always;
#faire une vérification stricte des types Mime. Elle n’accepte qu’une seule directive : nosniff.
add_header X-Content-Type-Options nosniff;
#activer les filtres anti-xss incorporés dans certains navigateurs.
add_header X-XSS-Protection "1; mode=block";
#CSP permet d’autoriser seulement les domaines déclarés à exécuter du script JavaScript, une feuille de style css, etc.
# Content-Security-Policy : https://openweb.eu.org/articles/content-security-policy
add_header Content-Security-Policy "default-src 'self'";
# Désactiver les références pour les navigateurs qui ne prennent pas en charge strict-origin-when-cross-origin
# Referrer-Policy : https://scotthelme.co.uk/a-new-security-header-referrer-policy/
# Utilise strict-origin-when-cross-origin pour les navigateurs qui le font
add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin";
Diffie-Hellmann
Générer une clé Diffie-Hellmann
En cryptographie, l’échange de clés Diffie-Hellman, du nom de ses auteurs Whitfield Diffie et Martin Hellman, est une méthode par laquelle deux agents nommés conventionnellement A etB peuvent se mettre d’accord sur un nombre (qu’ils peuvent utiliser comme clé pour chiffrer la conversation suivante) sans qu’un troisième agent appelé D puisse découvrir le nombre, même en ayant écouté tous leurs échanges.
ATTENTION : Génération clé Diffie-Hellmann très très longue en temps , 30 minutes minimum…
Générer une clé
openssl dhparam -out /etc/ssl/private/dh4096.pem -outform PEM -2 4096
Déplacer la clé dans le répertoire
sudo mv dh4096.pem /etc/ssl/private/
Droits pour root
sudo chmod 600 /etc/ssl/private/dh4096.pem
Le fichier de configuration
sudo nano /etc/nginx/dh_param
# Uncomment the following directive after DH generation
# > openssl dhparam -out /etc/ssl/private/dh4096.pem -outform PEM -2 4096
ssl_dhparam /etc/ssl/private/dh4096.pem;
Configuration de base avec SSL et sécurité + letsencrypt (renouvellement)
sudo nano /etc/nginx/conf.d/xoyize.xyz.conf
server {
listen 80;
listen [::]:80;
## redirect http to https ##
return 301 https://$http_host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name xoyize.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;
include dh_param;
root /var/www/ ;
index index.php index.html index.htm;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock; # PHP7.0
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
include conf.d/xoyize.xyz.d/*.conf;
access_log /var/log/nginx/xoyize.xyz-access.log;
error_log /var/log/nginx/xoyize.xyz-error.log;
}
Vérifier
sudo nginx -t
Relancer
sudo systemctl restart nginx
Test redirection http/https avec curl depuis un poste distant
$ curl -I xoyize.xyz
HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.5
Date: Wed, 04 Oct 2017 06:46:26 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: https://xoyize.xyz/
Tester le lien https://xoyize.xyz
Vérification headers https://securityheaders.io
Vérification complète https://observatory.mozilla.org/analyze.html?host=xoyize.xyz
Parefeu iptables
Créer un script pour mettre en place des règles de base.
sudo nano parefeu
#!/bin/sh
# Vider les tables actuelles
iptables -t filter -F
# Vider les règles personnelles
iptables -t filter -X
# Interdire toute connexion entrante et sortante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
# ---
# Ne pas casser les connexions etablies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
# ---
# SSH In/Out
iptables -t filter -A INPUT -p tcp --dport 55026 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 55026 -j ACCEPT
# DNS In/Out
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
# HTTP/HTTPS In/Out
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
fichier exécutable :
sudo chmod +x parefeu
Vous pourrez le tester en l’exécutant directement en ligne de commande. Assurez-vous d’avoir toujours le contrôle de votre machine (reconnectez-vous en SSH, vérifiez la disponibilité des services web, ftp, mail…).
sudo -s
./parefeu
En cas d’erreur, redémarrez le serveur, les règles seront oubliées et vous permettront de reprendre la main.
En revanche, si les tests s’avèrent concluants, ajoutez le script au démarrage pour que celui-ci protège le serveur dès le boot.
Après avoir exécuté le script précédent,vérifier la présence des règles
sudo -s
iptables -L
Lancement du parefeu au démarrage
apt install iptables-persistent
Faut-il enregistrer les règles IPv4 actuelles ? OUI
Faut-il enregistrer les règles IPv6 actuelles ? NON
Les tables sont enregistrés sous /etc/iptables/ , rules.v4 pour IPv4 et rules.v6 pour IPv6
Sauvegarde/Restauration manuelle des régles iptables
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
Les règles /etc/iptables/rules.v4
# Generated by iptables-save v1.6.0 on Tue Oct 3 21:29:56 2017
*filter
:INPUT DROP [29:1537]
:FORWARD DROP [0:0]
:OUTPUT DROP [1:120]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 55026 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 55026 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
COMMIT
# Completed on Tue Oct 3 21:29:56 2017
Droits sur le dossier root web /var/www
Donner les droits à l’utilisateur de modifier le dossier /var/www
sudo chown root:www-data /var/www
sudo chmod 775 /var/www
sudo usermod -aG www-data $USER
Sites statiques
https://staticsitegenerators.net/
https://github.com/dauxio/daux.io
https://3hg.fr/swx/
Debian XFCE (via vnc over ssh)
Désactivation php et nginx
stret@xoyize:~$ sudo systemctl stop nginx
stret@xoyize:~$ sudo systemctl disable nginx
stret@xoyize:~$ sudo systemctl stop php7.0-fpm
stret@xoyize:~$ sudo systemctl disable php7.0-fpm
How To Set Up VNC Server on Debian 8
Sécuriser une connexion VNC via SSH
On dispose d’un serveur debian joignable par connexion SSH, on installe un bureau XFCE et un serveur VNC
Installer environnement bureau XFCE
Installer le package TightVNC disponible dans le dépôt officiel d’debian .
sudo apt install xfce4 tightvncserver
# xfce4-goodies
Pour avoir xfce en français ajouter les 3 lignes suivantes au fichier /etc/profile
export LANGUAGE=fr_FR.utf8
export LANG=fr_FR.utf8
export LC_ALL=fr_FR.utf8
La prise en compte sera effective après redémarrage
Serveur vnc
Installation
sudo apt install tightvncserver
Lancer le serveur pour créer le mot de passe
vncserver
...
New 'X' desktop is xoyize.xyz:1
Creating default startup script /home/stret//.vnc/xstartup
Starting applications specified in /home/stret//.vnc/xstartup
Log file is /home/stret//.vnc/xoyize.xyz:1.log
Tester le bureau Vnc depuis un poste distant
Dans cette étape, nous testerons la connectivité de votre serveur VNC.
Tout d’abord, nous devons créer une connexion SSH sur votre ordinateur local qui remplace de manière sécurisée la connexion localhost pour VNC.
Vous pouvez le faire via le terminal sous Linux ou OS X avec la commande suivante.
ssh -l utilisateur -L 55444:localhost:5901 192.168.1.10
sans clé SSH
Ensuite, vous pouvez maintenant utiliser un client VNC pour tenter une connexion au serveur VNC sur localhost:55444. Vous serez invité à vous authentifier.
vncviewer localhost:55444
- c’est l’option L qui permet de créer le tunnel ssh
- 55444 sera le nouveau port à utiliser sur sa machine locale
- localhost dans ce cas-ci est la machine à atteindre à partir du serveur distant 192.168.1.10
- 5901 est le port de la machine à atteindre pour la connexion VNC (écran :1), dans ce cas on travail sur localhost car c’est la même machine
- 192.168.1.10 est l’IP de la machine distante ayant sshd (elle pourrait être différente de la machine à atteindre dans un autre cas)
Cas du serveur avec clé authentification SSH
ssh -p 55026 -i ~/.ssh/kvm-vps-26381 -L 55022:localhost:5901 -N -f -l stret 93.115.96.97
Depuis le poste qui a ouvert la session SSH pour le serveur vnc
vncviewer localhost:55022
Créer un service vnc pour lancement automatique
Ensuite, nous configurons le serveur VNC en tant que service système.
Cela permettra de démarrer, arrêter et redémarrer le cas échéant, comme tout autre service système.
Créer un script
sudo nano /usr/local/bin/myvncserver
#!/bin/bash
PATH="$PATH:/usr/bin/"
DISPLAY="1"
DEPTH="16"
GEOMETRY="1024x768"
OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY} -localhost"
case "$1" in
start)
/usr/bin/vncserver ${OPTIONS}
;;
stop)
/usr/bin/vncserver -kill :${DISPLAY}
;;
restart)
$0 stop
$0 start
;;
esac
exit 0
Sauver le script par CTRL+o et CTRL+x et le rendre exécutable
sudo chmod +x /usr/local/bin/myvncserver
Tout d’abord, créez un nouveau fichier d’unité appelé /etc/systemd/system/vncserver@.service en utilisant votre éditeur de texte préféré:
sudo nano /etc/systemd/system/myvncserver.service
Copiez et collez le suivant,adapterUser.
[Unit]
Description=Manage VNC Server on this droplet
[Service]
Type=forking
ExecStart=/usr/local/bin/myvncserver start
ExecStop=/usr/local/bin/myvncserver stop
ExecReload=/usr/local/bin/myvncserver restart
User=stret
[Install]
WantedBy=multi-user.target
Enregistrez et fermez le fichier.
Ensuite, rendez le système au courant du nouveau fichier système.
sudo systemctl daemon-reload
Activez le fichier système
sudo systemctl enable myvncserver.service
Arrêtez l’instance actuelle du serveur VNC si elle est toujours en cours d’exécution.
vncserver -kill :1
Ensuite, démarrez-le
sudo systemctl start myvncserver
Vous pouvez vérifier l’état avec cette commande:
sudo systemctl status myvncserver
Vous disposez d’un serveur VNC sécurisé sur votre debian Server.
Maintenant, vous pourrez gérer vos fichiers, vos logiciels et vos paramètres avec une interface graphique facile à utiliser et familière.
Connexion/Déconnexion vnc depuis un poste client distant
Ouvrir une fenêtre “terminal”
Connexion
Etablir le tunnel ssh sécurisé
ssh -p 55026 -i ~/.ssh/kvm-vps-26381 -L 55022:localhost:5901 -N -f -l stret 93.115.96.97
Lancer la connexion VNC
vncviewer localhost:55020
Déconnexion
Après fermeture de la session vnc, il faut supprimer le tunnel ssh
kill $(pidof -s ssh)