Por que é arriscado conceder ao sudo vim acesso a usuários comuns?

30

Eu gostaria de criar um novo usuário e dar a ele acesso ao sudo. Para ser específico, quero que ele use sudo vime edite o httpd.conf. Eu escrevi isso em sudoers:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Eu, no entanto, ouvi dizer que isso poderia ser arriscado. Por que isso é problemático? Quão sério é o problema?

mi0pu
fonte
16
Por um lado, seu comando dará ao usuário acesso de leitura e gravação a todos os arquivos no computador. Ao vimentrar, o usuário pode abrir e gravar em qualquer arquivo que desejar.
precisa saber é o seguinte
4
Como um aparte, você pode criar um novo grupo para adicionar qualquer usuário que precise acessar /etc/httpd/confs/httpd.conf. Em seguida, use chgrp [OPTION] GROUPNAME FILEpara alterar a propriedade do grupo /etc/httpd/confs/httpd.conf. Algo como groupadd vimportantcriar o novo grupo e chgrp -v vimportant /etc/httpd/confs/httpd.confalterar a propriedade do grupo. yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin 28/01
4
Observe que, devido a todos os problemas mencionados nas respostas, o sudo inclui uma maneira de permitir que os usuários editem arquivos com um editor executando com seus próprios privilégios. Procure por "Edição segura" na sudoerspágina do manual.
Michał Politowski
2
(Não tenho certeza se o que digo está correto) Como você está dando sudoacesso ao vim, o usuário poderá usar o vim como root. No vim, você pode executar comandos UNIX ( como executar comandos Unix no Vim? ) Para que um usuário possa executar ações como useradd <myuser>, rm -rf /ou muitas outras coisas.
Fedorqui 28/01
6
Este é o tipo de pergunta errada a ser feita. Ao considerar conceder privilégios elevados de qualquer tipo, você não quer pensar "Farei isso, a menos que pense em algum motivo pelo qual é perigoso". Você quer pensar "Eu não farei isso, a menos que eu possa provar para mim mesmo que é seguro".
Nate Eldredge

Respostas:

60

Embora você restrinja os argumentos da linha de comando, nada impede o usuário de usar o vim para abrir, editar e substituir qualquer arquivo aleatório uma vez que esteja sendo executado como root.

O usuário pode executar sudo vim /etc/httpd/conf/httpd.conf e depois

  • limpe todo esse texto do buffer de edição
  • então, por conveniência, forneça um arquivo existente (embora isso nem seja necessário): por exemplo, a configuração do sudo
    :r /etc/sudoers NOTA: A menos que seja restrito pelo SELinux, o usuário pode ler qualquer arquivo dessa maneira!
  • conceder-se mais privilégios sudo user ALL=(ALL) NOPASSWD: ALL
  • substituir a configuração antiga :w /etc/sudoers

Posso imaginar dezenas de maneiras semelhantes com as quais seu usuário agora pode acessar, modificar ou destruir seu sistema.

Você nem terá uma trilha de auditoria cujos arquivos foram alterados dessa maneira, pois você o verá editando sua configuração do Apache nas mensagens de log do sudo. Este é um risco de segurança ao concedersudo privilégios a qualquer editor.

Esse é mais ou menos o mesmo motivo pelo qual a concessão de direitos no nível raiz do sudo a comandos como tare unzipgeralmente é insegura, nada impede que você inclua substituições para binários do sistema ou arquivos de configuração do sistema no arquivo morto.


Um segundo risco, como muitos outros comentadores apontaram, é o de vimpermitir escapes de shell , onde você pode iniciar um sub-shell a partir do vim que permite executar qualquer comando arbitrário . Na sua sessão do sudo vim, eles serão executados como root, por exemplo, o escape de shell:

  • :!/bin/bash lhe dará um shell raiz interativo
  • :!/bin/rm -rf / fará boas histórias no pub.

O que fazer em vez disso?

Você ainda pode usar sudopara permitir que os usuários editem arquivos que não possuem de maneira segura.

Na configuração do sudoers, você pode definir um comando reservado especial sudoeditseguido pelo nome do caminho completo (curinga) para o (s) arquivo (s) que um usuário pode editar:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

O usuário pode então usar a -eopção na linha de comando sudo ou o sudoeditcomando:

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

Conforme explicado na página do manual :

