이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 28349|회답: 4

[리눅스] 리눅스에서 SELinux가 무엇인지에 대한 철저한 이해

[링크 복사]
게시됨 2019. 7. 5. 오전 11:25:50 | | | |
1. 서문

보안 강화 리눅스(SELinux)는 리눅스 커널 모듈이자 리눅스의 보안 하위 시스템입니다.

SELinux는 주로 NSA에 의해 개발되었습니다. Linux 커널 2.6 이상은 이미 SELinux 모듈을 통합하고 있습니다.

SELinux는 매우 복잡하고 배우기 어려운 개념적인 내용이 많습니다. 많은 리눅스 시스템 관리자들이 SELinux가 불편하다고 느껴 꺼버렸습니다.

SELinux를 완벽하게 익히고 올바르게 사용할 수 있다면, 전체 시스템이 사실상 '파괴 불가능' 수준에 도달할 수 있다고 생각합니다(절대적인 안전은 없다는 점을 항상 기억하세요).

SELinux의 기본 개념과 간단한 구성 방법을 숙달하는 것은 모든 리눅스 시스템 관리자에게 필수 과목입니다.

이 문서는 CentOS 7.4.1708을 기반으로 작성되었습니다.

이 글은 순전히 개인적인 학습 경험, 공유와 교환의 공간이며, 실수는 불가피하니 참고용입니다! 실수를 발견하면 꼭 알려주세요, 정말 감사합니다!

2. SELinux의 역할과 권한 관리 메커니즘

2.1 SELinux의 역할

SELinux의 주요 기능은 시스템 내 서비스 프로세스가 접근할 수 있는 자원을 최소화하는 것입니다(최소 권한 원칙).

루트로 실행되는 네트워크 서비스에 0데이 취약점이 있다면, 해커들이 이 취약점을 악용해 루트 서버에서 원하는 대로 할 수 있다고 상상해 보세요. 무섭지 않나요?

SELinux가 이 문제를 해결하기 위해 존재합니다.

2.2 DAC

SELinux를 사용하지 않는 운영체제에서는 자원에 접근할 수 있는지를 결정하는 요소는 해당 자원이 해당 사용자의 권한을 가지고 있는지(읽기, 쓰기, 실행)를 가지고 있는지입니다.

이 자원에 접근하는 프로세스가 위 조건을 충족한다면 접근할 수 있습니다.

가장 치명적인 문제는 루트 사용자가 어떤 규제도 받지 않으며, 시스템 내 모든 자원에 제한 없이 접근할 수 있다는 점입니다.

이 권한 관리 메커니즘의 핵심은 사용자, 즉 자율 접근 제어(DAC)입니다.

2.3 MAC

SELinux를 사용하는 운영체제에서는 자원에 접근할 수 있는지를 결정하는 요인이 위에서 언급한 요소들뿐만 아니라 각 프로세스 유형이 특정 자원 유형에 접근할 수 있는지도 포함됩니다.

이렇게 하면 루트 프로세스로 실행되더라도, 접근 허용 여부를 결정하기 전에 프로세스 유형과 접근 허용 가능한 자원 유형을 결정해야 합니다. 과정의 활성 공간도 최소한으로 압축할 수 있습니다.

루트로 실행되는 서비스 프로세스조차도 일반적으로 필요한 자원에만 접근할 수 있습니다. 프로그램이 취약하더라도, 그 영향의 범위는 해당 프로그램이 접근할 수 있는 자원에 한정됩니다. 보안이 크게 강화됩니다.

이 권한 관리 메커니즘의 핵심은 프로세스, 즉 강제 접근 제어(MAC)입니다.

MAC은 두 가지 방식으로 나뉘는데, 하나는 카테고리 보안(MCS) 모드이고, 다른 하나는 다중 수준 보안(MLS) 모드라고 불립니다.

다음 동작들은 MCS 모드에서 진행됩니다.

2.4 DAC와 MAC의 비교

여기 그림을 보여드릴게요.



보시다시피, DAC 모드에서는 해당 디렉터리가 해당 사용자의 권한을 가지고 있다면 접근할 수 있습니다. MAC 모드에서는 프로세스가 접근할 수 있는 디렉터리 범위에 의해 제한됩니다.

3. SELinux의 기본 개념

3.1 주제

완전히 과정과 동일시할 수 있습니다.

참고: 이해를 쉽게 하기 위해, 별도 명시가 없는 한 이 과정은 아래의 주요 본문으로 간주됩니다.

3.2 목적

교장이 접근하는 자원. 파일, 디렉터리, 포트, 장치 등 다양할 수 있습니다.

참고: 이해를 쉽게 하기 위해, 별도의 명시가 없는 한 다음 문서 또는 디렉터리는 객체로 간주됩니다.

3.3 정책 및 규칙

시스템에는 보통 많은 파일과 프로세스가 존재하며, 시간과 오버헤드를 절약하기 위해 특정 프로세스만 선택적으로 규제합니다.

어떤 과정을 규제해야 하고 어떻게 통제할지는 정책에 의해 결정됩니다.

