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가 비활성화됩니다.
추신: 누구든지 Vault AGENT(루트 아님)에 대해 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