Objetivos do Laboratório

Este laboratório tem como objetivo prático a aplicação dos conceitos de permissões especiais de processos, a configuração de localização do sistema e o gerenciamento de aplicações padrão no Linux. Ao final, você será capaz de:

Parte 1: Análise de Permissões Especiais (`setuid`)

Nesta seção, investigaremos o impacto do bit `setuid` no ID de usuário efetivo de um processo.

1.1 Criando o Programa de Teste

1. Crie um arquivo chamado inspector.c com o seu editor de texto preferido.

nano inspector.c

2. Insira o seguinte código C no arquivo. Este programa simplesmente imprime os IDs de usuário (Real, Efetivo e Salvo) do processo que o executa.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    printf("ID de Usuário Real (RUID)   : %d\n", getuid());
    printf("ID de Usuário Efetivo (EUID) : %d\n", geteuid());

    // A chamada getresuid() é específica do Linux e mais completa
    uid_t ruid, euid, suid;
    if (getresuid(&ruid, &euid, &suid) == 0) {
        printf("--- Usando getresuid() ---\n");
        printf("ID de Usuário Real (RUID)      : %d\n", ruid);
        printf("ID de Usuário Efetivo (EUID)    : %d\n", euid);
        printf("ID de Usuário Salvo (SSUID)    : %d\n", suid);
    }

    return 0;
}

3. Compile o programa:

gcc inspector.c -o inspector

1.2 Anatomia dos IDs de um Processo

Para entender o `setuid`, é crucial conhecer os diferentes "identificadores de usuário" que o Linux associa a um processo. Eles determinam o que um processo pode ou não fazer.

Real User ID (RUID)

É o ID do usuário que lançou o processo. Pense nele como o "dono" original do processo. Normalmente, não muda durante a vida do processo.

Effective User ID (EUID)

Este é o ID que o kernel verifica para determinar as permissões de um processo ao tentar acessar arquivos ou outros recursos. O bit `setuid` altera precisamente este ID, permitindo que o processo "aja como" outro usuário (geralmente o `root`).

Saved Set-User-ID (SSUID)

Quando um processo `setuid` é iniciado, o kernel copia o valor do EUID para o SSUID. Isso serve como uma "memória" do privilégio. Um programa bem escrito pode temporariamente baixar seus privilégios (fazendo EUID = RUID) para executar uma tarefa segura e depois restaurar os privilégios (copiando SSUID de volta para EUID) quando necessário.

1.3 Teste Inicial (Sem `setuid`)

1. Execute o programa:

./inspector

2. Anote os resultados. Todos os IDs devem ser iguais ao ID do seu usuário. Para descobrir seu ID, use o comando id -u.

1.4 Ativando o `setuid` e Analisando o Efeito

1. Mude o dono do executável para `root`. O `setuid` faz o processo rodar com as permissões do dono do arquivo.

sudo chown root inspector

2. Adicione a permissão `setuid`.

sudo chmod u+s inspector

3. Verifique as permissões do arquivo. Você deve notar um `s` no lugar do `x` do dono.

ls -l inspector

4. Execute o programa novamente como seu usuário comum (não use `sudo`).

./inspector

1.5 Questões para Análise

1. Compare a saída do passo 1.3 com a do 1.4. Qual ID mudou e por quê?

2. Qual o valor do RUID na segunda execução? O que isso nos diz sobre quem "possui" o processo?

3. Qual o valor do EUID na segunda execução? Por que o `root` (ID 0) apareceu?

4. Qual a principal implicação de segurança de um programa com `setuid` que pertence ao `root`? Pesquise sobre "privilege escalation exploit via setuid" para aprofundar.

Parte 2: Configuração de Localização (pt-BR)

Aprenda a configurar seu ambiente para Português do Brasil, ajustando idioma, fuso horário e formatos regionais.

2.1 Verificação do Ambiente Atual

1. Verifique o fuso horário atual:

timedatectl

2. Verifique a configuração de *locale*:

locale

3. Visualize uma página de manual para verificar o idioma:

man ls

2.2 Ajustando o Ambiente para Português do Brasil

1. Instale os pacotes de idioma e tradução, caso não existam:

sudo apt update
sudo apt install manpages-pt-br manpages-pt-br-dev language-pack-pt

2. Execute a reconfiguração interativa do fuso horário. Navegue no menu e selecione `America` -> `Sao_Paulo`.

sudo dpkg-reconfigure tzdata

3. Execute a reconfiguração interativa de *locales*. Na primeira tela, encontre e selecione `pt_BR.UTF-8 UTF-8`. Na segunda tela, defina-o como padrão.

sudo dpkg-reconfigure locales

4. Para aplicar as mudanças de locale, feche e reabra seu terminal.

2.3 Variáveis de Ambiente de Locale

As configurações de *locale* são aplicadas ao seu ambiente através de variáveis de ambiente. O comando `locale` que você executou anteriormente exibe os valores atuais dessas variáveis. As mais importantes são:

LANG

Define o *locale* padrão para todas as categorias que não forem explicitamente sobrescritas por outras variáveis `LC_*`.

LC_* (ex: LC_TIME, LC_NUMERIC)

Permitem customizar uma categoria específica. Por exemplo, você pode ter as mensagens em inglês (LC_MESSAGES=en_US.UTF-8) mas o formato de data em português (LC_TIME=pt_BR.UTF-8).

LC_ALL

É uma variável especial que, quando definida, sobrescreve todas as outras (`LANG` e `LC_*`). É frequentemente usada em scripts para garantir um comportamento consistente, independentemente da configuração do usuário.

A ordem de prioridade é: 1º `LC_ALL` (se definida, ignora o resto), 2º `LC_*` (para suas categorias específicas), 3º `LANG` (como valor padrão para o que não foi definido).

Tente executar o comando abaixo para ver o efeito de uma variável temporária:

# Exibe a data no formato padrão do seu novo locale (pt_BR)
date

# Exibe a data no formato americano, apenas para este comando
LC_TIME=en_US.UTF-8 date

2.4 Verificação Final

Execute novamente os comandos de verificação e observe as mudanças. A página de manual do `ls` agora deve estar em português.

Parte 3: Sistema de Alternativas

Entenda como o Linux gerencia programas padrão (como editores de texto) e como você pode customizar essa escolha.

3.1 Como Funciona o `update-alternatives`

Em sistemas Debian-based, muitas ferramentas podem ser providas por diferentes pacotes. Por exemplo, `vi`, `vim`, `nano`, e `emacs` são todos "editores". O sistema de alternativas resolve qual comando genérico (como `editor`) deve ser executado.

Links Simbólicos em Cadeia

O sistema funciona criando múltiplos links simbólicos. Um comando genérico como /usr/bin/editor não aponta diretamente para o executável (ex: `nano`), mas sim para um link intermediário em /etc/alternatives/editor. Este, por sua vez, aponta para a implementação real escolhida pelo administrador (ex: /bin/nano).

Modo Automático e Prioridades

Cada "alternativa" (implementação) possui um número de prioridade. No modo automático, o sistema aponta o link para a alternativa de maior prioridade. O comando `update-alternatives --config` permite que o administrador sobreponha essa escolha, mudando para o modo manual.

3.2 Verificando e Alterando o Editor Padrão

1. Verifique qual programa é executado pelo link simbólico `editor`:

ls -l /etc/alternatives/editor

2. Use o `update-alternatives` para listar as opções. Apenas observe e pressione `Ctrl+C` para sair sem alterar.

sudo update-alternatives --config editor

3. Agora, use o comando específico para o usuário para alterar o editor:

select-editor

3.3 Questão para Análise

Qual a vantagem de usar o sistema de alternativas em vez de simplesmente criar um alias no `~/.bashrc` (e.g., `alias editor='nano'`)? Em que cenário um é mais apropriado que o outro?