Configurei o shadowsocks-libev e o executei com o seguinte serviço systemctl:
[Unit]
Description=Shadowsocks-Libev Manager Service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=nobody
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/ss-manager -c /etc/shadowsocks/%i.json
[Install]
WantedBy=multi-user.target
Recentemente, notei que meu arquivo de configuração shadowsocks ( /etc/shadowsocks/manager.json
) tinha permissões globais de leitura, então mudei para 600 e verifiquei se o proprietário era nobody
. Por algum motivo, isso faz com que o processo falhe ao ler o arquivo de configuração ao iniciar.
systemctl start [email protected]
ss-manager[1357]: 2018-01-05 11:41:00 ERROR: Invalid config path.
Este é o mesmo erro que vejo quando revogo todos os privilégios de leitura desse arquivo.
No entanto, funciona bem se eu iniciar shadowsocks usando exatamente o mesmo comando na linha de comando:
sudo -u nobody /usr/bin/ss-manager -c /etc/shadowsocks/manager.json
Da mesma forma, não tenho problemas para ler o arquivo nobody
usando cat
ou less
.
Quando eu verifico o processo iniciado por ele systemctl
, ps
ele mostra que está sendo executado como nobody
, e quando o processo gera arquivos, o proprietário é definido como nobody
. Por que não pode acessar este arquivo? Por que há uma diferença entre executá-lo através do systemctl e executá-lo a partir do terminal?
Meu problema parece semelhante a esta pergunta , mas não tenho aspas em meu ExecStart, portanto essa solução não é aplicável ao meu caso.
Consegui corrigir o problema, que surgiu de algo exclusivo do usuário
nobody
. Ainda não tenho certeza do que torna esse usuário único.Quando executado,
nobody
vejo a seguinte saída no journald:Isso indica que ele não consegue acessar o arquivo de configuração, apesar de ter as permissões necessárias.
Quando executado como um usuário diferente que eu criei recentemente (sem diretório inicial), vejo a seguinte saída no journald:
Isso ocorre porque ele tenta gravar no diretório inicial do usuário, que não existe.
Em seguida, criei um novo usuário nomeado
shadowsocks
com seu próprio diretório inicial:Executando como este usuário, não encontro problemas.