5분마다 실행되는 Golang 바이너리가 있습니다. 쓰기 제한이 필요한 텍스트 파일을 생성하고 업데이트해야 합니다. 이 바이너리를 실행하기 위해 systemd 서비스와 systemd 타이머 장치를 만들었습니다. 시스템 서비스는 DynamicUser를 사용합니다. 액세스 제한을 구현하기 위해 CacheDirectory
systemd에서 지시문을 사용하여 DynamicUser만 파일에 쓸 수 있도록 하고 사용자가 존재하는 동안에만 파일이 존재하도록 했습니다. 또한 CacheDirectoryMode=644
쓰기 액세스 권한이 있는 소유자만 허용하도록 설정됩니다.
systemd 서비스가 실행 중일 때 실패합니다.
failed to read output file: lstat /var/cache/monitor/output_file.txt: permission denied>
질문:서비스 단위가 동적 사용자를 생성하고 파일을 생성/업데이트/읽는 실행 파일을 실행하더라도 systemd 서비스가 실행되는 동안 파일을 읽으려고 하면 실행 파일 자체가 거부되는 이유는 무엇입니까?
file-monitor.go는 /usr/local/bin/file-monitor 바이너리 파일을 컴파일하고 생성합니다.
package main
import (
"fmt"
"os"
)
function foo() {
var outputFile = os.Getenv("CACHE_DIRECTORY") + "/output_file.txt"
outputFileBytes, err := os.ReadFile(outputFile)
if err != nil {
return fmt.Errorf("failed to read output file %s: %v\n", outputFile, err)
}
}
function main() {
foo()
}
파일 업데이터.서비스
[Unit]
Description="description"
After=file-updater.service
[Service]
DynamicUser=yes
User=monitor
Group=monitor
CacheDirectory=monitor
CacheDirectoryMode=644
ExecStart=/usr/local/bin/file-monitor <arg1>
Type=oneshot
[Install]
WantedBy=multi-user.target
답변1
CacheDirectoryMode=644
이를 통해 디렉토리 목록을 읽을 수 있습니다. 이 디렉터리 목록의 파일과 상호 작용하지 마십시오. eXecute 비트는 디렉터리의 경로를 더 탐색하고 파일에 액세스하는 데 필요합니다. 이는 사용자에게 쓰기 액세스 권한을 부여합니다.감시 장치그건 소용 없어.
이 매개변수를 다음과 같이 수정합니다.
CacheDirectoryMode=755
이는 기본값입니다(예: 이 매개변수를 제거할 수 있음). 이제 사용자가 읽거나 쓸 수 있도록 이 디렉터리의 파일에 대한 액세스가 허용됩니다.감시 장치.
이 동작은 다음에서 연결됩니다.체계문서(RuntimeDirectoryMode=, StateDirectoryMode=, CacheDirectoryMode=, LogsDirectoryMode=, ConfigurationDirectoryMode=) 매뉴얼에path_resolution(7)
여기에는 기본 Unix 액세스에 대한 모든 세부 정보가 포함됩니다. 특히2단계: 길을 따라 걷기그리고허용하다절:
프로세스에 현재 조회 디렉터리에 대한 검색 권한이 없는 경우, EACCES 오류("권한 거부")를 반환합니다.
사용된 3가지 중, 첫 번째는 읽기 권한을 결정하고 두 번째는 쓰기 권한을 결정합니다.마침내일반 파일의 경우 실행 권한 또는디렉토리 검색 권한.