시스템 실행 파일이 CacheDirectory에서 파일을 읽을 수 없으며 권한이 거부되었습니다.

시스템 실행 파일이 CacheDirectory에서 파일을 읽을 수 없으며 권한이 거부되었습니다.

5분마다 실행되는 Golang 바이너리가 있습니다. 쓰기 제한이 필요한 텍스트 파일을 생성하고 업데이트해야 합니다. 이 바이너리를 실행하기 위해 systemd 서비스와 systemd 타이머 장치를 만들었습니다. 시스템 서비스는 DynamicUser를 사용합니다. 액세스 제한을 구현하기 위해 CacheDirectorysystemd에서 지시문을 사용하여 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가지 중, 첫 번째는 읽기 권한을 결정하고 두 번째는 쓰기 권한을 결정합니다.마침내일반 파일의 경우 실행 권한 또는디렉토리 검색 권한.

관련 정보