티스토리 뷰
SELinux(Security Enhanced Linux)는 ugo시스템과 File ACL보다 보안이 더 강화된 파일, 디렉토리, 프로세스 접근 제어 아키텍처입니다. ugo시스템이나 File ACL로 접근이 허용되더라도, SELinux에서 접근을 허용하지 않을 수 있습니다.
SELinux의 접근 제어 방법에는 타겟(Target)정책과 다단계보안(MLS: Multi Level Security)이 있는데 MLS는 정부기관과 같이 고도의 보안이 요구되는 곳에서만 사용됩니다.
접근제어 방법
SELinux는 파일, 디렉토리, 프로세스에 부여된 라벨(Label)을 이용하여 접근을 통제합니다.
이 Label을 SELinux Context라고 합니다.
SELinux Context값을 보려면 ps나 ls명령의 'Z'옵션을 사용하십시오.
SELinux Context는 user, role, type, level로 구성됩니다. 타겟정책에서는 type만 사용합니다. 이 3번째 type을 특별히 Type Context라고 부릅니다.
SELinux가 enable되면 각 파일, 디렉토리, 프로세스는 Label이 부여됩니다. 보통 상위 디렉토리의 Label을 이어 받습니다.
Type Context는 접근을 허용하는 프로세스가 미리 정해져 있습니다. 아래 예에서 'httpd_sys_content_t'라는 type context로 지정된 디렉토리는 'httpd_t'라는 type context를 가지는 프로세스만 접근 가능합니다. 따라서 'mysql_t'라는 type context를 가진 프로세스는 아무리 ugo나 File ACL로 허용해도 /var/www/html디렉토리를 접근하지 못하게 됩니다.
실습하기
1) httpd 설치, start
$ sudo yum install -y httpd
...
$ sudo systemctl start httpd
...
$ sudo systemctl status httpd
httpd 프로세스의 SELinux context를 확인해 보면 type이 'httpd_t'인것을 확인할 수 있음.
$ ps -efZ | grep httpd
2) /var/www/html디렉토리에 index.html 만들기. SELinux context 확인. Web browser에서 확인하기.
$ cd /var/www/html
$ sudo vi index.html
Hello, SELinux!
$ ls -Z ./index.html
웹브라우저에서 확인
3) index.html의 SELinux context 변경하기. Web browser에서 확인하기. /var/log/messages에서 에러 메시지 확인하기.
chcon명령은 일시적으로 selinux context를 변경하는 명령임
$ sudo chcon -t home_root_t ./index.html
Web browser에서 파일 연결이 안됨
/var/log/messages에 보면 httpd가 index.html 파일을 접근하지 못한다는 로그가 있음
4) index.html의 SELinux context 원복하기. Web browser에서 확인하기.
restorecon은 부팅시의 selinux context로 복원하는 명령임.
$ sudo restorecon ./index.html
Web browser에서 다시 확인하면 이제 다시 연결이 됨.
SELinux모드 변경
먼저 현재 SELinux모드는 getenforce라는 명령으로 확인할 수 있습니다.
변경은 setenforce 1 OR 0을 이용합니다.
mode에는 3가지가 있습니다.
- enforcing: SELinux 가 적용되고, 정책에 위배되면 차단됨.
- permissive: SELinux가 적용되나, 정책에 위배되도 차단하지 않고 /var/log/messages에서 로깅만 함.
- disabled: SELinux를 비활성화함.
SELinux모드 영구 설정
setenforce는 일시적으로 SELinux 모드를 변경하는 명령입니다. 영구적으로 설정하려면 /etc/selinux/config 파일을 수정하고 리부팅하여야 합니다.
$ sudo vi /etc/selinux/config
$ sudo systemctl reboot
...
리부팅 후 selinux 모드를 확인합니다.
$ getenforce
위 실습에서 만든 index.html의 type context 를 'home_root_t'로 다시 바꾸고, web browser에서 httpd가 이 파일을 접근하는지 확인합니다.
$ sudo tail -f /var/log/messages
SELinux context 변경
일시적으로 변경할 때는 chcon -t <type context> <file / directory>를 이용합니다. restorecon <file/directory> 명령을 사용하면 원래대로 selinux context가 복원됩니다.
상위 디렉토리 'tmp'의 type context는 'tmp_t'이고, test.txt의 type context는 'usr_tmp_t'로 설정됨을 알 수 있습니다.
chcon으로 test.txt의 type context를 'tmp_t'로 변경했다가, restorecon으로 복원해 봅니다.
영구적으로 변경할 때는 semanage fcontext와 restorecon명령을 같이 사용합니다.
$ cd ~
$ mkdir virtual
$ ls -Zd virtual
....:user_home_t:...
$ echo 'hi' > virtual/test1
$ ls -Z virtual
....:user_home_t:...
~/virtual에 대한 selinux context가 정의되어 있지 않음을 확인합니다.
$ sudo semanage fcontext -l | grep home | grep virtual
<아무것도 안 나옴>
selinux context를 '/home/student/virtual(/.*)?'에 정의합니다.
$ sudo semanage fcontext -a -t tmp_t '/home/student/virtual(/.*)?'
$ sudo semanage fcontext -l | grep home | grep virtual
/home/student/virtual(/.*)? all files system_u:object_r:tmp_t:s0
기존 디렉토리와 파일의 type context를 변경합니다.
$ sudo restorecon -Rv virtual
...
$ ls -Zd virtual
...:tmp_t:... virtual
$ ls -Z virtual
...:tmp_t:... test1
SELinux 정책 관리
selinux의 미리 정해진 각종 기본 정책을 활성화 또는 비활성화 시킵니다.
기본 정책 리스트는 getsebool -a 명령으로 확인할 수 있습니다.
기본 정책을 변경하려면 setsebool <정책명> <on or off>를 이용합니다. 또한 영구 설정하려면 '-P'옵션을 사용합니다.
$ getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off
setsebool명령으로 현재 상태를 on으로 변경합니다.
$ sudo setsebool httpd_enable_homedirs on
$ getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on
semanage boolean -l 명령으로 현재값과 기본값을 확인할 수 있습니다.
앞에 있는 상태값이 현재 상태이고, 뒤에 상태값이 기본값입니다.
$ sudo semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs (on , off) Allow httpd to enable homedirs
-P 옵션으로 기본값을 바꿔 영구설정할 수 있습니다.
$ sudo setsebool -P httpd_enable_homedirs on
$ sudo semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs (on , on) Allow httpd to enable homedirs
실습하기
위에서 설치한 웹서버의 user home directory에 html파일을 접근할 수 있도록 조정합니다.
$ sudo systemctl status httpd
userid가 student이고 domain이 workstation.lab.example.com이면, 웹브라우저를 열고 'http://workstation.lab.example.com/~student'라고 입력해 봅니다. 현재는 연결이 안될겁니다.
1) httpd의 userdir 허용
$ sudo vi /etc/httpd/conf.d/userdir.conf
UserDir disabled 를 remark하고, UserDir public_html의 remark는 해제합니다.
httpd를 재시작합니다.
$ sudo systemctl restart httpd
2) ~/public_html디렉토리를 만들고 home디렉토리 모드를 711로 변경합니다.
$ mkdir ~/public_html
$ chmod 711 ~
3) ~/public_html에 index.html파일을 만듭니다.
$ echo "Hello, httpd!" > ~/public_html
4) selinux의 기본정책중 httpd_enable_homedirs가 on되어 있는지 체크하고, 안되어 있으면 on합니다.
위 SELinux정책관리 참조
5) 웹브라우저에서 http://workstation.lab.example.com/~student 로 접근합니다.
참고: selinux 정책에 대한 매뉴얼 설치, 검색
getsebool -a로 보면 많은 selinux 정책이 나옵니다. 각각에 대한 매뉴얼을 보려면 아래와 같이 하십시오.
1) selinux 정책 매뉴얼 설치
$ yum list available '*selinux*'
...
$ sudo yum install -y selinux-policy-doc
...
2) 매뉴얼에서 정책 검색
$ man -K <정책명>
예) man -K httpd_enable_homedirs
SELinux 문제 조사 및 해결
대부분의 문제는 SELinux context의 type context가 잘못 되어 있는 경우입니다.
로그는 /var/log/audit/audit.log와 /var/log/messages에서 확인할 수 있습니다.
type context가 잘못된 경우는 restorecon -Rv <디렉토리 or file>명령으로 원복하면 해결됩니다.
에러에 대한 자세하 설명은 sealert -l <uuid>를 이용합니다.
아래와 같이 실습해 보십시오.
1) 위에서 만든 /home/student/virtual/index.html의 type context를 'root_t'로 바꿉니다.
$ chcon -t root_t /home/student/public_html/index.html
$ ls -Z ~/public_html
...:root_t:... index.html
2) 웹브라우저에서 http://workstation.example.lab.com/~student로 접근합니다.
3) /var/log/messages에서 에러 메시지를 찾습니다.
2번째 줄의 'For complete SELinux messages run: sealert -l 599....'에서 sealert -l 599... 값을 복사하십시오.
참고로, /var/log/audit/audit.log에는 아래와 같이 메시지가 기록됩니다.
4) sealert -l 명령으로 자세한 에러 정보를 봅니다.
아래 보면 restorecon으로 selinux context를 변경하라는 가이드가 나옵니다.
5) restorecon으로 selinux context를 변경합니다.
6) 이제 웹브라우저에서 확인해 보면 접근이 됩니다.
'Infrastructure > OS' 카테고리의 다른 글
Red Hat System Administration II: Logical Volume 관리 (0) | 2020.08.27 |
---|---|
Red Hat System Administration II: 기본 스토리지 관리 (0) | 2020.08.26 |
Red Hat System Administration II: File ACL (0) | 2020.07.22 |
Red Hat System Administration II: System 성능 튜닝 (0) | 2020.07.21 |
Red Hat System Administration II: Job 실행시간 예약 (0) | 2020.07.16 |
- Total
- Today
- Yesterday
- spotify
- 리퀴드폴리탄
- API Composition
- AXON
- 도파밍
- 스포티파이
- CQRS
- 호모프롬프트
- 버라이어티가격
- 디토소비
- 스핀프로젝트
- 마이크로서비스
- agile
- SAGA
- 마이크로서비스 패턴
- 육각형인간
- Event Sourcing
- 분초사회
- 요즘남편 없던아빠
- 돌봄경제
- micro service
- 애자일
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |