Como fazer com que as senhas dos usuários sejam exibidas como texto não criptografado no Linux?

28

Sabemos que as senhas dos usuários são salvas /etc/passwd, mas de maneira criptografada, para que nem a raiz possa vê-las:

jane:x:501:501::/home/jane:/bin/bash
fred:x:502:502::/home/fred:/bin/bash

Como mostrado acima, :x:representa a senha.

Existe uma maneira (possível configuração) de salvar a senha no /etc/passwdtexto não criptografado e de forma que a raiz possa vê-las?

user78050
fonte
10
Não. E isso é um recurso. Também não há motivo real, pois a conta raiz não precisa da senha de um usuário para acessar seus arquivos. Sob que circunstância você quer isso?
HalosGhost
1
Só estou curioso sobre isso, por que o administrador (raiz) do sistema não pode ver as senhas de outros usuários?
user78050
5
@ user78050 porque o usuário root não tem motivos para conhecer as senhas de outros usuários, e seria um grande risco de segurança permitir isso.
David
16
Porque viola o princípio de segurança mais simples do negócio: "nunca armazene senhas em texto simples". Quando a segurança é bem-sucedida, apenas o usuário deve saber sua senha, mais ninguém. Além disso, não há absolutamente nenhuma razão para fazer isso. Não consigo pensar em uma única situação administrativa em que ajudaria um usuário root a saber a senha de outro usuário.
HalosGhost
3
Use o "método de criptografia" do MD5 e decifre as senhas usando tabelas arco-íris .
Cristian Ciupitu 19/07/2014

Respostas:

58

As outras duas respostas lhe disseram - corretamente! - que essa é uma má idéia ™ . Mas eles também disseram que é difícil , exigindo a alteração de vários programas.

Isso não é verdade. É muito fácil. Você só precisa alterar um ou dois arquivos de configuração. Eu acho importante salientar isso, porque você deve estar ciente disso ao fazer login em sistemas que não controla. Na verdade, elas não colocam uma senha em texto sem formatação /etc/passwdou /etc/shadowvão para um arquivo diferente. Observe que não os testei, pois prefiro não ter minha senha em texto sem formatação.

  1. Edite /etc/pam.d/common-password(para pegar a senha alterada) ou /etc/pam.d/common-auth(para pegar o login) e adicione… pam_exec expose_authtok log=/root/passwords /bin/cat

  2. Edite os dois e mude de pam_unix para pam_userdb com crypt=none. Como alternativa, você pode colocá-lo apenas na senha comum (deixando o pam_unix também) apenas para registrar as senhas quando elas forem alteradas.

  3. Você pode remover a opção shadow(assim como qualquer opção de hash forte) do pam_unix para desativar o arquivo shadow e voltar às senhas tradicionais de criptografia. Não é texto simples, mas João, o Estripador, corrigirá isso para você.

Para mais detalhes, consulte o Guia de Administração do Sistema PAM .

Você também pode editar o código fonte do PAM ou escrever seu próprio módulo. Você só precisa compilar o PAM (ou seu módulo), nada mais.

derobert
fonte
1
Suponho que as senhas de texto simples sejam gravadas /root/passwords.
Faheem Mitha
Btw. muito bom saber como é fácil e para onde devo olhar se tiver medo de um sistema comprometido.
Erik
8
@erik É prerrogativa do solicitante escolher a resposta que ele achar mais útil como resposta aceita. Provavelmente é bom que o OP tenha encontrado "não faça isso!" o mais útil ... Além disso, para esclarecer, essa não é a única maneira de roubar senhas em um sistema comprometido ou administrado com códigos maliciosos. Portanto, você não pode simplesmente olhar para a configuração do PAM para determinar se está seguro.
Derobert
3
Isso pressupõe que a distribuição esteja usando o PAM, de forma alguma eles o fazem.
Vality
1
@msw Eu respondi porque é aparentemente uma crença comum que é difícil executar uma caixa Linux com senhas em texto não criptografado (Bobby, para seu crédito, corrigiu sua resposta; o Anthon ainda faz com que pareça difícil). Essa é uma crença perigosa, pois incentiva a reutilização de senha. Se eu tivesse acabado de postar uma resposta "na verdade, é fácil, você edita um arquivo ou dois, mas não vou contar", então ninguém acreditaria nisso. Por que me ouvir sobre as (na época) respostas muito mais votadas e mais completas? Expor o argumento requer dizer como fazê-lo. (Porém, eles não são exemplos de copiar e colar. Ainda é necessário usar o pensamento.)
derobert
34

