Чи підтримує Nginx автентифікацію LDAP?


10

Чи підтримує nginx автентифікацію ldap? Я щойно перейшов з apache і хотів би перенести всі мої аутентифікації, які базуються на openldap і mod_auth_ldap, до nginx. Дайте мені знати, чи можливо це.

На цій сторінці перелічено всі модулі, якими є nginx, я не бачу жодної згадки про LDAP. Дякую,

Відповіді:


6

nginx не робить LDAP: вам потрібно використовувати xsendfileсценарій сторонньої сторони, який ви створюєте для обробки автентифікації LDAP

http://wiki.nginx.org/NginxXSendfile


Як це відповідає на моє запитання - я конкретно хочу поговорити безпосередньо з ldap.
Адам Бенаун

3
nginx не робить ldap .. ви повинні використовувати xsendfile зі стороннім сценарієм, створеним для обробки ldap auth
Майк


6

Існує сторонній модуль, nginx-auth-ldapякий ви можете використовувати. Я ще не пробував цього, але можу відповісти згодом оновити.

використовуючи nginx X-accel

Документація X-accelлише пояснює, що сторінка може використовувати заголовок, щоб nginx обслуговував файл (а не PHPабо djangoабо rubyабо називає тут-не-як-ефективні-як-nginx-stack-тут ).

наприклад робочий процес:

  • відвідування користувачів /download.php?path=/data/file1.txt,
  • download.phpповертає WWW-Authenticate+ 401 Unauthorized,
  • веб-переглядач користувача показує форму автентифікації та повторні спроби ,
  • відвідування користувачів, /download.php?path=/data/file1.txtале тепер nginxмає облікові дані,
  • nginxможе перейти $remote_userі $http_authorizationдо fastcgiсценарію,
  • download.phpробить аутентифікацію і вирішує, повертати 403 Forbiddenчи встановлювати заголовок X-Accel-Redirectзаголовка.

встановлення nginx internalрозташування

Хоча ви можете використовувати X-Accelдля обслуговування статичних активів, випадком використання тут є те, що ми хочемо, щоб запити були автентифіковані, і саме тому ми використовуємо internal.

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

налаштування сценарію завантаження

Ось і ми:

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

зверніть увагу : скрипт PHP використовує PHP_AUTH_USERі PHP_AUTH_PW, який захоплюєтьсяnginx , тому для того, щоб використовувати їх у скрипті PHP, нам потрібно дати чітко надати їх.

готування автентифікації ldap в PHP

Для мого використання я встановив php-fpmі php-ldapв своїй системі.

Ось гідна функція аутентифікації:

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

Ось гідний шлях коду для забороненого доступу:

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

А для м'яса автентичності 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);
}

Тут ви маєте основний фрагмент сценарію, який використовує запит uri.

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

напівпрозорий перегляд файлів

Я також опублікував це як суть :

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

і майже такий же PHP-скрипт, крім корпусу:

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

Якщо коротко: так, NGINX підтримує LDAP. Доступні два додаткові модулі: у NGINX є один, а в github - ще один. Рішення NGINX на перший погляд здавалося досить складним, тому я пішов з останнім вибором, який називається nginx-auth-ldap. Я розмістив кілька записів щодо монтажу щодо свого досвіду в наступній темі:

Додайте автентифікацію ldap до nginx на RHEL 7


Ходді Фелікс, ласкаво просимо до ServerFault. meta.stackexchange.com/questions/8231/… Чи можете ви зробити свою відповідь тут самостійною?
пташенята

Так краще ? Мені просто не хотілося повторювати той самий шпіль знову і знову, який здався мені ближчим до перехресного опублікування ... ;-)
Фелікс

-1

Схоже, хтось отримав відповідь на ваше запитання на веб-сайті http://forum.nginx.org/read.php?2,18552


Як це відповідає на моє запитання?
Адам Бенаун

Його мова про використання Xsendfile та скрипту .. читайте відповіді на запитання вище за посиланням. Якщо це не так, я зрозумів ваше запитання неправильно.
Зімбабао
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.