반응형

1. 시작전에~!

저번 포스팅 자료에서도 한번 언급드린것과 같이 아래 두 가지에 대한 조치가 필요합니다.

 

 1) HTTP 통신을 함에따른 접속 암호 및 정보 유출

 2) 우분투 유저가 분리되지 않아 발생하는 강력한 권한

 

각각에 대해서, 조치하지 않을 경우 어떤 문제가 있는지어떻게 조치할 것인지를 다루겠습니다.

 

2. HTTP대신 HTTPS로 설정하기

흔히 HTTP는 보안에 취약하다는 말이 많이있습니다. 먼저 왜, 취약한 것인지를 실제로 확인해보고 이 후 HTTPS로 Code-Server를 다시 구성한 후 차이점을 보겠습니다.

 

2.1 HTTP 통신 확인하기

HTTP 통신은 쉽게생각해서 평문전송이라고 생각하면됩니다. 웹브라우저에 입력되는 값을 별도의 암호화없이 전송하게됩니다.

만약 여러분이 카페에서 서버에 VS Code-Server에 접속하여 코딩을 하고있다고 가정해보겠습니다. 그리고 누군가가 카페에 설치된 공유기를 해킹한 상태라고 가정해보겠습니다.

(많은 카페들이 공유기 관리자 비밀번호를 수정하지 않은 상태로 사용하는 경우가 많기 때문에, 취약한 경우가 많습니다.)

 

해커는 공유기를 통해 연결된 모든 장비(노트북, 스마트폰 등)들의 통신데이터를 감시할 수 있습니다.

위 상황을 가정하고, 와이어샤크를 통하여 제 PC가 VS Code-Server가 설치된 오라클 클라우드와 통신하는 내용을 뽑아보겠습니다.

 

전송되는 패킷내용

위와같이 실제로 전송되는 피킷을 열어보면 친절하게 [패스워드는 ~~~~입니다.]라고 전송하고있는 것을 볼 수 있습니다. 내용을 보시면 아시겠지만, 접속 URL과 Port는 물론이며, Form 데이터에 Item name까지 친절하게 적혀서 전송되기때문에, 해커입장에서는 특정한 값들로만 필터링을 걸어두고 기다리고 있으면 사용자들이 전송하는 다양한 정보들을 쉬득할 수 있는 구조입니다.

 

만약 해커가 password 라는 값 하나로만 필터링을 걸어두고 기다리고 있었다고한다면, 여러분이 VS Code-Server에 접속하는 순간 해커가 서버의 IP와 Port, 그리고 패스워드까지 알게되고 손쉽게 접근할 수 있게됩니다.

 

2.2 HTTPS로 구성하기

위와같은 문제가있기 때문에, 대부분 이러한 서비스를 제공하는 프로그램들은 HTTPS를 이용하여 통신을 할 수 있도록 지원하고있습니다.

더보기

일반적으로 HTTPS를 사용하기 위해서는 먼저 '인증서'라는 것이 필요합니다.

여기서 조금 고민을 했습니다. CA(인증기관)를 통하여 저희서버에서 발급한 인증서가 맞다는 것을 공증받는 형태로 진행할지, 아니면 그냥 사설인증서를 통하여 구성할 것인지...

사용자 입장에서는 후자와 같이 사용할 경우, '신용할 수 없는 인증서입니다'와 같은 메시지가 브라우저 상단에 뜨게됩니다.

고민해봤는데, 일단은 목적이 '개인용'이기 때문에, 이부분은 별도 CA등록없이 진행하도록 하겠습니다. 이부분에 대해서 불편함이 있다면, 추후 내용을 추가하거나 수정하도록 하겠습니다.

VS Code-Server에서 HTTPS 통신을 하는 방법은 간단합니다.

code-server 환경설정 파일에 들어가서 "cert: true"로 변경해주면 자동으로 VS Code-Server가 실행될 때, 파일을 생성합니다.

sudo vi ~/.config/code-server/config.yaml

위와같이 수정 후 code-server를 실행하면 crt파일과 key파일을 생성하면서, 알아서 https로 Code-Server를 실행합니다.

아래와 같이 말이죠.

앞서 말씀드린것 처럼, 인증받지 못한 사이트이기 때문에 웹브라이저에서 경고창이 먼저 뜰 수 있습니다. 무시하고 연결해주시면 됩니다~ㅎ

 

이렇게 해주시고, 다시 와이어샤크로 데이터를 확인해보면, 아래와같이 데이터가 암호화되어 전송되고있는 것을 볼 수 있습니다.

(모든 웹 데이터가 암호화되기 때문에 실제로 저 데이터가 Password를 암호화한 값인지도 확인이 불가능합니다.)

이런식으로 암호화해서 전송되기 때문에, 혹시라도 전송되는 패킷데이터가 제 3자에게 노출되어도 안전하게 통신이 가능합니다.

 