Oh querida, tudo bem, vamos começar do começo ...

Sabemos que as senhas dos usuários são salvas em / etc / passwd, mas de maneira criptografada

Não eles foram armazenados em /etc/passwd, e isso foi há algum tempo atrás. Hoje, as senhas são armazenadas no chamado arquivo de sombra , na maioria das vezes /etc/shadow.

mas de maneira criptografada, para que nem a raiz possa vê-los:

Eu sei que às vezes é usado de forma intercambiável, mas hash não é criptografia . A criptografia é, por sua própria definição, reversível, o que significa que você pode converter a coisa criptografada novamente em sua forma de texto não criptografado. O hash foi projetado para não ser reversível de forma alguma (exceto força bruta). A forma original de texto não criptografado de um hash não deve ser recuperável.

As senhas no arquivo de sombra são armazenadas como hashes.

como mostrado acima: x: representa a senha

o x neste caso só é um espaço reservado para o campo de senha legado. Os xmeios que a senha pode ser encontrada no arquivo shadow.

Existe uma maneira (possível configuração) de salvar a senha no / etc / passwd em texto não criptografado e de forma que a raiz possa vê-los?

Sim, isso é realmente possível, mas não é uma boa ideia por alguns motivos. A resposta de Derobert explica uma maneira bastante simples de fazê-lo .

Mas por que não é uma boa ideia? Bem, por uma razão simples, mas muito importante: segurança. Sugiro ler estas perguntas:

Mas, para resumir, assuma o seguinte: Há um servidor em uma empresa, todas as contas de usuário são protegidas por senhas e os dados nessas contas são criptografados com a mesma senha. Um cracker de fora obtém acesso ao servidor, mas não pode acessar nenhum dado importante, porque ele ainda é criptografado nas contas de usuário.

Agora assuma que as senhas seriam armazenadas em texto sem formatação. De repente, o cracker teria acesso a tudo , porque as senhas podem ser lidas. Mas se eles são armazenados como valores de hash, eles são quase inúteis para qualquer pessoa, exceto pessoas com muitos recursos para realizar um ataque de força bruta.

Bobby
fonte
2
Na defesa do OP em relação à criptografia e hash, a página de manual de criptografia da glibc diz: «Se salt for uma cadeia de caracteres iniciada com os caracteres "$id$"seguidos por uma cadeia terminada por "$": $id$salt$encrypted então, em vez de usar a máquina DES, ididentifique o método de criptografia usado e, então, determina como o restante da string é interpretado ».
Cristian Ciupitu 19/07/2014
1
Interessante, mas não responde à pergunta principal, como a resposta de derobert.
Erik
6
@erik Às vezes, a resposta certa para uma pergunta é "não faça", mesmo quando a coisa é tecnicamente possível. Este é um desses momentos.
Gilles 'SO- stop be evil'
1
Sugiro alterar esta linha: "Não, não há como excluir muitas aplicações e a maneira como elas funcionam". Isso deixa a impressão de que não é fácil (ou pelo menos fácil de fazer algo funcionalmente equivalente).
Derobert
2
@Bobby Esta é uma excelente resposta, mas não uma excelente resposta. Para torná-la uma excelente resposta, você deve alterar a parte em que "não é possível com facilidade", porque claramente é, como mostra a resposta de derobert.
Michael Dorst
10

Primeiro, as senhas criptografadas não estão /etc/passwd, mas estão /etc/shadow. Uma das razões para isso é que /etc/passwdé legível publicamente (para que você possa, por exemplo, encontrar as informações de campo do GECOS para outro usuário) e, especialmente em esquemas de criptografia mais antigos, pode permitir ataques de força bruta contra a senha criptografada.

