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

Введение

Subversion содержит Svnserve - облегчённый автономный сервер, использующий собственный протокол поверх обычного TCP/IP соединения. Он идеально подходит для небольших инсталляций, или там, где не может быть использован полнофункциональный сервер Apache.

В большинстве случаев svnserve легче настроить и он работает быстрее, нежели сервер на базе Apache, хотя в нём нет некоторых расширенных возможностей. А теперь, когда добавлена поддержка SASL, его легко можно сделать также и безопасным.

Установка svnserve

  1. Загрузите последнюю версию Subversion по адресу http://subversion.apache.org/getting.html. Или загрузите заранее настроенный установщик с сайта CollabNet по адресу http://www.collab.net/downloads/subversion. Этот установщик настроит запуск svnserve в качестве службы Windows, а также в него включено несколько инструментов, которые вам понадобятся, если вы собираетесь использовать для безопасности SASL.

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

  3. Запустите установщик Subversion. В случае, если вы запустили установку на вашем сервере (рекомендуемый вариант), можете пропустить шаг 4.

  4. При помощи Проводника Windows откройте папку, где установлена Subversion (обычно C:\Program Files\Subversion) и в папке bin найдите файлы svnserve.exe, intl3_svn.dll, libapr.dll, libapriconv.dll, libapriutil.dll, libdb*.dll, libeay32.dll и ssleay32.dll и скопируйте эти файлы (или сразу всю папку bin) в папку на вашем сервере, например c:\svnserve

Запуск svnserve

Теперь, когда svnserve установлен, надо запустить его на вашем сервере. Простейший подход - выполнить из командной строки или при помощи ярлыка Windows следующее:

svnserve.exe --daemon

svnserve запустится и начнёт ожидать входящие запросы на порту 3690. Опция --daemon запускает svnserve в фоновом режиме (daemon), и он будет выполняться, пока его специально не завершат.

Если вы ещё не создали хранилище, следуйте указаниям, приведённым в разделе установки сервера Apache «Настройка».

Чтобы проверить, работает ли svnserve, используйте TortoiseSVNОбозреватель хранилища для просмотра хранилища.

Предполагая, что хранилище расположено в c:\repos\TestRepo, а сервер называется localhost, введите:

svn://localhost/repos/TestRepo

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

Вы можете также усилить безопасность и сократить время на ввод URL при работе с svnserve, используя параметр --root для указания местоположения корневой папки и ограничения доступа только её пределами:

svnserve.exe --daemon --root диск:\путь\к\корню\хранилища

Применительно к предыдущей проверке, svnserve будет запускаться так:

svnserve.exe --daemon --root c:\repos

И URL в обозревателе хранилища TortoiseSVN сократится до:

svn://localhost/TestRepo

Обратите внимание, параметр --root также необходим, если хранилище и svnserve находятся в разных разделах или на разных дисках вашего сервера.

Svnserve может обслуживать любое количество хранилищ - просто разместите их где-либо ниже только что заданной корневой папки, и обращайтесь к ним по URL-адресу, определённому относительно этого корня.

Внимание

Не создавайте и не обращайтесь к хранилищу на основе Berkeley DB, которое находится на разделяемом сетевом ресурсе. Оно не может существовать в рамках удалённой файловой системы. И даже в том случае, если у вас назначена буква для сетевого диска. Если вы пытаетесь использовать Berkeley DB на разделяемом сетевом ресурсе, результаты непредсказуемы - вы можете увидеть загадочные ошибки сразу же, или могут пройти месяцы, прежде чем вы обнаружите, что база данных хранилища коварно испорчена.

Запуск svnserve как службы

Как правило, запускать svnserve как обычную программу - не самый лучший способ: это означает, всегда должен быть пользователь, вошедший в систему на сервере, и что надо не забывать запускать её каждый раз после перезагрузки. Есть лучший способ - запуск и исполнение svnserve как службы Windows. Начиная с Subversion 1.4, svnserve может быть установлен как обычная служба Windows.

Для того, чтобы установить svnserve как обычную службу Windows, выполните следующую команду, создающую службу, автоматически запускаемую при запуске Windows (всё в одной строке):

sc create svnserve binpath= "c:\svnserve\svnserve.exe --service 
    --root c:\repos" displayname= "Subversion" depend= tcpip 
    start= auto

Если где-нибудь в пути встречаются пробелы, необходимо заключить путь в заэкранированные кавычки, вот так:

