STUDY/ECT
Nginx | 로그 경로 바꾸기 + permission denied
개미606
2022. 3. 25. 14:03
로그 경로를 바꾸는 설정은 간단하다. 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