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,

Adam Benayoun
sumber

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

Mike
sumber
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 LDAP tidak resmi untuk nginx: nginx-auth-ldap .

Yohann
sumber
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);
tidak tahu
sumber
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

Felix
sumber
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
-1

Sepertinya seseorang mendapat jawaban untuk pertanyaan Anda di http://forum.nginx.org/read.php?2,18552

Zimbabao
sumber
Bagaimana itu menjawab pertanyaan saya?
Adam Benayoun
Ini berbicara tentang menggunakan Xsendfile dan skrip .. baca balasan untuk pertanyaan di tautan di atas. Jika tidak, saya salah menjawab pertanyaan Anda.
Zimbabao