A -e (edit)opção indica que, em vez de executar um comando, o usuário deseja editar um ou mais arquivos. Em vez de um comando, a cadeia "sudoedit" é usada ao consultar a política de segurança.
Se o usuário estiver autorizado pela política, serão executadas as seguintes etapas:

  • São feitas cópias temporárias dos arquivos a serem editados com o proprietário definido para o usuário que está chamando.
  • O editor especificado pela política é executado para editar os arquivos temporários. A política de sudoers usa as variáveis ​​de ambiente SUDO_EDITOR, VISUAL e EDITOR (nessa ordem). Se nenhum de SUDO_EDITOR, VISUAL ou EDITOR estiver definido, o primeiro programa listado na sudoersopção editor (5) será usado.
  • Se eles foram modificados, os arquivos temporários são copiados de volta para o local original e as versões temporárias são removidas.
    Se o arquivo especificado não existir, ele será criado.
    Observe que, diferentemente da maioria dos comandos executados pelo sudo, o editor é executado com o ambiente do usuário que está chamando não modificado. Se, por algum motivo, o sudo não conseguir atualizar um arquivo com sua versão editada, o usuário receberá um aviso e a cópia editada permanecerá em um arquivo temporário.

O sudoersmanual também possui uma seção completa de como oferecer proteção limitada contra fugas de shell com as opções RESRICTe NOEXEC.

restrict Evite dar aos usuários acesso a comandos que permitem ao usuário executar comandos arbitrários. Muitos editores têm um modo restrito em que escapes de shell estão desativados, embora o sudoedit seja uma solução melhor para executar editores via sudo. Devido ao grande número de programas que oferecem escapes de shell, restringir os usuários ao conjunto de programas que geralmente não é viável.

e

noexec
Muitos sistemas que suportam bibliotecas compartilhadas têm a capacidade de substituir as funções padrão da biblioteca, apontando uma variável de ambiente (geralmente LD_PRELOAD) para uma biblioteca compartilhada alternativa. Nesses sistemas, a funcionalidade noexec do sudo pode ser usada para impedir que um programa executado pelo sudo execute outros programas. Nota: ... ...
Para ativar o noexec para um comando, use a NOEXECtag conforme documentado na seção Especificação do Usuário acima. Aqui está o exemplo novamente:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Isso permite que o usuário aaron seja executado /usr/bin/moree /usr/bin/vicom o noexec ativado. Isso impedirá que esses dois comandos executem outros comandos (como um shell).

HBruijn
fonte
Eu não sabia disso sudo tare sudo unziptambém causava problemas. Obrigado.
mi0pu
5
Boa resposta. Seria ainda melhor se ele também mencionasse escapar de dentro do vim para um shell. Quando você está em um shell, é grátis para todos, e ainda assim tudo que apareceria nos logs é que o usuário está editando seu arquivo de configuração do Apache.
um CVn
2
Além disso? Se você estiver usando o vim, poderá fazer algo horrível, como :!rm -rf /, gritos!
Wayne Werner
11
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcE boom. O acesso root ao tar é uma vulnerabilidade.
Qix
11
@ MichaelKjörling essa é a resposta que eu estava esperando, :she depois crescer, shell de root
Creek
5

Essa configuração permite que o usuário edite esse arquivo. Para fazer isso, ele inicia um vimeditor com direitos de root.

Depois que o vimcomando é iniciado, o usuário pode fazer o que quiser com esse editor. - Ele pode abrir um arquivo diferente ou até mesmo iniciar um shell no vim.

Portanto, o usuário agora pode visualizar e editar arquivos arbitrários e executar comandos arbitrários no seu sistema.

michas
fonte
O que você quer dizer com "Esta configuração permite que todos os usuários editem esse arquivo"? "Usuário" tem um significado especial?
mi0pu
Opa, não prestei atenção. corrigiu a resposta.
Michas
5

Bloqueios de segurança

Alguns programas, como por exemplo less, vi, vime more, permitir que outros programas executados a partir de um comando-o shell é conhecido como Shell Escape ou fugir para o interpretador de comandos. Nesses casos, você pode usar NOEXECpara impedir que alguns programas permitam a execução de outros privilégios. Exemplo:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

