Uma das práticas recomendadas de segurança mais comuns atualmente parece estar movendo wp-config.php
um diretório mais alto que a raiz do documento do vhost . Eu realmente nunca encontrei uma boa explicação para isso, mas presumo que seja para minimizar o risco de um script malicioso ou infectado dentro da raiz da web de ler a senha do banco de dados.
Mas você ainda precisa permitir que o WordPress o acesse, então você precisa expandir open_basedir
para incluir o diretório acima da raiz do documento. Isso não acaba com todo o objetivo e também potencialmente expõe os logs do servidor, backups etc. aos atacantes?
Ou a técnica está apenas tentando impedir uma situação em wp-config.php
que seria mostrada em texto sem formatação para quem solicita http://example.com/wp-config.php
, em vez de ser analisada pelo mecanismo PHP? Parece uma ocorrência muito rara e não superaria as desvantagens de expor logs / backups / etc a solicitações HTTP.
Talvez seja possível movê-lo para fora da raiz do documento em algumas configurações de hospedagem sem expor outros arquivos, mas não em outras configurações?
Conclusão: Depois de muitas idas e vindas sobre esse assunto, surgiram duas respostas que eu acho que deveriam ser consideradas as autoritativas. Aaron Adams faz um bom argumento a favor de mover o wp-config e chrisguitarguy faz um bom argumento contra ele . Essas são as duas respostas que você deve ler se for novo no tópico e não quiser ler a coisa toda. As outras respostas são redundantes ou imprecisas.
fonte
Respostas:
Resposta curta: sim
A resposta a esta pergunta é um sim inequívoco , e dizer o contrário é completamente irresponsável .
Resposta longa: um exemplo do mundo real
Permitam-me fornecer um exemplo muito real, do meu servidor muito real, onde a movimentação para
wp-config.php
fora da raiz da web impedia especificamente que seu conteúdo fosse capturado .O inseto:
Dê uma olhada nesta descrição de um bug no Plesk (corrigido no 11.0.9 MU # 27):
Parece inofensivo, certo?
Bem, aqui está o que eu fiz para acionar esse bug:
site.staging.server.com
parasite-staging.ssl.server.com
).Quando fiz isso, o Plesk redefiniu o subdomínio para os padrões: exibir o conteúdo de
~/httpdocs/
, sem intérpretes (por exemplo, PHP) ativos.E eu não percebi. Por semanas.
O resultado:
wp-config.php
a raiz da web, uma solicitação para/wp-config.php
baixar o arquivo de configuração do WordPress.wp-config.php
fora da raiz da web, uma solicitação para/wp-config.php
baixar um arquivo completamente inofensivo.wp-config.php
Não foi possível baixar o arquivo real .Portanto, é óbvio que
wp-config.php
sair da raiz da web traz benefícios de segurança autênticos no mundo real .Como mudar
wp-config.php
para qualquer local no seu servidorO WordPress procurará automaticamente um diretório acima da instalação do WordPress para o seu
wp-config.php
arquivo; portanto, se foi para onde você o moveu, está pronto!Mas e se você o mudou para outro lugar? Fácil. Crie um novo
wp-config.php
no diretório WordPress com o seguinte código:(Certifique-se de alterar o caminho acima para o caminho real do seu
wp-config.php
arquivo realocado .)Se você tiver algum problema
open_basedir
, basta adicionar o novo caminho àopen_basedir
diretiva na sua configuração do PHP:É isso aí!
Separando argumentos em contrário
Todo argumento contra a
wp-config.php
saída da raiz da web depende de suposições falsas.Argumento 1: se o PHP estiver desativado, eles já estão no
FALSO : O cenário que descrevi acima é resultado de uma configuração incorreta, não de uma invasão.
Argumento 2: Desabilitar acidentalmente o PHP é raro e, portanto, insignificante
FALSO : O cenário que descrevi acima é o resultado de um bug em um software comum de servidor, afetando uma configuração comum de servidor. Isso dificilmente é "raro" (além disso, segurança significa se preocupar com o cenário raro).
WTF : Alterar a senha após uma invasão dificilmente ajuda se informações confidenciais foram coletadas durante a invasão. Realmente, ainda achamos que o WordPress é usado apenas para blogs casuais e que os invasores estão interessados apenas em desfiguração? Vamos nos preocupar em proteger nosso servidor, não apenas em restaurá-lo depois que alguém entrar.
Argumento 3: Negar acesso a
wp-config.php
é bom o suficienteFALSO : Imagine sua padrões do servidor para um host virtual são: não PHP, não
.htaccess
,allow from all
(dificilmente incomum em um ambiente de produção). Se sua configuração for de alguma forma redefinida durante uma operação de rotina - como, por exemplo, uma atualização do painel - tudo voltará ao seu estado padrão e você será exposto.Se seu modelo de segurança falhar quando as configurações forem acidentalmente redefinidas para os padrões, você precisará de mais segurança.
WTF : Por que alguém recomendaria especificamente menos camadas de segurança? Carros caros não têm apenas fechaduras; eles também têm alarmes, imobilizadores e rastreadores de GPS. Se algo vale a pena proteger, faça o que é certo.
Argumento 4: acesso não autorizado a
wp-config.php
não é grande coisaFALSO : As chaves de autenticação e os sais podem ser usados em qualquer número de possíveis ataques de seqüestro.
WTF : Mesmo se as credenciais do banco de dados fossem a única coisa
wp-config.php
, você deve ter pavor de um invasor colocar as mãos nelas.Argumento 5: Mover-se para
wp-config.php
fora da raiz da Web torna um servidor menos seguroFALSE : Assumindo que
wp-config.php
está dentrohttpdocs/
, basta movê-lo para../phpdocs/
e definidoopen_basedir
para incluir apenashttpdocs/
ephpdocs/
. Por exemplo:(Lembre-se de sempre incluir
/tmp/
, ou seutmp/
diretório de usuários , se você tiver um.)Conclusão: os arquivos de configuração devem sempre estar sempre localizados fora da raiz da web
Se você se preocupa com segurança, sairá
wp-config.php
da raiz da web.fonte
wp-config.php
permanece em segurança. E é extremamente improvável - tanto que seja essencialmente impossível - que um bug resulte na raiz da web sendo arbitrariamente redefinida para o diretório exato em que você colocou o seuwp-config.php
.wp-config.php
para um local arbitrário. Adicionei instruções à minha resposta; envolve apenas a criação de um manequimwp-config.php
no diretório WordPress, referenciando a localização do real.A principal coisa é que
wp-config.php
contém algumas informações confidenciais: nome de usuário / senha do banco de dados, etc.Então a idéia: mova-a para fora da raiz do documento e você não precisa se preocupar com nada. Um invasor nunca poderá acessar esse arquivo de uma fonte externa.
Aqui está o problema, no entanto:
wp-config.php
na verdade, nunca imprime nada na tela. Ele define apenas várias constantes usadas durante a instalação do WP. Portanto, a única maneira de alguém ver esse conteúdo é contornar o interpretador PHP dos servidores - eles obtêm.php
arquivo seja renderizado como texto sem formatação. Se isso acontecer, você já está com problemas: eles têm acesso direto ao seu servidor (e provavelmente permissões de root) e podem fazer o que quiserem.Vou seguir em frente e dizer que não há benefício em
wp-config
sair da raiz do documento de uma perspectiva de segurança - pelos motivos acima e :wp-config
para impedir que qualquer usuário sem privilégios suficientes leia o arquivo, mesmo que obtenha acesso (limitado) ao seu servidor via SSH.wp-config.php
arquivo pertence. Mais importante, esse usuário de banco de dados tem apenas permissões para ler e gravar no banco de dados da instalação do WP e nada mais - sem acesso para conceder permissões a outros usuários. Em outras palavras, se um invasor obtém acesso ao seu banco de dados, é simplesmente uma questão de restaurar a partir de um backup (consulte o ponto 4) e alterar o usuário do banco de dados.wp-config
, provavelmente já mexeu com outra coisa.wp-config
e, como você é cuidadoso (consulte os pontos 3 e 4), não é grande coisa. Os sais e tal podem ser alterados a qualquer momento. A única coisa que acontece é que isso invalida os cookies dos usuários conectados.Para mim,
wp-config
sair da raiz do documento cheira a segurança pela obscuridade - o que é um homem de palha.fonte
Eu acho que Max é uma resposta experiente, e esse é um lado da história. O Codex do WordPress tem mais conselhos :
Observe que a configuração das permissões 400 ou 440 no wp-config.php pode impedir que os plugins os gravem ou modifiquem. Um caso genuíno, por exemplo, seria o plug-in de cache (cache total do W3, super cache do WP etc.). Nesse caso, eu usaria 600 (a permissão padrão para arquivos no
/home/user
diretório).fonte
public_html
, mover parawp-config.php
fora do diretório significa que ele estará nopublic_html
diretório. Nesse caso, você terá que usar as regras htaccess para negar solicitações HTTP para wp-config.php. (2) Se o WordPress estiver instalado diretamente nopublic_html
diretório, um nível acima => você o moverá para o/home/user
diretório. Nesse caso, você está bastante seguro, pois o arquivo está fora da raiz do documento. Você ainda pode definir as permissões do arquivo para 600 (ou até 440 ou 400).Alguém nos pediu para brilhar, e eu responderei aqui.
Sim, existem benefícios de segurança ao isolar o wp-config.php do diretório raiz do seu site.
1- Se o seu manipulador PHP for quebrado ou modificado de alguma forma, suas informações de banco de dados não serão expostas. E sim, vi isso acontecer algumas vezes em hosts compartilhados durante as atualizações do servidor. Sim, o site será quebrado durante esse período, mas suas senhas permanecerão intactas.
2- As melhores práticas sempre recomendam isolar os arquivos de configuração dos arquivos de dados. Sim, é difícil fazer isso com o WordPress (ou qualquer aplicativo da Web), mas movê-lo para cima faz um pouco de isolamento.
3- Lembre-se da vulnerabilidade do PHP-CGI, onde qualquer um poderia passar os? -S para um arquivo e visualizar a fonte. http://www.kb.cert.org/vuls/id/520827
No final, esses são pequenos detalhes, mas ajudam a minimizar os riscos. Especialmente se você estiver em um ambiente compartilhado, onde qualquer pessoa possa acessar seu banco de dados (tudo o que precisa é de um usuário / senha).
Mas não deixe que pequenas distrações (otimizações prematuras) cheguem ao que é realmente necessário para obter um site adequadamente seguro:
1- Mantenha-o sempre atualizado
2- Use senhas fortes
3- Restrinja o acesso (via permissões). Temos um post sobre isso aqui:
http://blog.sucuri.net/2012/08/wordpress-security-cutting-through-the-bs.html
obrigado,
fonte
Definitivamente sim.
Quando você move o wp-config.php para fora do diretório público, você o protege da leitura usando o navegador quando o manipulador de php é maliciosamente alterado (ou acidentalmente!).
A leitura do login / senha do banco de dados é possível quando o servidor dificilmente está infectado por uma falha do administrador coxo. Carregue uma multa ao administrador e obtenha um host de servidor melhor atendido e mais confiável. Embora isso possa ser mais caro.
fonte
open_basedir
escopo expandido ?-rwx
acesso a diretórios mais altos dopublic_html
que nuncaopen_basedir
. Meus logs estão em um diretório separado, assim como os backups. Eu acho que é isso que todos os hosts compartilhados têm.Eu só quero esclarecer, por uma questão de argumento, que mover o arquivo wp_config.php não significa necessariamente que você precise movê-lo apenas para o diretório pai. Digamos que você tenha uma estrutura como / root / html, em que o html contenha a instalação do WP e todo o seu conteúdo HTML. Em vez de mover o wp_config.php para / root, você pode movê-lo para algo como / root / secure ... que está fora do diretório html e também não no diretório raiz do servidor. Obviamente, você precisaria garantir que o php também possa ser executado nesta pasta segura.
Como o WP não pode ser configurado para procurar o wp_config.php em uma pasta irmã como / root / secure, você precisa executar uma etapa adicional. Deixei o wp_config.php em / root / html e recortei as partes sensíveis (login no banco de dados, salt, prefixo da tabela) e as movi para um arquivo separado chamado config.php. Então você adiciona o PHP
include
comando ao seu wp_config.php, assim:include('/home/content/path/to/root/secure/config.php');
Isso é essencialmente o que eu fiz na minha configuração. Agora, com base na discussão acima, ainda estou avaliando se é necessário ou mesmo uma boa ideia. Mas eu só queria acrescentar que a configuração acima é possível. Ele não expõe seus backups e outros arquivos raiz e, desde que a pasta segura não esteja configurada com seu próprio URL público, não poderá ser navegada.
Além disso, você pode limitar o acesso à pasta segura criando um arquivo .htaccess com:
fonte
open_basedir
directiva tem toda uma árvore , de modo a fim de acessar/root/secure
a partir/root/html
, você tem que definiropen_basedir
a/root
./root/httpdocs/config/accessible
, ondehttpdocs
contém logs, backups, etc;config
detémwp-config.php
, eaccessible
detém WordPress e todo o conteúdo. Você precisaria modificar a configuração do vhost, etc, para remapear a raiz do documentoaccessible
. No entanto, não vejo nenhum benefício em negar solicitações HTTP para o wp-config na configuração padrão.Existem muitos temas e plugins mal escritos por aí que permitem aos atatckers injetar código (lembre-se do problema de segurança com o Timthumb). Se eu fosse um invasor, por que devo procurar o wp-config.php? Simplesmente injete este código:
Você pode tentar ocultar o seu wp-config.php. Desde que o WordPress torne todas as informações confidenciais acessíveis em todo o mundo, não há nenhum benefício em ocultar o wp-config.php.
A parte ruim do wp-config.php não é que ele contém dados confidenciais. A parte ruim é definir os dados confidenciais como uma constante acessível global.
Atualizar
Quero esclarecer os problemas com
define()
e por que é uma má idéia definir dados confidenciais como uma constante global.Existem várias maneiras de atacar um site. A injeção de script é apenas uma maneira de atacar um site.
Supondo que o servidor tenha uma vulnerabilidade que permite que um invasor acesse um despejo de memória. O invasor encontrará na memória despejar todos os valores de todas as variáveis. Se você definir uma constante global acessível, ela deverá permanecer na memória até o final do script. Criando uma variável em vez de uma constante, há uma boa chance de que o coletor de lixo substitua (ou libere) a memória depois que a variável não for mais necessária.
Uma maneira melhor de proteger dados confidenciais é excluí-los imediatamente após usá-los:
Depois de usar os dados confidenciais, a atribuição a
null
substituirá os dados na memória. Um invasor precisa obter o despejo de memória no momento em que$db_con
contém os dados confidenciais. E esse é um período muito curto no exemplo acima (se a classe Database_Handler não salvar uma cópia dela).fonte
Além dos benefícios de segurança, ele também permite que você mantenha sua instância do WordPress sob controle de versão e mantenha os arquivos principais do WordPress como um submódulo / externo. Foi assim que Mark Jaquith configurou seu projeto WordPress-Skeleton. Consulte https://github.com/markjaquith/WordPress-Skeleton#assumptions para obter detalhes.
fonte
wp-config.php
um diretório acima da raiz do documento do vhost , não apenas um diretório acima da pasta de instalação do WordPress. O ponto principal é tirá-lo da pasta que pode ser lida por solicitações HTTP.