Qual é o mecanismo para diferenciar os requisitos raiz dos comandos do terminal?

1

No terminal, alguns comandos do sistema operacional exigem privilégios de root e outros não. Qual é o mecanismo para controlar isso? Cada comando é realmente um programa separado com suas próprias permissões de execução ou há uma tabela no Bash? (Estou correto que Bash é o shell de comando e o terminal é uma interface de usuário que passa os comandos?) Estou me referindo a comandos do sistema operacional em oposição a executar aplicativos do terminal.

    
por fixer1234 26.09.2014 / 06:12

3 respostas

2

Sim, cada aplicativo normalmente possui suas próprias permissões configuradas por meio de "bits de permissão" no aplicativo real. Você pode vê-los se usar o comando ls -l nos vários executáveis que você está tentando executar.

$ ls -l /sbin/ | grep autrace
-rwxr-x---. 1 root root     15792 Aug 24 14:40 autrace
03:03:22-slm~ $ autrace
bash: /usr/sbin/autrace: Permission denied

Mas há alguns comandos em que os "dados" que eles tentarão tocar / acessar são restritos, portanto, olhar para as permissões não é suficiente:

$ ls -l /sbin/ | grep "\bfdisk"
-rwxr-xr-x. 1 root root    230512 Apr 25 05:19 fdisk
$ fdisk -l
$

Aqui o comando é executado como meu ID de usuário, mas esse usuário não tem permissões para acessar as informações sobre os discos físicos em meu sistema e, portanto, fdisk não mostra nenhuma saída. Se eu me elevar para root usando sudo , posso ver a saída como pretendi:

$ sudo fdisk -l | head -10

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 5D1229E8-1234-1234-1234-ABCDEFG128790

Device           Start          End   Size Type
/dev/sda1         2048       411647   200M EFI System

Mecanismos que controlam isso

Não há controle centralizado, todo o controle é descentralizado e armazenado com os arquivos como permissões nos aplicativos / executáveis (como mostrei acima), ou nos arquivos de dados que essas ferramentas usarão, ou nos diretórios onde os arquivos estão contidos.

shell de comando

Sua descrição não está correta no que diz respeito ao Bash ser um shell, e o terminal ser uma interface de usuário que passa por ele. Em vez disso, o terminal é um aplicativo que é executado e, dentro dele, há um shell em execução, normalmente Bash, mas pode ser qualquer número de shells.

Por exemplo

Aqui está a saída do comando ps que mostra como os processos do meu shell atual estão estruturados:

$ ps axf | less
...
 8549 ?        Sl     0:08 /usr/libexec/gnome-terminal-server
 8552 ?        S      0:00  \_ gnome-pty-helper
10286 pts/13   Ss     0:00  \_ bash
12783 pts/13   Sl+    5:49  |   \_ vinagre
12868 pts/14   Ss     0:00  \_ bash
15742 pts/14   R+     0:00      \_ ps axf
15743 pts/14   S+     0:00      \_ less -r

Aqui você pode ver que o meu terminal, gnome-terminal , está sendo executado na parte superior e tem processos secundários abaixo dele. Esses processos filhos são 2 bash shells, onde um deles está executando um aplicativo chamado vinagre e outro está executando este comando ps que estou mostrando aqui.

Restrições adicionais

O que descrevi acima é a base de como os executáveis podem ser usados pelos usuários no sistema. Mas estes são apenas o básico. Além destes, existem tecnologias adicionais, como ACL (Access Control Lists) e políticas de controle de acesso para os vários executivos.

As ACLs são bem diretas, oferecendo aos usuários fora do modelo tradicional de proprietário, grupo e outros, um controle mais granular.

Ferramentas como o SELinux e o AppArmor usam essa mesma abordagem, mas introduzem no nível do Kernel do Linux a capacidade de implementar regras que restrinjam como o aplicativo X pode interagir com o sistema como um todo. Por exemplo, se você estiver executando um servidor Samba, este aplicativo precisaria ter acesso ao seu sistema de arquivos fora das áreas normais que normalmente operariam. Você teria que adicionar políticas extras para permitir isso.

trecho da página man do SELinux

NSA Security-Enhanced Linux (SELinux) is an implementation of a flexible mandatory access control architecture in the Linux operating system. The SELinux architecture provides general support for the enforcement of many kinds of mandatory access control policies, including those based on the concepts of Type Enforcement®, Role- Based Access Control, and Multi-Level Security. Background information and technical documentation about SELinux can be found at http://www.nsa.gov/research/selinux.

Comando faz parte de quê?

Se você está confuso se um aplicativo é um arquivo real no sistema, ou se é algo mais, você pode usar o comando type para determinar isso.

$ type pwd
pwd is a shell builtin

$ type fdisk
fdisk is /usr/sbin/fdisk

Portanto, nos exemplos acima, pwd está embutido no Bash, enquanto fdisk é um arquivo real que reside em /usr/sbin/fdisk .

OBSERVAÇÃO: Para qualquer coisa que esteja incorporada, eles são governados pelas permissões do shell Bash do qual eles estão sendo invocados!

    
por 26.09.2014 / 09:13
1

Basicamente, os programas de aplicativos na maior parte determinam se o acesso root é necessário. Isso é feito geralmente de duas maneiras: (1) uma verificação explícita na codificação, ou (2) uso de arquivos, diretórios ou outros arquivos especiais que requerem acesso root e falhariam de outra forma.

Não há controle central sobre isso.

    
por 26.09.2014 / 08:14
1

Existem várias coisas para impedir que os usuários executem comandos:

  1. Permissões de arquivo

    Você pode verificá-los com ls -l <file> , na forma de algo como "rwxr-xrw-", que define o proprietário, o grupo e as permissões de outros usuários para esse arquivo, sendo leitura, gravação e execução.

  2. Lista de controle de acesso

    Se o dispositivo montado tiver o acl ativado, você poderá obter suas propriedades com getfacl e verificar as mesmas permissões acima ou uma restrição para usuários diferentes. Um exemplo:

    [root]# getfacl <file>

    # file: <file>

    # owner: <owner>

    # group: <group>

    user::rw-

    user:<different_user>:rwx

    group::r-

    mask::rwx

    other::r-

  3. As variáveis de ambiente

    A variável PATH define uma lista de diretórios onde o bash irá procurar por comandos. Você pode verificar seu conteúdo com echo $PATH .

  4. SElinux

    O SElinux é outra maneira de conseguir isso. Você pode verificar as autorizações do SElinux com ls -Z <file> .

Estes são apenas alguns exemplos, espero que ajude.

    
por 26.09.2014 / 09:12