리눅스의 전통적인 보안방식은 퍼미션이다. SELinux는 강제 접근 제어 모델인 MAC 모덜을 사용하여 시스템의 보안을 강화하는 리눅스 커널 모듈이다. 즉 커널에서 동작하는 보안 모듈이라 볼 수 있다.
리눅스는 접근제어모델을 사용해서 파일이나 자원에 대한 접근을 제어한다. DAC, MAC, RBAC 가 있다.
객체 소유자가 임의로 객체에게 권한을 부여하고 객체에 대한 접근을 제어하는 접근 제어 모델
유닉스/리눅스 기본적으로 사용하는 접근제어 모델
Subject와 Object에 각각 부여된 보안 레이블(컨텍스트)과 정책 스위치(부울)에 의해 접근을 제어하는 접근제어 모델
Subject가 Object에 접근할 때 먼저 객체에 접근할 수 있는 권한이 있는지 확인 후(DAC 모델 적용한 후) 보안 레이블을 확인함.
보안 레이블에 의해 거부된 접근은 정책 허용 스위치에 의해서 다시 객체에 접근을 허용될 수 있다.
SELinux를 사용하는 경우 시스템에 적용되는 보안 접근제어 모델
객체에 대외비가 찍혀있다면 주체에도 대외비 보안 레이블이 있어야지 그 관련 객체를 확인할 수 있다. 즉 주체와 객체 짝을 이뤄야 된다는 의미이다.
getenforce
sestatus
setenforce (enforcing)
SELinux 기능이 활성화 되면 MAC 모델이 적용되기 떄문에 시스템에 존재하는 모든 프로세스와 파일에 컨텍스트가 부여된다. 그리고 이 컨텍스트는 프로세스가 파일에 접근할 때 비교하는 요소로 사용된다.
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
현재 컨텍스트가 admin_home_t였는데 이 컨텍스트를 httpd_sys_content_t으로 바꿔줄 수 있다.
restorecon
<파일의 컨텍스트 복원>
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 -d -t [SELINUX_TYPE_CONTEXT] FILE_SPEC
semanage fcontext -d -t httpd_sys_content_t '/var/www(/.*)?'
getsebool -a
부울 설정(런타임)
부울설정(런타임,영구적)
setsebool -P [SELINUX_BOOL] on / off
semanage boolean -m ( -0: off | -1: on ) [SELINUX_BOOL]
on/off에서 왼쪽은 현재 런타임, 오른쪽은 영구적 런타임을 의미한다.
semanage port -l
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 번호)
/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 모듈을 disable 또는 Permissive로 변경
컨텍스트 변경
restorecon -v /var/www/html/index.html
restorecon -rv /var/www/html
부울 정책 변경
setsebool -P [SELINUX_BOOL] on
ifconfig -> 가상머신, 인터페이스 2개다 ip 잘잡히는지 확인
curl -L naver.com -> 가상머신 2개다 인터넷 잘되나 확인
getenforce -> 가상머신 2개다 disabled (selinux 끄는 것)
hostnamectl set-hostname -> 가상머신 2개 호스트네임 설정
hostnamectl set-hostname server_one
hostnamectl set-hostname client_two
유명한 DB종류
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
로컬인 1번으로 mysql를 실행하면 서버이자 클라이언트가 되는 것이다
mysql -u root -p
root라는 계정으로 로그인 됨
mysql_secure_installation
mysql 내부에서 system을 한이후에 명령어를 입력하면 그 명령어를 사용할 수 있다. (system ls 등)
10.0.2.15
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';
만든 이후 2번 클라이언트로 가서 mysql -h 10.0.2.15 -u test -p 명령을 실행한 후 지정해두었던 pw를 입력하면 외부에서 mariadb를 사용할 수 있다.