Activer et configurer le serveur SSH sur macOS Tahoe

Introduction

Vous souhaitez accéder à votre Mac à distance depuis un PC Windows ou une autre machine ?
Le protocole SSH (Secure Shell) est la solution idéale.
Sur macOS, c'est OpenSSH qui est utilisé, le même que sur Linux et BSD. Cependant, le serveur SSH est désactivé par défaut sur macOS pour des raisons de sécurité.

Dans cet article, nous allons voir comment activer SSH sur macOS Tahoe, puis explorer en détail les différentes options de configuration et de sécurisation disponibles.


Activer la session à distance

Sur macOS, l'activation de SSH passe par la fonctionnalité Session à distance.
Voici les étapes à suivre :

Une fois activé, vous pouvez vous connecter depuis un autre ordinateur avec la commande :

ssh votre_nom_utilisateur@adresse_ip_du_mac

Fichiers de configuration

Comme sur Linux et BSD, OpenSSH sur macOS utilise des fichiers de configuration standards :


Gestion du service avec launchd

Contrairement à Linux (systemd) ou Solaris/illumos (SMF), macOS utilise launchd pour gérer les services.
Voici les commandes utiles :

Vérifier le statut du service

sudo launchctl list | grep ssh

Activer ou désactiver SSH en ligne de commande

A condition d'avoir au préalable activé l'accès complet au disque (Full Disk Access) pour l'application Terminal.

# Activer SSH
sudo systemsetup -setremotelogin on

# Désactiver SSH
sudo systemsetup -setremotelogin off

Redémarrer le service après modification

# Vérifier la syntaxe de la configuration
sudo sshd -t

# Redémarrer le service
sudo launchctl stop com.openssh.sshd
sudo launchctl start com.openssh.sshd

Sécurisation du serveur SSH

Les options de sécurité se configurent dans le fichier /etc/ssh/sshd_config.
Éditez-le avec :

sudo nano /etc/ssh/sshd_config

Changement de port

Par défaut, SSH écoute sur le port 22. Changer ce port réduit le bruit des scans automatisés (sécurité par obscurité).

Attention : Sur macOS, le service SSH par défaut utilise l'activation par socket via launchd. Le fichier /System/Library/LaunchDaemons/ssh.plist contient la directive SockServiceName qui force l'écoute sur le port 22, ignorant la directive Port de sshd_config.

Pour changer le port SSH, il faut donc créer un service launchd personnalisé.

Étape 1 — Modifier le port dans sshd_config

Éditez /etc/ssh/sshd_config et modifiez la ligne :

Port 2222

Étape 2 — Désactiver le service SSH par défaut

sudo systemsetup -setremotelogin off

Étape 3 — Créer un service launchd personnalisé

Créez le fichier /Library/LaunchDaemons/com.openssh.sshd-custom.plist en copiant directement tout le bloc ci-dessous:

sudo tee /Library/LaunchDaemons/com.openssh.sshd-custom.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
 <string>com.openssh.sshd-custom</string>
 <key>Program</key>
 <string>/usr/sbin/sshd</string>
 <key>ProgramArguments</key>
 <array>
 <string>/usr/sbin/sshd</string>
 <string>-D</string>
 </array>
 <key>RunAtLoad</key>
 <true/>
 <key>KeepAlive</key>
 <true/>
</dict>
</plist>
EOF

Ce plist lance sshd directement avec l'option -D (mode daemon au premier plan), ce qui lui permet de lire le port configuré dans sshd_config.

Étape 4 — Définir les permissions et charger le service

# Définir les permissions
sudo chmod 644 /Library/LaunchDaemons/com.openssh.sshd-custom.plist

# Charger et démarrer le service
sudo launchctl load -w /Library/LaunchDaemons/com.openssh.sshd-custom.plist

Étape 5 — Vérifier que sshd écoute sur le nouveau port

sudo lsof -i :2222

Vous devez voir une ligne avec sshd et LISTEN.

Gestion du service personnalisé

# Arrêter le service
sudo launchctl stop com.openssh.sshd-custom

# Démarrer le service
sudo launchctl start com.openssh.sshd-custom

# Désactiver le service (ne se lancera plus au démarrage)
sudo launchctl unload -w /Library/LaunchDaemons/com.openssh.sshd-custom.plist

# Réactiver le service
sudo launchctl load -w /Library/LaunchDaemons/com.openssh.sshd-custom.plist

Après modification, connectez-vous avec : ssh -p 2222 user@ip

Authentification par clés

L'authentification par clés est plus sécurisée que les mots de passe. Elle repose sur une paire clé privée/clé publique.

Côté client — générer une clé

ssh-keygen -t ed25519 -C "mon-pc-windows"

Envoyer la clé publique au Mac

Depuis Windows, ssh-copy-id n'existant pas, nous devons utiliser une autre commande
Vous devrez adapter la commande suivante.

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user-mac@ip-mac "mkdir -p ~/.ssh && tr -d '\r' >> ~/.ssh/authorized_keys"

Ou manuellement, ajoutez le contenu de id_ed25519.pub dans le fichier ~/.ssh/authorized_keys sur le Mac.

Configuration serveur

