Сервер на основе Apache

Введение

Наиболее гибкая из всех возможных установок Subversion - это установка на основе Apache. Хотя её несколько сложнее устанавливать и настраивать, она предлагает преимущества, которые другие серверы предоставить не могут:

WebDAV

Сервер Subversion на основе Apache использует протокол WebDAV, который также поддерживается многими другими программами. Вы можете, например, подключить хранилище как «веб-папку» в Проводнике Windows и обращаться к нему как к любой другой папке в файловой системе.

Просмотр хранилища при помощи веб-обозревателя

Вы можете указать в веб-обозревателе URL вашего хранилища и просматривать его содержимое даже без установленного клиента Subversion. Это предоставляет доступ к вашим данным значительно большему кругу пользователей.

Аутентификация

Вы можете использовать любой механизм аутентификации, поддерживаемый Apache, включая SSPI и LDAP.

Безопасность

Поскольку Apache очень стабилен и безопасен, вы автоматически получаете ту же степень безопасности для вашего хранилища, включая шифрование SSL.

Установка Apache

Первое, что вам необходимо перед установкой Apache - это компьютер под управлением Windows 2000, Windows XP+SP1, Windows 2003, Vista или Server 2008.

Внимание

Обратите внимание: использование Windows XP без пакета обновления 1 приводит к передаче фиктивных сетевых данных и вследствие этого может испортить ваше хранилище!

  1. Загрузите последнюю версию веб-сервера Apache по адресу http://httpd.apache.org/download.cgi. Убедитесь, что вы загрузили версию 2.2.x - версии 1.3.xx работать не будут!

    Установщик для Apache в виде msi-файла можно найти, щёлкнув на other files, после чего перейти к binaries/win32. Возможно, вам лучше выбрать msi-файл apache-2.2.x-win32-x86-openssl-0.9.x.msi (тот, который включает OpenSSL).

  2. Как только у вас будет установщик Apache2, вы можете запустить его, и он проведёт вас через процесс установки. Убедитесь, что правильно ввели URL сервера (если у вас нет DNS-имени для сервера, введите IP-адрес). Я рекомендую установить Apache для всех пользователей, на 80 порту, как службу. Примечание: если у вас уже запущен IIS или любая другая программа, принимающая запросы на 80 порту, установка может завершиться неудачей. Если это произошло, перейдите в папку для программ (часто это C:\Program Files\), далее в \Apache Group\Apache2\conf и найдите файл httpd.conf. Отредактируйте его, так чтобы Listen 80 было изменено на свободный порт, например Listen 81. После этого перезапустите установку - на этот раз она должна завершиться без проблем.

  3. Теперь проверьте работоспособность веб-сервера Apache, задав в веб-обозревателе адрес http://localhost/ - должен показаться веб-сайт по умолчанию.

Предостережение

Если вы решили установить Apache как службу, будьте внимательны, поскольку по умолчанию он запускается с правами локальной системной учётной записи. Будет более безопасно, если вы создадите отдельную учётную запись, под которой будет запускаться Apache.

Убедитесь, что для учётной записи на сервере, под которой запускается Apache, есть явная запись в списке контроля доступа папки хранилища (правая кнопка на папке | свойства | безопасность) с полными правами доступа. Иначе пользователи не смогут зафиксировать свои изменения.

Даже если Apache запускается под локальной системной учётной записью, права на папку всё равно должны быть указаны (в данном случае - для учётной записи SYSTEM).

Если же у Apache нет этих прав, ваши пользователи получат сообщение об ошибке «В доступе отказано (Access denied)», которая в журнале ошибок Apache появляется как ошибка 500.

