Se, por "sem sentido", você quiser escrever apenas dmesg
ou semelhante na linha de comando, a solução mais simples seria criar um script que chame /bin/dmesg
a sudo
, e configure o sudo para que isso aconteça sem pedir uma senha.
Então, algo assim:
echo 'username ALL = NOPASSWD:/bin/dmesg ' >> /etc/sudoers
cat <<'EOF' > ./dmesg
#!/bin/sh
sudo /bin/dmesg "$@"
EOF
chmod +x ./dmesg
e, em seguida, coloque ./dmesg
em algum lugar do seu caminho.
Isso funciona desde que você não tenha outro programa que precise ler o buffer de mensagem do kernel diretamente, sem passar pelo /bin/dmesg
. Mas então, definir /bin/dmesg
setuid teria a mesma limitação. Executá-lo via sudo
é provavelmente mais seguro do que simplesmente executá-lo setuid.
Como um aparte, alterar as permissões em /dev/kmsg
não funciona, mesmo que dmesg
tente lê-lo. Ele volta para a chamada de sistema syslog(2)
.
Se isso não for suficiente, você poderá fazer isso com os recursos .
O dmesg_restrict
sysctl restringe a leitura do log para processos com CAP_SYSLOG
, portanto, precisamos apenas que isso seja definido.
Então, algo assim:
# cp /bin/dmesg /bin/dmesg.capable
# chown .adm /bin/dmesg.capable
# chmod 710 /bin/dmesg.capable
# setcap cap_syslog=ep /bin/dmesg.capable
Os usuários do grupo adm
agora devem poder usar /bin/dmesg.capable
para exibir o log.
Embora os recursos sejam notórios, muitos deles fornecem maneiras de contornar o restante dos sistemas de controle de acesso, embora a concessão de apenas CAP_SYSLOG
seja provavelmente melhor do que executar dmesg
como raiz completa.
Outras opções que vêm à mente são o SELinux, seccomp
e apenas o antigo patch do kernel para permitir a leitura do log por um determinado grupo.