Aller au contenu principal

Autorisation SSH - Liste blanche parefeu

L'outil autorisation SSH vous permet de placer une adresse IP ou un nom de domaine, de type dyndns, en liste blanche sur le parefeu du serveur pour l'accès SSH sur votre hébergement.

L'outil permet également de placer des exceptions pour l'utilisations de bases de données MongoDB externe (Atlas par exemple).

Cela vous permet donc d'être autonome sur votre accès SSH et cela ne requiert pas le déblocage de la part du support comme ce fût le cas précédemment.

Aperçu de l'outil Autorisation SSH

Outils Autorisation SSH

Vous permet de placer votre adresse IP (ou un domaine) en liste blanche sur le parefeu (pour SSH par exemple)

Offre Unique GrowOffre Unique CloudOffre Unique ProServeurs infogérés

Comment ajouter une adresse IP en liste blanche ?

A cet instant, l'outil permet de placer des exceptions sur :

  • SSH (port 22) sur les connexions entrantes (une machine tierces vers votre hébergement) et sortante (depuis votre hébergement vers une autre machine),
  • MongoDB (ports 27017, 27018, 27019) sur les connexions sortantes, afin que votre hébergement puisse se connecter à une base de données MongoDB externe comme Atlas,
  • Port 8888 sur les connexions sortantes, cela est utilisé par CDiscount pour leurs API

Vous avez le droit de configurer 5 exceptions au total. Une exception pour SSH (connexion entrante + sortante) est compté comme une seule exception.

Pour placer une exception, il faut cliquer sur le bouton Ajouter une exception.

Ensuite, il faut remplir le formulaire avec votre adresse IP (ou DNS) en choisissant le type d'exceptions à mettre en place.

Capture d'écran de l'outil de création d'une exception parefeu
Formulaire d'ajout d'une adresse IP en liste blanche pour SSH

1 Votre adresse IP courante s'affiche dans l'outil.

2 Dans le champs Adresse IP ou DNS, il faut renseigner votre adresse IP ou votre dyndns. Pour les exceptions sur des noms de domaine (ou des noip/dyndns), le domaine doit répondre au niveau DNS et doit pointer vers une adresse IP sinon l'outil retournera une erreur.

3 Dans le champs Port il faut sélectionner le port à ouvrir pour l'exception. Il n'est pas possible de créer des exceptions parefeu sur des ports différents que ceux listés dans l'outil, même en contactant le support.

La seule exception à ce sujet consiste à la mise en liste blanche de services massivement utilisés, comme par exemple GitHub, Bitbucket. La plupart de ces services là devraient déjà être en liste blanche mais si ce n'est pas le cas, vous pouvez contacter le support pour voir s'il est possible de l'ajouter.

La mise en liste blanche peut prendre quelques secondes à être effective. L'outil rend la main lorsque l'exception a bien été prise en compte dans le parefeu du serveur.

Gestion des exceptions existantes

