Publi

Owncloud en 2015. Seguridad, extras y recomendaciones (II)

244H_r

Hace unas semanas hablábamos de hacer una instalación de Owncloud en nuestro servidor para proporcionar servicios de almacenamiento para el hogar o para una pequeña empresa. Aunque esa guía estaba bien para redes privadas, cuando salimos a Internet hay que tomar algunas precauciones y hacer que nuestro servidor, así como el servicio que proporcionamos sea seguro.

Parte de este post serán recomendaciones de seguridad generales para un entorno LAMP y no son propias de Owncloud.

Comunicación segura

Si hemos instalado Owncloud en un servidor de Internet, hay que tener cuidado con el cifrado. Es cierto que hace tres años o así, los clientes de escritorio y móvil, de los cuales hablaré en la próxima entrega no se llevaban del todo bien con HTTPS. Y eso era un gran problema, ya que, aunque nuestro servidor estuviera muy bien protegido, si alguien interceptaba nuestras comunicaciones con él podría ver nuestros datos.

Pero en la actualidad, al menos, en mis últimas pruebas, no he encontrado ningún problema en el ámbito de la seguridad con Owncloud, es más, recomiendo encarecidamente utilizarlo.

Para más información sobre HTTPS podéis visitar este post. Aunque para este caso, ya que hablamos de un Owncloud doméstico o para una pequeña empresa, utilizaremos un certificado autofirmado.

Para generar el certificado autofirmado, basta con seguir estas instrucciones. Los certificados (certificado y clave de nuestra web y certificado de autoridad, o cadena de certificados) los copiaremos para el ejemplo en /home/cloud/www/owncloud.miservidor.com/certs y si queremos más seguridad dentro de nuestro servidor, todos esos archivos tendrán permiso de lectura para root, es decir, tanto el grupo, como otros usuarios, no tendrán acceso al contenido de los archivos.

Finalmente, nuestro VirtualHost de Apache quedará así (he cogido la configuración del post de hace unas semanas):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<VirtualHost *:80>
        ServerName owncloud.miservidor.com
        Redirect permanent / https://owncloud.miservidor.com/
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
        ServerAdmin webmaster@localhost
        ServerName owncloud.miservidor.com

        DocumentRoot /home/cloud/www/owncloud.miservidor.com/www
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>

        <Directory /home/cloud/www/owncloud.miservidor.com/www/>
                Options Indexes FollowSymLinks MultiViews +ExecCGI
                AllowOverride All
# En Apache 2.4 estas dos líneas se cambiarán por
#                 Require all granted
                Order allow,deny
                allow from all
        </Directory>

# Logs esto es opcional
        ErrorLog    "/home/cloud/www/owncloud.miservidor.com/logs/error.log"
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog    "/home/cloud/www/owncloud.miservidor.com/logs/access.log" vhost_combined

    SSLEngine on
    SSLCertificateFile      /home/cloud/www/owncloud.miservidor.com/certs/micloud.crt
    SSLCertificateChainFile /home/cloud/www/owncloud.miservidor.com/certs/micloud-ca.crt
    SSLCertificateKeyFile   /home/cloud/www/owncloud.miservidor.com/certs/micloud.key

    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=15768000"

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
         SSLOptions +StdEnvVars
    </FilesMatch>

</VirtualHost>
# intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on
    SSLCompression          off
    SSLSessionTickets       off

Con esto, estamos evitando que se pueda entrar por HTTP, redireccionando a un protocolo seguro. Estamos también estableciendo un nivel de seguridad intermedio (ver este post para más info) y habilitando algunas configuraciones que incrementarán la seguridad de nuestro sitio.

Además, en la configuración de Owncloud en config/config.php podemos definir la opción:

