Linux 환경에서 Apache 를 위한 SELinux 파일 컨텍스트 관리

CompTIABeginner
지금 연습하기

소개

이 실습에서는 Apache 웹 서버와 같은 서비스가 필요한 파일에 접근할 수 있도록 SELinux 파일 컨텍스트를 관리하는 방법을 배웁니다. 보안 강화 리눅스 (SELinux) 가 파일에 '컨텍스트'라고 불리는 보안 레이블을 적용하는 방식과, 표준 파일 권한이 올바르게 설정되어 있더라도 컨텍스트가 일치하지 않을 때 어떻게 액세스 거부 오류가 발생하는지 살펴봅니다. 이 실습 경험은 Linux 환경에서 흔히 발생하는 보안 문제를 해결하는 실무 능력을 키우기 위해 설계되었습니다.

실습 과정에서 Apache 를 설치하고, SELinux 가 enforcing 모드인지 확인하며, 올바른 위치에 생성된 웹 페이지의 기본 컨텍스트를 관찰합니다. 그런 다음 잘못된 컨텍스트를 가진 파일을 웹 루트 디렉토리로 이동시켜 의도적으로 "Forbidden" 오류를 발생시킵니다. 이를 해결하기 위해 chcon 명령어를 사용하여 파일의 레이블을 다시 지정함으로써, SELinux 컨텍스트 관련 문제를 해결하고 서비스 기능을 복구하는 핵심적인 방법을 실습합니다.

Apache 설치 및 SELinux 강제 모드 확인

이 단계에서는 먼저 환경이 올바르게 구성되었는지 확인하는 것부터 시작합니다. 여기에는 Linux 커널의 핵심 보안 모듈인 SELinux 가 enforcing 모드에서 실행 중인지 확인하는 작업이 포함됩니다. 그 다음, SELinux 컨텍스트의 작동 방식을 시연하는 데 사용할 Apache 웹 서버를 설치합니다.

먼저 SELinux 의 상태를 확인해 보겠습니다. 상세한 개요를 제공하는 sestatus 명령어를 사용하거나, 현재 상태만 즉시 확인하는 getenforce 명령어를 사용할 수 있습니다.

getenforce를 실행하여 현재 모드를 확인합니다.

getenforce

명령어 결과로 Enforcing이 출력되어야 합니다. 이는 SELinux 가 시스템을 적극적으로 보호하고 있음을 의미합니다.

Enforcing

만약 Permissive가 출력된다면 SELinux 가 경고만 기록하고 동작을 차단하지 않는 상태이며, Disabled라면 SELinux 가 완전히 꺼진 상태입니다. 이 실습을 위해서는 반드시 Enforcing 상태여야 합니다. 현재 실습 환경은 미리 Enforcing 모드로 설정되어 있습니다.

다음으로, CentOS/RHEL 계열 시스템에서 httpd라는 패키지 이름으로 알려진 Apache 웹 서버를 설치합니다. yum 패키지 관리자를 사용하여 설치하며, -y 플래그는 모든 확인 질문에 자동으로 "yes"라고 응답하도록 합니다.

sudo yum -y install httpd

yum이 의존성을 해결하고 패키지를 설치하는 과정이 출력됩니다. 설치가 성공적으로 완료되면 "Complete!" 메시지가 나타납니다.

...
Installed:
  httpd-2.4.x-xx.el8.x86_64
  ...
Complete!

설치가 완료되면 Apache 서비스를 시작하여 실행해야 합니다. systemctl을 사용하여 서비스를 관리합니다.

sudo systemctl start httpd

Apache 서비스가 정상적으로 실행 중인지 확인하려면 상태를 점검합니다.

sudo systemctl status httpd

출력 내용에 서비스가 active (running) 상태로 표시되어야 합니다.

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since ...
   ...

q를 눌러 상태 보기 화면을 종료하고 명령 프롬프트로 돌아갑니다. 이제 다음 단계를 위한 환경 준비가 완료되었습니다.

웹 페이지 생성 및 기본 SELinux 컨텍스트 확인

이 단계에서는 간단한 웹 페이지를 생성하고 방금 설치한 Apache 서버를 통해 서비스해 봅니다. 이 과정을 통해 SELinux 가 정책에 정의된 특정 디렉토리에 생성된 파일에 어떻게 올바른 보안 컨텍스트를 자동으로 할당하여 서비스가 문제없이 접근할 수 있게 하는지 확인합니다.

Apache 의 기본 웹 콘텐츠 디렉토리는 /var/www/html입니다. 파일 권한과 SELinux 컨텍스트가 올바르다면 이 위치에 있는 모든 파일은 웹 브라우저를 통해 접근할 수 있어야 합니다.

