Skip to content

Instantly share code, notes, and snippets.

@leogama
Last active November 14, 2023 14:34
Show Gist options
  • Save leogama/790f8d28b3a0be6af90306595a82f651 to your computer and use it in GitHub Desktop.
Save leogama/790f8d28b3a0be6af90306595a82f651 to your computer and use it in GitHub Desktop.
User and file permissions in Unix systems
Display the source blob
Display the rendered blob
Raw
{
"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