¿Nginx admite la autenticación LDAP?

10

¿Nginx admite la autenticación ldap? Acabo de migrar de Apache y me gustaría mover todas mis autenticaciones basadas en openldap y mod_auth_ldap a nginx. Avísame si eso es posible.

Desde esta página que enumera todos los módulos que tiene nginx, no veo ninguna mención sobre LDAP. Gracias,

Adam Benayoun
fuente

Respuestas:

6

nginx no hace LDAP: debe usar xsendfileun script de terceros que cree para manejar la autenticación LDAP

http://wiki.nginx.org/NginxXSendfile

Miguel
fuente
¿Cómo responde eso a mi pregunta? Específicamente quiero hablar con ldap directamente.
Adam Benayoun
3
nginx no hace ldap .. tienes que usar xsendfile con un script de terceros que creas para manejar la autenticación ldap
Mike
6

Hay un módulo de terceros nginx-auth-ldapque puede usar. Todavía no lo he probado, pero puedo actualizar mi respuesta más tarde.

usando nginx X-accel

La documentación para X-accelsimplemente explica que una página puede utilizar un encabezado tener nginx servir un archivo (en lugar de PHPo djangoo rubyo nombre-su-no-como-eficiente-como-nginx-stack-aquí ).

por ejemplo, flujo de trabajo:

  • visitas de usuarios /download.php?path=/data/file1.txt,
  • download.phpdevuelve WWW-Authenticate+ 401 Unauthorized,
  • el navegador del usuario muestra el formulario de autenticación y vuelve a intentarlo ,
  • visitas de usuarios /download.php?path=/data/file1.txtpero ahora nginxtiene las credenciales,
  • nginxpuede pasar $remote_usery $http_authorizational fastcgiscript,
  • download.phprealiza la autenticación y decide si devolver 403 Forbiddeno establecer el encabezado del X-Accel-Redirectencabezado.

establecer la internalubicación de nginx

Si bien puede usar X-Accelpara servir activos estáticos, el caso de uso aquí es que queremos que las solicitudes se autentiquen, por eso lo usamos internal.

location /protected/data/ {
    internal;
    alias /path/to/data/files/;
}

configurar el script de descarga

Aquí vamos:

location /download.php$ {
    fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME /scripts/download.php;
    fastcgi_param PHP_AUTH_USER $remote_user;
    fastcgi_param PHP_AUTH_PW $http_authorization;
    include fastcgi_params;
}

tenga en cuenta : el script PHP usa PHP_AUTH_USERy PHP_AUTH_PW, que es capturado pornginx , por lo que para usarlos en el script PHP, debemos darlos para proporcionarlos explícitamente.

cocinando una autenticación ldap en PHP

Para mi caso de uso, instalé php-fpmy php-ldapen mi sistema.

Aquí hay una función de autenticación decente:

function authenticate() {
    // I'm watching you.
    error_log("authreq: " . $_SERVER['REMOTE_ADDR']);
    // mark that we're seeing the login box.
    $_SESSION['AUTH'] = 1;
    // browser shows login box
    Header("WWW-Authenticate: Basic realm=LDAP credentials.");
    Header("HTTP/1.0 401 Unauthorized");
    die('Unauthorized.');
}

Aquí hay una ruta de código decente para el acceso prohibido:

function forbidden() {
    error_log("forbidden: " . $_SERVER['REMOTE_ADDR'] . ', user: ' . $_SERVER['PHP_AUTH_USER']);
    // avoid brute force attacks
    sleep(rand(0, 3));
    // re-display login form
    session_destroy();
    // don't give too much info (e.g. user does not exist / password is wrong)
    Header("HTTP/1.0 403 Forbidden");
    // yes I did put the same message.
    die('Unauthorized.');
}

Y para la carne de la autenticación LDAP:

function ldap_auth() {
    $ldap_server = 'ldap://ldap.example.com/';
    $ldap_domain = 'dc=example,dc=com';
    $ldap_userbase = 'ou=Users,' . $ldap_domain;
    $ldap_user = 'uid=' . $_SERVER['PHP_AUTH_USER'] . ',' . $ldap_userbase;
    $ldap_pass = $_SERVER['PHP_AUTH_PW'];

    // connect to ldap server
    $ldapconn = ldap_connect($ldap_server)
        or die("Could not connect to LDAP server.");
    ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3) ;
    if ($ldapconn) {
        // try to bind/authenticate against ldap
        $ldapbind = @ldap_bind($ldapconn, $ldap_user, $ldap_pass) || forbidden();
        // "LDAP bind successful...";
        error_log("success: " . $_SERVER['REMOTE_ADDR'] . ', user: ' . $_SERVER['PHP_AUTH_USER']);
    }
    ldap_close($ldapconn);
}

Aquí tienes el cuerpo principal del script que usa la uri de solicitud.

if (@$_SESSION['AUTH'] != 1) {
    authenticate();
}

if (empty($_SERVER['PHP_AUTH_USER'])) {
    authenticate();
}

// check credentials on each access
ldap_auth();

// Get requested file name
// you can use the query string or a parameter
// or the full request uri if you like.
$path = $_GET["path"];

error_log("serving: " . $_SERVER['REMOTE_ADDR'] . ', user: ' . $_SERVER['PHP_AUTH_USER'] . ', path: ' . $path);

header("Content-Type: ", true);
header("X-Accel-Redirect: /protected" . $path);

exploración de archivos semitransparente

También publiqué esto como una esencia :

location /protected/data/ {
    internal;
    autoindex on;
    alias /path/to/data/files/;
}

location /data/ {
    fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME /scripts/auth.php;
    fastcgi_param PHP_AUTH_USER $remote_user;
    fastcgi_param PHP_AUTH_PW $http_authorization;
    include fastcgi_params;
}

y prácticamente el mismo script PHP, excepto el cuerpo:

// Get requested file name
$path = $_SERVER["REQUEST_URI"];
error_log("serving: " . $_SERVER['REMOTE_ADDR'] . ', user: ' . $_SERVER['PHP_AUTH_USER'] . ', path: ' . $path);
header("Content-Type: ", true);
header("X-Accel-Redirect: /protected" . $path);
dnozay
fuente
2

En resumen: Sí, NGINX es compatible con LDAP. Hay dos módulos adicionales disponibles: NGINX tiene uno, y hay otro disponible en github. La solución NGINX parecía bastante compleja a primera vista, así que elegí la última opción, que se llama nginx-auth-ldap. Puse algunas notas de instalación con respecto a mi experiencia en el siguiente hilo:

Agregue autenticación ldap a nginx en RHEL 7

Felix
fuente
Hola Felix, bienvenido a ServerFault. meta.stackexchange.com/questions/8231/… ¿Puede hacer que su respuesta aquí sea independiente?
pollitos
Es esto mejor ? Simplemente no quería regurgitar la misma aguja una y otra vez, lo que parecía estar más cerca de hacer publicaciones cruzadas para mí ... ;-)
Felix
-1

Parece que alguien recibió una respuesta a su pregunta en http://forum.nginx.org/read.php?2,18552

Zimbabao
fuente
¿Cómo responde eso a mi pregunta?
Adam Benayoun
Se trata de usar Xsendfile y un script ... lea las respuestas a la pregunta en el enlace anterior. Si no es así, me equivoqué.
Zimbabao