Para armazenar apenas as senhas em texto sem formatação, não é necessário e exigiria atualizações no programa de senhas e nas bibliotecas que lêem o arquivo /etc/shadow informações para verificar senhas válidas. E então você tem que esperar que todos os utilitários usem bibliotecas compartilhadas para acessar essas informações, em vez de serem vinculados estaticamente a algo que não entende o armazenamento de senha em texto sem formatação.

Se isso fosse uma opção na configuração de uma instalação, sempre haveria pessoas estúpidas que a ativariam de forma inadequada. E enquanto eles ainda estão trabalhando nas telas do CRT e transmitindo isso de uma maneira que pode ser facilmente captada do lado de fora do prédio, enquanto estão observando as informações.

Além disso, as pessoas tendem a usar a mesma senha ou a mesma senha em vários sistemas, de modo que não é uma boa idéia que nenhuma senha seja legível por humanos. Como um administrador de sistemas pode tentar novamente o sistema em outros sistemas, ele sabe que o usuário tem uma conta.

Deve haver coisas mais interessantes, o funcionamento do pode ser investigado em seu sistema.

Anthon
fonte
3
/etc/shadownão armazena senhas criptografadas, armazena hashes de senhas. Sim, a função é chamada crypte a página de manual diz "criptografada", mas se você chama um peixe de bicicleta, isso não dá rodas. Observe que seria possível criar /etc/shadowsenhas de loja em um formato diferente sem recompilar nenhum programa (pelo menos no Linux e Solaris): os métodos de autenticação sempre estão vinculados dinamicamente. Armazenar senhas como texto sem formatação seria uma péssima idéia, mas é possível com um pouco de trabalho .
Gilles 'SO- stop be evil'
@gilles Acabei de reutilizar a terminologia dos OPs, mas você está certo de que hash é um termo mais apropriado.
Anthon
3

O motivo básico (por que isso é uma péssima idéia) é que nenhum usuário (root, admin ou outro) deve ter acesso à senha de outro usuário.

Simplesmente porque a senha é um meio de autenticação. Se eu souber a senha de outro usuário, conheço suas credenciais (nome de usuário + senha), para que eu possa fazer login como esse usuário , representando-o (ou ela).

Qualquer ação que eu fizer ao fazer login como usuário, o outro usuário será responsável. E não é assim que a autenticação deve funcionar.

As ações podem ser desastrosas, como excluir um monte de arquivos importantes, apagar discos rígidos, apagar backups, encerrar planos de energia nuclear etc.

Ou apenas ilegal. Imagine uma instituição bancária em que eu (o administrador) tenha acesso a todas as senhas. Usando a senha do caixa, posso pedir um milhão de dólares da conta bancária do presidente para a conta bancária do limpador de janelas. Em seguida, use a senha superior do caixa para aprovar a transação. Em seguida, aprove um cheque da conta do limpador de janelas para minha própria conta bancária offshore.

Então eu vou para férias longas nas Bahamas ...


Nessa visão, o hash das senhas e o uso de arquivos de sombra separados podem ser vistos como um meio de impor essa regra (nenhum usuário deve poder se passar por outro).

E como o @ Miral comentou * , há a exceção de suque, ao permitir a representação (e tipos de argumentos fora do argumento acima), também está mantendo um registro de seu uso (por isso altera as regras para "apenas administradores podem se passar por outros, mas um log é mantido ").

* O exemplo do banco provavelmente não foi o melhor. Em qualquer ambiente em que a segurança seja crucial, geralmente são necessários mais meios de autenticação e autorização do que apenas uma senha.

ypercubeᵀᴹ
fonte
Uma falha nesse argumento é que o usuário root pode se passar por qualquer outro usuário no sistema de qualquer maneira, sem precisar saber sua senha. Tão fácil quanto su otheruser.
Miral 21/07
@Miral você está certo, eu não considerei isso. E embora o uso de suseja registrado, su não mantém um registro do que é realmente feito enquanto um usuário se faz passar por outro. E uma raiz maliciosa sempre pode alterar os logs para ocultar as ações de futuros investigadores.
precisa saber é o seguinte