ssh gitolite

ssh - ¿Cómo funcionan los programas como la gitolita?



gitolite (3)

Los pasos básicos son:

  1. Compruebe la clave pública de la persona que intenta iniciar sesión
  2. Asignar la clave pública a una lista de control de acceso

En otras palabras, para que estas cosas funcionen, debe obtener claves públicas de los usuarios y luego generar una lista (archivo, base de datos, lo que sea) que empareja una clave con un usuario y permisos.

Tengo curiosidad sobre cómo funcionan los programas como gitolite, específicamente cómo interactúan con el protocolo SSH para proporcionar una experiencia personalizada. ¿Alguien puede dar un ejemplo de cómo podría lograr algo como lo siguiente y dónde podría aprender más sobre este tema?

→ ssh [email protected] PTY allocation request failed on channel 0 Hi <username>! You''ve successfully authenticated, but GitHub does not provide shell access. Connection to github.com closed.

Una pregunta complementaria: mi idioma principal es JavaScript. ¿Es posible lograr lo que quiero con NodeJS?


Tenga en cuenta que sshd hace un escaneo lineal del archivo ~ / .ssh / authorized_keys. Una vez que obtienes alrededor de 3000 claves allí, las personas cuyas claves aparecen más adelante en el archivo comienzan a notar el retraso: comienza a ser más que un retraso en la red :-)

Esa es una razón por la cual github tiene su propia versión parcheada de sshd. ¡Tienen demasiados usuarios para poder gestionar con sshd normal!


gitolita en sí misma es una capa de autorización que no necesita ssh.
Solo necesita saber quién lo está llamando para autorizar o no a esa persona para que haga los comandos de git.

SSH se utiliza para la autenticación (pero también se puede usar un Http Apache para la autenticación, por ejemplo)

La forma en que gothicite es llamada por ssh se explica en " Gitolite y ssh ", y usa el comando forzado del mecanismo ssh:

El ~/.ssh/authorized_keys (en el servidor gitolite ssh) se ve así:

command="[path]/gitolite-shell sitaram",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA18S2t... command="[path]/gitolite-shell usertwo",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArXtCT...

Primero, descubre cuál de las claves públicas en este archivo coincide con el inicio de sesión entrante. Una vez que se ha encontrado la coincidencia, ejecutará el comando dado en esa línea ; por ejemplo, si me [path]/gitolite-shell sitaram , se ejecutará [path]/gitolite-shell sitaram .
Entonces, lo primero que hay que notar es que esos usuarios no obtienen "acceso de shell", ¡lo cual es bueno!

( comando forzado = sin sesión de shell interactiva : solo proporcionará un shell restringido , ejecutando solo un script, siempre el mismo)

Sin embargo, antes de ejecutar el comando, sshd configura una variable de entorno llamada SSH_ORIGINAL_COMMAND que contiene el comando git real que envió su estación de trabajo.
Este es el comando que se habría ejecutado si no tuviera el command= parte en el archivo de claves autorizadas.

Cuando gitolite-shell obtiene el control, mira el primer argumento (" sitaram ", " usertwo ", etc.) para determinar quién es usted. Luego mira la variable SSH_ORIGINAL_COMMAND para averiguar a qué repositorio desea acceder y si está leyendo o escribiendo.

Ahora que tiene un usuario, repositorio y acceso solicitado (lectura / escritura) , gitolite examina su archivo de configuración y permite o rechaza la solicitud.

El hecho de que authorized_keys llame a un script de Perl ( gitolite-shell ) es porque Gitolite está escrito en perl.
Podría muy bien llamar a un programa de JavaScript.

Si su ssh en GitHub sin ningún comando, recibirá un mensaje de saludo, como su mención en su pregunta.
Gitolite muestra un mensaje similar, como se detalla en la función print_version() del script del comando info :

sub print_version { chomp( my $hn = `hostname -s 2>/dev/null || hostname` ); my $gv = substr( `git --version`, 12 ); $ENV{GL_USER} or _die "GL_USER not set"; print "hello $ENV{GL_USER}, this is " . ($ENV{USER} || "httpd") . "/@$hn running gitolite3 " . version() . " on git $gv/n"; }

El mensaje se ve así:

hello admin, this is git@server running gitolite3 v3.0-12-ge0ed141 on git 1.7.3.4

La documentación de Gitolite a finales de 2013 ahora incluye ese diagrama que resume todas las piezas: