Nginx prend-il en charge l'authentification LDAP?


10

Nginx prend-il en charge l'authentification LDAP? Je viens de migrer depuis apache et je voudrais déplacer toutes mes authentifications basées sur openldap et mod_auth_ldap vers nginx. Faites-moi savoir si c'est possible.

Sur cette page listant tous les modules de nginx, je ne vois aucune mention sur LDAP. Merci,

Réponses:


6

nginx ne fait pas LDAP: vous devez utiliser xsendfileavec un script tiers que vous créez pour gérer l'authentification LDAP

http://wiki.nginx.org/NginxXSendfile


Comment cela répond-il à ma question - je veux spécifiquement parler directement à LDAP.
Adam Benayoun

3
nginx ne fait pas ldap .. vous devez utiliser xsendfile avec un script tiers que vous créez pour gérer l'authentification ldap
Mike


6

Il existe un module tiers nginx-auth-ldapque vous pouvez utiliser. Je ne l'ai pas encore essayé, mais je pourrai mettre à jour ma réponse plus tard.

en utilisant nginx X-accel

La documentation de X-accelexplique simplement qu'une page peut utiliser un en-tête pour que nginx serve un fichier (plutôt que PHPou djangoou rubyou nommez-votre-pas-aussi-efficace-que-nginx-stack-ici ).

par exemple workflow:

  • visites d'utilisateurs /download.php?path=/data/file1.txt,
  • download.phprenvoie WWW-Authenticate+ 401 Unauthorized,
  • le navigateur de l'utilisateur affiche le formulaire d'authentification et réessaie ,
  • visites d'utilisateurs, /download.php?path=/data/file1.txtmais nginxdispose désormais des informations d'identification,
  • nginxpeut passer $remote_useret $http_authorizationau fastcgiscript,
  • download.phpeffectue l'authentification et décide de retourner 403 Forbiddenou de définir l'en X-Accel-Redirect- tête d' en - tête.

définition de l' internalemplacement nginx

Bien que vous puissiez utiliser X-Accelpour servir des actifs statiques, le cas d'utilisation ici est que nous voulons que les demandes soient authentifiées, c'est pourquoi nous utilisons internal.

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

configuration du script de téléchargement

Et c'est parti:

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

s'il vous plaît noter : le script PHP utilise PHP_AUTH_USERet PHP_AUTH_PW, qui est capturé parnginx , donc pour les utiliser dans le script PHP, nous devons donner pour les fournir explicitement.

préparer une authentification LDAP en PHP

Pour mon cas d'utilisation, j'ai installé php-fpmet php-ldapsur mon système.

Voici une fonction d'authentification décente:

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

Voici un chemin de code décent pour un accès interdit:

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

Et pour la viande de l'authentification 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);
}

Ici, vous avez le corps principal du script qui utilise l'URI de demande.

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

navigation semi-transparente dans les fichiers

J'ai également publié ceci comme un résumé :

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

et à peu près le même script PHP sauf le corps:

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

En bref: Oui, NGINX prend en charge LDAP. Il y a deux modules complémentaires disponibles: NGINX en a un, et il y en a un autre disponible sur github. La solution NGINX semblait plutôt complexe à première vue, j'ai donc opté pour ce dernier choix, qui s'appelle nginx-auth-ldap. J'ai mis quelques notes d'installation concernant mon expérience dans le fil suivant:

Ajouter l'authentification LDAP à Nginx sur RHEL 7


Salut Felix, bienvenue sur ServerFault. meta.stackexchange.com/questions/8231/… Pouvez-vous faire en sorte que votre réponse soit autonome?
poussins

Est-ce mieux ? Je ne voulais tout simplement pas régurgiter le même jeu encore et encore, ce qui semblait plus proche de la publication croisée pour moi ... ;-)
Felix

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.