PAM: Executar um comando antes de pam_mkhomedir?

8

Quando um usuário faz login no sistema e não há diretório inicial, gostaríamos de criar o diretório inicial do usuário usando pam_mkhomedir . Esta é uma prática comum. Aqui está uma descrição rápida de pam_mkhomedir:

O módulo PAM pam_mkhomedir criará um diretório inicial do usuário se ele não existir quando a sessão começar. Isso permite que os usuários estejam presentes no banco de dados central (como NIS, kerberos ou LDAP) sem usar um sistema de arquivos distribuído ou pré-criar um grande número de diretórios. O diretório do esqueleto (geralmente / etc / skel /) é usado para copiar arquivos padrão e também define um umask para a criação.

No entanto, este é um sistema FreeBSD 8.2 executando o ZFS. Precisamos executar um comando ZFS primeiro, porque queremos um sistema de arquivos ZFS por usuário . pam_mkhomedirpode fazer um mkdir, mas precisamos fazer algo parecido zfs create /zpool/home/$USER.

Alguém sabe se é possível usar o PAM para executar comandos durante a primeira sessão de login de um usuário?

Stefan Lasiewski
fonte
Substituí o link solarisinternals.com por uma versão arquivada de archive.org, porque a primeira é ocupada por um invasor de domínio. Obrigado a @Norman Gray por apontar isso.
Stefan Lasiewski

Respostas:

9

Existe um módulo PAM chamado pam_exec- se você escrever um script que verifique e / ou crie o volume ZFS, poderá encadear isso nas regras PAM existentes e manter as coisas boas sem assumir login interativo, shells padrão e diretórios de esqueletos, etc. exemplo, você poderia ter

session required pam_unix.so
session required pam_exec.so check_zfs.sh $PAM_USER

ou o que for mais adequado à sua configuração específica.

(Como Tom Shaw apontou nos comentários, ter session required pam_mkhomedir.soseria redundante.)

Andrew
fonte
Bom, exceto que você tem um erro de digitação na linha pam_mkhomedir.so - erros de digitação no pam.conf não são bons! - e eu não acho que essa linha seja necessária, de qualquer maneira, se o script check_zfs.sh fizer todo o trabalho sujo.
Tom Shaw
@ Tom Por que reinventar a roda quando o módulo PAM faz isso por você?
Andrew
2
O objetivo da questão é que ele deseja que o diretório inicial seja criado com "zfs create" em vez de "mkdir". Isso é feito usando pam_exec. O diretório existe neste momento, portanto o pam_mkhomedir subsequente não fará nada!
Tom Shaw
@ TomShaw de fato.
31513 Andrew
3

Vale ressaltar que, conforme solicitado, sua pergunta contém uma suposição inválida: mesmo o PAM não faz ideia se é o primeiro login do usuário; só sabe se o usuário tem um diretório inicial ou não.

Portanto, com essa ressalva em mente, não é o PAM fazendo isso, mas você pode facilmente executar algo fora dele /etc/bashrc, com o comando precedido por uma verificação e seguido por uma queda de um arquivo de pontos no diretório inicial do usuário. Precisa de raiz privs? Um sudobinário adequadamente bloqueado ou um binário setuid provavelmente funcionará melhor para você. As duas opções também oferecem a opção de colocar o arquivo de ponto em algum lugar onde o usuário não possa modificá-lo ou excluí-lo (se você se importa com esse tipo de coisa).

BMDan
fonte
Estou confuso. O pam_mkhomedir não está criando esses diretórios pessoais, copiando o conteúdo de / etc / skel, etc? Olhei para o código C (no FreeBSD) e pensei em ver onde ele copia os arquivos do esqueleto para o recém-criado homedir.
Stefan Lasiewski
Só porque um usuário não possui um diretório inicial, não significa que ele não tenha efetuado login no sistema antes. O diretório inicial pode ter sido excluído, por exemplo. No entanto, isso é principalmente cabelos semânticos e rachadores.
Red Tux
@red: Entendido. Eu atualizei minha pergunta.
Stefan Lasiewski
1

Então você tem duas opções aqui:

1) modifique a fonte do pam_mkhomedir para criar o sistema de arquivos zfs primeiro antes de criar o diretório. 2) deixe o pam_mkhomedir funcionar normalmente, depois adicione um script para verificar e ver se há pastas que não estão em seu próprio sistema de arquivos zfs em que o usuário efetuou logout. Ao capturar esses casos, mova o diretório / home, crie o sistema de arquivos e mova os arquivos de volta para o diretório.

Eu suspeito que deixar um usuário no main / home por um dia inicial não causará muitos problemas; portanto, eu usaria a última opção, que é mais simples.

n8whnp
fonte