본문 바로가기
카테고리 없음

리눅스 (CentOS)SELinux

by 종바깅 2021. 5. 12.

SELinux

SELinux - 보안기능 (Secure Enhanced Linux)

SELinux 소개

  • 미국 NSA(국가안보국)에 의해 개발됨 - PRISM

  • 접근통제모델

    • DAC : Discretionary Access Control(임의적 접근 제어)
      • 기본적인 리눅스의 파일 접근 권한
    • MAC : Mendatory Access Control(강제적 접근 제어)
      • SELinux : 개체별로 Label 기반의 접근제어
    • RBAC : Role-Based 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 전환 시 설정 변경 후 재지정 필요
  • 컨텍스트 지정 방식

    • mv, cp -a : 기존 파일의 컨텍스트 정보가 그대로 유지
    • cp, cat, vi, touch : 해당 위치 디렉토리에 설정된 기본 컨텍스트 규칙
  • 컨텍스트 규칙

    • 컨텍스트 규칙 설정 도구 : semanage
      • setmanage fcontext -l : 현재 설정되어 있는 컨텍스트 규칙 확인
  • 컨텍스트 설정

    • 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 <타입> <대상경로>

실습 - 다음 경로에 저장된 컨텐츠를 사용하는 웹 서비스 구성

  1. 웹서버 설정 수정

     # vi /etc/httpd/conf/httpd.conf
     ...
     DocumentRoot “/var/www/html” => “/webcontents”
     <Directory “/var/www/html”> => “/webcontents”
  2. 웹 컨텐츠 경로 생성 및 페이지 생성

     #mkdir /webcontents
     # cat > /webcontents/index.html
     Hello World
  3. 웹서비스 재시작

     # systemctl restart httpd.service
    
  4. Enforcing 상태일 경우, SELinux에 의해 차단됨

  5. SELinux 컨텍스트 규칙 추가

     # semanage fcontext -a -t httpd_sys_content_t '/webcontents(/.*)?'
  6. 컨텍스트 규칙에 맞게 컨텍스트 수정

     # 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 <프로토콜> <포트번호>

실습 - 포트레이블 설정

  1. 웹서버의 포트 번호 변경

     # vi /etc/httpd/conf/httpd.conf
     ...
     Listen 80 → 7777
     ...
     DocumentRoot "/webfile"
     ...
     <Directory "/webfile">
     ...
  2. 웹서버 구동 →오류 발생(SELinux 포트 관련 오류)

  3. SELinux 포트 레이블 확인

     # semanage port -l | grep 80
     # semanage port -l | grep http
  4. 시존 웹 서비스를 위한 포트 레이블 정보에 7777/tcp 포트를 추가

     # semanage port -a -t http_port_t -p tcp 7777
  5. 웹서비스를 다시 시작하여 정상 동작을 확인


SELinux Boolean

  • 여러가지 예외 상황에 대한 설정을 on/off로 사용가능

      # getsebool -a : 현재 SELinux Boolean 설정 확인
      # setsebool <bool 항목> <on|off>

SELinux 문제 해결 방법

  1. Enforcing 상태에서 동작 확인

  2. 문제가 있을 경우, Permissive모드로 변경하여 동작 확인

  3. Permissive모드에서 정상적으로 동작 : 관련된 문제 정보를 로그/감사 등을 통해 확인(/var/log/messages)

    참고) sealert 관련 내용이 포함되어 있을 경우 sealert -l [에러코드] 실행을 통해 SELinux 오류관련 도움을 받을 수 있음

  4. 컨텍스트/포트레이블 등의 설정을 통해 오류 해결

  5. SE Boolean 등으로 오류 해결