Par défaut, OpenSSH accepte les connexions par clé sans aucune configuration supplémentaire dans le fichier /etc/ssh/sshd_config, même lorsque la directive "PubkeyAuthentication" est commentée.
Néanmoins, si vous souhaitez forcer ce comportement :

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

Particularité macOS — Trousseau

Sur macOS, vous pouvez stocker la passphrase de votre clé dans le Trousseau.
Dans ~/.ssh/config :

Host *
 UseKeychain yes
 AddKeysToAgent yes
 IdentityFile ~/.ssh/id_ed25519

Désactiver l'authentification par mot de passe

Une fois les clés en place, désactivez les mots de passe pour bloquer les attaques par force brute.

PasswordAuthentication no
KbdInteractiveAuthentication no

Attention : assurez-vous que votre clé fonctionne avant d'activer cette option, sinon vous perdrez l'accès distant !

Désactiver la connexion root

Empêcher la connexion directe en root est une bonne pratique universelle.

PermitRootLogin no

Variantes possibles :

Restreindre les utilisateurs (AllowUsers / DenyUsers)

Vous pouvez contrôler précisément qui peut se connecter en SSH.

# Autoriser uniquement ces utilisateurs
AllowUsers alice bob

# Interdire certains utilisateurs
DenyUsers invité test

# Restriction par groupe
AllowGroups ssh-users admin
DenyGroups guests

Ordre d'évaluation : DenyUsers → AllowUsers → DenyGroups → AllowGroups

Limiter les tentatives de connexion

Protection contre les attaques par force brute.

# Nombre d'échecs avant déconnexion
MaxAuthTries 3

# Secondes pour s'authentifier
LoginGraceTime 30

# Sessions simultanées par connexion
MaxSessions 2

# Limite les connexions non authentifiées
MaxStartups 3:50:10

Désactiver les fonctionnalités inutiles

Réduire la surface d'attaque en désactivant ce dont vous n'avez pas besoin.

# Désactive le forwarding graphique X11
X11Forwarding no

# Désactive les tunnels TCP
AllowTcpForwarding no

# Désactive le forwarding de l'agent SSH
AllowAgentForwarding no

# Désactive les tunnels VPN
PermitTunnel no

# Désactive le message du jour
PrintMotd no

Algorithmes cryptographiques

Restreindre aux algorithmes modernes et sûrs.

# Échange de clés
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org

# Clés hôtes
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256

# Chiffrement
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com

# MAC (intégrité)
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

Bannière de connexion

Afficher un avertissement légal avant l'authentification.

Banner /etc/ssh/banner.txt

Contenu typique de /etc/ssh/banner.txt :

******************************************
* Accès réservé aux utilisateurs *
* autorisés. Toute activité est *
* susceptible d'être enregistrée. *
******************************************

Configuration SFTP

SFTP (SSH File Transfer Protocol) utilise le même service SSH. La configuration de base est généralement déjà présente.

Configuration par défaut

Subsystem sftp /usr/libexec/sftp-server

SFTP chrooté (sécurisé)

Pour enfermer les utilisateurs SFTP dans leur répertoire personnel :

Subsystem sftp internal-sftp

Match Group sftp-users
 ChrootDirectory /home/%u
 ForceCommand internal-sftp
 AllowTcpForwarding no
 X11Forwarding no

Prérequis : le répertoire racine du chroot doit appartenir à root avec les permissions 755.


Configuration du pare-feu

Si vous changez le port SSH par défaut, vous devrez peut-être configurer le pare-feu macOS pour autoriser les connexions.

Pare-feu applicatif

C'est le pare-feu activé via Réglages Système → Réseau → Pare-feu. Il fonctionne par application, pas par port. Quand vous activez "Connexion à distance", il autorise automatiquement le processus sshd, quel que soit le port.

Vérifier que sshd est autorisé

sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps

Autoriser explicitement sshd

sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/sbin/sshd
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /usr/sbin/sshd

Pare-feu PF (Packet Filter)

macOS intègre aussi PF, le pare-feu BSD bas niveau. Il est désactivé par défaut, mais certains logiciels de sécurité (Little Snitch, Lulu, etc.) peuvent l'activer.

Vérifier si PF est actif

sudo pfctl -s info | grep Status

Ajouter une règle pour le port personnalisé

Si PF est actif, éditez /etc/pf.conf et ajoutez :

pass in proto tcp from any to any port 2222

Puis rechargez les règles :

sudo pfctl -f /etc/pf.conf

Diagnostic et dépannage

Si la connexion SSH ne fonctionne pas, voici comment identifier le problème.

Vérifier que sshd écoute sur le bon port

sudo lsof -i :2222

Vous devez voir une ligne avec sshd et LISTEN.

Tester la connexion localement

ssh -p 2222 localhost

Si ça fonctionne localement mais pas depuis l'extérieur, c'est le pare-feu ou le réseau.

Tester la connectivité depuis Windows

Test-NetConnection -ComputerName IP_DU_MAC -Port 2222

Lancer sshd en mode debug

Pour diagnostiquer les problèmes de démarrage du service :

sudo /usr/sbin/sshd -d

Cette commande lance sshd au premier plan avec des messages de debug. Si le démarrage échoue, vous verrez l'erreur exacte.

⬆️ Retour en haut de la page


↑ Haut de page