본문 바로가기
교육

[29일 차] 21.08.30 : Linux Server 8

by ballena 2021. 8. 30.

오전에는 firewalld

방화벽 관련 서비스다. httpd처럼 systemctl status 등의 명령어로 확인 가능. 

이전에 배웠던 Windows 방화벽을 보면, 인바운드 규칙 등 허용하는 목록들이 있었는데, 리눅스에서는 이 목록들을

firewall-cmd --list-services 명령으로 볼 수 있다. 여기 쓰여 있는 서비스만 허용되는 것.

 

방화벽은 일반적으로 내부와 외부 네트워크의 경계 지점에 위치한다.

내부 네트워크를 안전하고 신뢰할 만하고, 그리고 외부 네트워크는 안전하지 못하고 신뢰하기 어렵다는 가정 하에 그 정책과 규칙을 적용한다.

내부와 외부는 서버 자체로 나눈다. 일반적인 방화벽은 외부에서 내부로 들어오는 것을 차단하지만, 내부에서 외부로 나가는 것은 별로 신경 쓰지 않는다(따로 적용한다면 내부-> 외부도 차단 가능). 

방화벽은 기본적으로 들어오고 나가는 패킷에 대해 지정된 정책(Policy)과 규칙(Rule)을 사용하여 2가지의 반응(행동) - 허용(Accept)과 차단(Reject) - 을 통해 모든 패킷을 통제한다.

 

리눅스의 소프트웨어적 방화벽은 iptables와 firewalld가 있고, 실제 차단은 커널에 있는 Netfilter에서 한다.

하지만 커널에서 하는 것은 관리자가 직접 제어하기가 어려워 소프트웨어적 방화벽인 firewalld를 사용하는 것.

iptables는 예전에 쓰던거고, 이제는 firewalld를 사용. 

 

보통 외부에서 사설 네트워크로 진입할 때 입구에서 NAT 등의 과정을 통해 공인 IP를 사설 IP로 바꾸는데, 이 전에 패킷의 목적지 공인 IP를 사설 IP로 바꾸는 것이 Prerouting 과정.

 

지금까지 서버 간 통신을 배울 때 종단 간 통신으로 배웠는데, 리눅스 서버는 거쳐가는 중간 장비로 사용될 때도 있다. 네트워크의 앞단 장비로 패킷을 받아 내부망의 장비들에게 전달해 주는 역할이 그 예시.

-> 이런 역할을 할 떄 사용하는 정책이 Forward 정책.

 

결국 우리가 가장 신경써야 할 정책은 Input/Output 정책.

 

사설에서 작업을 마치고 공인으로 나갈 때 Postrouting 과정을 거친다.

 

외부 -> Prerouting -> Forwarding -> Input -> Output -> Postrouting

 

 

firewalld에는 2가지 모드가 있다.

1. CLI 모드 : firewall-cmd

2. GUI 모드 : firewall-config. firewall-cmd보다 기능이 제한적이다. 그래서 CLI 위주로 배울 것.

-> firewall-config 실행하면 GUI 창이 뜬다(없으면 설치할지 물어본다).

-> 접속 거부당하면 xhost +si:localuser:root 실행

 

방화벽 키고 끄는건 다른 데몬과 똑같이 systemctl start/stop firewalld 하면 된다.

 

  • 사전 정의된 영역(ZONE) : 특정한 기능과 규칙을 영역으로 만들어 놓는 것.

사용자가 설정을 시작하기 전 미리 보호할 영역을 정해놓은 것이다.

- trusted : 들어오는 모든 트래픽을 허용합니다.

- home : 나가는 트래픽과 관련이 없거나 ssh, mdns, ipp-client, samba-client 또는 dhcpv6-client 등의 사전 정의된 서비스와 일치하지 않을 경우 들어오는 트래픽을 거부한다.

- Internal : 나가는 트래픽과 관련이 없거나 위에서 언급한 사전 정의된 서비스(시작하는 home 영역과 동일)와 일치하지 않을 경우 들어오는 트래픽을 거부한다. home과 비슷.

- public : 따로 설정하지 않았으면 이 ZONE으로 만들어진다. 나가는 트래픽과 관련이 없거나 ssh 또는 dhcpv6-client 사전 정의된 서비스와 일치하지 않을 경우 들어오는 트래픽을 거부한다.

- external : 나가는 트래픽과 일치하지 않거나 ssh 사전 정의 서비스와 일치하지 않을 경우 들어오는 트래픽을 거부한다. 이 영역을 통해 전달되어 나가는 IPv4 트래픽은 나가는 네트워크 인터페이스의 IPv4 주소에 시작된 것처럼 마스커레이드 된다.

