nginx是否支持ldap身份validation? 我刚刚从apache迁移,并希望将所有基于openldap和mod_auth_ldap的身份validation移动到nginx。 让我知道如果这是可能的。
从这个页面列出了nginx所有的模块,我没有看到有关LDAP的任何提及。 谢谢,
nginx不会执行LDAP:您必须将xsendfile与您创build的第三方脚本一起使用来处理LDAP身份validation
Nginx有一个非官方的LDAP模块: nginx-auth-ldap 。
您可以使用第三方模块nginx-auth-ldap 。 我还没有尝试过,但稍后可能会更新我的答案。
X-accel的文档只是解释了一个页面可能会使用一个头文件来让nginx提供一个文件(而不是PHP , django或者ruby或者名字 – 你不像-nginx-stack-efficient )。
如工作stream程:
/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执行身份validation,并决定是否返回403 Forbidden或设置标题X-Accel-Redirect标题。 internal位置 虽然您可以使用X-Accel来提供静态资产,但这里的用例是我们希望请求被authentication,这就是我们使用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脚本使用由nginx捕获的 PHP_AUTH_USER和PHP_AUTH_PW ,所以为了在PHP脚本中使用它们,我们需要给予明确的提供。
对于我的用例,我在我的系统上安装了php-fpm和php-ldap 。
这是一个体面的身份validationfunction:
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.'); }
这是禁止访问的一个体面的代码path:
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 (eg user does not exist / password is wrong) Header("HTTP/1.0 403 Forbidden"); // yes I did put the same message. die('Unauthorized.'); }
而对于LDAPauthentication的肉:
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); }
这里你有使用请求的脚本的主体。
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脚本除了body:
// 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有一个,在github上有另外一个。 NGINX解决scheme乍一看似乎相当复杂,所以我select了后者,称为nginx-auth-ldap。 我在以下线索中提供了一些关于我的经验的安装说明:
在RHEL 7上将ldap身份validation添加到nginx