systemd/service ユーザーは、シェルの同じユーザーと同じ権限/権限を持っていません。

systemd/service ユーザーは、シェルの同じユーザーと同じ権限/権限を持っていません。

Hashicorp Vault Agentをシステムサービスとして設定しようとしています。ユーザー資格情報のコレクションを使用してエージェントを手動で実行できます。

おそらくこれは重要です:これはこのユーザーの/ etc / passwdです:

vault:x:994:989::/home/vault:/bin/false

sudo su -s /bin/bash vaultでは、金庫会議に行くにはどうすればよいですか?

それを念頭に置いて、私はそれをすることができ、vault agent -config=<pathToConfig>それはうまくいきます。

これで/usr/lib/systemd/system/vault-agent.service設定しました。

[Unit]
Description="HashiCorp Vault - A tool for managing secrets"
Documentation=https://www.vaultproject.io/docs/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/vault.d/vault.hcl

[Service]
User=vault
Group=vault
ProtectSystem=full
ProtectHome=read-only
PrivateTmp=yes
PrivateDevices=yes
SecureBits=keep-caps
AmbientCapabilities=CAP_IPC_LOCK
Capabilities=CAP_IPC_LOCK+ep
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
NoNewPrivileges=yes
ExecStart=/bin/vault agent -non-interactive -config=/etc/vault.d/agent-config-prod.hcl
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGINT
Restart=no
RestartSec=5
TimeoutStopSec=30
StartLimitIntervalSec=60
StartLimitBurst=3
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

これは私が何度も見つけたサービスconfです。

しかし、常に同じ問題があります。Error storing PID: could not open pid file: open ./pidfile: permission denied

私はExecStart =を/ bin / whoamiに置き換えようとしました。はい、実際にVaultであることを確認するためでした。 ./pidfileの権限と場所(デフォルトのインストール場所):

/etc/vault.d/pidfile

drwxr-xr-x. 108 root root  8192 May 15 16:32 etc
drwxr-xr-x   3 vault vault     113 May 15 17:43 vault.d
-rwxrwxrwx 1 vault vault   0 May 15 17:48 pidfile #not default permission, but I am desesperate.

sudoコマンドは本当に疑わしいですsu -s /bin/bash vault。おそらくVaultユーザーにさらに権限を与えることもできます。それでは、これを私のサービスにどのように統合できますか?

毎回 systemctl reload デーモンを実行し、SELinux が無効になります。

PS:誰もがVault AGENT(rootではない)に対してsystemdを設定する方法への良いリンクがある場合は受け入れます。

編集:情報sudo -s /bin/bash vault

$ sudo -s /bin/bash vault
/bin/vault: cannot execute binary file
$ su -s /bin/bash vault
Password: (and I have no password or I don't know it)

だから私は完全なsudo su -s /bin/bash vaultコマンドを使用します。

答え1

オプションProtectSystem=full/etc文字通り読み取り専用でマウント:

ブール引数または特殊値「fu​​ll」または「strict」を使用します。 trueの場合、このデバイスを呼び出すプロセスは/usr/およびブートローダディレクトリ(/bootおよび/efi)を読み取り専用でマウントします。 "full" に設定すると、/etc/ ディレクトリも読み取り専用でマウントされます。

pidfileをプロセスの書き込み可能な場所に移動するか、ProtectSystem=fullサービスファイルからオプションを削除する必要があります。

systemdあなたは、あなたが使用している目的がわからない他のサービスオプションを確認する必要があります。設定に問題を引き起こす可能性がある他の多くの制限があります。

答え2

vaultこれは、プロセスを開始、フォーク、マスターPIDを保存して終了するスクリプトのように見えます./pidfile

まず、これは昔ながらの分岐スクリプトです。ですから、あなたType=forkingに仕えなければなりません。初期vaultプロセスが終了すると、systemdは停止または失敗したサービスを検出するのではなく、他のプロセスを追跡する必要があることに気付くでしょう。

しかし、まだここまでは届いていないので、今の問題ではありません。

即時の問題は、このプログラムが次の理由で./pidfile作成しようとしているようです。/etc/vault.d/pidfile

  1. /etcほぼ常に読み取り専用
  2. PIDFileは実際には構成ではありません。/runまたは に属する状態です/var

だから私たちはそれが実際にどこを見てファイルを生成しようとしているのかを考えなければなりません。エラーメッセージは次のとおりです./pidfile。デフォルトでは、systemdシステムサービスの作業ディレクトリはです/。だから./pidfile決めました/pidfile。そこには書き込み権限がありません。

WorkingDirectory=%t作業ディレクトリを/run(またはWorkingDirectory=%T個人ディレクトリに)設定するために使用されます/tmp。サービスに書き込みアクセス権が必要です。

最後に、systemd基本PIDを追跡するためのヒントを使用(または)提供することを検討してください。PIDFile=%t/pidfilePIDFile=%T/pidfile


私が疑うのは、/bin/vaultいくつかの環境変数を設定し、プログラムを実行し、ロギングを設定し、分岐し、次のようにpidfileを保存するスクリプトです。

IMPORTANT_VAR="important value"
/usr/lib/vault $@ | rotatelog /var/log/vault.log &
echo $! > ./pidfile

これ以上プロセスを分岐する必要はありません。これらの操作はすべて、より標準的な方法でsystemdに委任できます。ほぼ同等のアプローチは、デフォルト値を活用しType=simpleてプロセスを直接呼び出すことです。

[Service]
Environment=IMPORTANT_VAR="important value"
ExecStart=/usr/lib/vault agent -non-interactive -config=/etc/vault.d/agent-config-prod.hcl

関連情報