Execute como root. Usando sudo no Ubuntu para iniciantes

03.05.2023

O comando sudo é muito importante para gerenciar direitos de acesso em sistema operacional Linux. Graças a este pequeno comando, você pode conceder permissões para realizar determinadas ações em nome do administrador a outros usuários, sem fornecer a eles a própria senha de superusuário. Além disso, você não precisa ficar sempre sentado conta superusuário para ocasionalmente executar ações administrativas.

Parece que uma equipe tão pequena, com um mínimo de capacidades e o uso mais simples possível, mas na verdade pode fazer muito mais. Neste artigo, veremos como o sudo é configurado no Linux para controlar o acesso às funções do sistema e aos recursos do usuário.

Antes de prosseguirmos com a configuração do acesso ao utilitário sudo, vamos ver como ele funciona. Existem duas maneiras de obter direitos de administrador no Linux. Você pode mudar para o usuário root usando o comando su ou pode passar o parâmetro o comando certo o utilitário sudo, que o executará com direitos de administrador. Além disso, o segundo método é preferível, porque você não esquecerá o que está usando e não fará nada desnecessário.

O nome da equipe significa usuário substituto faz ou superusuário faz. O utilitário permite que você execute programas como outro usuário, mas na maioria das vezes como usuário root. O utilitário foi desenvolvido em 1980 por Bob Cogshell e Cliff Spencer. Durante esse período, muitos desenvolvedores mudaram e muitos recursos foram adicionados.

sudo funciona graças ao sinalizador de acesso SUID. Se este sinalizador for definido para um programa, ele será executado não em nome do usuário que o iniciou, mas em nome do proprietário, visto que o arquivo pertence ao sudo, então o utilitário é executado como root. Em seguida, ele lê suas configurações, solicita a senha do usuário e decide se o usuário pode executar comandos como administrador. Se sim, então o comando passado no parâmetro é executado.

Agora que você conhece a teoria, vamos ver como configurar o sudo no Linux.

Configurando o sudo no Linux

Todas as configurações do sudo estão localizadas no arquivo /etc/sudores. Aqui você pode configurar vários parâmetros, começando por quem terá permissão para executar comandos em nome do superusuário e terminando com a limitação do conjunto de comandos disponíveis.

Para abrir um arquivo para edição, digite o seguinte comando como superusuário:

Você também pode especificar o editor de texto no qual deseja editar o arquivo de configuração:

EDITOR=nano visual

A seguir veremos as configurações mais interessantes que você pode definir neste arquivo. Mas primeiro, vamos dar uma olhada na sintaxe básica do arquivo. É composto por dois tipos de strings, são aliases que permitem criar listas de usuários e flags, bem como as próprias regras, que especificam como o comando sudo se comportará. A sintaxe do alias é semelhante a esta:

digite alias_name = elemento1, elemento2, elemento3

O tipo especifica que tipo de Alice deve ser criada, o nome é o nome que será utilizado e a lista de elementos especifica os elementos que estarão implícitos ao se referir a este nome.

A descrição das permissões do usuário tem uma sintaxe ligeiramente diferente:

host do usuário = (outro_usuário:grupo) equipes

O usuário especifica o usuário ou grupo para o qual estamos criando a regra, o host é o computador ao qual esta regra se aplicará. Outro usuário - sob o disfarce de qual usuário o primeiro pode executar comandos e o último pode executar comandos permitidos. Um alias pode ser usado em vez de qualquer um dos parâmetros. E agora configurando o sudo no Debian e outras distribuições.

Parâmetros básicos

O alias Padrões permite especificar parâmetros padrão para que o utilitário funcione, iremos considerá-los nesta seção. Esse alias começa com a palavra Defaults, seguida pelo nome da bandeira. Se houver um símbolo ! na frente do nome, isso significa que o sinalizador precisa ser ativado; caso contrário, desative-o:

Desative a introdução na primeira vez que usá-la:

Padrões! palestra

O superusuário não pode fazer sudo:

Padrões !root_sudo

Agora, se você tentar executar o sudo sudo, nada funcionará:

Altere o diretório inicial do usuário de destino, deixando a pasta do usuário atual como o diretório inicial por padrão:

Padrões set_home

Salve a lista de grupos do usuário atual:

Padrões !preserve_groups

Solicite a senha do superusuário em vez da senha do usuário:

Defina o número de tentativas de senha antes que o sudo seja encerrado, o padrão é 3:

Padrões passwd_tries=5

O número de minutos que se passarão antes que o sudo solicite uma senha novamente é 5 por padrão. Se você definir o valor como 0, ele sempre solicitará uma senha, não importa há quanto tempo você usou o utilitário:

Padrões timestamp_timeout=10

O parâmetro a seguir especifica o número de minutos que o sudo aguardará até que uma senha seja digitada novamente se ela for digitada incorretamente:

Padrões passwd_timeout=10

Você pode alterar a mensagem exibida quando uma senha for solicitada:

Padrão passprompt="Sua senha:"

Você pode especificar outro usuário, não root, a partir do qual todos os comandos serão executados, para este uso:

Padrões runas_default = "usuário"

Você pode registrar todas as tentativas de conexão ao sudo:

Arquivo de log padrão=/var/log/sudo

Em seguida, tentamos verificar o funcionamento do log:

sudo gato /var/log/sudo

Essas foram todas as configurações de sudo mais interessantes que você pode precisar. A seguir, veremos como definir direitos de acesso de sudo para usuários.

Configurando usuários sudo

Já discutimos acima a sintaxe para configurar ações para usuários aqui tudo é mais complicado do que com aliases, mas você pode descobrir; Por exemplo, vamos permitir que qualquer usuário use sudo, de qualquer host, e execute qualquer comando:

TODOS TODOS = (TODOS) TODOS

Uma equipe assim é muito insegura; permite tudo e todos. O primeiro ALL é permitir todos os usuários, o segundo ALL é para todos os hosts, o terceiro ALL é permitir o login como qualquer usuário e o quarto é permitir que qualquer comando seja executado. Mas outra construção é usada com muito mais frequência:

% roda TODOS = (TODOS) TODOS

Significa o mesmo que o anterior, só que aqui não permitimos que todos os usuários utilizem o sudo, mas apenas aqueles que são membros do grupo wheel.

% roda TODOS = (raiz) TODOS

Aqui já limitamos a escolha possível de usuários apenas ao usuário root. Você também pode especificar o grupo de usuários em nome do qual ele pode executar comandos:

% roda TODOS = (root:admins) TODOS

Isso significa que você pode executar o comando como root ou outro usuário do grupo admins. Também podemos especificar comandos que o usuário pode executar. Por exemplo:

% roda ALL = (raiz) /bin/mount, /bin/umount

O usuário só pode executar os comandos mount e umount como superusuário. Agora vamos deixar ainda mais interessante, o usuário pode executar mount e umount sem senha, e todos os demais comandos com senha:

% roda TODOS = (raiz) TODOS
% roda ALL = (raiz) NOPASSWD: /bin/mount, /bin/umount

Você também pode restringir usuários por host, por exemplo, permitimos o uso do sudo apenas do host1:

% roda host1 = (raiz) TODOS

Resta considerar como usar aliases. Os aliases podem ser dos seguintes tipos:

  • Usuário_Alias- alias dos usuários que utilizarão o sudo;
  • Runas_Alias- alias dos usuários em cujo nome os comandos serão executados;
  • Host_Alias- apelido do host;
  • Cmnd_Alias- apelido de comando;

Por exemplo, vamos criar quatro aliases e usá-los em nossa regra:

Usuário_Alias ​​​​Usuários = usuário1,usuário2,usuário3
Runas_Alias ​​​​Admins = root,admin
Host_Alias ​​​​Hosts = host1,host2
Cmd_Alias ​​​​Cmds = /bin/montar,/bin/umount

Hosts de usuários = (administradores) Cmds

Isso significa que os usuários da lista Usuários poderão executar comandos Cmds em nome dos usuários Amdins em hosts Hosts.

Ainda restam algumas palavras a dizer sobre as bandeiras. O sinalizador NOPASSWD informa para não solicitar uma senha ao executar esta regra. Por exemplo, para permitir que todos os usuários executem o comando mount com sudo sem senha:

TODOS TODOS = (raiz) NOPASSWD: /bin/mount

Você também pode impedir que este comando específico seja executado usando o sinalizador NOEXEC:

ALL ALL = (raiz) NOEXEC /bin/mount

Você pode verificar se o arquivo /etc/sudores foi configurado corretamente e ver todas as regras criadas usando o comando:

Todos os sinalizadores e configurações instaladas são exibidos aqui, bem como as permissões deste usuário.

Conclusões

