Nginx, LDAP kimlik doğrulamasını destekliyor mu?


10

Nginx ldap kimlik doğrulamasını destekliyor mu? Sadece apache'den göç ettim ve openldap ve mod_auth_ldap tabanlı tüm kimlik doğrulamalarımı nginx'e taşımak istiyorum. Bunun mümkün olup olmadığını bana bildirin.

Nginx'in sahip olduğu tüm modülleri listeleyen bu sayfadan LDAP hakkında herhangi bir söz görmüyorum. Teşekkürler,

Yanıtlar:


6

nginx LDAP yapmaz: xsendfileLDAP kimlik doğrulamasını işlemek için oluşturduğunuz bir üçüncü taraf komut dosyası ile kullanmanız gerekir

http://wiki.nginx.org/NginxXSendfile


Bu sorumu nasıl cevaplıyor - özellikle doğrudan ldap ile konuşmak istiyorum.
Adam Benayoun

3
nginx ldap yapmaz .. ldap auth işlemek için oluşturduğunuz bir 3. parti komut dosyası ile xsendfile kullanmanız gerekir
Mike


6

Kullanabileceğiniz bir 3. taraf modülü nginx-auth-ldapvar. Henüz denemedim, ancak cevabımı daha sonra güncelleyebilirim.

nginx X-accel kullanan

Belgeleri X-accelsadece sayfa sunulacak dosyanın nginx için bir başlık kullanabileceğini açıklar (ziyade PHPya djangoya rubyya ad-senin-not-as-verimli-as-nginx-yığın-burada ).

örneğin iş akışı:

  • kullanıcı ziyaretleri /download.php?path=/data/file1.txt,
  • download.phpWWW-Authenticate+ döndürür 401 Unauthorized,
  • kullanıcının tarayıcısı kimlik doğrulama formunu gösterir ve yeniden dener ,
  • kullanıcı ziyaretleri, /download.php?path=/data/file1.txtancak şimdi nginxkimlik bilgilerine sahip,
  • nginxgeçebilir $remote_userve $http_authorizationiçin fastcgikomut,
  • download.phpkimlik doğrulamasını yapar ve 403 Forbiddenbaşlık X-Accel-Redirectüstbilgisini döndürüp döndürmeyeceğine karar verir .

nginx internalkonumunu ayarlama

X-AccelStatik varlıkları sunmak için kullanabilmenize rağmen , burada kullanım örneği, isteklerin doğrulanmasını istiyoruz, bu yüzden kullanıyoruz internal.

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

indirme komut dosyasını ayarlama

İşte başlıyoruz:

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

not edin : PHP komut dosyası kullanır PHP_AUTH_USERve PHP_AUTH_PW, tarafından yakalanırnginx böylece PHP script bunları kullanmak için, biz bunları açıkça sağlamak vermek gerekir.

PHP ldap kimlik doğrulaması pişirme

Benim kullanım durumunda, ben yüklü php-fpmve php-ldapsistemimde.

İşte iyi bir kimlik doğrulama işlevi:

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

İşte yasak erişim için iyi bir kod yolu:

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

Ve LDAP kimlik doğrulamasının etleri için:

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

Burada uri isteğini kullanan komut dosyasının ana gövdesine sahipsiniz.

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

yarı saydam dosya tarama

Bunu bir öz olarak da yayınladım :

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

ve gövde dışında hemen hemen aynı PHP betiği:

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

Kısacası: Evet, NGINX LDAP'yi destekler. İki eklenti modülü vardır: NGINX'in bir tane vardır ve github'da başka bir tane mevcuttur. NGINX çözümü ilk bakışta oldukça karmaşık görünüyordu, bu yüzden nginx-auth-ldap adı verilen ikinci seçenekle gittim. Aşağıdaki konudaki deneyimlerime ilişkin bazı kurulum notları ekledim:

RHEL 7'de nginx'e ldap kimlik doğrulaması ekleme


Merhaba Felix, ServerFault'a hoş geldiniz. meta.stackexchange.com/questions/8231/… Cevabınızı burada tek başına tutabilir misiniz?
civciv

Bu daha mı iyi ? Aynı spiel'i tekrar tekrar canlandırmak istemedim, bu da bana çapraz gönderiye daha yakın görünüyordu ... ;-)
Felix

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.