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 tar
e unzip
geralmente é 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 vim
permitir 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 sudo
para 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 sudoedit
seguido 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 -e
opção na linha de comando sudo ou o sudoedit
comando:
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
sudoers
opçã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 sudoers
manual também possui uma seção completa de como oferecer proteção limitada contra fugas de shell com as opções RESRICT
e 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 NOEXEC
tag 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/more
e /usr/bin/vi
com o noexec ativado. Isso impedirá que esses dois comandos executem outros comandos (como um shell).
vim
entrar, o usuário pode abrir e gravar em qualquer arquivo que desejar.