SELinux 의 컨텍스트(context) 다루기

mv 를 사용하여 부여된 파일을 수정하려면 여러 가지 방법이 있으며 가장 쉬운 방법중 하나는 보안 컨텍스트를 수정하는 명령어를 사용하여 적절한 보안 컨텍스트를 부여하는 것입니다.

레드햇과 리눅스 커뮤니티의 노력으로 SELinux 를 쉽게 사용하기 위해 많은 유틸리티가 개발되어 탑재되어 있으며 그중에서도 컨텍스트를 다루는 유틸리티 사용법에 대해서 알아 봅시다.


chcon

chcon 은 change context 의 약자로 객체의 보안 컨텍스트를 직접 지정할 수 있는 명령어이며 지정할 적절한 보안 컨텍스트를 알아야 하므로 SELinux 에 경험많은 사용자에게 유용합니다. 여러 가지 옵션이 있지만 가장 많이 사용되는 것은 재귀적으로 처리하는 -R 옵션과 타입을 지정하는 -t  옵션입니다.



이전 절에서 mv 로 파일을 이동해서 타입이 잘못 지정된 경우 다음과 같이 httpd_sys_content_t 타입을 지정해서 문제를 해결할 수 있습니다.

$ sudo chcon -R -t httpd_sys_content_t /var/www/html/hello.html
chcon 으로 처리



restorecon

cp 로 /var/www/html 에 복사했을 경우 웹 서버가 읽을 수 있도록 자동으로  httpd_sys_content_t 타입이 설정되는 것은 cp 명령이 사전 탑재된 SELinux 의 보안 정책을 참고하여 복사될 위치에 맞게 타입을 설정해 주기 때문입니다.


restorecon 명령어는 직접 보안 컨텍스트를 지정해야 하는 chcon 과는 다르게 잘못 설정된 파일과 디렉터리를 보안 정책에 맞도록 컨텍스트를 설정해 줍니다.


많이 사용하는 옵션은 재귀적으로 처리하는 -R 과 제외할 디렉터리를 지정하는 -e 옵션이며 -e 뒤에는 제외할 디렉터리 이름을 지정해 주면 됩니다.


이전 절에서 mv 로 이동한 파일를 restorecon 으로 처리하려면 아래와 같이 지정하면 되며 파일이므로 -R 옵션은 제외해도 됩니다. 


$ sudo restorecon -R /var/www/html/hello.html
chcon 으로 처리


이제 ls -lZ 명령을 실행해 보면 타입이 제대로 설정되어 있는 것을 확인할 수 있습니다.


matchpathcon

/SELinux에 익숙하지 않다면 어떤 디렉터리에 어떤 보안 컨텍스트를 부여해야 하는지 모르는 경우가 많습니다.

SELinux 때문에 발생하는 대부분의 에러는 잘못된 보안 컨텍스트로 발생하므로 경로에 따른 보안 컨텍스트를 알아 내는 것은 문제 해결을 위해 중요한 단계입니다.

matchpathcon 유틸리티를 사용하면 디렉터리별로 필요한 보안 컨텍스트를 알아 낼 수 있으며 matchpathcon 명령어 뒤에 보안 컨텍스트를 알아낼 디렉터리의 경로를 적어주면 됩니다.


$ matchpathcon /var/www/html/
   
/var/www/html   system_u:object_r:httpd_sys_content_t:s0
matchpathcon 으로 컨텍스트 확인


만약 여러 개의 경로를 한 번에 확인할 경우 공백을 구분자로 하여 경로를 모두 적어 주면 됩니다.

$ matchpathcon /var/log/ /var/www/ /etc/httpd/ /var/lib/mysql

/var/log        system_u:object_r:var_log_t:s0
/var/www        system_u:object_r:httpd_sys_content_t:s0
/etc/httpd      system_u:object_r:httpd_config_t:s0
/var/lib/mysql  system_u:object_r:mysqld_db_t:s0

TODO: type 진하게

다양한 경로의 컨텍스트 확인

/var/log, /var/www, /etc/httpd, /var/lib/mysql 4 개의 디렉터리에 데몬 서비스가 접근하려면 필요한 보안 컨텍스트를 알 수 있으며 이를 참고로 하여 restorecon 이나 chcon 명령어를 사용하여 수정하면 됩니다.


만약 특정 경로의 파일들이 기본 설정 컨텍스트와 일치하는지 검증하려면 대문자 -V 옵션을 주고 실행하면 됩니다. 아래는 /var/www/ 내의 파일들이 기본 컨텍스트와 일치하는지 여부를 검사합니다.

$ matchpathcon -V /var/www/*

/var/www/html/index.html verified.
/var/www/html/welcome.php has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0

TODO: type should 부분 진하게

다양한 경로의 컨텍스트 확인

만약 잘못된 컨텍스트가 있다면 위와 같이 해당 파일명과 컨텍스트를 표시해 주므로 chcon 이나 restorecon 을 사용하여 수정해 주면 됩니다.

matchpathcon 은 재귀적으로 하위 폴더까지 확인하지 않습니다. 위의 예제에서는 /var/www/index.html 은 검사했지만 /var/www/myweb/index.html 은 검사하지 않는 점을 주의하십시요.