Nginx สนับสนุนการตรวจสอบสิทธิ์ LDAP หรือไม่


10

nginx รองรับการตรวจสอบความถูกต้อง ldap หรือไม่? ฉันเพิ่งย้ายจาก apache และต้องการย้ายการตรวจสอบสิทธิ์ทั้งหมดของฉันซึ่งใช้ openldap และ mod_auth_ldap เป็น nginx แจ้งให้เราทราบหากเป็นไปได้

จากหน้านี้แสดงรายการโมดูลทั้งหมดที่ nginx มีฉันไม่เห็นพูดถึงเกี่ยวกับ LDAP ขอบคุณ

คำตอบ:


6

nginx ไม่ได้ทำ LDAP: คุณต้องใช้xsendfileกับสคริปต์ของบุคคลที่สามที่คุณสร้างเพื่อจัดการการตรวจสอบสิทธิ์ LDAP

http://wiki.nginx.org/NginxXSendfile


ฉันจะตอบคำถามของฉันได้อย่างไร - ฉันต้องการพูดคุยกับ ldap โดยตรง
Adam Benayoun

3
nginx ไม่ได้ทำ ldap .. คุณต้องใช้ xsendfile กับสคริปต์ของบุคคลที่สามที่คุณสร้างเพื่อจัดการ ldap auth
Mike


6

มีโมดูลบุคคลที่สามnginx-auth-ldapที่คุณสามารถใช้เป็น ฉันยังไม่ได้ลอง แต่อาจอัพเดตคำตอบในภายหลัง

ใช้ nginx X-accel

เอกสารประกอบสำหรับX-accelเพียงแค่อธิบายว่าหน้าอาจจะใช้ส่วนหัวจะมี Nginx ให้บริการไฟล์ (มากกว่าPHPหรือdjangoหรือrubyหรือชื่อของคุณที่ไม่เป็นที่มีประสิทธิภาพตามที่ 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หัวส่วนหัว

การตั้งค่าinternalตำแหน่งnginx

ในขณะที่คุณสามารถใช้เพื่อให้บริการสินทรัพย์คงที่กรณีการใช้งานที่นี่เป็นที่ที่เราต้องการร้องขอการรับรองความถูกต้องซึ่งเป็นเหตุผลที่เราใช้X-Accelinternal

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, เราต้องให้เพื่อให้พวกเขาอย่างชัดเจน

ทำอาหารรับรองความถูกต้อง ldap ใน 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);

2

กล่าวโดยย่อ: ใช่ NGINX รองรับ LDAP มีโมดูลเสริมสองโมดูลที่พร้อมใช้งาน: NGINX มีหนึ่งโมดูลและมีอีกโมดูลหนึ่งที่มีอยู่ใน GitHub วิธีแก้ปัญหา NGINX ดูค่อนข้างซับซ้อนในครั้งแรกดังนั้นฉันจึงเลือกตัวเลือกหลังซึ่งเรียกว่า nginx-auth-ldap ฉันใส่บันทึกการติดตั้งบางอย่างเกี่ยวกับประสบการณ์ของฉันในเธรดต่อไปนี้:

เพิ่มการพิสูจน์ตัวตน ldap ให้กับ nginx บน RHEL 7


Howdy Felix ยินดีต้อนรับสู่ ServerFault meta.stackexchange.com/questions/8231/… คุณสามารถตอบคำถามของคุณได้ที่นี่หรือไม่?
ลูกไก่

จะดีกว่านี้ไหม ฉันไม่ต้องการที่จะสำรอกสปีชีส์เดียวกันซ้ำแล้วซ้ำอีกซึ่งดูเหมือนจะใกล้เคียงกับการโพสต์ข้อความถึงฉัน ... ;-)
เฟลิกซ์

-1

ดูเหมือนว่าใครบางคนได้รับคำตอบสำหรับคำถามของคุณใน http://forum.nginx.org/read.php?2,18552


นั่นจะตอบคำถามของฉันได้อย่างไร
Adam Benayoun

มันพูดถึงการใช้ Xsendfile และสคริปต์ .. อ่านคำตอบสำหรับคำถามในลิงค์ด้านบน หากฉันไม่ได้ตอบคำถามของคุณผิด
ซิมบับเว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.