Est-il possible d'accorder aux utilisateurs un accès sftp sans accès shell? Si oui, comment est-elle mise en œuvre?

29

J'ai un éventail d'utilisateurs qui doivent simplement télécharger des fichiers vers leurs homedirs. Je pense que sftp suffirait, mais je ne veux pas qu'ils se connectent via shell. Est-ce donc possible? Ma plate-forme est centos 7, les homedirs de l'utilisateur sont stockés, disons / personal / $ user

J'ai créé un utilisateur avec ces paramètres

useradd -m -d /personal/user1 -s /sbin/nologin

assigné un mot de passe à l'utilisateur, puis lorsque j'utilise sftp pour me connecter à la machine, il est impossible de se connecter.

Sollosa
la source

Réponses:

11

Modifiez votre /etc/ssh/sshd_configpour contenir:

Match User [SFTP user]
ForceCommand internal-sftp

Redémarrez sshd. Si vous avez plusieurs utilisateurs, mettez-les tous sur la ligne utilisateur de correspondance, séparés par des virgules comme ceci:

Match User User1,User2,User3

La clé pour configurer sftppour ne pas autoriser l'accès au shell est de limiter les utilisateurs via l' ForceCommand option.

kemotep
la source
Ok, j'ai suivi toutes les étapes mais il ne s'est pas connecté
Sollosa
2
@Sollosa Essayez avec Match User [SFTP user] ForceCommand internal-sftpseulement, sans chrooter.
Martin Prikryl
@MartinPrikryl cela a fonctionné Martin, merci, je viens de supprimer le paramètre chrootdirectory et l'alto
Sollosa
1
En plus de cela, vous pouvez chrootles utilisateurs afin qu'ils ne puissent pas naviguer vers le haut et hors de votre "prison" définie
ivanivan
37

J'aime la configuration suivante pour gérer l'accès SSH, que j'utilise au travail pour gérer un groupe d'utilisateurs sur une petite flotte de serveurs. La sécurité et la facilité de gestion figurent en tête de liste de mes priorités.

Ses fonctionnalités clés gèrent facilement les droits SSH via l'appartenance à un groupe Unix, disposent d'autorisations étroitement définies et sont sécurisées par défaut.

Mise en place

Installer le logiciel (facultatif mais utile):

yum install members   # or apt install members

Ajouter des groupes:

addgroup --system allowssh
addgroup --system sftponly

Dans /etc/ssh/sshd_config, assurez-vous que les paramètres suivants sont No:

PermitRootLogin no
PubkeyAuthentication no
PasswordAuthentication no

Et à la fin de /etc/ssh/sshd_config, ajoutez ces deux strophes:

Match Group allowssh
    PubkeyAuthentication yes

Match Group sftponly
    ChrootDirectory %h
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp

(n'oubliez pas de redémarrer SSH après avoir édité le fichier)

Explication

Alors, qu'est-ce que tout cela fait?

  • Il désactive toujours les connexions root, comme mesure de sécurité supplémentaire.
  • Il désactive toujours les connexions par mot de passe (les mots de passe faibles sont un gros risque pour les serveurs exécutant sshd).
  • Il autorise uniquement la connexion (pubkey) pour les utilisateurs du allowsshgroupe.
  • Les utilisateurs du sftponlygroupe ne peuvent pas obtenir un shell via SSH, uniquement SFTP.

La gestion des personnes autorisées se fait ensuite simplement en gérant l'appartenance au groupe (ces modifications prennent effet immédiatement, aucun redémarrage SSH requis):

# adduser marcelm allowssh
# members allowssh
marcelm
# deluser marcelm allowssh
# members allowssh
#

Notez que vos utilisateurs sftp doivent être membres à la fois sftponly(pour s'assurer qu'ils n'obtiendront pas de shell) et de allowssh(pour permettre la connexion en premier lieu).

Plus d'informations

  1. Veuillez noter que cette configuration n'autorise pas les connexions par mot de passe ; tous les comptes doivent utiliser l'authentification par clé publique. C'est probablement la plus grande victoire en matière de sécurité que vous pouvez obtenir avec SSH, donc je pense que cela en vaut la peine, même si vous devez commencer maintenant.

    Si vous ne voulez vraiment pas cela, ajoutez également PasswordAuthentication yesà la Match Group allowsshstrophe. Cela permettra à la fois l'authentification par clé publique et par mot de passe pour les allowsshutilisateurs.

  2. Cette configuration limite tout sftponlyutilisateur à son répertoire personnel. Si vous ne le souhaitez pas, supprimez la ChrootDirectory %hdirective.

    Si vous ne voulez le chroot au travail, il est important que le répertoire personnel de l' utilisateur (et un répertoire au- dessus) est la propriété root:rootet non modifiable par groupe / autre. Il est acceptable que les sous-répertoires du répertoire personnel appartiennent à l'utilisateur et / ou soient accessibles en écriture.

    Oui, le répertoire personnel de l'utilisateur doit appartenir à root et ne pas être accessible à l'utilisateur. Malheureusement, il existe de bonnes raisons à cette limitation. Selon votre situation, cela ChrootDirectory /homepourrait être une bonne alternative.

  3. La définition du shell des sftponlyutilisateurs sur /sbin/nologinn'est ni nécessaire ni nuisible pour cette solution, car SSH ForceCommand internal-sftpremplace le shell de l'utilisateur.

    L'utilisation /sbin/nologinpeut être utile pour les empêcher de se connecter via d'autres moyens (console physique, samba, etc.).

  4. Cette configuration ne permet pas les rootconnexions directes via SSH; cela forme une couche supplémentaire de sécurité. Si vous avez vraiment ne besoin les connexions root directes, changer la PermitRootLogindirective. Pensez à le régler sur forced-commands-only, prohibit-passwordet (en dernier recours) yes.

  5. Pour les points bonus, essayez de restreindre qui peut su rooter; ajouter un groupe système appelé wheelet ajouter / activer auth required pam_wheel.sodans /etc/pam.d/su.

marcelm
la source
2
Ce devrait être la réponse acceptée. Il fournit la solution et décompose le raisonnement derrière chaque étape.
kemotep
1
C'est une excellente réponse avec d'excellents conseils de sécurité supplémentaires, mais je m'inquiète pour les utilisateurs dont les systèmes dépendent des connexions par mot de passe, des connexions root, etc. propre section afin qu'une réponse à la question avec des changements minimes soit disponible?
Josh Rumbut
1
@JoshRumbut Je ne voulais pas réécrire la réponse pour vos remarques (très correctes), en partie parce que cela ne fait que montrer My Way ™, et en partie dans l'espoir qu'il puisse s'agir d'une sorte de configuration SSH canonique sécurisée par défaut exemple que beaucoup plus de gens trouvent utile. Comme compromis, j'ai essayé de rendre beaucoup plus clair que les connexions root et l'authentification par mot de passe ne fonctionneront pas, et j'ai inclus des instructions pour les réactiver :)
marcelm
1
Bonne réponse, imo les plus grandes lacunes des autres réponses ne tenaient pas compte des aspects de sécurité, principalement chroot. +1
Rui F Ribeiro
1
Chroot ne fonctionnera pas pour un% h générique. Étonnamment, vous devez chown root:rootetchmod og-w
kubanczyk
1

changez simplement leur shell par défaut en / sbin / nologin. En supposant que la plupart des variétés de Linux:

# usermod -s /sbin/nologin username
Kefka
la source
Je l'ai essayé, mais l'utilisateur ne peut pas se connecter via sftp, je ne sais pas pourquoi. J'utilise centos btw.
Sollosa
@Sollosa Probablement soit un problème d'autorisation dans votre chroot sftp, soit sshd_config a un problème. Vous devez mettre à jour votre question pour inclure les autorisations de votre répertoire chroot et de votre sshd_config avec toute information sensible expurgée.
Kefka
Je crois (bien que je ne puisse pas le tester maintenant) que cela n'autorise SFTP que s'il y en a aussi Subsystem sftp internal-sftp) (ou peut-être ForceCommand internal-sftp). S'il y en a Subsystem sftp /path/to/sftp-server, nologincela empêchera même SFTP.
Martin Prikryl
@MartinPrikryl J'ai mal compris leur question d'origine non modifiée pour demander comment désactiver l'accès shell pour les utilisateurs sur un serveur sftp par ailleurs fonctionnel. J'étais éveillé depuis une dizaine de minutes à l'époque, donc je n'étais pas aussi lucide que j'aurais pu le ressentir. Bien que je ne sache pas que sftp-server nécessite qu'un utilisateur ait un shell valide pour fonctionner - cela semble potentiellement dangereux. Je n'utilise que internal-sftp juste par habitude parce que c'est comme ça que je l'ai toujours fait.
Kefka
Voir ma réponse à OpenSSH: Différence entre internal-sftp et sftp-server (en particulier la section à la fin)
Martin Prikryl
0

vous pouvez utiliser tftp. quoi que ce soit sur ssh nécessitera un certain auth (clé | passe).

Bien que tftp puisse être sécurisé, il peut être utile de revoir la décision de fournir l'accès à tout sans authentification.

http://manpages.ubuntu.com/manpages/bionic/man1/tftp.1.html

Justin
la source
2
Je pense qu'OP voulait que les utilisateurs (qui ont probablement des noms d'utilisateur et des mots de passe) ne puissent pas utiliser un client SSH normal pour se connecter au serveur et exécuter des commandes arbitraires, mais ces mêmes utilisateurs devraient pouvoir télécharger des fichiers via SFTP.
John_ReinstateMonica