Устанавливаем веб-сервер Apache2Для повышения общего уровня безопасности, будем авторизовывать клиента через подписанный нами сертификат; поэтому нам следует воспользоваться опцией FakeBasicAuth. При входе клиента с выданным нами сертификатом на сервер Apache произведет псевдоавторизацию, основываясь на данных сертификата.
Надо отметить, что при подобной авторизации имя пользователя выглядит как строка свойств сертификата. Соответственно при коммите через HTTPS имя пользователя будет не stellar, а
/C=RU/ST=-/L=Moscow/O=Reki.ru/OU=SVN/CN=stellar/emailAddress=скрыто
. Понятно, что наличие в двух ипостасях одного и того же пользователя никого устроить не может и хорошим решением было бы взять в качестве логина часть строки данных сертификата. Для этого в Apache предусмотрена директива SSLUserName и... увы и ах, мир несовершенен: без исправлений кода mod_ssl опции FakeBasicAuth и SSLUserName вместе не работают.
К счастью, по URL http://reki.ru/products/subversion/patch-server-ssl_engine_kernel.c, теперь доступен патч, исправляющий это недоразумение.
Для сборки Apache с поддержкой FakeBasicAuth + SSLUserName надо скачать патч и положить его в каталог /usr/ports/www/apache2/files. Если предполагается, что репозиторий Subversion будет храниться в BerkeleyDB, нам также будет необходимо включить поддержку BerkeleyDB для Apache.
Итак, устанавливаем необходимые переменные окружения и запускаем установку Apache.
# cd /usr/ports/www/apache2
# setenv WITH_BERKELEYDB db42
# cd files
# fetch http://reki.ru/products/subversion/patch-server-ssl_engine_kernel.c
# cd ../
# make install clean
Устанавливаем систему контроля версий Subversion
Поскольку предполагается, что доступ к SVN будет осуществляться по протоколу HTTPS, нам следует установить модуль mod_dav_svn. По умолчанию репозиторий SVN создается в каталоге /home/svn/repos.
# cd /usr/ports/devel/subversion
# setenv WITH_MOD_DAV_SVN yes
# setenv WITH_APACHE2_APR yes
# make install clean
Если требуется подсветка синтаксиса исходных файлов, устанавливаем программу enscript. В этом случае в файле конфигурации WebSVN следует включить поддежку enscript.
# cd /usr/ports/print/enscript-a4
# make install clean
Устанавливаем PHP4PHP4 нам понадобится для WebSVN – веб-фронтэнда репозитория. Для работы WebSVN необходимо установить расширения PHP для поддержки zlib и pcre.
# cd /usr/ports/lang/php4
# make install clean
# cd /usr/ports/lang/php4-extensions
# make install clean
Устанавливаем и настраиваем WebSVNПо умолчанию WebSVN устанавливается в /usr/local/www/data/WebSVN. Для наших целей придется скопировать его содержимое в каталог /usr/home/www/svn/svn.reki.ru/www.
# cd /usr/ports/devel/websvn
# make install clean
# mkdir -p /usr/home/www/svn/svn.reki.ru/www
# mkdir -p /var/log/apache/www/svn.reki.ru
# cp -r /usr/local/www/data/WebSVN /usr/home/www/svn/svn.reki.ru/www
// Правим файл конфигурации фронтэнда
# vi /usr/home/www/svn/svn.reki.ru/www/include/config.inc
Примерный вид файла конфигурации следующий:
// Указываем пути к программам svn, diff, sed, tar и gzip
$config->setSVNCommandPath("/usr/local/bin");
$config->setDiffPath("/usr/bin");
$config->setSedPath("/usr/bin");
$config->setTarPath("/usr/bin");
$config->setGZipPath("/usr/bin");
// Перечисляем все те репозитории, которые должны быть доступны через фронтэнд
$config->addRepository("Example Repository #1", "/usr/home/svn/example");
$config->addRepository(«Example Repository #2", "/usr/home/svn/example2");
// Язык веб-интерфейса
include("languages/russian.inc");
// Кодировки веб-интерфейса
$config->setInputEncoding("windows-1251");
$config->setOutputEncoding("windows-1251");
// Включить кэширование данных для фронтэнда
$config->setCachingOn();
// Разрешить скачивание проекта в виде tar.gz-архива
$config->allowDownload();
// Включить подсветку синтаксиса программой enscript
$config->setEnscriptPath("/usr/local/bin");
$config->useEnscript();
Создаем сертификаты и конфигурируем серверное ПО
Создаем собственный самоподписанный сертификат (Certificate Authority, CA). Используя этот сертификат, мы будем подписывать сертификат сервера и все клиентские сертификаты.
# openssl req -new -newkey rsa:1024 -x509 -days 3650 -nodes -out ca.crt -keyout ca.key -subj /C=RU/ST=-/L=Moscow/O=Reki.ru/OU=Certificate_Issuer/CN=reki.ru/emailAddress=скрыто
Перечислим список команд:- req – запрос на создание нового сертификата.
- -new – cоздание запроса на сертификат (Certificate Signing Request, CSR).
- -newkey rsa:1024 – длина RSA ключа сертификата.
- -x509 – создание самоподписанного сертификата вместо создания CSR.
- -days 3650 – срок действия сертификата (10 лет). Это значение должно быть больше срока действия создаваемого сертификата сервера и клиентских сертификатов.
- -nodes – флаг, указывающий не шифровать ключ.
- -out ca.crt – сертификат.
- -keyout ca.key – закрытый ключ сертификата.
- -subj – данные сертификата.
Строка subj имеет следующие поля:- С – код страны (Country). Двухбуквенная аббревиатура.
- ST – название республики, региона или округа (State Name).
- L – название города/деревни (Locality Name).
- O – организация (Organization Name).
- OU – отдел организации (Organization Unit).
- CN – имя. Для сервера – ServerName; для клиентского сертификата – что угодно.
- emailAddress – почтовый адрес администратора сервера.
Для создания серверного и клиентских сертификатов вам понадобится либо воспользоваться стандартным файлом конфигурации openssl.cnf, который, как правило, находится в каталоге /etc/ssl, либо вручную создать собственный файл конфигурации (название файла – ca.config):
[ca]
default_ca = CA_CLIENT
[CA_CLIENT]
dir = ./db # Рабочий каталог для базы данных клиентских ключей
certs = $dir/certs # Каталог для новых сертификатов
new_certs_dir = $dir/newcerts # Каталог, куда будут складываться выписанные сертификаты
database = $dir/index.txt # Индекс базы данных выписанных ключей
serial = $dir/serial # Номер текущего ключа
certificate = ./ca.crt # Собственный самоподписанный сертификат CA
private_key = ./ca.key # Закрытый ключ сертификата CA
default_days = 365 # Время, на которое выписывается клиентский сертификат
default_crl_days = 7 # Срок действия CRL
default_md = md5 # Алгоритм подписи
policy = policy_anything # Название секции политики
[policy_anything]
countryName = optional # Разрешаем не указывать код страны
stateOrProvinceName = optional # ------ // ------- название штата или округа
localityName = optional # ------ // ------- название города/деревни
organizationName = optional # ------ // ------- название организации
organizationalUnitName = optional # ------ // ------- название отдела
commonName = supplied # Обязательно указать имя.
emailAddress = optional # Почтовый адрес можно не указывать
Создаем структуру каталогов, описанную в секции [CA_CLIENT]
# mkdir -p /usr/local/etc/crt
# cd /usr/local/etc/crt
// Создаем и редактируем файл конфигурации
# vi ca.config
# mkdir ./db
# mkdir ./db/certs
# mkdir ./db/newcerts
# touch ./db/index.txt
# echo "01" > ./db/serial