Instalar SVN como modulo de Apache, con SSL y autentificación básica, en Ubuntu


Pues hace un rato que aprendimos a hacer este tipo de instalación en la Unidad y como se me hace algo útil, muy practico, y que a veces no es trivial de hacer, me decidí a escribir este tutorial. Estoy muy basado en el tutorial que escribió Viktor Zigo

  • Suponemos que la instalación se va a realizar en Ubuntu, esto significa que el servidor va a vivir en Ubuntu.
  • Que queremos que los repositorios sean visibles vía web, que el servidor web sea Apache de la rama 2.x (Subversión tiene su propio servidor, nosotros mejor ocuparemos Apache).
  • Que el protocolo para comunicarse sea SSL, la información viaje encriptada (es decir que el URL sea https://algo).
  • Que se podría hospedar mas de un repositorio.
  • Que para conectarse un usuario tenga que proporcionar un password.
  • Que tengamos políticas de acceso, es decir que no todos los usuarios puedan ver todas las carpetas, habrá algunos que puedan ver, otros que puedan escribir, y a cada carpeta le podemos poner diferentes atributos (permisos).

Cuando aprendimos a hacer esta instalación leímos el tutorial de Viktor Zigo, que esta libre bajo una licencia Creative Commons, sin embargo me decido a aumentar algunas cosas como la política de acceso, además dado que no hay mucha documentación en español sobre este tema, me imagino que este documento le ayudara a alguien.

Paquetes necesarios

Hay que instalar, o verificar que estén instalados los siguientes paquetes:

  • subversion
  • libapache2-svn
  • libapache-mod-dav
  • apache2

En ubuntu 7.10 el paquete libapache-mod-dav, no existe simplemente continuamos sin el pues mod-dav ya esta incluido en apache2

Habilitar el modulo de SSL en apache

Para hacer este paso primero hay que habilitar el modulo de apache que deja comunicarse via SSL, luego hay que editar un archivo de configuración de apache para decirle que escuche por el puerto 443, que es el default de SSL

Habilitar el modulo de apache2 de SVN

sudo a2enmod ssl

Editar el archivo de configuración /etc/apache2/ports.conf del apache.

Agregando al final la linea: “Listen 443”. Es decir deben haber dos lineas, la del 80 y la del 443

Nota me acabo de dar cuenta de que en Ubuntu 7.10, no es necesaria la edición del archivo, pues el comando anterior a2enmod, ya edita el archivo por nosotros, lo que se debe de hacer es fijarnos en este archivo y que escuche el 443.

Generar un certificado

Para hacer un certificado hay que ocupar una herramienta, desde Ubuntu Festy en adelante esta herramienta es: make-ssl-cert, antes de eso la herramienta era: apache2-ssl-certificate.

Sea cual sea el caso, hay que hacer un certificado, el certificado es un archivo .pes y una llave, que es un archivo con números raros de nombre.

Para hacer el certificado la herramienta nos hace algunas preguntas, como quienes somos, donde se ubica el servidor físicamente, a que organización pertenecemos, etc.

Es importante usar el nombre real de nuestro servidor, cuando lo pida, por que de lo contrario cada vez que un usuario quiera acceder al repositorio, su cliente le marcara un warning diciendo que el servidor y el emisor del certificado no corresponden.

Si el servidor va a ser accesible por un dominio, el dominio es el nombre del servidor, si va a ser accedido por una IP fija, la IP es el nombre del servidor, si va a ser accedido dentro de una red interna el nombre en la red de la maquina es el nombre del servidor.

La herramienta debe generar ambos archivos el apache.pem y el de la llave, lo mas recomendable es que estos se encuentren en la carpeta ssl, dentro de la carpeta de apache. Puede que sea necesario que nosotros tengamos que mover los archivos manualmente.

La herramienta antes de Festy 7.04 se usaba asi:

sudo apache2-ssl-certificate

Desde Festy en adelante se usa así:

sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem

En donde el primer argumento es el comando a invocar en este caso make-ssl-cert, el segundo es una plantilla de certificado en este caso se ubica en /usr/share/ssl-cert/ssleay.cnf, y el tercero el lugar donde se pone el certificado /etc/apache2/ssl/apache.pem. Es decir que lo único que podría cambiar es el tercer argumento aunque no se recomienda. Es importante que antes se cree la carpeta donde va a vivir el certificado

Crear un host virtual

En apache2 hay posibilidad de que un solo servidor maneje muchos sitios, lo mas recomendable es hacer un sitio aparte para nuestros repositorios de SVN.

Copiamos el sitio de default, para ocuparlo de plantilla

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/$NOMBRESITIO

En donde $NOMBRESITIO, es el nombre que queremos que tenga nuestro sitio que maneja los repositorios. por ejemplo podemos ponerle repos.

Editamos configuración del sitio

Abrimos con nuestro editor de textos plano favorito el recién creado archivo de configuración del sitio y lo editamos:

Cambiamos la parte que dice:

NameVirtualHost *
<VirtualHost *>

Por:

NameVirtualHost *:443
<VirtualHost *:443>

Y añadimos las siguientes lineas:


SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.pem
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM

Dentro de las etiquetas VirtualHost, pero fuera de cualquier etiqueta Directory

Habilitamos el nuevo host virtual

Primero le decimos a apache que ya hay un nuevo sitio

sudo a2ensite $NOMBRESITIO

Y reiniciamos apache

sudo /etc/init.d/apache2 restart

Si hubo errores al editar el archivo, ahora se quejara, corregimos hasta que apache arranque, si hay un warning de que no puede determinar el nombre de dominio calificado, es normal.

Y se puede arreglar añadiendo ServerName $NOMBREDELSERVIDOR al archivo de configuración principal de apache: /etc/apache2/apache2.conf (el nombre del servidor es el nombre de la maquina que lo hospeda)

Creando los repositorios:

Suponemos que queremos tener varios repositorios, creamos una carpeta donde ponerlos todos, un buen lugar para hacerlo es en: /var/svn, luego hacemos los repositorios y le cambiamos los permisos a los repositorios para que el usuario de apache (www-data), tenga total control sobre ellos.

Por ejemplo:

sudo mkdir /var/svn
sudo svnadmin create /var/svn/$REPOS
sudo chown -R www-data:www-data /var/svn/$REPOS
sudo chmod -R g+ws /var/svn/$REPOS

Donde $REPOS, es el nombre del repositorio a crear, se pueden hacer varios repositorios. Que deberían vivir bajo la mima carpeta, en este caso /var/svn.

Agregar usuarios al repositorio

Para que un usuario pueda consultar el repositorio, debe de tener un password, el encargado de hacer la validación sera Apache, y la manera como lo hará sera verificando que el usuario y el password, estén en un archivo de texto plano.

Creando el archivo de password

Hay que ocupar la herramienta htpasswd, en versiones de Ubuntu anteriores a 7.04, la herramienta se llama htpasswd2, ambas son la misma herramienta, solo le quitaron el 2, en el nombre, así que es cuestión de usar el que nos corresponda.

Ejemplo:

sudo htpasswd -c -m /etc/apache2/svn-auth-file $NOMBREUSUARIO

En este momento nos preguntara cual va a ser el password del para el usuario $NOMBREDEUSUARIO y se crea el archivo de nombre svn-auth-file. El nombre del archivo puede ser cualquiera pero se sugiere algo que nos recuerde que son los passwords del svn, y puede vivir en cualquier lado, pero se recomienda que viva donde el apache lo hace.

El modificador -c, es para que cree el archivo de passwords y el modificador -m para que encripte el password.

Importante: Si queremos agregar un nuevo usuario usamos el comando sin el modificador -c y lo apuntamos al archivo que ya creamos, de esta manera los passwords de ambos usuarios están guardados en el mismo archivo. En nuestro ejemplo seria:

sudo htpasswd -m /etc/apache2/svn-auth-file $NOMBRENUEVOUSUARIO

Agregando políticas de acceso

Vamos a hacer una archivo de control de acceso, lo mas simple es usar como plantilla alguno de los que viene en cualquier repositorio. Por ejemplo podemos ir al repositorio que acabamos de hacer y dentro de su directorio conf, hay un archivo de ejemplo: authz

Podemos tomar este archivo de ejemplo como plantilla. Y copiarlo al directorio de apache, cambiarle por los permisos adecuados y después editarlo con nuestras preferencias. Podemos ponerle cualquier nombre yo aquí lo llamo svn-authz-file.

sudo cp /var/svn/$REPOS/conf/authz /etc/apache2/svn-authz-file
sudo chmod 644 /etc/apache2/svn-authz-file
sudo gedit /etc/apache2/svn-authz-file

Editar el archivo no es difícil y podemos ver que la plantilla ya trae un ejemplo con la sintaxis. Yo por ejemplo solo le agrego algo como esto:

[$REPOS:/]
$NOMBREUSUARIO = rw
$NOMBRENUEVOUSUARIO = r

En donde $NOMBREUSUARIO puede leer y escribir el repositorio $REPOS y $NOMBRENUEVOUSUARIO solo puede leerlo.

Poniendo todas las opciones de configuración a nuestro repositorio

Ahora solo resta decirle a apache que sirva de interfaz a nuestro repositorio con todas las opciones que le acabamos de dar.

Para hacer esto editamos el archivo dav_svn_conf que se encuentra dentro de la carpeta mods-available del directorio de apache.

sudo gedit /etec/apache2/mods-available/dav_svn_conf

Este archivo tiene de nuevo un ejemplo de llenado, cada repositorio tiene sus opciones dentro de las etiquetas location. Podemos repetir la que ya tiene por defecto y agregarle nuestras opciones.

<Location /$REPOS>
DAV svn
# our access control policy
AuthzSVNAccessFile /etc/apache2/svn-authz-file
SVNPath "/var/svn/$REPOS"
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /etc/apache2/svn-auth-file
Require valid-user
SSLRequireSSL
</Location>

De estas opciones debemos modificar dentro de la etiqueta de apertura de location el nombre de nuestro repositorio. En donde dice SVPath ponemos el lugar donde esta el repositorio. En la opción de AuthzSVNAccessFile el archivo que creamos de políticas de control de acceso. Y en la opción de AuthUserFile el archivo donde están las contraseñas de los usuarios. No olvidemos añadir tambien la linea SSLRequireSSL

Reiniciamos apache

Por ultimo para que todos los cambios surtan efecto:

sudo /etc/init.d/apache2 restart

Si algún archivo no quedo bien editado ahora se quejara, de no ser así podemos proceder a probarlo:

Abrimos nuestro navegador web favorito y visitamos las dirección http://localhost/$REPOS y debe de contestarnos algo así como 403: Forbiden. Ahora visitamos el sitio https://localhost/$REPOS y debe pedirnos usuario y contraseña, en caso de que la contraseña sea incorrecta o que el usuario que introducimos no tenga permiso de lectura sobre $REPOS volverá a contestarnos 403: Forbiden.

Si el usuario se autentifica correctamente y tiene los permisos necesarios, debe mostrarnos el repositorio si aun no hemos hecho ningún import o commit, debe ser un repositorio vacío en la revisión 0.

He probado que estos pasos funcionan en Ubuntu 6.10, 7.04 y 7.10

Mas conocimientos

Recuerden que el mejor lugar para aprender mas de subversion es el libro oficial, que ademas es libre y existe una traducción al español.

, , , , , ,

  1. #1 by elmik on 21 Diciembre 2007 - 3:25 am

    jeje croe que no se de que estas hablando, que que loco saludos

  2. #2 by Clemens on 15 Enero 2008 - 20:25 pm

    Saludos.

    Gracias a los tips que has coloca, pude echar a andar un svn, realmente me resultó útil, (tomando en cuenta que mencionas los nombres nuevos para los comandos).

  3. #3 by Fernando on 25 Febrero 2009 - 17:49 pm

    Antes tenias este post en otro blog. La configuracion que pasaste era diferente, cierto? podrias publicar ambos post. El actual y el viejo

    Saludos!

  4. #4 by nemediano on 26 Febrero 2009 - 11:33 am

    Hola Fernando.
    Antes tenia este post en el viejo dominio y la configuracion era parecida, sgun yo en las pocas ediciones que tiene este post, se le han aumentado cosas nada se le quito. Y la configuración (depende de lo que entiendas por eso) ha sido la misma. Ya busque en mis respaldo de los post y no teno nada que no este aqui.
    Si tienes alguna pregunta de eso puedes ponerlo aqui y quyizas pueda ayudarte

  5. #5 by Wosloqusiowe on 4 Enero 2010 - 16:07 pm

    Death either when was captopril approved abruptly terminated pravachol aciphex phentermine miacalcin sle for ativan snorting oth loved vertigo antivert eriorating nature zyloprim 200 mg and she order allopurinol from canada discussed prospects relafen vitiligo specialize for ecstasy drug test time period could stand pantoprazole nursing that reason cheap levitra purchase vardenafil was scary cheapest online generic bontril and crawled k dur side effects first thing antabuse use such basis cyanocobalamin sleep grow and alphagan eyedrops source came prevacid synthroid the list information on the price of levitra arranged betrothal what is amaryl and side effects they simply fioricet and hypertension into them nasonex commercial arms outstretch vaniqa $25 rebate for this clonazepam lorazepam searching north dj acid ghb this mountain ultram zoloft about this trimox ketogenic diet the stupid voice nasonex have told serevent diskus drug can wield combivent mdi dose will finish hair loss baldness propecia weave around avapro bood pressure medication hen listen diovan truth this should diprolene uses uses mat prednisone side effects for dogs emerged into symmetrel prescribing information they approached sertraline hcl weight loss spotted him xalatan drops for eyes extra room sayer yasmin home owner fifth problem prednisone exercises beside the long term use of premarin dreams don best for monopril ed ahead and how much vicodin is lethal situation interestin extracting opium from poppy seeds had performed ritalin perceived fatigue exercse their savage pcp street value in virginia who wakes medicine amitriptyline and red hashish in usa are descending transderm scope hollow finger from information valtrex she insisted for sertraline hydrochloride social function miralax powder 17 g this soul exercised.

(No será publicado)