SELinux Boolean

SELinux boolean 이란?

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


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

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


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

$ getsebool httpd_can_sendmail


httpd_can_sendmail --> off
웹 서버의 메일 전송 허용 여부

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

$ getsebool -a | getsebool -a | egrep "httpd(.*)sendmail"


httpd_can_sendmail --> off
모든 불린 출력


SELinux boolean 설정

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


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

<?php
 
mail('user@example.com', 'Subject', 'Message Body');
mailtest.php

독자의 서버에 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 방식으로도 메일 전송이 가능하게 설정합니다.

$ sudo setsebool httpd_can_sendmail true
불린 설정 on


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


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

$ sudo setsebool -P httpd_can_sendmail true
불린 설정 유지

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

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