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가 비활성화됩니다.

추신: 누구든지 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

  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

관련 정보