웹 서버 폴더에 쓰기시 필요한 SELinux httpd_sys_rw_content_t boolean

개요

RHEL/CentOS 7 에 탑재된 SELinux 는 많은 변경이 있었지만 그 중에 가장 중요한 것중 하나는 6 에서는 httpd_unified boolean 이 true 였지만 7 에서는 false 라는 점이다.


이 불린은 apache httpd 나 nginx 같은 웹 서버가 컨텐츠를 다룰 때 동일한 방식의 룰로 처리할 수 있게 해준다.

풀어서 설명하면 /var/www/html 같이 httpd_sys_content_t 가 설정된 컨텐츠에 대해 read 와 write 권한을 갖게 해준다.


7부터는 false 로 바뀌어서 /var/www/html 같은 폴더에 컨텐츠가 있을 경우 소유자가 웹 서버(apache) 이고 파일 퍼미션에 write 가 설정되어 있고 httpd_sys_content_t context 가 설정되어도 쓰지를 못한다.


워드프레스(wordpress)같이 웹 기반으로 설정하는 프로그램의 경우 설정한 내용을 파일 시스템에 쓰는 부분이 있는데 httpd_sys_rw_content_t  이 적용되어 있지 않다면 설정을 저장하지 못해서 설치에 실패하게 된다.

이를 해결하려면 다음과 같은 방법이 있다.


처리 방안

#1  httpd_sys_rw_content_t 설정(추천)

보안 강화를 위해 개발사가 의도한 정책이므로 다음 명령어로 쓰기 권한이 필요한 디렉터리를 명시적으로 지정해 주는게 좋다.

chcon  -t httpd_sys_rw_content_t writable-content.php

파일이나 폴더마다 일일이 지정해 주어야 할 경우 -R 옵션을 추가해 주면 되며 아래는 워드프레스의 uploads 폴더에 대해서 context 를 설정하는 예제이다.

chcon -R -t httpd_sys_rw_content_t wp-content/uploads/


#2 unified boolean 설정.(비추)

6.x 과 마찬가지로 unified 불린을 설정하여 httpd_sys_content_t 가 부여된 컨텐츠는 read/write 가 가능하게 처리한다.

setsebool -P httpd_unified on

장점은 편리하지만 보안성이 떨어질 수 있다. 7 에서 이렇게 바뀐것은 웹 서버를 통한 공격이 나날이 증가하므로 더욱 견고한 보안을 위해서 바꾼것 같으니 당장은 불편해도 1번 방식을 쓰는게 좋을 듯 하다.


이 내용을 몰라서 CentOS 7 에 PHP 로 된 app 를 설치하는데 4시간이나 까먹었다. 

Ref