- dmz : 나가는 트래픽과 일치하지 않거나 ssh 사전 정의된 서비스와 일치하지 않을 경우 들어오는 트래픽을 거부한다.

- drop : 나가는 트래픽과 관련되지 않은 경우 들어오는 모든 트래픽을 차단

 

Stateless 방화벽 : 나가고 들어오는 트래픽에 대해 상태 값을 기억 못한다. 연결된 세션의 정보를 기억하지 못해 세션과 관련 있는 트래픽을 차단한다.

Statefull 방화벽 : 상태값을 기억한다. 관련 있는 트래픽을 허용한다.

 

일반적으로 통신에 있어서 요청과 응답의 과정을 거치는데, 기본적으로 방화벽은 이런 트래픽은 허용한다.

-> 외부에서 시작한 트래픽이 차단되는 것. 본체(CentOS 8)에서 나가서 돌아오는 트래픽은 허용하는 것.

-> ICMP 주의


firewall-cmd 뒤에 옵션들을 붙여 실행

 

firewall-cmd --version : 버전 확인

firewall-cmd --state : 상태

firewall-cmd --list-{ service | ports | protocols | sources } : 각종 구성 확인

firewall-cmd --reload : 재시작

 

[이 사이 다시]

 

--get-default-zone : 현재 기본 영역 확인

 

--set-default-zone : 기본 영역 설정

 

--get-zones : 사용 가능한 모든 영역 나열

 

--add-source=CIDR [--zone=ZONE] : IP 주소 또는 네트워크/넷마스크 네트워크에서 모든 트래픽을 지정된 영역으로 라우팅

예시 ) 192.168.111.0/24에서 출발한 트래픽 허용

-> --add-source=192.168.111.0/24

 

--remove-source=CIDR [--zone=ZONE] : IP 주소 또는 네트워크/넷마스크 네트워크에서 모든 트래픽을 지정된 영역으로 라우팅 규칙을 해당 영역에서 삭제

 

--add-interface=INTERFACE [--zone=ZONE] : ZONE에 인터페이스 추가

 

--change-interface=INTERFACE [--zone=ZONE] : ZONE에 인터페이스 변경

 

--list-all [--zone=ZONE] : ZONE에 대해 구성된 모든 인터페이스, 소스, 서비스, 포트를 나열한다.

 

--list-all-zones : 모든 영역에 대한 모든 정보를 검색

 

--add-service=SERVICE [--zone=ZONE] : 해당 서비스에 대한 트래픽 허용

 

--remove-service=SERVICE [--zone=ZONE] : 영역에서 해당 서비스 삭제

 

--add-port=PORT [--zone=ZONE] : PORT에 대한 트래픽을 허용

 

--remove-port=PORT [--zone=ZONE] : 영역에서 해당 PORT 삭제

 

--permanent : 일반적으로 해당 firewalld가 작동 중일 때만 적용되는데, 이 명령으로 영구 적용 가능. 적용 시점은 다음 재시작이므로 firewall-cmd --reload로 재시작해줘야 한다.

 

 

서비스나 포트 동시에 여러 개 입력할 경우에는 { } 사이에 ' , '로 구분해서 나열, 입력

-> {https,smtp,ftp}

PORT 입력 시 포트번호 뒤에 프로토콜 작성

-> 443/tcp


우리가 할 일은 App 자체의 개발이 아니라, 기반(HW-OS-런타임/미들웨어-App 미들웨어)을 쌓아 개발자에게 갖다 주는 것. 런타임/미들웨어는 Apache 같은 것이고, App 미들웨어는 perl 같은 것.

 

리눅스에서 가장 많이 쓰는 웹 서버 App은 크게 2가지

Apache 웹 서버

-> master-웹 서버, slave-리눅스 웹 클라이언트, 호스트-Windows 웹 클라이언트 역할로 실습할 예정.

httpd가 작동 중인지 확인 후 가동 > 각종 파일 위치 잘 알아둘 것. 설정 파일 위치 

 

/usr/sbin/httpd : 아파치 데몬 위치

/var/www/cgi-bin/ : 아파치에서 사용하는 cgi(Common Gateway Interface) 파일들이 들어가는 위치

/etc/httpd/conf/ : 아파치 주 설정 파일이 들어가는 위치

-> 지시자와 값이 적용되어 있다.

ServerRoot : 기본 경로

Listen : 들어오는 포트

Include, IncludeOptional : 보조 환경 파일 위치

