Post

KVM Debian Stretch (Luxembourg)

serveur KVM Debian Stretch situé au Luxembourg

KVM Debian Stretch (Luxembourg)

xoyize.xyz

KVM serveur luxembourg

Package: VPS 512 [512 MB Memory, 1 CPU, 20 GB Storage, 500 GB Bandwidth]
Selected Location: Luxembourg
Hostname : luxdeb
Debian Stretch 64 minimal

Première connexion SSH

Via SSH
ssh root@94.242.202.202
Vérifier et ajouter sinon
nano /etc/apt/sources.list

1
2
deb http://security.debian.org/debian-security stretch/updates main
deb-src http://security.debian.org/debian-security stretch/updates main

Màj
apt update && apt upgrade

Création utilisateur

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

1
2
apt install sudo
echo "xoy     ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Déconnexion puis connexion ssh en mode utilisateur
ssh xoy@94.242.202.202

Locales

Locales : fr_FR.UTF-8
sudo dpkg-reconfigure locales

1
2
3
4
Generating locales (this might take a while)...
  en_US.UTF-8... done
  fr_FR.UTF-8... done
Generation complete.

TimeZone

Europe/Paris
sudo dpkg-reconfigure tzdata

1
2
3
Current default time zone: 'Europe/Paris'
Local time is now:      Sun Aug 13 15:40:56 CEST 2017.
Universal Time is now:  Sun Aug 13 13:40:56 UTC 2017.

SSH via clé

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

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

1
2
3
pwd  #pour vérifier que l'on est sous /home/$USER
mkdir .ssh
cat /home/$USER/kvm-luxdeb.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-luxdeb.pub
Modifier la configuration serveur SSH
sudo -s # passage en superutilisateur
nano /etc/ssh/sshd_config

Vérifier les options par défaut qui sont commentées par un #

1
2
3
4
#HostKey /etc/ssh/ssh_host_ed25519_key
#PubkeyAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2

Modifier

1
2
3
Port = 55024
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 :

1
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 55024 -i ~/.ssh/kvm-luxdeb xoy@94.242.202.202

Outils

Installer rsync, jq, figlet, curl et tmux
sudo apt install rsync curl tmux jq figlet

ipinfo.io

curl ipinfo.io

1
2
3
4
5
6
7
8
9
{
  "ip": "94.242.202.202",
  "hostname": "ip-static-94-242-202-202.server.lu",
  "city": "",
  "region": "",
  "country": "LU",
  "loc": "49.7500,6.1667",
  "org": "AS5577 root SA"
}

Nom d’hôte et non de domaine

1
sudo nano /etc/hosts
1
2
3
4
5
# Generated by SolusVM
127.0.0.1       localhost localhost.localdomain
::1     localhost localhost.localdomain
94.242.202.202  xoyize.xyz luxdeb
2a01:608:ffff:a017::658d:3b64   xoyize.xyz luxdeb
1
2
sudo nano /etc/hostname
         luxdeb

Valider et vérifier

1
2
3
4
5
sudo hostname vpna
hostname
	  vpna
hostname -f
	xoyize.xyz

Sauvegarde via shuttle

Ajout utilisateur backupuser qui ne peut exécuter que rsync et de la clé publique du “serveur de sauvegarde”
Création utilisateur backup
sudo useradd backupuser -c "limited backup user" -m -u 4210
Ajout clé publique ssh dans le fichier authorized_keys du nouvel utilisateur

1
2
sudo mkdir /home/backupuser/.ssh
sudo nano /home/backupuser/.ssh/authorized_keys    #coller le contenu /home/backupuser/.ssh/id_rsa.pub copié sur terminal du serveur shuttle (yanspm.com)

Création script bash rsync-wrapper.sh

1
sudo nano /home/backupuser/rsync-wrapper.sh

Contenu du script

1
2
3
4
5
#!/bin/sh
 
date > /home/backupuser/backuplog
#echo $@ >> /home/backupuser/backuplog
/usr/bin/sudo /usr/bin/rsync "$@";

Droits sur le fichier

1
2
sudo chown backupuser:backupuser /home/backupuser/rsync-wrapper.sh
sudo chmod 755 /home/backupuser/rsync-wrapper.sh

Edition fichier sudoers pour un accès root à l’exécution de rsync

1
sudo -s

Ajouter ligne suivante en fin de fichier,exécution en mode root de rsync

1
2
echo "backupuser ALL=NOPASSWD: /usr/bin/rsync" >> /etc/sudoers
exit

systemd/journal

Ajout de l’utilisateur courant au groupe systemd-journal

1
sudo gpasswd -a $USER systemd-journal

