Sudo vs raiz; alguma diferença real?

44

Estou trabalhando com um membro de suporte de um produto, e ele insiste que eu preciso ser root para instalar uma série de patches e que o sudo não funcionará; ele não fornece uma razão, mas parece muito firme em suas crenças. Navegando no Superusuário Não consigo determinar nenhuma razão possível para esse ser o caso e, na confirmação, quando executo:

sudo -l

Eu recebo:

...
User [MY USERNAME] may run the following commands on this host:
    (ALL) ALL

Obter acesso da equipe Linux / servidor para realmente ser root não é um processo imediato, pelo que entendi; portanto, prefiro instalá-los pessoalmente.

Existe alguma razão prática para o sudo se comportar de maneira diferente do root para instalar o software em um servidor?

guarda
fonte
2
Eu acho que você deveria jogar de volta nele. Como outros mostraram, existem inúmeras maneiras de ganhar raiz usando o sudo e, se ele não puder fornecer uma razão concreta para o porquê de o sudo ser insuficiente, ele não terá pernas para se sustentar.
Garrett
1
O ambiente e os subcomandos vêm à mente. Acho que Hastur fez um bom trabalho com o ambiente, e Jayen fez um bom trabalho com subcomandos, canalização e redirecionamento.
JWW
2
Garrett tem um bom argumento, mas antes de entrar em um concurso de mijar em potencial, perguntaria ao membro de suporte: você já tentou as duas coisas e falhou em uma dessas maneiras? Ele pode estar no caminho da falha sudoe dos scripts conforme os scripts estão atualmente escritos. Se for esse o caso, então resposta sds poderia ser mais útil para você: sudo su -.
JWW

Respostas:

34

Depende fortemente de como você chama seu programa com sudoou su.
Por exemplo, no sistema em que estou neste momento:

                  .bashrc                        
    COMMAND        $HOME   $USER  Env.  $PATH
 1. sudo -i        (root)   root  root  [1]
 2. sudo -s        (USER)   root  USER  /home/${USER}/bin:[1]
 3. sudo /bin/bash (USER)   root  USER  /home/${USER}/bin:[1]  
 4. sudo su        (root)   root  USER  [1]:/usr/games:/usr/local/games  
 5. sudo su -      (root)   root  root  [1] 

Onde [1] = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin
Env = As variáveis ​​de ambiente são redefinidas para 1 e 5, extraídas de $ USER em 2,3,4

Assim, um script ou um programa que é lançado com uma opção diferente pode ver diferente $PATH, $HOME, sua concha pode ler diferentes .bashrc, .profilee variáveis de ambiente. Ele lê o arquivo relacionado ao $HOME. Cada usuário pode modificar seu ambiente de uma maneira diferente (variáveis $PATH, .bashrc, .profile, .bash_profile, alias ...). Em particular, um usuário pode ter uma ordem diferente dos diretórios nos seus $PATHe, como conseqüência, um script pode executar um comando, por exemplo, em /home/$USER/binvez daquele no caminho esperado a partir da raiz.

Você pode executar o programa sudo -icomo estava logado como root su -, mas pode ter um comportamento diferente se executá-lo com sudo MyCommandou com su -c MyCommand.


De man su:

Na parte da descrição:
O ambiente atual é passado para o novo shell . O valor de $ PATH é redefinido para / bin: / usr / bin para usuários normais ou / sbin: / bin: / usr / sbin: / usr / bin para o superusuário
...
Na parte de opções:
- , -l , --login
Forneça um ambiente semelhante ao que o usuário esperaria se o usuário estivesse conectado diretamente .

Do homem sudo

-i , --login
Execute o shell especificado pela entrada do banco de dados de senhas do usuário de destino como um shell de logon. Isso significa que os arquivos de recursos específicos de login, como .profile ou .login, serão lidos pelo shell. Se um comando for especificado, ele será passado para o shell para execução através da opção -c do shell. Se nenhum comando for especificado, um shell interativo será executado. sudotenta mudar para o diretório inicial desse usuário antes de executar o shell. O comando é executado com um ambiente semelhante ao que um usuário receberia ao efetuar login . A seção Ambiente de Comando no manual sudoers (5) documenta como a opção -i afeta o ambiente em que um comando é executado quando a política de sudoers está em uso.

