8.8. Autentificación con PPP

Con el PPP, cada sistema puede obligar al otro ordenador a identificarse usando uno de los dos protocolos de autentificación disponibles. Estos son el Protocolo de Autentificación por Contraseña (PAP), y el Protocolo de Autentificación por Reto (CHAP). Cuando se establece una conexión, cada extremo puede pedir al otro que se autentifique, independientemente de que sea el llamante o el llamado. Más adelante, utilizaré relajadamente “cliente” y “servidor” cuando quiera distinguir entre el sistema autentificado y el autentificador. Un demonio PPP puede pedir a la otra máquina autentificación enviando otra petición más de configuración de LCP indicando el protocolo de autentificación deseado.

8.8.1. PAP frente a CHAP

PAP, que es utilizado por muchos proveedores de Internet (ISP), funciona básicamente de la misma forma que el procedimiento normal de registro. El cliente se autentifica a sí mismo enviando un nombre de usuario y una contraseña (opcionalmente encriptada) al servidor, la cual es comparada por el servidor con su base de datos de claves o secrets. [1] Esta técnica es vulnerable a los intrusos que pueden intentar obtener la contraseña escuchando en una línea serie y a otros que hagan sucesivos intentos de ataque por el método de prueba y error.

CHAP no tiene estos defectos. Con CHAP, el autentificador (i.e. el servidor) envía una cadena de “reto” generada aleatoriamente al cliente, junto a su nombre de ordenador. El cliente utiliza el nombre del ordenador para buscar la clave apropiada, la combina con el reto, y encripta la cadena utilizando una función de codificación de un solo sentido. El resultado es devuelto al servidor junto con el nombre del ordenador cliente. El servidor realiza ahora la misma computación, y advierte al cliente si obtiene el mismo resultado.

Otra característica de CHAP es que no solicita autentificación al cliente solamente al comienzo de la sesión, sino que envía retos a intervalos regulares para asegurarse de que el cliente no ha sido reemplazado por un intruso, por ejemplo cambiando la línea telefónica, o debido a una configuración errónea del módem que causa que el demonio PPP no se perciva que la llamada original de teléfono se ha cortado y algún otro se ha conectado.

El pppd mantiene las claves secretas para el CHAP y el PAP en dos ficheros separados, llamados /etc/ppp/pap-secrets y /etc/ppp/chap-secrets respectivamente. Si introduce un ordenador remoto en alguno de los dos ficheros, tendrá un buen control de cual de los protocolos CHAP o PAP se utilizará para autentificarnos con él y viceversa.

Por omisión, pppd no pide autentificación al ordenador remoto, pero aceptará el autentificarse a sí mismo cuando se lo pida el ordenador remoto. Como CHAP es mucho más fuerte que PAP, el pppd intenta usar el anterior siempre que es posible. Si el otro ordenador no lo acepta, o pppd no encuentra una clave CHAP para el sistema remoto en su fichero chap-secrets, cambia al PAP. Si tampoco tiene clave PAP para su compañero, renunciará a autentificarse. Como consecuencia de esto, se cerrará la conexión.

Este comportamiento puede ser modificado de varias formas. Por ejemplo, cuando se añade la palabra auth, pppd solicitará al otro ordenador que se autentifique. pppd aceptará el uso de CHAP o PAP para ello, siempre y cuando tenga una clave para su compañero en su base de datos CHAP o PAP respectivamente. Hay otras opciones para activar o no un determinado protocolo de autentificación, pero no las describiré aquí. Puede leer la página de manual del pppd(8) para más detalles.

Si todos los sistemas con los que conversa PPP están de acuerdo en autentificarse con usted, debería poner la opción auth en el fichero global /etc/ppp/options y definir contraseñas para cada sistema en el fichero chap-secrets. Si un sistema no acepta CHAP, añada una entrada para él al fichero pap-secrets. De esta forma, puede asegurarse de que ningún sistema sin autentificar se conecta a su ordenador.

