Poesía Binaria

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

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):

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).

(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....