SELinux boolean 이란?

SElinux 는 보안 정책 설정 편의를 위해 사전에 정의된 규칙 집합들을 갖고 있으며 이 규칙들을 SELinux 불린(Boolean) 이라고 합니다.


예로  아파치 httpd 가 cgi 를 실행할 수 있게 하려면 여러 가지 보안 컨텍스트 설정을 해야 하지만 이런 번거로움을 없애기 위해 이런 과정을 묶어서 httpd_enable_cgi 라는 불린을 제공하고 있으며 true 로 설정하면 SELinux 는 아파치 웹 서버의 cgi 실행을 허용합니다.

보안을 위해 대부분의 불린 설정은 기본 값이 off 이며 현재 설정을 확인하려면 getsebool 명령어를 사용하면 되며 확인하려는 불린명을 주거나 -a 옵션을 줄 경우 모든 불린의 설정 현황을 표시합니다.


아래 명령은 아파치 httpd 가 SMTP 메일 서버에 연결할 수 있는지를 나타내는 불린인 httpd_can_sendmail 의 설정을 확인합니다.

또는 아래와 같이 모든 불린을 출력한 후에 egrep 과 정규식을 활용하여 찾는 방법도 있습니다.


SELinux boolean 설정

기본 설정은 off 이므로 개발 언어를 웹 서버에서 모듈 형식(PHP의 mod_php, python - mod_wsgi)으로  사용할  경우 apache 웹 서버의 권한과 도메인을 상속받게 되므로 작성한 스크립트에서 메일 전송을 할수 없습니다.


이 문제를 재연해 보기 위해 PHP 에서 mail 함수를 사용하여 메일을 전송하는 코드를 작성해 봅시다. mail() 함수의 첫번째 파라미터는 수신자의 이메일 주소이고 두번째는 제목, 세번째는 본문 내용입니다.

독자의 서버에 PHP 인터프리터가 설치되어 있고 mod_php 방식으로 동작한다고 가정한 상황에서 예제입니다.


위 스크립트를 웹 서버의 컨텐츠 경로(예: /var/www/html/mailtest.php) 에 저장한 후에 브라우저를 통해서 호출하면 아파치 웹 서버가 실행하며 httpd_can_sendmail  이 off 이므로 웹 서버의 로그 파일에는 다음과 같은 오류가 남으며 제대로 동작하지 않습니다.

sendmail: fatal: chdir /var/spool/postfix: Permission denied

아파치 웹 서버의 로그 파일은 일반적으로 /var/log/httpd 에 남게 됩니다.


이 문제를 해결하려면 httpd 서버가 메일 서버에 접속할 수 있도록 httpd_can_sendmail   불린을 on 으로 설정해 주면 됩니다.

설정 변경은 setsebool 명령어를 사용하며 설정할 불린명과 1이나 true 또는 0 이나 false 를 지정하여 해당 불린을 활성화/비활성화할 수 있습니다.


아래 명령은 httpd_can_sendmail 를 true 로 설정하여 웹 서버에서 mod_php 방식으로도 메일 전송이 가능하게 설정합니다.


이제 다시 브라우저에서 mailtest.php 에 연결하면 정상 동작하여 메일이 가는 것을 확인할 수 있을 것입니다.


setsebool 명령으로 설정한 불린 값은 지속되지 않으며 서버를 재부팅하면 기본 설정으로 되돌아 오게 됩니다. 부팅시에도 설정한 불린을 유지하려면 -P 옵션(persistant)을 붙여서 실행하면 되며 다음 명령어는 재부팅해도 아파치 웹 서버가 sendmail 서버에 연결할 수 있게 설정합니다.

불린 설명을 위해 웹 서버의 모듈 방식으로 동작할 경우를 예로 들었지만 웹 서버 모듈 방식은 아키텍처 및 보안상 좋은 선택이 아니며 별도의 WAS(php-fpm, tomcat 등)로 구성하고 웹 서버는 리버스 프락시 방식으로 연결하는 것이 보안과 시스템 확장 측면에서 유리합니다.

이에 대해 자세한 설명은 "웹 서버 보안 강화" 장에서 다룹니다.