Isso permitiria que o usuário editasse uma visualização privilegiada de qualquer arquivo no sistema executando o vim e mais, mas desabilita a possibilidade de executar outros programas com privilégios do interpretador de comandos de escape vim.

É importante sudoincluir vários bloqueios de segurança (padrão) que podem impedir tarefas perigosas, como redirecionar a saída padrão da execução de um programa ( STDOUT) para arquivos fora do diretório inicial do usuário.

Se definido no arquivo /etc/sudoersque um usuário pode executar com privilégios /usr/bin/vim, ou seja, algo como o seguinte:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudopermite que o usuário regular definido possa executar /usr/bin/vimdas seguintes maneiras:

sudo /usr/bin/vim
sudo vim

Mas seja impedido de executar o vim da seguinte maneira:

cd /usr/bin
sudo ./vim
Pawan Kumar
fonte
2
Isso deveria ser uma resposta ou um erro de recortar e colar?
jasonwryan
11
A maior parte disso não está relacionada à questão.
Hauke ​​Laging
4

A resposta simples:

A seguir está um comando do Vim:

:shell

Agora eles têm um shell raiz.

Curinga
fonte
1

Uma possível melhoria incremental da segurança seria substituir:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

com

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

e faça com que o usuário execute sudo rvim /etc/httpd/confs/httpd.conf.

O Vim suporta um modo restrito acionado com a opção de linha de comando -Z ou iniciando o programa como rvim. Quando o modo restrito está ativado "todos os comandos que usam um shell externo são desativados". Essa abordagem não impediria o usuário de usar um :split filecomando ex para abrir outros arquivos, mas pelo menos deveria impedir comandos shell deliberadamente maliciosos como :!rm -rf /.

Johann
fonte
11
Infelizmente, isso também é 100% inseguro. Se o usuário conseguir editar / etc / sudoers para se tornar onipotente no sistema, ele poderá executar qualquer comando como root.
vurp0
0

Eu concordo com a resposta de HBruijn que executar o vim como root abre o sistema muito amplo e o sudoedit seria uma solução mais segura.

Mas, mesmo assim, é provável que seu sistema ainda esteja bastante aberto. Pelo menos assumindo que algum processo apache com privilégios de root será iniciado com base nessa configuração. Existem milhões de maneiras de configurar o apache de forma que ele execute programas externos. Como um exemplo, considere o argumento de pipe na diretiva CustomLog . O manual declara explicitamente:

Segurança:

Se um programa for usado, ele será executado como o usuário que iniciou httpd. Isso será raiz se o servidor foi iniciado pela raiz; verifique se o programa é seguro.

Obviamente, se seus usuários puderem escrever a configuração, eles poderão alterar o programa para o que quiserem, por exemplo, algo que execute um script de shell para conceder permissões adicionais.

Por esse motivo, recentemente hackeei uma maneira de usar recursos de forma que o apache possa obter a capacidade especial de vincular-se a uma porta privilegiada, mesmo que esteja executando como um usuário normal. Dessa forma, os usuários podem editar a configuração e até iniciar o servidor, e ainda estão seguros. O único problema é que eles podem vincular qualquer processo em qualquer IP. Um certo grau de confiança permanece, pois eles podem encontrar uma maneira de travar o sshd do sistema e, em seguida, iniciar sua própria versão na tentativa de obter a senha root.

MvG
fonte
0

Note-se que mesmo um sudoedit {.../whatever.conf}pode ser um risco de segurança.

Crie um script de shell /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

e chame esse script no seu arquivo de configuração. Conheço vários exemplos em que essa abordagem está funcionando:

Comando samba -> log nt token

log nt token command = /tmp/make_me_root.sh

syslog-ng -> program: Enviando mensagens para aplicativos externos

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Suponho que se possa estender essa lista sem fim.

Tudo que você precisa fazer é reiniciar o serviço. Obviamente, quando você for root, reverterá essas linhas de configuração para desfocar seus traços.

Wernfried Domscheit
fonte
0

Claro, não é mais seguro. Como dito anteriormente, o sudoedit é a maneira mais fácil e adequada de fazer isso.

O que eu quero acrescentar é que o vim permite o lançamento de um shell, para que não apenas possa editar qualquer arquivo do sistema, ele também permita o lançamento de um shell e faça o que ele quiser.

Apenas tente iniciar um vim e digite: sh

Lauskin
fonte