3. User 분리하기

처음 기본으로 제공되는 ubuntu라는 계정은 sudo 권한을 갖고있는, 강력한 유저입니다.

때문에, VS Code-Server에 접근하여, 터미널(메뉴>터미널>새터미널)을 실행하면 이 강력한 권한을 사용할 수 있습니다.

root 권한 획득

위 처럼, 간단하게 root 권한을 취득할 수도 있습니다. 서버의 주인이 바뀌는 순간이죠...

이러한 문제를 해결하기 위해서, sudo 권한이 없는! VSCode를 위한 유저를 만들어줍니다.

 

sudo adduser (유저명)

저는 위처럼 vsapp라는 유저를 만들었습니다. 유저정보는 공백으로 만들었고요. 그리고 해당 유저로 변경한 후 해당 유저의 홈 디렉토리에서 code-server 명령을 수행해보았습니다.

sudo su vsapp       # 유저 변경(ubuntu > vsapp)
cd                  # vsapp의 홈디렉토리로 이동(/home/vsapp)
code-server         # code-server 실행

결과는 아래와 같습니다.

보시는것처럼, 마치 Code-Server를 처음 실행한거 같은 상황입니다.

넵, 맞습니다. 해당 홈 디렉토리는 새로 만들어졌고, 여기에는 설정파일은 물론이고, 좀전에 만든 인증서 파일들도 없습니다 ㅎㅎ

 

저번 포스터에서 중간에 '여기까지만 따라해주시고, 이제부터는 다음 포스터까지 다 보시고 따라와주세요!' 라고한 이유입니다 ㅎㅎ...

 

혹시 그냥 따라오셨다면... 복습하는 마음으로 설정파일을 수정해주세요~ ㅎㅎ

vi ~/.config/code-server/config.yaml

######### 설정파일 내용 ##########
bind-addr: 0.0.0.0:2001
auth: password
password: (사용자 암호)
cert: true

그리고 다시 실행해준 후, 터미널에서 명령어를 실행하면~!

 

위와같이, sudo권한이 없기때문에, 실행할 수 없다는 결과가 뜨는것을 볼 수 있습니다.

 

물론 막 생성된 계정이고, 별도의 권한도 없기 때문에, 해당계정으로는 타 소유주의 파일을 수정/삭제는 물론 폴더에 임의로 파일을 생성하는 것도 불가능합니다.

 

이렇게한다면, 조금은 안전하게 저희 서버를 지킬 수 있을꺼에요... ㅎㅎ

 

여기까지해서 VS Code-Server 구축부분은 일단 마무리하겠습니다.

 

다음에는 슬슬 지루하니, 파이썬+Flask를 이용해서 홈페이지 띄우는 부분을 다뤄보겠습니다~!

 

감사합니다.

반응형
반응형

1. 시작전에

Visual Studio Code Server는 MS에서 만든 VScode를 서버에 설치하여 어디서든, 무엇이든 웹 브라우저와 인터넷만 가능하다면 이를 통하여 접근하여 개발이 가능한 환경을 제공합니다.

다양한 확장 프로그램(플러그인)을 포함하고 있으면서도 나름대로 가벼운 프로그램이기 때문에, 이를 이용하여 서버에 직접붙어 프로그램을 개발하려고합니다.

 

물론 이러한 방식은 '보안'의 입장에서는 별로 좋지 못한 생각이라고 느껴집니다.

차후 운영할 서버에 직접붙어 개발을 하는만큼 악의적인 마음만 있다면, IDE를 통하여 얼마든지 서버를 마음대로 컨트롤 할 수 있기 때문입니다.

 

이는 VSCode 뿐만의 문제가 아니라, Jupyter Notebook Server도 동일합니다. 서버에서는 누가 접속했는지 판단할 수 없는데, 해당 프로그램의 소유자권한이 제한하지 않는 범위에서는 마음대로 터미널 명령들을 수행할 수 있고, 통제가 가능하기 때문입니다.

 

이러한 문제에 대해서도 차후 고민해보고 나름대로 해결방안을 가져가보도록 하겠습니다.

 

2. VSCodeServer 설치

VSCodeServer 설치는 정말 간단합니다.

