Nginx supporta l'autenticazione LDAP?


10

Nginx supporta l'autenticazione ldap? Sono appena migrato da Apache e vorrei spostare tutte le mie autenticazioni basate su openldap e mod_auth_ldap su nginx. Fammi sapere se è possibile.

Da questa pagina che elenca tutti i moduli di nginx, non vedo alcuna menzione di LDAP. Grazie,

Risposte:


6

nginx non fa LDAP: devi usarlo xsendfilecon uno script di terze parti che crei per gestire l'autenticazione LDAP

http://wiki.nginx.org/NginxXSendfile


In che modo risponde alla mia domanda? Voglio in particolare parlare direttamente con ldap.
Adam Benayoun,

3
nginx non fa ldap .. devi usare xsendfile con uno script di terze parti che crei per gestire ldap auth
Mike


6

C'è un modulo di terze parti nginx-auth-ldapche puoi usare. Non l'ho ancora provato, ma potrei aggiornare la mia risposta in seguito.

usando nginx X-accel

La documentazione per X-accelspiegare solo che una pagina può usare un'intestazione per fare in modo che nginx serva un file (piuttosto che PHPo djangoo rubyo nome-il-tuo-non-efficiente-come-nginx-stack-qui ).

ad es. flusso di lavoro:

  • visite dell'utente /download.php?path=/data/file1.txt,
  • download.phpritorna WWW-Authenticate+ 401 Unauthorized,
  • il browser dell'utente mostra il modulo di autenticazione e riprova ,
  • l'utente visita /download.php?path=/data/file1.txtma ora nginxha le credenziali,
  • nginxpuò passare $remote_usere $http_authorizationalla fastcgisceneggiatura,
  • download.phpesegue l'autenticazione e decide se restituire 403 Forbiddeno impostare l'intestazione X-Accel-Redirectdell'intestazione.

impostazione della internalposizione nginx

Sebbene sia possibile utilizzare X-Accelper servire asset statici, il caso d'uso qui è che vogliamo che le richieste vengano autenticate, motivo per cui utilizziamo internal.

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

impostazione dello script di download

Eccoci qui:

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;
}

nota : lo script PHP usa PHP_AUTH_USERe PHP_AUTH_PW, che viene catturato danginx , quindi per usarli nello script PHP, dobbiamo dare per fornirli esplicitamente.

preparare un'autenticazione LDAP in PHP

Per il mio caso d'uso, ho installato php-fpme php-ldapsul mio sistema.

Ecco una discreta funzione di autenticazione:

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.');
}

Ecco un percorso di codice decente per l'accesso vietato:

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.');
}

E per la carne dell'autenticazione 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);
}

Qui hai il corpo principale dello script che utilizza l'uri richiesta.

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);

navigazione di file semi-trasparente

Ho anche pubblicato questo in sintesi :

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;
}

e praticamente lo stesso script PHP tranne il corpo:

// 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);

2

In breve: Sì, NGINX supporta LDAP. Sono disponibili due moduli aggiuntivi: NGINX ne ha uno e un altro è disponibile su github. La soluzione NGINX sembrava alquanto complessa a prima vista, quindi sono andato con quest'ultima scelta, che si chiama nginx-auth-ldap. Ho messo alcune note di installazione riguardanti la mia esperienza nel seguente thread:

Aggiungi l'autenticazione ldap a nginx su RHEL 7


Ciao Felix, benvenuto su ServerFault. meta.stackexchange.com/questions/8231/… Puoi far qui la tua risposta da sola?
pulcini,

È meglio questo ? Non volevo rigurgitare più e più volte lo stesso spiel, il che mi sembrava più vicino al cross-posting per me ... ;-)
Felix,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.