계속 커지던 로그는 무언가가 그것을 다시 만드는 순간 성장을 멈추고, 오류는 권한이 거부되었다고 말한다. 솔깃한 결론은 로그 파일 자체에 더 많은 권한이 필요하다는 것이지만, 그 파일은 이미 같은 계정으로 쓰기 가능할 수 있다. 기존 이름에 추가하는 것과 새 이름을 만드는 것은 서로 다른 검사이며, 디렉터리를 참조하는 것은 두 번째뿐이다.

추가와 생성은 다른 검사다

기존 파일을 추가용으로 여는 데는 그 파일에 대한 쓰기 액세스와 경로의 모든 디렉터리에 대한 검색 액세스가 필요하다. 파일을 만드는 데는 그것을 담는 디렉터리에 대한 쓰기와 검색이 필요하다. 작업이 그 디렉터리에 이름을 더하기 때문이다. 이름 바꾸기로 파일을 교체하는 것은 두 디렉터리와 그 스티키 비트 규칙에도 영향을 준다.

OperationWhat must permit itTypical failure message
Append to an existing logFile write access, path traversalPermission denied on the file
Create a missing logDirectory write and search accessPermission denied on the path
Rename a replacement into placeBoth directories, plus sticky restrictionsPermission denied or operation not permitted

이미 열린 디스크립터는 네 번째 경우를 더한다. 프로세스는 권한을 버리기 전에 연 쓰기 핸들을 유지한 채, 나중의 신원으로 같은 경로를 다시 여는 데 실패할 수 있다. 성공한 추가와 실패한 생성은 같은 프로세스에 대해 같은 순간에 둘 다 참일 수 있다.

기본 ACL은 상속되며 부여하지 않는다

기본 접두사로 시작하는 항목은 새 객체가 디렉터리로부터 무엇을 상속하는지 설명한다. 그것은 디렉터리 자체에 아무것도 부여하지 않으며, 이미 존재하는 파일의 ACL을 고치지도 않는다.

namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log

액세스 항목을 기본 항목과 분리해서 읽고, 마스크도 읽어라. 전체 권한을 나열하는 이름 있는 항목도 마스크로 제한될 수 있으므로, 실효 주석이 첫 줄의 글자보다 더 중요하다.

구성에 있는 경로가 아니라 확인된 경로를 사용하라. 심볼릭 링크, 마운트 지점 또는 회전된 디렉터리는 실제 파일을 당신이 부여한 권한이 결코 닿지 않는 곳에 둘 수 있다. 먼저 이름 도구로 경로를 따라가고, 그다음 각 단계를 문제의 계정과 비교하라. 최상위 디렉터리를 추측하는 것이 수정이 한 단계 너무 높게 착지하는 방식이다.

그 순간에 누가 쓰는지 확인하라

무엇이든 바꾸기 전에 서비스 유닛, 그 드롭인, 데몬 자체의 계정 설정을 확인하라. 추가하는 프로세스와 다시 만드는 프로세스는 다를 수 있다. 회전 도우미, 상태 기록기, 웹 판독기는 신원을 거의 공유하지 않는다.

root 셸에서 실행한 테스트는 제한된 서비스를 재현하지 않는다, 그리고 서비스가 계속 실패하는 동안 그것은 성공할 것이다. 실패한 작업을 같은 유닛, 같은 계정, 같은 샌드박스 설정 아래에서 재현하라. 그럴 수 없다면 임시 셸로 유닛을 시작하고 그것이 보고하는 신원을 확인하라. 그 밖의 무엇이든 서비스가 아니라 당신의 터미널을 측정한다.

생성이 정말로 필요하다면 기록자에게 전용 로그 디렉터리에 대한 액세스를 주고, 소비자의 읽기 액세스는 분리해 두라. 로깅 호출 하나를 만족시키려고 공유 계정이나 애플리케이션 트리 전체를 쓰기 가능하게 만드는 것은 작은 문제를 큰 문제와 맞바꾸는 일이다.

다시 들이지 않고 회전하라

파일을 다시 만드는 사람이 다음 주기의 소유자와 모드를 결정하므로, 수정을 회전 구성과 조율하라. 다른 계정으로 또는 새 ACL로 만든 대체 파일은 성공적인 수정 후에도 장애를 되살린다.

모드와 그룹을 생성 시에 설정하고 나중에 하지 말며, 다음 추가가 아니라 다음 회전을 검증하라. 추가는 이미 통과한 테스트를 반복할 뿐이다. 회전 도구가 생성 모드 설정을 제공한다면 생성 후 chmod 대신 그것을 사용하라. 생성과 chmod 사이의 간격이 바로 다음 쓰기가 실패할 수 있는 순간이다.

자르기가 그래도 실패하면 권한 추가를 멈춰라

당신이 쓸 수 있는 파일을 자르는 실패는 디렉터리 권한으로 설명되지 않으며, 권한을 더 추가해도 도움이 되지 않는다. 대신 속성과 제한을 보라: 추가 전용 속성은 추가 모드에서만 쓰기를 허용하고, 읽기 전용 마운트나 서비스 샌드박스는 ACL이 허용하는 작업을 거부할 수 있다.

유닛의 파일 시스템 제한과 해당 경로의 마운트 옵션을 확인한 뒤, 실패한 정확한 작업을 재현하라. 한 번도 참조되지 않은 권한을 넓히는 것은 어느 제한이 실제였는지를 숨길 뿐이다. 일회용 유닛에서 한 번에 하나의 제한을 제거하고, 영구적인 변경 전에 되돌려라.

관련 글