Eu tenho um programa em C (um módulo syslog-ng, se é que importa) que está criando um socket de domínio Unix em / var / run / e chown'e para mudar seu grupo s.t. certos processos de espaço do usuário podem acessá-lo.
De qualquer forma, quando executo o syslog-ng com este módulo como root em um shell, tudo funciona bem. Ele faz a chamada chown com sucesso e meu soquete Unix é alterado para o grupo correto. No entanto, quando isso é executado no systemd, recebo um erro ERRNO 0 / Operation não permitido na chamada chown neste soquete. Eu imagino que exista alguma diferença ambiental entre executar isso diretamente e rodar em systemd, mas eu, pela vida de mim, não consigo descobrir o que é.
Aqui está o meu arquivo de serviço:
[Unit]
Description=System Logger Daemon
Documentation=man:syslog-ng(8)
[Service]
Type=notify
ExecStart=/usr/sbin/syslog-ng -F $SYSLOGNG_OPTS
ExecReload=/bin/kill -HUP $MAINPID
EnvironmentFile=-/etc/default/syslog-ng
EnvironmentFile=-/etc/sysconfig/syslog-ng
StandardOutput=journal
StandardError=journal
Restart=on-failure
[Install]
WantedBy=multi-user.target
Este é o arquivo de serviço padrão fornecido pela instalação do syslog-ng. O arquivo / etc / default / syslog-ng env contém apenas comentários. O / etc / sysconfig / syslog-ng não existe no meu sistema.
Aqui está o código real que faz a chamada do chown:
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
msg_info("opening stream socket");
return 1;
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, s_filename);
if (bind(sock, (struct sockaddr*)&server, sizeof(struct sockaddr_un))) {
msg_info("binding stream socket");
return 1;
}
if (chmod(s_filename, 0770) == -1) {
int errsv = errno;
msg_info("Chmod fail", evt_tag_int("Errno", errsv));
return 1;
}
if (chown(s_filename, -1, gid) == -1) {
int errsv = errno;
char * error_msg = strerror(errsv);
msg_info("Chown fail", evt_tag_int("Errno", errsv), evt_tag_str("Error Msg", error_msg));
return 1;
}
Observe que isso ocorre com arquivos também (não é um problema de soquete de domínio unix). Estou executando isso no atual Ubuntu Server 16.04 na AWS (ami-759bc50a, caso você esteja interessado). Alguém pode esclarecer o que está acontecendo aqui?
Tags permissions systemd chown