Czy Nginx obsługuje uwierzytelnianie LDAP?

10

Czy nginx obsługuje uwierzytelnianie LDAP? Właśnie przeprowadziłem migrację z Apache i chciałbym przenieść wszystkie moje uwierzytelnienia oparte na openldap i mod_auth_ldap na nginx. Daj mi znać, jeśli to możliwe.

Na tej stronie z listą wszystkich modułów, które ma nginx, nie widzę żadnej wzmianki o LDAP. Dzięki,

Adam Benayoun
źródło

Odpowiedzi:

6

nginx nie robi LDAP: musisz używać xsendfileskryptu innej firmy, który tworzysz do obsługi uwierzytelniania LDAP

http://wiki.nginx.org/NginxXSendfile

Mikrofon
źródło
Jak to odpowiada na moje pytanie - szczególnie chcę porozmawiać z ldap bezpośrednio.
Adam Benayoun,
3
nginx nie robi ldap .. musisz użyć xsendfile ze skryptem innej firmy, który tworzysz do obsługi autd ldap
Mike
6

Istnieje nieoficjalny moduł LDAP dla nginx: nginx-auth-ldap .

Yohann
źródło
6

Istnieje moduł innej firmy nginx-auth-ldap, którego możesz użyć. Nie próbowałem tego jeszcze, ale mogę zaktualizować swoją odpowiedź później.

za pomocą nginx X-accel

Dokumentacja X-accelwyjaśniająca po prostu wyjaśnia, że ​​strona może używać nagłówka, aby nginx obsługiwał plik (zamiast PHPlub djangolub rubylub nazwać-nie-tak-wydajne-jak-stos-nginx tutaj ).

np. przepływ pracy:

  • wizyty użytkowników /download.php?path=/data/file1.txt,
  • download.phpzwraca WWW-Authenticate+ 401 Unauthorized,
  • przeglądarka użytkownika wyświetla formularz uwierzytelnienia i ponownych prób ,
  • odwiedza użytkownika, /download.php?path=/data/file1.txtale teraz nginxma poświadczenia,
  • nginxmoże przejść $remote_useri $http_authorizationdo fastcgiskryptu,
  • download.phpwykonuje uwierzytelnianie i decyduje o zwrocie 403 Forbiddenlub ustawieniu X-Accel-Redirectnagłówka.

ustawienie internallokalizacji nginx

Chociaż możesz używać X-Acceldo obsługi zasobów statycznych, tutaj przypadek użycia polega na tym, że chcemy, aby żądania były uwierzytelniane, dlatego używamy internal.

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

konfiguracja skryptu pobierania

No to ruszamy:

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

Uwaga : skrypt PHP używa PHP_AUTH_USERi PHP_AUTH_PW, który jest przechwytywanynginx , więc aby użyć ich w skrypcie PHP, musimy dać je wyraźnie.

gotowanie uwierzytelniania LDAP w PHP

Dla mojego przypadku użycia zainstalowałem php-fpmi php-ldapw swoim systemie.

Oto przyzwoita funkcja uwierzytelniania:

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

Oto przyzwoita ścieżka kodu dla zabronionego dostępu:

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

A jeśli chodzi o autentyczność uwierzytelniania 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);
}

Tutaj masz główną treść skryptu, który używa URI żądania.

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

półprzezroczyste przeglądanie plików

Opublikowałem to również jako sedno :

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

i prawie taki sam skrypt PHP oprócz ciała:

// 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
źródło
2

W skrócie: Tak, NGINX obsługuje LDAP. Dostępne są dwa dodatkowe moduły: NGINX ma jeden, a drugi jest dostępny na github. Rozwiązanie NGINX na pierwszy rzut oka wydawało się dość skomplikowane, więc wybrałem ten drugi wybór, który nazywa się nginx-auth-ldap. W tym wątku zamieściłem kilka uwag dotyczących instalacji dotyczących mojego doświadczenia:

Dodaj uwierzytelnianie LDAP do nginx na RHEL 7

Felix
źródło
Howdy Felix, witamy w ServerFault. meta.stackexchange.com/questions/8231/... Czy potrafisz udzielić odpowiedzi tutaj?
pisklęta
Czy to jest lepsze ? Po prostu nie chciałem powtarzać tej samej gry w kółko, co wydawało mi się bliższe wysyłaniu postów do mnie ... ;-)
Felix
-1

Wygląda na to, że ktoś otrzymał odpowiedź na twoje pytanie na http://forum.nginx.org/read.php?2,18552

Zimbabao
źródło
Jak to odpowiada na moje pytanie?
Adam Benayoun,
Mówi o użyciu Xsendfile i skryptu. Przeczytaj odpowiedzi na pytanie w powyższym linku. Jeśli tak nie jest, źle zrozumiałem twoje pytanie.
Zimbabao,