O Nginx suporta autenticação LDAP?

10

O nginx suporta autenticação ldap? Acabei de migrar do apache e gostaria de mover todas as minhas autenticações baseadas no openldap e mod_auth_ldap para o nginx. Deixe-me saber se isso é possível.

Nesta página, listando todos os módulos que o nginx possui, não vejo menção sobre o LDAP. Obrigado,

Adam Benayoun
fonte

Respostas:

6

O nginx não faz LDAP: você precisa usar xsendfilecom um script de terceiros criado para lidar com a autenticação LDAP

http://wiki.nginx.org/NginxXSendfile

Mike
fonte
Como isso responde à minha pergunta - quero especificamente falar diretamente com o ldap.
precisa
3
não nginx não ldap .. você tem que usar xsendfile com um script 3o partido você cria para auth alça ldap
Mike
6

Há um módulo LDAP não oficial para nginx: nginx-auth-ldap .

Yohann
fonte
6

Há um módulo de terceiros nginx-auth-ldapque você pode usar. Ainda não tentei, mas posso atualizar minha resposta mais tarde.

usando nginx X-accel

A documentação X-accelapenas explica que uma página pode usar um cabeçalho para que o nginx sirva um arquivo (em vez de PHPou djangoou rubyou nomeie seu não tão eficiente quanto o nginx-stack-aqui ).

por exemplo, fluxo de trabalho:

  • visitas de usuários /download.php?path=/data/file1.txt,
  • download.phpretorna WWW-Authenticate+ 401 Unauthorized,
  • O navegador do usuário mostra o formulário de autenticação e as novas tentativas ,
  • visitas de usuários, /download.php?path=/data/file1.txtmas agora nginxtem as credenciais,
  • nginxpode passar $remote_usere $http_authorizationao fastcgiroteiro,
  • download.phpfaz a autenticação e decide se deve retornar 403 Forbiddenou definir o cabeçalho do X-Accel-Redirectcabeçalho.

definindo a internallocalização do nginx

Embora você possa usar X-Accelpara servir ativos estáticos, o caso de uso aqui é que queremos que as solicitações sejam autenticadas, e é por isso que usamos internal.

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

configurando o script de download

Aqui vamos nós:

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

observe : o script PHP usa PHP_AUTH_USERe PHP_AUTH_PW, o qual é capturado pornginx , portanto, para usá-los no script PHP, precisamos fornecer para fornecê-los explicitamente.

preparando uma autenticação LDAP em PHP

Para o meu caso de uso, eu instalei php-fpme php-ldapno meu sistema.

Aqui está uma função de autenticação decente:

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

Aqui está um caminho de código decente para acesso proibido:

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

E para a carne da autenticação 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);
}

Aqui você tem o corpo principal do script que usa a solicitação 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);

navegação de arquivo semi-transparente

Eu também publiquei isso como uma essência :

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

e praticamente o mesmo script PHP, exceto o corpo:

// 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);
dnozay
fonte
2

Em resumo: Sim, o NGINX suporta LDAP. Existem dois módulos adicionais disponíveis: o NGINX possui um e outro disponível no github. A solução NGINX parecia bastante complexa à primeira vista, então fui com a última opção, chamada nginx-auth-ldap. Anotei algumas notas de instalação relacionadas à minha experiência no seguinte segmento:

Adicionar autenticação ldap ao nginx no RHEL 7

Felix
fonte
Olá Felix, bem-vindo ao ServerFault. meta.stackexchange.com/questions/8231/… Você pode fazer sua resposta aqui por conta própria?
pintos
Isso é melhor? Eu só não queria que a regurgitar a mesma lengalenga uma e outra vez, que parecia mais perto de cross-posting para mim ... ;-)
Felix
-1

Parece que alguém recebeu resposta para sua pergunta em http://forum.nginx.org/read.php?2,18552

Zimbabao
fonte
Como isso responde a minha pergunta?
precisa
Está falando sobre o uso do Xsendfile e de um script .. leia as respostas à pergunta no link acima. Caso contrário, entendi sua dúvida.
Zimbabao