Desbloqueie condicionalmente uma senha, em um sistema de arquivos somente leitura

1

Estou construindo um sistema embarcado que normalmente não seria acessado, mas precisamos de uma maneira de os desenvolvedores entrarem para depuração e desenvolvimento. O rootfs é normalmente somente leitura (mas pode ser remontado como leitura-gravação).

O esquema que estou observando é manter a senha de root bloqueada ( passwd -l ). Se houver um arquivo especial (em mídia removível), desbloqueie a senha para que você possa efetuar login. Após a reinicialização, se o arquivo especial não existir, a senha será bloqueada novamente.

O arquivo especial não está documentado e não seria usado pelos usuários finais. Os desenvolvedores normalmente criariam esse arquivo para que pudessem fazer login à vontade. Outra maneira de efetuar login é um cliente ssh que abre uma porta para um dos nossos servidores, permitindo-nos usar ssh com autenticação baseada em chave. Para o desenvolvimento, é preciso haver uma maneira de entrar sem a rede.

Parece que a maneira mais simples de implementar isso é algo assim:

if passwd_is_locked and enable_login_exists:
    remount_rw()
    unlock_passwd()
    remount_ro()
elif not passwd_is_locked and not enable_login_exists:
    remount_rw()
    lock_passwd()
    remount_ro()
else:
    pass

Eu não gosto de remontar e modificar arquivos; Eu prefiro alguns como tem uma configuração alternativa transitória (por exemplo, algo em /tmp ).

Eu procurei no comando passwd um pouco. Parece que ele suporta várias fontes para alguns dados ( --repository ) através do sistema Name Service Switch ( nsswitch.conf ). Não tenho certeza se essa é uma opção viável, especialmente para a conta raiz, porque parece que a conta raiz deve sempre retornar ao arquivo normal /etc/shadow . Eu admito que não sou muito de um administrador de sistemas, então talvez eu simplesmente não entenda isso.

passwd também tem uma opção --root . Consegui fazer isso funcionar apenas fazendo cp -a /etc /lib /tmp && passwd --root /tmp , que edita os arquivos em /tmp . Não tenho certeza se posso fazer algo útil com isso.

Se eu alterar /etc/passwd et al para links simbólicos para alguma área gravável, e parece funcionar se eu editar os arquivos manualmente, mas não posso usar o comando passwd .

Eu não estou usando o PAM, mas provavelmente poderia ativá-lo se houvesse uma boa solução lá.

    
por jpkotta 24.11.2016 / 01:03

1 resposta

0

Acabei usando algo como (dentro do initrd):

if is_dev_mode ; then
    chroot $ROOTFS_MOUNT /usr/bin/passwd --delete root
else
    chroot $ROOTFS_MOUNT /usr/bin/passwd --lock root
fi
sync

Isso ocorre antes que o rootfs seja remontado como somente leitura. Eu realmente não gosto disso, mas acho que é melhor do que usar mais um unionfs (já existem vários). O passwd do initrd não tem as opções sofisticadas que o sistema operacional principal faz, mas um chroot funciona igualmente bem.

    
por 30.11.2016 / 08:30