web-dev-qa-db-ja.com

非rootユーザーがサービスを再始動できるようにする

背景:

Spring-bootを使用してmyappというアプリを作成しました。自己実行可能なjarファイルで構成され、systemdサービスと互換性があります。今、私はそれをジェンキンスと統合しようとしています。

欲しいもの:

ジェンキンスができるようにしたい:

  • サービスを停止します。
  • 瓶を交換してください。
  • サービスを再起動します。

問題:

これまでは、sudoerのみがサービスを開始/停止できます。私はジェンキンスがsudoerであることを望まない(それは乱雑に見える)。

現在の構造:

/home/myappフォルダを持つユーザーmyappを持っています。生成されたjarはmyappと呼ばれ、/home/myappに配置されます。ユーザーmyappは、生成されたjarの所有者です。

myapp@myserver:~/backend$ ll
total 53900
drwxrwxr-x 2 myapp myapp     4096 Apr 25 17:09 ./
drwxr-xr-x 6 myapp myapp     4096 Apr 25 17:08 ../
-rw-rw-r-- 1 myapp myapp      511 Apr 20 16:13 application.properties
-rwxr--r-- 1 myapp myapp 55175294 Apr 20 19:06 backend-1.0-SNAPSHOT.jar*
lrwxrwxrwx 1 myapp myapp       24 Apr 20 19:20 myapp -> backend-1.0-SNAPSHOT.jar*
-rw-r--r-- 1 myapp myapp      179 Apr 20 19:26 myapp.service

Jenkinsがmyapp@myserverとしてログを記録できるように、sshキーを配置しました。

myappはjarの所有者なので、ユーザーmyappsystemctl start/stop myappを呼び出すことができるオプションがあると思います。実際、systemctl status myappを呼び出すことはできますが、start/stopを呼び出すことはできません(rootパスワードが要求されます)。

助言がありますか?

27

Sudoは進むべき道です。新しいグループ(appadminなど)を作成し、jenkinsユーザーをそのグループに入れ、visudoを使用して、コマンドの限定リストを含む新しいエントリを追加します。次に例を示します。

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) MYAPP_CMNDS

appadminグループが最初にパスワードを入力せずにサービスを操作できるようにしたい場合(たとえば、ユーザーがSSHキーでのみ認証される場合に便利です)、

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
26
brent