Установка Subversion

  1. Загрузите последнюю версию исполняемых файлов Subversion под Win32 для Apache. Убедитесь, что вы получили правильную версию для интеграции с вашей версией Apache, иначе вы получите невразумительное сообщение об ошибке при перезапуске. Если у вас Apache версии 2.2.x, то пройдите по ссылке http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100.

  2. Запустите установщик Subversion и следуйте инструкциям. Если установщик Subversion обнаружит установленный сервер Apache, то вы уже почти закончили. Если не сможет - вам надо будет выполнить несколько дополнительных шагов.

  3. Используя Проводник Windows, скопируйте из папки, где установлена Subversion (обычно c:\program files\Subversion), в папку с модулями Apache (обычно c:\program files\apache group\apache2\modules) файлы /httpd/mod_dav_svn.so и mod_authz_svn.so.

  4. Скопируйте файлы /bin/libdb*.dll и /bin/intl3_svn.dll из папки, где установлена Subversion, в папку bin Apache.

  5. Откройте конфигурационный файл Apache (обычно C:\Program Files\Apache Group\Apache2\conf\httpd.conf) при помощи текстового редактора, такого как Блокнот, и внесите следующие изменения:

    Разкомментируйте (убрав символ '#') следующие строки:

    #LoadModule dav_fs_module modules/mod_dav_fs.so
    #LoadModule dav_module modules/mod_dav.so
    

    Добавьте следующие две строки в конце секции LoadModule:

    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so
    

Настройка

Итак, вы установили Apache и Subversion, но Apache до сих пор не знает, как работать с клиентами Subversion, такими как TortoiseSVN. Для того, чтобы Apache знал, какой URL должен быть использован для хранилищ Subversion, вы должны отредактировать конфигурационный файл Apache (обычно c:\program files\apache group\apache2\conf\httpd.conf) при помощи любого текстового редактора (например, Блокнота):

  1. В конец файла настроек добавьте следующие строки:

    <Location /svn>
      DAV svn
      SVNListParentPath on
      SVNParentPath D:\SVN
    #  SVNIndexXSLT "/svnindex.xsl"
      AuthType Basic
      AuthName "Subversion repositories"
      AuthUserFile passwd
    #  AuthzSVNAccessFile svnaccessfile
      Require valid-user
    </Location>
    

    Эти настройки сообщают Apache о том, что все ваши хранилища Subversion физически располагаются внутри папки D:\SVN. Хранилища предоставляются внешнему миру по URL: http://MyServer/svn/ . Доступ разрешён только известным пользователям/паролям, перечисленным в файле passwd.

  2. Для создания файла passwd, откройте командную строку (окно эмуляции DOS), перейдите в папку apache2 (обычно c:\program files\apache group\apache2) и создайте файл путём ввода:

    bin\htpasswd -c passwd <username>
    

    Это создаёт файл с именем passwd, который используется для аутентификации. Дополнительные пользователи могут быть добавлены при помощи

    bin\htpasswd passwd <username>
    
  3. Перезапустите службу Apache.

  4. Откройте в вашем веб-обозревателе http://MyServer/svn/MyNewRepository (где MyNewRepository - имя ранее созданного хранилища Subversion). Если всё сделано правильно, у вас будут запрошены имя пользователя и пароль, после чего вы сможете увидеть содержимое вашего хранилища.

Краткое объяснение того, что вы только что ввели:

Таблица 3.1. Настройки Apache в httpd.conf

НастройкаПояснение
<Location /svn>означает, что хранилища Subversion доступны по URL http://MyServer/svn/
DAV svnсообщает Apache, какой модуль будет ответственен за обслуживание этого URL, - в данном случае модуль Subversion.
SVNListParentPath onДля Subversion версии 1.3 или более новой, это указание разрешает выдавать перечень всех доступных хранилищ в папке SVNParentPath.
SVNParentPath D:\SVNпредписывает Subversion искать хранилища в папке D:\SVN
SVNIndexXSLT "/svnindex.xsl"Используется для того, чтобы просмотр через веб-обозреватель выглядел более симпатично.
AuthType Basicдля включения базовой аутентификации, т.е. имя_пользователя/пароль
AuthName "Subversion repositories"используется как информация для пользователя в диалоге аутентификации, сообщая, для доступа к какой области требуется эта аутентификация
AuthUserFile passwdуказывает, какой файл паролей использовать при аутентификации
AuthzSVNAccessFileрасположение файла доступа для путей внутри хранилища Subversion
Require valid-userпредписывает, что только пользователям, предоставившим правильные имя_пользователя/пароль, будет разрешён доступ к URL