친절한 개발자분께서 스크립트를 개발해주셨으니까요.

 - 관련된 내용은 다음 링크(https://github.com/cdr/code-server)를 참고해주세요.

 

서버에 code-server 설치는 아래 명령어 한줄이면 끝입니다.

curl -fsSL https://code-server.dev/install.sh | sh

Code-server 설치

위와같이 설치가 완료되면, 이제 설정파일을 수정해주겠습니다.

 

여기까지만 따라해주시고, 이제부터는 다음 포스터까지 다 보시고 따라와주세요!

 

설정파일 위치 :  ~/.config/code-server/config.yaml

( 만약 설정파일이 존재하지 않는다면, [code-server] 명령을 통하여 한번 프로그램일 실행 후 종료해주세요.)

bind-addr: 0.0.0.0:2001
auth: password
password: password_입력     << 실제 접속에 사용될 암호
cert: false

일단은 해당 설정파일을 열어, 위와같이 입력해주시고 저장해주세요. (password는 본인 스스로!)

 

그리고, 외부 접속을 위한 보안설정을 넣어줘야합니다.

 

보안설정은 이전에 말씀드린 것과 마찬가지로, 오라클 클라우드 홈페이지에서 1차적으로 진행해주시기 바랍니다.

(전 포스터 하단에 해당내용이 나와있습니다. 참고해주세용,,,, Link : https://youngq.tistory.com/95)

 

그.리.고!!!

 

우분투 자체에서도 iptables를 통한 보안설정이 필요합니다.

(ufw를 이용한 보안정책이 더 쉽고하긴한데, 오라클 클라우드에서 ufw로 정책을 지원하지 않는건지 적용을해도 잘 안되는것같아 iptables를 이용하게 되었습니다.)

 

iptables 설정과 관련된 부분은 내용이 많아 별도로 차후에 포스팅을 하겠습니다. 그렇기에 일단은 아래내용만 확인해주세요.

 

  ######### 2001번 Port를 목적지로하는 TCP INPUT을 허용하겠다는 내용 #########
sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 2001 -m state --state NEW,ESTABLISHED -j ACCEPT
(NEW : 새로운 연결, ESTABLISHED : 기존 연결에 이어지는 데이터)

  ######### 변경내용 저장 #########
sudo cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak        # 원본파일 백업

su -                                                             # root login(root만 수정가능)
iptables-save > /etc/iptables/rules.v4                           # 수정내용 덮어쓰기
exit                                                             # root logout

적용 후 [sudo iptables --list] 명령을 입력하면, INPUT 부분에 아래내용이 추가된 것을 볼 수 있습니다.

위와 같이 설정이 끝난다면, 외부에서도 해당 Port를 통해 접속이 가능한 상태가 됩니다.

 

code-server 명령을 통해 서비스를 실행하고 접속이 잘 되는지 테스트해보겠습니다.

code-server 명령으로 VSCodeServer 실행
정상적으로 연결되는 것을 확인
패스워드 입력시 접속되는 것을 확인

 

위와같이 정상적으로 서버에 설치된 VSCode를 웹브라우저를 통하여 접속할 수 있는 것을 확인했습니다~!

 

짝짝짝!

 

하.지.만~ 문제가 하나 있습니다.

 

이를 이용하여 코드를 구현하는것은 전혀 문제가 아니지만, 역시나 또 보안상에 문제가 조금 남아있습니다.

 

가장 큰 문제는 두 가지입니다.

 1) HTTP 통신을 함에따른 접속 암호 및 정보 유출

 2) 우분투 유저가 분리되지 않아 발생하는 강력한 권한

 

위 두가지 문제는 카페와같은 공용공간에서 악의적인 마음만 먹는다면 손쉽게 여러분의 서버의 IP를 확인하고, VSCodeServer에 접속할 수 있고, 안전한 SSH 접속을 우회하여 마음대로 터미널 명령을 수행 할 수 있습니다.

 

이러한 문제에대한 해결은 다음포스팅에서 다루겠습니다~ 감사합니다.

반응형
반응형

1. 개인용 클라우드 웹?

최근 AWS 뿐만아니라, 여러 기업들에서 퍼블릭 클라우드를 많이 서비스하고 있습니다. 여러 기업들의 경쟁 덕분에 개인도 부담없이 클라우드를 통해 원하는 서비스를 구축 할 수 있는 상황입니다.

 

본격적으로 포스팅을 시작하기 전에 타이틀을 어떤걸로 가져갈까 고민하다가 그냥 직관적으로 "개인용 클라우드 웹"이라는 타이틀을 걸었습니다. 즉, 누구나 쉽게 이해할 수 있는 수준의 웹서버 구축 프로젝트입니다.

 

다만, '개인용' 이라는 말은 붙인만큼 개인의 입장에서 편하게 사용할 수 있을 것이라고 생각되는 몇가지 특별한 기능들을 구현하는 부분이 중점이 된다고 봐주시면 좋겠습니다.

 

이번 프로젝트는 '무료'인 오라클 클라우드를 이용하기 때문에, 한정된 자원을 효율적으로 사용하기 위해 여러 편리한 미들웨어나 불필요하게 무거운 오픈소스들을 지양할 예정입니다~!

 

일단 현재 예상하는 구성은 아래와 같습니다.

 - 오라클 클라우드(웹서버)

 - Python3 + Flask (웹 프레임워크)

 - SFTP (보안 파일송수신)

 - SQLite (Lite DB)

 - ChromeDriver (웹 자동화)

 - VSCodeServer (개발 IDE)

 - Jupyter Notebook (파이썬 개발)

 

편리함과 서버부하 등을 고려하여 선택하였습니다. 프로젝트를 진행하며, 이부분은 변경이 될 수 있습니다.

 

 

2. 오라클 클라우드 Free Tier 소개

퍼블릭 클라우드라고하면 아마존의 AWS와 MS의 Azure 그리고... 국내는 네이버 NCP 정도가 대표적이라고 생각됩니다.

오라클 클라우드는 상대적으로 이러한 퍼블릭 클라우드에 비하면, 다소 생소한 면이 있습니다.

하지만, Free Tier 정책에서는 다른 퍼블릭클라우드와 비교해도 충분히 좋은 스팩을 제공하기 때문에 해당부분만 잠깐 살펴보고 본문으로 들가겠습니다.

 

가장 큰 장점인 "무제한 무료"인 Free Tier 정책입니다.

출처 : 오라클 클라우드 홈페이지

물론 무료로 제공되다보니 리소스가 풍족한 것은 아니지만, 개인용으로 사용하기에는 충분한(?) 스팩이라고 생각됩니다.

 

위에 무료 클라우드 서비스의 장점이 나와있는 것을 볼 수 있습니다. 제가 이것들 중에서 마음에 드는것을 뽑으면~

 - 200GB 스트로지 용량 (AWS Free Tier : 5GB)

 - 2VM 무제한 무료 (AWS Free Tier : 750Hours/Month)

 - 매월 10TB의 데이터 송신 (AWS Free Tier : 50GB)

 

아마존의 AWS와 비교해보면 오라클에서 제공해주는 리소스가 얼마나 훌륭한지 알 수 있으실거 같습니다.

 

3. VM 만들기

먼저 오라클 클라우드 가입이 선행되어야합니다. 가입은 오라클클라우드 홈페이지(https://cloud.oracle.com)에서 진행합니다.

 

Oracle Cloud Infrastructure

 

cloud.oracle.com

가입과 관련된 부분은 큰 어려움이 없을거라 생각하고, VM 생성 부분으로 바로 넘어가겠습니다.

로그인 후 왼쪽 상단에 메뉴바를 누른 후 [컴퓨트 > 인스턴스]로 들어가주세요. 그리고 [인스턴스 생성] 버튼을 눌러 인스턴스를 생성해보겠습니다.

 

3.1 이름 설정

인스턴스 이름과 구획을 설정해줍니다. 이름은 말 그대로 인스턴스를 구분해주는 값으로 원하는 이름으로 설정해주시면됩니다.

구획은 여러 네트워크와 VM들을 감싸고있는 구획이라고 생각하시면 될 것같습니다. 저는 루트에 만들어 서비스하겠습니다.

 

3.2 OS 이미지 설정

다른 부분은 특별히 건들이지 않고, OS만 Ubuntu로 변경해주었습니다. 처음에는 오라클 리눅스를 사용할까 했지만, 많은 분들이 우분투에 익숙하신거 같아, 해당환경으로 진행하겠습니다. (원하시면 다른 OS로 진행하셔도 무관합니다.)

 

3.3 네트워크 설정

신규로 인스턴스를 생성하게되면, VNC(가상 클라우드 네트워크)와 하위 서브넷을 생성해줘야합니다.

설정하는 이름 역시도 인스턴스 이름과 같이 구분하는 용도로 사용하는 것이기 때문에 적당히 만들어주세요.

 

네트워크별로 보안설정등이 들어가기 때문에, 추후 다른 서비스를 위한 VM 구성시 오인하지 않도록 이름을 정해주면 좋습니다.

 

3.4 SSH 키 추가하기

일반적으로 대부분의 클라우드 서비스 제공자들은 SSH를 통한 접속에는 보안상의 이유로 Key 파일을 사용하도록 하고있습니다.

더보기

SSH와 같은 보안통신에서는 주로 공개키(Public Key)와 개인키(Private Key)를 통해(=비대칭키를 이용한 통신) 대칭키를 교환하고, 이를 이용한 암호화 통신을 이용하게됩니다.

 

공개키는 원본데이터를 암호화 할 수 있고, 개인키는 해당 데이터를 복호화 할 수 있습니다.

또한 개인키는 원본데이터에 전자서명을 넣을 수 있고, 공개키는 해당 전자서명을 검증 할 수 있습니다.

 

이를 이용하여, 서버와 클라이언트는 서로가 믿을 수 있는 사용자인지 판단할 수 있고, 안전하게 대칭키(암호화와 복호화가 둘 다 가능한 키)를 교환하여, 이를 이용해 서로 데이터를 송수신하게됩니다.

 

공개키와 개인키만을 이용해도 안전한 통신이 가능하지만, 알고리즘이 복잡하여 대칭키통한 통신보다 매우 느리기 때문에, 비대칭키를 이용한 통신은 주로 대칭키를 안전하게 교환하기 위한 수단으로 사용됩니다.

일반적으로 '자동으로 키 쌍 생성' 또는 '공용 키 붙여넣기'를 통해 SSH 키를 생성/설정 하여 사용하게 되는데요.

 

저는 후자를 추천합니다. 이유는 비밀키를 생성하는 과정에서 사용자가 암호를 설정 할 수 있기때문에, 만약 비밀키가 노출된 경우에도 암호를 모르면 접속할 수 없기 때문입니다.

PuttyGen 을 이용하여 Generate하고 사용하실 암호를 입력해주시면됩니다.

[Save private key]를 통해 비밀키는 개인 PC에 안전하게 보관해주시고요.

빨간색으로 색칠된 부분이 공개키 부분이니 복사하여 주신 후 아래 부분에 넣어주시면 됩니다.

 

3.5 부트 볼륨 설정

얼마전까지는 볼륨 스토리지는 최대 2개에 100GB였는데, 최근 200GB로 늘어난거 같습니다.

앞으로 새로운 VM을 만들계획이 있기 때문에, 저는 150GB를 할당해주도록 하겠습니다.

 

이 후 완료해주시면 아래와같이 인스턴스가 자동으로 생성되고 실행되는 것을 보실 수 있습니다~

 

4. SSH 접속확인

SSH로 클라우드에 접속하는 방법은 간단합니다. 인스턴스가 생성된 후 보이는 [인스턴스 액세스] 부분에 나와있는 공용 IP주소와 사용자 이름, 그리고 이전에 만들어준 비밀키만 있으면 됩니다.

Putty 접속은 위와같이 넣어주시면 됩니다.

Host 정보이는 [사용자이름@IP주소] 그리고 Auth 부분에 비밀키를 넣어주시면 됩니다.

 

접속하시면 위와같이 비밀번호를 입력하라는 부분이 나오는데, 이전에 설정한 비밀키의 비밀번호를 넣어주면됩니다.

 

이 후 접속하게되면 위와같은 화면을 보실 수 있습니다.

보이시는데로, 일부 Boot 데이터를 제외한 145GB의 용량이 남아있는 것을 보실 수 있으며, 여기에 앞으로 여러가지를 넣어보도록 하겠습니다.

 

 

 

5. 네트워크 보안 설정

[컴퓨트 > 인스턴스 > 인스턴스 세부정보] 부분을 보게되면, '네트워크 보안그룹' 이라는 부분이 있습니다.

'없음'으로 되어있는 것을 확인하실 수 있는데요. 이는 해당 VCN의 보안목록상 Default Security List에 종속된다고 볼 수 있습니다.

 

Default Security

기본적으로는 위와같이 수신에 대해서는 22번(SSH)와 ICMP를 제외한 모든 프로토콜이 막혀있는 것을 볼 수 있습니다.

 

오라클에서는 크게 두 가지 보안방식이 존재합니다.

 1) VCN 보안 목록

 2) 네트워크 보안 그룹

 

먼저 VCN 보안목록은 VCN에 속해있는 특정한 서브넷에 대한 보안정책을 설정합니다. 즉, 하나의 VCN에 두 개 이상의 서브넷이 존재할 경우, 각각의 서브넷별로 보안정책을 넣어줄 수 있다는 것을 의미합니다.

 

네트워크 보안 그룹은 특정한 인스턴스가 해당 보안그룹에 속하여 있는지 여부에 따라서 보안정책 적용여부가 판단됩니다. 때문에 소규모의 서버를 운영하고 각각의 인스턴스별로 보안정책을 적용하고 싶다고한다면, 네트워크 보안그룹을 통하여 보안정책을 설정하는편이 유리할 수 있습니다.

 

여기서 알아둬야할 부분은, VCN 보안목록이든 네트워크 보안그룹이든 가상방화벽이 네트워크에 존재하여 보안정책을 걸어준다는 개념과는 거리가 있습니다.

 

두 가지 경우 모두, 보안정책이 적용되는 대상의 VNIC에 보안정책이 걸리게됩니다. 따라서, 만약 특정한 인스턴스가 속해있는 네트워크 보안 그룹에서 SSH를 허용하지 않고 있다고 하여도, 해당 인스턴스가 속해있는 VCN 보안목록에서 해당 서브넷에 대하여 SSH를 허용하고 있다면, SSH 연결이 가능하게됩니다.

 

때문에, 저는 VCN은 기본적인 설정만 유지한 상태로 네트워크 보안그룹을 통해서 인스턴스의 보안정책을 설정하도록 하겠습니다.

 

다만, 이부분에 대해서는 여러 논쟁거리가 될 수 있기때문에, 어떤방식으로 보안설정을 할지에 대해서는 여러분의 선택에 맞기겠습니다~!

 

(위 내용은 오라클내 메뉴얼 및 작성자의 테스트를 기반으로 작성하였습니다. 일부 틀린내용이 있을 수 있으며 관련 댓글 부탁드리겠습니다. 감사합니다.)

 

5.1 네트워크 보안 그룹 추가

먼저 아래 화면으로 이동하여 [네트워크 보안 그룹 생성] 을 눌러주세요.

이 후 보안그룹 이름은 원하시는데로 설정하시고 보안정책을 넣으면 됩니다. 현재는 다음시간에 다룰 VSCode-Server에서 사용할 포트에 대하여 보안정책을 넣어주겠습니다.

 

일반적으로 VSCode Server와 같은 프로그램들을 사용자가 원하는 포트를 사용할 수 있도록 설정할 수 있습니다. 이때 주의할 부분은 설정하는 포트의 번호입니다.

 

여러 핵심적인 프로토콜들은 특정 포트를 독점적으로 사용하고 있기때문에, 이러한 포트를 임의로 사용자가 관리자권한을 통하여 점유해버리면 해당 프로토콜이 정상적으로 작동하지 못하는 문제가 발생합니다. 때문에 이러한문제를 방지하기 위하여 IANA에서 지정한 번호는 피해주도록 합시다.

 

일반적으로 아래 well-known port만 피해주면 큰 문제는 없습니다.

  • 0번 ~ 1023번: 잘 알려진 포트 (well-known port)
  • 1024번 ~ 49151번: 등록된 포트 (registered port)
  • 49152번 ~ 65535번: 동적 포트 (dynamic port)

Registered port 라고해서 약 4.8만개의 포트를 적어두었지만, 공식적으로 알려진 포트들은 두 자릿수에 불과하며 실제 서버단에서 이용할 경우 충돌이 발생할 수 있는 것은 mysql(3306) 정도이기 때문에 큰 고민없이 쓰셔도 괜찮을것 같습니다.

 

다시 본론으로 돌아와서 VSCode Server에는 2001번 Port를 할당해줄 예정입니다. 따라서 TCP 2001에 대해서 InBound 허용을 설정하겠습니다.

 

위와같이 설정하고 저장해주시면 해당 네트워크 보안그룹에 대해서 2001번 포트를 목적지로하는 요청은 허용한다는 의미가 됩니다.

 

이 후 인스턴스 부분으로 돌아와서 아래와같이 네트워크 보안 그룹에 대한하는 보안그룹을 넣어주면 설정이 끝이나게됩니다.

 

오늘은 여기까지~

 

특별히 어려운점은 없었을 것같습니다... 혹시 어려운 부분이 있었다면 댓글 부탁드리겠습니다.

 

감사합니다~

반응형
반응형

Naver Cloud Platform

 

1. 네이버 클라우드 사용하기

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

네이버에서도 이제 아마존 AWS와 같은 클라우드 플랫폼을 제공하고있습니다.

 

국내 사용자에게는 AWS의 1년 무료 서비스처럼 micro 서버를 무료로 1년 제공하며, 3개월간 사용할 수 있는 10만 크리딧을 제공하고있습니다.(2019년 1월 이후 가입자)

 

사용방법은 간단합니다.

 

위의 링크에 들어가서 가입 후 원하는 서비스를 신청하면 끝~ 한글이고 설명이 친절해서 대부분의 기능은 손쉽게 사용할 수 있습니다.

 

 

 

2. Micro Server 신청

웹페이지를 위한 서버로 Micro 서버를 신청하여 사용해보겠습니다.

 

https://www.ncloud.com/product/compute/server

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

위의 링크에서 [이용신청]을 클릭하면 됩니다.

 

이후 서버생성 부분에 들어가서 아래와 같이 설정해주었습니다.

 

 

사용할 OS는 Ubuntu, 용량과 서버타입은 1년 무료인 50기가에 Micro로 신청합니다. -> 하단에 다음클릭

 

 

서버 설정은 아래와 같습니다.

 

 

저는 현재 Micro 서버를 이미 만든 상태여서 설정부분이 붉게 표시되어있는 것을 볼 수 있습니다.

 

Micro는 HDD만 지원됩니다. 위와같이 설정하고 다음을 눌러주세요.

 

 

 

다음 인증키 부분에 [인증키 이름]을 입력해주신 후 해당 파일을 다운로드해주세요.

 

 

네트워크 설정은 기본적으로 위와같이 되어있습니다. 그냥 다음눌르고 최종확인도 완료해주시면 됩니다.

 

 

 

이 후 Server 부분을 보면 아래와같은 상태를 볼 수 있습니다.

 

 

상태가 [운영중]이 아니라면 조금 기다려주세요. 자동으로 운영중상태가됩니다.

 

 

보시면 공인IP부분이 빠져있는 것을 볼 수 있습니다.

 

이부분은 추후 다루겠지만, 일단 과금이 되는 부분이기 때문에 현재는 다루지 않겠습니다.

 

참고로 가격은 아래와 같습니다.

 

 

 

 

반응형
반응형

WAV 음악파일 속도 변형

 

 

1. WAV 파일이란?

WAV(웨이브 오디오 포맷, Waveform audio format)은 마이크로소프트와 IBM의 오디오 파일 표준입니다.

 

덕분에 해당 포맷에 대해 상세하게 적혀있는 사이트들과 각종 pdf자료들이 존재합니다. 아래는 그중 한 사이트입니다.

 

http://soundfile.sapp.org/doc/WaveFormat/

 

Microsoft WAVE soundfile format

WAVE PCM soundfile format The WAVE file format is a subset of Microsoft's RIFF specification for the storage of multimedia files. A RIFF file starts out with a file header followed by a sequence of data chunks. A WAVE file is often just a RIFF file with a

soundfile.sapp.org

 

 

 

 

아래는 WAV 파일에 대한 포맷 정보입니다.

 

WAV 파일 포맷

 

WAV 파일은 크게 세 개의 영역으로 분류되는 것을 볼 수 있으며, Big Little dndian을 섞어 사용하는 것을 볼 수 있습니다.

 

Python에서 WAV 파일을 불러와 위의 포맷을 확인해보겠습니다.

 

binary read

단순히 샘플 파일을 하나 갖고 와서 위와 같이 열어보았습니다.

 

