Apakah Nginx mendukung otentikasi LDAP?


10

Apakah nginx mendukung otentikasi ldap? Saya baru saja pindah dari apache dan ingin memindahkan semua autentikasi saya yang didasarkan pada openldap dan mod_auth_ldap ke nginx. Beritahu saya jika itu mungkin.

Dari halaman ini berisi daftar semua modul nginx, saya tidak melihat menyebutkan tentang LDAP. Terima kasih,

Jawaban:


6

nginx tidak melakukan LDAP: Anda harus menggunakan xsendfileskrip pihak ke-3 yang Anda buat untuk menangani otentikasi LDAP

http://wiki.nginx.org/NginxXSendfile


Bagaimana cara menjawab pertanyaan saya - saya secara khusus ingin berbicara dengan ldap secara langsung.
Adam Benayoun

3
nginx tidak melakukan ldap .. Anda harus menggunakan xsendfile dengan skrip pihak ke-3 yang Anda buat untuk menangani ldap auth
Mike


6

Ada modul pihak ke-3 nginx-auth-ldapyang dapat Anda gunakan. Saya belum mencobanya, tetapi saya dapat memperbarui jawaban saya nanti.

menggunakan nginx X-accel

Dokumentasi untuk X-accelhanya menjelaskan bahwa halaman dapat menggunakan header untuk memiliki nginx melayani file (bukan PHPatau djangoatau rubyatau nama-Anda-tidak-sebagai-efisien-sebagai-nginx-tumpukan-sini ).

misal alur kerja:

  • kunjungan pengguna /download.php?path=/data/file1.txt,
  • download.phppengembalian WWW-Authenticate+ 401 Unauthorized,
  • browser pengguna menunjukkan formulir otentikasi dan coba lagi ,
  • kunjungan pengguna /download.php?path=/data/file1.txttetapi sekarang nginxmemiliki kredensial,
  • nginxdapat lulus $remote_userdan $http_authorizationke fastcgiskrip,
  • download.phpmelakukan otentikasi dan memutuskan apakah akan kembali 403 Forbiddenatau mengatur header X-Accel-Redirectheader.

pengaturan internallokasi nginx

Meskipun Anda dapat menggunakan X-Acceluntuk melayani aset statis, use case di sini adalah kami ingin permintaan untuk diautentikasi, itulah sebabnya kami menggunakan internal.

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

mengatur skrip unduhan

Kita mulai:

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

harap dicatat : penggunaan skrip PHP PHP_AUTH_USERdan PHP_AUTH_PW, yang ditangkap olehnginx , jadi untuk menggunakannya dalam skrip PHP, kita perlu memberikan untuk menyediakannya secara eksplisit.

memasak otentikasi ldap di PHP

Untuk kasus penggunaan saya, saya menginstal php-fpmdan php-ldappada sistem saya.

Berikut adalah fungsi otentikasi yang layak:

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

Berikut ini adalah jalur kode yang layak untuk akses terlarang:

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

Dan untuk daging otentikasi 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);
}

Di sini Anda memiliki badan utama skrip yang menggunakan permintaan 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);

penelusuran file semi-transparan

Saya juga menerbitkan ini sebagai intisari :

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

dan skrip PHP yang hampir sama kecuali badan:

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

Singkatnya: Ya, NGINX mendukung LDAP. Ada dua modul tambahan yang tersedia: NGINX memiliki satu, dan ada satu lagi tersedia di github. Solusi NGINX tampak agak rumit pada pandangan pertama, jadi saya memilih yang terakhir, yang disebut nginx-auth-ldap. Saya memasang beberapa catatan instalasi tentang pengalaman saya di utas berikut:

Tambahkan otentikasi ldap ke nginx di RHEL 7


Howdy Felix, selamat datang di ServerFault. meta.stackexchange.com/questions/8231/… Bisakah Anda membuat jawaban Anda sendiri di sini?
anak ayam

Ini lebih baik ? Saya hanya tidak ingin memuntahkan mantra yang sama berulang-ulang, yang tampaknya lebih dekat dengan posting silang kepada saya ... ;-)
Felix

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.