SELinux
SELinux - 보안기능 (Secure Enhanced Linux)
SELinux 소개
미국 NSA(국가안보국)에 의해 개발됨 - PRISM
접근통제모델
- DAC : Discretionary Access Control(임의적 접근 제어)
- 기본적인 리눅스의 파일 접근 권한
- MAC : Mendatory Access Control(강제적 접근 제어)
- SELinux : 개체별로 Label 기반의 접근제어
- RBAC : Role-Based Access Control(역할 기반 접근 제어)
- 사용자 - 역할 매칭, 역할 별로 권한이 부여
- DAC : Discretionary Access Control(임의적 접근 제어)
컨택스트(Context) : SELinux에서 사용하는 Label
- 사용자 : 역할 : 유형 : 레벨
- stat [파일명]
- ls -Z [파일명/디렉토리]
- ps -eZ
- 사용자 : 역할 : 유형 : 레벨
SELinux 동작모드
- Enforcing
- SELinux 동작상태
- SELinux 규칙 위반할 경우 차단
- Permissive
- SELinux 동작 상태
- SELinux 규칙 위반할 경우 차단하지 않음
- 모니터링 용도
- Disabled
- SELinux가 동작하지 않는 상태
- Enforcing, Permissive ⇔ Disabled
- /etc/selinux/config : 동작모드 설정
- 런타임 동작모드 변경 : setenforce
- enforcing, 1 : Enforcing
- permissive, 0 : Permissive
- disable : Enforcing, Permissive에서는 전환 불가
- 부팅시 동작모드 설정
- enforcing : 강제
- permissive : 모니터링
- disabled : selinux 구동하지 않음
- Enforcing, Permissive 상태에서 Disabled 전환 시 설정 변경 후 재지정 필요
- Enforcing
컨텍스트 지정 방식
- mv, cp -a : 기존 파일의 컨텍스트 정보가 그대로 유지
- cp, cat, vi, touch : 해당 위치 디렉토리에 설정된 기본 컨텍스트 규칙
컨텍스트 규칙
- 컨텍스트 규칙 설정 도구 : semanage
- setmanage fcontext -l : 현재 설정되어 있는 컨텍스트 규칙 확인
- 컨텍스트 규칙 설정 도구 : semanage
컨텍스트 설정
chcon : 직접 대상의 컨텍스트 타입을 지정하여 설정
chcon -t [SELinux Type] [대상]
restorecon : 해당 파일 위치의 컨텍스트 규칙에 따라 수정
restorecon [대상]
컨텍스트 규칙 생성
semanage fcontext -a -t [지정할 타입] [대상 경로]
대상경로 입력시, 하위 디렉토리 및 파일까지 포함할 경우, 정규화 표현식 (/.*)? 를 사용하여 하위 항목까지 포함하도록 설정
# semanage fcontext -a -t httpd_sys_content_t '/wwwcontents(/.*)?' # restorecon -Rv /wwwcontents
컨텍스트 규칙 삭제
# semanage fcontext -d -t <타입> <대상경로>
실습 - 다음 경로에 저장된 컨텐츠를 사용하는 웹 서비스 구성
웹서버 설정 수정
# vi /etc/httpd/conf/httpd.conf ... DocumentRoot “/var/www/html” => “/webcontents” <Directory “/var/www/html”> => “/webcontents”
웹 컨텐츠 경로 생성 및 페이지 생성
#mkdir /webcontents # cat > /webcontents/index.html Hello World
웹서비스 재시작
# systemctl restart httpd.service
Enforcing 상태일 경우, SELinux에 의해 차단됨
SELinux 컨텍스트 규칙 추가
# semanage fcontext -a -t httpd_sys_content_t '/webcontents(/.*)?'
컨텍스트 규칙에 맞게 컨텍스트 수정
# restorecon -Rv /webcontents
포트레이블(SELinux Port Label)
네트워크 포트에 대한 SELinux 설정
컨텍스트 규칙이 맞지 않을 경우, 포트를 사용할 수 없음
포트레이블 확인
# semanage port -l
포트레이블 규칙 추가
# semanage port -a -t <타입> -p <프로토콜> <포트번호> ex) #semanage port -a -t http_port_t -p tcp 7777
포트 레이블 규칙 삭제
# semanage port -d -t <타입> -p <프로토콜> <포트번호>
실습 - 포트레이블 설정
웹서버의 포트 번호 변경
# vi /etc/httpd/conf/httpd.conf ... Listen 80 → 7777 ... DocumentRoot "/webfile" ... <Directory "/webfile"> ...
웹서버 구동 →오류 발생(SELinux 포트 관련 오류)
SELinux 포트 레이블 확인
# semanage port -l | grep 80 # semanage port -l | grep http
시존 웹 서비스를 위한 포트 레이블 정보에 7777/tcp 포트를 추가
# semanage port -a -t http_port_t -p tcp 7777
웹서비스를 다시 시작하여 정상 동작을 확인
SELinux Boolean
여러가지 예외 상황에 대한 설정을 on/off로 사용가능
# getsebool -a : 현재 SELinux Boolean 설정 확인 # setsebool <bool 항목> <on|off>
SELinux 문제 해결 방법
Enforcing 상태에서 동작 확인
문제가 있을 경우, Permissive모드로 변경하여 동작 확인
Permissive모드에서 정상적으로 동작 : 관련된 문제 정보를 로그/감사 등을 통해 확인(/var/log/messages)
참고) sealert 관련 내용이 포함되어 있을 경우 sealert -l [에러코드] 실행을 통해 SELinux 오류관련 도움을 받을 수 있음
컨텍스트/포트레이블 등의 설정을 통해 오류 해결
SE Boolean 등으로 오류 해결
부팅 문제 해결
root 패스워드 복구
root패스워드 임의 설정 → # echo “2njksehlwjhiw” | passwd --stdin root
재부팅 후 부트로더 동작(GRUB) 중 잠시 정지(카운트 멈춤)
부팅 항목 중 하나를 선택 후 'e'키를 눌러서 편집
명령어 편집기에서 linux16으로 시작하는 항목 맨 끝에 rd.break 추가 → 부팅 단계에서 멈춤
부팅이 완료 되었으나, 사용중인 리눅스 시스템이 정상적으로 로드되지 않은 상태(File system)
파일시스템은 현재 /sysroot에 마운트 되어 있으며, 수정하기 위하여 읽기/쓰기 가능하도록 마운트 설정을 변경해야 함
#mount -o rw,remount /sysroot
패스워드를 변경하기 위해 chroot 명령어 사용
#chroot /sysroot
패스워드 변경 → #passwd
SELinux 컨텍스트 규칙에 맞게 컨텍스트를 수정하기 위해 다음 명령을 수행
#touch /.autorelabel
리눅스 시스템 부팅과정
- 시스템 전원 인가
- BIOS/EFI 동작
- POST(Power On Self Test) 수행
- MBR/GPT 정보를 확인하여 부팅 가능 파티션 정보 확인
- 부팅 가능 파티션의 VBR(Volume Boot Record)를 참고하여 부팅 단계 시작
- 부트로더(리눅스 GRUB, GRand Unified Bootloader)
- 시스템 Kernel 로드
- systemd 로드 (initramfs 파일시스템 마운트) ←rd.break
- pivoting (/sysroot, /)
- local-fs.target
- sysinit.target
- basic.target
- default.target
타겟 변경
현재 시스템의 상태(=런레벨)을 변경
systemctl isolate <타겟이름>
재부팅 시 초기 상태를 지정
systemctl set-default <타겟이름>
→default.target에 원하는 타겟의 파일이 링크로 생성됨
재부팅 시 초기 타겟 확인
systemctl get-default
/etc/fstab 파일 오류로 인한 부팅문제 해결
/etc/fstab파일 오류시 기본 동작
- 마운트 하려는 파일시스템이 손상 : systemd가 fsck(Filesystem Check) 시도 → 긴급 쉘(emergency.target)
- 마운트하려는 장치의 UUID 정보가 없을 경우 : 긴급 쉘로 이동
- 마운트하려는 마운트포인트가 없음 : systemd가 해당 경로를생성할 수 있을 경우 자동으로 생성하고 진행, 생성할 수 없을 경우 긴급 쉘로 전환
- 마운트 설정에서 잘못된 마운트 옵션 : 긴급 쉘로 전환
부팅시 실행할 타겟 지정
- 부트로더 단계에서 부팅 명령 수정('e')
- ilnux16 항목 맨 끝에 systemd.unit=emergency.target
- 시스템이 즉시 해당 모드로 부팅됨
/etc/fstab 파일 오류 수정
시스템 부팅 오류 확인 (화면상 출력되는 부팅 메시지 확인)
자동으로 긴급 쉘로 들어가거나, 사용자가 직접 긴급쉘로 전환
긴급 쉘 진입 설정은 위 항목 확인
mount 정보 확인
- 자동으로 긴급 쉘로 들어갈 경우, / 경로가 rw 상태로 마운트
- 사용자가 긴급 쉘로 지정한 경우, / 경로가 ro 상태로 마운트
/ 경로가 ro 마운트 상태일 경우 rw로 다시 마운트
# mount -o rw,remount /
/etc/fstab 파일의 오류 수정
mount -a 명령을 사용하여 오류 수정 확인
재부팅
조기 디버그 쉘
# systemctl enable debug-shell.service
- 인증절차가 없는 콘솔을 제공
- Ctrl + Alt + F9
- root로 로그인 되어있음
- 보안 상 설정하지 않는 것을 권장
- 인증절차가 없는 콘솔을 제공
댓글