이를 위 사이트(http://soundfile.sapp.org/doc/WaveFormat/)에 나와있는 정보와 비교해보며 보겠습니다.

 

 

 

 

2. First Block - RIFF 영역 헤더

 

먼저 Little endian과 Big endian에 따라 hex값을 출력해주는 함수를 만들어주었습니다.

 

 

다음으로 위의 사이트에 나와있는 첫 번째 블록 정보를 보았습니다.

 

ChunkID : "RIFF"라는 문자를 ASCII로 갖고 있음. (big-endian기준 : 0x52494646)

ChunkSize : 전체 파일크기 중 ChunkID와 ChunkSize부분인 8Byte를 제외한 전체 크기를 말함

Format : "WAVE"라는 문자를 갖고 있음 (big-endian기준 : 0x57415645)

 

이번에는 파이썬에서 보겠습니다.

 

위와 같이 홈페이지에 나와있는 것과 동일한 ChunkID와 Format값을 갖고 있는 것을 볼 수 있으며, ChunkSize의 값을 10진수로 표시하고 8을 더해 전체 파일크기와 비교해보겠습니다.

 

예측되는 전체 파일크기
실제 파일정보

 

보시는 것과 같이 동일한 파일크기를 갖는 것을 볼 수 있습니다.

 

 

 

 

3. Second Block - fmt 영역 헤더

 

다음은 두 번째 블록 정보입니다.

Subchunk1ID : "fmt "값을 갖고 있음. (big-endian기준 : 0x666d7420)

Subchunk1Size : Subchunk1의 크기

AudioFormat : PCM 방식이면 1

NumChannels : Mono = 1, Stereo = 2

SampleRate : 샘플링 주기

ByteRate : SampleRate * NumChannels * BPS/8

BlockAlign : NumChannels * BPS/8

BPS : 초당 비트 값

Extra Data

 

마찬가지로 파이썬에서 실제 데이터로 보겠습니다.

 

각각의 데이터는 Hex데이터임을 생각하시고 봐주세요.

 

위의 데이터를 보게 되면, 해당 음원(wav파일)은 아래와 같은 정보를 갖고 있습니다.

 

PCM 방식 파일 압축, 스테레오 음원, 샘플링 주기는 44100Hz(0xac44), BPS는 16bit

 

위 정보를 기반으로 음원 재생 프로그램은 노래를 재생하게 되는 중요한 정보입니다.

 

 

 

 

4. Last Block - data 영역

 

마지막 블록입니다.

 

Subchunk2ID : "Data"라는 값을 갖고 있음. (big-endian 기준 : 0x64617461)

Subchunk2Size : Subchunk2의 크기를 말합니다.

Data : 실제 음원 정보를 갖고 있는 데이터입니다.

 

Data 영역은 Little endian으로 구성되어있는 모습 그대로 표시한 것입니다.

 

 

이렇게 해서 일단 WAV 파일의 정보를 모두 확인해보았습니다.

 

다음장에서는 해당 데이터를 수정하여 음원을 변경하는 것을 보여드리겠습니다.

반응형
반응형

WOL 기능에서 사용되는 매직패킷을 전송하는 프로그램

python + pyqt

 

0. 개발환경

  • 맥북 OSX
  • PyCharm (Python 3.7x) + pyqt

1. GUI

 

먼저 대략적인 앱 디자인을 구성합니다.

저는 위와같이 대충 만들었습니다.

정확한 크기는 코딩단계에서 조절해줍니다.

 

[QT 디자이너]를 사용하지 않을 예정이기 때문에 대충 목표디자인을 파워포인트로 잡았습니다.

 

 

 

 

2. Coding

udp통신이고 기존에 파이썬으로 WOL패킷전송을 수행하는 코드를 작성해둔 적이 있었기 때문에 해당코드를 그대로 이용했습니다.

 

2019/05/14 - [이론/네트워크] - [네트워크 패킷] Python으로 WOL패킷 송신하기(1/2)

2019/05/14 - [이론/네트워크] - [네트워크 패킷] Python으로 WOL패킷 송신하기(2/2)

 

 

import sys
import socket, struct, time
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtCore import Qt

class LayoutWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        wg = WidgetSet()
        self.setCentralWidget(wg)
        self.statusBar().showMessage('Youngq.tistory.com')

        self.setWindowTitle('WOL Program')
        self.setWindowIcon(QIcon('web.png'))
        self.setGeometry(500, 500, 350, 180)
        self.show()

class WidgetSet(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # Line 1 : Wol 이미지 + msg 영역
        hbox0 = QHBoxLayout()
        hbox0.setAlignment(Qt.AlignVCenter)

        pixmap = QPixmap('wol_mini.png')
        pixmap = pixmap.scaledToWidth(35)
        lbl_img = QLabel()
        lbl_img.setPixmap(pixmap)
        hbox0.addWidget(lbl_img)
        hbox0.addStretch(200)

        msg = QLabel()
        msg.setFixedSize(200,25)
        msg.setText("Ready")
        msg.setAlignment(Qt.AlignRight)
        self.err = msg
        hbox0.addWidget(msg)

        # Line 2 : 대역폭입력 + 콤보박스
        hbox1 = QHBoxLayout()
        hbox1.setAlignment(Qt.AlignVCenter)

        qle1 = QLineEdit(self)
        qle1.setFixedSize(170, 25)
        qle1.setPlaceholderText("목적지 IP주소 또는 망주소 입력")
        self.ip = qle1
        hbox1.addWidget(qle1)
        hbox1.addStretch(20)

        cIP = QLabel()
        cIP.setFixedSize(110, 30)
        currentIP = self.ipaddr()
        cIP.setText("IP : "+currentIP)
        hbox1.addWidget(cIP)

        # Line 3 : 맥주소 입력 + 전송버튼
        hbox2 = QHBoxLayout()
        hbox2.setAlignment(Qt.AlignHorizontal_Mask)
        qle2 = QLineEdit(self)
        qle2.setFixedSize(170, 25)
        qle2.setPlaceholderText("MAC 주소 입력")
        self.mac = qle2
        hbox2.addWidget(qle2)
        hbox2.addStretch(20)

        btn = QPushButton(self)
        btn.setText('Send')
        btn.setFixedSize(70, 30)
        self.sendBtn = btn
        btn.clicked.connect(self.sending) # EventH

        hbox2.addWidget(btn)
        # Stacking : 레이아웃 배치
        vbox = QVBoxLayout()
        vbox.addLayout(hbox0)
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        self.setLayout(vbox)

    def sending(self):
        try:
            WOL(self.mac.text(), self.ip.text())
            self.err.setText("신호 전송완료")
        except:
            self.err.setText("잘못된 입력이 존재합니다.")

    def ipaddr(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        return s.getsockname()[0]

def WOL(macAddr, network):
    sep = macAddr[2]
    macAddr = macAddr.replace(sep, '')

    data = b'FFFFFFFFFFFF' + (macAddr * 16).encode()
    send_data = b''

    for i in range(0, len(data), 2):
        send_data += struct.pack('B', int(data[i: i + 2], 16))

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    for i in range(3):
        sock.sendto(send_data, (network, 9))
        time.sleep(0.05)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = LayoutWindow()
    sys.exit(app.exec_())

 

특별한 알고리즘이 필요없는 단순 프로그램이지만, GUI 구성까지 포함해서 100줄 조금 넘어가는 코드로... 역시 파이썬입니다...

 

해당 코드는 다음 링크에서 복사 가능합니다.

 

https://github.com/yekyu94/WOL_python/blob/master/wol.py

 

yekyu94/WOL_python

python WOL GUI Coding. Contribute to yekyu94/WOL_python development by creating an account on GitHub.

github.com

 

Pyqt를 통해서 제작한 코드이기 때문에 pyqt가 설치되어있지 않는 경우 애러가 발생합니다.

 

 

 

 

3. Testing

 

 

실행화면
와이어샤크로 확인

 

위와같이 전송이 완료되면 입력한 IP주소와 MAC주소를 타겟으로한 WOL패킷이 3개 전송되는 것을 볼 수 있습니다.

 

이렇게 만든 프로그램을 pyinstaller같은 라이브러리를 이용하여 쉽게 exe파일등으로 변환이 가능합니다.

 

해당부분은 넘어가겠습니다.

반응형

+ Recent posts