[쿠버네티스 4주차 1/11] SELinux & MariaDB

신현식·2023년 1월 11일
0

구름_Linux

목록 보기
15/22
post-thumbnail

SELinux

리눅스의 전통적인 보안방식은 퍼미션이다. SELinux는 강제 접근 제어 모델인 MAC 모덜을 사용하여 시스템의 보안을 강화하는 리눅스 커널 모듈이다. 즉 커널에서 동작하는 보안 모듈이라 볼 수 있다.

접근 제어모델

리눅스는 접근제어모델을 사용해서 파일이나 자원에 대한 접근을 제어한다. DAC, MAC, RBAC 가 있다.

  • 주체(Subject): 시스템의 자원에 접근하는 프로세스 or 사용자
  • 객체(Object): 파일 또는 포트와 같은 시스템의 자원

DAC (Discretionary Access Control, 임의적 접근제어)

  • 객체 소유자가 임의로 객체에게 권한을 부여하고 객체에 대한 접근을 제어하는 접근 제어 모델

  • 유닉스/리눅스 기본적으로 사용하는 접근제어 모델

MAC (Mandatory Access Control, 강제적 접근제어)

  • Subject와 Object에 각각 부여된 보안 레이블(컨텍스트)과 정책 스위치(부울)에 의해 접근을 제어하는 접근제어 모델

  • Subject가 Object에 접근할 때 먼저 객체에 접근할 수 있는 권한이 있는지 확인 후(DAC 모델 적용한 후) 보안 레이블을 확인함.

  • 보안 레이블에 의해 거부된 접근은 정책 허용 스위치에 의해서 다시 객체에 접근을 허용될 수 있다.

  • SELinux를 사용하는 경우 시스템에 적용되는 보안 접근제어 모델

객체에 대외비가 찍혀있다면 주체에도 대외비 보안 레이블이 있어야지 그 관련 객체를 확인할 수 있다. 즉 주체와 객체 짝을 이뤄야 된다는 의미이다.

RBAC (Role-Based Access Control, 역할 기반의 접근제어)

  • 역할은 다수의 권한을 묶어놓은 그룹인데 관리자는 이 역할을 사용자에게 부여함으로써 권한을 제어한다.

SELinux 설정파일 : /etc/selinux/config

  • SELINUXTYPE : 정책유형
    • targeted : 특정 프로세스 보호 (기본값), http, ssh 등 유명한 것들은 다포함되어 있음
    • minimum : 최소한의 프로세스만 보호, 타겟보다 대상 프로세스를 줄인 것
    • mls : Multi-Level Security (고급보안), 보안 등급을 만들 수 있기에 군대에서 잘쓰는 보안모델, 다른 곳에서는 잘 사용 안함
  • SELINUX : 동작모드
    • Enforcing(강제 모드) : SELinux 활성화(부팅될때 커널에 로딩된다는 의미), 로그 기록, MAC 모델 적용
    • Permissive(허용 모드) : SELinux 활성화는 되지만 보안 정책을 강제하지 않음, 로그 기록, DAC 모델 적용
    • Disabled(비활성) : SELinux 비활성화, 부팅시 아예 커널모듈을 로딩하지 않음

getenforce

  • SELinux가 켜져있는지 확인하는 명령, Enforcing이면 켜져있다는 의미이다.

sestatus

  • SELinx 상세정보 확인가능

setenforce (enforcing)

  • selinux 동작 모드 설정 (Runtime)
  • 숫자로도 설정 가능( 0: permissive / 1: enforce)

SELinux 컨텍스트

SELinux 기능이 활성화 되면 MAC 모델이 적용되기 떄문에 시스템에 존재하는 모든 프로세스와 파일에 컨텍스트가 부여된다. 그리고 이 컨텍스트는 프로세스가 파일에 접근할 때 비교하는 요소로 사용된다.

  • -Z 옵션을 사용하면 프로세스와 파일에 지정된 컨텍스트를 확인할 수 있다.

ps axZ

  • 프로세스 보안 컨텍스트 확인

ls -alZ

  • 파일 보안 컨텍스트 확인

컨텍스트 구조

사용자(user) : 역할(role) : 유형(type) : 레벨(level)
사용자: 시스템에 존재하는 리눅스 사용자가 아닌 SELinux 사용자를 의미
역할: 일부 RBAC 모델을 사용하는 것들에서 역할이 주어지는데 사용자와 도메인을 연결하는 기능
유형: 컨텍스트의 유형을 수정하여 주체가 객체에 정상적으로 접근할 수 있도록 설정
레벨: MLS(Multi Level Security) 와 MCS(Multi Catagort Security)를 의미

컨텍스트 변경

httpd 시작
httpd 방화벽 열기
웹사이트 접속
cd /var/www/html
vi index.html
ls -Z index.html -> 컨텍스트가 /var/www/html 과 똑같이 만들어지고 웹사이트 접속도 된다
cd ~
vi index.html
ls -Z index.html -> /root의 컨텍스트를 확인

  • 해당 파일을 cp로 /var/www/html에 복사하면 컨텍스트가 바뀜
  • 해당 파일을 mv로 이동시키면 컨텍스트가 그대로 /root의 컨텍스트임, selinux에 의해서 접근이 차단되었기 때문

컨텍스트 설정

chcon

  • chcon -t [SELINUX_TYPE_CONTEXT][FILE]
  • 파일의 컨텍스트를 일시적으로 변경하는 명령, 영구적 설정X

