एक 3 पार्टी मॉड्यूल है nginx-auth-ldap
जिसका आप उपयोग कर सकते हैं। मैंने अभी तक इसकी कोशिश नहीं की है, लेकिन मैं बाद में अपना जवाब अपडेट कर सकता हूं।
nginx X- त्वरण का उपयोग करना
के लिए दस्तावेज़ X-accel
सिर्फ बताते हैं कि एक पृष्ठ पर एक फ़ाइल की सेवा nginx के लिए एक शीर्ष लेख का उपयोग कर सकते हैं (बजाय PHP
या django
या ruby
या नाम-your-नहीं के रूप में कुशल के रूप में nginx-ढेर-यहाँ )।
उदाहरण वर्कफ़्लो:
- उपयोगकर्ता का दौरा
/download.php?path=/data/file1.txt
,
download.php
रिटर्न WWW-Authenticate
+ 401 Unauthorized
,
- उपयोगकर्ता का ब्राउज़र प्रमाणीकरण फ़ॉर्म दिखाता है और पुनः प्रयास करता है ,
- उपयोगकर्ता का दौरा
/download.php?path=/data/file1.txt
लेकिन अब nginx
साख है,
nginx
पास कर सकते हैं $remote_user
और $http_authorization
करने के लिए fastcgi
स्क्रिप्ट,
download.php
प्रमाणीकरण करता है और तय करता है कि 403 Forbidden
हेडर X-Accel-Redirect
हेडर को वापस करना है या नहीं ।
nginx internal
स्थान सेट करना
जब आप X-Accel
स्थैतिक संपत्ति की सेवा करने के लिए उपयोग कर सकते हैं , तो यहां उपयोग मामला है कि हम अनुरोधों को प्रमाणित करना चाहते हैं, यही कारण है कि हम उपयोग करते हैं internal
।
location /protected/data/ {
internal;
alias /path/to/data/files/;
}
डाउनलोड स्क्रिप्ट सेट करना
ये रहा:
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;
}
कृपया ध्यान दें : PHP स्क्रिप्ट का उपयोग करता है PHP_AUTH_USER
और PHP_AUTH_PW
, जिस पर कब्जा कर लिया जाता हैnginx
, इसलिए उन्हें PHP स्क्रिप्ट में उपयोग करने के लिए, हमें उन्हें स्पष्ट रूप से प्रदान करने की आवश्यकता है।
PHP में एक ldap प्रमाणीकरण खाना बनाना
अपने प्रयोग के मामले के लिए, मैं स्थापित php-fpm
और php-ldap
अपने सिस्टम पर।
यहाँ एक सभ्य प्रमाणित कार्य है:
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.');
}
यहाँ निषिद्ध पहुँच के लिए एक सभ्य कोड पथ है:
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.');
}
और 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);
}
यहां आपके पास स्क्रिप्ट का मुख्य भाग है जो अनुरोध 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);
अर्द्ध पारदर्शी फ़ाइल ब्राउज़िंग
मैंने इसे एक जिस्ट के रूप में भी प्रकाशित किया :
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;
}
और शरीर को छोड़कर बहुत ही समान PHP स्क्रिप्ट:
// 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);