gitweb mit Passwortschutz
gitweb ist, wie vorgestern beschrieben, eine schöne Sache - aber nicht immer will man seine Repositories jedermann zugänglich machen. Schön wäre es doch, wenn man die Möglichkeit hätte, auch den Zugriff auf gitweb an eine Anmeldung zu koppeln und so nur für befugte Benutzer zu erlauben. Eine Möglichkeit dazu will ich nachstehend schildern, orientiert an einem Beitrag im Blog von Leho Kraav.
Weitere, vielleicht hilfreiche Anregungen dazu kann man ergoogeln, bspw.
- Using apache authentication with gitweb, gitosis – repository access control
- madduck’s gitweb.conf
- Securing gitweb
u.a.
Voraussetzung dafür ist eine ausreichend neue Version von gitweb; die in Debian Lenny verfügbare Version 1.5.6.5 genügt nicht. Sie kann allerdings gepatcht werden (die Änderung ist minimal):
--- /usr/lib/cgi-bin/gitweb.cgi.OLD 2010-01-14 16:49:44.000000000 +0100
+++ /usr/lib/cgi-bin/gitweb.cgi 2010-01-15 15:30:40.975350737 +0100
@@ -86,6 +86,11 @@
# (only effective if this variable evaluates to true)
our $export_ok = "";
+# show repository only if this subroutine returns true
+# when given the path to the project, for example:
+# sub { return -e "$_[0]/git-daemon-export-ok"; }
+our $export_auth_hook = undef;
+
# only allow viewing of repositories also shown on the overview page
our $strict_export = "";
@@ -353,7 +358,8 @@
sub check_export_ok {
my ($dir) = @_;
return (check_head_link($dir) &&
- (!$export_ok || -e "$dir/$export_ok"));
+ (!$export_ok || -e "$dir/$export_ok") &&
+ (!$export_auth_hook || $export_auth_hook->($dir)));
}
# process alternate names for backward compatibility
Das vorausgesetzt, genügt es, die gitweb.conf folgendermaßen zu erweitern:
# HTTP Basic Auth
$gitosis_conf = '/home/gitosis/.gitosis.conf';
$username = $cgi->remote_user;
$export_auth_hook = sub {
my $projectdir = shift;
if($projectdir =~ (/(.*?)\.git/)) {
#my $projectname = basename($1);
my $projectname = $1;
$projectname =~ s/$projectroot\/?//;
open FILE, $gitosis_conf or die 'Could not open gitosis config file. Please make sure that $gitosis_conf is set properly';
my $project_match = 0;
my $user_match = 0;
while(<FILE>) {
if($_ =~ /^\s*members\s*\=\s*(?:.*?\s)*$username(?:\s+|$)/) {$user_match = 1;}
if($_ =~ /^\s*(read|writ)able\s*\=\s*(?:.*?\s)*$projectname(?:\s+|$)/) {$project_match = 1;}
if($project_match && $user_match) {
return 1;
}
if($_ =~ /\[group/) {
$project_match = $user_match = 0;
}
}
}
return 0;
};
Dann muß noch die Apache-Konfiguration passend erweitert werden, um HTTP-Basic-Authentication für das entsprechende Verzeichnis zu machen:
<Location />
AuthType Basic
AuthName "git.host.example"
AuthUserFile /home/gitosis/gitosis/ht.passwd
Require valid-user
</Location>
Pfade müssen, wie üblich, entsprechend angepaßt werden.
Und schließlich müssen für die in der gitosis.conf definierten Benutzer - jedenfalls diejenigen, die auch Webzugriff haben sollen - Paßworte in der /home/gitosis/gitosis/ht.passwd angelegt werden. Dazu wird wie gewohnt htpasswd bzw. htpasswd2 aufgerufen.
Voilá!
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt