Jan-Philipp Litza

Feinere hgwebdir ACLs

Vor 2 Tagen habe ich unter hg.deadorc.de (Update: Inzwischen bin ich auf git umgestiegen unter git.jplitza.de) einfach mal hgwebdir (ein Script, das mit Mercurial mitgeliefert wird) aufgesetzt, um Mercurial über HTTP zu testen. Dabei haben mir vor allem Per-Repository-ACLs gefehlt. Aber mal der Reihe nach. Positiv aufgefallen ist mir, dass keinerlei vHost-Anpassungen notwendig sind. Es lässt sich alles über htaccess realisieren, inklusive der schöneren URLs. Vielleicht wäre es über ein ScriptAliasMatch im vHost effizienter oder einfacher, aber es ist eben nicht zwingend nötig – CGI, FCGI oder mod_python Support reicht aus. Meine .htaccess dafür sieht etwas anders aus als die, die im Tutorial angegeben ist:

Options +ExecCGI
RewriteEngine on
RewriteRule ^(hgwebdir.fcgi|robots.txt) - [L] 
RewriteRule (.*) hgwebdir.fcgi/$1 [QSA,L]

AuthType Digest
AuthName "mercurial repositories"
AuthDigestProvider file
AuthUserFile /path/to/hgwebdir/script/htpasswd

<LimitExcept GET>
    Require valid-user
</LimitExcept>

Negativ aufgefallen ist mir, da ich von SVN komme, dass man nicht genau einstellen kann, wer auf welches Repository zugreifen kann. Man kann zwar generell nur authentifizierten Benutzern das Pushen erlauben, und in der projekteigenen hgrc dann einstellen, welche Benutzer pushen dürfen, aber pullen darf jeder oder keiner – eine projektweise Einstellung dafür gibt es nicht.

Nun benutze ich eh aus Bequemlichkeit in der hgweb.config die Einstellung

[collections]
. = .

was einfach mal alle ./*/.hg auch als Repo veröffentlicht. Das heißt, dass es für jedes Repo auch einen realen Pfad ./<reponame> gibt. Und auch wenn dieses Verzeichnis von Apache überhaupt nicht benutzt wird aufgrund der mod_rewrite Einstellungen kann man dort dann eine .htaccess Datei anlegen, die benutzt wird. Das ermöglicht dann doch das beschränken der Pull-Berechtigungen, indem man dort z.B. nur ein „Require valid-user“ reinschreibt (natürlich nur, wenn man in ./.htaccess schon eine Authentifizierung definiert hat).

Nachtrag: Inzwischen ist mir leider ne heftige Lücke aufgefallen: Man kann natürlich immer noch mit hgwebdir.cgi/<reponame> auf das Repository zugreifen. Wie man das verhindern kann, ist mir noch nicht klar. Mir fällt nur eine „Security by Obscurity“ Maßnahme ein, nämlich das Script umzubenennen. Alles andere als optimal, aber immer noch besser als gar keine Sicherheit.