Поддерживает ли nginx аутентификацию ldap? Я только что перешел с apache и хотел бы перенести все свои аутентификации, основанные на openldap и mod_auth_ldap, на nginx. Сообщите мне, возможно ли это.
На этой странице перечислены все модули, которые есть у nginx, я не вижу упоминания о LDAP. Спасибо,
Есть сторонний модуль nginx-auth-ldap
что вы можете использовать. Я еще не пробовал, но могу обновить свой ответ позже.
Документация для 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
заголовок.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, нам нужно предоставить их явно.
В моем случае я установил 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);
Для nginx существует неофициальный модуль LDAP: nginx-auth-ldap.
nginx не поддерживает LDAP: вы должны использовать xsendfile
с помощью стороннего скрипта, который вы создаете для обработки аутентификации LDAP
Вкратце: да, NGINX поддерживает LDAP. Доступны два дополнительных модуля: один в NGINX и еще один доступен на github. Решение NGINX на первый взгляд показалось довольно сложным, поэтому я выбрал второй вариант, который называется nginx-auth-ldap. Я разместил некоторые примечания по установке, касающиеся моего опыта, в следующей теме:
Похоже, кто-то получил ответ на ваш вопрос по http://forum.nginx.org/read.php?2,18552