Até agora, o que posso concluir é que o fakeroot é usado para dar propriedade a um arquivo que precisa ser root quando é descompactado / tar'ed. Minha pergunta é: por que você não pode simplesmente fazer isso com o chown?
Porque você não pode simplesmente fazer isso com chown
, pelo menos não como um usuário não root. (E se você estiver executando como root, não precisará fakeroot
.) Esse é o objetivo fakeroot
: permitir que os programas que esperam ser executados como root sejam executados como um usuário normal, enquanto fingem que as operações que exigem root são bem-sucedidas.
Isso é usado normalmente ao criar um pacote, para que o processo de instalação do pacote que está sendo instalado possa continuar sem erros (mesmo que seja executado chown root:root
, ou install -o root
etc.). fakeroot
lembra-se da propriedade falsa que pretendia fornecer arquivos; portanto, as operações subsequentes que examinam a propriedade veem isso em vez do real; isso permite tar
execuções subsequentes, por exemplo, para armazenar arquivos pertencentes à raiz.
Como o fakeroot interrompe escalações indesejadas de privilégios no Linux? Se o fakeroot pode induzir o tar a criar um arquivo que pertence à raiz, por que não fazer algo semelhante ao SUID?
fakeroot
não se engana tar
ao fazer nada, preserva as alterações que a compilação deseja fazer sem permitir que essas alterações tenham efeito no sistema que hospeda a compilação. Você não precisa fakeroot
produzir um tarball contendo um arquivo pertencente a root e suid; se você possui um binário evilbinary
, executando tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
, como usuário comum, criará um tarball contendo evilbinary
, de propriedade de root e suid. No entanto, você não poderá extrair esse tarball e preservar essas permissões, a menos que faça isso como root: não há escalação de privilégios aqui. fakeroot
é um privilégio de-escalation tool: permite executar uma compilação como um usuário comum, preservando os efeitos que a compilação teria se tivesse sido executada como raiz, permitindo que esses efeitos fossem reproduzidos posteriormente. Aplicar os efeitos "de verdade" sempre requer privilégios de root; fakeroot
não fornece nenhum método para adquiri-los.
Para entender o uso de fakeroot
mais detalhes, considere que uma construção de distribuição típica envolve as seguintes operações (entre muitas outras):
- instalar arquivos pertencentes à raiz
- ...
- arquive esses arquivos, ainda de propriedade de raiz, para que, quando extraídos, sejam de propriedade de raiz
A primeira parte obviamente falha se você não é root. No entanto, quando executado fakeroot
como um usuário normal, o processo se torna
- instalar arquivos pertencentes ao root - isso falha, mas
fakeroot
finge que é bem-sucedido e lembra a propriedade alterada
- ...
- arquivar esses arquivos, ainda de propriedade do root - quando
tar
(ou qualquer outro arquivador que estiver sendo usado) perguntar ao sistema qual é a propriedade do arquivo, fakeroot
altera a resposta para corresponder à propriedade registrada anteriormente
Assim, você pode executar uma compilação de pacotes sem ser root, enquanto obtém os mesmos resultados que obteria se estivesse realmente executando como root. Usar fakeroot
é mais seguro: o sistema ainda não pode fazer nada que seu usuário não possa fazer, portanto, um processo de instalação não autorizado não pode danificar seu sistema (além de tocar em seus arquivos).
No Debian, as ferramentas de construção foram aprimoradas para não exigir mais isso, e você pode construir pacotes semfakeroot
. Isso é suportado dpkg
diretamente pela Rules-Requires-Root
diretiva (consulte rootless-builds.txt
).
Para entender a finalidade fakeroot
e os aspectos de segurança da execução como raiz ou não, pode ajudar a considerar a finalidade do empacotamento. Ao instalar um software da fonte, para uso em todo o sistema, proceda da seguinte maneira:
- construir o software (que pode ser feito sem privilégios)
- instale o software (que precisa ser feito como root ou, pelo menos, como um usuário autorizado a gravar nos locais apropriados do sistema)
Quando você empacota um software, está atrasando a segunda parte; mas para fazer isso com sucesso, você ainda precisa “instalar” o software no pacote e não no sistema. Portanto, quando você empacota o software, o processo se torna:
- construir o software (sem privilégios especiais)
- fingir instalar o software (novamente sem privilégios especiais)
- capturar a instalação do software como um pacote (idem)
- disponibilizar o pacote (idem)
Agora, um usuário conclui o processo instalando o pacote, que precisa ser feito como root (ou novamente, um usuário com os privilégios apropriados para gravar nos locais apropriados). É aqui que o processo privilegiado atrasado é realizado e é a única parte do processo que precisa de privilégios especiais.
fakeroot
ajuda nas etapas 2 e 3 acima, permitindo executar processos de instalação de software e capturar seu comportamento, sem executar como root.