24일차) 2025-02-03 (Proxy, Mint, SSH, Telnet, Key Pair, 3 tier Architecture)
팀실습_풀이)
여러분들의 노트북이나 스마트폰처럼 와이파이 어댑터로부터 외부 통신에 필요한 정보(디폴트루트, IP)를 받아옵니다.
3명이 짝을 이뤄 내부에 다음과 같은 서버를 만드셔서 서로의 정보를 공유해야합니다.
결론적으로 영수나 옥순은 상철의 주소에 영문주소로 접속해야하고, 최종적으로 박찬민은 상철의 IP에 브라우저로 접속했을때 wordpress 화면이 떠야합니다.
- 영수 - DNS
- 옥순 - DB
- 상철 - WP
→ Bridge 대역에 두고, NAT(PAT: 내부 → 외부) 설정 필요함
→ 라우터의 맥주소를 변경한 이유?
GNS3를 통해서 와이파이를 통해 브릿지로 부여받기 위해 쓴 꼼수, 맥주소는 되도록 임의로 변경안하는 것이 좋고, 변경하더라도 겹치지 않게 변경해야 함
→ 서로 다른 네트워크를 갖고 있을때 통신하고 싶으면 어떻게 해야할까?
노트북이 같은 네트워크에 있었으면 좋겠다. 노트북 내부에는 서로 다른 대역을 갖고 있고, 그 대역에 있는 VM끼리 서로 통신을 했으면 하는 것이 목표
→ 내부 대역대 설정?
내부의 네트워크를 어떻게 가져가는지가 중요하지 않고, 외부에서 Bridge 대역에서 통신하는 것이 중요함
(타인입장에서 내부의 사정은 중요하지 않음 = 어차피 NAT가 발생하고 브릿지 대역에서만 서로 통신 잘되면 됨)
자율과제_풀이)
1. 셋이서 한걸 혼자서 한번 해보세요! 브릿지를 vmnet8로만 바꿔서
→ 클라우드 하나에 3개 선을 연결할 수 없으므로 클라우드 3개에 각각 연결해야 함
→ 내부의 네트워크를 서로 다르게 가져가야함(vmnet1, vmnet2, vmnet3)
- R1, R2, R3의 f0/0/이 같은 대역에 있으면 좋겠다
- vmnet8은 dhcp 서버가 꺼져있기 때문에 virtual network editor에서 dhcp를 활성해서 받아도 좋고, 수동으로 입력하는게 제일 쉽고 빠르긴 함
- 다만, Bridge에서는 IP충돌을 방지하기 위해 수동으로 협력하면 서로 겹칠 위험이 있음
→ 라우터의 맥주소를 변경하지 않는 것이 맞음
2. 혼자서 브릿지 대역을 쓴다면 어떻게 구성하면 좋을지 생각해보고 한번 해보세요!
→ VM을 3개 만들어서 전부 브릿지대역에 두는 수 밖에 없음
→ 위 문제에서 ‘내부’라는 단서만 없었다면 이렇게 해도 상관 없음
Proxy 서버
다수의 클라이언트를 대리
- 캐싱: 프록시가 서버로부터 받아와 대표로 저장함
- 클라이언트 보호: 랜섬웨어 방지
- 클라이언트 차단: 유출 방지
Proxy 서버 구축
vm이름: proxy, 2core 2GB 20GB, IP: 211.183.3.77 /24
- 프록시 서버 패키지 설치
[root@proxy ~]# yum install -y squid
- 대상 설정
[root@proxy ~]# vi /etc/squid/squid.conf
# localnet이라는 이름의 출발지 주소 = 대리하고 싶은 서버인 민트가 속한 211.183.3.0 /24
Mint 클라이언트 구축
민트: 우분투 계열의 데스크톱을 위한 운영체제
vm이름: mint, 2processor 2core 4GB 20GB , 211.183.3.100 /24
- 실제로 프록시서버를 통해 접속한건지 확인하기 위해 프록시 서버로 이동
[root@proxy ~]# cd /var/log/squid
실습)
계정의 패스워드 설정 명령은 passwd <계정명> <패스워드> 입니다. 민트 서버의 root 계정을 설정한 다음. 민트 서버의 root 계정으로 ssh 접속을 해보세요!
우분투에서 SSH 접속
# 일단 게이트웨이 살려주고
# 터미널에서 핑쳐서 확인
# root 계정의 암호 설정
# ssh 서버 서비스가 없다. => 설치 필요
# 우분투는 패키지관리자가 apt 혹은 apt-get (상위호환 느낌)
- 패키지 설치
♨ 만약 우분투를 비롯한 리눅스 서버에서 패키지가 설치 안된다면? ♨
apt update -y로 update 시도, 그래도 안되면 다른 원인 찾기
# 방화벽이 존재하지 않고, 대부분의 우분투 서버들은 기본적으로 방화벽이 off 되어있는 상태
# 우분투에서의 방화벽 설정 명령 ‘ufw’
- root 계정의 암호가 틀리지 않았다는걸 검증하기 위해 user1로 사용자 변경했다가 다시 로그인
- user1로는 접속되는지 테스트
# ssh 서버에 클라이언트로서 접속을 하면, 서버는 공개키를 제공한다. 특히, 처음 접속하면, 그래서 본인이 모르는 서버였다면, 클라이언트 스스로 사용자에게 위와 같은 경고메세지를 띄우고 자신의 목록에 내가 접속했던 서버의 공개키와 주소(IP나 호스트네임 등..) 를 추가한다. 다시 접속하면 이미 목록(리눅스의 경우 ~/.ssh/known_hosts)에 내가 접속한 서버의 주소에 대한 공개키가 존재하면 경고를 띄우지 않는다.
SSH (Secure SHell)
보안 원격 접속 프로토콜, 메세지 암호화, tcp 22
telnet
평문 메세지, tcp 23
1. Key Pair
PKI(Public Key Infrastructure)
비대칭키
- Private key (개인키)
노출되면 안되는 열쇠
- Public key (공개키)
노출가능한 자물쇠
2. 인증
- ID / PW
- 공개키 방식(키페어 사용)
세션 수립 전
세션 수립 후
(메세지를 주고받을 준비 완료)
3. 암호화 (AES)
대칭키
메세지를 어떻게 암호화 / 복호화할지
- SSH 통신을 위해 알아야하는 개념
- 공개키 방식의 인증: 클라이언트는 프라이빗키를 갖고있고, 서버는 공개키를 갖고 인증하는 방식 (= aws 키페어)
MD5
해시 알고리즘
단방향 암호화, 일정한 비트를 출력, 변조 확인 및 검증 가능하지만 복원은 불가능
root 계정으로 민트서버에 접속이 안됐었던 이유?
인증방식이 ID/PW를 불허하고 있기 때문, openssh-server의 설정을 변경하면 될 것
- vi 편집기가 이상하면 vim 편집기를 설치
root@mint:/home/user1# apt install -y vim
- ssh서버의 인증방식을 아이디/패스워드를 허용하게끔 하고 싶음
root@mint:/home/user1# vi /etc/ssh/sshd_config
# 아래대로 수정
PermitRootLogin yes
- 수정 후 재시작
root@mint:/home/user1# systemctl restart sshd
[root@proxy ~]# ssh root@211.183.3.100
- known_hosts 확인
[root@proxy ~]# ls ~/.ssh/
known_hosts
[root@proxy ~]# cat ~/.ssh/known_hosts
211.183.3.100 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJfcDczee88hnht2W3pLyWs072iY1EKKuVl/JPhcv7+R6AUnBznl7oSzdvwPCvXt6fCSQWTi5VPKl8R1El6Pj6g=
- 이동 후 known_hosts 파일 삭제
[root@proxy ~]# cd ~/.ssh/
[root@proxy .ssh]# rm known_hosts
rm: remove regular file ‘known_hosts’? y
문제)
mint 서버에 첫 접속 시(=공개키 모르는 상태) yes 안치게 하려면 어떻게 하면 좋을까?
- 서버 첫 접속시 팝업이나 경고가뜨는건 ‘self 경고’
- 따라서 이 경고가 안뜨도록 클라이언트를 설정하면 된다.
1. GPT
root@mint:~# mkdir -p ~/.ssh
root@mint:~# touch ~/.ssh/config
root@mint:~# chmod 600 ~/.ssh/config
root@mint:~# nano ~/.ssh/config
Host 211.183.3.100
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
GlobalKnownHostsFile /dev/null
root@mint:~# ssh root@211.183.3.100
Warning: Permanently added '211.183.3.100' (ECDSA) to the list of known hosts. root@211.183.3.100's password: Last login: Mon Feb 3 14:46:14 2025 from 211.183.3.100
2. 풀이1
- ssh_config 파일을 수정
root@mint:~# vi /etc/ssh/ssh_config
# 아래대로 수정
StrictHostKeyChecking no
3. 풀이2
- ssh 접속 명령어에 인자를 전달
[root@proxy .ssh]# ssh root@211.183.3.100 -o StrictHostKeyChecking=no
♨ 3 tier Architecture ♨
애플리케이션을 3개 계층으로 분리하는 구조
Presentation(프론트엔드) / Application(비즈니스 로직) / Database(데이터 관리)
(tier: 물리적으로 다른 서버)
# 클라이언트(서비스를 받는 사용자들)이 접근 가능한 서버는 결국 web서버까지만이다.
= was나 db는 내부에 접근 불가능한 장소에 존재해야 한다.
# 사실 셋다 노출안되는 것이 베스트...!
서로 독립적인 서버를 구성할 때 장점?
→ 물리적으로 다른 서버에 나눈 이유
- 확장성↑
특정한 티어에 대해서만 서버 확장 가능 - 유지보수가 독립적
한 서버에 문제가 생기더라도 다른 서버에 영향을 미치지 않음
한 부분을 변경해도 다른 계층에 영향이 적음 - 보안성↑
사용자가 서비스는 이용하되, 외부에서 DB에 접근을 못하도록 함
실습)
TOMCAT
Java로 웹페이지(웹앱)를 만들었다면, 이런 웹앱을 배포하는 WAS
개발환경 구성이 필요함 → JAVA(openjdk-11), tomcat(10버전)
tomcat 구축
vm이름: tomcat, cent7, 2 core 2GB 20GB, IP: 211.183.3.88
- openjdk11과 wget, unzip을 설치
[root@tomcat ~]# yum install -y java-11-openjdk wget unzip
- 톰캣 10버전 설치 페이지
https://tomcat.apache.org/download-10.cgi
- 버전에 따라서 그때그때 다를 수도 있음, 위 링크에서 찾으쇼↑
[root@tomcat ~]# wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.34/bin/apache-tomcat-10.1.34.zip
[root@tomcat ~]# unzip apache-tomcat-10.1.34.zip > /dev/null
- 압축 해제하면서 결과 출력 x
- 이름 변경
[root@tomcat ~]# mv apache-tomcat-10.1.34/ tomcat
- tomcat 동작파일을 실행하기 위해 모든 권한 부여
[root@tomcat tomcat]# chmod 777 -R /root/tomcat
- 실행
[root@tomcat tomcat]# sh ./bin/startup.sh
- 브라우저에 http://211.183.3.88:8080/ 입력
- sample.war 파일이 저장됨
[root@tomcat tomcat]# wget https://tomcat.apache.org/tomcat-6.0-doc/appdev/sample/sample.war
- 파일 이동 후 압축해제 확인
[root@tomcat tomcat]# mv sample.war /root/tomcat/webapps
[root@tomcat tomcat]# ls /root/tomcat/webapps
docs examples host-manager manager ROOT sample.war
- 브라우저에 http://211.183.3.88:8080/sample/ 입력
실습)
이번에는 간단한 jsp파일을 배포해보자
# test.jsp로 만들어보자
[root@tomcat tomcat]# vi /root/tomcat/webapps/ROOT/test.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<html>
<head><title>hello world</title></head>
<body>
<h2>
TOMCAT TEST<br><br>
time : <%= new java.util.Date()%>
<%@ page import="java.net.InetAddress" %><br>
<%InetAddress inet= InetAddress.getLocalHost();%>
WAS ip : <%=inet.getHostAddress()%>
</h2>
</body>
</html>
[root@tomcat tomcat]# ./bin/shutdown.sh
[root@tomcat tomcat]# ./bin/startup.sh
# shutdown.sh 나 startup.sh 는 결국 스크립트인데 실행하고 중지할 대상은 결국
# 이 catalina.sh 파일이다. 하지만 이 파일을 직접 실행시키지 않는 이유는 foreground로 동작하기때문이다.
# 나중에 컨테이너 환경에서는 반드시 foreground로 동작시켜야하는 경우가 발생한다.
DB 구축
vm이름: dbdb, cent7, 2core 2GB 20GB, IP: 211.183.3.6
- 패키지 설치
[root@dbdb ~]# yum install -y mariadb-server
[root@dbdb ~]# systemctl restart mariadb
[root@dbdb ~]# systemctl enable mariadb
[root@dbdb ~]# mysql_secure_installation
- db 접속
[root@dbdb ~]# mysql -u root -p1234
MariaDB [(none)]> create database tomcatdb;
MariaDB [(none)]> grant all privileges on tomcatdb.* to tomcatuser@'%' identified by '1234';
- DB이름 : tomcatdb
- DB사용자 : tomcatuser
- DB암호 : 1234
- DB주소 : 211.183.3.6
톰캣서버로 돌아가서 mysql 명령어 설치 후 db접속이 되는지 확인
- mysql 명령어 설치
[root@tomcat tomcat]# yum install -y mysql
- db 접속 확인
[root@tomcat ~]# mysql -u tomcatuser -p1234 -h 211.183.3.6
- 아래 내용을 수정하여 dbtest.jsp 파일 생성
cat <<EOF > dbtest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<h1>DB</h2>
<%
Connection conn=null;
try{
String Url="jdbc:mysql://<DB주소>/<DB이름>";
String Id="<DB유저>";
String Pass="<유저암호>";
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(Url,Id,Pass);
out.println("was-db Connection Success!");
}catch(Exception e) {
e.printStackTrace();
}
%>
EOF
[root@tomcat ~]# vi dbtest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<h1>DB</h2>
<%
Connection conn=null;
try{
String Url="jdbc:mysql://211.183.3.6/tomcatdb";
String Id="tomcatuser";
String Pass="1234";
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(Url,Id,Pass);
out.println("was-db Connection Success!");
}catch(Exception e) {
e.printStackTrace();
}
%>
- 수정을 잘 했다면 /root/tomcat/webapps/ROOT 경로로 파일 이동
[root@tomcat ~]# mv dbtest.jsp /root/tomcat/webapps/ROOT/dbtest.jsp
자바로 DB에 연동하기 위해선 jdbc 라이브러리가 필요
- jdbc 페이지 경로
https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.23
- 라이브러리 다운
[root@tomcat ROOT]# wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar
- 라이브러리 폴더(lib)에 jdbc 이동
[root@tomcat tomcat]# mv mysql-connector-java-8.0.23.jar /root/tomcat/lib
- 톰캣 재시작
[root@tomcat tomcat]# ./bin/shutdown.sh
[root@tomcat tomcat]# ./bin/startup.sh
♨ http 오류가 뜬다면 ♨
파일의 몇번째 라인에서 문제가 생겼는지 확인 후 수정
'AWS Cloud School 8기 > Proxy' 카테고리의 다른 글
25일차) 2025-02-04 (Reverse Proxy) (1) | 2025.02.04 |
---|