Neste artigo, vimos como configurar o sudo no Linux. Como você pode ver, apesar de ser um utilitário muito simples, ele esconde muitas configurações úteis que você pode usar em seu sistema. Se você tiver alguma dúvida, pergunte nos comentários!

Um pouco sobre o próprio sudo, da Wikipedia. sudo(Inglês) superusuário faz , literalmente “atuar em nome de superusuário") é um programa desenvolvido para ajudar administrador do sistema e permitindo delegar determinados recursos privilegiados aos usuários enquanto mantém um registro de trabalho. A ideia principal é conceder aos usuários o mínimo de direitos possível, mas ao mesmo tempo exatamente tantos quantos forem necessários para resolver as tarefas atribuídas.

O comando sudo permite que os usuários executem comandos como root ou outros usuários. As regras que o sudo usa para decidir se deve conceder acesso estão no arquivo /etc/sudoers; A linguagem de sua escrita e exemplos de uso são descritos detalhadamente em sudoers(5).

Para editar o arquivo /etc/sudoers, você deve utilizar o programa visudo, que verifica a sintaxe e assim evita erros nas regras.

Na maioria dos casos, a configuração adequada do sudo torna desnecessária a execução como superusuário.

Por padrão, a conta root no Ubuntu está desabilitada e o root simplesmente não tem uma senha. Todas as tarefas administrativas são realizadas via sudo. Por padrão, o direito de executar o sudo é concedido ao primeiro usuário criado durante a instalação. Todos os outros são usuários regulares por padrão.

Sudo é uma ferramenta muito flexível que permite configurar direitos para realizar ações administrativas para cada usuário separadamente. Por exemplo, permita que alguém reinicie um servidor e dê a outro a capacidade de alterar os direitos de acesso a arquivos e pastas. Abra o arquivo /etc/sudoers. Isso pode ser feito emitindo um comando para abrir o arquivo em seu favorito editor de texto, por exemplo assim:

# nano /etc/sudoers

ou usando o utilitário visudo:
#visudo

O último método abrirá o arquivo /etc/sudoers no editor padrão do usuário ou, se nenhum for especificado, no editor vi. Vantagem este métodoé que ao salvar o arquivo será verificada a conformidade com a sintaxe.

A configuração mais simples é assim:

Padrões env_reset

#Especificação de privilégio do usuário
raiz TODOS=(TODOS) TODOS
usuário TODOS=(TODOS) TODOS

Esta configuração concede ao usuário todos os direitos do usuário root ao executar o comando sudo. Padrões env_reset desativa completamente todas as variáveis ​​do usuário ao executar comandos como root. Isto é bom do ponto de vista da segurança, mas às vezes causa problemas. Você pode permitir que variáveis ​​privadas sejam usadas por um grupo ou indivíduo adicionando uma linha como esta:
Padrões:%admin!env_reset

que salvará variáveis ​​de ambiente para todos os usuários do grupo admin, ou:
Padrões: usuário env_keep = TZ

que salvará a variável TZ para o usuário do usuário.

Se o servidor for administrado por um grupo de pessoas, faz sentido fazer o seguinte:
%admin TODOS=(TODOS) TODOS

Como você pode imaginar, esta entrada dá acesso root a todos os membros do grupo admin.

Você pode configurar cada usuário específico para ter acesso apenas a comandos específicos. Por exemplo:
usuário ALL = /bin/mount, /bin/kill

dará ao usuário direitos para executar comandos mount e kill em qualquer máquina e:
usuário2 meudebiancomp = /sbin/modprobe

dará ao usuário2 permissões para executar o modprobe do mydebiancomp. Acho que a sintaxe é clara:
host do usuário = comando

onde o comando é escrito com o caminho completo. Para um grupo tudo é semelhante, apenas o sinal “%” é adicionado.

III.Configurações avançadas do sudo.

É muito conveniente criar um grupo de aliases ao configurar o sudo. Para evitar a repetição constante de comandos, usuários e hosts, podemos reuni-los em grupos e definir regras para cada grupo de aliases. Por exemplo assim:

Cmnd_Alias ​​​​command_alias = comando1, comando2, ... // aliases de comando
Host_Alias ​​​​host_alias = hostname1, hostname2, ... // aliases de host
User_Alias ​​​​user_alias = user1, user2, ... // aliases de usuário

Também é possível executar um comando em nome de outro usuário. Por exemplo, com esta entrada:
usuário ALL = (usuário2, usuário3) /usr/bin/ark