Но это только пример. Есть ещё очень много возможностей того, что вы можете сделать с веб-сервером Apache.

  • Если вы желаете, чтобы доступ для чтения к вашему хранилищу был у всех, а доступ для записи - только у некоторых пользователей, вы можете изменить строку

    Require valid-user
    

    на

    <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
    </LimitExcept>
    
  • Использование файла passwd ограничивает или разрешает доступ сразу ко всем вашим хранилищам. Если вам необходим лучший контроль за тем, какие пользователи имеют доступ к каждой папке внутри хранилища, вы можете разкомментировать строку

    #AuthzSVNAccessFile svnaccessfile
    

    и создать файл доступа Subversion. Apache будет проверять, чтобы только дозволенные пользователи имели доступ к папке /svn, и после этой проверки будет передавать имя пользователя в модуль AuthzSVNAccessFile для того, чтобы можно было осуществить более тонко настроенный доступ на основе правил из файла доступа Subversion. Обратите внимание, пути указываются как хранилище:путь или просто путь. Если вы не укажете конкретное хранилище, это правило доступа будет применено ко всем хранилищам в папке SVNParentPath. Формат файла политики авторизации, используемого в mod_authz_svn, описан в «Авторизация с учётом пути»

  • Для того, чтобы сделать просмотр хранилища при помощи веб-обозревателя более 'симпатичным', разкомментируйте строку

    #SVNIndexXSLT "/svnindex.xsl"
    

    и поместите файлы svnindex.xsl, svnindex.css и menucheckout.ico в корневую папку документов Apache (обычно C:/Program Files/Apache Group/Apache2/htdocs). Папка задаётся при помощи указания DocumentRoot в файле конфигурации Apache.

    Вы можете скачать эти три файла прямо из нашего хранилища исходного кода по ссылке http://tortoisesvn.tigris.org/svn/tortoisesvn/trunk/contrib/other/svnindex. («TortoiseSVN бесплатен!» рассказывает, как получить доступ к хранилищу исходного кода TortoiseSVN).

    В xsl-файле из хранилища TortoiseSVN реализована одна хитрость: при просмотре хранилища при помощи веб-обозревателя справа от каждой папки показывается значок. Если щёлкнуть по нему, будет запущен диалог извлечения TortoiseSVN для этого URL.

Работа с несколькими хранилищами

Если вы используете указание SVNParentPath, тогда вам не надо изменять конфигурационный файл Apache каждый раз при добавлении нового хранилища Subversion. Просто создайте новое хранилище в той же папке, где и первое хранилище, и всё! В моей компании у меня есть прямой доступ к этой папке на сервере посредством SMB (обычный доступ к файлам в Windows). Поэтому я просто создаю там новую папку, выполняю команду TortoiseSVN TortoiseSVNСоздать здесь хранилище... и у нового проекта уже есть свой дом...

Если вы используете Subversion версии 1.3 или более поздней, вы можете использовать указание SVNListParentPath on для того, чтобы Apache создавал перечень всех доступных проектов при попытке открыть веб-обозревателем родительскую папку, а не конкретное хранилище.

Авторизация с учётом пути

Модуль mod_authz_svn позволяет детально управлять правами доступа, основываясь на именах пользователей и на путях в хранилище. Эта возможность доступна при работе с сервером Apache, а начиная с Subversion версии 1.3 она также доступна и в svnserve.

Файл для примера может выглядеть подобно этому:

