smbd não iniciará ou parará quando o usuário for elevado para raiz por bit SUID

1

No Ubuntu 12.04, escrevi o seguinte programa em C para me ajudar a encerrar os serviços apache2 e samba do meu servidor enquanto executo backups automatizados. Observe que no Makefile estou configurando o bit SUID para que o programa tenha privilégios de root quando executado pelo usuário humilde tmv .

services.c:

#include <stdio.h>
#include <stdlib.h>

void usage(char * arg0) {
    printf("Usage: %s start|stop\n", arg0);
    exit(1);
}

int main(int argc, char ** argv) {
    fprintf(stderr, "Running as: ");
    system("whoami");
    if (argc != 2) usage(argv[0]);
    if (!strcmp(argv[1], "stop")) {
        printf("Before running rsync, we need to shut down apache2 and smbd.\n");
        system("service apache2 stop");
        system("service smbd stop");
    } else if (!strcmp(argv[1], "start")) {
        printf("After running rsync, we need to start apache2 and smbd.\n");
        system("service apache2 start");
        system("service smbd start");
    } else {
        usage(argv[0]);
    }
    return 0;
}

Makefile:

all: services.c
    gcc -o services services.c
    chown root:tmv services
    chmod u+s services      # allow elevation to root
    chmod o-rx services     # only user tmv should execute

Veja o que eu recebo:

tmv@patience:~$ ./services start
Running as: root
After running rsync, we need to start apache2 and smbd.
 * Starting web server apache2                                           [ OK ] 
start: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory

A execução como root funciona bem:

# ./services start
Running as: root
After running rsync, we need to start apache2 and smbd.
 * Starting web server apache2                                           [ OK ] 
smbd start/running, process 8515

Alguma idéia de porque meu ./services não está funcionando como esperado quando executado como o usuário tmv ? Preciso configurar algumas variáveis de ambiente também?

    
por Isaac Sutherland 12.05.2012 / 06:07

1 resposta

3

Basta escrever isso como um script bash e conceder seus direitos de usuário tmv para executar o script usando o sinalizador NOPASSWD em sudo:

A linha de sudoers seria algo como:

tmv ALL = (ALL) NOPASSWD: /path/to/script

Além disso, certifique-se de que apenas o root possa modificar esse script bash.

    
por 12.05.2012 / 06:34