chcon 사용법 1편

NTKN 

– 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을 쓸 일이 그렇게 많을까 싶기는 합니다. 기회가 된다면 다뤄보도록 하겠습니다.

Recommended Posts

XMRig로 Raspberry Pi 4에서 모네로 채굴하기

모네로라는 암호화폐를 들어본 적이 있을지 모르겠습니다. 프라이버시 보호에 집중한 암호화폐로, 트랜젝션에서 익명성이 보장되기 때문에, 어떤 지갑에서 어떤 지갑으로 얼마가 송금되었는지 투명하게 공개되는 다른 암호화폐와는 다르게 강한 익명성을 가지는 것이 특징입니다. 이러한 익명성 특징으로 인해 대한민국 등 주요 국가에서는 법률로 법정화폐와 거래가 가능한 거래소에서의 모네로 거래를 금지하고 있습니다. 이 포스트에서는 모네로의 이러한 익명성보다는 또다른 특징인 CPU […]

NTKN 

마인크래프트 모드 다이제스트 1부 1편

마인크래프트의 그래픽 최적화 개요 마인크래프트는 매우 거지같은 최적화를 자랑합니다. 개발진의 개발력을 규탄하거나 조롱하는 것은 아니고, 기본적으로 초기에는 Java로 1명이 개발하던 게임임을 고려하면 현재의 최적화 수준도 힘든 길을 지나온 것이긴 하지만 객관적으로 그렇단 이야기입니다. 마인크래프트는 LWJGL(LightWeight Java Game Library)로 개발된 게임입니다. 유니티나 언리얼과 같은 메이져 게임 엔진도 아닐 뿐더러, Java 언어 특성상 JVM이라는 가상 머신 위에서 […]

NTKN 

마인크래프트 모드 다이제스트 1부 프롤로그

마인크래프트 모드 다이제스트 1부 – 최적화와 편의성 모드를 중심으로 – 들어가며… 모드(Mod)란 무엇일까요. Modification, 변경이라는 뜻입니다. 말 그대로 게임의 일부분을 변경하는 것인데, 이런 변경이라고 하면 보통은 컨텐츠 추가를 먼저 떠올리기 쉬우나, 최적화나 편의성 패치도 게임의 일부를 변경함으로써 달성하는 것이므로 모드라고 할 수 있겠습니다. 이 포스트 시리즈 연재에서 다룰 내용은 마인크래프트 모드들에 관한 내용입니다. 제목을 모드 […]

NTKN 

Leave A Comment