방화벽 : 비 인가된 외부의 접근을 차단하는 네트워크 보안 장비/소프트웨어
방화벽 종류
Firewalld 특징 : RHEL7부터 도입된 기본 방화벽 서비스로 채택된 방화벽 서비스. 네트워크 트래픽을 영역(Zone)으로 분류하여 방화벽 관리를 편리하게 할 수 있음.
NetworkManager와 연동됨.
Firewalld 방화벽 설정 도구
Firewalld 방화벽 설정
사전에 정의된 영역(Pre-defined Zone)
| 영역 | 설명 |
|---|---|
| trusted* | 들어오는 모든 트래픽 허용 |
| home | 나가는 트래픽과 관련이 없는 경우 트래픽을 거부함. (ssh,mdns,ipp-client,dhcpv6-client는 허용) |
| internal | 나가는 트래픽과 관련이 없는 경우 트래픽을 거부함. (ssh,mdns,ipp-client,dhcpv6-client는 허용) |
| work | 나가는 트래픽과 관련이 없는 경우 트래픽을 거부함. (ssh,mdns,ipp-client,dhcpv6-client는 허용) |
| external | 나가는 트래픽과 관련이 없는 경우 트래픽을 거부함. 외부로의 연결, SSH서비스 허용, IP Masquerading 기능 활성화 |
| public | Default Zone. 시스템에 새로운 네트워크 카드 추가시 인터페이스 규칙이 추가됨. 나가는 트래픽과 관련이 없는 경우 트래픽을 거부함.(ssh, dhcpv6-client는 허용) |
| dmz | 나가는 트래픽과 관련이 없는 경우 트래픽을 거부함.(ssh는 허용) |
| block* | 나가는 트래픽과 관련이 없는 경우 모든 트래픽을 거부함. |
| drop* | 나가는 트래픽과 관련이 없는 경우 모든 트래픽을 Drop함. |
drop을 제외한 나머지는 reject임.
$ firewall-cmd --list-all$ firewall-cmd --list-all --permanent$firewall-cmd --add-service=SERVICE
방화벽에서 특정 서비스 허용(Permanent)
$firewall-cmd --add-service=SERVICE --permanent

방화벽에서 특정 포트 허용 (Runtime)
$firewall-cmd --add-port=PORT/PROTOCOL
방화벽에서 특정 포트 허용 (Permanent)
$firewall-cmd --add-port=PORT/PROTOCOL --permanent
rule
[family=ipv4|ipv6][source]
[destination]
service | port | protocol |icmp-block | icmp-type |masquerade | forward-port | source-port
[log|nflog][audit]
[accept | reject | drop | mark]
| 속성 | 설명 | 문법 |
|---|---|---|
| family | IPv4와 IPv6 결정 | family=[ipv4 |ipv6] |
| source | 출발지 주소 설정 | source address=IP/MASK |
| destination | 도착지 주소 설정 | detination address=IP/MASK |
| service | 서비스 규칙 설정 | service name="SERVICE" |
| port | 포트 설정 | port port="PORT" protocol="TCP|UDP" |
| protocol | 프로토콜 설정 | protocol value="PROTOCOL" |
| foward-port | 포트포워딩 설정 | forward-port port="PORT" protocol="TCP |
| log | syslog기록 | log PREFIX="TEXT" level="PRIORITY" [limit value="RATE/DURATION"] |
| audit | audit log 기록 | audit[limit value="RATE/DURATION"] |
| accept | 허용 | accept |
| reject | 거부(명시적 거절) | reject |
| drop | 폐기 | drop |
Rich Rule 추가
$firewall-cmd --add-rich-rule='RICH_RULE'
Rich Rule 제거
$firewall-cmd --remove-rich-rule='RICH_RULE'
Rich Rule 목록 확인
$firewall-cmd --list-rich-rules

