Node:El servidor de autentificación de contraseñas, Next:, Previous:Iniciando un repositorio, Up:Administración del Repositorio



El servidor de autentificación de contraseñas

Antes de seguir los pasos necesarios para configurar el servidor de contraseñas vamos a examinar cómo funcionan este tipo de conexiones en teoría. Cuando un cliente remoto CVS usa el método :pserver: para conectarse a un repositorio, el cliente está contactando en realidad con un número de puerto específico en la máquina servidora - en concreto el número de puerto 2401 (que es 49 al cuadrado, si le interesan este tipo de cosas). El puerto 2401 es el puerto designado por defecto para el servidor pserver de CVS, aunque se podría configurar para usar un puerto diferente siempre que el cliente y el servidor estén de acuerdo en ello.

El servidor CVS en realidad no está esperando conexiones a ese puerto - el servidor no empezará hasta que realmente llegue una conexión. En vez de ello, el programa Unix "inetd" (InterNET Daemon) está escuchando en ese puerto, y necesita saber que cuando reciba una petición de conexión ahi, debería iniciar el servidor CVS y conectarlo al cliente entrante.

Esto se consigue modificando los ficheros de configuración de inetd: /etc/services y /etc/inetd.conf. El fichero de servicios asigna números de puerto a nombres de servicios e inetd.conf le dice a inetd qué hacer para un nombre de servicio dado.

Primero ponga una línea como ésta en /etc/services (después de asegurarse de que la línea no existe ya):

cvspserver	2401/tcp

Luego, escriba esto en /etc/inetd.conf:

cvspserver stream tcp nowait root /usr/local/bin/cvs cvs \
   --allow-root=/usr/local/nuevorepos pserver

(En el fichero real, esto deberá ser una única línea larga, sin barra inversa \). Si su sistema usa una envoltura de TCP ("tcp wrapper", N. del T.), puede que quiera usar algo como esto en vez de lo anterior:

cvspserver stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/cvs \
   --allow-root=/usr/local/nuevorepos pserver

Ahora reinicie inetd para que tenga en cuenta los cambios en sus ficheros de configuración (si no sabe cómo reiniciar el demonio, simplemente reinicie la máquina - esto también funcionará).

Esto es suficiente para permitir conexiones, pero también querrá configurar contraseñas especiales de CVS - separadas de las contraseñas de login de los usuarios - de modo que la gente pueda acceder al repositorio sin poner en peligro la seguridad general del sistema.

El fichero de contraseñas de CVS es CVSROOT/passwd en el repositorio. No se creó por defecto cuando ejecutó cvs init, porque CVS no sabe seguro si usará pserver. Incluso si el fichero de contraseñas se ha creado, CVS no tendrá forma de saber los nombres de usuario y contraseñas a crear. Así que usted tendrá que crear uno por sí mismo; aquí hay una muestra de fichero CVSROOT/passwd:

kfogel:rKa5jzULzmhOo
anonymous:XR4EZcEs0szik
melissa:tGX1fS8sun6rY:pubcvs

El formato es tan simple como parece. Cada línea es:

<NOMBREUSUARIO>:<CONTRASEÑA_CIFRADA>:<NOMBREUSUARIO_SISTEMA_OPCIONAL>

Los dos puntos adicionales seguidos de un nombre de usuario de sistema opcional le dicen a CVS que las conexiones autentificadas con NOMBREUSUARIO deberían ejecutarse como la cuenta de sistema NOMBREUSUARIO_SISTEMA - en otras palabras, que la sesión CVS sólo sería capaz de hacer en el repositorio las cosas que alguien conectado como NOMBREUSUARIO_SISTEMA podría hacer.

Si no se da un nombre de usuario de sistema, NOMBREUSUARIO deberá coincidir con un nombre de cuenta real del sistema, y la sesión se ejecutará con los permisos de ese usuario. En cualquier caso, la contraseña cifrada no debería ser la misma que la contraseña real de acceso del usuario. Debería ser una contraseña independiente usada sólo para conexiones a CVS pserver.

La contraseña se cifra usando el mismo algoritmo que las contraseñas estándar de Unix, almacenadas en /etc/passwd. Puede que se pregunte en este punto, ¿cómo se consigue una versión cifrada de una contraseña? Para las contraseñas de sistema Unix, la orden passwd se encarga del cifrado en /etc/passwd por usted. Por desgracia no hay una orden equivalente a passwd en cvs (se ha propuesto varias veces, pero nadie se ha puesto a escribirlo - ¿lo hará usted. quizá?).

Esto es un inconveniente, pero sólo pequeño. Si no hay otra opción, siempre podrá cambiar temporalmente la contraseña de sistema de un usuario usando passwd, copiar y pegar el texto cifrado de /etc/passwd en CVSROOT/passwd, y restaurar la antigua contraseña (en ciertos sistemas las contraseñas cifradas se encuentran en /etc/shadow y sólo el administrador o root puede leerlas.)

