NginxはLDAP認証をサポートしていますか?


10

nginxはLDAP認証をサポートしていますか?Apacheから移行したばかりで、openldapとmod_auth_ldapに基づくすべての認証をnginxに移動したいと思います。それが可能かどうか教えてください。

nginxが持っているすべてのモジュールをリストしているこのページから、LDAPについての言及はありません。おかげで、

回答:


6

nginxはLDAPを実行しませんxsendfile。LDAP認証を処理するには、作成したサードパーティのスクリプトを使用する必要があります

http://wiki.nginx.org/NginxXSendfile


それが私の質問にどのように答えますか-特にLDAPと直接話したいです。
アダムベナユン

3
nginxはLDAPを実行しません。LDAP認証を処理するには、サードパーティのスクリプトでxsendfileを使用する必要があります
Mike


6

nginx-auth-ldap使用できるサードパーティのモジュールがあります。まだ試していませんが、後で回答を更新することがあります。

nginx X-accelの使用

のドキュメントでX-accelは、ページがヘッダーを使用してnginxにファイルを提供する可能性があることを説明しています(PHPまたはdjangoor rubyまたはor - or -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ヘッダーを返すか設定するかを決定します。

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

2

つまり、NGINXはLDAPをサポートしています。使用可能なアドオンモジュールは2つあります。NGINXには1つ、githubには別のモジュールが1つあります。NGINXソリューションは一見かなり複雑に見えたので、nginx-auth-ldapと呼ばれる後者の選択肢を選びました。私の経験に関するインストールノートを次のスレッドに投稿しました。

RHEL 7のnginxにLDAP認証を追加する


ハウディフェリックス、ServerFaultへようこそ。 meta.stackexchange.com/questions/8231/… ここであなたの答えをそれ自体で立証できますか?
ひよこ

これは良いですか?私は同じスパイルを何度も逆流したくなかっただけで、クロスポストに近いように見えました... ;-)
Felix

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.