nginx 支持 ldap 身份验证吗?我刚刚从 apache 迁移过来,想将所有基于 openldap 和 mod_auth_ldap 的身份验证移到 nginx。如果可以的话请告诉我。
从列出 nginx 拥有的所有模块的此页面中,我没有看到任何关于 LDAP 的提及。谢谢,
答案1
nginx 不支持 LDAP:你必须使用xsendfile
你创建的第三方脚本来处理 LDAP 身份验证
答案2
nginx 有一个非官方的 LDAP 模块:nginx-auth-ldap。
答案3
有第三方模块nginx-auth-ldap
你可以使用它。我还没有尝试过,但我可能会在以后更新我的答案。
使用 nginx X-accel
文档X-accel
只是解释了页面可以使用 header 来让 nginx 提供文件(而不是PHP
或django
或ruby
或在这里命名你的效率不如 nginx 的堆栈)。
例如工作流程:
- 用户访问量
/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
信息。
设置 nginxinternal
位置
虽然您可以使用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 实现 ldap 身份验证
对于我的用例,我在我的系统上安装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);
答案4
看起来有人回答了你的问题 http://forum.nginx.org/read.php?2,18552