Apache como raiz não raiz

6

Estou passando por uma auditoria no trabalho, e há uma exigência da empresa de que certos serviços não sejam executados como o usuário raiz dos sistemas linux. O Apache inicia o primeiro processo como o usuário root para ligar à porta 80 (ou 443) e depois gera os processos restantes como www-data. Existe uma maneira de configurar o apache e o Ubuntu (14.04) para iniciar o primeiro processo como www-data também?

    
por Beerman 04.11.2015 / 22:54

3 respostas

14

Eu não concordo com a resposta existente (e uma centena de respostas pela Internet).

É possível executar o Apache2 como algo diferente de root.

Não é assim, por padrão, o comportamento padrão do Ubuntu que está dificultando bastante as coisas para você. Todos os seus scripts e configurações esperam usar o modelo root-then-drop-privileges.

Vou apenas abordar as coisas comumente citadas como "definitivamente precisando de root" (acima e em outros lugares):

  • Porta 80 . Esqueça por um minuto que você pode querer correr em uma porta sem privilégios (algumas pessoas fazem, eu costumava rodar o Apache assim atrás do Nginx) ... Você pode ainda vincula portas baixas como não-raiz usando a estrutura de capacidades do Linux (desde 2.6.24 ); dando ao Apache os direitos de vincular a qualquer porta que ele goste, independentemente do usuário:

    sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/apache2
    

    Ou você pode usar o iptables para redirecionar a porta 80 para uma porta sem privilégios.

  • Lendo arquivos de configuração e certificados . Por padrão, a configuração pode ser lida por qualquer usuário. Se você bloquear www-data (ou qualquer usuário que esteja executando o Apache) de ler configurações ou certificados - o que você pode - você quebrará o servidor.

    Algumas pessoas falam sobre o processo raiz inicial como se ele pudesse ser usado para obter privilégios após inicialização. Esse não é o caso. Isso seria terrivelmente inseguro. Ele apenas controla processos filho sem privilégios.

A verdade é que você pode quebrar as coisas para fazer este trabalho. Não faça isso. Pelo menos não até você ler o post inteiro.

sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/apache2
sudo /etc/init.d/apache2 stop
sudo chown -R www-data: /var/{log,run}/apache2/
sudo -u www-data apache2ctl start

E aí está você. Executando o Apache como um badass como www-data .

Mas eu não faria isso em produção. Meu código acima não tem um script de inicialização, então você precisaria substituir ou "corrigir" /etc/init.d/apache2 para parar um root. execute a versão que está sendo executada e inicie sua versão www-data. Isso não é um empreendimento pequeno; olhe o roteiro.

Mais do que tudo, o modelo de privilégio de escalação que o Apache vem usando é testado em batalha. Por anos. Outros servidores também fazem isso. Não é mal .

Se seus administradores entrarem em contato com o que você está executando, você tem algumas opções:

  • Faça isso em uma VM (como eu fiz para testar essa resposta). lxc , docker , etc, etc, etc. Configuração mínima, luz bonita e limpa e pode funcionar como um usuário "normal" por fora, parecendo um metal nu por dentro.

  • Use um httpd que não precise de root. O Apache tem um ecossistema inteiro em torno dele que espera certas coisas, então não é uma boa escolha. Mas o que você escolher, você provavelmente terá que lutar contra seus scripts de inicialização.

  • Se você precisa apenas de coisas super básicas em uma porta não priv, você pode executar:

    python -m SimpleHTTPServer 8000
    
por Oli 05.11.2015 / 01:21
8

A resposta curta :

Você não pode fazer o primeiro processo mestre do Apache iniciar como não-raiz para o processo mestre de uma maneira sã. Isso ocorre porque o processo mestre é necessário para executar como superusuário para vincular à porta 80 (HTTP) e 443 (HTTPS) e para acessar os arquivos de configuração (em /etc/apache2/ por padrão) para que os funcionários saibam o que devem fazer.

Detalhes sobre isso estão abaixo, e muitos servidores web nos repositórios têm tipos similares de configurações (o NGINX também opera com os mesmos princípios básicos).

Os detalhes

O processo do Apache Master - isso acessa os arquivos de configuração e vincula os trabalhadores às portas & lt; = 1024:

O processo mestre do Apache precisa ser executado como root .

Isso ocorre porque todos os arquivos de configuração dentro de /etc/apache2/... são normalmente de propriedade, como root, e para acessar (alguns) dados de certificado SSL privados ( /etc/ssl/private/... normalmente), ele precisará de energia de superusuário.

O acesso administrativo também é necessário para vincular a portas menores que 1024, que incluem a porta 80 (HTTP) e 443 (HTTPS), para um servidor da Web que trabalha com portas HTTP / HTTPS típicas para funcionar corretamente nessas portas. / p>

O processo mestre não faz muito mais do que isso, realmente, e não lida com solicitações reais de clientes, nem interage com docroots da Web, etc.

Os processos de trabalho do Apache - Eles lidam com solicitações e respostas para navegadores da Web:

Os funcionários do Apache realmente manipulam solicitações que chegam ao servidor da Web e lidam com o acesso a dados no sistema e o envio da resposta aos clientes. Isto é, creio, onde sua política de TI realmente está falando sobre a execução como não-raiz.

Isso é executado como www-data , que não é uma conta de nível de administrador e não tem privilégios elevados. É aí que os controles de acesso padrão no sistema são utilizáveis e é realmente o que realmente cobre a restrição "Não é possível executar como root" - tanto que você não deseja que os processos de trabalho sejam executados como root / superusuário.

Por que penso que existe uma falha de comunicação entre a política e você, ou porque penso que as suas políticas de TI precisam de ser revisitadas e deve estar a falar com as pessoas de TI no seu ambiente:

Se sua empresa / local de trabalho estiver informando "Não podemos deixar o Apache ser executado como root", verifique com a equipe de TI da empresa.

A razão de ser uma política "ruim" ou "mal interpretada" é porque você não pode usar http://somewebaddress.tld ou https://somewebaddress.tld em seu domínio se o Apache não puder se vincular à porta 80 ou 443, respectivamente. Se eles não quiserem que o processo mestre seja executado como root, será preciso manualmente alterar a propriedade de /etc/apache2/* ou fornecer um diretório de dados separado para configurações e, em seguida, ter todos os sites exibidos por Apache escute em portas maiores que 1024.

    
por Thomas Ward 04.11.2015 / 23:09
1

Usar sudo com acesso configurado apenas para os scripts de controle do apache geralmente é considerado a melhor prática. Não elimina completamente o estado "raiz" transitório no início, mas qualquer auditor de segurança que não entenda isso não vale o dinheiro que está sendo pago.

Também é relativamente simples instalar uma versão personalizada do Apache no espaço do usuário para configurar toda a propriedade do arquivo para um usuário com menos privilégios que tenha apenas esse privilégio elevado controlado através do sudo.

    
por Ricardo Newbery 05.11.2015 / 01:09

Tags