2012-06-17 10 views
6

kommend von apache2 das einzige feature, das ich nicht archivieren kann: habe benutzer in einer passwortdatenbank (htpasswd) und erlaube den zugriff auf verschiedene dateien/ordner/virtuelle server.nginx group http auth

Grund http auth I Arbeiten aktiviert:

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

Wenn ich benutzer1, benutzer2 in file_a und benutzer2, user3 in file_b, das funktioniert, aber ich muss die beiden Dateien aktualisieren wenn ich das Passwort für user2 ändern (Passwort sollte für alle Standorte gleich sein). Da ich> 15 verschiedene Standorte mit unterschiedlichen Zugriffsrechten und> 10 Benutzern haben werde, ist das nicht wirklich einfach zu handhaben. (Ich liebe feinkörnige Zugriffsrechte!)

Mit Apache habe ich verschiedene Gruppen für jeden Standort definiert und die richtige Gruppe benötigt. Das Ändern des Zugriffs war so einfach wie das Hinzufügen/Entfernen von Benutzern zu Gruppen.

Gibt es so etwas oder wie kann dieses Szenario mit nginx leicht gehandhabt werden?

Antwort

0

schaffe ich es endlich wie dies mit grundlegenden http auth:

  • Für jede Gruppe habe ich eine separate Passwortdatei, zB group_a.auth, group_b.auth, ...
  • Außerdem habe ich eine Datei, in der jeder Benutzer und Kennwort geschrieben wird, zB passwords.txt
  • passwords.txt hat das gleiche Format wie Auth-Dateien, so etwas wie user1:password_hash
  • ich einen Ruby-Skript habe update.rb zu synchronisieren Passwörter des Benutzers aus password.txt alle .auth Dateien (auch mehr ein Wrapper zu sed):

Ruby-Skript 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 
012 Update Passwort in passwords.txt und führen update.rb
  • Um einen Benutzer zu einer Gruppe (zB new_user-group_a) hinzufügen:
    • Um das Kennwort eines Benutzers zu aktualisieren geöffnet group_a.auth und fügen Sie die Zeile new_user:.Dann fügen Sie new_user:password_hash-passwords.txt, wenn der Benutzer nicht bereits vorhanden ist, und führt schließlich update.rb
  • 11

    Sie können dies mit AuthDigest Modul und Realms als Gruppen arbeiten - Sie haben mehrere Einträge für einen Benutzer, aber Sie können sie Zeile für Zeile in einer einzigen Datei haben. Nicht perfekt, aber besser als der Alptraum, den du jetzt hast.

    Kleine Änderung in der Konfiguration (siehe auth_digest und user_file für die 2. Position):

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

    und file_a:

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

    danke, sieht gut aus. Ich werde es nächstes Mal testen, wenn ich ngnix verwende ;-) – Markus

    -1

    ich ein Skript bin mit nginx-groups.pl dass Passwort Apache Stil analysiert und Gruppen Dateien und erzeugt individuelle Passwort-Dateien für jede Gruppe. Es tut also im Grunde dasselbe wie das Ruby-Skript in Markus 'Antwort, aber es verwendet nur eine einzige Datei für alle Gruppen und die Gruppendatei ist im selben Format wie für Apache.

    Die aktuelle Version des Skripts ist:

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

    Speichern unter welchem ​​Namen Sie mögen und es ausführbar machen. Wenn Sie ihn ohne Argumente aufrufen, wird eine kurze Verwendungsinformation gedruckt.

    Weitere Informationen finden Sie unter http://www.guido-flohr.net/group-authentication-for-nginx/!

    +0

    Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/13697810) –

    +0

    Okay, @ unamata-sanatarai, Ich habe den Quellcode des Skripts hinzugefügt. –