Accès utilisateur aux fichiers log

1
sudo gpasswd -a $USER adm

Après déconnexion puis reconnexion , l’utilisateur a accès au journal:

1
$ journalctl

Pour avoir les lignes NON TRONQUEES

1
$ export SYSTEMD_LESS=FRXMK journalctl

Pour un mode permanent ,modifier ~/.bashrc

1
$ echo "export SYSTEMD_LESS=FRXMK journalctl" >> ~/.bashrc

DNS/OVH

Modifier les DNS xoyize.xyz sur OVH

1
2
3
4
5
6
7
$TTL 3600
@	IN SOA dns106.ovh.net. tech.ovh.net. (2016122302 86400 3600 3600000 300)
                          IN NS     ns106.ovh.net.
                          IN NS     dns106.ovh.net.
                          IN A      94.242.202.202
                          IN AAAA   2a01:608:ffff:a017::658d:3b64
*                         IN CNAME  xoyize.xyz.

Exécution script sur connexion SSH

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/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 "
\e[1;35m  \e[1;37mHostname \e[1;35m= \e[1;32m`hostname`
\e[1;35m  \e[1;37mWired Ip \e[1;35m= \e[1;32m`ip addr show eth0 | grep 'inet\b' | 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;37mUptime \e[1;35m= \e[1;32m`uptime | sed 's/.*up ([^,]*), .*/1/' | sed -e 's/^[ \t]*//'`
\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` of unlimited
\e[1;35m\e[1;37mPublic Ip  \e[1;35m= \e[1;32m`echo $publicip $ville $pays`
\e[0m
"
curl fr.wttr.in/94.242.202.202?0  #prévisions météo sur la journée

Envoi de message (ssmtp)

Pour envoyer des messages
sudo apt install ssmtp
Configuration ,on utilise le serveur yanspm.com
sudo nano /etc/ssmtp/ssmtp.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster@yanspm.com

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=yanspm.com:465

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=xoyize.xyz

# Use SSL/TLS before starting negotiation
UseTLS=Yes

# Username/Password
AuthUser=yanspm@yanspm.com
AuthPass=M4cn37vA
AuthMethod=LOGIN

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

Le mot de passe est stocké sous forme de texte clair dans /etc/ssmtp/ssmtp.conf, il faut sécuriser le fichier.
Si les utilisateurs ont un accès non privilégié à votre système, ils ne peuvent pas lire le fichier et voir votre mot de passe de messagerie, tout en leur laissant envoyer des e-mails
Si votre compte d’utilisateur est compromis, ne ne peut pas lire le fichier ssmtp.conf sauf si accès au compte “root”

1
2
3
4
5
sudo groupadd ssmtp				# Création groupe ssmtp
sudo chown :ssmtp /etc/ssmtp/ssmtp.conf		# Groupe ssmtp est propriétaire du fichier ssmtp.conf
sudo chown :ssmtp /usr/sbin/ssmtp		# Groupe ssmtp est propriétaire du binaire ssmtp
sudo chmod 640 /etc/ssmtp/ssmtp.conf		# Accès réservé UNIQUEMENT à root et groupe ssmtp
sudo chmod g+s /usr/sbin/ssmtp			# SGID sur le binaire ssmtp

outils de messagerie
sudo apt install mailutils
On test un envoie de mail
echo "Un mail de test" | mail -s "test envoi" destinataire@domaine.tld

Mises à jour de sécurité debian

Toutes les instructions suivantes sont exécutées après passage en mode su ou sudo
L’automatisation sera pris en charge par l’outil cron-apt. Cron-apt permet de vérifier à intervalle régulier, via le crontab , si des mises à jours sont disponibles et va les installer.
apt install cron-apt
Création du fichier security.sources.list utilisé par cron-apt et qui ne contiendra que le(s) dépôt(s) de sécurité Debian.
grep security /etc/apt/sources.list > /etc/apt/security.sources.list
On édite le fichier de configuration de cron-apt /etc/cron-apt/config

1
2
3
4
APTCOMMAND=/usr/bin/apt
OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list"
MAILTO="yanspm@yanspm.com"
MAILON="always"

Pour déclencher la mise à jour automatique après téléchargement , supprimer option -d dans le fichier /etc/cron-apt/action.d/3-download
dist-upgrade -y -o APT::Get::Show-Upgraded=true
Test immédiat cron-apt
Patienter quelques minutes!
Par défaut l’exécution est programmée à 4h00 chaque jour, pour spécifier un créneau horaire modifier le fichier /etc/cron.d/cron-apt.


Clé Diffie-Hellman

Génération puis envoi de la clé depuis poste distant

1
2
openssl dhparam -out ~/Private/dh/diffie-hellman-4096.pem -outform PEM -2 4096
scp -P 48022 -i /home/yannick/.ssh/kvm-luxdeb ~/Private/dh/diffie-hellman-4096.pem xoy@94.242.202.202:/tmp/dh4096.pem

Mise en place sur le serveur

1
2
3
  sudo mv /tmp/dh4096.pem /etc/ssl/private
  sudo chown root. /etc/ssl/private/dh4096.pem
  sudo chmod 640 /etc/ssl/private/dh4096.pem

Motd

10-sysinfo avec contenu de 11-sysinfo car noyau kernel > 3.0.0
Météo /etc/update-motd.d/98-meteo

1
2
#!/bin/bash
/usr/local/bin/ansiweather-fr.sh -l Reykjavik,IS -u metric -s true

Serveur OpenVPN

Installation serveur OpenVPN sur VPS Debian Jessie
Le client Iceland-vpn.ovpn

Configuration server.conf

Fichiers de configuration serveur OpenVpn

1
/etc/openvpn/server.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
port 1194
proto udp
dev tun
user nobody
group nogroup
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
push "redirect-gateway def1 bypass-dhcp" 
crl-verify crl.pem
ca ca.crt
cert server.crt
key server.key
tls-auth tls-auth.key 0
dh dh.pem
auth SHA256
cipher AES-128-CBC
tls-server
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
status openvpn.log
verb 3
1
/etc/sysctl.conf 
1
2
3
4
5
6
7
8
9
# enable packet forwarding for IPv4
net.ipv4.ip_forward=1
# enable packet forwarding for IPv6
net.ipv6.conf.all.forwarding=1

#net.ipv6.conf.all.proxy_ndp = 1
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv6.conf.all.accept_redirects = 0

Validation immédiate avant reboot

1
2
sysctl net.ipv4.ip_forward=1
sysctl net.ipv6.conf.all.forwarding=1

Règles iptables

Création d’un fichier des règles ipv4

1
sudo nano /etc/ip4tables.rules  # modifier le port SSH si nécessaire
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
*filter

# Allow all loopback (lo) traffic and reject traffic
# to localhost that does not originate from lo.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
-A OUTPUT -o lo -j ACCEPT

# Allow ping and ICMP error returns.
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT

# Allow SSH.
-A INPUT -i eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 48022 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state ESTABLISHED --sport 48022 -j ACCEPT

# Allow UDP traffic on port 1194.
-A INPUT -i eth0 -p udp -m state --state NEW,ESTABLISHED --dport 1194 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state ESTABLISHED --sport 1194 -j ACCEPT

# Allow DNS resolution and limited HTTP/S on eth0.
# Necessary for updating the server and keeping time.
-A INPUT -i eth0 -p udp -m state --state ESTABLISHED --sport 53 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 53 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT

-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 80 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 443 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 443 -j ACCEPT

# Allow traffic on the TUN interface.
-A INPUT -i tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT

# Allow forwarding traffic only from the VPN.
-A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Log any packets which don't fit the rules above...
# (optional but useful)
-A INPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 4
-A FORWARD -m limit --limit 3/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 4
-A OUTPUT -m limit --limit 3/min -j LOG --log-prefix "iptables_OUTPUT_denied: " --log-level 4

# then reject them.
-A INPUT -j REJECT
-A FORWARD -j REJECT
-A OUTPUT -j REJECT

COMMIT

Importer les nouvelles règles

1
sudo iptables-restore < /etc/ip4tables.rules

Persistance des règles

1
sudo apt install iptables-persistent  #répondre yes/oui 2 fois

Si les règles ont changé ,il faut relancer

1
sudo dpkg-reconfigure iptables-persistent

Relancer le service

1
sudo systemctl restart openvpn.service

Rotation des fichiers log

Rotation des fichiers log openvpn

1
sudo nano /etc/logrotate.d/openvpn
1
2
3
4
5
6
/var/log/openvpn.log {
        rotate 6
        monthly
        compress
        missingok
}
  • surveille le fichier xxxx.log et génère une rotation une fois par mois - c’est l’ “intervalle de rotation”.
  • ‘rotate 6’ signifie qu’à chaque intervalle, on conserve 6 semaines de journalisation.
  • Les fichiers de logs sont compressés au format gzip en spécifiant ‘compress’
  • ‘missingok’ permet au processus de ne pas s’arrêter à chaque erreur et de poursuivre avec le fichier de log suivant.
Cet article est sous licence CC BY 4.0 par l'auteur.