Comment désactiver sftp pour certains utilisateurs, mais garder ssh activé?

12

Mon projet a besoin de moi pour désactiver sftp pour certains utilisateurs, mais ces utilisateurs doivent toujours se connecter via ssh. Quelqu'un sait-il comment mettre cela en œuvre?

J'ai vu des suggestions pour changer le fichier /etc/ssh/sshd_config, mais je ne sais pas quoi changer.

Shaobo Wang
la source
La seule façon d'imaginer cela serait d'utiliser une politique MLS dans SELinux et de restreindre exactement les fichiers, répertoires et sockets auxquels une personne peut accéder, exécuter, etc. Je le ferais en combinaison avec une politique iptables très restrictive qui utilise le module ownerd'accès sortant. Cela suppose que vous allez être testé par une équipe rouge. Si tout le monde accédant à votre système obéit toujours aux règles et n'a jamais de mauvaise intention, alors mon approche serait lourde et trop complexe.
Aaron

Réponses:

7

En général, cela est une mauvaise pratique de sécurité pour des raisons que d'autres ont énumérées. Cependant, le but de votre mission, je pense, est de vous apprendre que vous pouvez avoir des sections de configuration conditionnelles basées sur divers critères.

Pour ce faire, utilisez un Matchbloc conditionnel *.

Match User bob
Subsystem   sftp  /bin/false

Voir sshd_config(5)sous la Matchsection pour plus d'informations et l'appariement Group.

* Il y a plus d'une façon de le faire.

bahamat
la source
7
Ça ne fonctionne pas pour moi. Erreur: la directive «Sous-système» n'est pas autorisée dans un bloc de correspondance
chrw
Mauvaise réponse car le sous-système n'est pas autorisé dans le bloc Match
mikep
6

Cela n'a aucun sens, c'est la sécurité à travers une obscurité inutile. Tout utilisateur capable de SSH pourra transférer n'importe quel fichier qu'il pourra lire via la session SSH. Vous pourrez également écrire, si vous êtes autorisé à le faire.

Comme par exemple, vous pouvez télécharger / etc / passwd via ssh en utilisant la méthode suivante (aucune session scp / sftp requise): ssh [email protected] "cat / etc / passwd"> passwdcopy

Si vous pouvez le voir sur votre écran via SSH, vous pouvez facilement le copier sous forme de fichier.

La seule façon dont cela aurait du sens est que vous ayez un shell restreint personnalisé qui applique une politique de sécurité.

Cependant, l'inverse de cela a du sens (désactivation du shell ssh mais laisse scp / sftp activé) car vous ne pouvez pas exécuter des commandes arbitraires via sftp / scp que vous pouvez via un shell ssh.

PS: Je suppose que le shell SSH que vous accordez est un shell standard qui permet une exécution arbitraire. Si ce n'est pas le cas, voyez ceci: Comment désactiver le sous-système sftp pour un utilisateur ou un groupe spécifique? et jetez un œil à l'option de configuration du sous-système de sshd_config.

Nathan
la source
4
Match Group nosft
Subsystem   sftp  /bin/false

Je préfère utiliser un groupe pour cela.

Il est utile en combinaison avec les utilisateurs qui ont des coquilles restreintes. Je donne parfois un accès ssh à un client afin qu'il puisse accéder à un vidage sql de leur base de données en définissant leur shell sur un script qui décharge leurs données. Les couper de scp semble également être une bonne idée. Ils n'ont pas accès à l'exécution catpour transférer un fichier sur ssh.

singlow
la source
3
Directive 'Subsystem' is not allowed within a Match block
Patryk
Mauvaise réponse car le sous-système n'est pas autorisé dans le bloc Match
mikep
4

Il est possible d'activer SFTP globalement et de désactiver SFTP uniquement pour certains utilisateurs.

Cela ne fonctionne pas si vous souhaitez que votre utilisateur reçoive une invite shell standard. Cela n'a pas non plus de sens, car vous pourriez contourner la plupart des choses si vous avez accès au shell. Cela ne fonctionnera que si vous souhaitez uniquement donner accès à un programme spécifique.