Les exceptions que vous avez déjà configurés sont listés dans un tableau et vous avez la possibilité de les supprimer (afin par exemple d'en ajouter de nouvelles à la place).

Capture d'écran de la liste des exceptions parefeu
Les adresses en liste blanche sont listés dans l'outil

A noter que les adresses IP / domaine placés en liste blanche par le support o2switch avant la création de cet outil (donc avant le 01/12/20) ne sont pas listés dans l'outil. Cependant ces exceptions là existent toujours et n'ont pas été enlevées.

Utilisation dans un contexte CI/CD

Il est possible d'utiliser cet outil en mode API. Cela est particulièrement utile dans un contexte de CI/CD pour placer en liste blanche dynamiquement l'adresse IP d'un runner Github / Gitlab, afin de l'autoriser à se connecter à l'hébergement en SSH.

Documentation de la micro API

L'outil fourni une micro API avec 3 endpoints différents.

Depuis le 02/05/2025, il est possible d'utiliser deux méthodes d'authentification pour cette micro API :

  • avec votre identifiant / mot de passe cPanel. Il s'agit de la méthode historique, qui n'est plus recommandée.
  • avec un Token d'API généré depuis l'outil Créer un jeton d'API de cPanel

Le fonctionnement est légèrement différent en fonction de la méthode d'authentification utilisée.

Nous recommandons la méthode qui utilise un Token d'API cPanel. L'autre méthode est conservée pour ne pas casser des CI/CD existants.

Dans un premier temps, il faut générer un Token d'API pour cPanel avec outil Créer un jeton d'API de cPanel.

En supposant que les variables suivantes sont déclarées à l'avance :

Variables à déclarer à l'avance
SERVER="le-serveur.o2switch.net"
LOGIN="toto1234"
TOKEN='BAJFRPIOE3BMG4AQELTH0BSH6MOIZK23'

Lister les adresses en liste blanche

Lister les adresses IPs déjà en liste blanche
curl -sm 45 -H "Authorization: cpanel $LOGIN:$TOKEN" \
"https://$SERVER:2083/execute/SshWhitelist/list" | jq
Réponse avec les adresses IPs en liste blanche
{
"warnings": null,
"data": {
"count": 1,
"list": [
{
"port": 22,
"address": "52.234.46.118",
"updateDate": "02/05/2025",
"direction": "out"
},
{
"address": "52.234.46.118",
"updateDate": "02/05/2025",
"direction": "in",
"port": 22
}
],
"ip": "10.20.0.20"
},
"errors": null,
"metadata": {},
"status": 1,
"messages": null
}

Ajouter une adresse IP en liste blanche

Ajouter une adresse IP en liste blanche pour SSH
IP="1.2.3.4"
PORT=22
curl -sm 45 -H "Authorization: cpanel $LOGIN:$TOKEN" \
"https://$SERVER:2083/execute/SshWhitelist/add?address=$IP&port=$PORT" | jq
Réponse pour l'ajout d'une IP en liste blanche
{
"errors": null,
"data": null,
"warnings": null,
"messages": [
"L'autorisation a été ajoutée avec succès."
],
"status": 1,
"metadata": {}
}
L'appel d'API est bloquant

L'appel API permettant d'ajouter une adresse IP en liste blanche est pseudo-bloquant.

Concrètement, cela signifie que l'outil attend jusqu’à 35 secondes pour vérifier si l’adresse IP a bien été ajoutée et prise en compte par le pare-feu du serveur.

Si l’ajout est confirmé et que le pare-feu a bien été rechargé avec le nouveau réglage, l’outil répondra : L'autorisation a été ajoutée avec succès.

Si la demande a été correctement transmise, mais qu’au bout de 35 secondes il n’est pas certain que le pare-feu ait pris en compte la modification, l’outil répondra : La modification a été enregistrée mais n'a pas été prise en compte.

Normalement ce dernier cas est très rare et la majorité des appels en liste blanche sont traités dans les ~20 secondes.

Supprimer une adresse IP de la liste blanche

Il faut bien penser à supprimer l'exception sur les directions in et out sinon cela ne décrémente pas le compteur d'exceptions.

Supprimer une adresse IP de la liste blanche
IP="1.2.3.4"
PORT=22
DIR=in
curl -sm 45 -H "Authorization: cpanel $LOGIN:$TOKEN" \
"https://$SERVER:2083/execute/SshWhitelist/remove?address=$IP&port=$PORT&direction=$DIR" | jq

DIR=out
curl -sm 45 -H "Authorization: cpanel $LOGIN:$TOKEN" \
"https://$SERVER:2083/execute/SshWhitelist/remove?address=$IP&port=$PORT&direction=$DIR" | jq
Réponse pour la suppression d'une adresse IP
{
"warnings": null,
"data": null,
"errors": null,
"metadata": {},
"status": 1,
"messages": [
"L'autorisation a été supprimée avec succès, elle sera effective d'ici quelques minutes (~5mins)."
]
}

Supprimer toutes les IP de la liste blanche

Pour faciliter l'usage dans un contexte de CI/CD, un raccourci permettant de supprimer toutes les adresses IP placées en exception est proposé.

Supprimer toutes les adresses IP en liste blanche
curl -sm 45 -H "Authorization: cpanel $LOGIN:$TOKEN" \
"https://$SERVER:2083/execute/SshWhitelist/remove_all" | jq
Réponse pour la suppression de toutes les exceptions
{
"metadata": {},
"status": 1,
"messages": [
"Toutes les autorisations ont été supprimées avec succès."
],
"warnings": null,
"data": null,
"errors": null
}

Exemple de CI/CD Github

Exemple de déploiement de Docusaurus

Cette documentation utilise Docusaurus et est deployée depuis Github avec un workflow CI/CD.

Ce workflow utilise la nouvelle méthode d'authentification avec le token d'API de cPanel.

Les variables CPANEL_USERNAME, CPANEL_API_TOKEN, CPANEL_SERVER sont déclarées à l'avance dans les secrets Github.

Extrait du déploiement automatisé de Docusaurus, depuis Github, sur un hébergement o2switch
# https://github.com/o2switchfr/documentation/tree/main/.github/workflows
name: Deploy & Index content

on:
workflow_dispatch:
push:
branches:
- main

jobs:
build:
name: Build
uses: ./.github/workflows/build.yml

deploy:
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Download Build Artifact
uses: actions/download-artifact@v4
with:
name: build
path: build

- name: Get runner's public IP
id: ip
uses: haythem/public-ip@v1.3

- name: Removing all whitelisted IP
run: |
curl -sm 45 -H'Authorization: cpanel ${{ secrets.CPANEL_USERNAME }}:${{ secrets.CPANEL_API_TOKEN }}' \
'https://${{ secrets.CPANEL_SERVER }}:2083/execute/SshWhitelist/remove_all'

- name: Whitelisting the runner IP
run: |
curl -sm 45 -H'Authorization: cpanel ${{ secrets.CPANEL_USERNAME }}:${{ secrets.CPANEL_API_TOKEN }}' \
'https://${{ secrets.CPANEL_SERVER }}:2083/execute/SshWhitelist/add?address=${{ steps.ip.outputs.ipv4 }}&port=22'

- name: Making sure the IP is whitelisted
run: |
curl -sm 45 -H'Authorization: cpanel ${{ secrets.CPANEL_USERNAME }}:${{ secrets.CPANEL_API_TOKEN }}' \
'https://${{ secrets.CPANEL_SERVER }}:2083/execute/SshWhitelist/list' | grep ${{ steps.ip.outputs.ipv4 }}

- name: Installing the SSH Key
run: |
eval $(ssh-agent -s)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
chmod 0400 ~/.ssh/id_rsa

- name: Sending data with RSYNC
run: |
rsync --timeout=60 -e "ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa" \
--exclude=".git" -av --delete build/ \
${{ secrets.CPANEL_USERNAME }}@${{ secrets.CPANEL_SERVER }}:/home/${{ secrets.CPANEL_USERNAME }}/public_html

- name: Cleaning SSH keys
if: always()
run: rm -fr ~/.ssh

- name: Cleaning artifacts
uses: geekyeggo/delete-artifact@v5
if: always()
with:
name: build
failOnError: false

- name: Run DocSearch Scraper
uses: celsiusnarhwal/typesense-scraper@v2
with:
api-key: ${{ secrets.TYPESENSE_API_KEY }}
host: search.o2swit.ch
port: 443
protocol: https
config: typesense.config.json

Exemple de déploiement de WordPress Bedrock

Pour un exemple de CI/CD avec Github, vous pouvez regarder ce gist / discussion.

Ce Workflow (à la date du 02/05/2025) utilise l'ancienne méthode d'authentification avec l'identifiant / mot de passe de cPanel.

Pour un usage de CI/CD, l'idée est de :

  • détecter dynamiquement l'adresse IP du runner. Sur GitHub il est possible d'utiliser une action comme haythem/public-ip@v1.3 ou un service externe comme Ipify
  • récupérer la liste de toutes les adresses IP qui sont déjà en liste blanche
  • s'assurer qu'il reste au moins une place pour ajouter une exception
  • s'il ne reste pas de place, alors il faut supprimer des exceptions existantes
  • ou pour simplifier, on peut d'abord supprimer toutes les exceptions avant d'en ajouter une nouvelle
  • ajouter l'adresse IP du runner en liste blanche

Pour Github, en supposant que les variables suivantes REMOTE_USER, URL_ENCODED_PASSWORD, REMOTE_HOST sont déclarées dans les variables secrètes du projet, on peut utiliser quelque chose de similaire à ceci :

# Extrait de https://gist.github.com/webaxones/54a9aee13bd9152e900ef30a0fcef3ed
steps:
# Checkout le code depuis GitHub
- uses: actions/checkout@v4

#
# Ici vos autres actions ...
# Exemple installation des dépendences avec npm / composer etc...
#

# Récupérer l'IP publique du runner GitHub
- name: Get runner's public IP
id: ip
uses: haythem/public-ip@v1.3

# Ajouter l'IP du runner à la whitelist SSH de o2Switch
- name: Whitelist IP on hosting & delete github old ones (o2switch)
shell: bash
run: |
ENDPOINT='frontend/o2switch/o2switch-ssh-whitelist/index.live.php'

echo "Get actual whitelisted IPs..."
RESPONSE=$(curl -sX GET "https://${{ secrets.REMOTE_USER }}:${{ secrets.URL_ENCODED_PASSWORD }}@${{ secrets.REMOTE_HOST }}:2083/$ENDPOINT?r=list")
echo "Response: $RESPONSE"
UNIQUE_IPS=$(echo "$RESPONSE" | jq -r '.data.list[] | .address' | sort -u)

for address in $UNIQUE_IPS; do
echo "Delete this github IP: $address (in & out)"
curl -sX GET "https://${{ secrets.REMOTE_USER }}:${{ secrets.URL_ENCODED_PASSWORD }}@${{ secrets.REMOTE_HOST }}:2083/$ENDPOINT?r=remove&address=$address&direction=in&port=22" | jq
sleep 3
curl -sX GET "https://${{ secrets.REMOTE_USER }}:${{ secrets.URL_ENCODED_PASSWORD }}@${{ secrets.REMOTE_HOST }}:2083/$ENDPOINT?r=remove&address=$address&direction=out&port=22" | jq
sleep 3
done
echo "All non-whitelisted IPs deleted!"

echo "Attempt to whitelist IP..."
curl -sX POST -d 'whitelist[address]=${{ steps.ip.outputs.ipv4 }}' -d 'whitelist[port]=22' "https://${{ secrets.REMOTE_USER }}:${{ secrets.URL_ENCODED_PASSWORD }}@${{ secrets.REMOTE_HOST }}:2083/$ENDPOINT?r=add" | jq

#
# Ici le reste de vos actions, par exemple le déploiement avec Rsync
#
Double authentification

Si vous avez activé la double authentification sur cPanel, alors celle-ci est également nécessaire pour les appels d'API.

Lorsque la double authentification est active, il faut passer le code à usage unique dans les appels d'API.

Vous retrouverez plus de détails sur la page suivante : 2FA with non-session-based authentication