J'ai installé jailkit
sur Ubuntu 12.04
et j'ai configuré le shell d'un utilisateur sur /bin/bash
– mais lorsqu'il est appelé, il exécute /etc/bash.bashrc
au lieu de /etc/profile
Si vous n'avez pas utilisé jailkit
avant en voici l'essentiel :
- Une version "emprisonnée" de la racine système est créée quelque part, comme /home/jail
- Les répertoires personnels des utilisateurs emprisonnés sont déplacés dans ce dossier comme /home/jail/home/testuser
- Les fichiers de configuration relatifs sont copiés dans /home/jail/etc/ – y compris un /etc/passwd limité
- Les programmes auxquels vous souhaitez autoriser l'accès sont copiés dans les répertoires correspondants, comme
/bin/bash - Lorsqu'un utilisateur emprisonné se connecte, il est chrooté sur /etc/jail/ et ne peut voir aucun fichier au-dessus
J'ai donc un testuser
qui a une entrée dans /etc/passwd
comme ceci :
testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh
Dans le fichier /home/jail/etc/passwd
il y a une entrée comme :
testuser:1001:1003::/home/testuser:/bin/bash
J'ai lu le bash(1)
et donc je pense que le problème est que bash pense qu'il n'est pas invoqué en tant que shell de connexion :
Lorsque bash est appelé en tant que shell de connexion interactif ou en tant que shell non interactif avec l'option –login, il lit et exécute d'abord les commandes à partir du fichier
/etc/profile, si ce fichier existe.
Je reçois ce bash
est en fait invoqué par /usr/sbin/jk_chrootsh
mais je ne comprends pas comment bash
détermine de quel type de shell il s'agit et quel ensemble de fichiers de démarrage il doit exécuter.
J'aimerais voir si je peux résoudre ce problème, mais je ne comprends pas :
Comment bash sait-il comment il est invoqué ?
ps :j'ai également examiné login(1)
sans beaucoup de chance.
Réponse acceptée :
Normalement, bash sait qu'il s'agit d'un shell de connexion car lorsque le programme de connexion l'invoque, il indique à bash que son nom est -bash
. Ce nom est dans argv[0]
, l'argument zéro de la ligne de commande, qui est classiquement la façon dont l'utilisateur a appelé le programme. Le trait d'union initial est une convention pour indiquer à un shell qu'il s'agit d'un shell de connexion. Bash se comporte également comme un shell de connexion si vous lui passez l'option --login
ou -l
. Voir la différence entre le shell de connexion et le shell sans connexion ? pour plus de détails.
Depuis Jailkit 2.16, jk_chrootsh
lit le chemin absolu vers le shell à invoquer à partir de diverses sources et passe ce chemin sous la forme argv[0]
, et transmet ses propres arguments de ligne de commande à ce shell. Dans le cas d'utilisation normal où jk_chrootsh
est lui-même utilisé dans /etc/passwd
, il n'y a aucun moyen de passer un argument tel que -l
. Puisque le chemin absolu ne commence pas par -
, il n'y a aucun moyen de faire jk_chrootsh
appeler un shell de connexion, sans utiliser un petit programme intermédiaire.
#include <unistd.h>
int main () {
execl("/bin/bash", "-bash", NULL);
return 127;
}
Je m'attendais à jk_chrootsh
pour avoir un moyen simple d'invoquer un shell de connexion. Je suggère de faire une demande de fonctionnalité.