SELinux 문제 해결
이 장의 마지막 내용으로 SELinux 에서 서비스나 프로그램이 제대로 동작하지 않을 때 확인 방법과 해결 방법에 대해서 정리해 보자.
로그 분석
프로그램이나 서비스가 제대로 동작하지 않을 때 사용자들은 매우 당황하기 마련이다. 특히 SELinux는 차단한 어플리케이션에게 자세한 에러 메시지를 전달하지 않고 차단 로그는 별도의 로그로 저장한다.
이는 자세한 에러 메시지가 전달되면 공격자가 이 내용을 참고하여 공격시 악용할 수 있기 때문이다.
이는 반대로 어떤 파일에 SELinux 가 로그를 남기는지 모르면 원인 파악 단계부터 어려움에 부딪힐 수 있다. 시스템의 로그를 확인하여 SELinux 의 차단 메시지를 확인해 보자. 시스템의 로그 데몬에 따라 로그 파일이 약간 달라질 수 있으므로 다음 내용을 참고하자.
- auditd 사용
/var/log/audit/audit.log 에 SELinux 로그가 남게 된다. audit.log 에는 SElinux 뿐만 아니라 사용자 로그인/로그오프, 데몬 시작/종료등 중요한 시스템의 감사 이력이 저장되게 된다. - rsyslogd 사용
auditd 를 사용하지 않고 rsyslogd 를 사용할 경우 시스템의 모든 로그 메시지가 남는 파일인 /var/log/messages 에 남게 된다. - setroubleshootd 사용
audit.log 에는 감사 이력이 저장되며 SELinux 의 에러 메시지는 사용자 친화적으로 번역되어 /var/log/messages 에 남게 된다.
이제 SELinux 의 로그 파일을 찾았으면 로그를 확인할 차례이다. 로그 파일에는 SELinux 가 차단한 명령어와 에러 상황이 기록되어 있지만 다른 프로그램이나 데몬이 남기는 로그도 같이 포함되어 있을수 있다. 그러므로 grep 으로 로그 파일에서 SELinux 관련 로그를 뽑아 내려면 로그 패턴을 알아야 한다. audit.log 와 messages 에 남는 SELinux 의 에러 로그 형식은 약간 다르다. 다음 명령어로 로그 파일에서 필요한 내용을 필터링할 수 있다.
# grep "SELinux is preventing" /var/log/messages
# grep "type=AVC" /var/log/audit/audit.log
grep 을 사용하여 매번 각각의 로그 파일에서 필터링 하는게 번거로울 수 있다. audit 로그를 분석해 주는 유틸리티인 aureport 를 사용하면 SELinux 의 에러 로그를 좀 더 간편하게 확인할 수 있다.
aureport 에 -a 옵션을 주고 실행하면 SELinux 의 audit 로그만 뽑아서 출력해 준다.
너무 많은 로그가 출력된다면 -ts 옵션을 사용하여 특정 기간의 로그만 출력할 수 있다. -ts 옵션 뒤에는 "2014년 03월15일"(LANG 변수가 ko_KR.UTF-8 일 경우) 와 같이 시작 날자를 지정할 수 있다.
LANG 변수가 C나 en_US 등의 영어로 설정 되어 있다면 날자를 06/15/2014 처럼 로캘에 맞게 입력해야 한다. 다음은 3월 10일 이후에 발생한 로그를 출력한다.
# auport -a -ts "2014년3월10일" AVC Report ======================================================== # date time comm subj syscall class permission obj event ======================================================== 1. 2014년 06월 16일 00:18:47 httpd unconfined_u:system_r:httpd_t:s0 4 file getattr unconfined_u:object_r:var_t:s0 denied 534 2. 2014년 06월 16일 00:18:47 httpd unconfined_u:system_r:httpd_t:s0 6 file getattr unconfined_u:object_r:var_t:s0 denied 535
또는 this-week, this-month, yesterday, now 등의 단어를 사용할 수도 있다. 자세한 내용은 aureport 의 매뉴얼 페이지를 참고하자.
로그가 제대로 남지 않았거나 SELinux 때문인지 잘 모르겠다면 permissive 모드로 변경하여 SELinux 가 차단하지 않게 설정후 상황을 재연해 본다.
모드 변경후 정상 동작한다면 SELinux 때문이므로 이제 해결 단계로 넘어가자.
해결 단계
SELinux 가 차단하는 경우는 주로 다음과 같은 경우이다.
잘못된 보안 컨텍스트
설정이 잘못되어 SELinux 의 보안 정책을 위반하면 제대로 동작하지 않는다.
주로 하는 실수는 파일이나 디렉터리에 보안 컨텍스트를 잘못 설정하는 것이다. 보안 컨텍스트는 restorecon, chcon 명령어를 이용하여 복구할 수 있다. 어떤 컨텍스트를 설정해야 할 지 잘 모르겠다면 전 절에서 설명한 matchpathcon 명령어를 사용하여 경로에 맞는 보안 컨텍스트를 확인할 수 있다.
보안 정책으로 인한 기능 차단
기본적으로 아파치 httpd 는 sendmail 이나 postfix 같은 메일 서버에 연결이 차단되어 있다. 웹서버를 해킹해서 스팸 메일을 보내는 경우가 많기 때문인데 이 사실을 모를 경우 PHP 같은 웹서버에서 동작하는 스크립트 언어로 개발하는 경우 PHP 에서 Email 을 전송할 수가 없게 된다. 다음과 같이 setsebool 명령어로 해당 불린을 허용하여 문제를 해결할 수 있다.
# setsebool -P httpd_can_sendmail on
허가되지 않은 네트워크 포트
전절에서 semanage 유틸리티 부분에서 설명했듯이 아파치 httpd 는 웹서비스용 포트인 80, 443과 tomcat 이 사용하는 포트인 8009, 8443 등의 포트만 연결할 수 있다. 이는 아파치가 해킹당해도 이를 이용해 다른 서버로 침입할 수 없게 한다.
아파치 httpd 를 80, 443이 아닌 포트에서 띄우거나 tomcat 을 일반적이 아닌 포트에 띄우고 아파치 httpd 에서 연결할 경우 SELinux 에서 차단하므로 사용하려는 포트가 허가된 포트인지 확인해 봐야 한다.
전 절에서 설명한 semanage 명령어로 허가된 포트를 확인하고 없다면 추가해 주자.
SELinux 보안 정책 버그
SELinux 보안 정책은 유연하게 설정할 수 있게 모듈화되어 있고 selinux-policy, selinux-policy-targeted 라는 패키지명으로 제공되고 있다.
보안 정책도 버그가 있을수 있고 이로 인해 차단당할수 있으며 또는 새 버전의 어플리케이션에 추가된 기능이 SELinux 의 정책에 반영되지 않아서 발생할 수도 있다. 보안 정책도 주기적으로 업데이트가 출시되므로 yum 으로 패키지 업데이트를 하면 해결될 수 있다. RHEL 사용자라면 레드햇의 기술 지원을 받아서 해결하는 것도 좋은 방법이다.
서비스 데몬이 SELinux 를 제대로 지원하지 않음
RHEL이나 CentOS 에 탑재된 서비스 데몬들은 SELinux 에 맞게 수정되어 이상없이 동작하고 있고 많은 써드파티 제품들이 SELinux 에서 잘 동작하지만 수정되지 않은 제품이 있을 수 있다. 사용하는 프로그램이 SELinux 에서 문제가 된다면 개발사에 수정을 요청할 수 밖에 없다.
수정되는 동안 SELinux 를 끄지 말고 문제가 되는 프로세스만 SELinux 에서 제한없이 실행되게 설정하는 방법을 권장한다. 이렇게 수정하려면 chcon 으로 데몬 프로세스에 unconfined_exec_t 보안 컨텍스트를 부여하면 SELinux 가 프로세스의 권한을 제한하지 않는다.
# chcon -t unconfined_exec_t /usr/sbin/httpd
해킹 시도
데몬 프로세스의 취약점이나 잘못된 설정을 이용하여 해킹 시도중이라 SELinux 에 의해 차단당할 수 있다. SELinux 를 쓰는 가장 중요한 목적이고 기대하는 결과이다. 로그를 보고 원인을 파악하고 방화벽으로 차단하는등의 사후 조치를 수행하면 된다.
마치며
SELinux 에 대해서 한 장을 할당한 이유는 많은 이들이 SELinux 가 리눅스 사용자를 불편하고 귀찮게 한다고 생각하는 것 같기 때문이다. 모든 컴퓨터가 인터넷에 연결된 요즘 보안은 매우 중요한 부분이고 SELinux 는 우리가 사용하는 리눅스 서버의 믿음직한 보초병이지만 그간 자료가 별로 없어서 많은 이들이 리눅스를 설치하면 SELinux 부터 꺼 버리는게 아닌가 싶어서 이 장을 쓰게 되었다.
이 장을 읽은 독자라면 이제 SELinux 의 개념과 동작 방식에 대해 이해하고 기본적인 사용 방법 및 문제 해결에 대해 어느 정도 자신감이 생겼기를 바래 본다.
SELinux 는 리눅스를 인터넷에 연결하여 서비스 서버로 사용하고자 한다면 반드시 켜 놓고 사용해야 하는 커널의 중요 기능이라는 점을 알고 SELinux 의 강력한 시스템 보호 기능으로 우리의 리눅스 서버를 견고하게 만들어 안전하게 활용하기를 바라며 이 장을 마친다.