Existe-t-il un moyen de configurer un utilisateur sur une machine Linux (Centos 5.2 dans ce cas) de sorte qu'il puisse utiliser scp pour récupérer des fichiers, mais ne puisse pas se connecter au serveur à l'aide de SSH?
Existe-t-il un moyen de configurer un utilisateur sur une machine Linux (Centos 5.2 dans ce cas) de sorte qu'il puisse utiliser scp pour récupérer des fichiers, mais ne puisse pas se connecter au serveur à l'aide de SSH?
Réponses:
Le shell rssh ( http://pizzashack.org/rssh/ ) est conçu précisément à cette fin.
RHEL / CentOS 5.2 n'incluant pas de package pour rssh, vous pouvez rechercher ici un fichier RPM: http://dag.wieers.com/rpm/packages/rssh/
Pour l'utiliser, définissez-le simplement comme un shell pour un nouvel utilisateur, comme ceci:
useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1
..ou changer le shell pour un existant comme ceci:
chsh -s /usr/bin/rssh scpuser1
..et modifier /etc/rssh.conf
pour configurer le shell rssh - en particulier la allowscp
ligne de suppression du commentaire pour permettre l'accès SCP à tous les utilisateurs rssh.
(Vous pouvez également utiliser chroot pour que les utilisateurs restent dans leur maison, mais c'est une autre histoire.)
Je suis bien en retard mais vous pouvez utiliser les clés ssh et spécifier la commande exacte autorisée dans leur fichier ~ / .ssh / registered_keys, par exemple
no-port-forwarding, no-pty, commande = "cible source scp" ssh-dss ...
Vous devrez peut-être utiliser ps sur la cible pour définir les bons paramètres de commande.
PS: Si vous exécutez une commande de test scp avec "-v", vous pouvez voir quelque chose comme ceci.
debug1: Sending command: scp -v -t myfile.txt
Vous remarquerez que "-t" est une option scp non documentée, utilisée par le programme à l'extrémité distante. Cela vous donne une idée de ce que vous devez mettre dans allowed_keys.
EDIT: Vous pouvez trouver plus d'informations (avec plusieurs liens) dans cette question de StackOverflow .
Voici un exemple de travail pour un utilisateur nommé backup_user
côté serveur.
~backup_user/.ssh/authorized_keys
contenu côté serveur (avec quelques restrictions de sécurité supplémentaires):
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...
Créez un lien dans ~ backup_user / qui renvoie au répertoire où le contenu devrait être accessible.
$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT
Maintenant, côté client, la commande suivante devrait fonctionner:
scp -v -r -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT
Que fait cette commande:
-v
fichier à la fois de la commande et du fichier allowed_keys)-r
à la fois les fichiers de la commande et les Commande_ authorisés si vous ne souhaitez pas faire de copie récursive)-P 2222
de la commande)-i .ssh/id_rsa_key_file
path/to/data
sera copié dans/path/to/directory/with/accessible/content/
Pour faire une copie d'un fichier (ou de plusieurs) du serveur vers le client, vous devez créer un script shell qui le gère comme décrit ici.
chmod 400 ~/.ssh/authorized_keys
.
~/.bashrc
(et tout ce que Bash exécute) et en ~/.ssh/rc
lecture seule. Mais si l'utilisateur malveillant a accès à rsync ou à sftp, il peut toujours supprimer ~/.bashrc
et en télécharger un nouveau. Comme il est difficile de protéger, je déconseille cette méthode ( command="..."
).
Je suis un peu en retard pour la fête, mais je vous suggère de jeter un coup d'œil à la ForceCommand
directive d'OpenSSH.
Subsystem sftp internal-sftp
Match group sftponly
ForceCommand internal-sftp
Certes, il s'agit de SFTP et non de SCP, mais le même objectif est atteint, de manière plus sécurisée qu'avec un shell restreint. De plus, vous pouvez chrooter l'utilisateur si vous le souhaitez.
chrootDirectory %h
et AllowTcpForwarding no
après la section de match pour forcer les utilisateurs à chrooter à leur domicile. veuillez noter que la correspondance doit (doit!) être la dernière section de la configuration ssh et que les options qui suivent ne sont que des options
ForceCommand internal-sftp -u 0077 -d /uploaddir
peut le renforcer, en forçant un umask sur un répertoire de téléchargement. En conjonction avec «ChrootDirectory», il crée un environnement de téléchargement isolé et très contrôlé. Note bonus: le répertoire par défaut et le masque umask doivent être définis ForceCommand
dans la Subsystem
directive, et non dans la directive, si vous souhaitez qu'ils fonctionnent.
Je recommanderais d'utiliser scponly.
C'est un shell restreint qui permet aux utilisateurs de faire exactement ce que cela ressemble, de fichiers SCP au serveur, mais pas de se connecter. Les téléchargements d'informations et de code source du logiciel sont disponibles ici et les packages RPM précompilés sont disponibles via le Dépôts EPEL YUM .
Une fois installé, vous devrez configurer chaque compte d'utilisateur, auquel vous souhaitez restreindre l'accès, pour utiliser le shell restreint nouvellement installé. Vous pouvez le faire manuellement via / etc / passwd ou utiliser la commande suivante: usermod -s /usr/bin/scponly USERNAME
scponly
est CONÇU exactement à cette fin.
J'utilise MySecureShell pour le faire. Vous pouvez également configurer d'autres restrictions.
https://github.com/mysecureshell/mysecureshell
Limite les connexions à SFTP / SCP uniquement. Pas d'accès shell.
Très tard pour la fête, mais définissez simplement le shell de l'utilisateur git sur / usr / bin / git-shell. C'est un shell restreint qui n'autorise pas la connexion interactive. Vous pouvez toujours utiliser l'utilisateur 'su -s / bin / bash git' ou quel que soit votre nom d'utilisateur git.
J'ai trouvé un bon moyen d'utiliser la fonction command = "..." du fichier allowed_keys. (Suggéré par cette page )
La commande que vous exécuteriez serait celle qui testerait les arguments commençant par scp (et rsync).
Voici le fichier authorised_keys:
# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew
Voici le contenu de remote-cmd.sh:
#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
'rsync'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Access Denied"
;;
esac
J'imagine que vous auriez probablement encore besoin de protéger le fichier employee_keys de l'utilisateur, mais mon objectif était de disposer d'une clé sans mot de passe que je pourrais utiliser pour les sauvegardes, sans avoir à créer un nouvel utilisateur et à ne pas donner la clé à un shell. (ok, facilement)
~/.ssh/authorized_keys
, ~/.bashrc
(et tout autre Bash exécute) et en ~/.ssh/rc
lecture seule pour l'utilisateur. Mais si l'utilisateur malveillant a accès à rsync ou à sftp, il peut toujours supprimer ~/.bashrc
et en télécharger un nouveau. Comme il est difficile de protéger, je déconseille cette méthode ( command="..."
).
Changez le shell de connexion de l'utilisateur en quelque chose de restrictif, qui ne permet à l'utilisateur que de scp , sftp-server et rsync uniquement, et vérifie également que les arguments non sécurisés ne sont pas autorisés (par exemple scp -S ... et rsync -e .. . ne sont pas sécuritaires, voir ici: http://exploit-db.com/exploits/24795 ). Exemple pour un tel shell de connexion restrictif:
Vous voudrez peut-être exécuter l'un de ces éléments dans un chroot ou dans un autre environnement restreint (par exemple, nsjail sous Linux), pour désactiver l'accès réseau et pour contrôler plus facilement (sur liste blanche) les répertoires pouvant être lus et / ou écrits.
Je ne recommande pas d'utiliser command="..."
in ~/.ssh/authorized_keys
, car sans protection supplémentaire prudente (par exemple chmod -R u-w ~
pour l'utilisateur), un utilisateur malveillant peut télécharger une nouvelle version de ~/.ssh/authorized_keys
, ~/.ssh/rc
ou ~/.bashrc
, et peut donc inclure et exécuter des commandes arbitraires.
Ce n'est pas la solution la plus gracieuse, mais vous pouvez jeter quelque chose comme ça dans les utilisateurs .bashrc
if [ "$TERM" != "dumb" ]; then
exit
fi
J'ai constaté que les utilisateurs de SCP obtenaient un TERM de "stupide", et que les autres recevaient généralement vt100.
J'imagine que l'utilisateur pourrait probablement utiliser un nouveau fichier .bashrc, ce qui fait que ce n'est pas la meilleure solution, mais pour une solution rapide et sale, cela fonctionnera
~/.bashrc
). C'est également flasque en ce sens que les nouvelles versions d'OpenSSH définiraient peut-être la TERM
variable différemment, ou que certains paramètres de configuration de sshd pourraient l'affecter TERM
.
ssh -o SetEnv TERM=dumb yourserver bash
??