/var/www/html 내부에 직접 간단한 index.html 파일을 만들어 보겠습니다. 이 디렉토리는 root 사용자의 소유이므로 파일을 쓰려면 sudo를 사용해야 합니다. 일반적인 sudo echo 명령어와 리다이렉션 (>) 조합은 리다이렉션 처리를 권한이 없는 현재 쉘이 수행하기 때문에 작동하지 않습니다. 이를 해결하기 위해 sudo sh -c '...'를 사용하여 루트 쉘 내에서 명령을 실행할 수 있습니다.

다음 명령어를 실행하여 파일을 생성합니다.

sudo sh -c 'echo "Welcome to Apache on LabEx" > /var/www/html/index.html'

이제 웹 서버가 이 새 페이지에 접근하여 서비스할 수 있는지 확인해 보겠습니다. URL 을 통해 데이터를 전송하는 명령줄 도구인 curl을 사용하여 localhost에 페이지를 요청합니다.

curl http://localhost

터미널에 index.html 파일의 내용이 출력되는 것을 볼 수 있습니다. 이는 Apache 가 정상 작동 중이며 파일을 읽을 수 있음을 확인해 줍니다.

Welcome to Apache on LabEx

그렇다면 왜 이 과정이 아무런 문제 없이 진행되었을까요? 답은 파일의 SELinux 컨텍스트에 있습니다. 파일을 생성할 때 SELinux 는 상위 디렉토리의 정책에 따라 컨텍스트를 할당합니다. ls -Z 명령어를 사용하여 방금 생성한 index.html 파일의 컨텍스트를 검사해 보겠습니다. -Z 옵션은 SELinux 보안 컨텍스트를 보여줍니다.

ls -Z /var/www/html/index.html

출력 결과는 다음과 유사할 것입니다.

system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

이 출력에서 가장 중요한 부분은 컨텍스트 레이블인 system_u:object_r:httpd_sys_content_t:s0입니다. 이 레이블은 사용자:역할:유형:레벨의 네 부분으로 구성됩니다. 이 실습에서 우리가 집중할 부분은 **유형 (type)**인 httpd_sys_content_t입니다.

Apache(httpd) 를 위한 SELinux 정책은 httpd_t 유형으로 실행되는 프로세스가 httpd_sys_content_t 유형으로 레이블이 지정된 파일에 접근하는 것을 명시적으로 허용합니다. 파일을 /var/www/html에 직접 생성했기 때문에 올바른 기본 컨텍스트를 상속받았고, 모든 것이 예상대로 작동한 것입니다.

잘못된 컨텍스트를 가진 파일 이동으로 SELinux 거부 유도

이 단계에서는 잘못된 SELinux 컨텍스트를 가진 파일이 Apache 웹 디렉토리로 이동될 때 어떤 일이 발생하는지 확인합니다. 이는 mv와 같은 파일 작업 시 SELinux 컨텍스트가 어떻게 작동하는지 모를 경우 매우 혼란스러울 수 있는 일반적인 시나리오입니다. 디렉토리에 파일을 직접 생성하는 것 (상위 디렉토리의 기본 컨텍스트를 상속받음) 과 달리, 파일을 이동하면 원래의 컨텍스트가 그대로 유지됩니다.

먼저, 현재 작업 디렉토리인 ~/project에 새로운 웹 페이지 page2.html을 생성합니다.

echo "This is Page 2" > page2.html

이제 이 새 파일의 SELinux 컨텍스트를 확인합니다. 사용자의 홈 프로젝트 디렉토리에서 생성되었으므로 사용자 파일에 할당되는 기본 컨텍스트를 갖게 됩니다.

ls -Z page2.html

출력 결과에는 사용자 홈 디렉토리 파일의 기본값인 user_home_t 또는 이와 유사한 컨텍스트 유형이 표시됩니다.

system_u:object_r:user_home_t:s0 page2.html

유형이 user_home_t인 점에 주목하십시오. 이는 Apache 가 접근하도록 허용된 httpd_sys_content_t와 다릅니다.

이제 mv 명령어를 사용하여 이 파일을 Apache 웹 루트로 이동합니다. 대상 디렉토리인 /var/www/htmlroot 소유이므로 sudo가 필요합니다.

sudo mv page2.html /var/www/html/

mv 명령어는 원본 파일의 SELinux 컨텍스트를 보존합니다. 새 위치에 있는 파일의 컨텍스트를 확인하여 이를 검증해 보겠습니다.

ls -Z /var/www/html/page2.html

보시다시피 컨텍스트가 변경되지 않았습니다. 파일이 이제 /var/www/html 디렉토리에 있음에도 불구하고 여전히 user_home_t입니다.

