web-dev-qa-db-ja.com

ExecStartを実行するときに権限がありません

shadowsocks-libev を設定し、次の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

最近、shadowsocksの設定ファイル(/etc/shadowsocks/manager.json)はグローバルな読み取り権限を持っていたので、600に変更し、所有者がnobodyであることを確認しました。何らかの理由で、これにより、プロセスは起動時に構成ファイルの読み取りに失敗します。

systemctl start [email protected]

ss-manager[1357]: 2018-01-05 11:41:00 ERROR: Invalid config path.

これは、そのファイルのすべての読み取り権限を取り消すときに表示されるエラーと同じです。

ただし、コマンドラインからまったく同じコマンドを使用してshadowsocksを起動すると、正常に機能します。

Sudo -u nobody /usr/bin/ss-manager -c /etc/shadowsocks/manager.json

同様に、nobodyまたはcatを使用してファイルをlessとして読み取るのに問題はありません。

systemctlpsによって開始されたプロセスを確認すると、nobodyとして実行されていることが示され、プロセスがファイルを出力すると、所有者はnobodyに設定されます。 。なぜこのファイルにアクセスできないのですか? systemctlを介して実行することと、ターミナルから実行することの間に違いがあるのはなぜですか?

私の問題は この質問 に似ているようですが、ExecStartに引用符がないため、私の場合は解決策が適用されません。

3
Altay_H

ユーザーnobodyに固有の問題に起因する問題を修正することができました。しかし、そのユーザーがユニークである理由はまだ完全にはわかりません。

nobodyとして実行すると、journaldに次の出力が表示されます。

Started Shadowsocks-Libev Manager Service.
ERROR: Invalid config path.
Main process exited, code=exited, status=255/n/a
Failed with result 'exit-code'.

これは、必要な権限があるにもかかわらず、構成ファイルにアクセスできないことを示しています。

新しく作成した(ホームディレクトリなしで)別のユーザーとして実行すると、代わりに次の出力がjournaldに表示されます。

Started Shadowsocks-Libev Manager Service.
ERROR: mkdir: No such file or directory
ERROR: unable to create working directory
Main process exited, code=exited, status=255/n/a
Failed with result 'exit-code'.

これは、存在しないユーザーのホームディレクトリに書き込もうとするためです。

次に、独自のホームディレクトリを持つshadowsocksという名前の新しいユーザーを作成しました。

# useradd -m -s /usr/bin/nologin shadowsocks

このユーザーとして実行していると、問題は発生しません。

1
Altay_H