nginx não faz LDAP: você precisa usar xsendfile
com um script de terceiros criado para lidar com autenticação LDAP
O nginx suporta autenticação ldap? Acabei de migrar do apache e gostaria de mover todas as minhas autenticações baseadas no openldap e no 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 nenhuma menção sobre o LDAP. Obrigado,
nginx não faz LDAP: você precisa usar xsendfile
com um script de terceiros criado para lidar com autenticação LDAP
Existe um módulo LDAP não oficial para o nginx: nginx-auth-ldap .
Há um módulo de terceiros nginx-auth-ldap
que você pode usar. Ainda não tentei, mas posso atualizar minha resposta mais tarde.
A documentação para X-accel
apenas explica que uma página pode usar um cabeçalho para que o nginx exiba um arquivo (em vez disso, que PHP
ou django
ou ruby
ou nome-seu-não-tão-eficiente-quanto-nginx-stack-here ).
por exemplo. fluxo de trabalho:
/download.php?path=/data/file1.txt
, download.php
retorna WWW-Authenticate
+ 401 Unauthorized
, /download.php?path=/data/file1.txt
, mas agora nginx
tem as credenciais, nginx
pode passar $remote_user
e $http_authorization
para fastcgi
script, download.php
faz a autenticação e decide se deve retornar 403 Forbidden
ou definir o cabeçalho X-Accel-Redirect
header. internal
location Embora você possa usar X-Accel
para veicular 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/;
}
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;
}
anote : o script PHP usa PHP_AUTH_USER
e PHP_AUTH_PW
, que é capturado por nginx
, então, para usá-los no script PHP, precisamos dar para fornecê-los explicitamente .
Para o meu caso de uso, instalei php-fpm
e php-ldap
no 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 o pedido 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);
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);
Resumindo: Sim, o NGINX suporta o LDAP. Existem dois módulos adicionais disponíveis: o NGINX tem um, e há outro disponível no github. A solução NGINX pareceu bastante complexa à primeira vista, então eu fui com a última opção, que é chamada nginx-auth-ldap. Eu coloquei algumas notas de instalação sobre a minha experiência no seguinte tópico:
Parece que alguém respondeu à sua pergunta sobre link