Last active
November 14, 2023 14:34
-
-
Save leogama/790f8d28b3a0be6af90306595a82f651 to your computer and use it in GitHub Desktop.
User and file permissions in Unix systems
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Usuários e Grupos" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"O comando `id` serve para mostrar o nome e número de identidade do seu _usuário_ e _grupo primário_, além dos _grupos secundários_." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"uid=1000(leogama) gid=1000(leogama) groups=1000(leogama),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lxd),132(shared)\n" | |
] | |
} | |
], | |
"source": [ | |
"id" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Em distribuições Linux baseadas em Debian/Ubuntu, o comando para criar um novo usuário é o `adduser`. Geralmente, ele só pode ser executado pelo _superuser_." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"sudo adduser john" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Quando uma nova conta de usuário é adicionada ao sistema, suas informações são armazenadas no banco de dados de usuários. Esse banco de dados está distribuidos em alguns arquivos presentes em todos os sistemas Unix, como o `/etc/passwd`. Podemos procurar as informações básicas de qualquer usuário inspecionando-o diretamente ou usando o comando `getent`.\n", | |
"\n", | |
"Para cada conta criada são atribuídos um número de identidade de usuário (UID) e um número de indentidade de grupo primário (GID). Em sistemas Debian/Ubuntu, esse grupo primário é gerado com o mesmo nome do usuário e (geralmente) como o mesmo valor numérico." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"grep john /etc/passwd" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"getent passwd john" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Além do seu grupo primário, um usuário pode ser membro de grupos secundários (suplementares). Esses grupos podem ser inspecionados acessando-se o banco de dados `group`." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"getent group john" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Outras formas de se obter informações sobre o seu ou outro usuário são usando os comandos `id`, `whoami` e `who`, além de variáves de ambiente predefinidas na shell como `$USER` e `$UID`." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1000\n", | |
"1000\n" | |
] | |
} | |
], | |
"source": [ | |
"id -u # [username]\n", | |
"id -g # [username]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"leogama\n", | |
"leogama pts/0 2023-11-14 12:35 (179.209.45.56)\n" | |
] | |
} | |
], | |
"source": [ | |
"whoami\n", | |
"who" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"leogama 1000\n" | |
] | |
} | |
], | |
"source": [ | |
"echo $USER $UID" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Permissões de processos" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Demonstração com `htop`, `kill`, etc." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Permissões de arquivos" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"cd $(mktemp -d) # muda para um diretório temporário" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Vamos criar um arquivo de exemplo _vazio_ chamado `teste.txt` e inspecionar suas permissões de arquivo com os comandos `stat` e `ls`." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" File: teste.txt\n", | |
" Size: 0 \tBlocks: 0 IO Block: 4096 regular empty file\n", | |
"Device: 35h/53d\tInode: 2047461 Links: 1\n", | |
"Access: (0664/-rw-rw-r--) Uid: ( 1000/ leogama) Gid: ( 1000/ leogama)\n", | |
"Access: 2023-11-14 14:12:02.453250467 +0000\n", | |
"Modify: 2023-11-14 14:12:02.453250467 +0000\n", | |
"Change: 2023-11-14 14:12:02.453250467 +0000\n", | |
" Birth: -\n" | |
] | |
} | |
], | |
"source": [ | |
"touch teste.txt\n", | |
"stat teste.txt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"total 0\n", | |
"-rw-rw-r-- 1 leogama leogama 0 Nov 14 14:12 teste.txt\n" | |
] | |
} | |
], | |
"source": [ | |
"ls -l" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Não conseguimos acessar o conteúdo de arquivos para os quais o nosso usuário não tem as permissões necessárias. Por exemplo, o arquivo `/etc/shadow`, que armazena as senhas de todos os usuários, pertence ao usuário `root` (superuser) e grupo `shadow` e não tem permissão de leitura para os demais usuários." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"-rw-r----- 1 root shadow 3733 Oct 28 2022 /etc/shadow\n", | |
"cat: /etc/shadow: Permission denied\n" | |
] | |
}, | |
{ | |
"ename": "", | |
"evalue": "1", | |
"output_type": "error", | |
"traceback": [] | |
} | |
], | |
"source": [ | |
"ls -l /etc/shadow # exibe permissões do arquivo\n", | |
"cat /etc/shadow # exibe seu conteúdo" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Já o arquivo `/etc/passwd`, que contém as informações básicas de todos os usuários, tem permissão de leitura para demais usuários e, portanto, seu conteúdo pode ser visto por qualquer usuário." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"-rw-r--r-- 1 root root 4189 Oct 28 2022 /etc/passwd\n", | |
"root:x:0:0:root:/root:/bin/bash\n" | |
] | |
} | |
], | |
"source": [ | |
"ls -l /etc/passwd\n", | |
"grep root /etc/passwd # exibe a linha do arquivo que contém \"root\"" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Mas, como esse arquivo não tem permissão de _escrita_ para os demais usuários, um usuário comum não consegue modificá-lo (pelo menos diretamente)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"bash: /etc/passwd: Permission denied\n" | |
] | |
}, | |
{ | |
"ename": "", | |
"evalue": "1", | |
"output_type": "error", | |
"traceback": [] | |
} | |
], | |
"source": [ | |
"echo \"Você foi HACKEADO!\" > /etc/passwd" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Para modificar as permissões de um arquivo a que nosso usuário tem privilégios de acesso, usamos o comando `chmod`. No exemplo abaixo, inicialmente o arquivo `teste.txt` tem permissão de escrita e conseguimos adicionar conteúdo a ele. Após transformá-lo em um arquivo \"somente leitura\", não é mais possível modificá-lo a menos que a permissão de escrita seja readicionada." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"-rw-rw-r-- 1 leogama leogama 0 Nov 14 14:12 teste.txt\n" | |
] | |
} | |
], | |
"source": [ | |
"ls -l teste.txt # o arquivo tem permissão de escrita\n", | |
"echo coelho >> teste.txt # adicionamos uma linha de texto a ele" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"chmod a-w teste.txt # removemos a permissão de escrita para todos (_all_)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"-r--r--r-- 1 leogama leogama 7 Nov 14 14:12 teste.txt\n", | |
"bash: teste.txt: Permission denied\n" | |
] | |
}, | |
{ | |
"ename": "", | |
"evalue": "1", | |
"output_type": "error", | |
"traceback": [] | |
} | |
], | |
"source": [ | |
"ls -l teste.txt # verificamos a alteração nas permissões\n", | |
"echo pato >> teste.txt # tentamos adicionar uma segunda linha de texto (erro)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"coelho\n" | |
] | |
} | |
], | |
"source": [ | |
"cat teste.txt # a segunda linha não foi adicionada" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Referência: https://wiki.archlinux.org/title/Users_and_groups" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Bash", | |
"language": "bash", | |
"name": "bash" | |
}, | |
"language_info": { | |
"codemirror_mode": "shell", | |
"file_extension": ".sh", | |
"mimetype": "text/x-sh", | |
"name": "bash" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment