NginxはLDAP認証をサポートしていますか? Apacheから移行したばかりで、openldapとmod_auth_ldapに基づくすべての認証をnginxに移動したいと思います。それが可能かどうか教えてください。
Nginxが持っているすべてのモジュールをリストしているこのページから、LDAPについての言及はありません。おかげで、
nginxはLDAPを実行しません。LDAP認証を処理するために作成したサードパーティのスクリプトでxsendfile
を使用する必要があります
Nginxには非公式のLDAPモジュールがあります: nginx-auth-ldap 。
使用できるサードパーティモジュール nginx-auth-ldap
があります。まだ試していませんが、後で回答を更新することがあります。
X-accel
のドキュメントは、ページがヘッダーを使用してnginxにファイルを提供することを説明しています(PHP
またはDjango
またはRuby
またはname-your-not-as-efficient-as-nginx-stack-here)。
例えばワークフロー:
/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
ヘッダーを設定するかを決定します。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-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);
つまり、NGINXはLDAPをサポートしています。使用可能なアドオンモジュールは2つあります。NGINXには1つ、githubにはもう1つ使用できます。 NGINXソリューションは一見かなり複雑に見えたので、nginx-auth-ldapと呼ばれる後者の選択肢を選びました。私の経験に関するインストールノートを次のスレッドに投稿しました。