-> 주 설정 파일에 모든 설정을 때려박으면 너무 커져서 찾기가 힘들다.

DocumentRoot : 기본 웹 문서 경로

DirectoryIndex : 가장 우선적으로 여는 파일

/etc/httpd/conf.d : 아파치 추가 설정 파일들이 들어있는 위치

/usr/share/httpd/error : 아파치 에러 코드에 따른 에러 문서 위치

/var/www/html : 아파치 웹 문서들이 들어가는 위치

/var/log/httpd : 아파치 웹 로그(access_log, error_log)들이 존재하는 위치

-> tail -f 옵션으로 실시간 로그 보기 가능

 

lsof -i tcp:80

-> tcp 80번 포트를 사용하는 데몬과 사용자의 정보 값을 보여준다.

 

CGI : 서버사이드스트립트와 웹 서버가 주고받는 통신을 정의한다.

 

실습 환경 설정을 위해 php, perl 설치

-> yum -y install php php-pear

-> yum -y install perl perl-CGI

 

/etc/httpd/conf/httpd.conf 파일에서

<Directory> ~ </Directory> 항목은 지정한 디렉터리 이하의 모든 파일에 대한 제어를 어떤 방식으로 할 것인가를 결정하는 지시자. 크게 Options 항목(지정 디렉터리 이하에 모든 파일과 디렉터리에 적용할 접근 제어를 설정)과 AllowOverride 항목(특정 디렉터리에 대한 방문자들의 접근을 어떤 방식으로 인증하여 허용할 것인가에 대한 설정)으로 나뉜다.

다른 것은 기억할 필요 없으나, CGI 사용 시

<Directory>~</Directory>에서 Options +ExecCGI 수정, 그 위에 ScriptAlias /cgi-bin/ "/var/www/cgi-bin" 추가

AddHandler cgi-script .cgi 주석 해제하고 .pl 추가

를 해줘야 한다는 것만 기억. 이렇게 하면 동적 스크립트 언어 웹 페이지 요청을 httpd가 응답한다.

 

 

사용자 홈 디렉터리 별 호스팅

-> ~userid의 권한은 711, ~userid/public_html 권한은 755

 

~user1이 아니라 user1 쳐서 들어가고 싶다면 /etc/httpd/conf/httpd.conf 파일에서 Alias 찾아서 

Alias /user1/ "/home/user1/public_html/"

추가

 

인증

httpd.conf 파일의 <Directory>에서 AllowOverride 부분에 AuthConfig 설정 : 사용자 암호 인증

-> Basic 인증

/etc/httpd/conf/httpd.conf

-> Digest 인증

 

 

가상 호스트 : 한 서버에서 여러 웹 사이트를 서비스하는 아파치 웹 서버의 기능

1. 이름 기반 : 하나의 서버에 여러 이름의 가상 호스트 운영

2. 주소 기반 : 여러 ip의 가상 호스트 운영

3. 포트 기반 : "주소:포트번호"

4. 기본 가상 호스트 : 위 내용이 없을 시 기본 동작하는 가상 호스트

 

자세한 에러 보기 

journalctl -xe


https = http + SSL/TLS

비대칭키 인증 수단, 개인키(암호화) 서명, 공개키(복호화)

ssl 통신 과정 대충 기억해두기

 

1. 인증서 생성(인증서 위치는 /etc/pki/tls/certs/)

   1-1. 개인키 생성

   1-2. 요청서키 생성

   1-3. 개인키+요청서키 인증서 생성

2. ssl.conf 생성

3. 테스트

 

x.509 PKI

x.500 Directory Service

 

설정 파일 위치는 /etc/httpd/conf.d/ssl.conf


2교시(10:30 ~11:00) firewall-cmd 명령어

3교시(11:30~11:45) 웹 서버 차이

4교시(12:30~13:00) 설정 설명

5교시(14:40~15:00) 사용자 홈 디렉터리 별 설정

        (15:10~15:20) 사용자 홈 디렉터리별 설정

6교시(15:30~16:10) 사용자 인증 페이지

7교시 전체 가상 호스트 설정

 

머리 터지겠다. 씹지도 못하는 분량을 목구멍으로 때려 박히고 있다

'교육' 카테고리의 다른 글

[31일 차] 21.09.01 : Linux Server 10  (0) 2021.09.01
[30일 차] 21.08.31 : Linux Server 9  (0) 2021.08.31
[메모] 21.08.29 : 할 일  (0) 2021.08.29
[28일 차] 21.08.27 : Linux Server 7  (0) 2021.08.27
[27일 차] 21.08.26 : Linux Server 6  (0) 2021.08.26

댓글