정책에는 여러 규칙이 있습니다. 필요에 따라 일부 규칙을 활성화하거나 비활성화할 수 있습니다(이하 불리언 규칙이라고 합니다).

규칙은 모듈식이고 확장 가능합니다. 새 애플리케이션을 설치할 때, 애플리케이션은 새로운 모듈을 추가하여 규칙을 추가할 수 있습니다. 사용자는 규칙을 수동으로 추가하거나 빼는 것도 가능합니다.

CentOS 7 시스템에는 세 가지 정책 세트가 있습니다:

1. 타겟팅: 대부분의 네트워크 서비스 프로세스를 제어합니다. 이 정책은 기본적으로 시스템에서 사용됩니다(아래 모든 것이 사용됩니다).

2. 최소한: 목표에 따라 선택된 네트워크 서비스 프로세스만 규제됩니다. 일반적으로는 그렇지 않습니다.

3. MLS: 다단계 보안 보호. 모든 과정을 규제하세요. 이것이 가장 엄격한 정책이며, 구성이 매우 어렵습니다. 일반적으로 보안에 대한 요구가 매우 높지 않은 한 사용되지 않습니다.

정책은 /etc/selinux/config에서 설정할 수 있습니다.

3.4 보안 맥락

보안 맥락은 SELinux의 핵심입니다.

보안 맥락 저는 이를 '프로세스 보안 맥락'과 '문서 보안 맥락'으로 나눕니다.

프로세스 보안 컨텍스트는 일반적으로 여러 문서 보안 컨텍스트에 해당합니다.

두 개의 보안 맥락이 일치할 때만 프로세스가 파일에 접근할 수 있습니다. 이들의 서신 교환은 정책의 규칙에 따라 결정됩니다.

파일 보안 맥락은 파일이 생성된 위치와 생성 프로세스에 의해 결정됩니다. 그리고 시스템은 기본 값 세트를 가지고 있으며, 사용자도 기본 값을 설정할 수 있습니다.

단순히 파일을 옮긴다고 해서 파일의 보안 상황이 바뀌는 것은 아니라는 점을 유념하는 것이 중요합니다.

보안 맥락의 구조와 의미

보안 컨텍스트는 콜론으로 구분된 네 개의 필드로 구성되어 있습니다. 예를 들어 system_u:object_r:admin_home_t:s0 같은 형태입니다.


3.5 SELinux 작업 모드

SELinux는 세 가지 작동 모드를 가지고 있습니다:

1. 집행: 강제 모드. SELinux 규칙 위반은 차단되어 로그에 기록됩니다.

2. 허용: 관용 모드. SELinux 규칙 위반은 로그에만 기록됩니다. 일반적으로 디버깅용입니다.

3. 비활성화: SELinux를 끕니다.

SELinux 작업 모드는 /etc/selinux/config에서 설정할 수 있습니다.

비활성화에서 강제 또는 허용으로 전환하고 싶으면 시스템을 재시작해야 합니다. 반대도 마찬가지입니다.

강제 모드와 허용 모드는 Setenforce 1|0 명령어로 빠르게 전환할 수 있습니다.

SELinux를 꺼둔 상태로 시스템이 일정 기간 작동했다면, SELinux를 켜고 나서 첫 재시작이 느릴 수 있다는 점을 유의해야 합니다. 시스템이 디스크 내 파일들을 안전하게 설정해야 하기 때문입니다(약 10분 정도 재시작했는데 죽은 줄 알았다고 했어요...... )。

SELinux 로그는 auditd.service의 도움을 받아 로그를 작성해야 하며, 비활성화하지 마세요.

3.6 SELinux 워크플로우

여기 별다른 설명 없이 사진에서 인용한 인용문이 있습니다.



참고: 위의 보안 텍스트는 보안 컨텍스트를 의미합니다.

4. 기본 SELinux 연산

4.1 파일이나 디렉터리의 보안 컨텍스트 쿼리

명령어 기본 사용

ls -Z

사용 예시

/etc/hosts의 보안 컨텍스트를 쿼리하세요.

ls -Z /etc/호스트

실행 결과

-rw-r-r--. 루트 system_u:object_r:net_conf_t:s0 /etc/hosts

4.2 프로세스의 보안 컨텍스트 쿼리

명령어 기본 사용

ps auxZ | 그렙 -V 렙 | 그렙

사용 예시

Nginx 관련 프로세스의 보안 컨텍스트를 조회하세요.

ps auxZ | 그렙 -V 렙 | 그렙 응금스

실행 결과

system_u:system_r:httpd_t:s0 루트 7997 0.0 0.0 122784 2156 ? SS 14:31 0:00 nginx: 마스터 프로세스 /usr/sbin/nginx

system_u:system_r:httpd_t:s0 nginx 7998 0.0 0.0 125332 7560 ? S 14:31 0:00 nginx: 작업자 과정

4.3 파일이나 디렉터리의 보안 컨텍스트를 수동으로 수정하기

명령어 기본 사용

CHCon [...]

