Esta é uma pergunta canônica sobre como proteger uma pilha LAMP
Quais são as diretrizes absolutas para proteger um servidor LAMP?
Esta é uma pergunta canônica sobre como proteger uma pilha LAMP
Quais são as diretrizes absolutas para proteger um servidor LAMP?
Respostas:
A resposta de David é uma boa linha de base dos princípios gerais de proteção de servidor. Como David indicou, esta é uma grande questão. As técnicas específicas que você adota podem depender muito do seu ambiente e de como o servidor será usado. Atenção, isso pode exigir muito trabalho em um ambiente de teste para criar e ser executado corretamente. Seguido por muito trabalho para integrar seu ambiente de produção e, mais importante, o processo de negócios.
Primeiro, no entanto, verifique se sua organização possui políticas de proteção, pois essas podem ser as mais diretamente relevantes. Caso contrário, dependendo do seu papel, pode ser um ótimo momento para desenvolvê-los. Eu também recomendaria abordar cada componente separadamente de baixo para cima.
LA
Existem muitos bons guias disponíveis para ajudá-lo. Esta lista pode ou não ajudá-lo, dependendo da sua distribuição.
O A
Apache pode ser divertido de proteger. Acho mais fácil proteger o sistema operacional e manter a usabilidade do que o Apache ou o PHP.
Eles
OP
Isso se debruça sobre toda a idéia de práticas seguras de programação, que é toda uma disciplina própria. SANS e OWASP têm uma quantidade ridícula de informações sobre o assunto, então não tentarei replicá-las aqui. Vou me concentrar na configuração do tempo de execução e deixar que seus desenvolvedores se preocupem com o resto. Às vezes, o 'P' no LAMP se refere ao Perl, mas geralmente ao PHP. Estou assumindo o último.
Você fez uma pergunta que é, francamente, digna de alguns livros sobre o assunto. Mas existem algumas diretrizes básicas gerais que funcionam bem:
Espero que ajude você a começar.
Aqui está uma boa lista de verificação que eu gostaria de começar.
Adicionando o que David sugere, quanto mais modular sua instalação, refiro-me a restringir o acesso a determinados usuários / grupos criados especificamente para uma tarefa e limitar seu escopo, mais segura sua pilha LAMP: Um exemplo disso é ter um usuário Apache para arquivos / pastas do Apache com permissões definidas de acordo e não em nenhum grupo que possa acessar arquivos / pastas críticos do sistema. Um usuário que pode acessar as tabelas MySql associadas aos seus sites que você servirá e apenas a essas tabelas. Além disso, você pode restringir o acesso deles para fornecer a quantidade mínima de acesso de uma chamada PHP. Além disso, verifique se o nome de usuário MySQL usado / exposto através do arquivo PHP não é o mesmo nome de usuário ou senha usados para outro usuário.
O que isso significa: se o usuário apache ou MySql estiver comprometido, eles não poderão causar nenhum dano fora do escopo das pastas às quais o apache tem acesso (no caso do usuário apache) e fora da tabela ( s) / banco de dados (s) (no caso do usuário para o banco de dados MySQL).
Se, de alguma forma, o usuário do MySQL estivesse comprometido, eles não poderiam, por exemplo, acessar o banco de dados e remover todos os bancos de dados do MySQL e arruinar todos os seus dados. PODEM, em algumas circunstâncias, poder descartar tabelas ou inserir informações em algumas tabelas em um banco de dados isolado, e é por isso que é importante conceder acesso à tabela somente onde for absolutamente necessário e conceder apenas as permissões necessárias ... se você não não é necessário ter privilégios de descarte de tabelas ou privilégios de atualização; então, não os forneça a esse usuário.
Além disso, se por algum motivo seu nome de usuário e senha da conta administrativa forem descobertos no MySQL, se você usar um nome de usuário diferente de qualquer nome de usuário no seu sistema, eles deverão primeiro interromper a segurança do seu sistema antes de entrar no banco de dados para causar danos. O mesmo vale para o usuário apache e o acesso aos arquivos.
Hora do exemplo! Vou dar um exemplo de sistema para simplificar a ideia.
digamos que você tenha usuários em seu sistema (o root deve ser desabilitado por questões de segurança através de algo como umod -l ou passwd -l, etc.): john, barney, terence e lisa.
você pode criar um usuário no MySQL com o nome de bigbird (certifique-se de usar uma senha com hash). O Bigbird possui apenas privilégios de seleção e atualização, mas não descarta ou cria, e certamente não . Além disso, você cria outro usuário administrativo do MySQL com o nome garfield para trabalhar no banco de dados MySQL e exclui o usuário raiz do banco de dados MySQL para que não possa ser comprometido. Garfield foi concedido . privilégios em todo o MySQL (efetivamente, isso é apenas renomear raiz).
agora, você cria um grupo apache ou um usuário e nós o chamaremos apweb2. O Appweb2 não é membro de outros grupos e todos os arquivos / pastas do apache são armazenados em / home / apweb2 /. Cada host virtual teria sua própria subpasta e cada um desses hosts teria a raiz do documento definida para essa subpasta. Os links simbólicos seriam desativados para não fornecer acesso acidental ao restante do sistema.
Além disso, você pode restringir o acesso do ssh apenas a determinados usuários (ou a certos grupos, gosto de colocá-los no grupo ssh e tornar essa a única coisa capaz de usar o ssh).
Além disso, você pode escolher quais usuários têm privilégios de sudo para restringir ainda mais as coisas. Outra etapa que você pode levar adiante é tornar os usuários do ssh incapazes de sudo, você pode criar usuários especiais que podem usar o sudo que não podem usar o ssh, para que, uma vez que você faça o ssh, faça login em outro usuário para ter acesso ao sudo.
Assim, modularizando cada segmento, se um deles estiver comprometido, toda a pilha não estará comprometida e você poderá solucionar o problema 1 em vez de ter que começar tudo de novo do zero.
Achei este documento do SANS.org realmente útil http://www.sans.org/score/checklists/linuxchecklist.pdf
No momento, não negligencie a virtualização de contêiner, como Docker, systemd-nspawn e os mecanismos de virtualização de contêiner nos quais eles são criados (namespaces, cgroups). O uso da virtualização de contêiner permite isolar processos, por exemplo, se um dos serviços for comprometido, um invasor não terá acesso a outros serviços.
No caso do LAMP, é possível usar, por exemplo, quatro contêineres do Docker com servidor SSH, Apache, MySQL, PHP-FPM / Python / Perl / etc.