본 게시글은 한화 BEYOND SW 캠프 18기를 진행하면서
수업 중 배운 내용과, 그 과정에서 생긴 궁금증을 스스로 조사하고 정리한 내용입니다.
출처:(https://velog.io/@dahara3/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%99%80-%EC%9A%B0%EB%B6%84%ED%88%AC)
개발을 하다 보면 누구나 한 번쯤은 리눅스(Linux)라는 운영체제를 마주하게 됩니다.
하지만 막상 리눅스가 무엇인지, 그리고 Ubuntu와는 어떤 관계인지 헷갈리기도 합니다.
📌 핵심 특징 요약
리눅스는 하나의 커널을 기반으로 여러 배포판(Distro)이 만들어지며, Ubuntu는 그 중 하나.
학부 시절에도 Ubuntu를 사용했기에 왜 Ubuntu를 골랐을까? 하는 궁금증이 생겼다.
설치가 쉽다
→ 초보자도 설치가 용이한 편이다.
GUI 환경 지원
→ CLI에 익숙하지 않은 사람도 그래픽 환경에서 시작 가능
패키지 설치가 간편
→ apt
명령어를 통해 Python, Git, Node 등 손쉽게 설치
풍부한 레퍼런스
→ StackOverflow, 공식 문서, 블로그 자료가 방대하다 (이거 진짜 중요..)
추후 학습할 클라우드 연계가 뛰어남
→ AWS, Azure, GCP 모두 기본 이미지로 Ubuntu 제공
🎯 즉, 학습용으로도, 실무용으로도 가장 접근성이 좋은 배포판이라는 결론
리눅스, SSH를 배우다 보면 항상 빠지지 않는 개념이 바로 "포트포워딩"이다.
출처: (https://surfshark.com/ko/blog/vpn-port-forwarding)
포트포워딩은
"내부 네트워크 안의 컴퓨터(서버, 가상머신 등)에 외부에서 접속할 수 있게,
특정 포트로 들어온 트래픽을 지정된 내부 컴퓨터의 특정 포트로 자동으로 전달해주는 네트워크 기술"이다.
예전에 학부시절에 라즈베리 파이에 웹서버를 돌리고 포트포워딩을 통해 간단하게 프로젝트를 진행 하려고 했는데, 학교 라우터 레벨에서 포트포워딩을 막아서 전산팀에 연락 했던 기억이 났다.. 물론 보안 이슈로 결국 실패했었다..
예를 들어보자.
[내 PC: Windows]
│
MobaXterm, PuTTY 등으로 SSH 접속
│ (30022)
▼
[VirtualBox 포트포워딩]
│ (호스트 30022번 → 게스트 22번)
▼
[Ubuntu VM (가상머신)]
│
SSH 서버(22번 포트)에서 로그인 대기
22번
ssh user@ip
형태로 접속Windows 환경에서 가장 널리 쓰이는 SSH 접속 도구 중 하나
"SSH"
처음엔 "그냥 리눅스 서버 접속할 때 쓰는 명령어" 정도로만 알았는데, 이번에 보안의 관점에서 조금 더 깊게 공부해봤다.
SSH(Secure Shell): 네트워크를 통해 서버에 접속하고 원격 명령을 실행할 수 있게 해주는 프로토콜이다.
기존 방식들은 모든 데이터를 평문 으로 주고받아서, 중간에 누군가 네트워크를 엿보면 로그인 정보나 서버 명령이 고스란히 노출되는 치명적인 문제가 발생했다.
SSH는 이런 문제를 해결하기 위해, 모든 통신을 암호화해서 서버와 클라이언트 사이를 보호한다.
서버 접속뿐 아니라 자동화된 파일 전송, 네트워크 인프라 관리 등, 요즘은 거의 모든 인프라 환경에서 필수적으로 쓰이고 있다고 한다.
SSH는 단순히 암호화만 하는 게 아니라, 실제로는 클라이언트-서버 모델로 꽤 복잡한 과정을 거치며 안전한 연결을 만들어낸다.
대표적으로 다음 세 가지 기술이 결합되어 있다.
클라이언트가 서버의 22번 포트에 접속을 시도하면,
서버는 자신이 지원하는 SSH 버전 정보를 클라이언트에게 전달하고,
클라이언트는 여기에 맞춰 연결을 이어간다.
서버는 자신의 공개키를 클라이언트에게 보내고,
클라이언트는 이전에 접속했던 서버라면 known_hosts
파일을 참고해서 진짜 내가 의도한 서버에 연결 중인지를 확인한다.
(이 단계가 없다면 MITM(중간자 공격)에 쉽게 노출될 수 있다고 합니다.)
참고 자료 ->https://blog.naver.com/ucert/221201640816
서버는 이제 클라이언트가 진짜 로그인 권한이 있는지 확인해야 한다.
이제부터 모든 데이터는,
아까 만들어둔 세션키(대칭키)로 암호화되어 주고받는다.
여기에 HMAC 해시값이 같이 붙어서, 중간에서 누군가 패킷을 변조해도 금방 알아차릴 수 있게 되어 있다.
이쯤에서 이런 생각이 들 수 있다.
"애초에 그냥 빠르고 간단한 대칭키 암호화만 쓰면 안 되나?"
여기엔 명확한 이유가 있다.
즉,
SSH에서는 "비대칭키 방식(RSA 등)"으로 먼저 세션키를 안전하게 주고받고,
그 다음부터는 "빠른 대칭키"로 모든 데이터를 주고받는 구조다.
여기에 RSA는 구현이 단순하면서도 안전성이 검증된 대표적인 비대칭키 알고리즘이기 때문에,
지금까지도 SSH에서 가장 널리 쓰이고 있다.
포트포워딩에 대해
연결 시작 & 버전 교환
서버 공개키 전송 -> 신뢰 검증
안전한 키 교환(헬만 알고리즘)으로 세션키 생성
클라이언트 검증(RSA)
안전한 데이터 통신(세션키를 사용하여 암호화)
여기까지가 사실 1주차 1일차로 배운 내용이다.
명령어 자체는 수업에서 많이 다뤘지만,
솔직히 필요한 건 그때그때 검색해서 쓰면 되기에 따로 정리하진 않겠다.
대신, 윈도우 랩탑에서 mobaxterm(또는 Ubuntu)를 쓸 때
기본 터미널이 bash라서,
맥에서 주로 쓰던 zsh와 뭐가 다른지 궁금해 간단하게 비교해봤다.
(사실 oh-my-zsh이 쓰고 싶어서 찾아보다가 다른걸 깨달았다)
구분 | Bash | Zsh |
---|---|---|
기본 환경 | Ubuntu, mobaxterm | MacOS(기본), 리눅스(설치) |
자동완성 | 기본 | 더 똑똑하고 강력 |
커스터마이즈 | 제한적 | 플러그인/테마 다양 |
플러그인 | 드묾 | oh-my-zsh 등 다양 |
스크립트 | 리눅스와 완벽 호환 | 대부분 bash와 호환 |
둘 다 필요한 순간 쉽게 쓸 수 있으니,
자신이 편한 쪽을 선택해서 사용하면 된다고 한다.
추가적으로 강사님께서 리눅스의 리다이렉션과 파이프라인에 대해서 숙지 하는게 좋다고 하셔서 찾아봤다. 간단하게만 정리 하고, 추후 필요시 더 깊은 학습이 필요해 보인다.
기호 | 설명 | 예시 |
---|---|---|
> | 표준출력을 파일로 저장 (덮어씀) | ls > filelist.txt |
>> | 표준출력을 파일에 이어쓰기 | echo hi >> hello.txt |
< | 파일을 명령어의 입력으로 사용 | sort < numbers.txt |
2> | 에러 출력을 파일로 저장 | ls xxx 2> error.txt |
ls | grep ".txt"
# 현재 폴더 파일 목록 중에서 "txt"가 들어간 파일만 추려서 보여줌
cat log.txt | sort | uniq
# log.txt를 정렬하고, 중복 줄을 제거해서 출력
ps aux | grep chrome > chrome_process.txt
# 실행 중인 프로세스 중 chrome 관련된 것만 골라서 파일로 저장
https://brunch.co.kr/@uxstar/7
https://sunlightmedia.org/bash-vs-zsh/
https://kdohyeon.tistory.com/122
https://www.ssh.com/academy/ssh
https://limvo.tistory.com/21