본문 바로가기

STUDY/ECT

Nginx | 로그 경로 바꾸기 + permission denied

로그 경로를 바꾸는 설정은 간단하다. conf파일에서 설정해주면 되고, 각 서버 블록 안에 넣으면 서버별로 따로 로그가 생성된다.

server {
    access_log /foo/bar/access.log;
    error_log /foo/bar/error.log;
}

참고로 Nginx 기본 로그 경로는 /var/log/nginx다.



SELinux를 사용할 때는 아래와 같은 permission dined가 발생할 수 있다.

[emerg] ... : open() "/foo/bar/access.log" failed (13: Permission denied)

SELinux도 로그를 남긴다. /var/log/audit/audit.log경로에서 친절하게 찍어주고 있었다..

# tail /var/log/audit/audit.log

해당 에러 로그를 발견하면, msg=audit(...)의 괄호 안에 있는 message code로 audit2why커맨드를 사용할 수 있다.

# grep [message code] /var/log/audit/audit.log | audit2why

그럼 쭉 어떤 권한이 없는지 설명해준다. 약간 내용을 수정했지만, 해석하면 http에게 로그경로에 write권한이 없다고 뜬다.

# grep [message code] /var/log/audit/audit.log | audit2why
type=AVC msg=audit([message code]): avc:  denied  { write } for  pid=23654 comm="nginx" name="[로그 경로]" dev="dm-7" ino=515 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:etc_runtime_t:s0 tclass=dir permissive=0

    Was caused by:
        Missing type enforcement (TE) allow rule.

        You can use audit2allow to generate a loadable module to allow this access.

semanage를 이용해 권한을 추가해주면, 정상적으로 Nginx가 작동한다.

# semanage fcontext -a -t httpd_sys_rw_content_t "/foo/bar(/.*)?"
# restorecon -Rv /foo/bar

reference