system_u:object_r:user_home_t:s0 /var/www/html/page2.html

이제 curl을 사용하여 이 새 페이지에 접속해 봅니다. SELinux 가 컨텍스트 불일치로 인해 접근을 차단할 것입니다.

curl http://localhost/page2.html

서버로부터 "403 Forbidden" 오류를 받게 됩니다. 이것은 전통적인 파일 권한 문제가 아닙니다. SELinux 가 보안 정책을 강제하여 httpd 프로세스가 user_home_t 레이블을 가진 파일을 읽지 못하도록 거부하고 있는 것입니다.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /page2.html
on this server.</p>
</body></html>

이는 전형적인 SELinux 문제를 보여줍니다. 다음 단계에서는 파일의 컨텍스트를 변경하여 이 문제를 해결하는 방법을 배웁니다.

chcon 을 이용한 파일 컨텍스트 수정 및 액세스 확인

이 단계에서는 page2.html 파일의 SELinux 컨텍스트를 수동으로 변경하여 이전 단계의 "403 Forbidden" 오류를 해결합니다. 파일 및 디렉토리의 보안 컨텍스트를 수정하는 강력한 도구인 chcon(change context) 명령어를 사용합니다.

chcon 명령어를 사용하면 SELinux 컨텍스트의 사용자, 역할, 유형 또는 레벨을 직접 변경할 수 있습니다. 이 실습에서는 유형만 변경하면 됩니다. Apache 가 읽을 수 있는 웹 콘텐츠의 올바른 유형은 httpd_sys_content_t입니다.

문제를 해결하기 위해 chcon-t 플래그를 사용하여 page2.html의 새 유형을 지정합니다. 파일이 /var/www/html에 위치하므로 컨텍스트를 수정하려면 sudo를 사용해야 합니다.

다음 명령어를 실행하여 page2.html의 SELinux 유형을 업데이트합니다.

sudo chcon -t httpd_sys_content_t /var/www/html/page2.html

명령을 실행했으므로 컨텍스트가 업데이트되었는지 확인해 보겠습니다. 다시 ls -Z를 사용하여 파일의 보안 컨텍스트를 검사합니다.

ls -Z /var/www/html/page2.html

출력 결과에서 유형이 user_home_t에서 httpd_sys_content_t로 변경된 것을 확인할 수 있어야 합니다.

system_u:object_r:httpd_sys_content_t:s0 /var/www/html/page2.html

올바른 SELinux 컨텍스트가 설정되었으므로 이제 Apache 가 파일에 접근하여 서비스할 수 있습니다. curl로 다시 요청을 보내 테스트해 봅니다.

curl http://localhost/page2.html

이번에는 명령이 성공하고 웹 페이지의 내용이 터미널에 출력될 것입니다.

This is Page 2

SELinux 관련 액세스 문제를 성공적으로 진단하고 해결했습니다. 파일을 이동하면 원래 컨텍스트가 유지된다는 점과, chcon을 사용하여 보안 정책에 맞게 컨텍스트를 수동으로 조정함으로써 Apache 와 같은 서비스에 권한을 부여할 수 있다는 점을 배웠습니다. 참고로 chcon으로 변경한 내용은 전체 파일 시스템 레이블 재지정 (relabeling) 시 유지되지 않을 수 있으며, 일반적으로 정책에 정의된 기본 컨텍스트를 적용할 때는 restorecon 명령어를 사용합니다.

요약

이 실습에서는 Apache 웹 서버를 위한 SELinux 파일 컨텍스트 관리 방법을 배웠습니다. 먼저 SELinux 가 Enforcing 모드인지 확인한 후 httpd 서비스를 설치하고 시작했습니다. Apache 웹 루트 (/var/www/html) 내에 직접 생성된 파일에는 Apache 가 정상적으로 접근하고 서비스하는 데 필요한 httpd_sys_content_t 컨텍스트가 자동으로 할당되는 것을 관찰했습니다.

실습의 핵심은 잘못된 파일 컨텍스트가 초래하는 결과를 확인하는 것이었습니다. 사용자의 홈 디렉토리에서 웹 루트로 파일을 이동 (user_home_t 컨텍스트 유지) 함으로써 SELinux 거부를 유도하고 "403 Forbidden" 오류를 발생시켰습니다. 그런 다음 chcon 명령어를 사용하여 파일의 컨텍스트를 올바른 httpd_sys_content_t 유형으로 수동 변경하여 액세스 문제를 해결했습니다. 이를 통해 강제 (Enforcing) SELinux 정책 하에서 서비스가 정상 작동하려면 올바른 파일 컨텍스트가 필수적이라는 원칙을 다시 한번 확인했습니다.