Nginx는 LDAP 인증을 지원합니까?


10

nginx는 LDAP 인증을 지원합니까? 방금 아파치에서 마이그레이션했으며 openldap 및 mod_auth_ldap를 기반으로하는 모든 인증을 nginx로 옮기고 싶습니다. 가능하면 알려주세요.

이 페이지에서 nginx에있는 모든 모듈을 나열하면 LDAP에 대한 언급이 없습니다. 감사,

답변:


6

nginx는 LDAP를 수행하지 않습니다 : xsendfileLDAP 인증을 처리하기 위해 생성 한 타사 스크립트와 함께 사용해야 합니다

http://wiki.nginx.org/NginxXSendfile


그 질문에 어떻게 대답합니까? 구체적으로 ldap과 직접 대화하고 싶습니다.
Adam Benayoun

3
nginx는 ldap을 수행하지 않습니다. ldap 인증을 처리하기 위해 만든 타사 스크립트와 함께 xsendfile을 사용해야합니다
Mike


6

nginx-auth-ldap사용할 수있는 타사 모듈 이 있습니다. 아직 시도하지 않았지만 나중에 답변을 업데이트 할 수 있습니다.

nginx X-accel 사용

에 대한 문서 X-accel는 페이지가 헤더를 사용하여 nginx가 파일을 제공하도록 할 수 있다고 설명합니다 ( PHP또는- django또는- ruby또는 -효율적이지-nginx-스택-대신 ).

예 : 워크 플로우 :

  • 사용자가 방문 /download.php?path=/data/file1.txt,
  • download.phpWWW-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-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);

2

한마디로 그렇습니다. NGINX는 LDAP를 지원합니다. 사용 가능한 애드온 모듈에는 두 가지가 있습니다. NGINX에는 하나가 있고 github에는 다른 하나가 있습니다. NGINX 솔루션은 언뜻보기에는 다소 복잡해 보였으므로 후자의 선택 인 nginx-auth-ldap을 선택했습니다. 다음 스레드에서의 경험에 관한 설치 정보를 작성했습니다.

RHEL 7에서 nginx에 LDAP 인증 추가


Howdy Felix, ServerFault에 오신 것을 환영합니다. meta.stackexchange.com/questions/8231/… 여기에 답을 독자적으로 세우실 수 있습니까?
병아리

이게 더 낫습니까? 난 그냥 ;-) ... 나에게 가까이 간 게시 듯하는, 또 다시 같은 과장되게 떠벌 리다를 역류하고 싶지 않았다
펠릭스

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.