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