Las dos secciones siguientes hablan sobre los dos ficheros de claves de PPP, pap-secrets y chap-secrets. Están situados en /etc/ppp y contienen tripletes de clientes, servidores y contraseñas, seguidas opcionalmente por una lista de direcciones IP. La interpretación de los campos de servidor y cliente es distinta en CHAP y PAP, y también depende de si nos autentificamos nosotros con el otro ordenador, o si solicitamos al servidor que se autentifique con nosotros.

8.8.2. El fichero de claves CHAP

Cuando tiene que autentificarse con algún servidor utilizando CHAP, pppd busca en el fichero chap-secrets una entrada cuyo campo de cliente sea igual al nombre del ordenador local, y cuyo campo de servidor sea igual al nombre del ordenador remoto enviado en el reto del CHAP. Cuando solicita a la otra máquina que se autentifique, los roles son simplemente al revés: el pppd entonces buscará una entrada que tenga el campo de cliente igual al nombre del ordenador remoto (enviado en la respuesta del CHAP del cliente), y el campo de servidor igual al nombre del ordenador local.

El siguiente es un fichero de ejemplo de chap-secrets para vlager:[2]

    # CHAP secrets for vlager.vbrew.com
    #
    # client         server           secret                addrs
    #---------------------------------------------------------------------
    vlager.vbrew.com  c3po.lucas.com   "Use The Source Luke" vlager.vbrew.com
    c3po.lucas.com    vlager.vbrew.com "arttoo! arttoo!"     c3po.lucas.com
    *                 vlager.vbrew.com "TuXdrinksVicBitter"  pub.vbrew.com

Cuando se intenta establecer una conexión PPP con c3po, c3po pide a vlager que se autentifique usando el CHAP mediante el envío de un reto de CHAP. El demonio pppd entonces examina chap-secrets buscando una entrada cuyo campo de cliente sea igual a vlager.vbrew.com y el campo de servidor sea c3po.lucas.com, y encuentra la primera línea mostrada en el ejemplo.[3] Entonces produce la respuesta de CHAP a partir de la cadena del reto y la clave (Use The Source Luke), y la envía de vuelta a c3po.

Al mismo tiempo, pppd produce un reto del CHAP para c3po, conteniendo una única cadena de reto y su nombre de ordenador completo vlager.vbrew.com. c3po construye una respuesta de CHAP de la manera que acabamos de decir, y se la devuelve a vlager. pppd extrae ahora el nombre del cliente (c3po.vbrew.com) de la respuesta, y busca en el fichero chap-secrets una línea que tenga c3po como cliente y vlager como servidor. La segunda línea se corresponde con esto, así que el pppd combina el reto del CHAP y la clave arttoo! arttoo!, las encripta, y compara el resultado con la respuesta de CHAP de c3po.

El cuarto campo opcional lista las direcciones IP que son aceptables por los clientes nombrados en el primer campo. Las direcciones pueden ser dadas en notación cuaternaria o como nombres de ordenador que son resueltos posteriormente. Por ejemplo, si c3po solicita usar una dirección IP que no estáa en esta lista durante la negociación IPCP, la petición será rechazada, e IPCP se desconectará. En el fichero de ejemplo anterior, c3po está limitado a poder usar sólo su propia dirección. Si el campo de dirección está vacío, se permitirá cualquier dirección; un valor de “-” evita el uso de una cierta dirección IP con un cliente.

La tercera línea del fichero chap-secrets de prueba, permite a cualquier ordenador establecer un enlace PPP con vlager, pues si aparece la expresión * en los campos de cliente o servidor, será valido cualquier nombre. El único requisito es que sepa la clave, y utiliza la dirección de pub.vbrew.com. Pueden aparecer perfectamente entradas con comodines en los nombres en cualquier lugar del fichero de claves, pues el pppd siempre utilizará la entrada más específica que pueda ser aplicada a un par cliente/servidor.