Personnellement, j'en ai besoin parce que je veux donner accès à certains dépôts git via SSH, et j'aime désactiver les systèmes qui ne sont pas nécessaires. Dans ce cas, SFTP n'est pas nécessaire.

Correspondant à

Pour faire correspondre un ensemble d'utilisateurs, vous pouvez configurer SSH avec le Matchmot clé. Du sshd_config(5)manuel:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

Quelques exemples:

  • Match User eva correspond à l'utilisateur "eva"
  • Match User stephen,maria correspond aux utilisateurs "stephen" et "maria"
  • Match Group wheel,adams,simpsons correspond aux groupes "roue", "adams", "simpsons"

Si vous voulez plus d'informations, il y a des charges dans le sshd_config(5)manuel.

Commande forcée

Normalement, vous obtenez le shell de connexion de l'utilisateur lorsque vous vous connectez via SSH, mais SSH peut être configuré pour forcer une certaine commande. La commande est forcée pour toute connexion SSH, y compris SFTP, et vous pouvez donc avoir la possibilité de forcer la commande souhaitée.

La commande à forcer peut être configurée avec le ForceCommandmot - clé. Du sshd_config(5)manuel:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

Vous pouvez donc forcer la commande contrainte que vous souhaitez utiliser ForceCommand <your command>. Par exemple:

Match User kim
        ForceCommand echo 'successful login man, congrats'

Exemple

Dans mon cas où je veux donner un accès à git, j'ai seulement besoin que l'utilisateur y ait accès git-shell. C'est la section qui désactive SFTP pour mes utilisateurs git, avec quelques options de sécurité:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no
aude
la source
1
Cela ne répond pas à la question du PO, mais cela m'a été très utile pour réaliser ce que je veux réaliser dans mon propre cas d'utilisation
Kidburla
Je ne suis pas d'accord. La question d'OP est "Comment désactiver sftp pour certains utilisateurs, mais garder ssh activé?", Et cette réponse explique une façon de le faire. Heureux que vous l'ayez trouvé utile de toute façon!
aude
De votre propre aveu, cela "ne fonctionne pas si vous voulez que votre utilisateur reçoive une invite shell régulière". donc cela ne répond pas à l'exigence du PO de "garder ssh activé"
Kidburla
C'est un bon point. Je suppose que j'ai accepté cette solution à cause de "cela n'a pas de sens, car vous pourriez contourner la plupart des choses si vous avez un accès shell.". Mais je n'ai pas trouvé un moyen de répondre exactement à ce que demande OP, je suis d'accord maintenant.
aude
Voici une version plus complète de cette réponse: serverfault.com/a/817482
aude
1
Match User bob
MaxSessions 0

Testé et fonctionnant sur CentOS 6.6. Notez que le sous-système n'est pas autorisé avec Match au moins sur les nouvelles versions CentOS. La page de manuel de sshd_config répertorie les mots clés limités autorisés avec la condition de correspondance.

Jeff
la source
0

Vous pouvez regarder scponly pour faire l'inverse, autoriser uniquement scp / sftp mais pas d'accès shell.

Je suis d'accord avec @Nathan ci-dessus, cela n'a pas beaucoup de sens. Si vous êtes mort, essayez de modifier votre fichier / etc / ssh / sshd_config et de supprimer / commenter la ligne suivante:

Sous-système sftp / usr / libexec / openssh / sftp-server

dmourati
la source
0

ne donner aucun répertoire personnel à l'utilisateur

usermod username -d /bin/false

Remplacez Subsystem sftp / usr / libexec / openssh / sftp-server dans le fichier / etc / ssh / sshd_config par Subsystem sftp / dev / null / usr / libexec / openssh / sftp-server

Redémarrez ensuite le ssh

service ssh restart

ça marche pour moi, debian.

Yusufmm
la source
-2

Dans le ~/authorized_keyconfigurez la clé utilisateur comme suit:

command="/bin/bash" ssh-rsa AAAAB3Nz.........
Kazek
la source