Поддерживает ли 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-here ).

например, рабочий процесс:

  • посещения пользователей /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заголовка.

установка internalместоположения nginx

Хотя вы можете использовать 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);
dnozay
источник
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

Zimbabao
источник
Как это отвечает на мой вопрос?
Адам Бенаюн,
Это говорит об использовании Xsendfile и скрипта. Прочитайте ответы на вопрос в ссылке выше. Если это не так, я неправильно понял ваш вопрос.
Зимбабао,