100TB of Owncloud

Bom dia a todos,

O projeto de hoje começou com um POC bastante imaginativo: Foi me pedido recentemente uma forma provar a usabilidade de uma Amazon Cloud Drive.
É vendida como espaço  ilimitado por uma quantia quase simbólica (+- €60 anuais), mas para algumas pessoas apenas é visto como um datahoarder heaven e pouco mais.

acd

Perguntaram-me então o que poderia ser feito deste tipo de espaço, tendo em conta que o cliente nativo da Amazon para o produto não é propriamente útil ou particularmente bom.
A somar a falta de um cliente decente, juntam-se as preocupações de privacidade por estar em ambiente cloud e estacionado nos USA.

Para mitigar as questões do cliente escolhi utilizar uma plataforma Owncloud, a ser executada num Apache2.
Não é nada de novo, mas funciona muito bem, tem as funções que se pretende e sobretudo o código está amadurecido e bastante trabalhado.

Fica a faltar:

a) Forma de aceder aos dados. A ACD utiliza a semelhança da AWS objects para guardar dos dados, pelo que o simples mount -t filesystem não vai funcionar.
b) Encriptar minimamente os dados. Como são dados de teste não foi gasto demasiado tempo em garantir uma plataforma com criptografia militar.

Após a construção do container que irá ter o owncloud é necessário conseguir aceder aos dados e escolher a plataforma de encriptação.

Para aceder aos dados utilizámos um dos muitos clientes que existem de fuse: O acd_cli.
A instalação deste cliente é bastante simples e a documentação profunda e completa: https://acd-cli.readthedocs.io/en/latest/

Para a questão de encriptação, optei por EncFS.
Embora o Encfs tenha alguns problemas identificados de segurança, para o efeito é otimo porque é portátil, fuse based e extremamente rápido (é um fator diferencial quando existe latência em utilizar remote storage que resida em cloud) e claro porque os dados são apenas de teste.

Na pratica, o EncFS cria um layer de  abstração entre os ficheiros e o seu conteúdo, e o que a Amazon irá ver do lado deles.
Como o mountpoint FUSE do está dentro do sistema local, a Amazon irá apenas ver ficheiros com nomes e conteúdos encriptados, enquanto dentro do mountpoint local fuse, estão os nossos dados prontos a serem acedidos de uma forma transparente.

O que a Amazon irá ver:

drwxr-xr-x 37 wwwrun   wwwrun  4096 May  3 14:35 10f,ZMop5l5odeFSlkMIYvhR
drwxr-xr-x 37 wwwrun   wwwrun  4096 Jul  3 18:52 1WnZcSMDlSTk0Jow0WaRM0at
drwx——  2 wwwrun   wwwrun     6 Jul  6 16:11 3j7GJ9B9aj,JXwS,aZXNtz5p
drwxr-xr-x 36 wwwrun   wwwrun  4096 Jul  3 19:24 5qE12bbhU419fBjLIW7BdgyL
drwx——  2 wwwrun   wwwrun     6 Jul  6 16:11 6gdGa7TelPuW7PwW8AMOcOhg
drwxr-xr-x 34 wwwrun   wwwrun  4096 Jul  3 20:11 E-RCp3-YMkLBGy8tICxVnGH0
drwxr-xr-x 33 wwwrun   wwwrun  4096 Jul  3 19:29 F,oD,lZSUQ7MlHCsjxPC9mqG
drwx——  4 wwwrun   wwwrun   68 May 15 14:37 GVXHjYrDejKRHCYViQzDKLZi

O que o owncloud irá ver:

drwxr-xr-x 37 wwwrun   wwwrun  4096 May  3 14:35 admin
drwxr-xr-x 37 wwwrun   wwwrun  4096 Jul  3 18:52 cache
drwx——  2 wwwrun   wwwrun     6 Jul  6 16:11 teste0
drwxr-xr-x 36 wwwrun   wwwrun  4096 Jul  3 19:24 testes1
drwx——  2 wwwrun   wwwrun     6 Jul  6 16:11 teste2
drwxr-xr-x 34 wwwrun   wwwrun  4096 Jul  3 20:11 teste3
drwxr-xr-x 33 wwwrun   wwwrun  4096 Jul  3 19:29 teste4
drwx——  4 wwwrun   wwwrun   68 May 15 14:37 teste5

A iniciação da nossa datastore é bastante simples:

# acd_cli mkdir poc-encfs
# acd_cli sync
# acd_cli -nl mount –modules=”subdir,subdir=/poc-encfs” /mnt/crypt

O nosso filesystem FUSE não encriptado já deverá estar visível neste ponto:

# df
Filesystem                    1K-blocks       Used    Available Use% Mounted on
devtmpfs                        2017408          0      2017408   0% /dev
tmpfs                           2023600         20      2023580   1% /dev/shm
tmpfs                           2023600       1820      2021780   1% /run
tmpfs                           2023600          0      2023600   0% /sys/fs/cgroup
/dev/mapper/vg00-root          10475520    3619816      6855704  35% /
/dev/mapper/vglxc-lxc          32892784    8006432     23192452  26% /var/lib/lxc
ACDFuse                    107374182400 5740550656 101633631744   6% /mnt/crypt

Criando o layer de encriptação:

# encfs /mnt/crypt/.encfs/ /mnt/crypt/datastore/
Creating new encrypted volume.
Please choose from one of the following options:
 enter “x” for expert configuration mode,
 enter “p” for pre-configured paranoia mode,
 anything else, or an empty line will select standard mode.
?> p

Paranoia configuration selected.

Configuration finished.  The filesystem to be created has
the following properties:
Filesystem cipher: “ssl/aes”, version 3:0:2
Filename encoding: “nameio/block”, version 4:0:2
Key Size: 256 bits
Block Size: 1024 bytes, including 8 byte MAC header
Each file contains 8 byte header with unique IV data.
Filenames encoded using IV chaining mode.
File data IV is chained to filename IV.
File holes passed through to ciphertext.

————————– WARNING ————————–
The external initialization-vector chaining option has been
enabled.  This option disables the use of hard links on the
filesystem. Without hard links, some programs may not work.
The programs ‘mutt’ and ‘procmail’ are known to fail.  For
more information, please see the encfs mailing list.
If you would like to choose another configuration setting,
please press CTRL-C now to abort and start over.

Now you will need to enter a password for your filesystem.
You will need to remember this password, as there is absolutely
no recovery mechanism.  However, the password can be changed
later using encfsctl.

New Encfs Password:
Verify Encfs Password:

E agora já o nosso layer fuse encriptado já é visível:

 # df -h
Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    2.0G     0  2.0G   0% /dev
tmpfs                       2.0G   20K  2.0G   1% /dev/shm
tmpfs                       2.0G  1.8M  2.0G   1% /run
tmpfs                       2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/vg00-root        10G  3.5G  6.6G  35% /
/dev/mapper/vglxc-lxc        32G  8.2G   22G  28% /var/lib/lxc
/dev/mapper/vgkatello-root   17G  3.0G   14G  18% /var/lib/lxc/lxcVpar29/rootfs
/dev/mapper/vgforeman-root   14G  1.9G   12G  14% /var/lib/lxc/lxcVpar28/rootfs
/dev/mapper/vgstaging-tmp   999G  484G  516G  49% /mnt/staging
lxcvsan2:/storage01         700G  162G  539G  24% /mnt/lxc-nfs
encfs                       999G  484G  516G  49% /mnt/staging/encfs
ACDFuse                     100T  5.4T   95T   6% /mnt/crypt
encfs                       100T  5.4T   95T   6% /mnt/crypt/datastore

Ps: sim… 100 TB 🙂

TrollMed

Agora será apenas uma questão de apontarem a vossa datadir do owncloud para dentro deste novo datastore.

Como considerações finais é importante lembrar dos seguintes pontos:

a) Terem sempre um backup dos vossos dados.
b) Caso necessitem MESMO de encriptação seria podem utilizar o eCryptfs que é considerado mais seguro que o EncFS.
c) Lembrem-se que estão a trabalhar em cima de um FUSE filesystem, em cima de um filesytem de objects exportado via internet.  Se a internet vos cair o filesystem ficará indisponível.
d) Performance. Filesystems em userland space não foram feitos para performance. Se precisarem realmente de velocidade e encriptação em tempo real, procurem um storage dito tradicional com encriptação on-the-fly.
e) CUIDADO com as vossas chaves de encriptação. Se as perderem perdem os vossos dados.
f) Tenham cuidados redobrados com a vossa DB que servirá de backend ao owncloud. Se tiverem que reindexar 100TB vão perder uns anitos no processo.

Até ao próximo post. Se necessitarem de falar comigo já sabem onde me podem encontrar.

Abraço!
Nuno