본문 바로가기
정보보안

정보보안8 2차시

by IT매니절 2024. 11. 10.

AJP (Apache Jserv Protocol)
아파치 웹서버와 톰캣이 서로 통신하는 프로토콜
Jserv는 Java Servle의 약자. 아파치 톰캣 프로젝트로 흡수됨.

아파치 웹서버 - 정적인 페이지 (이미지)
아파치 톰캣 - 동적인 페이지

 

sudo dnf -y install make gcc wget httpd httpd-devel redhat-rpm-config libtool
=> tomcat-connectors를 컴파일하여 설치하기 위한 패키지 설치

wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.50-src.tar.gz
wget으로 다운로드

make 패키지
makefile을 기반으로 소스 코드 빌드를 자동화하는 도구
make 명령어를 통해 makefile에 저장된 방법에 따라 컴파일 진행
makefile을 만들어주는 도구는 configure 쉘스크립트

( 순서: configure -> make -> make install )

gcc 패키지
c/c++ 컴파일러. 소스코드를 바이너리로 컴파일 할 때 사용한다.

httpd-devel
아파치 http 서버 개발 도구
모듈을 개발하거나 특정 확장 기능을 빌드할 때 사용
./configure 명령어 사용에 필요

redhat-rpm-config
소프트웨어 패키지를 RPM 포맷으로 빌드할 때 필요한 설정 파일과 스크립트 제공

libtool
라이브러리 생성 및 관리 도구

 

sha512sum tomcat-connectors-1.2.50-src.tar.gz
=> 해당 파일의 무결성을 sha512sum으로 무결성을 검사한다. 해시값을 제공된 원본 값과 비교해 확인한다.
(sha512sum = sha2(sha512), 512bit)

sudo dnf -y install python312
=> 파이썬 설치

tar xzf tomcat-connectors-1.2.50-src.tar.gz
cd tomcat-connectors-1.2.50-src/native
=> 압축을 풀고 폴더 내부로 들어간다.

 

$ ls
BUILDING.txt  Makefile.in  TODO.txt    buildconf.sh  configure.ac  scripts
CHANGES       NEWS         aclocal.m4  common        docs
Makefile.am   README.txt   apache-2.0  configure     iis

( configure 가 있는 폴더 )

 

./configure --with-apxs=/usr/bin/apxs
=> 빌드를 위한 환경설정으로 --with-apxs 파라미터를 이용해 apxs의 위치를 알려준다. apxs가 없는 경우는 아파치가 devel 패키지가 아닌 경우이다. devel 버전을 업데이트 해주면 된다. ($ which apxs 명령어로 경로 확인)
make

( * libtool: warning: remember to run 'libtool --finish /usr/lib64/httpd/modules' : 해당 메시지는 install 이후에 해당 명령어를 실행해달라는 뜻이다 )
sudo make install
sudo libtool --finish /usr/lib64/httpd/modules

완료

 

ll /usr/lib64/httpd/modules/mod_jk*

=> 설치가 완료되면 해당 경로에 mod_jk.so가 생성된다

(libphp.lso(php), mod_vhost_alias.so(가상호스트))

 

Tomcat worker
웹 클라이언트가 페이지 요청시, 아파치 웹서버(클라이언트)에서 mod_jk를 통해 톰캣 WAS(백엔드 서버)로 전달한다
이 때 아파치 웹서버에서 Tomcat Connectors (mod_jk) 모듈을 사용한다
하나의 worker는 하나의 Tomcat 인스턴스를 의미함
다중 worker를 정의하면 하나의 아파치가 다수의 Tomcat 인스턴스에 부하를 분산할 수 있음 (장애방지)

 

worker는 Local, Remote 둘 다 구현 가능
단일 worker (=> 단일 tomcat)
다중 worker (=> 다중 tomcat)
다중 worker 로드 밸런서 그룹 (여러 worker를 하나의 로드 밸런서로 묶는다)

 

worker 기본 구성
worker.인스턴스명.변수명=값

worker 구성요소
인스턴스명 : 각 tomcat 인스턴스 식별시 사용
변수명: 해당 인스턴스의 특정 설정 항목

단일 worker
하나의 tomcat 인스턴스에 대해 하나의 worker 정의
모든 AJP 요청이 해당 tomcat 인스턴스로 전달

worker.list=worker1

다중 worker
여러 tomcat 서버가 있을때 각 서버를 worker로 정의한다
다중 tomcat 인스턴스가 있을 때, 각 인스턴스를 개별 worker로 정의한다

worker.list=worker1,worker2,worker3 ... 하략

 

다중 worker 로드 밸런서 그룹
여러 worker를 하나의 로드 밸런서 그룹으로 묶는다

하나의 worker가 다운되면 다른 worker가 요청을 처리할 수 있다
worker.list=loadbalancer
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1,worker2,worker3 ... 하략

 

vim /etc/httpd/conf/httpd.conf
ServerName에 127.0.0.1:80
LoadModule jk_module modules/mod_jk.so

