본문 바로가기
[Microsoft] Cyber Security School 7기

클라우드 기반 윈도우/리눅스 서버 과제-1...DNS 설정, 방화벽(firewall-cmd) 설정, SELinux 개념 및 명령어 모음

by juyeon2110 2026. 4. 14.

1. 다음과 같은 시스템 환경에 대한 DNS 서버 설정 방법

- idm (192.168.200.10, 10.10.10.10) ---> DNS 서버로 설정 - web (192.168.200.11, 10.10.10.11) - mysql (192.168.200.12, 10.10.10.12) - bastion (192.168.200.13, 10.10.10.13)

1. idm 서버 (DNS 서버 설정)

1) 패키지 설치

dnf install bind bind-utils -y

BIND(Berkeley Internet Name Domain) : 리눅스/유닉스 환경에서 가장 널리 사용되는 오픈 소스 DNS 서버 소프트웨어로, 도메인 이름을 IP 주소로 변환하는 권위 있는(Authoritative) 네임 서버 및 캐싱 리졸버 역할을 수행한다, 주 설정 파일(/etc/bind/named.conf)을 통해 존(Zone) 파일을 구성하여 정방향/역방향 조회를 설정할 수 있다.

존(Zone) 파일 : DNS 영역을 설명하는 텍스트 파일. DNS 서버에 존재하며 설정 파일 및 정보를 제공하는 데이터베이스와 같은 역할을 한다.

영역(Zone) = 도메인 관리 영역 = DNS 서버 하나가 책임이나 권한을 가지는 영역

2) 설정 파일 수정

vi /etc/named.conf
options { listen-on port 53 { any; }; //모든 IP에서 DNS 요청 받음 allow-query { any; }; //누구나 DNS 질의 가능 recursion yes; // 외부 도메인까지 해석 };

named.conf 파일 : DNS 서버 전체 설정을 정의하는 “메인 설정 파일”이다. 서버의 정책 + 구조 정의

3) 존(zone) 설정 추가

zone "lab.local" IN { // 관리할 도메인 지정 -> lab.local type master; // 이 서버가 원본(권한) 서버라는 뜻 file "lab.local.db"; // 실제 데이터 위치 };

4) 존 파일 생성

vi /var/named/lab.local.db
$TTL 86400 //캐시 유지 시간 (초), 86400초 = 24시간 @ IN SOA idm.lab.local. root.lab.local. ( // 이 DNS 서버가 관리자 -> idm.lab.local 2024040101 ; serial // 버전 번호 (존 파일 수정하면 반드시 증가) 3600 ; refresh // 1시간마다 변경 체크 1800 ; retry // 실패하면 30분 뒤 재시도 604800 ; expire // master랑 7일 동안 동기화 못 하면, slave가 DNS 데이터 폐기 86400 ) ; minimum // 캐시 유지 시간 (맨 윗줄) IN NS idm.lab.local. // NS 레코드, 이 도메인을 담당하는 DNS 서버 지정 idm IN A 192.168.200.10 // A 레코드, 도메인 → IP 매핑 web IN A 192.168.200.11 mysql IN A 192.168.200.12 bastion IN A 192.168.200.13

Master & Slave : 주, 보조 관계이며 동기화를 통해 DNS 서버를 이중화함 (Slave서버는 여러개 사용 가능)

Master : 현재 운용 중인 서버

Slave : 백업용 서버

5) 서비스 실행

systemctl enable named systemctl start named

6) 방화벽 열기

firewall-cmd --add-service=dns --permanent firewall-cmd --reload

2. 클라이언트 서버 설정 (web, mysql, bastion)

vi /etc/resolv.conf
nameserver 192.168.200.10

resolv.conf 파일 : 사용하고자 하는 DNS 서버를 지정하는 파일

3. 테스트

nslookup web.lab.local // 또는, dig mysql.lab.local

2. 다음과 같은 구성 환경에 대한 방화벽(firewall-cmd) 설정 방법

- idm (10.10.10.10) - web (192.168.200.11, 10.10.10.11) - mysql (10.10.10.12) - bastion (192.168.200.13, 10.10.10.13)

1. bastion 서버 (192.168.200.13, 10.10.10.13)

외부(192.168.200.x)에서 내부망으로 접속하기 위한 통로.

-> SSH만 허용

firewall-cmd --permanent --add-service=ssh firewall-cmd --reload

2. web 서버 (192.168.200.11, 10.10.10.11)

-> 웹 서비스(HTTP, HTTPS), SSH만 허용

firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.13" service name="ssh" accept' firewall-cmd --reload

3. mysql 서버 (10.10.10.12)

-> DB, SSH만 허용

firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.11" port protocol="tcp" port="3306" accept' firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.13" service name="ssh" accept' firewall-cmd --reload

3306 : MySQL 및 MariaDB 데이터베이스의 기본 포트 번호

4. idm 서버 (10.10.10.10)

-> DNS만 허용

firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" service name="dns" accept' firewall-cmd --reload

5. 설정 마친 후 확인

firewall-cmd --list-all
[인터넷] | [DMZ] ├─ bastion (10.10.10.13 / 192.168.200.13) └─ web (10.10.10.11 / 192.168.200.11) | [내부망] ├─ idm (10.10.10.10) └─ mysql (10.10.10.12)

