이 포스트는 다 이해 안하셔도 됩니다. 그냥 우리가 배운 리눅스 서버를 어떻게 활용하고 보안전문가, 해커, 개발자가 어떻게 바라보고 있는지에 대한 큰 그림만을 그리셔도 됩니다.
기본 설정
기본 EC2 로그인은 ssh로 설정되어 있습니다. 서버에 공개키를 두고 각 사용자마다의 개인의 개인키를 두어서 로그인을 하는 구조이죠
만약 로그인 체제를 password로 바꾸어서 로그인하고 싶다면 어떻게 할까요? 우선 아래의 명령어로 ubuntu라는 user의 password를 설정해 주도록 하겠습니다.
$sudo passwd ubuntu
그 다음에 저희는 root유저의 passwd를 설정하고 root유저로 접속하고 싶으니까 아래의 명령어도 쳐줍니다.
$sudo passwd root
그리고 아래의 명령어로 root계정으로 들어갑니다.
$su - root
그리고 저희는 ssh config파일을 찾아가서 기존의 로그인 체제를 password로 로그인하게 바꿔보도록 하겠습니다.
/etc/ssh/sshd_config
우선 sshd_config의 파일의 주인은 root이고 다른 사람은 read권한이 없습니다. 저희는 vim으로 sshd_config를 들어가서 다음을 수정해 줄겁니다. 원래는 아래의 문구가 주석 처리 되어있을 것인데, 주석을 풀어줘야 합니다.
PasswordAuthentication yes
이 외에도 ssh의 다양한 설정을 수정해 줄 수 있습니다. 접속 PORT, ROOT계정 접속 방법...
VSCode SSH Config
개발자는 매우 귀찮음이 많아야 합니다. 그 이유는, 반복되는 작업을 한번에 처리해 줘야 하는 습관을 들여야 하기 때문입니다. 따라서 vscode에 버튼 하나만 누르면 저희가 만든 EC2 인스턴스에 접속할 수 있게 하겠습니다.
저희는 IdentityFile Version으로 접속하지 않을 거지만 방법만 간단히 살펴 보도록 하겠습니다.
< IdentityFile Version >
vsocde remote ssh config file
Host knu_locker
HostName raipen.gabia.io
User raipen
Host kert_master
HostName 155.230.52.54
User hyunseo
Host test_server
HostName ec2-13-209-97-177.ap-northeast-2.compute.amazonaws.com
User ubuntu
IdentityFile ~/Desktop/Coding/OS/PEM/key.pem
여기서 저희는 접속하고자 하는 server의 이름을 test_server로 하였습니다.
그리고 host이름에 저희 ec2인스턴스의 호스트 DNS이름을 작성해 줍니다. 그리고 기본 User인 ubuntu로 User이름을 설정해 주고, 인스턴스를 만들 떄 다운받은 key파일의 경로를 IdentityFile을 작성해 줍니다.
인스턴스가 처음 부팅될 떄 시작 시 지정한 퍼블릭 키가 Linux 인스턴스에 있는 ~/.ssh/authroized_keys내에 배치됩니다. SSH를 사용하여 Linux인스턴스에 연결할 때 로그인하려면 퍼블릭 키에 해당하는 프라이빗 키를 지정해야 합니다.
Amazon EC2에서 사용되는 키는 ED25519 또는 2048비트 SSH-2 RSA 키입니다.
< password Version >
그냥 IdentityFile저 라인만 삭제 해 주면 됩니다.
Ubuntu WIth Nginx ( Web Server )
웹 서버란 HTTP Server라고도 합니다. 대표적으로는 Nginx, Apache등이 있습니다. 웹 서버는 인터넷 네트워크 위에서 HTTP프로토콜을 이용해 HTML, CSS, JS, image/mediafile과 같은 정적인 정보들을 웹 브라우저에 전송하는 역할을 합니다.
이 Nginx에서 중요한 부분은, Reverse Proxy Server로서 Client와 Server를 중개한다는 점입니다.
Forward Proxy
사용자가 google.com에 연결하려고 하면 사용자 PC가 직접 연결하는게 아니라 포워드 프록시 서버가 요청을 받아서 google.com에 연결하여 그 결과를 클라이언트에 전달합니다 (forward)
포워드 프록시는 대개 캐슁 기능이 있으므로 자주 사용되는 컨텐츠라면 월등한 성능 향상을 가져올 수 있으며 정해진 사이트만 연결하게 설정하는 등 웹 사용 환경을 제한할 수 있으므로 보안이 매우 중요한 기업 환경등에서 많이 사용합니다.
Reverse proxy
리버스 프록시로 웹 서버를 설정할 경우 google.com웹 서비스에 데이터를 요청하면 Reverse Proxy는 이 요청을 받아서 내부 서버(WAS)에서 데이타를 받은 후에 이 데이터를 사용자에게 다시 전달하게 됩니다.
대부분의 WAS는 Web Server의 기능을 제공하지만 Web Server의 Static File Serving속도와 Road Balalcing기능이 WAS보다 뛰어 납니다 ( WAS하나로도 가능하긴 하다 )
이제 이러한 기능을 저희가 만든 EC2인스턴스에서 Nginx와 Node를 설치해 보면서 실제로 어떻게 돌아가고 웹 페이지의 기본적인 원리에 대해서 알아보도록 하겠습니다.
$sudo apt update
$sudo apt upgrade
$sudo apt install nginx
// nginx경로 확인
$sudo find / -name nginx.conf
이 과정을 거치면 기본적으로 80번 포트에 nginx의 default root에 있는 index.html파일이 serving되는 것을 보실 수 있습니다.
( 저의 EC2인스턴스의 공개 Ipv4 Ip >> 52.79.160.28 ) 치고 들어오면 저 화면 뜰것입니다.
또한 저희는 sudo권한을 위해 root로 접속하고 nginx configure파일을 수정해 보도록 하겠습니다.
$su - root
$find / -name nginx.conf
// 위에서 nginx.conf경로에서 vim으로 수정
$vim /etc/nginx/nginx.conf
기본저그올 NGINX의 모듈들은 configure파일에 있는 directives에 의해 제어됩니다. 그 중 저희는 block directive를 사용합니다. 여기에는 기본적으로 event블럭과 http블럭이 있습니다. 저희는 http 트래픽을 관리하는 http directive를 수정해 보도록 하겠습니다.
저희는 트래픽을 다루는 context안에서 가상호스트 설정을 시작하겠습니다. 잠깐 또 가상 호스트에 대해 살펴보겠습니다.
Host는 네트워크에 연결된 하나의 컴퓨터를 의미합니다. Virtual Host는 한대의 컴퓨터로 마치 여러 대의 컴퓨터가 존재하는 것처럼 동작하도록 한다는 것입니다. 예를 들어 egoing.net, deving.net이 있다고 합시다. 하지만 이 둘은 접속했을 때 1.226.82.52IP를 가르키고, 1.226.82.52IP에 해당하는 Host가 각각의 도메인에 따라서 서로 다른 페이지를 서비스 하게 할 수 있는 것이 Virutal Host입니다.
저희는 이를 구현하기 위해 일단 하나의 server블록을 http context안에 만들어 보도록 하겠습니다.
제가 작성한 코드를 분석해 보도록 하겠습니다.
80번 포트를 열었고, root디렉토리를 /home/ubuntu/testServer로 해 놓았습니다. 그리고 /hello경로에는 localhost:8080로 리다이렉션 시키고, /world경로는 localhost:7777로 리다이렉션 시켰으며, /static이라는 가상 경로를 설정해서 /home/ubuntu/testServer/static에 매칭시켜주었습니다.
이제 node서버를 구축해서 8888, 7777번 포트를 listening해 주는 작업을 해 보도록 하겠습니다. 이 전에 ubuntu에 nvm, node,npm을 설치해야 합니다.
기본 적인 가이드는 위와 같이 공식 문서에 나와 있습니다. 아래의 명령어를 따라 쳐보세요
$curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$. ~/.nvm/nvm.sh
$nvm install node
// 잘 설치되었다면
$node -e "console.log('Running Node.js ' + process.version)"
$sudo apt install npm
우선 ~( root 경로)에서 testServer디렉토리를 만들고 아래와 같이 명령어를 칩니다.
$npm init -y
$touch server.js
$mkdir static && touch static/testfile.json
$touch testfile.json
그리고 server.js파일 안에 node server를 만들어 보도록 하겠습니다.
그리고 기타 파일들은 git을 참고하시기 바랍니다.
https://github.com/LE123123/Ec2NginxGuid
그리고 netstat으로 지금 열려있는 tcp port들을 싹다 확인해 보도록 하겠습니다.
$sudo apt install net-tools
$netstat -tnl
다음과 같이 5000, 80, 22, 7777, 8888다 정상 작동하는 것을 확인할 수 있습니다. 여기서 5000은 nginx기본 포트를 제가 5000으로 설정했기 때문입니다. /etc/nginx/sites-available/default파일에 들어가면 이를 설정할 수 있습니다.
여기서 자세히 보면 root도 되어 있는데 /var/www/html에 뭐가 있나 확인해 보면 바로 여기에 nginx기본 페이지의 index파일이 있게 됩니다.
이제 설정한 모든 경로를 확인해 보겠습니다.
location /hello를 하면 7777포트와 연결되게 됩니다. 이 서버는 화면에 world을 렌더링 합니다.
location /world를 하면 8888포트와 연결되게 됩니다. 이 서버는 화면에 World를 렌더링합니다.
그리고 /static을 /home/ubuntu/testServer/static과 매칭했는데, 이도 정상 작동하는 것을 확인할 수 있습니다.
그리고 바로 루트 아래에 있는 testfile.json도 잘 열리는 것을 확인할 수 있습니다.
이 외에도 다양한 에러 페이지가 존재 하게 되는데, 정상 렌더링 됩니다. ( 어딘가에 경로가 있을 겁니다. )
이와같이 리눅스 서버에 자신만의 서버를 구축하고 정적파일을 서빙하면서 자신만의 웹 사이트를 구축할 수 있게 됩니다. 이외에도 리눅스는 네트워크 스위치, 공유기, NAS, 임베디드 장치, 개발서버, 개인 데스크탑 PC등 활용 방안은 무궁무진합니다!
'School > Security' 카테고리의 다른 글
[ Web Hacking ] - Cookie & Session (0) | 2022.05.26 |
---|---|
[ Web Hacking ] - W31c0m3, w3b h4ck3rs! (0) | 2022.05.25 |
[ Security ] 비밀번호 단방향 암호화 (0) | 2022.05.23 |
[ Node.JS ] Express-Session과 암호화 (0) | 2022.05.23 |
[Basic Security ] - Linux basic (0) | 2022.05.10 |