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á.