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
文字通り読み取り専用でマウント:
ブール引数または特殊値「full」または「strict」を使用します。 trueの場合、このデバイスを呼び出すプロセスは/usr/およびブートローダディレクトリ(/bootおよび/efi)を読み取り専用でマウントします。 "full" に設定すると、/etc/ ディレクトリも読み取り専用でマウントされます。
pidfileをプロセスの書き込み可能な場所に移動するか、ProtectSystem=full
サービスファイルからオプションを削除する必要があります。
systemd
あなたは、あなたが使用している目的がわからない他のサービスオプションを確認する必要があります。設定に問題を引き起こす可能性がある他の多くの制限があります。
答え2
vault
これは、プロセスを開始、フォーク、マスターPIDを保存して終了するスクリプトのように見えます./pidfile
。
まず、これは昔ながらの分岐スクリプトです。ですから、あなたType=forking
に仕えなければなりません。初期vault
プロセスが終了すると、systemdは停止または失敗したサービスを検出するのではなく、他のプロセスを追跡する必要があることに気付くでしょう。
しかし、まだここまでは届いていないので、今の問題ではありません。
即時の問題は、このプログラムが次の理由で./pidfile
作成しようとしているようです。/etc/vault.d/pidfile
/etc
ほぼ常に読み取り専用- PIDFileは実際には構成ではありません。
/run
または に属する状態です/var
。
だから私たちはそれが実際にどこを見てファイルを生成しようとしているのかを考えなければなりません。エラーメッセージは次のとおりです./pidfile
。デフォルトでは、systemdシステムサービスの作業ディレクトリはです/
。だから./pidfile
決めました/pidfile
。そこには書き込み権限がありません。
WorkingDirectory=%t
作業ディレクトリを/run
(またはWorkingDirectory=%T
個人ディレクトリに)設定するために使用されます/tmp
。サービスに書き込みアクセス権が必要です。
最後に、systemd
基本PIDを追跡するためのヒントを使用(または)提供することを検討してください。PIDFile=%t/pidfile
PIDFile=%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