É seguro chown `/ usr / local`?

15

Eu sei para que /usr/localserve - instalar software para a máquina local. Por padrão, rootpossui o diretório Isso significa que para instalar lá, você precisa usar sudo. Para uma máquina de usuário único ou desenvolvedor, isso parece um uso extra desnecessário do comando. Portanto, minha pergunta - é seguro para mim possuir /usr/local?

Por exemplo, o Homebrew para OS X "Just Works" porque eles possuem /usr/locale instalam com segurança seu software lá sem o uso de sudo.

Além disso, se você possui um software compilado localmente instalado /usr/local, o software atualmente precisa de raiz para se modificar ou instalar plug-ins. Isso parece inseguro - quero usar apenas sudoquando souber EXATAMENTE o que acontecerá.

Opiniões?

PR3x
fonte

Respostas:

5

Não recomendo me tornar o proprietário /usr/local; para a maioria das situações, é provavelmente menos seguro do que usar sudo.

Sua pergunta sugere dois motivos pelos quais você pode querer chown /usr/local.

O primeiro é evitar ter que usar sudopara instalar o software. Para alguns (como o autor desta resposta ), isso pode indicar que você deseja trabalhar com eficiência ou salvar as teclas necessárias para digitar sudoe digitar sua senha. Mas provavelmente quando você diz "desnecessário", você está se referindo ao princípio do menor privilégio :

Por padrão, rootpossui o diretório Isso significa que para instalar lá, você precisa usar sudo. Para uma máquina de usuário único ou desenvolvedor, isso parece um uso extra desnecessário do comando

Frequentemente ouço / leio pessoas opinando / reclamando ao longo das linhas de "Eu sou o único que usa esse sistema, então não preciso usar sudoe digitar uma senha". Para os leitores que têm essa visão, e por ser relevante aqui, vamos nos lembrar de um motivo básico de segurança para que o root possua coisas.

A maioria dos arquivos de programa instalados em um sistema Ubuntu possui o modo de arquivo 755, ou em notação simbólica rwxr-xr-x, o que significa que qualquer usuário ou programa pode executá-los , mas apenas o proprietário dos arquivos, raiz, pode modificá-los. (Tecnicamente, isso também exige que ninguém, exceto o root, tenha wpermissão no diretório que os contém, para que outros usuários não possam excluí-los ou movê-los.)

Isso significa que você, o humilde usuário, pode executar qualquer programa. Se você tentar usar um programa para fazer algo que não tem permissão, como executar uma operação de gravação em um arquivo pertencente ao root, ocorrerá um erro. Isso gera erros de digitação em alguns comandos, aplicativos de bugs ou códigos maliciosos, menos propensos a atrapalhar o sistema - a menos que esteja sendo executado como root, ele não terá permissão para fazê-lo. Isso é especialmente útil ao executar programas que interagem com a Internet.

Se você chown /usr/local, qualquer programa em execução com seus privilégios poderá gravar arquivos lá, que mais tarde podem ser executados como root por algum motivo, como substituindo outro comando com o mesmo nome. /usr/local/binestá no padrão $PATHe em sudo's' secure_pathe vem antes de outros locais nos dois. Então, se eu tenho dois executáveis

/usr/local/bin/chown
/bin/chown

quando executo sudo chown ..., o chownin /usr/local/binserá executado .

Mas você provavelmente já sabia tudo isso, já que seu segundo motivo é sobre segurança:

Além disso, se você possui um software compilado localmente instalado /usr/local, o software atualmente precisa de raiz para se modificar ou instalar plug-ins. Isso parece inseguro - quero usar apenas sudoquando souber EXATAMENTE o que acontecerá.

Caso seja necessário mencionar isso aqui, é absolutamente correto (de acordo com a FHS de qualquer maneira) instalar o software compilado localmente /usr/local, mas a compilação em si deve ser feita em algum lugar do seu $HOME, sem sudo, até a última etapa quando você digita sudo make installou equivalente.

Eu acho que você está sugerindo que, executando um programa instalado /usr/localcomo seu proprietário sem privilégios, você poderia usar erros de permissão específicos lançados ao tentar se atualizar para ver se está tentando modificar algum outro local do sistema de arquivos que não seja de sua propriedade. não quero, para que você possa impedir isso.

Isso pode ser útil. A implicação é que você confia no programa para fazer o que quiser dentro /usr/local, mas não em outro lugar. Se ele solicitar permissões elevadas, você poderá recusar a atualização ou desinstalação. Isso faz algum sentido para mim. Mas acho que tentar usar /usr/localcomo um tipo de sandbox dessa maneira provavelmente não é uma boa ideia, ou pelo menos é improvável que seja a solução mais segura. Não é um local adequadamente isolado ( /opté um pouco mais isolado, pois não está no padrão $PATH). O programa pode gravar ou excluir algo /usr/localpara causar danos. Outros programas (potencialmente mal escritos) que você executa podem escrever e executar códigos que você não conhece.