Hastur
fonte
Ótima resposta. Eu ainda sou um novato no Linux, mas há outra diferença de que o que você pode fazer usando sudopode ser limitado por permissões no arquivo sudoers x fazer coisas como o root não tem essas limitações? A última citação em bloco talvez implique isso, mas se eu entendi corretamente, parece outra diferença substancial além do ambiente (ou talvez por causa do ambiente?).
fixer1234
23

Se você tiver sudoacesso total , poderá rootusar sudo su -, para que o ponto de segurança seja discutível.

De fato, há uma maneira de discernir a diferença entre um programa executado como roote um programa executado sob sudo- usando getuidvs geteuid- mas esse é um truque artificial. Por que um sistema de patch faria isso?

sds
fonte
5
Por falar nisso su -, ele pode querer usar sudo -ipara que ele tenha o mesmo ambiente de quando efetuar login diretamente.
Cristian Ciupitu
2
Se você rodar com, por exemplo sudo myscript, manterá $ PATH e variáveis ​​de ambiente do shell em que está. Se você executar com sudo -i myscriptvocê, execute como se efetuasse login como root. Veja a resposta com nosso _zoo de chamadas :-) _
Hastur
1
Eu acho que é importante ressaltar que as variáveis ambientais não pode ser configurado o mesmo sob sudoa exploração madeireira como root
secretformula
1
@dmanexe: sudo não significa superusuário, é "alternar entre usuário". su e sudo podem ser usados ​​para alternar para qualquer usuário, e não apenas para o superusuário. Além disso, não há nada de pseudo sobre o sudo, você realmente obtém a raiz real ao executar o sudo e não alguma coisa falsa. Note que a magia do sudo realmente vem do bit de permissão setuid.
Lie Ryan
2
sds, @CharlesDuffy: A idéia de que sudo e su causam geteuid()e getuid()são diferentes um do outro é um mito. su e sudo alteram os IDs de usuário reais e efetivos para os do usuário de destino antes de executar o comando ou shell especificado, exceto na situação muito incomum em que você os configurou explicitamente para se comportar de outra maneira. Você pode verificar isso (para sudo) executando sudo id -ue sudo id -ru(ambos mostram 0), lendo sudo (8) (em COMMAND EXECUTION ) ou escrevendo um programa de teste .
7

Existem algumas diferenças se você estiver obtendo um shell raiz, como apontado por @Hastur.

Se você não está obtendo um shell raiz, há mais diferenças. O membro do suporte pode ter experiência tentando fazer coisas como sudo patch -p0 < /root/patch.fileonde patché executado como raiz, mas <(canalizar a partir de um arquivo) não é.

Jayen
fonte
1
Certo: o ponto de vista prático geralmente oferece dicas mais difíceis de identificar apenas nas páginas de manual. Para superar uma situação semelhante, você é forçado a fazer mais ginástica [:-)], por exemplo, escreva algo parecido sudo /bin/bash -c "./patch -p0 < /root/patch". Ainda mais delicado é o caso quando você usa o redirecionamento para criar um arquivo >. Na primeira maneira, você criará um arquivo que pertence ao usuário apenas se você tiver o direito suficiente de escrever no diretório final. Na última forma, você irá criar um arquivo de propriedade do root ... o lado escuro do Unix ;-)
Hastur
1

Eu acredito que ao usar o acesso sudo, um arquivo de log é criado, no entanto, quando executado diretamente através do acesso root, não existe.

Ashley Redman BSc
fonte
0

Depende de quão granular você deseja que o acesso root seja. Se você tiver vários usuários que executam tarefas diferentes em um sistema, o sudo seria mais ideal. Um exemplo que uso com freqüência é a necessidade de reiniciar um aplicativo ou banco de dados. Sempre é melhor fazer a segurança menos privilegiada. Eu uso grupos e só permito que esses grupos executem ações explícitas. Um bom livro que descreve esse processo é "Domínio do Sudo: controle de acesso do usuário para pessoas reais". Na verdade, é um bom livro sobre sudo em geral ...

meredithkm
fonte