부팅 문제 해결

  • root 패스워드 복구

    1. root패스워드 임의 설정 → # echo “2njksehlwjhiw” | passwd --stdin root

    2. 재부팅 후 부트로더 동작(GRUB) 중 잠시 정지(카운트 멈춤)

    3. 부팅 항목 중 하나를 선택 후 'e'키를 눌러서 편집

    4. 명령어 편집기에서 linux16으로 시작하는 항목 맨 끝에 rd.break 추가 → 부팅 단계에서 멈춤

    5. 부팅이 완료 되었으나, 사용중인 리눅스 시스템이 정상적으로 로드되지 않은 상태(File system)

    6. 파일시스템은 현재 /sysroot에 마운트 되어 있으며, 수정하기 위하여 읽기/쓰기 가능하도록 마운트 설정을 변경해야 함

       #mount -o rw,remount /sysroot
    7. 패스워드를 변경하기 위해 chroot 명령어 사용

       #chroot /sysroot
    8. 패스워드 변경 → #passwd

    9. SELinux 컨텍스트 규칙에 맞게 컨텍스트를 수정하기 위해 다음 명령을 수행

       #touch /.autorelabel
  • 리눅스 시스템 부팅과정

    1. 시스템 전원 인가
    2. BIOS/EFI 동작
    3. POST(Power On Self Test) 수행
    4. MBR/GPT 정보를 확인하여 부팅 가능 파티션 정보 확인
    5. 부팅 가능 파티션의 VBR(Volume Boot Record)를 참고하여 부팅 단계 시작
    6. 부트로더(리눅스 GRUB, GRand Unified Bootloader)
    7. 시스템 Kernel 로드
    8. systemd 로드 (initramfs 파일시스템 마운트) ←rd.break
    9. pivoting (/sysroot, /)
    10. local-fs.target
    11. sysinit.target
    12. basic.target
    13. default.target
  • 타겟 변경

    • 현재 시스템의 상태(=런레벨)을 변경

      systemctl isolate <타겟이름>

    • 재부팅 시 초기 상태를 지정

      systemctl set-default <타겟이름>

      →default.target에 원하는 타겟의 파일이 링크로 생성됨

    • 재부팅 시 초기 타겟 확인

      systemctl get-default

  • /etc/fstab 파일 오류로 인한 부팅문제 해결

    • /etc/fstab파일 오류시 기본 동작

      1. 마운트 하려는 파일시스템이 손상 : systemd가 fsck(Filesystem Check) 시도 → 긴급 쉘(emergency.target)
      2. 마운트하려는 장치의 UUID 정보가 없을 경우 : 긴급 쉘로 이동
      3. 마운트하려는 마운트포인트가 없음 : systemd가 해당 경로를생성할 수 있을 경우 자동으로 생성하고 진행, 생성할 수 없을 경우 긴급 쉘로 전환
      4. 마운트 설정에서 잘못된 마운트 옵션 : 긴급 쉘로 전환
    • 부팅시 실행할 타겟 지정

      • 부트로더 단계에서 부팅 명령 수정('e')
      • ilnux16 항목 맨 끝에 systemd.unit=emergency.target
      • 시스템이 즉시 해당 모드로 부팅됨
    • /etc/fstab 파일 오류 수정

      1. 시스템 부팅 오류 확인 (화면상 출력되는 부팅 메시지 확인)

      2. 자동으로 긴급 쉘로 들어가거나, 사용자가 직접 긴급쉘로 전환

        긴급 쉘 진입 설정은 위 항목 확인

      3. mount 정보 확인

        • 자동으로 긴급 쉘로 들어갈 경우, / 경로가 rw 상태로 마운트
        • 사용자가 긴급 쉘로 지정한 경우, / 경로가 ro 상태로 마운트
      4. / 경로가 ro 마운트 상태일 경우 rw로 다시 마운트

         # mount -o rw,remount /
      5. /etc/fstab 파일의 오류 수정

      6. mount -a 명령을 사용하여 오류 수정 확인

      7. 재부팅

  • 조기 디버그 쉘

      # systemctl enable debug-shell.service
    • 인증절차가 없는 콘솔을 제공
      • Ctrl + Alt + F9
      • root로 로그인 되어있음
    • 보안 상 설정하지 않는 것을 권장

댓글