VPS avec Linux
Mes premiers pas avec un serveur privé virtuel sous DebianSécuriser le VPS
Se connecter :ssh root@ip_de_votre_vps
Mette-à-jour le systeme :
apt update && apt upgrade
Changer le mot de passe de l’utilisateur root :
passwd root
Créer un nouveau utilisateur :
adduser NomUtilisateur
Désactiver l’accès au serveur via l’utilisateur root :
vi /etc/ssh/sshd_config
Dans la ligne PermitRootLogin
remplacer yes
par no
.
Redémarrer le service SSH :
/etc/init.d/ssh restart
Pour les taches nécessitants les droits root utiliser :
su root
Installer Fail2ban :
apt install fail2ban
SSH
1. Modifier le port d’écoute du SSH
=> Soit avec la méthode "manuelle" :
vi /etc/ssh/sshd_config
Remplacer Port 22
par Port NouveauPort
.
=> Soit en lançant :
sudo sed -i 's/Port 22/Port 23514/' /etc/ssh/sshd_config
Redémarrer le service SSH :
/etc/init.d/ssh restart
Maintenent pour se connecter il faut entrer :
ssh root@ip_de_votre_vps -p NouveauPort
2. Authentification par clé SSH
Générer des clés SSH :
ssh-keygen
La commande ssh-keyen
va génerer:
- Une clé publique : elle sera exportée sur le serveur sur lequel on souhaite se connecter.
- Une clé privée : Pour prouver son identité au serveur.
- Une passphrase : Pour sécuriser la clé privée.
-
id_rsa
: contient la clé privée. -
id_rsa.pub
: contient la clé publique.
Copier de la clé publique sur votre serveur distant :
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 12065 user@host
(-p
si le port SSH a été modifier)
La commande ssh-copy-id
va ajouter la clé publique dans le fichier authorized_keys du serveur distant (ce fichier contient toutes les clés publiques).
Dorénavant, pour ce connecter, il suffit de taper :
ssh -p 12065 user@host
Simplifier encore plus la connexion :
Avec le fichier ~/.ssh/config
host monvps User moi hostname monsite.com Port 23651 IdentityFile ~/.ssh/id_rsa
Pour se connecter, il suffit d’entrer :
ssh monvps
IPTABLES et IPSET
Bloquer/débloquer une IP avec iptables
Lister les règles du firewall iptables
:
iptables -L
Bloquer une IP :
iptables -I INPUT -s 212.237.41.38 -j DROP
Débloquer une IP :
iptables -D INPUT -s 212.237.41.38 -j DROP
Créer un liste d’IPs avec ipset
Créer la liste :
ipset create blacklist hash:ip
Ajouter des ips (à bloquer par exemple) :
ipset add blacklist 212.237.41.38 ipset add blacklist 1.22.26.83
Pour afficher la liste :
iplist list
Pour ajouter cette -black- liste au firewall :
iptables -I INPUT -m set --match-set blacklist src -j DROP
Installer et configurer Nginx
Installation :
apt install nginx
Les fichiers de configuration :
- Le fichier de configuration de Nginx est : /etc/nginx/nginx.conf
- Les liens symboliques des sites actifs se trouve dans le répertoire : /etc/nginx/sites-enabled
- Les fichiers de configuration des sites se trouve dans /etc/nginx/sites-available
Création d’un simple site statique :
Créer un fichier de configuration dans etc/nginx/sites-available :
vi /etc/nginx/sites-available/mon_site
Editer ce fichier :
server { listen 80; server_name domaine_ou_ip; root /var/www/mon_site; index index.html index.php; location / { try_files $uri $uri/ =404; } }
- listen : le port d’écoute.
- server_name : le nom de domaine ou l’IP.
- root : le répertoire où se trouvent vos fichiers.
- index : l’ordre de de recherche de fichiers.
- location : actions à effectuer lorsqu’un chemain est appelé.
Activer le site en créant un lien symbolique vers ce fichier dans le répertoire /etc/nginx/sites-available :
ln -s /etc/nginx/sites-available/mon_site /etc/nginx/sites-enabled
Supprimer la configuration par défaut :
sh sudo rm /etc/nginx/sites-enabled/default
Recharger la configuration de Nginx :
nginx -s reload
Cas particulier : /var/www/mon_site/public_html
Dans le cas où les fichiers ne se trouvent pas dans le répertoire racine du site, mais dans un sous-répertoire et on veut quant même y accéder par le nom du répertoire racine, on utilise un alias.server { root /var/www/mon_site/; location / { return 410; # Default root of site won't exist. } location /mon_site/ { alias /var/www/mon_site/public_html/; } }
Par exemple, à la demande de /mon_site/contact.html, c’est le fichier /var/www/mon_site/public_html/contact.html qui sera envoyé.
Mais il est mieux d’utiliser la directive root
, en mettant les fichiers directement dans /var/www/mon_site (ou en créant un lien symbolique?).
Petite astuce pour faire ça :
Séparer le Chemin complet : /var/www/mon_site en :
Dernier chemin : /mon_site et Premier chemin : /var/www , ça donnera :
donc :
location{ root ; }
location /mon_site/ { root /var/www; }
Hébérger un autre site (domaine) sur le même serveur
Créer le sous-répertoire où sera hébergé le site :
mkdir /srv/www/mon_autre_site.com
Créer un nouveau server block (sur Nginx ou virtual host sur Apache) :
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mon_autre_site.com
Éditer le fichier créé pour ressembler à ça :
server { listen 80; listen [::]:80; server_name mon_autre_site.com; root /srv/www/mon_autre_site.com; index index.html; location / { try_files $uri $uri/ =404; } }
Activer le site :
ln -s /etc/nginx/sites-available/mon_autre_site.com /etc/nginx/sites-enabled
Manipulation des fichiers
SCP
Depuis la machine locale :Envoyer un fichier vers le serveur
scp -P 8452 /chemain/du/fichier.txt yourUsername@yourRemoteserver:/destination/
Télécharger un fichier depuis le serveur
scp -P 8452 yourUsername@yourRemoteserver:/chemain/du/fichier.txt /destination/Où
-P
pour désigner le port du ssh (s’il a été modifié).
Si vous avez configuré le SSH pour qu’il puisse se connecter automatiquement (via les clés d’authentification et le fichier ~/.ssh/config …), il suffit simplement de taper :
scp monvps:/chemain/du/fichier.txt /destination/
Pour télécharger ou envoyer un dossier entier, il suffit d’ajouter -r
pour recursive
.
scp -r monvps:/chemain/du/dossier /destination/
DU
du
(Disk Usage
) permet d’obtenir la taille d’un fichier ou d’un répertoire.
du -sh nom_fichier_ou_repertoire
-s
: summmarise-h
: human-readable
RSYNC
Pour sauvegarder (synchroniser) un dossier vers un serveur distant :
rsync -e "ssh" -rtuz --del dossier/a/sauver/ monvps:/chemin/du/backup/
-
-e "ssh"
: Utiliser un transfert ssh. -
-r
: Récursif. -
-t
: Préserve la date de modification des fichiers. -
-z
: Compresse les données lors du transfert. -
–del
: Supprime les documents ayant disparus dans le dossier source. -
-a
: récursif + conserve permissions et propriétaire (si root). -
-u
: ne pas changer les fichiers plus récents dans la destination. -
-v
: verbeux (affiche les fichiers et dossiers affectés).
Et pour un dossier du serveur vers un dossier local :
rsync -e "ssh" -rtuz --del monvps:/chemin/du/dossier/ /chemin/du/backup/Dans tout les cas toujours mettre un
/
à la fin.
HTTPS avec Let’s Encrypt
Installer Certbot (pour le couple Debien Stretch/nginx)
Certbot
est nom du client Let’s Encrypt. Premièrement il faut activer le Backport de Debian en ajoutant cette ligne dans le fichier /etc/apt/sources.list :
deb http://ftp.debian.org/debian stretch-backports mainpuis lancer un
apt-get update
.
Maintenant on peut l’installer depuis le Backport :
sudo apt-get install python-certbot-nginx -t stretch-backports
Pour créer les certifications, la méthode la plus facile (et la plus automatisée) est de lancer cette commande :
sudo certbot --authenticator webroot --installer nginxqui va proposer aussi de gérer les re-directions http/https.
Pour plus de détails : https://certbot.eff.org/lets-encrypt/debianstretch-nginx
Installation de Searx (testé sur Debian 9)
Searx
Installer les dépendances :
sudo apt-get install git build-essential libxslt-dev \ python-dev python-virtualenv python-babel \ zlib1g-dev libffi-dev libssl-dev
Installer de Searx
cd /usr/local sudo git clone https://github.com/asciimoo/searx.git sudo useradd searx -d /usr/local/searx sudo chown searx:searx -R /usr/local/searx
Installer les dépendances python dans Virtualenv
sudo -u searx -i cd /usr/local/searx virtualenv searx-ve . ./searx-ve/bin/activate ./manage.sh update_packages
Modifier la phrase secrète du fichier settings.yml :
sed -i -e "s/ultrasecretkey/`openssl rand -hex 16`/g" searx/settings.yml
Lancer Searx :
python searx/webapp.py
Vérifier avec elinks :
elinks http://localhost:8888
Si tout fonctionne correctement, arrêter le serveur (Ctrl+C) et désactivez l’option de debug dans settings.yml :
sed -i -e "s/debug : True/debug : False/g" searx/settings.yml
Pour sortir du Virtualenv et du prompte de l’utilisateur searx il suffit de taper exit
deux fois.
Uwsgi
Installer les packages :
sudo apt-get install uwsgi uwsgi-plugin-python
Créer le fichier de configuration /etc/uwsgi/apps-available/searx.ini avec ce contenu :
[uwsgi] # Quel est l'utilisateur qui fera tourner le code uid = searx gid = searx # Nombre de workers (habituellement, on met le nombre de processeurs de la machine) workers = 1 #parce que je n'ai qu'un seul core # Quels sont les droits sur le socket créé chmod-socket = 666 # Plugin à utiliser et configuration de l'interpréteur single-interpreter = true master = true plugin = python # Module à importer module = searx.webapp # Chemin du virtualenv virtualenv = /usr/local/searx/searx-ve/
Activer l’application de uwsgi et redémarrer le :
cd /etc/uwsgi/apps-enabled sudo ln -s ../apps-available/searx.ini sudo /etc/init.d/uwsgi restart
Nginx
Cette Configuration est pour les hébergements en sous-répertoire (/searx):
Dans le fichier de configuration du site (exemple : /etc/nginx/sites-available/monsite.com), ajoutez ces lignes (à l’intérieur d’un bloc /server{ ) :
location = /searx { rewrite ^ /searx/; } location /searx { try_files $uri @searx; } location @searx { uwsgi_param SCRIPT_NAME /searx; include uwsgi_params; uwsgi_modifier1 30; uwsgi_pass unix:/run/uwsgi/app/searx/socket; }
Éditer l’option base_url
dans settings.yml :
base_url : http://monsite.com/searx/
Redémarrer nginx et uwsgi :
sudo nginx -s reload sudo service uwsgi restart
Mettre à jours
cd /usr/local/searx sudo -u searx -i . ./searx-ve/bin/activate git stash git pull origin master git stash apply ./manage.sh update_packages sudo service uwsgi restart
Références/Crédits:
https://framacloud.org/fr/cultiver-son-jardin/searx.htmlhttps://asciimoo.github.io/searx/dev/install/installation.html
Installer et tester Rocket
Installer Rust
Ceci va installer la dernière version stable de Rust et qui va aussi ajouter automatiquement Rust à votre PATH après votre prochaine connexion :
curl https://sh.rustup.rs -sSf | sh
Si vous voulez commencer à utiliser Rust immédiatement (sans redémarrer) exécutez la commande suivante :
source $HOME/.cargo/env
Verifier le tout avec :
rustc --version
Rust a besoin d’un Linker (celui qui vient avec le compilateur C), donc sous Debien :
sudo apt install build-essential
Installer Rocket
Pour bien fonctionner, Rocket a besoin de la derniere Nightly version de Rust :
rustup default nightlyQui va rendre Rust Nightly la chaîne d’outils par défaut.
Ou si vous préférez utiliser la version nocturne uniquement pour votre projet Rocket; exécutez cette commande dans le repertoire du projet:
rustup override set nightly
Hello, World!
Créer un nouveau projet :
cargo new hello-world --bin cd hello-worldAjouter les dépendances Rocket dans le fichier Cargo.toml (Chercher la dernière version : https://crates.io/crates/rocket)
[dependencies] rocket = "0.3.11" rocket_codegen = "0.3.11"
Modifier src/main.rs :
#![feature(plugin)] #![plugin(rocket_codegen)] extern crate rocket; #[get("/")] fn index() -> &'static str { "Hello, world!" } fn main() { rocket::ignite().mount("/", routes![index]).launch(); }
Compiler et lancer le programme avec :
cargo run
Visiter http://localhost:8000
pour voir l’application en action.
Configurer Nginx pour rediriger les requetes vers Rocket
Dans le fichier de configuration Nginx inserer :server { listen ...; location / { ...; } location /rocket { proxy_pass http://127.0.0.1:8000; } ... }
proxy_pass
va indiquer a Nginx de rediriger les requêtes vers /rocket vers le serveur qui écoute sur http://127.0.0.1:8000 .
Le problème ici c’est que Rocket sert les requêtes de /
et non de /rocket
. Mais, nginx envoie des requêtes à /rocket
(qui va donner des erreurs 404). Pour résoudre ce problème, nous devons réécrire l’URL avec rewrite
server { listen ...; location / { ...; } location /rocket { rewrite ^/blog(.*) /$1 break; proxy_pass http://127.0.0.1:8000; } ... }
Recharger Nginx :
sudo nginx -s reload
et tester dans le navigateur avec http://monsite.com/rocket
Mise-à-jour de mon VPS sous Debian (de Stretch à Buster)
Faire une sauvegarde du système au cas ou...
Passez an mode root (pour éviter tout les sudo à venir!)
Lancez cette commande qui va utiliser rsync
pour faire une copie complète du système (ici de /
vers /mnt
) :
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mntPensez à ajouter le dossier de destination à la liste d'exclusion, pour eviter une boucle infinie de copie.
Pour restaurer cette sauvegarde, utilisez cette même commande mais en inversant source et destination.
Actualiser la version courante (Stretch)
apt update apt upgrade apt full-upgrade apt autoremove
Passer de Debian 9 Stretch à Debian 10 Buster
Ouvrez /etc/apt/source.list dans votre éditeur de texte favoris et remplacer toute les instances de stretch
dans le fichier par buster
.
Pensez à vérifier s'il y a d'autre fichiers source.list dans le dossier /etc/apt/source.list.d, il faut les actualiser eux aussi.
Une fois fini, lancez:
apt update apt upgrade apt full-upgrade apt autoremove
Avant de redémarrer, examinez vos paramètres de connexion SSH : vérifier si dans le fichier /etc/ssh/sshd_config le port d'écoute est bien configuré. Si vous utiliser l'authentification par clé SSH, n'oubliez pas remettre votre clé publique SSH dans le ficher /home/your_user_name/.ssh/authorized_keys (par exemple en remplaçant le nouveau fichier authorized_keys par celui sauvegardé auparavant...)
Redémarrer la machine :
systemctl reboot
Références/crédits:
https://linuxize.com/post/how-to-upgrade-debian-9-stretch-to-debian-10-buster/https://wiki.archlinux.org/index.php/Rsync#Full_system_backup