답변:
nginx는 LDAP를 수행하지 않습니다 : xsendfile
LDAP 인증을 처리하기 위해 생성 한 타사 스크립트와 함께 사용해야 합니다
nginx에 대한 비공식 LDAP 모듈이 있습니다 : nginx-auth-ldap .
nginx-auth-ldap
사용할 수있는 타사 모듈 이 있습니다. 아직 시도하지 않았지만 나중에 답변을 업데이트 할 수 있습니다.
에 대한 문서 X-accel
는 페이지가 헤더를 사용하여 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
헤더 를 반환할지 또는 설정 할지 결정합니다 .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에는 하나가 있고 github에는 다른 하나가 있습니다. NGINX 솔루션은 언뜻보기에는 다소 복잡해 보였으므로 후자의 선택 인 nginx-auth-ldap을 선택했습니다. 다음 스레드에서의 경험에 관한 설치 정보를 작성했습니다.
누군가 http://forum.nginx.org/read.php?2,18552 에서 귀하의 질문에 대한 답변을 얻은 것 같습니다.