Hay algunas cosas que decir sobre la manera en que pppd encuentra los nombres de ordenadores que busca en el fichero de claves. Como se explicó anteriormente, el nombre del ordenador remoto es siempre proporcionado por el otro ordenador en el paquete de reto o respuesta del CHAP. El nombre del ordenador local será obtenido por omisión llamando a la función gethostname(2). Si ha configurado el nombre del sistema como el nombre del ordenador sin calificar, entonces tendrá que dar al pppd el nombre del dominio a añadir usando la opción domain:
    # pppd … domain vbrew.com

Esto añadirá el nombre del dominio de la Cervecera a vlager para todas las actividades relacionadas con la autentificación. Otras opciones que modifican la idea que tiene el pppd del nombre del ordenador local son usehostname y name. Cuando da la dirección IP local en la línea de comando usando local:remote y local es un nombre en vez de un cuarteto numérico, el pppd utilizará éste como el nombre local.

8.8.3. El fichero de claves PAP

El fichero de claves PAP es muy similar al utilizado por CHAP. Los dos primeros campos siempre contienen un nombre de usuario y un nombre de servidor; el tercero alberga la clave PAP. Cuando el sistema remoto envía una petición de autentificación, pppd usa la entrada en la que el campo de servidor es igual al nombre del ordenador local, y el campo de usuario igual al nombre de usuario enviado en la petición. Cuando se autentifica a sí mismo al otro ordenador, pppd toma la clave a enviar de la línea con el nombre de usuario igual al nombre del usuario local, y con el campo de servidor igual al nombre del ordenador remoto.

Un fichero de claves PAP sencillo puede parecerse a éste:
    # /etc/ppp/pap-secrets
    #
    # user          server          secret          addrs
    vlager-pap      c3po            cresspahl       vlager.vbrew.com
    c3po            vlager          DonaldGNUth     c3po.lucas.com

La primera línea se usa para autentificarnos a nosotros mismos cuando hablemos con c3po. La segunda línea describe como un usuario llamado c3po tiene que autentificarse con nosotros.

El nombre vlager-pap de la primera columna es el nombre de usuario que nosotros mandamos a c3po. POr omisión,pppd tomará el nombre del ordenador local como el nombre de usuario, pero también se puede especificar un nombre diferente usando la opción user, seguida del nombre deseado.

Para escoger una de las entradas del fichero pap-secrets para la autentificación con el compañero, pppd tiene que saber el nombre del ordenador remoto. Como no tiene manera de averiguarlo, tiene que especificarlo en la línea de órdenes usando la palabra remotename, seguida por el nombre del ordenador remoto. Por ejemplo, para usar la entrada comentada anteriormente para la autentificación con c3po, tenemos que añadir la siguiente opción a la línea de órdenes del pppd:
    # pppd ... remotename c3po user vlager-pap

En el cuarto campo (y todos los siguientes), puede especificar qué direcciones IP están permitidas para ese ordenador particular, de la misma forma que en el fichero de claves CHAP. El otro ordenador solo podrá pedir direcciones de esa lista. En el fichero de ejemplo, la entrada que c3po usará cuando llame a la linea donde c3po es el cliente, le permitirá usar su IP auténtica y no otra.

Dése cuenta de que PAP es un método de autentificación bastante débil, y se recomienda utilizar el CHAP siempre que sea posible. Por eso, no explicaremos el PAP en gran profundidad aquí; si esta interesado en utilizar el PAP, encontrará algunas características más de éste comentadas en la página del manual del pppd(8).

Notas

[1]

“secrets” es sólo el nombre que da PPP a las contraseñas. Las contraseñas de PPP no tienen las mismas limitaciones de tamaño que las contraseñas de registro de Linux.

[2]

Las comillas no son parte de la contraseña, simplemente sirven para proteger el espacio en blanco del interior de la contraseña.

[3]

Este nombre de ordenador se toma del reto de CHAP.