Ir para o conteúdo

Endurecimento do host

O PEART defende suas próprias superfícies, mas alguns controles são do host e não podem ser impostos pela aplicação. Esses são os que o operador possui.

A postura de sandbox em que o PEART é suportado

As três units distribuídas rodam sob o sandbox do systemd, e o PEART é suportado com tudo ligado. Você não precisa afrouxar diretiva nenhuma para o produto funcionar. Se descobrir que precisa, isso é defeito a relatar, não drop-in a escrever. O que cada um dos quatro encontrados assim imprimia, e o que segura cada correção, está em Quando a causa é uma diretiva de endurecimento.

As três units carregam NoNewPrivileges=yes, ProtectSystem=strict, ProtectHome=yes, PrivateTmp=yes, PrivateDevices=yes, ProtectKernelTunables=yes, ProtectKernelModules=yes, ProtectControlGroups=yes, RestrictNamespaces=yes, RestrictRealtime=yes, RestrictSUIDSGID=yes, LockPersonality=yes, SystemCallArchitectures=native e SystemCallFilter=@system-service.

O renderizador carrega mais, porque é ele que interpreta conteúdo escrito por um atacante: PrivateNetwork=yes, IPAddressDeny=any, MemoryDenyWriteExecute=yes, um segundo SystemCallFilter subtraindo @privileged, @resources e @obsolete, e o MemoryMax=1G com TasksMax=256 que limitam uma renderização descontrolada.

O que cada serviço pode escrever é diferente, e a diferença é o desenho. O peart escreve em qualquer lugar sob /var/lib/peart. O peart-portal escreve só em db, lê renditions e reports, e não enxerga evidence nem a chave mestra. O peart-render não escreve em lugar nenhum da árvore de dados: /var/lib/peart/work é montado só para leitura para ele, então o processo que interpreta HTML hostil tem apenas o próprio PrivateTmp para escrever.

Duas partes desta postura são do host e não da unit, e são suportadas do mesmo jeito: as três contas de serviço são usuários de sistema sem diretório pessoal criado, e o volume de dados pode ser montado nosuid.

Leia a lista como promessa. Mudança que precise afrouxar uma destas é quebra dela, e deve chegar até você como decisão com razão, não como drop-in que você escreve no seu host.

Cifragem de disco para o banco

O banco é texto claro por desenho (ver Cifragem). A cifragem de disco no host, LUKS, é o controle recomendado e documentado para o banco em repouso. É responsabilidade do operador, porque é um controle de host, e é o controle compensatório sobre o qual toda a decisão de banco-em-claro se apoia. Se você fizer um passo de endurecimento, faça esse.

Desbloqueio sem ninguém no console

Numa VM de produção sem console, LUKS puro significa digitar uma passphrase a cada boot, o que não escala e na prática deixa de acontecer em silêncio. O padrão que torna a cifra em repouso sustentável é o desbloqueio ligado à rede: o host abre o volume sozinho quando, e só quando, alcança um servidor de chave na rede confiável. A sua distribuição documenta o mecanismo e os comandos dele, e esta página deliberadamente não os repete, porque um handbook que transcreve a linha de comando de outro projeto herda as mudanças dele sem nenhuma forma de perceber.

Três coisas nisso são do PEART, e são as que ninguém mais vai escrever para você.

O serviço herda a latência de boot do servidor de chave. Um volume que desbloqueia pela rede não monta antes de a rede subir e o servidor de chave responder, e /var/lib/peart é esse volume. É por isso que o RequiresMountsFor=/var/lib/peart que as units trazem importa mais aqui do que num volume local: sem ele, ou com a montagem chegando tarde, o serviço sobe contra um ponto de montagem vazio no sistema de arquivos raiz, escreve ali, e o dado some quando o volume monta por cima. Rodar como serviço trata o caso geral; o desbloqueio por rede é o que alarga a janela.

O keyslot de emergência não é opcional. Ligue o volume ao servidor de chave num keyslot próprio e guarde uma passphrase em outro. Sem ele, um servidor de chave fora do ar não atrasa o seu dado, ele o remove. É a troca que este padrão faz, e ela precisa ser feita de olhos abertos: sai uma passphrase que ninguém digita, entra um servidor de chave que, inalcançável, segura o boot.

Prove que ele recusa. Tire o servidor de chave do ar e reinicie: o volume não pode abrir sozinho, e tem de pedir a passphrase de emergência. Devolva o servidor e reinicie: volta a abrir sozinho. Enquanto esse teste não for feito, ninguém sabe se a cifra em repouso está valendo ou se o volume apenas por acaso abre, e controle não testado é o que se descobre na pior hora possível.

Exposição de rede

As duas superfícies têm exposição diferente por desenho, e o host deve impô-la. O portal (peart-portal) é alcançável pelo cliente pela internet; a superfície interna (peart) deve ser alcançável só da rede restrita ou VPN da consultoria, nunca de onde o cliente alcança o portal. Ambos ficam presos ao loopback e atrás de um proxy reverso que termina TLS, então o firewall e o proxy são o que de fato decidem quem alcança qual superfície.

O isolamento do sidecar de renderização

O renderizador processa HTML derivado de conteúdo hostil e não pode alcançar a internet nem o endpoint de metadados da nuvem. No systemd isso é PrivateNetwork=yes e IPAddressDeny=any no peart-render.service; no caminho por container é a rede internal sem rota para fora. É um requisito, não um botão de ajuste, e removê-lo reabre em silêncio uma superfície de server-side request forgery. Não afrouxe.

Arquivo de chave e permissões

A chave mestra mora fora do diretório de dados, modo 0600, do usuário que roda, então um backup dos dados nunca pode contê-la. Mantenha assim, e guarde a cópia exportada (ver Backup e restore) em local separado do backup dos dados. Uma chave no mesmo lugar que os dados que ela protege torna a cifragem um teatro.