sc create svnserve binpath= "
    \"C:\Program Files\Subversion\bin\svnserve.exe\"
    --service --root c:\repos" displayname= "Subversion" 
    depend= tcpip start= auto

Вы также можете добавить описание после создания службы, которое будет показываться в оснастке 'Управление службами Windows'.

sc description svnserve "Сервер Subversion (svnserve)"

Обратите внимание на довольно необычный формат командной строки, используемой sc. В парах ключ= значение не должно быть пробела между ключом и =, но должен быть пробел перед значением.

Подсказка

Теперь Microsoft рекомендует, чтобы службы выполнялись под учётной записью или Локальной службы, или Сетевой службы. Обратитесь к The Services and Service Accounts Security Planning Guide. Для создания службы под учётной записью Локальной службы, добавьте к вышеприведённому примеру следующее:

obj= "NT AUTHORITY\LocalService"

Заметьте, вы должны будете предоставить учётной записи Локальной службы соответствующие права и к Subversion, и к хранилищам. Такие же права потребуются и любым приложениям, которые используются скриптами ловушек. Встроенная группа для этого называется просто "СЛУЖБА" (в английской версии - "LOCAL SERVICE").

После установки службы вам необходимо запустить её при помощи оснастки управления службами (это понадобится только в этот раз; она будет запускаться автоматически при перезагрузке сервера).

За более подробной информацией обращайтесь к url="http://svn.collab.net/repos/svn/trunk/notes/windows-service.txt">Windows Service Support for Svnserve (Поддержка службы Windows программой Svnserve)

Если вы установили более раннюю версию svnserve при помощи программы-обёртки SvnService, и теперь вы желаете использовать вместо неё встроенную поддержку, вам необходимо отменить регистрацию этой обёртки как службы (не забудьте сначала её остановить!). Просто используйте команду

svnservice -remove

для удаления записи в реестре, относящейся к этой службе.

Элементарная аутентификация в svnserve

Настройки svnserve по умолчанию предоставляют анонимный доступ только для чтения. Это значит, что вы можете использовать URL svn:// для извлечения и обновления, или воспользоваться обозревателем хранилища TortoiseSVN для просмотра хранилища, но у вас не будет возможности зафиксировать изменения.

Для разрешения доступа на запись в хранилище, вам необходимо отредактировать файл conf/svnserve.conf в папке вашего хранилища. Этот файл управляет конфигурацией svnserve, а также содержит полезную документацию.

Вы можете разрешить анонимный доступ на запись простой установкой:

[general]
anon-access = write

Однако, вы не узнаете, кто произвёл изменения в хранилище, поскольку свойство svn:author будет пустым. Вы также не сможете управлять тем, кто может вносить изменения в хранилище. Это довольно рискованная настройка!

Одним из путей для преодоления этого является создание базы данных паролей:

[general]
anon-access = none
auth-access = write
password-db = userfile

Где userfile - файл, находящийся в той же папке, что и svnserve.conf. Этот файл может располагаться где-нибудь в другом месте вашей файловой системы (это может пригодиться, когда у вас есть несколько хранилищ с одинаковыми правами доступа) и может быть указан по абсолютному пути, или по относительному пути от папки conf. Если вы указываете путь, он должен быть написан /в/стиле/unix. Использование \ или букв дисков работать не будет. Файл userfile должен иметь следующую структуру:

[users]
username = password
...

Этот пример запрещает любой доступ для анонимных (неаутентифицированных) пользователей, и предоставляет доступ для чтения-записи пользователям, перечисленным в userfile.

Подсказка

Если у вас есть несколько хранилищ, использующих одну базу данных паролей, то применение области аутентификации сделает жизнь пользователей легче, поскольку TortoiseSVN может запоминать учётные данные и вам достаточно будет ввести их только однажды. Дополнительная информация содержится в Книге о Subversion, а именно в разделах Create a 'users' file and realm (Создание файла 'users' и области аутентификации) и Client Credentials Caching (Кэширование клиентских учётных данных)

Улучшение безопасности при помощи SASL

Что такое SASL?

Простой уровень аутентификации и безопасности Сайрус (Cyrus Simple Authentication and Security Layer, SASL) - это ПО с открытым исходным кодом, написанное в университете Карнеги-Меллона. Оно добавляет общие возможности по аутентификации и шифрованию в любой сетевой протокол, и, начиная с Subversion 1.5, сервер svnserve и клиент TortoiseSVN знают, как использовать эту библиотеку.