<ifModule jk_module> #jk_module이 있을때만 실행하는 if문
 JkWorkersFile "properties 파일경로" ex) "conf/workers.properties"
 JkLogFile "로그 파일경로" ex) "logs/mod_jk.log"
 JkLogLevel 로그레벨 #(info 등)
 JkLogStampFormat "[%a %b %d %h:%M:%S %Y]" #포맷
 JkRequestLogFormat "%w%v%T" #로그포맷
 JkShmFile 공유메모리 파일 경로 #아파치 http서버-톰캣간 공유메모리 관리 ex) run/mod_jk.shm
</ifModule>

 

<VirtualHost *:80>
    DocumentRoot 웹서버 루트 디렉토리 ex) /usr/share/tomcat/webapps/ROOT
    ServerName   서버IP나 도메인 ex) 192.168.100.N
    JkMount /* worker1 # 모든 요청을 worker1로 설정된 톰캣 worker에 전달
</VirtualHost>

 

해당 설정들을 추가해준다

정적 파일 확장자는 Tomcat으로 전달하지 않음
ex) JkUnmount /*.jpg worker1, JkUnmount /*.png worker1, JkUnmount /*.gif worker1
JkUnmount /*.css worker1, JkUnmount /*.js worker1

vi /etc/httpd/conf/workers.properties
=> JkWorkersFile로 지정한 경로에 파일을 만들어준다

worker.worker1.type는 프로토콜을 의미함

 

AJP 프로토콜 커넥터 활성화
AJP는 아파치 웹서버-톰캣이 통신할때 필요한 프로토콜이며
(로키 리눅스8 기준) 기본값이 주석으로 비활성화되어 있으므로 주석을 제거하고
secretRequired="false" 를 추가해준다.

secretRequired
톰캣 9.0.31부터 AJP 프로토콜 보안 강화를 위해 추가된 옵션
아파치와 톰캣간 비밀키Secret key를 요구하여 인증한다
단, 아파치와 톰캣이 동일서버에서 동작할 때는 비밀키 없이도 사용 가능
보안을 강화하려면 true로 설정하고 아파치와 톰캣에 둘 다 설정해준다
(아파치 웹서버) workers.properties: worker.worker1.secret=값 으로 설정한다.
(톰캣 WAS) server.xml: <Connector protocol="AJP/1.3" ... 중략 ... secret="값" />

 

vi /etc/tomcat/server.xml

124 라인 근처의 커넥터Connector 설정을 주석해제하고 비밀키 한줄 추가.

 

address는 실습을 위해 0.0.0.0 으로 모두 열어주었다.

 

sudo httpd -t
sudo setenforce 0
sudo systemctl restart tomcat.service httpd.service

 

httpd 문법검사 후 이상없으면 selinux 끄고 톰캣 재시작.

 

vi /etc/tomcat/server.xml

<Connector port="8080" protocol="HTTP/1.1"

보안을 위해 요 부분 주석처리하여 8080 포트 접속 차단하고

 

sudo firewall-cmd --permanent --remove-port=8080/tcp
sudo firewall-cmd --reload

8080 포트를 방화벽에서 제거해준다

 

vi /etc/selinux/config
SELINUX=permissive

=> 영구적으로 selinux 기능 off 시키기

 

 

보안서버
- 클라이언트와 서버간 주고받는 정보를 암호화해서 전송하는 서버
- https가 암호화 전송을 의미함

sudo dnf -y install mod_ssl
sudo systemctl restart httpd.service

=> mod_ssl 설치하고 httpd 재시작. mod_ssl 안에 사설 인증서가 포함되어있다.

 

ServerName을 도메인을 사용해 설정해주었다

도메인을 강사님이 제공해주셨다

접속화면

 

 

다중 worker

192.168.100.10은 vm웨어로 하나를 더 켰다

 

worker.worker1.lbfactor=1
로드 밸런싱 팩터 설정. 가중치가 높을수록 요청을 더 많이 할당한다

lbfactor 값은 각 서버의 요청 처리 비율을 조정하는 역할

 

worker2용 서버에도 똑같이 /etc/tomcat/server.xml과 workers.properties를 수정했다

 

worker2용 서버에 추가한 방화벽 설정

$ sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.100.23' port port='8009' protocol='tcp' accept"
$ sudo firewall-cmd --reload

=> 특정 ip에서만 방화벽 8009를 열어주는 설정

( --add-rich-rule : 세부규칙 추가
rule family='ipv4' : ipv4에 적용한다는 뜻 )

 

$ sudo firewall-cmd --list-rich-rules
rule family="ipv4" source address="192.168.100.23" port port="8009" protocol="tcp" accept

확인은 list-rich-rules로 해야된다

(자주 쓰는 명령어는 --list-services 혹은 --list-ports 같은 것들인데 이걸론 안나옴 )

 

접속완
worker2의 /etc/tomcat/server.xml

worker2와 톰캣이 서로 다른 서버에 있으므로, 보안상 secretRequired를 true로 설정한다

비밀키는 openssl rand -base64 16에 특수문자를 덧붙였다

 

worker1의 /etc/httpd/conf/workers.properties

 

'정보보안' 카테고리의 다른 글

정보보안8 4차시  (0) 2024.11.17
정보보안8 3차시  (0) 2024.11.16
정보보안8 1차시  (0) 2024.11.09
정보보안7 8차시  (0) 2024.11.03
정보보안7 6차시  (0) 2024.10.20