Afficher/cacher Sommaire
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
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
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
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
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
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 #
#HostKey /etc/ssh/ssh_host_ed25519_key
#PubkeyAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
Modifier
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 :
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
{
"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
sudo nano /etc/hosts
# 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
sudo nano /etc/hostname
luxdeb
Valider et vérifier
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
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
sudo nano /home/backupuser/rsync-wrapper.sh
Contenu du script
#!/bin/sh
date > /home/backupuser/backuplog
#echo $@ >> /home/backupuser/backuplog
/usr/bin/sudo /usr/bin/rsync "$@";
Droits sur le fichier
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
sudo -s
Ajouter ligne suivante en fin de fichier,exécution en mode root de rsync
echo "backupuser ALL=NOPASSWD: /usr/bin/rsync" >> /etc/sudoers
exit
systemd/journal
Ajout de l’utilisateur courant au groupe systemd-journal
sudo gpasswd -a $USER systemd-journal
Accès utilisateur aux fichiers log
sudo gpasswd -a $USER adm
Après déconnexion puis reconnexion , l’utilisateur a accès au journal:
$ journalctl
Pour avoir les lignes NON TRONQUEES
$ export SYSTEMD_LESS=FRXMK journalctl
Pour un mode permanent ,modifier ~/.bashrc
$ echo "export SYSTEMD_LESS=FRXMK journalctl" >> ~/.bashrc
DNS/OVH
Modifier les DNS xoyize.xyz sur OVH
$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
#!/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
#
# 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”
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
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
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
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
#!/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
/etc/openvpn/server.conf
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
/etc/sysctl.conf
# 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
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
sudo nano /etc/ip4tables.rules # modifier le port SSH si nécessaire
*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
sudo iptables-restore < /etc/ip4tables.rules
Persistance des règles
sudo apt install iptables-persistent #répondre yes/oui 2 fois
Si les règles ont changé ,il faut relancer
sudo dpkg-reconfigure iptables-persistent
Relancer le service
sudo systemctl restart openvpn.service
Rotation des fichiers log
Rotation des fichiers log openvpn
sudo nano /etc/logrotate.d/openvpn
/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.