옵션 함수 -u 보안 컨텍스트의 사용자 필드를 수정 -r 보안 컨텍스트의 역할 필드를 수정 -t 보안 컨텍스트의 타입 필드를 수정하기 -l 보안 컨텍스트의 레벨 필드를 수정하기 --참조 지정된 파일 또는 디렉터리와 일치하는 보안 컨텍스트를 수정하기 -R 재귀 연산 -h 소프트 링크의 보안 컨텍스트를 수정 (이 옵션 없이 해당 소프트 링크의 파일을 수정함)

사용 예시

테스트의 보안 컨텍스트를 aaa_u:bbb_r:ccc_t:s0로 수정하세요.

chcon -u aaa_u -r bbb_r -t ccc_t 테스트

4.4 파일이나 디렉터리의 보안 컨텍스트를 기본값으로 되돌리기

명령어 기본 사용

restorecon [옵션] [...]

옵션 기능 - V 인쇄 작업 절차 - R 재귀 연산

사용 예시

Nginx 서버 디렉터리에 웹 파일을 추가한 후, 이 새 파일들에 맞는 올바른 보안 컨텍스트를 설정하세요.

restorecon -R /usr/share/nginx/html/

4.5 불리언 규칙과 시스템 내 상태 조회

명령어 기본 사용

게츠불 -A

명령어가 모든 규칙을 조회하거나 한 가지 규칙만 쿼리하기 때문에, 보통 모든 규칙을 먼저 질의한 후 grep로 필터링합니다.

사용 예시

httpd와 관련된 불리언 규칙을 쿼리합니다.

겟세불 -a | grep httpd

실행 결과

httpd_anon_write -->

httpd_builtin_scripting -->

httpd_can_check_spam -->

httpd_can_connect_ftp -->

#以下省略

4.6 불리언 규칙 전환

명령어 기본 사용

Setsebool [옵션]

옵션 기능 -P 재시작은 여전히 유효합니다

사용 예시

규칙을 켜httpd_anon_write.

setsebool -P httpd_anon_write on

4.7 디렉터리에 대한 기본 보안 컨텍스트 추가

명령어 기본 사용

semanage fcontext -a -t "(/.*)?"

참고: 디렉터리나 파일의 기본 보안 컨텍스트는 semanage fcontext -l 명령어와 grep 필터링을 함께 사용하여 확인할 수 있습니다.

사용 예시

새 사이트 디렉터리 /usr/share/nginx/html2를 Nginx에 추가한 후에는, 원래 디렉터리와 동일한 기본 보안 컨텍스트를 설정해야 합니다.

Semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"

4.8 특정 유형의 프로세스에서 허용하는 포트 추가

명령어 기본 사용

Semanage port -a -t -p

참고: 다양한 서비스 유형에 허용되는 포트 번호는 grep 필터링과 함께 semanage port -l 명령어를 사용하여 확인할 수 있습니다.

사용 예시

Nginx의 경우 HTTP 서비스를 위해 포트 10080을 사용해야 합니다.

Semanage port -a -t http_port_t -p TCP 10080

5. SELinux 오류 분석 및 해상도

5.1 SELinux 로그 이해하기

SELinux가 활성화되면 많은 서비스의 일부 정상적인 동작이 위반으로 간주됩니다(제목과 아래 오류 모두에서).

현재는 SELinux 위반 로그를 활용해 이를 분석하고 해결해야 합니다.

SELinux 위반 로그는 /var/log/audit/audit.log에 저장됩니다.

/var/log/audit/audit.log 的内容大概是这样的。

type=LOGIN msg=audit(1507898701.391:515): PID=8523 uid=0 subj=system_u:system_r:crond_t:S0-S0:C0.C1023 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=25 res=1

Type=USER_START MSG=Audit(1507898701.421:516): PID=8523 UID=0 AUID=0 SES=25 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_open grantors=pam_loginuid,pam_ KeyInit,pam_limits,pam_systemd acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=성공'

...

파일은 내용이 많고, SELinux 오류와 관련 없는 시스템 감사 로그들과도 섞여 있습니다. 분석을 돕기 위해 sealert 유틸리티를 사용할 예정입니다(프롬프트가 명령을 찾지 못하면 setroubleshoot 패키지를 설치하세요).

5.2 sealert로 오류 분석

명령어 기본 사용

Sealert -a /var/log/audit/audit.log

명령어를 실행한 후, 시스템은 로그의 위반 사항을 분석하고 분석 보고서를 제공하는 데 시간을 투자해야 합니다.




이전의:CentOS7 뷰 및 방화벽 끄기
다음:HDFS의 Java API 인터페이스 접근을 마스터하세요
 집주인| 게시됨 2021. 7. 22. 오후 5:17:58 |
SELinux를 끄세요

GetenForce #查看是否是 비활성화되어 있다면, 아래 명령을 실행하세요
vim /etc/selinux/config
SELINUX=enforceing을 SELINUX=disabled로 변경하고, 저장 후 종료하세요.
 집주인| 게시됨 2021. 10. 15. 오후 1:21:42 |
 집주인| 게시됨 2021. 10. 15. 오후 2:22:40 |
스왑 파티션 스왑 비활성화

 집주인| 게시됨 2024. 9. 3. 오후 2:16:43 |
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com