Linux: contas de usuário desabilitadas: Existe um comando shell não-raiz que pode mostrar se uma conta está desabilitada ou não?

2

Existe um comando shell não-root que pode me informar se a conta de um usuário está desabilitada ou não?

Por favor, note que eu faço uma distinção entre LOCKING e DISABLED:

  • LOCKING é onde você prefixa ! ou * ou !! no campo de senha do arquivo / etc / passwd ou / etc / shadow. O bloqueio de senha pode ser feito (em um prompt do shell) via password -l username (como root) para bloquear a conta do nome de usuário, e o uso da opção -u irá desbloqueá-lo.
  • A desativação de uma conta é feita definindo o tempo de expiração da conta do usuário em algum momento no passado. Isso pode ser feito com chage -E 0 username , que define a data de expiração para 0 dias após a época do Unix. A configuração para -1 desativará o uso da data de expiração.

Para minha situação, o uso de bloqueio não é suficiente porque um usuário ainda pode fazer login, por exemplo, usando tokens de autenticação ssh, e os processos sob esse usuário ainda podem gerar outros processos. Assim, temos contas habilitadas ou desabilitadas, não apenas bloqueadas. O que estou procurando é uma maneira de verificar o status de ativação / desativação de uma conta por meio de um comando shell, para uso em um processo Java personalizado. O processo Java pode analisar a saída ou fazer uso do código de saída e executar instruções complicadas, como aquelas que incluem pipes entre comandos.

Isto é destinado ao uso em um sistema Red Hat Enterprise 5.4.

Esta pergunta foi feita anteriormente no SuperUser.

    
por weiji 11.08.2011 / 20:16

4 respostas

2

Do comentário:
Isto não é possível como você descreve, porque: as informações são descritas apenas na sombra, e a sombra só pode ser lida pelo root. Qualquer programa que precise de hashes de senha ou expiração de conta deve ser SUID (se você estiver usando contas locais armazenadas na sombra, como você diz.)

Informações adicionadas:
Inicialmente usei chage (1) como fonte.

Note

The chage program requires a shadow password file to be available.

Agora atualizei minhas informações para ser mais preciso, confirmando as coisas.

Primeiro de tudo, verifiquei o código-fonte do chage apenas para ter certeza. Parece que de fato precisa acessar o arquivo shadow e armazenar as informações em nenhum outro lugar. Segundo, você pode usar o PAM para permitir o uso dos recursos de raiz do chage. (check_perms em chage.c: 523)

E, como outros já disseram, qualquer outra coisa usada como backend para shadow (a saber, qualquer coisa em nsswitch.conf , exceto arquivos e db) tem suas próprias formas de trabalhar com as coisas.

Em suma: ao usar arquivos como back-end, as informações sobre o envelhecimento da senha são realmente armazenadas lá e apenas lá. Se você ainda quiser usar o backend de arquivos, você deve escrever um programa e torná-lo SUID, já que o sistema é tudo ou nada. Você pode consultar apenas o seu usuário ou pode consultar e definir todos. No lado positivo, escrever algo em C para fazer o que você quer seria apenas algumas linhas de código. Você poderia basicamente copiar três funções da fonte chag e adicionar uma nova principal.

    
por 12.08.2011 / 22:50
1

Não sei se há uma maneira fácil de verificar. Eu duvido que como usuário regular você teria r acesso ao arquivo passwd (não o shadow), então você não poderia facilmente sed / awk / grep para o! campo.

O que você poderia fazer é criar um script muito específico, torná-lo não-rwx para não-raiz e, em seguida, criar uma entrada sudo especificamente para esse comando. Você pode até mesmo torná-lo sem senha. Idealmente, você não aceitaria nenhuma entrada, por isso também seria mais difícil "quebrar" o roteiro. Eu suponho que se trata de quão paranóico você quer ser / quem vai ter acesso a ele.

    
por 11.08.2011 / 20:34
0

Não há comando não-root, mas um comando root. É passwd -S <username> . Qual saída o seguinte:

Display account status information. The status information consists of 7 fields. The first field is the user's login name. The second field indicates if the user account has a locked password (L), has no password (NP), or has a usable password (P). The third field gives the date of the last password change. The next four fields are the minimum age, maximum age, warning period, and inactivity period for the password. These ages are expressed in days.

Então, o melhor seria chamar um script como

#!/bin/sh
passwd -S $1

e permitir que seja chamado com sudo e nenhuma senha de dentro do programa Java.

Cuidado: o script acima é vulnerável à injeção de código, então você precisa protegê-lo para o seu propósito.

    
por 11.08.2011 / 20:49
0

Uma maneira seria mover as informações da sua conta para LDAP ou SQL. Em seguida, use os módulos PAM para integrá-los ao seu servidor. Seu aplicativo Java pode acessar facilmente o LDAP ou o SQL diretamente.

Para pontos de bônus, essa abordagem é mais escalável e gerenciável se você tiver muitos servidores com a mesma base de usuários. O / etc / passwd também começa a sofrer com o desempenho se você tiver milhares de contas de usuário ou mais.

    
por 11.08.2011 / 21:15