Unterstützt Nginx die LDAP-Authentifizierung?

10

Unterstützt Nginx die LDAP-Authentifizierung? Ich bin gerade von Apache migriert und möchte alle meine Authentifizierungen, die auf openldap und mod_auth_ldap basieren, nach nginx verschieben. Lassen Sie mich wissen, ob das möglich ist.

Auf dieser Seite, auf der alle Module aufgelistet sind, die nginx hat, wird LDAP nicht erwähnt. Vielen Dank,

Adam Benayoun
quelle

Antworten:

6

nginx führt kein LDAP durch: Sie müssen es xsendfilemit einem von Ihnen erstellten Skript eines Drittanbieters verwenden, um die LDAP-Authentifizierung durchzuführen

http://wiki.nginx.org/NginxXSendfile

Mike
quelle
Wie beantwortet das meine Frage? Ich möchte speziell direkt mit ldap sprechen.
Adam Benayoun
3
nginx macht kein ldap .. Sie müssen xsendfile mit einem Skript eines Drittanbieters verwenden, das Sie erstellen, um ldap auth zu verarbeiten
Mike
6

Es gibt ein inoffizielles LDAP-Modul für nginx: nginx-auth-ldap .

Yohann
quelle
6

Es gibt ein Modul eines Drittanbieters nginx-auth-ldap, das Sie verwenden können. Ich habe es noch nicht ausprobiert, aber ich kann meine Antwort später aktualisieren.

mit nginx X-accel

In der Dokumentation für wird X-accelnur erläutert, dass eine Seite möglicherweise einen Header verwendet, damit Nginx eine Datei bereitstellt (anstelle von PHPoder djangooder rubyoder benennen Sie Ihren nicht so effizienten Nginx-Stapel hier ).

zB Workflow:

  • Benutzerbesuche /download.php?path=/data/file1.txt,
  • download.phpgibt WWW-Authenticate+ zurück 401 Unauthorized,
  • Benutzer-Browser zeigt die Authentifizierungs - Form und Wiederholungen ,
  • Benutzer besucht /download.php?path=/data/file1.txt, nginxhat aber jetzt die Anmeldeinformationen,
  • nginxkann passieren $remote_userund $http_authorizationzu fastcgiSkript,
  • download.phpführt die Authentifizierung durch und entscheidet, ob 403 Forbiddender Header- X-Accel-RedirectHeader zurückgegeben oder festgelegt wird .

Einstellen des Nginx- internalSpeicherorts

Während Sie X-Accelstatische Assets bereitstellen können, möchten wir, dass die Anforderungen authentifiziert werden. Aus diesem Grund verwenden wir sie internal.

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

Einrichten des Download-Skripts

Auf geht's:

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

Bitte beachten Sie : Das PHP-Skript verwendet PHP_AUTH_USERund PHP_AUTH_PW, das von erfasst wirdnginx . Um sie im PHP-Skript zu verwenden, müssen wir angeben, um sie explizit bereitzustellen.

Kochen einer LDAP-Authentifizierung in PHP

Für meinen Anwendungsfall habe ich php-fpmund php-ldapauf meinem System installiert .

Hier ist eine anständige Authentifizierungsfunktion:

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

Hier ist ein anständiger Codepfad für den verbotenen Zugriff:

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

Und für das Fleisch der LDAP-Authentifizierung:

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

Hier haben Sie den Hauptteil des Skripts, das die Anfrage uri verwendet.

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

halbtransparentes Durchsuchen von Dateien

Ich habe dies auch als Kern veröffentlicht :

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

und so ziemlich das gleiche PHP-Skript mit Ausnahme des Körpers:

// 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
quelle
2

Kurz gesagt: Ja, NGINX unterstützt LDAP. Es stehen zwei Zusatzmodule zur Verfügung: NGINX verfügt über eines und ein weiteres über Github. Die NGINX-Lösung schien auf den ersten Blick ziemlich komplex zu sein, daher habe ich mich für die letztere Wahl entschieden, die als nginx-auth-ldap bezeichnet wird. Ich habe einige Installationshinweise zu meinen Erfahrungen im folgenden Thread veröffentlicht:

Fügen Sie ldap-Authentifizierung zu nginx unter RHEL 7 hinzu

Felix
quelle
Grüß dich Felix, willkommen bei ServerFault. meta.stackexchange.com/questions/8231/… Können Sie Ihre Antwort hier für sich allein stehen lassen?
Küken
Ist das besser ? Ich wollte einfach nicht immer und immer wieder das gleiche Spiel erbrechen, was mir näher am Cross-Posting schien ... ;-)
Felix
-1

Es sieht so aus, als hätte jemand eine Antwort auf Ihre Frage unter http://forum.nginx.org/read.php?2,18552 erhalten

Simbabao
quelle
Wie beantwortet das meine Frage?
Adam Benayoun
Es geht um die Verwendung von Xsendfile und eines Skripts. Lesen Sie die Antworten auf die Frage im obigen Link. Wenn nicht, habe ich Ihre Frage falsch verstanden.
Simbabao