SELinux(Secure Enhanced Linux)
Linux의 보안을 강화하기 위한 Linux Kernel Module
Access Control
DAC(Discretionary Access Control)
MAC(Mandatory Access Control)
RBAC(Role Based Access Control)
사용자의 역할에 따라 접근 권한을 부여하는 접근 제어 방식
주체(Subject) : 객체(Object)에 접근하는 사용자(User), 프로세스(Process)
객체(Object) : 주체(Subject)가 접근하는 시스템의 자원(파일, 디렉터리, 포트)
SELinux 작동 모드
Enforcing : 커널에 SELinux가 로드된 상태로 SELinux의 보안 정책을 강제하고 SELinux 보안 로그를 기록하는 모드,
Permissive : 커널에 SELinux가 로드된 상태로 SELinux의 보안 정책을 강제하지 않고 SELinux 보안 로그를 기록하는 모드
Disabled : 커널에 SELinux가 로드되지 않은 상태(완전한 비활성화)
현재 SELinux 작동 모드 확인
$ getenforce
SELinux 작동 모드 전환 (Runtime)
$ setenforce 0 | 1
$ setenforce Enforcing | Permissive
SELinux 설정 파일 : /etc/selinux/config
SELinux 비활성화 및 활성화(영구 설정)
RHEL8이전의 리눅스 : SELinux 설정 파일(/etc/selinux/config) 설정
SELinux 보안 모듈 비활성화
$ vim /etc/selinux/config
SELINUX=Disabled
SELinux 보안 모듈 활성화
$ vim /etc/selinux/config
SELINUX=Enforcing
* 주의 : 위의 명령어 실행 후 재부팅 후 적용됨.
RHEL8 이후의 Linux의 SELinux 기본 작동 모드 설정
SELinux 보안 모듈 비활성화
$ grubby --update-kernel ALL --args selinux=0
SELinux 보안 모듈 활성화
$ grubby --update-kernel ALL --remove-args selinux
* 주의 : 위의 명령어 실행 후 재부팅 후 적용됨.
SELINUX_USER:SELINUX_ROLE:SELINUX_TYPE:LEVEL
[user@host2 ~]$ id uid=1000(user) gid=1000(user) groups=1000(user),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[user@host2 ~]$ ls -lZ -rw-r--r--. 1 user user unconfined_u:object_r:user_home_t:s0 16 May 2 15:58 userfile1
[user@host2 ~]$ ps -efZ system_u:system_r:NetworkManager_t:s0 root 1864 1 0 14:57 ? 00:00:00 /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -u -s
파일의 초기 SELinux 보안 컨텍스트
일반적으로 파일을 만드는 상위 디렉터리의 컨텍스트에 따라 초기 컨텍스트가 결정됨.
파일의 보안 컨테스트 변경(임시)
$chcon -t TYPE_CONTEXT FILE
파일의 보안 컨텍스트 변경(영구)
(1) SELinux 보안 컨텍스트 정책 선언
$ semanage fcontext -a -t TYPE PATH
(2) 파일에 SELinux 보안 컨텍스트 반영
$ restorecon -v FILE
SELinux 보안 컨텍스트 정책 목록 확인
$ semanage fcontext -l
SELinux 보안 컨텍스트 정책 선언
$ semanage fcontext -a -t TYPE PATH
SELinux 보안 컨텍스트 정책 수정
$ semanage fcontext -m -t TYPE PATH
SELinux 보안 컨텍스트 정책
$ semanage fcontext -d -t TYPE PATH
파일 경로 지정시 디렉터리 및 디렉터리 하위 파일에 대해 정책 선언
예) /test
"/test(/.*)?"
파일에 SELinux 보안 컨텍스트 반영
$ restorecon -v FILE
-F : force
-R : recursive

SELinux에서 사용자 또는 프로세스가 시스템에서 어떤 행위를 할 수 있도록 허용/차단하는 정책을 설정하는 SELinux 객체
SELinux 부울은 정책에 대한 On/Off 스위치와 같은 역할을 수행함.
SELinux 부울 확인
$ getsebool -a
$ getsebool SELINUX_BOOL
$ semanage boolean -l

현재 SELinux 부울 설정
$ setsebool SELINUX_BOOL VALUE
영구 SELinux 부울 영구 설정
$ setsebool -P SELINUX_BOOL VALUE

현재 SELinux 부울 설정
$ semanage boolean -m --on SELNUX_BOOL
$ semanage boolean -m --off SELINUX_BOOL
SELinux에서 네트워크 프로토콜, 애플리케이션이 사용하는 기본 포트 번호에 대한 보안 레이블
SELinux가 실행 중인 시스템에서는 이미 정해진 포트 이외의 다른 포트 사용시 기본적으로 해당 포트를 통한 통신을 차단함
SELinux 포트 레이블 목록 확인
$ semanage port -l

SELinux 포트 레이블 추가
$ semanage port -a -t SELINUX_PORT_TYPE -p PROTOCOL PORT_NUMBER
$ semange port -a -t "http_port_t" -p tcp 10000
$ semange port -a -t "http_port_t" -p udp 10000
SELinux 포트 레이블 수정
$ semanage port -m -t SELINUX_PORT_TYPE -p PROTOCOL PORT_NUMBER
SELinux 포트 레이블 제거
$ semanage port -d -t SELINux_PORT_TYPE -p PROTOCOL PORT_NUBMER
