Transférer des informations sur la connexion du serveur ssh vers le serveur ssh

Supposons que j'ai la session ssh suivante:

userA@boxA -> userB@boxB -> userC@boxC 

Maintenant, de boxC , en tant userC , j'aimerais avoir l'information selon laquelle la connexion ssh venait de userB@boxB qui, à son tour, provenait de userA@boxA .

Maintenant, j'ai la session ssh suivante avec la première session ssh:

 userD@boxD -> userB@boxB 

De boxB , en tant userB , j'aimerais avoir l'information selon laquelle la connexion userD@boxD de userD@boxD et qu'il y a une seconde session ssh provenant de userA@boxA .

Cette information est-elle disponible et accessible en tant qu'utilisateur? Est-ce qu'il est même disponible?

Sinon, existe-t-il un moyen "facile" de rendre cette information disponible? Avec facilité je veux dire sans piratage et recompilation de sshd, et sans avoir à avoir accès à la racine sur les machines.

La manière officielle d'envoyer des variables d'environnement de client à serveur est via SendEnv et AcceptEnv . Le problème est que vous avez besoin d'accès root sur le serveur pour configurer AcceptEnv . La plupart des serveurs sont configurés pour accepter pas seulement quelques variables prédéterminées.

J'ai trouvé deux astuces pour envoyer des variables d'environnement du client au serveur, les deux fonctionnent sans nécessiter d'accès root sur le serveur.

Trick one:

 ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME bash 

Cela se connecter au serveur, puis exécuter la commande SSH_ORIGIN=$USERNAME@$HOSTNAME bash , avec $USERNAME et $HOSTNAME déjà remplacé du côté client. Ensuite, du côté du serveur, vous pouvez continuer à traiter les informations contenues dans la variable SSH_ORIGIN .

Le -t est nécessaire, sinon, bash sera démarré sur le serveur sans t tt (essayez, vous verrez).

Une légère modification permettra de transmettre l'information de manière transitive sur une chaîne ssh plus longue.

 ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN bash 

discussion:

  • Bash est démarré comme un shell interactif sans connexion ( .profile n'est pas lu).
  • Bash est exécuté deux fois ( .bashrc est lu deux fois). Une fois par sshd et une fois par la commande de l'utilisateur.
  • Il commencera toujours bash, en ignorant votre shell par défaut sur le serveur.

Truc deux:

D'abord, vous devez générer une clé ssh et transférer celle-ci sur ~/.ssh/authorized_keys sur le serveur. Puis déplacez la ligne avec la command="$SHELL" . Consultez la page de manuel sshd pour plus d'informations à ce sujet.

Connectez-vous au serveur ssh en utilisant la commande:

 ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME 

Cela se connectera au serveur mais cette fois, l'affectation des variables n'est pas exécutée. À la place, la chaîne est stockée dans la variable d'environnement $SSH_ORIGINAL_COMMAND . Alors la commande fournie dans ~/.ssh/authorized_keys est exécutée. Une fois que vous êtes dans la coquille, vous pouvez traiter les informations contenues dans $SSH_ORIGINAL_COMMAND .

Comme ci-dessus, vous pouvez faire ce transitif:

 ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN 

discussion:

  • Il démarrera le shell par défaut sur le serveur.
  • Il démarrera toujours le shell par défaut sur le serveur. Toute commande que vous donnez à la commande ssh sera ignorée et stockée dans $SSH_ORIGINAL_COMMAND . Si vous souhaitez exécuter une commande sur ssh, vous pouvez utiliser une clé ssh différente ou avoir votre fichier d'initialisation de shell pour détecter et exécuter $SSH_ORIGINAL_COMMAND .

La commande who vous dit qui d'autre est connecté maintenant sur la même machine et d'où ils ont ouvert une session. La last commande donne les mêmes informations pour les sessions passées. Selon la configuration de la machine et les méthodes de connexion, les informations peuvent ne pas être complètes, mises à jour ou disponibles pour les utilisateurs non-root.

Dans votre scénario A @ A-> B @ B-> C @ C, il est impossible pour la machine C de savoir que B @ B a été connecté à B via une session ssh de A. Dans les années 1980, lorsque tout le monde a fait confiance à tout le monde, vous Aurait pu essayer le finger ou l' ident , mais ces jours-ci, la machine B ne devrait même pas jouer un doigt ou un dieu ident.

Je pense que vous pourriez forcer une variable d'environnement sur hostB à écrire l'adresse de hostA. Ensuite, sur hostC, utilisez AcceptEnv pour obtenir l'environnement de hostB, voila 🙂

Lisez sshd_config un peu, des pièces concernant des éléments environnementaux.

De la case C, sans accès à la case B, vous ne pourrez pas dire que l'utilisateur est venu de la case A. En fait, il se peut que vous ne puissiez pas indiquer comment l'utilisateur est arrivé à l'encadré C. Cela dépend simplement de la façon dont L'administrateur a configuré les choses.

Même réponse pour la question «supposons plus». Cela dépend des autorisations que l'administrateur système vous a données et des programmes qu'il a installés.

Commandes importantes qui vous aideront si vous aviez des autorisations (mais vous ne l'avez probablement pas):

 finger - http://www.manpagez.com/man/1/finger/ last - http://www.manpagez.com/man/1/last/