chcon 사용법 1편
– SELinux로 인해 발생하는 웹서버의 403 오류 해결을 중심으로 –
SELinux는 강력한 수준의 보안을 위해 명시적으로 허용되지 않은 모든 동작을 차단하는 것이 원칙입니다. 그리고 이 작용으로 차단되는 대표적 동작에는 웹서버(httpd, nginx와 같은)의 파일시스템 접근이 있습니다. 웹서버가 SELinux에 의해 접근이 차단된 파일을 클라이언트가 요청하면, 웹서버로서는 403 에러를 띄울 수 밖에 없습니다. 서버에 있는 파일에 웹서버가 읽기 권한을 가지지 못한 경우 발생하는 상황과 비슷합니다. 그렇다면 이런 상황에서 어떻게 해야 웹서버가 파일에 접근할 수 있도록 될까요?
인터넷에 존재하는 몇몇 글들은 이런 상황에서 SELinux를 끌 것을 권하기도 합니다. SELinux는 절대 비활성화하면 안됩니다!!!!!!! 프로그램이 작동하지 않는다고 PC의 안티바이러스를 끄라는 소리와 똑같은 미친 소리이니 간단하게 무시하는 것이 좋습니다. 안티바이러스로 인해 프로그램이 작동하지 않는다면, 어디서 충돌이 발생하는지 원인을 찾아서 해결해야지, 그런 간단한 미봉책으로 넘어가려고 했다가는 나중에 분명히 큰코 다칠 것입니다. 여기서도 똑같으니, SELinux를 비활성화하지 말고 원인을 파악해 해결해 보도록 합시다.
SELinux는 context 기반으로 권한 관리를 합니다. 이 context라는 것은 쉽게 말해서 파일에 달리는 태그 같은 것입니다. 그리고 이 context는 파일의 소유자를 chown 명령어로 변경하는 것처럼, chcon 명령어로 변경할 수 있습니다. 그리고 파일에 달린 context는 ls -Z명령어로 확인할 수 있습니다. 다음은 ls -Z 명령어 사용의 예시입니다.
# nginx static file location
[user@localhost nginx]$ ls -Z
system_u:object_r:httpd_sys_content_t:s0 html
system_u는 유저(user)에 관한 context, object_r은 역할(roll)에 관한 context, httpd_sys_content_t는 유형(type)에 관한 context 입니다. 그리고 유형의 경우, 기본적으로 새로 생성된 파일과 디렉터리는 상위 디렉터리의 SELinux 유형을 상속받게 됩니다. 위 예시의 html 디렉토리의 모든 하위 디렉토리 및 파일은 별다른 조치가 없는 한 httpd_sys_content_t 유형을 가지게 됩니다.
현 상황에서 우리가 주목해야할 부분은 httpd_sys_context_t 입니다. 만약, 권한에는 문제가 없음에도(nginx 유저가 read 권한을 갖고 있는 상황), 웹 브라우저로 접속했을 때 403 오류가 발생한다면, 십중팔구는 명령어 실행 결과가 다음과 같을 것입니다.
[user@localhost nginx]$ ls -Z
system_u:object_r:default_t:s0 html
default_t 부분은 다를 수도 있으나 httpd_sys_content_t 가 아니라면 발생하는 일은 똑같습니다. SELinux는 파일 context가 httpd_sys_content_t 가 아닌 파일에 웹서버가 접근하는 것을 허용하지 않습니다. 보안상 당연한 일인데, httpd이던 nginx이건간에 두 웹서버 모두 접근할 수 있는 위치에 파일이 있고, 그 파일을 클라이언트가 요청한다면 기본적으로 보내려고 시도하기 때문입니다. SElinux는 클라이언트가 접근하면 안 되는 파일을 요청해서 받아보는 것을 막는 최후의 보루라고 할 수 있는 것입니다(실제로 SELinux의 context 체크는 파일 소유자 및 rwx 권한 확인 이후에 이루어진다).
뭐 최후의 보루고 자시고, 일단 저 디렉토리는 웹서버가 접근할 수 있어야 하는게 정상입니다. 어떻게 chcon 으로 context를 변경하는지 알아봅시다. 매우 간단합니다.
sudo chcon -R -t httpd_sys_content_t html
-t 옵션은 context 중 유형(type)을 변경하겠다는 것이고, 여기서는 html이 디렉토리이므로 추가적으로 -R 옵션을 사용해야 합니다. 파일 하나만 변경하는 경우에는 -R 옵션이 없어도 무방합니다.
뭔가 문제가 생긴 경우, restorecon 명령어를 통해 context를 원래대로 복구할 수 있습니다. -v 옵션은 자세하게 표현(verbose) 하도록 하는 옵션입니다. 없어도 작동은 하나, 명색이 복구 작업인데 뭐가 어떻게 돌아가는지 자세히 들여다 보는 편이 당연히 좋겠습니다.
restorecon -v html
이로써 SELinux에서 마주하는 웹서버의 권한 문제를 해결할 수 있게 되었습니다. chcon의 다른 활용법에 대해서는 기회가 된다면 다른 포스트에서 다뤄볼까 하는데, 솔직히 여기서 언급한 문제 말고 chcon을 쓸 일이 그렇게 많을까 싶기는 합니다. 기회가 된다면 다뤄보도록 하겠습니다.