Permissões Debian + Nginx / Unicorn

2

Existe um risco de segurança ao executar um servidor da Web como Unicorn como root?

O processo mestre Nginx é executado como raiz, o trabalhador Nginx é executado como o usuário limitado de dados www, mas não posso configurar outro usuário como www-data para executar o mestre / trabalhadores Unicorn sem mexer com o% de www-dataPATH.

    
por clem 01.12.2011 / 00:44

1 resposta

2

Is there a security risk in running a web server like Unicorn as root?

Como Thomas disse no chat sec.se, executar qualquer coisa como root carrega um risco de segurança implícito. A coisa para entender sobre o root é que o kernel essencialmente confia em todas as suas ações sem reclamar.

O problema ocorre se houver alguma vulnerabilidade no nginx ou no unicornio. Se isso acontecer, poderá ser possível executar uma exploração, fazendo mal uso do processo.

No entanto, é importante entender como esses servidores funcionam para entender o que o vetor de exploração pode ser. Em teoria, há duas partes que devem ocorrer com permissões de root - a leitura da configuração e a operação bind() , supondo que o seu servidor tenha uma porta < 1023.

atos de unicórnio (assumindo que o gunicorn é similar) como um modelo prefork - cada solicitação do cliente é tratada em um processo separado. O trabalho do processo executado como root é vincular-se à porta necessária e depois passar as conexões para os trabalhadores. Modelos de trabalho misturam threads e processos. Pelo que entendi, o nginx opera de maneira muito semelhante, com a condição de que tenha um maior viés para o IO assíncrono - acredito que epoll / kqueue / accept . Se você der uma olhada nas estratégias para resolver o problema c10k , é por isso que os projetos operam dessa maneira.

Em teoria, então, a maioria dos processos de trabalho pode seteuid() e seteguid() perder suas permissões de root e deve fazê-lo. Os problemas surgem quando esses processos não lidam com todo o tráfego como raiz; a maioria dos processos elimina suas permissões de root. Também devo fazer duas declarações bastante óbvias:

  1. Você poderia configurar seu daemon nginx para ser executado como algo diferente de root se você não se vincular a portas < 1024.
  2. Você pode (e eu) configurar o unicorn (gunicorn) no meu caso para criar arquivos socket, o que significa que ele não precisa ser executado como root. nginx pode requisitar pedidos da web em sockets unix, o que significa que gunicorn nunca expõe uma conexão tcp.

A "seção vulnerável" do código deve , portanto, equivaler à análise do arquivo de configuração e à entrega de conexões; em teoria o perigo para a raiz é, portanto, mínimo, supondo que isso funcione e seja strongmente testado.

as capacidades do POSIX são uma maneira diferente (diferente de bits setuid) de delegar partes dos recursos do root para outros processos; Por exemplo, CAP_NET_BIND_SERVICE permite que um processo seja vinculado a uma porta menor que 1024 sem precisar ser raiz. Eles trabalham através de atributos estendidos eu acredito. O Fedora recentemente mudou (f16?) Para garantir que todos os pacotes usem capacidades em vez de bits pegajosos.

Outro ponto de nota e espero que seja positivo - unicórnio, se eu entendi corretamente, é um processo de rubi (gunicorn é definitivamente um processo python). O uso de uma linguagem interpretada reduz o risco de que os desenvolvedores tenham introduzido bugs, já que a manipulação de strings deve ser segura e os ponteiros não estão disponíveis. No entanto, bugs com o intérprete podem causar um risco de segurança a todos os programas interpretados também.

A infeliz realidade, no entanto, é que um comprometimento do seu processo www-data ainda será um problema para você; um invasor pode despejar seu banco de dados, desfigurar seu site, etc. Saber se o root é seguro é ótimo, mas se, por exemplo, seu site for o principal ponto de publicidade de seus clientes, ainda será uma ameaça à sua empresa.

Resumo

Sim, executar o unicórnio como root é um risco. No entanto, a superfície de ataque é relativamente pequena em termos do código que será executado como raiz. Além disso, pode haver opções para minimizar o que você executa como root. Eu também não abordei sistemas MAC como o SELinux, mas estas são opções viáveis, juntamente com capacidades, supondo que você esteja preparado para aprendê-las. O importante é entender que o risco é um equilíbrio - o quão sensível / importante é esse serviço determinará quanto esforço você deve investir para protegê-lo. Se você está gerenciando um site bancário, talvez queira pensar seriamente em como você fortalece seu sistema; se este é um site que hospeda imagens do lolcat (ok, você sabe o que quero dizer), você pode decidir que a configuração atual é boa.

    
por 01.12.2011 / 15:09