Более полное обсуждение доступных параметров приводится в книге о Subversion в разделе Using svnserve with SASL (Использование svnserve с SASL). Если же вам нужен простой способ настройки безопасных аутентификации и шифрования на Windows-сервере, чтобы обеспечить безопасный доступ к вашему хранилищу через большой опасный Интернет, то читайте дальше.

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

Для включения механизмов SASL на сервере, вам необходимо сделать три вещи. Во-первых, создайте раздел [sasl] в файле svnserve.conf вашего хранилища со следующей парой ключ-значение:

use-sasl = true

Во-вторых, создайте файл с названием svn.conf в подходящем месте - обычно это папка, в которой установлена Subversion.

В-третьих, создайте два новых ключа реестра, служащих для того, чтобы сообщить SASL, где искать необходимые вещи. Создайте раздел реестра с названием [HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library] и поместите в него два новых строковых параметра: SearchPath, указывающий путь к папке, содержащей дополнительные подключаемые модули sasl*.dll (обычно это папка установки Subversion), и ConfFile, задающий папку, содержащую файл svn.conf. Если вы использовали установщик CollabNet, то эти параметры реестра для вас уже были созданы.

Исправьте файл svn.conf, чтобы он содержал следующее:

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: DIGEST-MD5
sasldb_path: C:\TortoiseSVN\sasldb

Последняя строка показывает местоположение базы данных аутентификации, которая является файлом с названием sasldb. Он может быть где угодно, но довольно удобное место - это в родительской папке хранилища. Убедитесь, что у службы svnserve есть доступ для чтения к этому файлу.

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

Теперь, когда эти настройки произведены, всё, что вам необходимо сделать - это создать несколько пользователей и паролей. Для этого вам понадобится программа saslpasswd2. Если вы использовали установщик CollabNet, эта программа будет в папке установки. Выполните команду вроде этой:

saslpasswd2 -c -f C:\TortoiseSVN\sasldb -u область имя_пользователя

Опция -f задаёт местоположение базы данных, область должна быть такой же, как и значение, указанное в файле svnserve.conf вашего хранилища, и имя_пользователя - это именно то, что вы и подозреваете. Обратите внимание: область не должна содержать символов пробела.

Вы можете вывести список пользователей, содержащихся в базе данных, при помощи программы sasldblistusers2.

Шифрование при помощи SASL

Для включения и выключения различных уровней шифрования вы можете указать два значения в файле svnserve.conf вашего хранилища:

[sasl]
use-sasl = true
min-encryption = 128
max-encryption = 256

Переменные min-encryption и max-encryption управляют уровнем шифрования, запрашиваемого сервером. Для полного отключения шифрования установите оба значения в 0. Для включения простой проверки контрольной суммы данных (т.е. для предотвращения искажения и обеспечения целостности данных без шифрования), установите оба значения в 1. Если вы желаете разрешить (но не требовать) шифрование, установите минимальное значение в 0, а максимальное - в какое-либо значение длины ключа в битах. Для безусловного требования шифрования, задайте в обоих значениях числа, большие 1. В нашем предыдущем примере мы требовали, чтобы клиенты использовали шифрование с длиной ключа по крайней мере 128 бит, но не более 256 бит.

Аутентификация при помощи svn+ssh

Другой путь для аутентификации пользователей сервера на основе svnserve - использование безопасной оболочки (SSH) для туннелирования запросов. Её не так просто настроить, как SASL, но она может быть полезной в некоторых случаях.

При этом подходе, svnserve не работает в фоновом режиме, наоборот, безопасная оболочка запускает для вас svnserve как пользователь, которого она аутентифицировала. Для того, чтобы это работало, вам необходим демон безопасной оболочки на вашем сервере.

Основной метод настройки сервера приведён в Приложение G, Организация защиты Svnserve при помощи SSH. Вы можете найти другую информацию на тему SSH в ЧаВо (FAQ) при помощи поиска по слову «SSH».

Дополнительную информацию о svnserve можно найти в Книге о Subversion.

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

Начиная с Subversion версии 1.3, svnserve поддерживает ту же схему авторизации с учётом пути mod_authz_svn, которая доступна с сервером Apache. Вам необходимо отредактировать файл conf/svnserve.conf в папке вашего хранилища и добавить строку, ссылающуюся на файл авторизации.

[general]
authz-db = authz

Здесь, authz - файл, созданный вами для задания разрешений доступа. Вы можете использовать отдельный файл для каждого хранилища, или же вы можете использовать один и тот же файл для нескольких хранилищ. Формат файла описан в «Авторизация с учётом пути».