DMZ : 외부 네트워크와 내부 네트워크 사이에서 외부 네트워크 서비스를 제공하면서 내부 네트워크를 보호하는 서브넷, 외부에 오픈된 서버영역

1. bastion 서버 (DMZ)

// 외부 → bastion SSH 허용 firewall-cmd --permanent --add-service=ssh // 내부로 나가는 SSH 허용 (idm, mysql) firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" destination address="10.10.10.0/24" service name="ssh" accept' firewall-cmd --reload

2. web 서버 (DMZ)

// 외부 → web 서비스 허용 firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https // bastion → web SSH 허용 firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.13" service name="ssh" accept' // web → mysql DB 연결 허용 firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" destination address="10.10.10.12" port protocol="tcp" port="3306" accept' firewall-cmd --reload

3. idm 서버 (내부망)

// bastion → idm SSH 허용 firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.13" service name="ssh" accept' // 내부망 → DNS 허용 firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" service name="dns" accept' firewall-cmd --reload

4. mysql 서버 (내부망)

// web → DB 허용 firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.11" port protocol="tcp" port="3306" accept' // bastion → SSH 허용 firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.10.13" service name="ssh" accept' firewall-cmd --reload

4. Bastion(Jump Server) 서버에 대한 개념 정리

외부 네트워크에서 내부 네트워크의 자원에 접근할 때 반드시 거쳐야 하는 중간 경유 서버. 내부 서버들을 외부에 직접 노출하지 않고, Bastion 서버 하나만 외부에 공개함으로써 공격 표면을 최소화하는 것이 핵심 목적이다. 관리자는 외부에서 Bastion 서버에 먼저 SSH 등으로 접속한 뒤, 거기서 다시 내부 서버로 접근하는 방식으로 운영한다. 네트워크 구조상 보통 DMZ 또는 퍼블릭 서브넷에 위치하며, 내부 서버들은 프라이빗 서브넷에 격리된 상태로 존재한다.

특징 :

- 최소 서비스만 실행 (SSH 등)

- 강력한 인증 (키 기반 로그인, MFA 등)

- 모든 접속 로그 기록

- 주기적 패치 및 보안 강화

- 내부 서버 접근 권한 제어

장점 :

모든 접근이 Bastion을 통해 이루어지기 때문에 접속 로그가 한 곳에 집중되어 감사 및 모니터링이 용이하다. IP 화이트리스트, MFA(다중 인증), 세션 기록 등의 보안 정책도 Bastion에만 집중적으로 적용하면 되므로 관리 효율이 높다.

단점 :

Bastion이 유일한 진입점 역할을 하기 때문에, Bastion 서버 자체가 침해될 경우 내부 전체가 위험해질 수 있어 Bastion 서버의 보안 강화가 매우 중요하다.

5. SELinux 개념 및 명령어 모음 정리

리눅스 커널에 내장된 강제 접근 제어(MAC) 보안 모듈로, 프로세스와 파일 등 모든 자원에 보안 레이블을 부여해 접근을 통제하는 시스템. 기본적으로 "관리자가 허용한 것 외에는 모두 금지"하는 최소 권한 원칙을 따르며, 시스템 관리자(root)의 권한이 탈취되더라도 해커가 시스템 전체를 장악하지 못하도록 방어하는 최종 보루 역할을 한다.

MAC(Mandatory Access Control, 강제 접근 제어) : 시스템 정책이 접근을 강제 통제 → 루트 권한이어도 정책에 위반되면 차단

DAC(Discretionary Access Control, 임의 접근 제어) : 일반 Linux 권한, 파일 소유자가 권한을 설정

동작 모드

Enforcing : 정책 위반 시 실제로 차단 + 로그 기록

Permissive : 차단하지 않고 로그만 기록 (테스트용)

Disabled : SELinux 완전 비활성화

명령어 모음

1. 모드 확인 / 변경

명령어
설명
getenforce
현재 모드 확인
setenforce 1
Enforcing 모드로 변경 (임시)
setenforce 0
Permissive 모드로 변경 (임시)
sestatus
SELinux 상태 상세 확인

영구 변경은 /etc/selinux/config 에서 SELINUX=enforcing 값 수정 후 재부팅

2. Context(레이블) 확인 / 변경

명령어
설명
ls -Z
파일의 SELinux Context 확인
ps -Z
프로세스의 SELinux Context 확인
chcon -t <타입> <파일>
파일 Context 임시 변경
restorecon <파일>
파일 Context를 기본값으로 복원

3. 로그 / 문제 분석

명령어
설명
ausearch -m avc
SELinux 차단 로그(AVC) 검색
audit2why < /var/log/audit/audit.log
차단 이유 분석
audit2allow -a <파일>
차단 로그 기반 허용 정책 제안

4. Port 관련

명령어
설명
semanage port -l
SELinux에 등록된 포트 목록 확인
semanage port -a -t <타입> -p tcp <포트>
포트 허용 등록
semanage port -d -t <타입> -p tcp <포트>
포트 허용 삭제