O que é um processo GID e a que finalidade ele serve?

6

Lendo a documentação do mod_wsgi, descobri que você pode escolher em qual grupo executar os processos de trabalho.

Eu posso entender a propriedade do grupo de arquivos e como apenas um usuário que pertence a esse grupo pode obter as permissões de grupo desse arquivo, mas não entendo como isso se aplica aos processos em execução.

Então, o que é um processo GID e a que finalidade ele serve?

    
por Alicia 22.05.2013 / 01:35

3 respostas

7

Isso se resume ao que compõe um processo no Unix. Um processo pode vir a existir de duas maneiras. Por meio da função fork() ou através de uma das funções exec() em C.

fork()

fork() basicamente faz apenas uma cópia do processo atual, mas atribui a ele um novo ID de processo (PID). É um filho do processo original. Você pode ver esse relacionamento na saída de ps :

$ ps axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1  5255  1964  1964 ?           -1 Sl     500   0:39 gnome-terminal
 5255  5259  1964  1964 ?           -1 S      500   0:00  \_ gnome-pty-helper
 5255 18422 18422 18422 pts/1    18422 Ss+    500   0:01  \_ bash
 5255 30473 30473 30473 pts/4    30473 Ss+    500   0:00  \_ bash
30473   782   782 30473 pts/4    30473 Sl     500   1:14  |   \_ evince s.pdf

Aqui você pode ver que gnome-terminal é o processo pai (PID = 5255) e que bash é filho (PID = 18422, PPID = 5255).

OBSERVAÇÃO: PPID = ID do processo pai.

Quando um processo se bifurca em seu pai, ele "herda" certas coisas, como cópias de todos os descritores de arquivos que o pai possui atualmente para arquivos abertos e os IDs de usuário e grupo do pai.

OBSERVAÇÃO: Os últimos 2 são o que identifica quais permissões de arquivo e grupo este processo terá ao acessar o sistema de arquivos.

Portanto, se um processo herdar seu ID de usuário e grupo de seu pai, por que tudo não é de propriedade de root ou de um único usuário? É aqui que entra o exec() .

exec() parte # 1

A família de funções exec() , especificamente execve() , "substitui" uma imagem de processo atual por uma nova imagem de processo. A terminologia "process image" é na verdade apenas um arquivo, ou seja, um executável no disco. Então é assim que um script bash pode executar um programa como /usr/bin/time .

Então, e o ID do usuário e o ID do grupo? Bem, para entender que vamos primeiro discutir o conceito de "Persona".

Persona

A qualquer momento, cada processo tem um ID de usuário efetivo, um ID de grupo efetivo e um conjunto de IDs de grupo suplementares. Esses IDs determinam os privilégios do processo. Eles são chamados coletivamente de persona do processo , porque determinam "quem é" para fins de controle de acesso.

exec() parte # 2

Então, além de poder trocar a "imagem do processo", exec() também pode alterar o usuário & IDs de grupo dos originais "reais" para os "efetivos".

Um exemplo

Para esta demonstração, mostrarei o que acontece quando iniciamos em um shell como nosso UID / GID padrão e, em seguida, geramos um shell filho usando um dos meus GIDs suplementares, tornando-o o GID efetivo do shell filho.

Para realizar isso, usarei o comando unix newgrp . newgrp permite que você crie um novo shell passando-o ao grupo suplementar que gostaria de tornar meu GID efetivo.

Para começar:

$ id -a
uid=500(saml) gid=501(saml) groups=501(saml),502(vboxusers),503(jupiter)

Podemos ver que este shell está atualmente configurado com meu UID / GID padrão de saml & %código%. Tocar em alguns arquivos mostra que esse também é o caso:

$ touch afile1
$ touch afile2
$ ls -l
total 0
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile2

Agora, transformamos nosso grupo suplementar em saml no GID efetivo:

$ newgrp jupiter
$ id -a
uid=500(saml) gid=503(jupiter) groups=501(saml),502(vboxusers),503(jupiter)

Agora, se tocarmos em alguns arquivos:

$ touch afile3
$ touch afile4
$ ls -l
total 0
-rw-rw-r-- 1 saml saml    0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml    0 May 21 23:47 afile2
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile3
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile4

Vemos que o GID efetivo do shell é jupiter , portanto, qualquer interação com o disco resultará na criação de arquivos com jupiter em vez do meu grupo padrão normal de jupiter .

Referências

por 22.05.2013 / 05:51
1

Os usuários não acessam arquivos (eles apenas digitam e movem e clicam no mouse). Apenas processos podem acessar arquivos. O usuário inicia um processo e esse processo possui os direitos associados a esse usuário (incluindo seu grupo primário e seus grupos suplementares).

    
por 22.05.2013 / 01:41
1

As permissões de um processo são baseadas nos atributos do processo. Não é baseado diretamente nas entradas em /etc/passwd e /etc/group . Esses arquivos são lidos apenas quando um usuário efetua login; eles determinam o uid e gid (s) em que o processo inicial da sessão é executado. Processos subseqüentes na mesma sessão (filhos ou mais geralmente descendentes desse processo inicial) herdam esses uid e gid (s) (exceto para setuid / programas setgid ).

Na maior parte, os gids de um processo determinam quais arquivos esse processo pode acessar. Se o fluxo do processo for o proprietário do arquivo, as permissões do proprietário serão aplicadas; caso contrário, se um dos lances do processo (efetivo ou suplementar) for o proprietário do grupo do arquivo, as permissões do grupo serão aplicadas; caso contrário, as "outras" permissões serão aplicadas.

    
por 26.05.2013 / 01:59