Se você está preocupado em permitir que um programa se atualize com segurança, provavelmente você deve procurar alternativas (talvez específicas do programa, como no python, por exemplo, ou você pode procurar uma implementação rápida ou semelhante que atenda às suas necessidades ou usar contêineres ou uma VM para testar software potencialmente inseguro) antes de expor um local do sistema (mesmo que relativamente relativo ao usuário) para ser gravado por programas executados por um usuário normal. Isso me parece tão provável que tenha efeitos imprevisíveis quanto permitir que os programas tenham permissões temporariamente elevadas sudo.

Zanna
fonte
6

É incomum que /usr/localnão seja de propriedade de root. Mas você pode alterar o proprietário como quiser.

Mas aconselho a garantir que ele /usr/local/sbinainda seja de propriedade rootpara evitar um problema de segurança. Os comandos aqui geralmente são chamados apenas pelo root.

H.-Dirk Schmitt
fonte
2
Eu fiz uma instalação do bower anteriormente e o tutorial sugeriu chown -R $ USER / usr / local, agora estou executando chown -R root / usr / local / sbin - existem outras pastas em / usr / local ser melhor com a propriedade de root? Eu deveria ter verificado todas as permissões antes de executar o comando. Instantâneo "arrependimento ao retornar".
OnethingSimple
2
Esta resposta é insatisfatória e a explicação não está realmente correta. Se, por razões de segurança, for necessário manter os comandos que o root confia, os comandos /usr/local/binnessa raiz (e também em outros usuários) podem ser executados? Eles não precisariam pertencer à raiz? Além disso, os comandos que o root usa - incluindo comandos em - /usr/local/sbinpodem depender das bibliotecas compartilhadas em /usr/local/lib. A alteração dessas bibliotecas pode introduzir alterações arbitrárias no comportamento dos comandos que as utilizam. Insistir que apenas /usr/local/sbinpermaneça pertencente à raiz parece completamente arbitrário.
Eliah Kagan
5

Somente para o software que você precisa, use seu diretório pessoal em vez de /usr/local.

Em vez de alterar a propriedade /usr/localou ter que executar comandos como root quando não quiser, basta configurar suas construções para que sejam instaladas no diretório inicial em vez de /usr/local. Isso aborda todos os possíveis problemas com a alteração da propriedade /usr/local, incluindo como seus subdiretórios bine sbinestão no rootcaminho.

Se você precisar permitir que outros usuários executem seu software, poderá conceder acesso a eles. De fato, eles provavelmente já poderão, porque, por padrão, seu diretório pessoal tem acesso permissivo de leitura e execução . (Se você não quer isso, pode alterá-lo facilmente, apenas usando os chmodarquivos ou diretórios que deseja tornar privados e, possivelmente, também alterando o seu umask.)

Com o software instalado em seu diretório pessoal, os binários que seriam inseridos /usr/local/binserão inseridos . Você receberá outros subdiretórios do diretório inicial correspondentes aos subdiretórios dos quais o software que você instala precisa. Isso normalmente acontece automaticamente quando você instala o software a partir do código fonte./home/username/bin/usr/local

Configurando suas compilações

A maioria dos softwares que você cria a partir do código fonte possui uma etapa em que você executa:

./configure

Para a grande maioria dos softwares fornecidos com um configurescript que pode ser executado dessa maneira, o padrão é configurar a compilação para instalação interna /usr/localquando você eventualmente executar sudo make installa instalação. O motivo é que é implicitamente equivalente à execução:

./configure --prefix=/usr/local

Para configurar uma compilação para instalação em seu diretório pessoal, use isto:

./configure --prefix="$HOME"

Na prática, no Ubuntu, os caminhos do diretório inicial não contêm espaços, outros espaços em branco ou outros caracteres que serão tratados especialmente pelo shell *, portanto, a menos que você configure sua conta de usuário de maneira bastante estranha, basta digitar:

./configure --prefix=$HOME

( Porém, não recomendo o hábito de escrever scripts . Além disso, em alguns outros sistemas operacionais - como o macOS - é menos incomum que os caminhos para os diretórios pessoais dos usuários contenham espaços.)

Ou, se preferir, digite o caminho completo do diretório inicial:

./configure --prefix=/home/username

(Substitua usernamepelo seu nome de usuário real, é claro. Se, por algum motivo, seu diretório pessoal não estiver, /homeentão você precisará ajustar em conformidade.)

Instalando suas compilações

