2012-06-17 28 views
6

đến từ apache2 tính năng duy nhất tôi không thể lưu trữ: có người dùng trong cơ sở dữ liệu mật khẩu (htpasswd) và cho phép truy cập vào các tệp/thư mục/máy chủ ảo khác nhau.nhóm nginx http auth

http Basic auth tôi kích hoạt công trình:

location ~ ^/a/ { 
    # should allow access for user1, user2 
    auth_basic   "Restricted"; 
    auth_basic_user_file /etc/nginx/auth/file_a; 
} 
location ~ ^/b/ { 
    # should allow access for user2, user3 
    auth_basic   "Restricted"; 
    auth_basic_user_file /etc/nginx/auth/file_b; 
} 

Nếu tôi có user1, user2 trong file_auser2, User3 trong file_b, công trình này nhưng tôi phải cập nhật cả hai tập tin khi tôi đổi mật khẩu cho user2 (mật khẩu phải giống nhau cho tất cả các địa điểm). Vì tôi sẽ có> 15 vị trí khác nhau với các quyền truy cập khác nhau và> 10 người dùng, điều này không thực sự dễ dàng để xử lý. (Tôi yêu các quyền truy cập hạt mịn!)

Với Apache, tôi đã xác định các nhóm khác nhau cho từng vị trí và yêu cầu nhóm phù hợp. Việc thay đổi quyền truy cập dễ dàng như việc thêm/xóa người dùng vào nhóm.

Có điều gì đó tương tự hoặc cách xử lý này có thể dễ dàng xử lý bằng nginx không?

Trả lời

0

Cuối cùng tôi quản lý nó như thế này với auth http cơ bản:

  • Đối với mỗi nhóm, tôi có một tệp mật khẩu riêng biệt, ví dụ: group_a.auth, group_b.auth, ...
  • Ngoài ra, tôi có một tập tin mà mỗi người dùng và mật khẩu được viết, ví dụ như passwords.txt
  • passwords.txt có định dạng tương tự như file auth, vì vậy cái gì đó như user1:password_hash
  • Tôi có một kịch bản ruby ​​update.rb để đồng bộ hóa mật khẩu của người dùng từ password.txt cho tất cả .auth file (cũng hơn một wrapper để sed):

của Ruby script update.rb:

#!/usr/bin/env ruby 

passwords = File.new("./passwords.txt","r") 

while pwline = passwords.gets 
    pwline.strip! 
    next if pwline.empty? 

    user, _ = pwline.split(':') 
    %x(sed -i 's/#{user}:.*/#{pwline.gsub('/','\/')}/g' *.auth) 
end 
  • Để cập nhật mật khẩu của người dùng: Mật khẩu cập nhật trong passwords.txt và thực hiện update.rb
  • Để thêm người dùng vào một nhóm (ví dụ new_user-group_a): mở group_a.auth và thêm dòng new_user:.Sau đó thêm new_user:password_hash-passwords.txt nếu người dùng không phải là đã hiện diện và cuối cùng chạy update.rb
11

Bạn có thể làm việc này bằng cách sử dụng AuthDigest mô-đun và cõi dưới dạng nhóm - bạn sẽ có nhiều mục nhập cho một người dùng, nhưng bạn có thể đặt chúng sau dòng trong một tệp. Không hoàn hảo, nhưng tốt hơn cơn ác mộng bạn có bây giờ.

thay đổi nhỏ trong cấu hình (xem user_file auth_digest và cho vị trí thứ 2):

location ~ ^/a/ { 
    # should allow access for user1, user2 
    auth_digest   "Restricted"; 
    auth_digest_user_file /etc/nginx/auth/file_a; 
} 
location ~ ^/b/ { 
    # should allow access for user2, user3 
    auth_digest   "Restricted2"; 
    auth_digest_user_file /etc/nginx/auth/file_a; 
} 

và file_a:

user1:Restricted1:password_hash 
user2:Restricted1:password_hash 
user2:Restricted2:password_hash 
user3:Restricted2:password_hash 
+0

cảm ơn, có vẻ tốt. Tôi sẽ kiểm tra nó lần sau tôi sử dụng ngnix ;-) – Markus

-1

Tôi đang sử dụng một kịch bản nginx-groups.pl rằng phân tích mật khẩu phong cách apache và các nhóm file và tạo file mật khẩu riêng cho mỗi nhóm. Vì vậy, về cơ bản nó giống như kịch bản Ruby trong câu trả lời của Markus nhưng nó chỉ sử dụng một tệp duy nhất cho tất cả các nhóm và tệp nhóm có cùng định dạng với apache.

Phiên bản hiện tại của kịch bản là:

#! /usr/bin/env perl 

use strict; 

die "Usage: $0 USERSFILE GROUPSFILE\n" unless @ARGV == 2; 
my ($users_file, $groups_file) = @ARGV; 

my %users; 
open my $fh, "<$users_file" or die "cannot open '$users_file': $!\n"; 
while (my $line = <$fh>) { 
    chomp $line; 
    my ($name, $password) = split /:/, $line, 2; 
    next if !defined $password; 
    $users{$name} = $line; 
} 

open my $fh, "<$groups_file" or die "cannot open '$groups_file': $!\n"; 
while (my $line = <$fh>) { 
    my ($name, $members) = split /:/, $line, 2 or next; 
    next if !defined $members; 
    $name =~ s/[ \t]//g; 
    next if $name eq ''; 
    my @members = grep { length $_ && exists $users{$_} } 
        split /[ \t\r\n]+/, $members; 

    my $groups_users_file = $name . '.users'; 

    print "Writing users file '$groups_users_file'.\n"; 

    open my $wh, ">$groups_users_file" 
     or die "Cannot open '$groups_users_file' for writing: $!\n"; 

    foreach my $user (@members) { 
     print $wh "$users{$user}\n" 
      or die "Cannot write to '$groups_users_file': $!\n"; 
    } 

    close $wh or die "Cannot close '$groups_users_file': $!\n"; 
} 

Lưu nó dưới bất cứ tên nào bạn thích và làm cho nó thực thi. Gọi nó mà không có đối số sẽ in một thông tin sử dụng ngắn.

Xem http://www.guido-flohr.net/group-authentication-for-nginx/ để biết chi tiết!

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt nhất là đưa các phần quan trọng của câu trả lời vào đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/13697810) –

+0

Ok, @ unamata-sanatarai, tôi đã thêm mã nguồn của tập lệnh. –

Các vấn đề liên quan