현재 컨텍스트가 admin_home_t였는데 이 컨텍스트를 httpd_sys_content_t으로 바꿔줄 수 있다.

restorecon

  • restorecon [옵션] 파일
  • context를 복원하는 명령어
    -R,r: 디렉터리가 인자로 지정되면 하위 디렉터리까지 지정
    v : 컨텍스트 변경사항 출력
    F : 컨텍스트 강제로 재설정

<파일의 컨텍스트 복원>
restorecon -vF /var/www/html/index.html
restorecon -v /var/www/html/index.html
restorecon /var/www/html/index.html

<디렉터리와 디렉터리안의 파일들 컨텍스트 복원>
restorecon -r /var/www/html
restorecon -rv /var/www/html
restorecon -rvF /var/www/html

semanage fcontext -l

  • 현재 리눅스 시스템의 콘텍스트 정책 리스트 확인하는 명령
    semanage fcontext -l | grep /var/www

콘텍스트 영구 변경 설정
<콘텍스트 정책 삭제>
semanage fcontext -d -t [SELINUX_TYPE_CONTEXT] FILE_SPEC

semanage fcontext -d -t httpd_sys_content_t '/var/www(/.*)?'

SElinux 부울(Boolean) 설정

getsebool -a

  • 현재 런타임 정보만 보는 명령이다. 따라서 시스템이 재부팅되면 값이 변경될 수도 있다.
  • semanage boolean -l 이 명령으로도 볼 수 있지만 이것은 런타임 정보뿐만 아닌 영구적 정보도 볼 수 있다.

부울 설정(런타임)

  • setsebool [SELINUX_BOOL] on / off

부울설정(런타임,영구적)

  • setsebool -P [SELINUX_BOOL] on / off

  • semanage boolean -m ( -0: off | -1: on ) [SELINUX_BOOL]

on/off에서 왼쪽은 현재 런타임, 오른쪽은 영구적 런타임을 의미한다.

SELinux 포트 레이블

semanage port -l

  • SELINUX 포트 레이블 목록 확인하는 명령이다.

SELINUX 포트 레이블에 포트 추가
semanage port -a -t 포트타입 -p (tcp 번호 / udp 번호)
semanage port -a -t http_port_t -p tcp 10000
수정
semanage port -m -t 포트타입 -p (tcp 번호 / udp 번호)
삭제
semanage port -d -t 포트타입 -p tcp (번호 / udp 번호)

SELINUX 접근 차단 상황발생 시 로그 확인하는 방법

/var/log/audit/audit.log
/var/log/messages

  • cat /var/log/audit/audit.log | grep denied 로 검색

  • cat /var/log/messages | grep 'SELinux is preventing' 로 검색, 미 방법이 더 자세한 내용을 확인하기 좋음

  • sealert -l [uuid]

selinux에 의해 차단당할 경우 해결책

  1. selinux 모듈을 disable 또는 Permissive로 변경

  2. 컨텍스트 변경
    restorecon -v /var/www/html/index.html
    restorecon -rv /var/www/html

  3. 부울 정책 변경
    setsebool -P [SELINUX_BOOL] on

버츄어박스 설정(실습준비)

  1. ifconfig -> 가상머신, 인터페이스 2개다 ip 잘잡히는지 확인

  2. curl -L naver.com -> 가상머신 2개다 인터넷 잘되나 확인

  3. getenforce -> 가상머신 2개다 disabled (selinux 끄는 것)

  4. hostnamectl set-hostname -> 가상머신 2개 호스트네임 설정
    hostnamectl set-hostname server_one
    hostnamectl set-hostname client_two

DB 서버 구축

유명한 DB종류

  • MYSQL -> MARIADB
  • MSSQL = SQL SERVER
  • ORACLE DB

리눅스에 mariadb 설치

yum -y install mariadb mariadb-server
systemctl start mariadb or systemctl start mysql
systemctl enable mariadb or systemctl enable mysql
firewall-cmd --add-service=mysql --permanent
firewall-cmd --reload

  • 여기까지 진행되면 원격에서 mariadb를 사용할 수 있게 세팅된 것임

로컬인 1번으로 mysql를 실행하면 서버이자 클라이언트가 되는 것이다
mysql -u root -p
root라는 계정으로 로그인 됨

패스워드 지정

mysql_secure_installation

mysql 내부에서 system을 한이후에 명령어를 입력하면 그 명령어를 사용할 수 있다. (system ls 등)
10.0.2.15

외부 클라인언트에서 server로 접속하는 방법

2번 가상머신에서 하기
yum install -y mariadb
mysql -h 10.0.2.15 -u root -p : server의 IP주소를 중간에 적어주면 1번 서버에 접속이 가능한데 보안설정에서 외부 접근을 차단하였기 때문에 현재는 접속이 안된다.

외부 사용자 만들기

1번 서버에서 mariadb에 접속한다.
use mysql;
select user,host from user where user not like '';
현재 로컬에서 접속가능한 root밖에 존재하지 않는다.

새 계정 만들기

GRANT ALL PRIVILEGES ON . TO test@'10.0.2.%' IDENTIFIED BY '1234';

  • 모든 디비의 모든 테이블에 모든 권한을 가진 계정을 만들겠다는 의미
    id는 test이고 pw는 1234, 이 10.0.2.% IP에서 만든다는 의미

만든 이후 2번 클라이언트로 가서 mysql -h 10.0.2.15 -u test -p 명령을 실행한 후 지정해두었던 pw를 입력하면 외부에서 mariadb를 사용할 수 있다.

profile
전공 소개

0개의 댓글