J'ai cherché une réponse viable à cette question, et la plupart des réponses comprennent des conseils sur les raisons de ne pas le faire. Cependant, voici le scénario et ce qui le rend nécessaire:
J'ai une application console, et dans le .profile de chaque utilisateur, il y a une commande de démarrage pour l'application, et juste après la commande qui la démarre, il y a une commande "exit", qui les déconnecte du système. Je veux seulement qu'ils puissent accéder à cette application console via l'interface fournie par celle-ci. Au démarrage, l'application présente à l'utilisateur une liste de clients accessibles via l'application, chaque client ayant son propre répertoire de données. Les utilisateurs ne sont autorisés à accéder qu'aux clients auxquels ils auront besoin d'accéder.
Maintenant, voici le problème: si je donne aux utilisateurs un accès SSH, ils pourront également se connecter en utilisant un client SFTP, ce qui leur donnera un accès direct aux répertoires de données de l'application, ce qui est TRÈS indésirable, car cela donnera également leur permettre d'accéder aux répertoires de données auxquels ils ne devraient pas avoir accès.
C'était une chose si simple à faire lors de l'utilisation d'une combinaison telnet / FTP, mais maintenant que je veux donner aux utilisateurs un accès depuis n'importe où sur Internet, je n'ai pas réussi à trouver un moyen de les désactiver de SFTP, tandis que leur permettant toujours d'accéder au shell où ils peuvent exécuter l'application.
.profile
pour cela sonne comme la mauvaise solution. Je pense que la configuration de l'utilisateur avec un autre shell aurait beaucoup plus de sens..profile
astuce pour restreindre l'accès, car il est trivial de contourner. (voir ma réponse pour plus de détails)Réponses:
Modifier:
Dans le cas où ce n'est pas évident, la réponse suivante n'est pas conçue comme une méthode sécurisée pour empêcher SFTP d'être utilisé par toute personne ayant un accès shell au serveur. C'est juste une réponse qui explique comment le désactiver de la visibilité externe. Pour une discussion sur la sécurité au niveau utilisateur, voir les réponses de @cpast et @Aleksi Torhamo. Si la sécurité est votre priorité, cette réponse n'est pas la bonne. Si la simple visibilité du service est votre objectif, alors c'est votre réponse.
Nous continuons maintenant à la réponse originale:
Commentez le support sftp dans sshd_config (et bien sûr redémarrez
sshd
):#Subsystem sftp /usr/lib/openssh/sftp-server
la source
Subsystem sftp internal-sftp
Subsystem sftp /usr/libexec/sftp-server
Mais ça a fait l'affaire. Merci beaucoupssh user@host command
, car.profile
ils ne seront pas exécutés du tout si vous le faites, et votre application ne démarrera donc pas du tout. Ils peuvent obtenir un accès complet au shell en disant simplementssh -t user@host bash
. Essayez-le et vous verrez. Le sous-système n'est qu'un alias de commande; s'ils pouvaient utiliser sftp auparavant, ils peuvent toujours l'utiliser - et toute autre commande qu'ils souhaitent. Lisez ma réponse ci-dessous..profile
car il n'est pas destiné à la sécurité et est facilement contourné. Dans ma réponse, j'ai énuméré trois méthodes différentes de le faire avec ssh. En bref, déplacez simplement l'invocation de votre application.profile
vers un script shell et 1) définissez le script shell comme shell de l'utilisateur 2) définissez le script shell comme (correctement apparié)ForceCommand
danssshd_config
3) passez à l'authentification par clé publique et définissez le script shell commecommand
dans.ssh/authorized_keys
. (De plus, vous devez utiliser @name pour que les gens soient informés des commentaires)Comme d'autres l'ont mentionné, la désactivation
sftp
n'est pas du tout suffisante - un utilisateur avec unssh
accès illimité peut afficher n'importe quel fichier que son compte a les autorisations de visualiser, peut modifier tout ce qu'il a l'autorisation de modifier et peut facilement télécharger tout ce qu'il peut lire lui-même. machine. La seule façon de les empêcher de le faire est de restreindre leur accès. Il est pas l' idéal compter sur.profile
pour limiter les utilisateurs, car ce n'est pas ce qu'il est pour (Edit: Comme Aleksi mentionne dans sa réponse, il est en fait trivial à contourner.profile
, la chose au sujet.profile
est que ce soit pour la commodité, pas de sécurité, il est donc pas destiné à restreindre l'utilisateur. Utilisez des éléments conçus pour la sécurité, comme les éléments ci-dessous, pour assurer la sécurité).Il existe deux méthodes de base pour ce faire: vous pouvez les restreindre via des autorisations de fichier, ou les forcer à exécuter uniquement votre application console. La deuxième façon est meilleure: affecter des utilisateurs qui devraient être limités à l'application console à un groupe (par exemple
customers
); puis, danssshd_config
, ajoutez les lignes suivantes:Cela permet de faire en sorte que toutes les connexions des utilisateurs de ce groupe ouvrent l'application console; ils ne peuvent rien démarrer d'autre, y compris l'
sftp
outil serveur. Cela les empêche également de faire quoi que ce soit d' autre avec le système, et contrairement à.profile
cela, en utilisant le serveur SSH lui-même (les.profile
restreint au shell,ForceCommand
empêche également de faire d'autres choses qui n'impliquent pas le démarrage d'un shell). À la différence également.profile
, ceci est conçu comme une chose de sécurité; il est spécifiquement conçu pour résister à un utilisateur malveillant qui l'évite.L'alternative (probablement inférieure) impliquerait la création d'un nouvel utilisateur pour exécuter l'application console. Vous limitez ensuite les répertoires de données à cet utilisateur, définissez l'application console appartenant à cet utilisateur et définissez
u+s
le programme. C'est lesetuid
bit; cela signifie que quelqu'un qui exécute le programme de console le fait avec les autorisations du propriétaire du programme. De cette façon, l'utilisateur n'a pas lui-même accès aux répertoires, il ne l'obtient que par le biais du programme. Cependant, vous devriez probablement simplement l'utiliserForceCommand
, car cela restreint tout accès à "il suffit d'exécuter ce programme".la source
ForceCommand
n'empêche pas la redirection de port SSH..profile
est plus que «pas idéal»; il est facilement contourné (voir ma réponse pour plus de détails) et n'offre donc aucune protection, seulement un faux sentiment de sécurité.N'essayez pas de le faire avec
.profile
car il n'offre aucune sécurité et ne restreint absolument rien!Peu importe ce que vous mettez
.profile
, puisque vous pouvez le contourner en donnant simplement une commande à exécuter sur la ligne de commande ssh, comme ceci:ssh user@host command
. Vous pouvez toujours obtenir un accès shell normal en faisantssh -t user@host bash
.La désactivation du sous-système sftp, comme mentionné dans une autre réponse, n'aide pas du tout. Les sous-systèmes ne sont essentiellement que des alias de commandes, et vous pouvez toujours utiliser sftp normalement en le faisant
sftp -s /path/to/sftp-executable user@host
.Comme cpast et certains commentateurs l'ont dit, vous devez utiliser les mécanismes appropriés pour restreindre l'accès. C'est,
ForceCommand
danssshd_config
command="..."
dans.ssh/authorized_keys
Remarques:
command="..."
ne s'applique qu'à une seule clé, donc il ne restreint pas la connexion ssh pour l'utilisateur utilisant un mot de passe ou une autre cléAllowTcpForwarding
etc. danssshd_config
no-port-forwarding
etc. dans.ssh/authorized_keys
script -c 'command-the-user-wanted-to-run'
ForceCommand
etcommand="..."
exécutez la commande via le shell de l'utilisateur, afin qu'ils ne fonctionnent pas si le shell de l'utilisateur est défini par exemple./bin/false
ou/sbin/nologin
Avis de non-responsabilité: Je ne suis en aucun cas un expert en la matière, alors même si je peux dire que la
.profile
chose n'est pas sûre, je ne peux pas promettre qu'il n'y a pas de "gotcha" avec les autres méthodes que je ne connais pas. à propos. Ils sont en sécurité pour autant que je sache, mais je ne serais pas la première personne à se tromper sur Internet.la source
ForceCommand
et forcé la connexion sans mot de passe aveccommand=
inauthorized_keys
, alors qu'il a été contourné auparavant, cela est dû à un bogue dans le serveur: il est destiné à être sécurisé contre un utilisateur malveillant, et un utilisateur qui le contourne compte comme une vulnérabilité grave dans le serveur SSH (et est donc un correctif prioritaire). Comme vous le faites remarquer,.profile
est contournable par conception: comme il n'est pas considéré comme une fonction de sécurité, un utilisateur qui la contourne est parfaitement OK du point de vue du développeur du shell.ForceCommand
pour restreindre l'accès, et avait un démon qui n'écoute que les connexions localement et n'effectue pas l'authentification, l'utilisateur ssh pourrait toujours accéder au démon. Les fonctionnalités que j'ai énumérées sont celles par exemple. Les solutions d'hébergement git sont généralement désactivées, et je n'en ai pas vu d'autres "malveillantes" dans les pages de manuel, mais je n'ai pas encore trouvé de document officiel "c'est comme ça que vous utilisez enForceCommand
toute sécurité".~/.profile
utilisateur est modifiable et n'est pas utile pour la sécurité, mais pourriez-vous donner un sens à la technique de cpast en l'intégrant/etc/profile
? Vous pouvez vérifier l'UID pour le limiter aux bons utilisateurs.ssh user@host
, mais si vous dites à ssh d'exécuter une commande - c'est-à-dire.ssh user@host command
- vous n'obtenez plus de shell de connexion et les fichiers ne sont pas du tout touchés. Vous pouvez donc contourner trivialement toutes les restrictions que quelqu'un a essayé de créer avec les fichiers en donnant simplement un argument supplémentaire à ssh..profile
, elle utilisesshd_config
et devrait être sûre. Il mentionne seulement.profile
comme méthode que vous ne devriez pas utiliser pour ce faire.Il est possible d'activer SSH et de désactiver SFTP à la fois globalement et par utilisateur / groupe.
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.
Globalement
Vous pouvez désactiver SFTP pour tous les utilisateurs de plusieurs manières.
Le sous-système manquant
Le démon SFTP utilisé par SSH peut être configuré via le
Subsystem
mot clé. Dusshd_config(5)
manuel:La dernière ligne suggère qu'il devrait suffire de ne définir aucun sous-système pour "sftp".
Un faux mensonge
Vous pouvez également désactiver SFTP en définissant le démon SFTP utilisé par SSH sur quelque chose d'inutilisable. Par exemple, configurez le sous-système "sftp" pour
/bin/false
:Lorsque quelque chose tentait de se connecter via SFTP, le démon SSH tentait de générer le "démon sftp"
/bin/false
. Le/bin/false
programme ne fait qu'une chose, c'est de renvoyer un code d'erreur. La tentative de connexion SFTP est effectivement refusée.Par utilisateur / groupe
Il est également possible de désactiver SFTP par utilisateur, groupe ou quelques autres critères.
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 ne souhaitez donner accès qu'à un programme spécifique.
Correspondant à
Pour faire correspondre un ensemble d'utilisateurs, vous pouvez configurer SSH avec le
Match
mot clé. Dusshd_config(5)
manuel: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
ForceCommand
mot - clé. Dusshd_config(5)
manuel:Vous pouvez donc forcer la commande contrainte que vous souhaitez utiliser
ForceCommand <your command>
. Par exemple: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é:la source