Tenha sua nuvem privada com NextCloud e Oracle OCI
Por Ciro Mota | 11, Fevereiro 2022 | Tempo de leitura aproximadamente 8 minutos. Edições: Revisão textual. Em 26, Fevereiro 2022.Olá galerinha, como vão? Espero que todos estejam bem e se cuidando.
No mês de Dezembro de 2021 eu acabei me certificando em OCI Foundations, certificação da Oracle e que depois viria a se popularizar ainda mais com a maravilhosa iniciativa da LINUXtips. De lá para cá venho tentado deixar de lado o meu lado generalista (valendo a redundância) e procurando sempre novas formas de explorar esse novo mundo que me fora apresentado. Sim, tem uma vida muito boa fora da AWS, Azure e GCP.
Na OCI todos nós ao ingressar temos um bônus inicial, mas além disso o diferencial é o seu Always Free, onde você poderá fora do período de trial usar a infra provida por eles na faixa. Dentro desses projetos que me vem à mente para tentar, acabei encontrando este que sem dúvida poderá ser uma mão na roda para quem não tem um PC reserva em casa.
Por que não aproveitar esse Always Free e provisionar uma instância com o NextCloud e termos a nossa nuvem privada? É isso que vamos ver nesse artigo.
Disclaimer
Observação 1: No modo de responsabilidades compartilhadas da computação em nuvem, você é o responsável pela segurança da aplicação que rodará em sua instância. Diante disso, todas as rotinas inerentes a proteção do servidor serão por sua conta.
Observação 2: Este procedimento não deverá ser utilizado para fins profissionais/de produção.
Observação 3: Apesar do modo gratuito, há limitações de infraestrutura. Utilize com sabedoria.
Observação 4: Respeite os termos de uso da plataforma e evite com isso a hospedagem de conteúdo ilícito e/ou que firam as regras de direitos autorais.
Criando a instância
Supondo que você já tenha um cadastro válido na OCI, iremos provisionar a nossa instância. Antes disso precisamos criar um compartment para abrigar tudo o que faremos. Vá em Identity & Security -> Compartments. Defina com o nome que melhor te agrade.
Próximo passo precisamos criar a nossa VCN (Virtual Cloud Network), vá em Network -> Virtual Cloud Networks. Se necessário selecione o Compartment recém criado no menu Compartment. Clique em Create VCN e preencha com os dados que irá utilizar.
Agora que criamos a nossa VCN precisamos configura-la e primeiro será com a nossa Subnet, clique em Create Subnet. Atente para selecionar o Compartment na qual foi criado a VCN e escolha a faixa de endereços IP que quer usar.
No menu Resources à esquerda, clique em Network Security Groups e em seguida Create Network Security Group. Aqui vamos definir algumas regras de acesso para SSH e HTTP/S.
No menu Resources à esquerda, clique em Route Tables e em seguida clique na rede Default criada. Clique em Add Route Rules e configure o Internet Gateway para que tenhamos tráfego livre na instância.
Agora podemos finalmente criar a nossa instância. Escolha a imagem Ubuntu e mantenha o shape como AMD VM.Standard.E2.1.Micro. Atente para o campo Networking onde deverá ser selecionado o Compartment com as configurações de rede que foi criado. Assim como a instância deve ser criada também no mesmo Compartment.
E em SSH, caso você ainda não tenha um par de chaves, gere-os através do comando ssh-keygen -b 2048 -t rsa
e cole a sua public key
.
Configuração
Agora que a nossa instância foi criada, vamos configura-la finalmente. Duas coisas importantes, é preciso anexar o nosso Network Security Grou s à instância. No sumário da instância, em Network security groups clique em Edit e adicione-as.
Acesse a instância via SSH e vamos as configurações.
É preciso fazer um pequeno ajuste no horário do SO, para isso basta rodar o comando abaixo e selecione a sua localidade.
sudo dpkg-reconfigure tzdata
As instâncias Ubuntu por padrão não permitem tráfego HTTP sem que mexamos no iptables
, mesmo com o NSG permitindo, execute o comando abaixo para realizar a liberação do tráfego.
sudo iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited && sudo netfilter-persistent save
Você pode não gostar do Snap e eu entendo que todas as críticas à esse formato nesse momento são válidas, mas nesse ponto não há como negar que a implantação do NextCloud com ele é extremamente mais simplificada. Ao invés de termos que provisionar Apache, MySQL e PHP, um único binário já nos provê as três aplicações compiladas e configuradas para uso.
sudo snap install nextcloud
Após a instalação nós já teremos acesso ao NextCloud via endereço IP público da instância. Acesse-a e defina um usuário e senha. Como será um serviço que ficará exposto internet à fora é bom caprichar na senha e use um nome de usuário não convencional. Se precisar use um gerador de senhas.
Vamos mudar as portas padrão do NextCloud, execute os comandos abaixo um a um, definindo uma porta de sua preferência.
sudo snap set nextcloud ports.http=8584
sudo snap set nextcloud ports.https=4447
Observação: Se você desejar contar com certificados Let’s Encrypt válidos, este procedimento de mudança de portas deverá ser feito após a configuração do DDNS e posterior geração dos certificados através do comando sudo nextcloud.enable-https lets-encrypt
.
Vamos configurar também a compressão para HTTPs, execute o comando abaixo:
sudo snap set nextcloud http.compression=true
Adicionaremos agora um certificado auto-assinado para acesso via HTTPs, execute:
sudo nextcloud.enable-https self-signed
Feito isso o nosso NextCloud já está pronto para funcionar. Mas como o endereço da instância pode mudar, podemos criar um DDNS com o DuckDNS que é uma alternativa Open Source. Acesso o link de instalação e proceda como documentado.
Após instalado e configurado, execute o comando abaixo para que o NextCloud reconheça o domínio.
sudo nextcloud.occ config:system:set trusted_domains 1 --value=ciromotanextcloudoci.duckdns.org
Você pode conferir se tudo deu certo inspecionando o arquivo de configuração do próprio NextCloud em /var/snap/nextcloud/current/nextcloud/config/config.php
.
Reinicie o servidor.
sudo snap restart nextcloud
Como temos um DDNS e exposto na internet, podemos inclusive tentar usar um certificado válido via Let’s Encrypt. Utilize o ACME.sh para gerar de forma simplificada o certificado.
Hardening
O NextCloud instalado via Snap já provê um nível aceitável de segurança contudo por indicação do time de segurança deles, nós podemos melhorar ainda mais e com apenas uma ferramenta adicional.
Crie um arquivo de log que iremos utilizar.
sudo touch /var/log/nextcloud.log
Agora vamos instalar o fail2ban
:
sudo apt install fail2ban -y
Crie o arquivo nextcloud.conf
conforme indicado pela documentação. Para o arquivo nextcloud.local
nós podemos ser mais agressivos na configuração, algo do tipo:
[nextcloud]
backend = auto
enabled = true
port = 80,443,8584,4447
protocol = tcp
filter = nextcloud
maxretry = 2
bantime = 2h
findtime = 5m
logpath = /var/log/nextcloud.log
Significa que, se dentro de 5 minutos (findtime
), o usuário errar por 2 vezes (maxretry
), ele ficará banido por 2 horas (bantime
). E poderíamos ainda ser mais agressivos com as tentativas de erro e tempo de ban.
E finalmente, nosso server já está pronto para funcionar.
Vamos melhorar um pouco mais a nossa conexão SSH, abra o arquivo /etc/ssh/sshd_config
e proceda da seguinte forma:
- Descomente a entrada:
PermitEmptyPasswords no
- Defina o máximo de conexões para 1 em:
ClientAliveCountMax 1
- Desabilite o uso do protocolo X11 em:
X11Forwarding no
Túnel P2p
Nós podemos endurecer ainda mais as configurações adicionando um serviço de túnel no meio, neste caso me refiro ao ZeroTier que é uma ferramenta Open Source. Basta instalar nas duas pontas (smartphone/PC e instância) e travar o NSG (lembra-se que configuramos como 0.0.0.0/0 ?) para receber tráfego somente vindo dos endereços IPs do ZeroTier, neste caso basta alterar de 0.0.0.0/0
para 204.80.128.0/24
. Você pode confirmar que este endereço é mesmo deles aqui.
Realize a instalação do ZeroTier com o comando:
curl -s https://install.zerotier.com | sudo bash
Após instalação, vá até o site do ZeroTier, faça um breve cadastro e crie seu próprio segmento de rede.
Execute o comando zerotier-cli info onde você receberá algo como:
200 info <SUA-ID> <Versão do ZeroTier> ONLINE
Conecte-se à rede criada com o comando seguinte e o ID de rede obtido na etapa anterior:
zerotier-cli join <NETWORK-ID>
Volte ao site e nas configurações de rede clicando no seu ID, vá para a seção “Membros”, você verá a instância e demais itens que forem adicionados à esta rede. Você deve autorizá-los marcando a caixa de seleção apropriada, também é possível renomear para um novo nome de fácil reconhecimento.
Existem outras ferramentas proprietárias como a Ngrok e Tailscale que fazem a mesma função. Use aquela que se sentir mais confortável.
Conclusão
Uma iniciativa maravilhosa da Oracle em provedor uma VM em nuvem mesmo que com recursos simples mas que consegue atender a inúmeros propósitos. Uma instância do NextCloud para uma nuvem privada nos dias de hoje pode ser bem interessante, até mesmo uma plataforma colaborativa de projetos. De qualquer forma como cito acima, use com sabedoria.
Ahhh e se você for preguiçoso e perigoso como eu, pode querer implantar tudo isso via Terraform
. Ainda na minha série de estudos criei um script onde é possível provisionar instâncias do Always Free, se você também tiver domínio de Shell Script, pode adicionar tudo no pacote, rodar o Terraform
e aguardar a conclusão. Caso queira conhecer, tá logo aqui embaixo:
Dúvidas, críticas ou sugestões? Me deixe saber logo abaixo nos comentários.
Até a próxima!