Depois de executar make, você pode estar acostumado a executar sudo make install, mas quando instala em seu próprio diretório inicial, não é necessário executá-lo como root, para que você possa - e deva - omitir sudo. Apenas corra:

make install

Da mesma forma, para software que suporta um uninstalldestino:

make uninstall

Isto é exatamente o que você estava pedindo ... apenas no seu diretório pessoal, não /usr/local.

Executando seus programas

Provavelmente, o binsubdiretório do diretório inicial é:

  • já está no seu $PATH, ou
  • estará no seu $PATHse você simplesmente sair e entrar novamente.

O motivo é que o .profilearquivo no diretório inicial, que contém comandos executados quando você faz login, contém isso por padrão para contas de usuário criadas na maioria das versões do Ubuntu (incluindo a conta de administrador inicial criada quando você instala o sistema operacional):

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Esse código é executado quando você faz login (porque está dentro .profile) e coloca seu bindiretório pessoal $PATH somente se ele existir naquele momento. É por isso que você pode precisar sair e entrar novamente.

Versões mais antigas como o Ubuntu 14.04, assim como versões mais recentes como o Ubuntu 17.10, vêm com isso. No entanto, o Ubuntu 16.04, que é provavelmente o lançamento mais popular até agora, tem o seguinte:

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

Isso simplesmente adiciona o binsubdiretório do seu diretório pessoal - assim como o .local/binsubdiretório - ao seu $PATH, sem verificar se esses diretórios realmente existem. Portanto, se você usa o 16.04, ou se atualizou de um sistema que era 16.04 quando a sua conta de usuário foi criada, o binsubdiretório do diretório inicial provavelmente já está no seu $PATH.

Seu .profilearquivo é copiado do /etc/skeldiretório quando sua conta de usuário é criada. Se sua conta de usuário foi criada em uma versão mais antiga do Ubuntu, ela recebeu essa versão .profilee não foi alterada - para sua conta de usuário - atualizando para uma versão mais recente.

Uma vez que o binsubdiretório do seu diretório pessoal esteja no seu $PATH, você poderá executar programas cujos arquivos executáveis ​​estão instalados lá apenas digitando seus nomes, assim como você faria com os programas instalados pelo gerenciador de pacotes do Ubuntu ou instalados dentro dele /usr/local.

A .localOpção

Você deve ter notado que o .profilearquivo padrão para contas de usuário criadas em algumas versões do Ubuntu, incluindo no 16.04, conforme descrito acima, não apenas adiciona $HOME/binao seu caminho, mas também $HOME/.local/bin. Se você .profilenão adicionar isso, mas quiser , basta editá-lo.

Embora geralmente seja usado para armazenar configurações e dados em cache , você também pode instalar o software dentro do .localsubdiretório do diretório inicial. Você deve se sentir desinibido ao fazê-lo, pois, do ponto de vista da usabilidade e segurança, --prefix="$HOME/.local"é semelhante a --prefix="$HOME".

Lembre-se de que os arquivos e diretórios iniciados com .não são mostrados por padrão nos navegadores gráficos (use Ctrl+ Hpara mostrar e reexibir) ou pelo lscomando (passe o sinalizador -Aou -apara mostrá-los). Pode não ser o que você deseja ou pode ser exatamente o que você deseja. Esta é uma questão de preferência pessoal.

No entanto, observei que alguns gerenciadores de pacotes automatizados baseados em fontes que criam e instalam software no diretório pessoal de alguém usam $HOME/.local. Na verdade, eu não sei o quão comum isso é - espero investigar melhor e atualizar esta resposta - mas você pode preferir usar apenas as $HOMEcoisas que compila manualmente. Dessa forma, ficará claro de onde as coisas vieram. E se houver uma colisão, é provável que o software coexista de forma aceitável.

Você também pode instalar deliberadamente algum software dentro $HOME/.locale outro software dentro $HOME. Você decide. O bindiretório que aparecer primeiro na $PATHvariável de ambiente é aquele a partir do qual um comando será executado, caso existam comandos com o mesmo nome em ambos.


Os créditos são atribuídos a Zanna e Videonauth por apontar erros em uma versão anterior desta resposta, sobre quais versões do Ubuntu possuem qual código padrão .profilee me ajudar a corrigi- los (veja também aqui ).

Eliah Kagan
fonte
0

Se o sudo for um inconveniente, basta atualizar o / etc / sudoers para que você não precise digitar sua senha ao executar o sudo. Acredito que é uma solução melhor do que mudar o proprietário de / usr / local.

notkevin
fonte
4
As senhas não são o problema - é mais a idéia de que para instalar módulos em um programa, /usr/localvocê precisa usar o sudo, o que é potencialmente perigoso.
PR3x 26/02