Este proceso es factible pero bastante incómodo. Sería mucho más fácil tener una utilidad de línea de órdenes que tomara una contraseña en texto plano como su argumento y diera como salida la versión cifrada. Aquí está esa herramienta, escrita en Perl:

#!/usr/bin/perl

srand (time());
my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";
my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);
my $plaintext = shift;
my $crypttext = crypt ($plaintext, $salt);

print "${crypttext}\n";

Yo guardo el guión anterior en /usr/local/bin/cryptout.pl:

floss$ ls -l /usr/local/bin/cryptout.pl

-rwxr-xr-x   1   root   root   265  Jun 14 20:41 /usr/local/bin/cryptout.pl
floss$ cryptout.pl "some text"
sB3A79YDX5L4s

floss$

Si usara la salida de este ejemplo para crear la siguiente entrada en CVSROOT/passwd

jluis:sB3A79YDX5L4s:craig

entonces la gente podría conectarse al repositorio con la siguiente orden:

remote$ cvs -d :pserver:jluis@floss.red-bean.com:/usr/local/nuevorepos login

Escribirían entonces some text como contraseña y a partir de entonces podrían ejecutar órdenes CVS con los mismos privilegios de acceso que el usuario de sistema craig.

Si alguien intenta autentificarse con un nombre de usuario y contraseña que no aparecen en CVSROOT/passwd, CVS comprobará si ese nombre de usuario y contraseña están presentes en /etc/passwd. Si lo están (y si la contraseña coincide, por supuesto), CVS proporcionará el acceso. Se comporta de esta forma para comodidad del administrador, para no tener que añadir entradas a CVSROOT/passwd por separado para los usuarios comunes del sistema. Sin embargo, este comportamiento también es un agujero de seguridad, porque significa que si uno de esos usuarios se conecta al servidor CVS, su contraseña de acceso al sistema circulará por la red en texto claro, potencialmente vulnerable a los ojos de husmeadores de contraseñas. Un poco más adelante, aprenderá cómo desactivar este comportamiento "problemático", para que CVS consulte sólo su propio fichero passwd. Tanto si lo deja activado o desactivado, probablemente debería obligar a los usuarios de CVS que también tengan cuentas en el sistema a mantener contraseñas distintas para las dos funciones.

Aunque el fichero passwd autentifica para todo el repositorio, con un poco de trabajo adicional podrá usarlo incluso para proporcionar acceso específico de proyecto. Aquí hay un método:

Suponga que quiere proporcionar acceso a algunos desarrolladores remotos al proyecto foo, y a otros acceso al proyecto bar, y no quiere que los desarrolladores de un proyecto tengan acceso al envío de cambios al otro. Puede conseguir esto creando cuentas de usuario y grupos específicos de proyecto en el sistema y luego referirse a esas cuentas en el fichero CVSROOT/passwd.

Aquí está el extracto relevante de /etc/passwd en cuestión

cvs-foo:*:600:600:Cuenta Pública CVS para el Proyecto Foo:/usr/local/cvs:/bin/false
cvs-bar:*:601:601:Cuenta Pública CVS para el Proyecto Bar:/usr/local/cvs:/bin/false

y de /etc/group

cvs-foo:*:600:cvs-foo
cvs-bar:*:601:cvs-bar

y, finalmente, CVSROOT/passwd:

kcunderh:rKa5jzULzmhOo:cvs-foo
jmankoff:tGX1fS8sun6rY:cvs-foo
brebard:cAXVPNZN6uFH2:cvs-foo
xwang:qp5lsf7nzRzfs:cvs-foo
dstone:JDNNF6HeX/yLw:cvs-bar
twp:glUHEM8KhcbO6:cvs-bar
ffranklin:cG6/6yXbS9BHI:cvs-bar
yyang:YoEqcCeCUq1vQ:cvs-bar

Algunos de los nombres de usuario de CVS se refieren a las cuentas de usuario de sistema cvs-foo y otras a cvs-bar. Dado que CVS se ejecuta bajo la ID de usuario de la cuenta de sistema, simplemente tendrá que asegurarse de que en las partes de interés del repositorio sólo pueden escribir los usuarios y grupos adecuados. Si se asegura de que las cuentas de usuario de sistema estén bien atadas (sin contraseña de acceso al sistema válida, con /bin/false como shell), el sistema será razonablemente seguro (¡pero mire más adelante en este capítulo acerca de los permisos CVSROOT!). Además, CVS registra los cambios e informes de cambios bajo el nombre de usuario de CVS, no bajo el nombre de usuario de sistema, así que usted podrá saber quién es responsable de un cambio dado.