Nginx có hỗ trợ xác thực LDAP không?


10

Nginx có hỗ trợ xác thực ldap không? Tôi vừa di chuyển từ apache và muốn chuyển tất cả các xác thực dựa trên openldap và mod_auth_ldap sang nginx. Hãy cho tôi biết nếu điều đó là có thể.

Từ trang này liệt kê tất cả các mô-đun nginx có, tôi không thấy bất kỳ đề cập nào về LDAP. Cảm ơn,

Câu trả lời:


6

nginx không làm LDAP: bạn phải sử dụng xsendfilevới tập lệnh bên thứ 3 mà bạn tạo để xử lý xác thực LDAP

http://wiki.nginx.org/NginxXSendfile


Làm thế nào mà trả lời câu hỏi của tôi - tôi đặc biệt muốn nói chuyện trực tiếp với ldap.
Adam Benayoun

3
nginx không làm ldap .. bạn phải sử dụng xsendfile với tập lệnh bên thứ 3 mà bạn tạo để xử lý ldap auth
Mike


6

Có một mô-đun bên thứ 3 nginx-auth-ldapmà bạn có thể sử dụng. Tôi chưa thử, nhưng tôi có thể cập nhật câu trả lời của mình sau.

sử dụng nginx X-accel

Các tài liệu cho X-accelchỉ giải thích rằng một trang có thể sử dụng một tiêu đề để có nginx phục vụ một tập tin (chứ không phải là PHPhay djangohay rubyhay tên của bạn-không-như-hiệu quả-as-nginx-stack-đây ).

ví dụ quy trình làm việc:

  • lượt truy cập của người dùng /download.php?path=/data/file1.txt,
  • download.phptrả về WWW-Authenticate+ 401 Unauthorized,
  • Trình duyệt của người dùng hiển thị biểu mẫu xác thực và thử lại ,
  • lượt truy cập của người dùng /download.php?path=/data/file1.txtnhưng hiện nginxcó thông tin đăng nhập,
  • nginxcó thể vượt qua $remote_user$http_authorizationđến fastcgikịch bản,
  • download.phpxác thực và quyết định trả lại 403 Forbiddenhoặc đặt tiêu X-Accel-Redirectđề.

thiết lập internalvị trí nginx

Mặc dù bạn có thể sử dụng X-Accelđể phân phát tài sản tĩnh, trường hợp sử dụng ở đây là chúng tôi muốn các yêu cầu được xác thực, đó là lý do tại sao chúng tôi sử dụng internal.

location /protected/data/ {
    internal;
    alias /path/to/data/files/;
}

thiết lập tập lệnh tải xuống

Ở đây chúng tôi đi:

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;
}

xin lưu ý : tập lệnh PHP sử dụng PHP_AUTH_USERPHP_AUTH_PW, được nắm bắt bởinginx , vì vậy để sử dụng chúng trong tập lệnh PHP, chúng tôi cần cung cấp để cung cấp cho chúng một cách rõ ràng.

nấu một xác thực ldap trong PHP

Đối với trường hợp sử dụng của tôi, tôi đã cài đặt php-fpmphp-ldaptrên hệ thống của tôi.

Đây là một chức năng xác thực phong nha:

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.');
}

Đây là một đường dẫn mã tốt cho truy cập bị cấm:

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.');
}

Và đối với phần xác thực 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);
}

Ở đây bạn có phần chính của tập lệnh sử dụng uri yêu cầu.

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);

duyệt tập tin bán trong suốt

Tôi cũng đã xuất bản này như là một ý chính :

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;
}

và khá nhiều tập lệnh PHP giống nhau ngoại trừ phần thân:

// 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

Tóm lại: Có, NGINX hỗ trợ LDAP. Có hai mô-đun bổ trợ khả dụng: NGINX có một mô-đun và có một mô-đun khác có sẵn trên github. Giải pháp NGINX thoạt nhìn có vẻ khá phức tạp, vì vậy tôi đã chọn lựa chọn thứ hai, được gọi là nginx-auth-ldap. Tôi đưa ra một số lưu ý cài đặt liên quan đến kinh nghiệm của tôi trong chuỗi sau:

Thêm xác thực ldap vào nginx trên RHEL 7


Howdy Felix, chào mừng bạn đến với ServerFault. meta.stackexchange.com/questions/8231/ Từ Bạn có thể tự trả lời câu hỏi của mình ở đây không?
gà con

Tốt hơn chưa ? Tôi chỉ không muốn lặp đi lặp lại cùng một khoảng thời gian, điều này dường như gần hơn với việc đăng chéo với tôi ... ;-)
Felix

-1

Có vẻ như ai đó đã có câu trả lời cho câu hỏi của bạn trên http://forum.nginx.org/read.php?2,18552


Làm thế nào mà trả lời câu hỏi của tôi?
Adam Benayoun

Nó nói về việc sử dụng Xsendfile và một tập lệnh .. đọc trả lời cho câu hỏi trong liên kết ở trên. Nếu nó không có thể là tôi đã hỏi sai câu hỏi của bạn.
Zimbabao
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.