usuário usuário pode executar o comando ark como usuário2 ou usuário3, usando a tecla u, assim:
$ sudo -u usuário2 arca

Por padrão, o sudo lembra as senhas por 5 minutos. Se você não quiser isso, poderá definir uma regra separada para cada usuário, grupo ou alias, por exemplo, quando:
Padrões:user timestamp_timeout=0

A senha do usuário não será lembrada, mas se:
Padrões:user timestamp_timeout=-1

será lembrado durante todo o tempo de atividade.

Sudo sem senha também é possível. Existe um design semelhante para isso:
usuário myubuntucomp = NOPASSWD: /bin/kill

o que permitirá que o usuário user do host myubuntucomp use kill sem solicitar uma senha. Insira seus próprios valores, como ALL em vez do nome do host e do comando, para que o usuário nunca possa inserir uma senha para executar comandos como root de qualquer host, mas lembre-se que isso torna o sistema muito vulnerável.

Guarda

Blogs, blogs, blogs. Maxim Fuckin sabe muito sobre isso.

Mapa interativo da cidade de Orenburg. Feito com tecnologia Mapas do Google usando nossos próprios desenvolvimentos. O recurso é jovem, mas já bastante interessante e útil.

Às vezes, você só precisa executar um comando de outro usuário. E há várias maneiras de fazer isso. Falarei sobre eles no meu artigo “Executar um comando como outro usuário no Unix/Linux”.

Execute um comando como outro usuário no Unix/Linux - método 1

E então, você pode usar Utilitário SUDO. Vejamos um exemplo:

$ sudo -H -u Your_another_user -c "site de ping"

Explicações:

  • -H YOUR_HOME: Define HOME (variável de ambiente para a casa de um usuário específico) e por padrão é root.
  • -u YOUR_USER: Especifique o usuário de quem o comando será executado.
  • -c YOUR_COMMAND: Serve como uma opção para inserir um comando.

Algo assim.

Execute um comando como outro usuário no Unix/Linux - método 2

Você pode usar o utilitário SU. E agora vou dar alguns exemplos.

Faça login como usuário root

Para obter root, execute:

$su -raiz

Execute o comando como usuário root

Aqui está um exemplo de comando:

# su - root -c "SEU_COMMAND_HERE"

Su - -c "SEU_COMMAND_HERE arg1"

Execute um comando de outro usuário usando su

Então, aqui está um exemplo:

# su -c "/opt/solr/bin/solr create -c test_solr_core -n solrconfig.xml" -s /bin/sh solr Criado novo núcleo "test_solr_core"

Vejamos outro exemplo:

$ su another_user -c "ping site"

$su -SEU_USER -c "SEU_COMANDO_AQUI"

  • — — Simulará o login do usuário especificado.
  • -c - Usado para especificar o comando a ser executado (para o usuário especificado).

Algo assim.

Execute um comando como outro usuário no Unix/Linux - método 3

E assim, você pode usar o utilitário runuser. O comando runuser inicia um shell com IDs de usuário e grupo substitutos. Este comando só é útil quando você está logado como usuário root. A sintaxe é a seguinte:

# runuser -l SEU_USER -c "SEU_COMMAND_HERE"

Como exemplo, mostrarei a seguinte linha:

# runuser -l nginx -c "serviço nginx start"

PS: O comando runuser não requer senha e só deve ser executado pelo usuário root.

Principais opções:

  • -l: Crie um shell de login usando o arquivo PAM runuser-l em vez do arquivo padrão.
  • -g: Aponta para o grupo principal.
  • -G: Indica um grupo adicional.
  • -c: Na verdade, é usado para especificar um comando.
  • –session-command=COMMAND: Passa um único comando para o shell com a opção “-c” e não cria uma nova sessão.
  • -m: Não redefina variáveis ​​de ambiente(ENV).

Pronto, o tópico “Executar um comando como outro usuário no Unix/Linux” está completo.

