7

apache2から来て、私がアーカイブできない唯一の機能:パスワードデータベース(htpasswd)にユーザーを配置し、さまざまなファイル/フォルダー/仮想サーバーへのアクセスを許可します。

私が有効にした基本http認証は機能します:

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;
}

user1user2 infile_aおよびuser2user3 inがある場合、これは機能しますが、 user2file_bのパスワードを変更するときに両方のファイルを更新する必要があります(パスワードはすべての場所で同じである必要があります)。アクセス権が異なり、ユーザーが10人を超える、15を超える場所があるため、これを処理するのは簡単ではありません。(私はきめ細かいアクセス権が大好きです!)

Apacheを使用して、場所ごとに異なるグループを定義し、適切なグループが必要でした。アクセスの変更は、ユーザーをグループに追加/削除するのと同じくらい簡単でした。

そのようなものはありますか、またはこのシナリオをnginxで簡単に処理するにはどうすればよいですか?

4

3 に答える 3

15

モジュールとレルムをグループとして使用すると、これを機能させることができAuthDigestます。1 人のユーザーに対して複数のエントリがありますが、1 つのファイルに行ごとに含めることができます。完璧ではありませんが、今の悪夢よりはマシです。

構成の小さな変更 (2 番目の場所については、auth_digest と user_file を参照してください):

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;
}

およびfile_a:

user1:Restricted1:password_hash
user2:Restricted1:password_hash
user2:Restricted2:password_hash
user3:Restricted2:password_hash
于 2012-07-19T21:22:58.503 に答える
2

最終的に、基本的な http 認証を使用して次のように管理します。

  • グループごとに個別のパスワード ファイルがありgroup_a.authますgroup_b.auth
  • さらに、各ユーザーとパスワードが書き込まれたファイルがあります。passwords.txt
  • passwords.txt認証ファイルと同じ形式なので、次のようなものですuser1:password_hash
  • ユーザーのパスワードをからすべてのファイルupdate.rbに同期するための ruby​​ スクリプトがあります (さらに へのラッパー):password.txt.authsed

Ruby スクリプト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
  • ユーザーのパスワードを更新するには: update password inpasswords.txtと実行update.rb
  • ユーザーをグループに追加するには (例:new_usergroup_a): を開いgroup_a.authて行を追加しますnew_user:。次に、ユーザーがまだ存在しない場合に追加new_user:password_hashし、最後に実行しますpasswords.txtupdate.rb
于 2014-04-08T16:42:39.053 に答える
1

私はスクリプト nginx-groups.pl を使用しています。このスクリプトは、Apache スタイルのパスワードとグループ ファイルを解析し、グループごとに個別のパスワード ファイルを生成します。したがって、基本的にMarkusの回答のRubyスクリプトと同じことを行いますが、すべてのグループに対して1つのファイルのみを使用し、グループファイルはapacheと同じ形式です.

スクリプトの現在のバージョンは次のとおりです。

#! /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";
}

任意の名前で保存し、実行可能にします。引数なしで呼び出すと、短い使用法情報が出力されます。

詳細については、 http://www.guido-flohr.net/group-authentication-for-nginx/を参照してください。

于 2016-09-16T14:52:54.887 に答える