[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak
# Default access rule for ALL repositories
# Everyone can read, admins can write, Dan German is excluded.
# Правило доступа по умолчанию для ВСЕХ хранилищ
# У всех есть права на чтение, у группы admin есть права на запись,
# у Dan German - нет допуска.
[/]
* = r
@admin = rw
dangerman =
# Allow developers complete access to their project repos
# Разрешить разработчикам полный доступ к хранилищам,
# содержащим их проекты
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw
# Give the doc people write access to all the docs folders
# Предоставить пользователям, создающим документацию,
# доступ для записи к папкам с документацией (docs)
[/trunk/doc]
@docs = rw
# Give trainees write access in the training repository only
# Предоставить стажёрам доступ для записи только к
# учебному хранилищу
[TrainingRepos:/]
@training = rw

Заметьте, проверка каждого пути может быть очень затратной операцией, особенно в случае журнала ревизий. Сервер проверяет каждый изменённый путь в каждой ревизии на возможность чтения, что может повлечь существенные затраты времени для ревизий, затрагивающих большое количество файлов.

Аутентификация и авторизация - отдельные процессы. Если пользователь хочет получить доступ по какому-либо пути в хранилище, он должен удовлетворить обоим наборам требований: обычным требованиям аутентификации и требованиям авторизации из файла доступа.

Аутентификация при помощи домена Windows

Как вы могли уже заметить, вам необходимо сделать запись имя_пользователя/пароль в файле passwd для каждого пользователя отдельно. И если (в целях безопасности) вы желаете, чтобы ваши пользователи периодически меняли свои пароли, вы должны будете выполнять эти изменения вручную.

Однако, есть решение этой проблемы - по крайней мере, если вы обращаетесь к хранилищу из ЛВС с контроллером домена Windows: mod_auth_sspi!

Первоначально модуль SSPI был предложен Syneapps вместе с исходным кодом, но его разработка была остановлена. Впрочем, не отчаивайтесь: сообществом работа над ним была возобновлена, и было реализовано несколько улучшений. Теперь этот проект располагается на SourceForge.

  • Скачайте модуль, соответствующий вашей версии Apache, и скопируйте файл mod_auth_sspi.so в папку модулей Apache.

  • Отредактируйте конфигурационный файл Apache: добавьте строку

    LoadModule sspi_auth_module modules/mod_auth_sspi.so
    

    в секцию LoadModule. Убедитесь, что вы вставили эту строку перед строкой

    LoadModule auth_module modules/mod_auth.so
    
  • Для того чтобы это размещение Subversion использовало этот тип аутентификации, вы должны изменить строку

    AuthType Basic
    

    на

    AuthType SSPI
    

    ещё вам надо добавить

    SSPIAuth On
    SSPIAuthoritative On
    SSPIDomain <domaincontroller>
    SSPIOmitDomain on
    SSPIUsernameCase lower
    SSPIPerRequestAuth on
    SSPIOfferBasic On
    

    внутри блока <Location /svn>. Если у вас нет контроллера домена, оставьте имя контроллера домена в виде <domaincontroller>.

Заметьте, что если вы производите аутентификацию при помощи SSPI, то вам больше не нужна строка AuthUserFile для определения файла паролей. Вместо этого Apache аутентифицирует ваши имя пользователя и пароль при помощи домена Windows. Дополнительно вам необходимо будет обновить список пользователей в файле доступа Subversion (svnaccessfile) для того, чтобы они и там указывались как ДОМЕН\имя_пользователя.

Важно

Аутентификация SSPI работает только для соединений, защищённых SSL (т.е. https). Если вы используете только обычные http-соединения с сервером, она работать не будет.

Для включения SSL на вашем сервере, смотрите «Защита сервера при помощи SSL».

Подсказка

Файлы AuthzSVNAccessFile в Subversion учитывают регистр в именах пользователей (JUser отличается от juser).

В мире Microsoft домены Windows и имена пользователей не зависят от регистра. Но даже в такой ситуации некоторые сетевые администраторы предпочитают создавать учётные записи пользователей ВCмешанномСтиле (например, JUser).

Эта разница может затронуть вас при использовании аутентификации SSPI, поскольку домены Windows и имена пользователей передаются в Subversion в том виде, в каком пользователь набрал их при запросе. Internet Explorer часто передаёт имя пользователя Apache автоматически, используя тот же регистр, который был использован при создании учётной записи.

В итоге, вам может понадобиться по крайней мере две записи в вашем файле AuthzSVNAccessFile для каждого пользователя - одна строчными буквами, другая - в том виде, в каком Internet Explorer передаёт её Apache. Вам также надо будет обучить пользователей тому, чтобы они вводили свои учётные данные для доступа к хранилищам посредством TortoiseSVN в нижнем регистре.

Журнал ошибок и журнал доступа Apache - ваши лучшие друзья в расшифровывании такого рода проблем, поскольку они помогут вам определить строку с именем пользователя, переданную в модуль AuthzSVNAccessFile Subversion. Возможно, вам придётся поэкспериментировать с точным форматом строки пользователя в файле svnaccessfile (например, ДОМЕН\пользователь или ДОМЕН//пользователь) для того, чтобы всё работало.

Множественные поставщики аутентификации

Возможно использование более одного поставщика аутентификации для хранилища Subversion. Для этого необходимо сделать каждый тип аутентификации не-авторитарным (non-authoritative), чтобы Apache проверял несколько поставщиков на подходящие имя_пользователя/пароль.

Обычный сценарий - использование двух поставщиков аутентификации: во-первых - домена Windows, во-вторых - файла passwd для предоставления возможности доступа к SVN пользователям, не зарегистрированным в домене Windows.

  • Для включения сразу обоих поставщиков аутентификации: и домена Windows, и файла passwd, добавьте следующие строки в блоке <Location> конфигурационного файла Apache:

    AuthBasicAuthoritative Off
    SSPIAuthoritative Off
    

Вот пример полной конфигурации Apache для совмещённой аутентификации через домен Windows и файл passwd:

<Location /svn>
  DAV svn
  SVNListParentPath on
  SVNParentPath D:\SVN

  AuthName "Subversion repositories"
  AuthzSVNAccessFile svnaccessfile.txt

# NT Domain Logins.
  AuthType SSPI
  SSPIAuth On
  SSPIAuthoritative Off
  SSPIDomain <domaincontroller>
  SSPIOfferBasic On

# Htpasswd Logins.
  AuthType Basic
  AuthBasicAuthoritative Off
  AuthUserFile passwd

  Require valid-user
</Location>

Защита сервера при помощи SSL

Хотя в Apache 2.2.x и есть поддержка OpenSSL, по умолчанию она отключена. Вам необходимо включить её вручную.

  1. В файле конфигурации Apache разкомментируйте строки:

    #LoadModule ssl_module modules/mod_ssl.so
    

    и в конце

    #Include conf/extra/httpd-ssl.conf
    

    после чего измените строку

    SSLMutex "file:C:/Program Files/Apache Software Foundation/\
    Apache2.2/logs/ssl_mutex"
    

    на

    SSLMutex default
    
  2. Далее вам надо создать сертификат SSL. Для этого откройте командную строку (окно эмуляции DOS) и перейдите в папку Apache (например, C:\program files\apache group\apache2) и введите следующую команду:

    bin\openssl req -config conf\openssl.cnf -new -out my-server.csr
    

    У вас будет запрошена парольная фраза. Пожалуйста, не используйте просто слова, используйте целые предложения, например, часть стихотворения. Чем длиннее фраза, тем лучше. Ещё вам надо будет ввести URL вашего сервера. Все другие вопросы необязательны, но мы рекомендуем ответить также и на них.

    Обычно файл privkey.pem создаётся автоматически, но если этого не произошло, вам надо ввести эту команду для его генерации:

    bin\openssl genrsa -out conf\privkey.pem 2048
    

    Потом введите команды

    bin\openssl rsa -in conf\privkey.pem -out conf\server.key
    

    и (одной строкой)

    bin\openssl req -new -key conf\server.key -out conf\server.csr \
                     -config conf\openssl.cnf
    

    потом (одной строкой)

    bin\openssl x509 -in conf\server.csr -out conf\server.crt
                     -req -signkey conf\server.key -days 4000
    

    Это создаст сертификат со сроком действия в 4000 дней. И, наконец, введите (одной строкой):

    bin\openssl x509 -in conf\server.cert -out conf\server.der.crt                 -outform DER
    

    Эти команды создали несколько файлов в папке conf Apache (server.der.crt, server.csr, server.key, .rnd, privkey.pem, server.cert).

  3. Перезапустите службу Apache.

  4. Введите в вашем веб-обозревателе https://servername/svn/project ...

SSL и Internet Explorer

Если вы обезопасили свой сервер при помощи SSL и используете аутентификацию при помощи домена Windows, вы обнаружите, что просмотр хранилища при помощи Internet Explorer больше не работает. Не волнуйтесь - это только Internet Explorer не способен провести аутентификацию. В других обозревателях такой проблемы нет, так что TortoiseSVN и любой другой клиент Subversion по-прежнему способны проводить аутентификацию.

Если вам всё равно необходимо просматривать хранилище при помощи IE, у вас есть следующие варианты:

  • задайте отдельное указание <Location /путь> в конфигурационном файле Apache, и добавьте SSPIBasicPreferred On. Это позволит IE аутентифицироваться, но зато другие обозреватели и Subversion не будут способны аутентифицироваться для этого размещения.

  • Попробуйте также просмотр с незашифрованной аутентификацией (без SSL). Странно, но у IE нет каких-либо проблем с аутентификацией, если соединение не защищено при помощи SSL.

  • Часто в "стандартных" настройках SSL в виртуальном узле SSL Apache есть следующее указание:

    SetEnvIf User-Agent ".*MSIE.*" \
                 nokeepalive ssl-unclean-shutdown \
                 downgrade-1.0 force-response-1.0
    

    Есть (были?) веские причины для такой конфигурации, см. http://www.modssl.org/docs/2.8/ssl_faq.html#ToC49 Но если вы желаете использовать аутентификацию NTLM, вам необходимо использовать keepalive. Если вы разкомментируете SetEnvIf полностью, вы сможете заставить IE аутентифицироваться при помощи аутентификации Windows с использованием SSL в Apache на платформе Win32 с загруженным модулем mod_auth_sspi.

Принудительное использование SSL при доступе

После того, как вы настроили SSL для большей безопасности хранилища, возможно, вы пожелаете отключить обычный доступ не через SSL (http), и оставить доступ только через https. Для этого вы должны добавить ещё одно указание в блок <Location> Subversion: SSLRequireSSL.

Пример блока <Location> будет выглядеть так:

<Location /svn>
  DAV svn
  SVNParentPath D:\SVN
  SSLRequireSSL
  AuthType Basic
  AuthName "Subversion repositories"
  AuthUserFile passwd
#  AuthzSVNAccessFile svnaccessfile
  Require valid-user
</Location>

Использование клиентских сертификатов с виртуальными SSL-узлами

Прислано в список рассылки TortoiseSVN Найджелом Грином (Nigel Green). Спасибо!

В некоторых серверных конфигурациях вам может быть необходимо настроить один сервер, включающий 2 виртуальных SSL-узла: один для общего доступа через веб (не требующий клиентского сертификата), другой должен быть безопасным, с запросом клиентского сертификата, на котором и работает сервер Subversion.

Добавление указания SSLVerifyClient Optional в секции per-server конфигурации Apache (т.е. вне всех блоков VirtualHost и Directory) заставляет Apache запрашивать сертификат клиента при начальном установлении связи с использованием SSL. Из-за ошибки в mod_ssl необходимо, чтобы сертификат запрашивался на этой стадии, поскольку это не сработает при повторном установлении SSL-соединения.

Решением будет добавление следующего указания к папке виртуального узла, к которой желательно ограничить доступ для использования Subversion

SSLRequire %{SSL_CLIENT_VERIFY} eq "SUCCESS"

Это указание предоставляет доступ к папке только в случае, если сертификат клиента был получен и проверен успешно.

Резюмируя, соответствующие строки конфигурации Apache выглядят следующим образом:

SSLVerifyClient Optional

### Конфигурация ОБЩЕДОСТУПНОГО виртуального узла
### (не запрашивающего сертификат)

<VirtualHost 127.0.0.1:443>
  <Directory "путь_к_общедоступному_файловому_корню">
  </Directory>
</VirtualHost>

### Конфигурация виртуального узла SUBVERSION
### (требующего клиентский сертификат)
<VirtualHost 127.0.0.1:443>
  <Directory "корневой путь узла subversion">
    SSLRequire %{SSL_CLIENT_VERIFY} eq "SUCCESS"
  </Directory>

  <Location /svn>
    DAV svn
    SVNParentPath /путь_к_хранилищу
  </Location>
</VirtualHost>