Desde os tempos antigos, muitos ficam confusos com a variedade de opções de segurança ao realizar operações com privilégios máximos. Por exemplo, no documento oficial Documentação do Ubuntué recomendado usar algo como sudo nano como comando de edição, e em vários manuais amadores (no estilo de “5 truques em linha de comando, o que surpreenderá sua avó") para obter um shell de root, sugere-se escrever sudo su -. Tentarei explicar por que esse estado de coisas me parece errado.

Historicamente o único de uma forma universal executar um comando como outro usuário no Unix, havia um programa chamado su. Lançado sem parâmetros, ele solicitou a senha do superusuário e, se tiver sucesso, simplesmente substituiu o nome de usuário atual por root, deixando quase todas as variáveis ​​de ambiente do usuário antigo (exceto PATH, USER e mais algumas, veja man su da sua distribuição ). Seria mais correto executá-lo como su - nesse caso o shell também receberia o ambiente correto. Com a opção -c você pode executar o comando: su -c "vim /etc/fstab" .

Nesse caso, os usuários confiáveis ​​​​tinham que lembrar a senha do root, e todos os usuários listados no grupo "wheel" (ou seja, no grupo cujos membros poderiam executar o comando su e se tornar um superusuário) tinham o mesmo acesso irrestrito a todo o sistema, o que representava um sério problema de segurança.

Então surgiu o comando sudo e foi um avanço. Agora o administrador pode especificar uma lista de comandos permitidos para cada usuário (ou grupo de usuários), arquivos disponíveis para edição, variáveis ​​de ambiente especiais e muito mais (toda essa beleza é controlada a partir de /etc/sudoers, veja man sudoers da sua distribuição) . Quando iniciado, o sudo pede ao usuário sua própria senha, não a senha do root. Um shell completo pode ser obtido usando “sudo -i”

Vale a pena mencionar especialmente equipe especial sudoedit, que inicia com segurança o editor especificado em variável de ambiente$EDITOR. Com um esquema mais tradicional, a edição dos arquivos era feita mais ou menos assim:
sudo vi /etc/fstab

Lançado desta forma, o vi herdou o shell com direitos irrestritos e através de:! o usuário poderia executar qualquer comando (a menos, é claro, que o administrador cuidasse disso com antecedência) e abrir qualquer arquivo.

Sudoedit verifica se este usuário pode editar este arquivo, copia o arquivo especificado para um diretório temporário, abre-o em um editor (que herda os direitos do usuário, não do root) e, após a edição, se o arquivo tiver sido alterado, copia-o de volta com precauções especiais.

Nas distribuições baseadas em Debian, o usuário root não possui uma senha, todas as ações administrativas devem ser realizadas através do sudo ou seu equivalente gráfico gksudo; Sendo um substituto completo para su , sudo deveria ser o único comando para alternar entre usuários, porém, como foi dito no início, no momento este não é o caso e por algum motivo todo mundo está inventando sequências selvagens de sudo, su, vi e traços.

Portanto, sugiro que todos se lembrem de uma vez por todas:

Após a primeira publicação desta nota, várias perguntas me foram feitas. A partir das respostas conseguimos fazer um mini-FAQ.

P: Como posso usar o sudo para fazer su -c "echo 1 > /etc/privileged_file" ? sudo echo 1 /etc/privileged_file reclama de “permissão negada”
R: Isso acontece porque apenas o comando echo é executado com direitos elevados e o resultado é redirecionado para o arquivo com direitos de usuário normais. Para adicionar algo ao arquivo_privilegiado, você precisa executar o seguinte comando:
$ eco 1| sudo tee -a arquivo_privilegiado >/dev/null
Ou torne-se temporariamente um root:
$ sudo -i # echo 1 > arquivo_privilegiado # sair $
P: sudo -i é mais longo que su - , mas parece não haver diferença entre eles, por que imprimir mais?
R: sudo tem várias vantagens que valem a pena digitar alguns caracteres extras:

  • por padrão, sudo registra todas as atividades do usuário no canal syslog authpriv (como regra, o resultado é colocado no arquivo /var/log/auth.log), e em su um recurso semelhante deve ser habilitado definindo um parâmetro especial em o arquivo de configurações, que varia de distribuição para distribuição (SULOG_FILE em /etc/login.defs em UbuntuLinux, /etc/login.conf e /etc/pam.d/su no FreeBSD, etc.)
  • no caso do su, o administrador do sistema não pode restringir os comandos executados pelos usuários, mas no sudo ele pode
  • se o usuário for privado de direitos administrativos, no caso de su, após removê-lo do grupo wheel, ele deverá esquecer a senha de root se for utilizado sudo, basta removê-lo do grupo correspondente (por exemplo, wheel ou admin) e/ou o arquivo sudoers, se tiver sido personalizado posteriormente.
P: Sou o único usuário em meu sistema e estou acostumado com o su, por que preciso do sudo?
R: Responderei a pergunta com uma pergunta: se existe o sudo correto, por que usar o su desatualizado?