5.1 Lição 1
Certificação: |
Linux Essentials |
---|---|
Versão: |
1.6 |
Tópico: |
5 Segurança e permissões de arquivos |
Objetivo: |
5.1 Segurança básica e identificação de tipos de usuários |
Lição: |
1 de 1 |
Introdução
Esta lição abordará a terminologia básica relacionada a contas, controles de acesso e segurança dos sistemas Linux locais, as ferramentas da interface da linha de comando (CLI) em um sistema Linux para controles de acesso básicos e os arquivos essenciais para oferecer suporte a contas de usuários e grupos, incluindo os usados para aumentar os privilégios elementares.
A segurança básica nos sistemas Linux deriva-se dos controles de acesso do Unix que, apesar de terem quase cinquenta anos, são bastante eficazes em comparação com outros sistemas operacionais populares de linhagem muito mais recente. Mesmo certos sistemas operacionais populares baseados em Unix tendem a “tomar liberdades” com o argumento da “facilidade de acesso”, coisa que o Linux não faz.
Os ambientes e interfaces modernos do Linux simplificam a criação e o gerenciamento de usuários e frequentemente automatizam a atribuição de controles de acesso quando um usuário faz login — por exemplo, permitindo acesso ao monitor, áudio e outros serviços — sem a necessidade de praticamente nenhuma intervenção manual do administrador do sistema. No entanto, é importante entender os conceitos básicos por trás de um sistema operacional Linux.
Contas
A segurança engloba muitos conceitos, sendo um dos mais comuns o conceito geral de controles de acesso. Antes de tratar dos controles de acesso a arquivos, como propriedade e permissões, é necessário compreender os conceitos básicos relacionados às contas de usuário do Linux, que são divididas em vários tipos.
Todo usuário de um sistema Linux possui uma conta associada que, além das informações de login (como nome de usuário e senha), também define como e onde o usuário pode interagir com o sistema. Os privilégios e controles de acesso definem os “limites” dentro dos quais cada usuário pode operar.
Identificadores (UIDs/GIDs)
Os Identificadores de Usuário e Grupos (UIDs/GIDs) são as referências básicas, numeradas, às contas. As implementações iniciais eram números inteiros limitados de 16 bits (valores de 0 a 65535), mas os sistemas do século XXI suportam UIDs e GIDs de 64 bits. Os usuários e grupos são enumerados de forma independente, de modo que o mesmo ID pode representar tanto um usuário quanto um grupo.
Todo usuário possui não apenas um UID, mas também um GID primário. O GID primário de um usuário pode ser exclusivo apenas para esse usuário, não sendo usado por outros usuários. No entanto, o grupo pode ser compartilhado por diversos usuários. Além desses grupos primários, cada usuário também pode ser membro de outros grupos.
Por padrão, nos sistemas Linux, todo usuário é incluído em um grupo com o mesmo nome que seu nome de usuário e um GID idêntico a seu UID. Por exemplo, se criarmos um novo usuário chamado newuser
, seu grupo por padrão também será newuser
.
A conta de superusuário
No Linux, a conta do superusuário é root
, que sempre terá o UID 0. O superusuário também pode ser chamado de administrador do sistema e dispõe de acesso e controle ilimitados sobre o sistema, incluindo outros usuários.
O grupo padrão do superusuário tem o GID 0
e também é chamado de root
. O diretório inicial do superusuário é um diretório dedicado, de nível superior, /root
, acessível apenas pelo próprio usuário root
.
Contas de usuário padrão
Todas as contas que não sejam root
são, tecnicamente, contas de usuário regulares, mas em um sistema Linux o termo coloquial conta de usuário geralmente indica uma conta de usuário “regular” (sem privilégios). Elas têm geralmente as seguintes propriedades, com algumas exceções:
-
UIDs iniciando em 1000 (4 dígitos), embora alguns sistemas legados possam iniciar em 500.
-
Um diretório inicial definido, geralmente um subdiretório de
/home
, dependendo da configuração local. -
Um shell de login definido. No Linux, o shell padrão é geralmente o Bourne Again Shell (
/bin/bash
), embora outros possam estar disponíveis.
Se uma conta de usuário não tiver um shell válido em seus atributos, o usuário não poderá abrir um shell interativo. Normalmente, /sbin/nologin
é usado como um shell inválido. Isso pode ser proposital, no caso de o usuário ser autenticado apenas para serviços que excluam o console ou o acesso SSH; por exemplo, somente acesso FTP seguro (sftp
).
Note
|
Para evitar confusões, o termo conta de usuário será aplicado apenas a contas de usuário padrão ou regulares daqui para a frente. Usaremos conta de sistema para nos referir uma conta de usuário Linux pertencente ao tipo de conta de usuário do sistema. |
Contas do sistema
As contas de sistema são tipicamente pré-criadas no momento da instalação do sistema. São destinadas a recursos, programas e serviços que não serão executados como superusuário. Em um mundo ideal, todos eles seriam funcionalidades do sistema operacional.
As contas de sistema variam, mas dentre seus atributos temos:
-
Os UIDs normalmente são menores de 100 (2 dígitos) ou entre 500-1000 (3 dígitos).
-
Não têm nenhum diretório inicial dedicado ou têm um diretório que normalmente não está em
/home
. -
Nenhum shell de login válido (tipicamente
/sbin/nologin
), com raras exceções.
A maioria das contas de sistema no Linux nunca faz login e não precisa de um shell definido em seus atributos. Muitos processos que pertencem e são executados por contas de sistema são transferidos para o seu próprio ambiente pelo gerenciamento do sistema, sendo executados com a conta de sistema especificada. Essas contas geralmente têm privilégios limitados ou, na maioria das vezes, nenhum privilégio.
Note
|
Do ponto de vista do LPI Linux Essentials, as contas de sistema têm UIDs <1000, com UIDs (e GIDs) de 2 ou 3 dígitos. |
Em geral, as contas de sistema não devem ter um shell de login válido. O contrário representaria um problema de segurança na maioria dos casos.
Contas de serviço
As contas de serviço são criadas tipicamente quando instalamos e configuramos serviços. Como no caso das contas de sistema, elas são destinadas aos recursos, programas e serviços que não serão executados como superusuário.
Em muitas documentações, as contas de sistema e de serviço são semelhantes e intercambiáveis. Isso inclui a localização dos diretórios pessoais, que normalmente ficam fora de /home
, quando definidos (as contas de serviço têm mais probabilidade de ter um diretório pessoal do que as contas de sistema) e a ausência de um shell de login válido. Embora não exista uma definição estrita, a principal diferença entre contas de sistema e de serviço está no UID/GID.
- Conta de sistema
-
UID/GID <100 (2 dígitos) ou <500-1000 (3 digitos)
- Conta de serviço
-
UID/GID >1000 (4+ dígitos), mas não uma conta de usuário “padrão” ou “regular” , uma conta para os serviços, com um UID/GID >1000 (4+ dígitos)
Algumas distribuições Linux ainda têm contas de serviço pré-reservadas com UID <100, e estas também podem ser consideradas contas de sistema, mesmo que não sejam criadas na instalação. Por exemplo, nas distribuições Linux baseadas no Fedora (incluindo o Red Hat), o usuário do servidor web Apache tem um UID (e GID) 48, claramente uma conta de sistema, apesar de contar com um diretório inicial (geralmente em /usr/share/httpd
ou /var/www/html/
).
Note
|
Do ponto de vista do LPI Linux Essentials, as contas de sistema têm UIDs <1000 e as contas de usuário regulares têm UIDs >1000. Como as contas de usuário regulares são >1000, esses UIDs também podem incluir contas de serviço. |
Shells de login e diretórios iniciais
Algumas contas têm um shell de login, enquanto outras não os têm por motivos de segurança, já que não requerem acesso interativo. O shell de login padrão na maioria das distribuições Linux é o Bourne Again Shell, ou bash
, mas outros shells podem estar disponíveis, como o C Shell (csh
), Korn shell (ksh
) ou Z shell (zsh
), dentre outros.
O usuário pode alterar seu shell de login usando o comando chsh
. Por padrão, o comando é executado no modo interativo e exibe um prompt perguntando qual shell deve ser usado. A resposta deve ser o caminho completo para o binário do shell, como mostrado abaixo:
$ chsh Changing the login shell for emma Enter the new value, or press ENTER for the default Login Shell [/bin/bash]: /usr/bin/zsh
Também é possível executar o comando no modo não interativo, com o parâmetro -s
seguido pelo caminho para o binário, da seguinte forma:
$ chsh -s /usr/bin/zsh
A maioria das contas tem um diretório inicial definido. No Linux, esse é geralmente o único local em que a conta do usuário tem acesso garantido de gravação, com algumas exceções (por exemplo, áreas temporárias do sistema de arquivos). No entanto, algumas contas são configuradas propositalmente para não ter acesso de gravação, mesmo no próprio diretório pessoal, por motivos de segurança.
Obtendo informações sobre os usuários
Listar informações básicas de usuário é uma prática cotidiana comum em um sistema Linux. Em alguns casos, os usuários precisarão trocar de usuário e ganhar privilégios para concluir tarefas privilegiadas.
Os usuários comuns podem listar atributos e acessos na linha de comando usando os comandos abaixo. As informações básicas em contexto limitado não são uma operação privilegiada.
Para listar as informações atuais de um usuário na linha de comando, basta um comando de duas letras: id
. A saída vai depender de seu ISD de login:
$ id uid=1024(emma) gid=1024(emma) 1024(emma),20(games),groups=10240(netusers),20480(netadmin) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Na listagem anterior, o usuário (emma
) tem identificadores detalhados da seguinte maneira:
-
1024
= ISD de usuário (UID), seguido pelo nome de usuário (nome comum ou nome de login) entre parênteses. -
1024
= o ID primário de grupo (GID), seguido pelo nome do grupo (nome comum) entre parênteses. -
Uma lista de GIDs adicionais (nomes de grupo) a que o usuário também pertence.
Para listar a última vez em que os usuários se logaram no sistema, usamos o comando last
:
$ last emma pts/3 ::1 Fri Jun 14 04:28 still logged in reboot system boot 5.0.17-300.fc30. Fri Jun 14 04:03 still running reboot system boot 5.0.17-300.fc30. Wed Jun 5 14:32 - 15:19 (00:46) reboot system boot 5.0.17-300.fc30. Sat May 25 18:27 - 19:11 (00:43) reboot system boot 5.0.16-100.fc28. Sat May 25 16:44 - 17:06 (00:21) reboot system boot 5.0.9-100.fc28.x Sun May 12 14:32 - 14:46 (00:14) root tty2 Fri May 10 21:55 - 21:55 (00:00) ...
As informações listadas nas colunas podem variar, mas dentre os itens relevantes na listagem anterior podemos destacar:
-
Um usuário (
emma
) fez login através da rede (pseudo TTYpts/3
) e ainda está logado. -
A hora da inicialização atual está listada, junto com o kernel. No exemplo acima, cerca de 25 minutos antes do usuário fazer login.
-
O superusuário (
root
) se logou através de um console virtual (TTYtty2
), brevemente, em meados de maio.
Uma variante do comando last
é o comando lastb
, que lista as últimas tentativas malsucedidas de login.
Os comandos who
e w
listam somente os logins ativos no sistema:
$ who emma pts/3 2019-06-14 04:28 (::1) $ w 05:43:41 up 1:40, 1 user, load average: 0.25, 0.53, 0.51 USER TTY LOGIN@ IDLE JCPU PCPU WHAT emma pts/3 04:28 1:14m 0.04s 0.04s -bash
Algumas informações são comuns aos dois comandos. Por exemplo, um usuário (emma
) está logado com um pseudo-dispositivo TTY (pts/3
) e a hora de login é 04:28.
O comando w
lista mais informações, incluindo o seguinte:
-
A hora atual e há quanto tempo o sistema está ativo
-
Quantos usuários estão conectados
-
As cargas médias dos últimos 1, 5 e 15 minutos
E as informações adicionais para cada sessão de usuário ativo.
-
Tempos selecionados e totais de uso da CPU (
IDLE
,JCPU
ePCPU
) -
O processo atual (
-bash
). O tempo total de uso da CPU desse processo é o último item (PCPU
).
Ambos os comandos têm mais opções para listar várias informações adicionais.
Troca de usuário e aumento de privilégios
Em um mundo ideal, os usuários nunca precisariam de privilégios adicionais para concluir suas tarefas. O sistema sempre “funcionaria” e tudo estaria configurado para diversos tipos de acesso.
Felizmente para nós, o Linux — desde a instalação — já funciona dessa maneira para a maioria dos usuários que não são administradores de sistema, apesar de sempre seguir o modelo de segurança do menor privilégio.
No entanto, existem comandos que permitem aumentar os privilégios quando necessário. Dois dos mais importantes são su
e sudo
.
Atualmente, na maioria dos sistemas Linux, o comando su
é usado apenas para conceder privilégios de root ao usuário padrão (se um nome de usuário não for especificado após o nome do comando). Embora possa ser usado para alternar para outro usuário, não é uma boa prática: os usuários devem fazer login a partir de outro sistema, pela rede, console físico ou terminal no sistema.
emma ~$ su - Password: root ~#
Após digitar a senha do superusuário (root
), o usuário adquire um shell de superusuário (observe o #
no final do prompt de comando) e se torna, para todos os efeitos, o superusuário (root
).
Compartilhar senhas é uma péssima ideia para a segurança, e por isso deve haver pouquíssima necessidade do comando su
em um sistema Linux moderno.
O cifrão ($
) deve encerrar o prompt da linha de comando no shell de usuário não privilegiado, enquanto o símbolo da cerquilha (#
) deve encerrar o prompt da linha de comando no shell do superusuário (root
). É altamente recomendável que o caractere final de qualquer prompt nunca se afaste desse padrão “universalmente aceito”, uma vez que essa nomenclatura é empregada em materiais de aprendizado, incluindo estes.
Warning
|
Nunca mude para o superusuário ( |
Qual o grande problema de se usar su
para passar ao modo superusuário (root
)? Se a sessão de um usuário regular tiver sido comprometida, a senha do superusuário (root
) poderia ser capturada. É aí que entra o “Switch User Do” (ou “Superuser Do”):
$ cat /sys/devices/virtual/dmi/id/board_serial cat: /sys/devices/virtual/dmi/id/board_serial: Permission denied $ sudo cat /sys/devices/virtual/dmi/id/board_serial [sudo] password for emma: /6789ABC/
Na listagem anterior, o usuário está tentando procurar o número de série da placa do sistema. No entanto, a permissão é negada, pois essas informações estão marcadas como privilegiadas.
Porém, usando o sudo
, o usuário digita sua própria senha para se autenticar. Se ele tiver sido autorizado na configuração sudoers
para executar esse comando com privilégio, com as opções permitidas, ele funcionará.
Tip
|
Por padrão, o primeiro comando autorizado |
Arquivos de controle de acesso
Quase todos os sistemas operacionais têm um conjunto de locais usados para armazenar os controles de acesso. No Linux, esses são tipicamente arquivos de texto localizados no diretório /etc
, que é onde costumam ser armazenados os arquivos de configuração do sistema. Por padrão, esse diretório é legível por todos os usuários no sistema, mas modificável apenas por root
.
Os principais arquivos relacionados a contas de usuário, atributos e controle de acesso são:
/etc/passwd
-
Este arquivo armazena informações básicas sobre os usuários no sistema, incluindo UID e GID, diretório inicial, shell etc. Apesar do nome, nenhuma senha é armazenada aqui.
/etc/group
-
Este arquivo armazena informações básicas sobre todos os grupos de usuários no sistema, como nome do grupo, GID e membros.
/etc/shadow
-
É aqui que as senhas dos usuários são armazenadas. Elas são criptografadas por segurança.
/etc/gshadow
-
Este arquivo armazena informações mais detalhadas sobre grupos, incluindo uma senha criptografada com hash que permite que os usuários se tornem membros do grupo temporariamente, uma lista de usuários que podem se tornar membros do grupo a qualquer momento e uma lista de administradores do grupo.
Warning
|
Esses arquivos não foram projetados para ser editados diretamente e isso jamais deve ser feito. Esta lição aborda apenas as informações armazenadas nesses arquivos e não a edição deles. |
Por padrão, qualquer usuário pode acessar o /etc
e ler os arquivos /etc/passwd
e /etc/group
. E também por padrão nenhum usuário, exceto root
, pode ler os arquivos /etc/shadow
ou /etc/gshadow
.
Também existem arquivos relacionados ao aumento básico de privilégios em sistemas Linux, como nos comandos su
e sudo
. Por padrão, eles só estão acessíveis ao usuário root
.
/etc/sudoers
-
Este arquivo controla quem pode usar o comando
sudo
e como. /etc/sudoers.d
-
Este diretório pode conter arquivos que suplementam as configurações do arquivo
sudoers
.
No que diz respeito ao exame LPI Linux Essentials, basta conhecer o caminho e o nome do arquivo padrão de configuração do sudo, /etc/sudoers
. A configuração dele está além do escopo destes materiais.
Warning
|
Embora |
/etc/passwd
O arquivo /etc/passwd
é popularmente chamado “arquivo password” (senha). Cada linha contém diversos campos, sempre delimitados por dois pontos (:
). Apesar do nome, o hash one-way das senhas não é armazenado neste arquivo atualmente.
A sintaxe típica de uma linha nesse arquivo é:
USERNAME:PASSWORD:UID:GID:GECOS:HOMEDIR:SHELL
Onde:
USERNAME
-
O nome de usuário ou nome de login (nome), como
root
,nobody
,emma
. PASSWORD
-
Antigo local do hash de senhas. Quase sempre é
x
, indicando que a senha está armazenada no arquivo/etc/shadow
. UID
-
ID de usuário (UID), como
0
,99
,1024
. GID
-
ID de grupo padrão (GID), como
0
,99
,1024
. GECOS
-
Uma lista em formato CSV de informações de usuários, incluindo nome, localização, número de telefone. Por exemplo:
Emma Smith,42 Douglas St,555.555.5555
HOMEDIR
-
Caminho para o diretório inicial do usuário, como
/root
,/home/emma
, etc. SHELL
-
O shell padrão para este usuário, como
/bin/bash
,/sbin/nologin
,/bin/ksh
etc.
Por exemplo, a linha a seguir descreve o usuário emma
:
emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555:/home/emma:/bin/bash
Compreendendo o campo GECOS
O campo GECOS contém três (3) ou mais campos delimitados por vírgula (,
), sendo também conhecido como lista de Valores Separados por Vírgula (Comma Separated Values, ou CSV). Embora não exista um padrão imposto, os campos geralmente estão na seguinte ordem:
NAME,LOCATION,CONTACT
Onde:
NAME
-
é o “Full Name” (nome completo) do usuário, ou o “Software Name” (nome do software) no caso de uma conta de serviço.
LOCATION
-
normalmente é a localização física do usuário dentro de um prédio, o número da sala ou o departamento ou pessoa a contatar no caso de uma conta de serviço.
CONTACT
-
lista as informações de contato, como o telefone pessoal ou profissional.
Os campos adicionais podem incluir outras informações de contato, como um número residencial ou endereço de email. Para alterar as informações no campo GECOS, use o comando chfn
e responda às perguntas, como abaixo. Se nenhum nome de usuário for fornecido após o nome do comando, serão alteradas as informações do usuário atual:
$ chfn Changing the user information for emma Enter the new value, or press ENTER for the default Full Name: Emma Smith Room Number []: 42 Work Phone []: 555.555.5555 Home Phone []: 555.555.6666
/etc/group
O arquivo /etc/group
contém arquivos delimitados por dois pontos (:
), armazenando informações básicas sobre os grupos no sistema. Ele às vezes é chamado “arquivo de grupo”. A sintaxe de cada linha é:
NAME:PASSWORD:GID:MEMBERS
Onde:
NAME
-
é o nome do grupo, como
root
,users
,emma
etc. PASSWORD
-
Antigo local do hash opcional de senhas de grupos. Quase sempre é
x
, indicando que a senha (caso definida) está armazenada no arquivo/etc/gshadow
. GID
-
ID de grupo (GID), como
0
,99
,1024
. MEMBERS
-
uma lista de nomes de usuário que são membros do grupo, separados por vírgula, como
jsmith,emma
.
O exemplo abaixo mostra uma linha contendo informações sobre o grupo students
:
students:x:1023:jsmith,emma
O usuário não precisa ser listado no campo members quando o grupo é o grupo principal de um usuário. Se um usuário estiver listado, o item é redundante — ou seja, não há alterações na funcionalidade, estando listado ou não.
Note
|
O uso de senhas para grupos está além do escopo desta seção; no entanto, se houver uma, o hash da senha é armazenado no arquivo |
/etc/shadow
A tabela a seguir lista os atributos armazenados no arquivo /etc/shadow
, comumente chamado de “arquivo de sombra”. O arquivo contém campos sempre delimitados por dois pontos (:
). Embora o arquivo tenha muitos campos, a maioria está além do escopo desta lição, exceto os dois primeiros.
A sintaxe básica para uma linha nesse arquivo é:
USERNAME:PASSWORD:LASTCHANGE:MINAGE:MAXAGE:WARN:INACTIVE:EXPDATE
Onde:
USERNAME
-
O nome de usuário (igual a
/etc/passwd
), comoroot
,nobody
,emma
. PASSWORD
-
Um hash unidirecional da senha, incluindo o sal anterior. Por exemplo:
!!
,!$1$01234567$ABC…
,$6$012345789ABCDEF$012…
. LASTCHANGE
-
Data da última alteração da senha em dias desde a “época”, como
17909
. MINAGE
-
Idade mínima da senha em dias.
MAXAGE
-
Idade máxima da senha em dias.
WARN
-
Período de aviso antes da expiração da senha, em dias.
INACTIVE
-
Idade máxima da senha após a expiração, em dias.
EXPDATE
-
Data da expiração da senha, em dias desde a “época”.
No exemplo abaixo vemos um exemplo de entrada do arquivo /etc/shadow
. Note que certos valores, como INACTIVE
e EXPDATE
, estão indefinidos.
emma:$6$nP532JDDogQYZF8I$bjFNh9eT1xpb9/n6pmjlIwgu7hGjH/eytSdttbmVv0MlyTMFgBIXESFNUmTo9EGxxH1OT1HGQzR0so4n1npbE0:18064:0:99999:7:::
A “época” de um sistema POSIX é meia-noite (0000) do Tempo Universal Coordenado (UTC), na quinta-feira, 1º de janeiro de 1970. A maioria das datas e horas POSIX estão em segundos desde a “época” ou, no caso do arquivo /etc/shadow
, dias desde a “época”.
Note
|
O arquivo de sombra foi desenvolvido para ser legível apenas pelo superusuário e serviços selecionados de autenticação do sistema principal que verificam o hash de senha unidirecional no login ou em outro momento da autenticação. |
Embora existam soluções de autenticação diferentes, o método básico de armazenamento de senha é a função de hash unidirecional (one-way). Isso é feito para que a senha nunca seja armazenada em texto não criptografado em um sistema, já que a função de hash não é reversível. Você pode transformar uma senha em um hash, mas (idealmente) não é possível transformar um hash novamente em uma senha.
No máximo, é necessário um método de força bruta para experimentar todas as combinações de uma senha até que uma delas corresponda. Para atenuar o risco de um hash de senha ser quebrado em um sistema, os sistemas Linux aplicam um “sal” aleatório em cada hash de senha de um usuário. Assim, o hash para uma senha de usuário em um sistema Linux geralmente não será o mesmo que em outro sistema Linux, mesmo que a senha seja idêntica.
No arquivo /etc/shadow
, a senha pode assumir diversas formas. Elas tipicamente incluem o seguinte:
!!
-
Indica uma conta “desativada” (a autenticação não é possível), sem hash de senha armazenado.
!$1$01234567$ABC…
-
Uma conta “desativada” (indicado pelo ponto de exclamação inicial), com uma função de hash anterior, sal de hash e string de hash armazenados.
$1$0123456789ABC$012…
-
Uma conta “ativada”, com uma função de hash, sal de hash e string de hash armazenados.
A função de hash, o sal de hash e a string de hash são precedidos e delimitados por um cifrão ($
). O comprimento do sal de hash deve ser entre oito e dezesseis (8-16) caracteres. Eis exemplos dos três mais comuns:
$1$01234567$ABC…
-
Uma função de hash de MD5 (
1
), com um hash de exemplo com oito caracteres. $5$01234567ABCD$012…
-
Uma função de hash de SHA256 (
5
), com um hash de exemplo com doze caracteres. $6$01234567ABCD$012…
-
Uma função de hash de SHA512 (
6
), com um hash de exemplo com doze caracteres.
Note
|
A função de hash MD5 é considerada criptograficamente insegura em relação ao nível atual (2010 e posterior) dos ASICs e até mesmo para os SIMD usados para computação em geral. Na verdade, o FIPS (Federal Information Processing Standards) dos EUA não permite que o MD5 seja usado para quaisquer funções criptográficas, exceto em aspectos muito limitados de validação, mas não para garantir a integridade das assinaturas digitais ou finalidades similares. |
Do ponto de vista dos objetivos e do exame LPI Linux Essentials, basta entender que o hash da senha de um usuário local é armazenado no arquivo /etc/shadow
, que apenas serviços selecionados de autenticação podem ler e o superusuário pode modificar através de outros comandos.
Exercícios Guiados
-
Considere a seguinte saída do comando
id
:$ id emma uid=1000(emma) gid=1000(emma) groups=1000(emma),4(adm),5(tty),10(uucp),20(dialout),27(sudo),46(plugdev)
Em quais arquivos estão armazenados os atributos a seguir?
UID e GID
Grupos
-
Adicionalmente, em qual arquivo a senha do usuário é armazenada?
-
-
Quais dos tipos de criptografia a seguir é usado por padrão para armazenar senhas localmente em um sistema Linux?
-
Asymmetric
-
One-way Hash
-
Symmetric
-
ROT13
-
-
Se uma conta tem um ID de usuário (UID) com número menor que 1000, de que tipo de conta se trata?
-
Como é possivel obter uma lista dos logins ativos de seu sistema e uma contagem deles?
-
Usando o comando
grep
, temos o resultado abaixo com informações sobre o usuárioemma
.$ grep emma /etc/passwd emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555,:/home/emma:/bin/ksh
Preencha as lacunas da tabela com as informações apropriadas usando a saída do comando anterior.
Nome de usuário
Senha
UID
GID principal
GECOS
Diretório inicial
Shell
Exercícios Exploratórios
-
Compare os resultados de
last
comw
ewho
. Quais detalhes estão faltando em cada um dos comandos em comparação com os outros? -
Tente lançar os comandos
who
ew -his
.-
Quais informações foram removidas da saída do comando
w
com as opções “no header” (-h
) e “short” (-s
)? -
Quais informações foram adicionadas à saída do comando
w
com a opção “ip address” (-i
)?
-
-
Qual é o arquivo que armazena o hash de senha unidirecional de uma conta de usuário?
-
Qual arquivo contém a lista dos grupos de que uma conta de usuário faz parte? Qual lógica poderia ser usada para compilar uma lista dos grupos de que uma conta de usuário faz parte?
-
Um ou mais (1+) dos seguintes arquivos não é legível por usuários regulares, sem privilégios especiais, por padrão. Quais?
-
/etc/group
-
/etc/passwd
-
/etc/shadow
-
/etc/sudoers
-
-
Como seria possível trocar o shell de login do usuário atual pelo Korn Shell (
/usr/bin/ksh
) em modo não-interativo? -
Por que o diretório inicial do usuário
root
não fica dentro do diretório/home
?
Resumo
Nesta lição, descobrimos os bancos de dados de usuários e grupos do Linux. Aprendemos as propriedades mais importantes de usuários e grupos, incluindo seus nomes e IDs numéricos. Também investigamos como o hash de senhas funciona no Linux e como os grupos são atribuídos aos usuários.
Todas essas informações são armazenadas nos quatro arquivos a seguir, que fornecem os controles de acesso de segurança local mais básicos em um sistema Linux:
/etc/passwd
-
Todos os atributos POSIX locais da conta de usuário, exceto o hash da senha, legíveis por todos.
/etc/group
-
Todos os atributos POSIX locais da conta de grupo, legíveis por todos.
/etc/shadow
-
Todos os hashes de senha locais de usuário (e informações de expiração), ilegíveis por qualquer um (apenas processos selecionados).
/etc/sudoers
-
Todas as informações/permissões locais de aumento de privilégios pelo comando
sudo
.
Os seguintes comandos foram discutidos nesta lição:
id
-
Lista IDs de usuários e grupos reais (ou efetivos).
last
-
Lista os usuários que fizeram login por último.
who
-
Lista usuários que estão conectados no momento.
w
-
Semelhante a
who
, mas com contexto adicional. su
-
Alterna para outro usuário com um shell de login ou executa comandos como aquele usuário, contornando a senha desse usuário.
sudo
-
Switch User Do (Substituição de Usuário) ou Superuser Do (Fazer como Superusuário). Caso esteja autorizado, o usuário atual digita sua própria senha (se necessário) para aumentar os privilégios.
chsh
-
Troca o shell de um usuário.
chfn
-
Altera as informações do usuário no campo GECOS.
Respostas aos Exercícios Guiados
-
Considere a seguinte saída do comando
id
:$ id emma uid=1000(emma) gid=1000(emma) groups=1000(emma),4(adm),5(tty),10(uucp),20(dialout),27(sudo),46(plugdev)
Em quais arquivos estão armazenados os atributos a seguir?
UID e GID
/etc/passwd
Grupos
/etc/group
-
Adicionalmente, em qual arquivo a senha do usuário é armazenada?
A senha de usuário criptografada fica armazenada em
/etc/shadow
.
-
-
Quais dos tipos de criptografia a seguir é usado por padrão para armazenar senhas localmente em um sistema Linux?
Por padrão, um hash unidirecional é usado para armazenar senhas.
-
Se uma conta tem um ID de usuário (UID) com número menor que 1000, de que tipo de conta se trata?
Contas com UID menor que 1000 geralmente são contas de sistema.
-
Como é possivel obter uma lista dos logins ativos de seu sistema e uma contagem deles?
Use o comando
w
. Além de uma lista de logins ativos, ele também mostra informações como a quantidade de usuários conectados, além da carga e tempo de atividade do sistema. -
Usando o comando
grep
, temos o resultado abaixo com informações sobre o usuárioemma
.$ grep emma /etc/passwd emma:x:1000:1000:Emma Smith,42 Douglas St,555.555.5555,:/home/emma:/bin/ksh
Preencha as lacunas da tabela com as informações apropriadas usando a saída do comando anterior.
Nome de usuário
emma
Senha
x
- deve sempre serx
para um login ativo válidoUID
1000
GID principal
1000
GECOS
Emma Smith,42 Douglas St,555.555.5555
Diretório inicial
/home/emma
Shell
/bin/ksh
Respostas aos Exercícios Exploratórios
-
Compare os resultados de
last
comw
ewho
. Quais detalhes estão faltando em cada um dos comandos em comparação com os outros?As ferramentas
w
ewho
listam apenas os usuários atualmente conectados ao sistema, ao passo quelast
também lista os usuários que se desconectaram. O comandow
lista a utilização do sistema, enquantowho
não faz isso. -
Tente lançar os comandos
who
ew -his
.-
Quais informações foram removidas da saída do comando
w
com as opções “no header” (-h
) e “short” (-s
)?O cabeçalho não é impresso, o que é útil para análise, e o tempo de login e informações selecionadas da CPU não são listados, respectivamente.
-
Quais informações foram adicionadas à saída do comando
w
com a opção “ip address” (-i
)?Essa opção imprime o endereço IP, em vez de tentar a resolução de DNS, imprimindo o nome do host. Essa opção de
w
é mais adequada à saída padrão do comandolast
.
-
-
Qual é o arquivo que armazena o hash de senha unidirecional de uma conta de usuário?
O arquivo
/etc/shadow
armazena o hash unidirecional de uma conta de usuário, já que ele não é legível por uma conta de usuário regular, sem privilégios, ao contrário do arquivo/etc/passwd
. -
Qual arquivo contém a lista dos grupos de que uma conta de usuário faz parte? Qual lógica poderia ser usada para compilar uma lista dos grupos de que uma conta de usuário faz parte?
O arquivo
/etc/group
tem uma lista em formato CSV de nomes de usuários no último campo (“members”) de qualquer linha correspondente a um grupo.Qualquer linha no arquivo
/etc/group
na qual o usuário aparece listado no último campo, “members”, implica que o usuário é membro daquele grupo — supondo-se que ele esteja corretamente formatado (valores delimitados por vírgulas). Além disso, a participação do usuário em seu grupo principal no arquivo/etc/passwd
também terá uma entrada correspondente no arquivo/etc/group
, incluindo tanto o nome do grupo quanto o GID. -
Um ou mais (1+) dos seguintes arquivos não é legível por usuários regulares, sem privilégios especiais, por padrão. Quais?
-
/etc/group
-
/etc/passwd
-
/etc/shadow
-
/etc/sudoers
Os arquivos
/etc/shadow
e/etc/sudoers
não são legíveis por padrão, exceto por serviços selecionados ou o superusuário. Estas respostas serão personalizadas com base nos sistemas e nomes de usuário usados no laboratório.
-
-
Como seria possível trocar o shell de login do usuário atual pelo Korn Shell (
/usr/bin/ksh
) em modo não-interativo?$ chsh -s /usr/bin/ksh
-
Por que o diretório inicial do usuário
root
não fica dentro do diretório/home
?Porque a conta
root
é necessária para resolver problemas e corrigir erros, o que pode incluir problemas no sistema de arquivos relacionados ao diretório/home
. Nesses casos,root
deve estar plenamente funcional mesmo que o sistema de arquivos de/home
esteja indisponível.