Nginx是否支持LDAP身份验证?


10

Nginx是否支持ldap身份验证?我刚刚从apache迁移,并希望将所有基于openldap和mod_auth_ldap的身份验证迁移到nginx。让我知道是否可行。

在此页面中,列出了nginx拥有的所有模块,但我没有提到LDAP。谢谢,

Answers:




6

nginx-auth-ldap您可以使用第3方模块。我还没有尝试过,但是稍后可以更新我的答案。

使用Nginx X-accel

的文档X-accel仅说明页面可以使用标头来使nginx提供文件(而不是PHPor djangorubyor或在此处命名为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_authorizationfastcgi剧本,
  • 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_USERPHP_AUTH_PW由捕获nginx,因此为了在PHP脚本中使用它们,我们需要给出明确提供它们的方法。

用PHP编写ldap认证

对于我的使用情况下,我安装php-fpmphp-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。我在以下线程中提供了一些有关我的经验的安装说明:

在RHEL 7上向Nginx添加ldap身份验证


Howdy Felix,欢迎来到ServerFault。 meta.stackexchange.com/questions/8231/… 您能在这里单独回答吗?
小鸡

这是否更好 ?我只是不想一遍又一遍地反反复复,这对我来说似乎更接近交叉发布……;-)
Felix

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.