1
2
3
4
<?php
$CONFIG = array (
...
  'forcessl' => true,

Otras configuraciones de seguridad

Para completar la configuración de seguridad, en config/config.php habilitaremos lo siguiente (como antes, no voy a poner el archivo completo, sólo las claves que interesan, tendremos que buscarlas, y si no están añadirlas:

1
2
3
4
<?php
$CONFIG = array (
...
  'xframe_restriction' => true,

Por otro lado, en Apache, es conveniente eliminiar la información del servidor web expuesta al usuario. Es decir, Apache, se identifica cuando envía una web, y eso puede ser explotado por un usuario malintencionado que conozca la versión y alguna vulnerabilidad de dicha versión. Para ello debemos incluir en apache (esta configuración suele estar en /etc/apache2/httpd.conf , /etc/apache2/apache2.conf , /etc/apache2/conf.d/security o algún archivo cercano):

1
2
ServerSignature Off
ServerTokens Prod

Ahora debemos hacer que no salga la versión de PHP, para ello, debemos establecer en nuestro php.ini (buscad dentro de /etc/php/ aunque puede estar en otro sitio dependiendo de nuestra instalación ):

1
expose_php = Off

Caché

Al ser un sistema que hace muchas peticiones a base de datos y genera mucha información, es necesario agilizar todo el proceso de obtención de datos. Por tanto, Owncloud implementa un sistema de caché que nosotros podemos configurar. El objetivo es agilizar el acceso a objetos de uso común. Aunque se pueden configurar varios motores, yo he optado por Redis, el cuál me ha dado muy buen rendimiento y podemos utilizarlo en un servidor aparte, lo que nos beneficia a la hora de distribuir nuestra aplicación en varios equipos.

Lo primero deberá ser instalar el módulo de redis para php así como el servidor redis (en muchas distribuciones suele venir el paquete). Y una vez tenemos el demonio de redis en ejecución (debe estar como un servicio de sistema), añadiremos con config/config.php lo siguiente:

1
2
3
4
5
6
7
8
9
<?php
$CONFIG = array (
...
  'memcache.local' => '\OC\Memcache\Redis',
  'redis' => array(
     'host' => 'localhost',
     'port' => 6379,
     'timeout' => 0.0,
      ),

Experiencia de usuario

Para que los usuarios estén más cómodos con la aplicación podemos introducir lo siguiente en config/config.php:

1
2
3
4
5
6
<?php
$CONFIG = array (
...
   'session_keepalive' => true,
   'trashbin_retention_obligation' => 60,
  'asset-pipeline.enabled' => true,

Así evitamos que se pierdan las sesiones (session_keepalive) cuando la ventana del navegador lleva mucho tiempo abierta, y por otro lado vaciamos la papelera de archivos eliminados cada 60 días. La tercera opción (asset-pipeline.enabled), hace que los archivos CSS y Javascript se sirvan como ficheros estáticos, y no pasen por los scripts de Owncloud, de esta forma, al ser gestionados directamente por Apache se sirven más rápido.

Tareas periódicas

Owncloud, debe realizar varias tareas de limpieza y procesamiento de datos a menudo, o tal vez envío de e-mails, gestión de caducidad de links, etc. Esas tareas pueden realizarse cada vez que un usuario visualiza cualquier página de Owncloud, aunque se recomienda que se realicen de fondo, sin que los usuarios tengan nada que ver, por lo que es muy recomendable configurar tareas programadas en nuestro sistema (cron jobs).

Podemos hacer que se ejecuten cada 15 minutos, aunque las tareas se pueden demorar hasta una hora, pero no es plan de ajustar mucho el tiempo y si tenemos muchos usuarios y muchos archivos, deberemos juntar más en el tiempo la ejecución de estas tareas. Si tenemos activada la búsqueda Full Text Search, el servidor debe ser bastante potente, ya que tendrá que entrar en todos los archivos y leer dentro y esto puede provocar que se pisen las ejecuciones programadas.

Para añadir la tarea programada, ésta debe ejecutarse con el mismo usuario que tiene permiso la web para acceder. Aunque he intentado darle otro usuario y un grupo común, al final he optado por crear un crontab para el usuario www-data (el que utiliza Apache), e incluir la siguiente línea:

1
*/15    *       *       *       *       cd /home/cloud/www/owncloud.miservidor.com/www/ ; php cron.php

Para editar el crontab del usuario www-data podemos, si disponemos de sudo:

$ sudo -u www-data crontab -e

Plugins útiles

Todos estos plugins los podemos encontrar en el repositorio oficial, aunque algunos son experimentales y debemos habilitar esta opción en el selector de aplicaciones (como administradores):

  • Deleted Files: Permite a los usuarios restaurar ficheros borrados. Es como una papelera de reciclaje. Eso sí, tu puedes borrar los archivos en tu equipo local, o en tu móvil, el archivo aparecerá borrado, pero desde el entorno web podrás recuperarlo.
  • Documents: Aunque está muy verde, nos permite editar documentos ofimáticos (LibreOffice/OpenOffice/Word) de forma sencilla (sólo se pueden utilizar algunos estilos, e introducir notas) y de manera colaborativa o lo que es lo mismo: varios usuarios del sistema pueden estar al mismo tiempo editando el documento. ¡¡Está muy chulo!! Aunque hay que usarlo con cuidado.
  • Versions: Nos permite restaurar versiones antiguas de un mismo fichero en el servidor. Muy útil cuando dos personas están trabajando en sus ordenadores con un mismo documento, y lo suben casi a la vez. Como sólo la última versión prevalece podemos cambiar en cualquier momento para ver la versión anterior.
  • Files Move: Permite mover ficheros, incluso arrastrando y soltando desde la interfaz.
  • Delete Confirmation: Muestra un diálogo de confirmación antes de borrar un archivo.
  • Piwik Tracking: Monitoriza los usuarios que entran a la interfaz de Owncloud con Piwik. Es necesario tener éste último instalado también, ya sea en el mismo servidor o en otro lado, pero accesible.
  • OwnNote: Un gestor de notas. Muy sencillo, pero nos puede servir para un apaño
  • Bookmarks: Gestor de marcadores en la nube. Nos permite poner un botón en nuestro navegador a través del cual añadiremos la página que estamos visitando actualmente a una lista «para ver luego»
  • Contacts y Calendar: Permiten tener un calendario y una agenda de contactos (tipo calendarios y contactos de Google) almacenadas en tu propio servidor y que podemos sincronizar con nuestros clientes de correo, teléfonos móviles, o mirar desde la web. Está muy bien introducir un teléfono desde el móvil, y luego escribir más detalles desde la página web, añadir una foto al contacto y luego poder verlo todo desde el teléfono.

Documentos de MS. Word

Aunque no es uno de los puntos fuertes, a partir de la versión 8 podemos visualizar documentos de MS. Word (docx, doc). La compatibilidad no es la mejor y no soporta todos los tipos de elementos que tiene este formato, pero nos puede sacar de un apuro.

Para poder utilizar los documentos de Word desde Owncloud, necesitamos tener openoffice o libreoffice instalado en el servidor (no hace falta tenerlo entero, ya que en un servidor no vamos a tener entorno gráfico. En distribuciones como Debian, hay un paquete llamado «libreoffice-core» que instala los elementos básicos de la suite ofimática.

Para ejecutar libreoffice como servicio, debemos hacerlo con la siguiente orden:

1
$ libreoffice --headless --accept="socket,host=0,port=16080,tcpNoDelay=1;urp" --nodefault --nofirststartwizard --nolockcheck --nologo --norestore --invisible &

De este modo, podemos configurar dentro de Owncloud el soporte de documentos de MS. Word a través de LibreOffice. Personalmente, tengo la instalación de LibreOffice en un servidor externo, por lo que en la configuración he puesto la IP de ese servidor (tenemos que asegurarnos de que el firewall del servidor tenga abierto el puerto 16080).
Screenshot 03-12-2015-101256
(La IP del servidor parece sacada de un capítulo de CSI, es para no poner la IP de mi servidor).

Cloud federado

Más que una configuración, específica, si tenemos esta opción activada, por un lado permitiremos a los usuarios de este servidor compartir archivos con otros servidores de Owncloud.

Por ejemplo, si tengo un amigo que tiene también su propio servidor, puedo compartir un archivo con él si pongo: usuario@owncloud.miamigo.com (por ejemplo). Y lo mismo puede pasar si mi amigo quiere compartir archivos conmigo. Ya se pelean los servidores de Owncloud ellos solos, copiando archivos de uno a otro para que todo sea lo más transparente posible.

Almacenamiento Externo

Owncloud, dado que tiene que estar instalado en uno de nuestros servidores, puede que necesite más espacio de almacenamiento. Éste puede salir de un servidor Amazon S3, un servidor FTP, un ordenador en la red local o incluso Dropbox. Lo podemos habilitar utilizando la aplicación External Storage.

Personalmente, es de las pocas cosas que no he probado, pero merece la pena mencionarlas, porque, por ejemplo, en Digital Ocean, donde tengo contratados algunos servidores no podemos enchufar discos duros, como se hace en Amazon, las máquinas vienen con un disco duro fijo, pero si sólo necesitamos almacenamiento podemos poner máquinas pequeñas en red, que vienen con 20Gb cada una y cuestan $5/mes y nos podrían servir de apoyo.

Fin

Estas son algunas recomendaciones, aplicaciones, y detalles de la configuración de Owncloud que he visto interesantes para poder montarte tu propio servidor en la nube, tanto para el hogar como para una pequeña empresa.

Muchas de estas cosas vienen en la documentación, pero quería dar un punto de vista más personal, un poco más breve en algunos aspectos y más extendida en otros.

Si tienes algún comentario, estoy deseando leerlo 🙂

También podría interesarte....

There are 6 comments left Ir a comentario

  1. Pingback: Owncloud en 2015. Seguridad, extras y recomendaciones (II) | PlanetaLibre /

  2. Pingback: Cómo instalar un certificado raíz en Android sin afectar al desbloqueo – Poesía Binaria /

  3. zak /
    Usando Google Chrome Google Chrome 48.0.2564.116 en Ubuntu Linux Ubuntu Linux

    Hola!!
    Muchas gracias por estos tutoriales, he instalado en un equipo viejillo Ubuntu Server, y siguiendo tus manuales ya tengo funcionando perfectamente Owncloud, se me sincroniza con mi otro ordenador, y desde el movil Android tambien perfecto.
    Lo único que lo tengo disponible unicamente en local.
    Antes de meterme con el tema https y certificados, he hecho pruebas para ver si conseguía acceder desde el exterior, pero nada, no lo he conseguido, configurando en el router la zona dmz, redirigiendo puertos, creando un host en no-ip… en resumen, me sobrepasa para mis excasos conocimientos y no he sabido hacerlo.
    Habrá que mirar opciones como la que comentas de DigitalOcean, gracias por este blog tan completo!!!

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 44.0 en Ubuntu Linux Ubuntu Linux

      Hola Zak !
      Muchas gracias por ese pedazo de comentario. Me alegro mucho de que tengas la instalación totalmente funcional a partir de esta guía 🙂 De todas formas, deberías poder tener acceso desde fuera, tiene que ser cosa del router. Muchos routers tienen problemas si intentas utilizar el puerto 80 con el exterior porque suele ser de administración web. Por otro lado, a lo mejor es cosa de la redirección de puertos, el firewall… muchos routers lo tienen un poco raro.

      De todas formas, aunque consigas configurarlo bien para que funcione hacia el exterior, debes tener buena conexión a Internet para que todos tus dispositivos se lleven bien con el sistema son muchas peticiones de red.

      Suerte!

  4. Juan /
    Usando Google Chrome Google Chrome 54.0.2840.85 en Android Android 6.0.1

    Pedazo guía! Llevo tiempo queriéndome montar una nube, pero entre que no me fio mucho del ss opciones que tienen un servidor intermedio (qnap, synologi…etc…) y que tampoco me fio de que si me lo monto yo, me puedan acceder desde fuera y adiós privacidad, nunca me lanzo.

    De verdad, voy a seguir investigando pero tu post se va directo a mi favoritos! Un saludo!

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 49.0 en Ubuntu Linux Ubuntu Linux

      Muchas gracias Juan!! Es cuestión de ponerse, mucha gente se monta un sistema casero con una Raspberry Pi y un disco duro externo. Lo bueno de montarte uno tú es que tanto la seguridad como el software corre de tu parte, también lo malo, si hay algún problema no tienes nadie a quien echarle la culpa.
      Un sistema que esté conectado siempre es vulnerable, y siempre podrá entrar alguien si le pone el suficiente interés, de todas formas, si te lo montas tú puedes trabajar en la seguridad de tu nube privada añadiendo diferentes sistemas de seguridad (reglas de firewall, cambios de puertos internos, sistemas de deteccion de intrusos, etc), uno que ya viene montado sólo te dejará tocar determinadas opciones (aunque no te toca montarlo a ti…).

      Pero vamos, anímate, cuando tengas un rato libre, una tarde de cacharreo, seguro que al final te sientes satisfecho con tu trabajo 🙂

Leave a Reply