Я пытаюсь настроить git-http-backend на своем сервере apache2. Прямо сейчас он работает с suexec, оболочкой и всем остальным, но без ограничений. Я могу тянуть и толкать.
Теперь я хотел включить раздел для ограничения разрешений push:
<LocationMatch "^/git/.*/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
AuthUserFile /var/www/vhosts/librepdm.alitecs.de/users
Require user alexander
</LocationMatch>
Пользовательский файл на месте и заполнен. Это говорит мой apache access_log:
93.95.132.202 - - [28/Mar/2012:15:23:18 +0200] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 403 357 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - - [28/Mar/2012:15:23:18 +0200] "GET /git/test.git/info/refs HTTP/1.1" 200 331 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - - [28/Mar/2012:15:23:18 +0200] "GET /git/test.git/HEAD HTTP/1.1" 200 341 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - - [28/Mar/2012:15:23:22 +0200] "PROPFIND /git/test.git/ HTTP/1.1" 405 536 "-" "git/1.7.8.msysgit.0"
и это мой error_log
[Wed Mar 28 15:23:18 2012] [error] [client 93.95.132.202] Service not enabled: 'receive-pack'
Хорошо, подсказка хороша, если я включаю http.recievepack в репо, он работает, НО, если я не сообщаю учетные данные в URL-адресе, я снова получаю сообщение об ошибке, И я не хочу его активировать. Я попробовал кое-что еще. Я отредактировал LocationMatch следующим образом:
<LocationMatch "^/git/.*$">
AuthType Basic
AuthName "Git Access"
AuthUserFile /var/www/vhosts/librepdm.alitecs.de/users
Require user alexander
</LocationMatch>
Я удалил "git-recieve-pack" из регулярного выражения. И сюрприз, что теперь все защищено, также вытаскивает, НО, если я не сообщаю свои учетные данные в URL-адресе, TortoiseGIT запрашивает у меня пользователя и пароль И запускает работу без установки http.recievepack в значение true. Журнал apache немного отличается:
93.95.132.202 - - [28/Mar/2012:15:46:16 +0200] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 401 691 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - - [28/Mar/2012:15:46:20 +0200] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 401 691 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - alexander [28/Mar/2012:15:46:20 +0200] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 200 466 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - alexander [28/Mar/2012:15:46:21 +0200] "POST /git/test.git/git-receive-pack HTTP/1.1" 200 380 "-" "git/1.7.8.msysgit.0"
Если я сравниваю это с первым, первый вызов доступа отличается. В первой части указано 403 - неавторизованный, но у меня не спрашивали учетные данные, и это не помогает передавать в URL-адресе. Во втором - 401, что хорошо.
Итак, у меня вопрос: почему вход в систему работает, если я защищаю все местоположение, а не если я хочу только безопасное нажатие? Команды get идентичны, но меня почему-то не просят ввести логин. IMHO, это проблема не git, TortoiseGT или mysysgit, а apache ...
С уважением, Александр
взглянуть на запрос
/git/test.git/info/refs?service=git-receive-pack
Больше не совпадало <LocationMatch "^/git/.*/git-receive-pack$">
так как service=git-receive-pack
параметр, а не местоположение (URI)
Я обновил свою конфигурацию следующим образом:
<Location /public >
SetEnv CGIT_CONFIG /srv/git/etc/cgitrc-public
SetHandler cgi-script
Options +ExecCGI
RewriteCond %{QUERY_STRING} service=git-receive-pack
RewriteRule .* - [E=AUTHREQUIRED:yes]
AuthzLDAPAuthoritative Off
AuthLDAPURL "ldap://myldap.mycorp.com/dc=mycorp,dc=com?mailNickname"
AuthLDAPBindDN "ldapaccount"
AuthLDAPBindPassword password
AuthType Basic
AuthName "MyCorp LDAP Protected Area"
require valid-user