Born2beroot - 가상머신 및 CS지식

yeham·2022년 12월 12일
1

42Seoul

목록 보기
5/18
post-thumbnail

들어가기에 앞서

  • 가상 머신(Virtual Box)의 사용 방법

  • OS의 차이점 파악

  • 다양한 보안모듈 및 보안시스템 공부

  • 리눅스를 이용해서 자신이 필요한 서비스를 설치

가상머신 환경 설치 링크 => 타 velog 포스팅 참고

🖥️ Mandatory

Virtual Machine 가상머신

하나의 물리서버를 보다 효율적으로 사용하기 위해 사용 ⇒ 비용절감

물리적 컴퓨터 위에 물리자원을 가상화 한 컴퓨터 환경을 구축하여 어떠한 운영체제 라도 설치할 수 있게 하는 소프트웨어 ⇒ 간편함 + 속도

서버용 컴퓨터를 보다 효율적으로 사용할 수 있고 VM외에 Docker로 대표되는 컨테이너라는 개념도 있다.

Hypervisor 하이퍼바이저

하나의 호스트 컴퓨터 상에서 동시에 다수의 운영체제(OS)를 구동시킬 수 있는 HW와 OS 사이의 소프트웨어

윈도우 : Hyper-V
리눅스 : KVM/QEMU

하이퍼바이저는 하드웨어를 직접 제어할 수 있기 때문에 가상의 하드웨어를 제공할 뿐만 아니라, VM에 대한 라이프 사이클을 관리하거나 실시간 리소스 할당, VM 정책 정의 등 다양한 기능들을 수행한다.

VM과 Virtual Boxsms 그림처럼 하이퍼바이저 위에서 동작한다.

타입 1 / 네이티브 or 베어메탈 하이퍼바이저
하드웨어와 직접 상호작용을 하며 KVM/QEMU, Hyper-V, XEM 등이 속한다.
하이퍼바이저가 하드웨어를 직접 제어해서 효율적
여러 하드웨어 드라이버를 세팅해야해서 설치 어려움

타입 2 / 호스트형 하이퍼바이저
일반적인 소프트웨어처럼 호스트 운영체제 위에서 동작하며, VM, Virtual box 등이 속한다.
VM내부의 게스트 OS에 하드웨어 자원을 제공하는 방식으로 게스트 OS에 대한 제약이 없다.

CentOS와 Debian

리눅스 커널 + 자유 소프트웨어로 구성된 리눅스 배포판이다. 두 OS의 차이는 자유 소프트웨어 (패키지 포맷, 패키지 관리 툴) 등 차이가 있다.

CentOS

기업용 으로 주로 사용되며 RHEL(Red Hat Enterprise Linux)을 그대로 가져옴. 간단히 레드햇 체험판
오픈소스다 보니 업데이트와 기술지원이 느리고 개인이 다루기 어려움 그러나 안정성이 좋고 보안측면이 강하다. Redhat 계열로 CentOS, Fedora, Oracle 등이 있음

Debian

개인용으로 CentOS 보다 사용하기 쉬움. 전문회사의 지원없이 오직 커뮤니티에서 시작되었다.
패키지 설치 및 업그레이드가 단순하다. Install 후 APT 업데이트 방식을 이용하면 설치나 업데이트에서 다른 패키지와 의존성 확인, 보안관련 업데이트 등을 자동으로 설정 및 설치 Debian계열로는 Ubuntu, Kali 등이 있음

APT 와 APTITUDE

응용 프로그램 설치 및 삭제 등 패키지 관리 툴
응용 프로그램 최신버전 유지 등

apt (Advanced Package Tool)

  • low level 패키지 매니저
  • 그래픽 인터페이스 없이 명령어로 사용. (CLI만 제공)
  • 다른 high level 패키지 매니저에 의해 사용 될 수 있음 → 호환성 굿
  • apt-get: 의존성 관리가 되는 패키지 관리자
  • apt: apt는 apt-get의 기능을 간소화하고, 사용자가 보기 편한 UI를 제공하여 더 사용하기 편하도록 함.

aptitude

  • high level 대화형 패키지 매니저
  • 텍스트 기반 대화형 ui가 제공 (GUI와 CLI 모두 제공)
  • aptitude는 설치, 제거, 업데이트 과정에서 충돌이 있는 경우 다른 대안을 제시
  • why 명령어로 특정 동작이 왜 안되는지 알 수 있음
  • apt에 비해 기능이 더 다양

APPArmor

  • 시스템 관리자가 프로그램 프로필 별로 프로그램 보안을 세팅 할 수 있게 해주는 리눅스 보안 모듈.
  • 프로그램의 프로필을 통하여 네트워크 액세스, raw 소켓 액세스, 파일 읽기, 쓰기, 실행 권한 등
  • 해당 프로그램이 취할 수 있는 작업을 제한하고 관리
  • MAC(강제 접근 통제)을 제공하며 취약한 서버 소프트웨어에 유용
  • 프로필의 특성
  • 프로필은 텍스트 파일로 구성한다.
  • 주석을 지원한다.
  • 네트워크에 대한 접근 제어

DAC 임의 접근 통제 : 시스템 객체에 대한 접근을 사용자나 그룹의 신분을 기준으로 제한

MAC 강제 접근 통제 : 미리 정해진 정책과 보안 등급에 따라 주체에게 허용된 접근 권한과 객체에게 부여된 허용 등급을 비교하여 접근 통제

AppArmor는 Enforcement, Complain 2개의 Mode로 동작한다.

  • Enforcement : Program의 허용되지 않은 동작을 제한하고 Log에 남긴다. 실제 Program을 운영하면서 동작을 제한 할 때 이용하는 Mode이다.
  • Complain : Program의 허용되지 않은 동작을 제한하지는 않고 Log만 남긴다. 특정 Program의 AppArmor Profile을 작성할때 이용하는 Mode이다. Log를 통해서 AppArmor Profile 작성을 도움 받을 수 있다.

UFW (Uncomplicated Firewall)

네트워크의 통로를 단일화 하여 내부 정보망을 보호하기 위한 시스템으로 외부망과 내부망을 분리하여 접근 제어를 한다.

UFW 는 사용하기 쉽게 설계된 넷필터 방화벽 을 관리하는 프로그램이다. 간단한 명령 및 명령수가 적은 명령줄 인터페이스 를 사용하는 것이 특징

$ sudo apt install ufw : ufw 방화벽 설치

$ sudo ufw status verbose : 상태 확인 (디폴트는 inactive)

$ sudo ufw enable : 부팅시 ufw 활성화 하기
($ sudo ufw disable : 비활성화)

$ sudo ufw default deny : 기본 incoming deny
($ sudo ufw default allow : 기본 incomig allow)

$ sudo ufw allow 4242 : 4242port로 ssh 연결 허용

$ sudo ufw status numbered : 규칙번호 확인

UFW 규칙을 삭제
$ sudo ufw delete 규칙번호 : 규칙번호 삭제
$ sudo ufw delete allow 포트번호 : 해당 포트규칙 삭제

SSH (Secure Shell)

원격으로 public network를 통해 호스트에 접속하기 위해 사용되는 보안프로토콜.

telnet도 쉘 기반 원격 프로토콜 이나, 보안에 취약하기 때문에 암호화 기능을 추가한 프로토콜이다.

안전한 파일전송과 원격제어에 사용되며, 개인키 - 공개키 쌍의 비대칭 키 방식을 사용한다.

클라이언트와 호스트가 각각 키를 보유하고 이를 활용하여 주고 받는 데이터를 암호화함. 중간에 누가 가로채도 암호화가 되어있기 때문에 무슨 정보인지 알 수 없음.

  1. 클라이언트는 해당 서버에 접속하기 위해 사용할 키 페어의 ID를 서버에게 전송한다.

  2. 서버는 해당 ID에 매칭 되는 공개키가 홈 디렉토리의 .ssh/authorized_keys 파일 안에 작성되어 있는지 찾는다.

  3. 존재한다면, 난수 값을 생성하고 이를 해당 공개키로 암호화하여 클라이언트에게 전송한다.

  4. 클라이언트는 전달받은 암호화된 난수 값을 해당 서버의 개인키로 복호화한다.
    (일반적으로 SSH 클라이언트는 어떠한 개인키를 사용할 것인지 선택하게끔 되어 있다.)

  5. 이후 복호화한 난수 값을 이용하여 MD5 해시 값을 계산하고 이를 다시 서버에게 전송한다.

  6. 서버도 원래의 난수 값을 이용하여 MD5 해시 값을 계산하고, 클라이언트로부터 받은 값과 같은지 검사한다.

  7. 같다면, 올바른 클라이언트임이 인증되어 이제부터 본격적인 데이터 통신이 가능해진다.

$ apt search openssh-server : 설치 확인
$ apt install openssh-server : ssh 서버 설치
$ systemctl status ssh : openserver 가 실행중인지 여부 확인

etc/ssh/sshd_config에서 원하는 포트번호로 바꿔준다.
PermitRootLogin을 no로 설정한다.

(ssh_config : client 상태의 설정)

(sshd_config : server상태의 설정)

$ sudo systemctl restart ssh : ssh 설정 적용
$ sudo service sshd status : ssh 상태 확인

리눅스/유닉스 계열에서 생성

1. 키 생성
ssh-keygen -t rsa
-t : 어떤 암호화 방식을 사용할 것인가 (디폴트이기에 정하지 않으면 rsa로 만들어진다)파일위치 지정 : (기본위치로 사용하려면 Enter)
비밀번호 : (비밀번호 없이 사용하려면 Enter)
비밀번호 확인 :
위에서 정한 파일위치에 .ssh 디렉토리가 생기고 그 아래에 id_rsa(개인키), id_rsa.pub(공개키),known_hosts 파일이 생성된다.

2. 공개키 전송Bash
scp ~/.ssh/id_rsa.pub 사용자ID@서버명:id_rsa.pub
(파일위치 - ~/.ssh/id_rsa.pub 에서 서버의 사용자의 홈디렉토로 id_rsa.pub 이라는 이름으로 복사 )

3. 서버에서 공개키 등록위치 생성Bash
mkdir .ssh
chmod 700 .ssh

4. 공개키를 등록
cat id_rsa.pub >> .ssh/authorized_keys
(리다이렉션을 이용해서 추가, 다른 인증키가 사용될수도 있으므로 append 를 시킨다.)만일 접속시 패스워드를 계속 묻거나 한다면 디버깅 모드를 사용한다.

ssh 사용자ID@ -v

디렉토리와 파일 권한Bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts

더 자세한 내용은 https://brunch.co.kr/@sangjinkang/52 해당 링크

포트 포워딩

포트포워딩(Port forwarding)은 간단히 말해서 포트(Port)를 전달(Forwarding)해 주는 거라고 생각하시면 됩니다. 특정한 포트로 들어오는 데이터 패킷을 다른 포트로 바꿔서 다시 전송해주는 작업

외부 아이피 : 포트번호 와 내부 아이피 : 포트번호 를 연결해주는 기능이다.

별도의 설정 없이 외부 아이피가 접속을 시도할 때, 내부에 어떤 프로세스 또는 기기와 연결할 지 알 수 없기 때문에 접근이 불가능하다.

그래서 포트 포워딩을 통해 외부 아이피 : 특정 포트로 접속하면 내부 아이피 : 특정 포트(다를 수도 있다.)로 맵핑 해줘야 연결이 가능하다.

PAM(Pluggable Authentication Modules)

리눅스 시스템에서 사용하는 인증 모듈로써 응용 프로그램(서비스)에 대한 사용자의 사용 권한을 제어한다.

libpam-pwquality : 패스워드 설정 강화를 위한 pam 모듈

패스워드 정책 (대문자, 소문자, 특수문자, 최소 자릿수 제한)

장점 : 보안 향상, 흔히 알고있는 브루트포스 알고리즘으로 여러 옵션을 넣었을 때 마다 찾는데 소요되는 시간

단점 : 패스워드 정책을 강제해도, 사람들은 그렇게 복잡한 패스워드를 사용하지 않는다. (만국 공통, 연구 결과 사람들은 대부분 영문,숫자,특수문자 순으로 설정한다.) 무작위로 정하기에는 기억하기에 문제가 있기 때문에 여러 도메인에서 똑같거나 거의 비슷한 패스워드를 사용하게 된다.

그리고 최근의 연구결과에 따르면 복잡한 비밀번호가 반드시 '안전'하다고 할 수 없다고 말한다.

SUDO

$ dpkg -l [부가 명령어] : (설치된 패키지 목록을 볼 수 있는 명령어)
$ dpkg -l sudo : sudo 설치 여부 확인

dpkg : 데비안 패키지 관리 시스템. apt와 같이 다른 곳에 이용되는 low-level 도구

sudo 명령어는 unix 계열 운영체제에서 사용되며 다른 사용자의 보안 권한으로서 프로그램을 구동할 수 있게 만들어준다. 보통은 root(super user)의 권한을 많이 이용한다.

  1. 보안 상의 이유로, 보통 운영체제들은 root로써 작동하는 시간을 최대한 줄이는 것을 권장한다.

  2. root가 무슨 작업을 했는지는 알 수 없지만, sudo를 사용한다면 '어떤 사용자가' root권한으로 '무슨 행동을 했는지' log에 기록된다.

  3. 이 것도 보안상의 이유인데, sudo 명령은 sudoers에 기록된 사용자만 사용할 수 있기 때문에 누군가 침입했는지의 여부를 알 수 있기도 하다.

cd var/log/sudo/00/00 : 해당 폴더에 로그가 존재. 해당 유저가 사용한 명령어를 보여줌

LVM (Logical Volume Manage)

파티션 : 어떤 하나의 무언가를 여러개로 나누는 개념

LVM : 여러 디스크 공간, 짜투리 공간을 합쳐서 하나로 만든 것

사용이유: 여러 디스크 공간을 합쳐서 하나인 양 사용하기 위해, 사용하기 애매한 공간의 디시크 파티션들을 활용하기 위해, 기존에 사용중인 디스크의 공간을 확장할 수 있기에

LVM은 파티션 대신에 volume이라는 단위로 저장 장치를 다룬다. 스토리지의 확장,변경에 유연하고 크기를 변경할 때 기존 데이터의 이전이 필요 없다. 즉, 파티션은 물리적으로 나누는 단위, volume은 논리적으로 나누는 단위라고 할 수 있다.

동적할당메모리 느낌으로 설명 주소로 연결되어 해당 메모리에 접근 가능

ex) 사람 수용 5,000명이 가능한 게임에 10,000명이 들어와 서버를 늘리기 위해 하드를 추가할때 각각 서버 설정을 해줘야 하지만 LVM을 활용하면 해당 세팅을 다시 하지 않아도 되는 편리함이 있다.

  • 논리 볼륨 관리자

  • 물리적인 디스크를 논리적인 디스크로 할당하여 유연하게 관리할 수 있게해줌

    • 운영체제 설치시 파티션을 지정해줘야하는데, 기존에 이 파티션의 크기를 바꾸는 방법은 재설치하여 해결함
    • LVM은 재설치없이 크기를 조정
    • 여러개의 디스크 공간을 합쳐서 하나처럼 사용할 수 있음
  • 비슷한 것으로는 (RAID)가 있음

  • 용어 설명

    • 파티션(Partition)
      • 하나의 하드디스크에 대해 영역(구역)을 나누는 것을 말한다. fdisk로 파티션 설정 가능.
    • 물리볼륨(PV, Physical Volume)
      • 물리볼륨은 각각의 파티션을 LVM으로 사용하기 위해 형식을 변환시킨 것이다.(/dev/hda1/dev/hda2 등)
    • 논리볼륨(LV, Logical Volume)
      • 사용자가 다루게 되는 부분이며 마운터 포인터로 사용할 실질적인 파티션이다. 크기를 확장 및 축소 시킬 수 있다.
    • 볼륨그룹(VG, Volume Group)
      • PV로 되어 있는 파티션을 그룹으로 설정한다. /dev/sda1 을 하나의 그룹으로 만들 수도 있고, /dev/sda1 + /dev/sda2처럼 파티션 두 개를 하나의 그룹으로 만들 수 있다.
    • 물리적 범위(PE, Physical Extent)
      • PE는 LVM이 물리적 저장공간(PV)을 가리키는 단위이다. 기본 단위는 4MB이다.
    • 논리적 범위(LE, Logical Extent)
      • LE는 LVM이 논리적 저장공간(LV)을 가리키는 단위이다. 기본 단위는 물리적 범위와 동일합니다.
    • VGDA(Volume Group Descriptor Area)
      • 볼륨그룹의 모든 정보가 기록되는 부분. VG의 이름, 상태, 속해있는 PV, LV, PE, LE들의 할당 상태 등 을 저장한다. VGDA는 각 물리볼륨의 처음부분에 저장된다.

cron

특정한 시간에 or 특정 시간마다 어떤 작업을 자동으로 수행하게 하는 명령어

  • cron은 유닉스 계열의 job scheduler성격의 데몬 프로세스이다.

    • job
      • 특정 작업이나 프로세스
    • scheduler
      • 특정한 시간마다 혹은 특정한 이벤트 발생시 job을 자동으로 실행하는 것
    • 데몬 프로세스
      • 사용자가 직접 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램
      • 백그라운드 프로세스와 다른점은 사용자와 상호작용하지 않는 독자적인 프로세스란 것이다.
  • 반복적인 일들을 자동화해주며 많은곳에서 두루 활용된다.

    • 특정시간 마다 DB를 백업할 수 도 있고, 특정시간마다 웹페이지를 스크래핑하는 cron을 만들수도 있다.
  • 크론탭 백업

    • crontab -l > /home/bak/crontab_bak.txt
  • cron 표현식

    • 설명을 봐도 바로 작성하기는 쉽지않다. 이를 위해 UI를 통해 표현식을 만들어주는 사이트도 있다. 특정 주기마다 실행시키고 싶은 경우 * , - / 을 이용하는 방법이 있다.

tty (teletypewriter)

리눅스 디바이스 드라이브 중에서 콘솔이나 터미널을 의미합니다.

모니터, 키보드로 직접 본체에 연결된 모드를 말하고, 2번째 콘솔부터 가상콘솔 입니다. 두번째 모니터, 키보드는 실제로 존재하지 않으니 가상이라는 말이 붙고 tty0, tty1, tty2 … 이런식으로 나열되고 콘솔은 6번까지 있습니다.

💻 BONUS

Lighttpd: 오픈소스 경량 웹 서버

Web server(웹 서버) 우리가 인터넷에서 사용하는 웹 페이지가 들어있는 파일(HTML)을 사용자에게 제공(렌더링)해주는 서버 프로그램이다.

Lighttpd : 적은 자원을 사용하여 높은 성능을 내는 오픈소스 웹 서버 애플리케이션.빠른 처리 속도와 가벼운 용량이 장점.

$ sudo apt install lighttpd : 설치
$ lighttpd -v : 버전확인
$ sudo systemctl stop lighttpd.service : 서버 중지
$ sudo systemctl start lighttpd.service : 서버 시작
$ sudo systemctl enable lighttpd.service : 서버 부팅 (enable with start up)
$ sudo systemctl status lighttpd : 상태 확인

Apache 웹서버 : 무료로 사용 가능한 오픈 소스로 리눅스나 윈도우 등 거의 모든 운영체제에서 사용 할 수 있고, 보안 수준이 높은 것으로 알려져 있다.

Nginx 웹서버 : 역시 무료이며 대규모 웹 트래픽 처리 상황이 발생할때 고효율을 발휘하는 것으로 알려져 있다

PHP 설치

PHP 란 (Hypertext preprocessor 서버측 스크립트)서버측에서 실행되는 프로그램 언어로 스크립트 형식으로 작성되어 있다.
웹개발에 특화된 언어로, 개인이 홈페이지를 쉽게 만들기 위해 개발됐다.
HTML에 추가해 주면 서버에서 웹 페이지를 렌더링해준다.

MariaDB 설치

RDBMS Software, OpensourceUnix socket방식으로 인증/접속 (sudo) 하는 방식을 채택하고 있다.=> mysql의 사용자와 시스템 사용자를 일치시킨다. 이로인해, 항상 sudo를 통해 접속해야 한다.

아래 명령어로 MariaDB를 설치한다.

$ sudo apt install mariadb-server mariadb-client

아래는 DB 중지, 시작, 부팅 시 활성화 명령어이다.

$ sudo systemctl stop mysql.service // DB 중지
$ sudo systemctl start mysql.service // DB 시작
$ sudo systemctl enable mysql.service // DB 부팅(enable with start up)

설치 후 아래 명령어를 통해 보안 설정을 한다.

IP주소 127.0.0.1은 localhost 또는 루프백 주소라고 하는 특수 목적의 IPv4 주소이다.모든 컴퓨터는 이 주소를 자체 주소로 사용하지만 실제 ip주소처럼 다른 장치와 통신 할 수는 없다.=> 즉, 네트워크를 구축하지 않고도 네트워크처럼 응답을 보내고 받는것이 가능하다.

Fail2ban 설치

Fail2ban 은 서버 로그를 분석하여 의심스러운 IP 주소를 식별하고 차단하는 프로그램입니다. 

IP 주소에서 여러 번의 로그인 시도 실패 또는 자동화된 공격을 발견하면 방화벽으로 일시적 또는 영구적으로 차단할 수 있습니다.sud

$ sudo apt install fail2ban
$ sudo systemctl start fail2ban
$ sudo systemctl enable fail2ban
$ sudo systemctl status fail2ban
코드 언어:셸 세션(shell)

/etc/fail2ban/jail.local그런 다음 매개변수를 구성하기 위해 파일을 만들고 수정해야 합니다 .

$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
$ sudo nano /etc/fail2ban/jail.local
코드 언어:셸 세션(shell)

SSH 연결에 Fail2ban을 적용하려면 279번째 줄에서 시작하는 "SSH 서버" 섹션 아래의 파일에 몇 줄을 추가해야 합니다.

## SSH servers#

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:# normal (default), ddos, extra or aggressive (combines all).# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.# mode   = normalenabled  = true
maxretry = 3
findtime = 10m
bantime  = 1d
port     = 4242
logpath  = %(sshd_log)s
backend  = %(sshd_backend)s

코드 언어:Bash(bash)

실패한 연결 시도와 금지된 IP 주소를 보려면 다음 명령을 사용하기만 하면 됩니다.

$ sudo fail2ban-client status
$ sudo fail2ban-client status sshd
$ sudo tail -f /var/log/fail2ban.log
코드 언어:셸 세션(shell)

/etc/fail2ban/jail.localFail2ban이 실제로 IP 주소를 금지하는지 테스트하기 위해 구성 파일 에서 SSH 금지 시간을 30m와 같은 더 낮은 값으로 변경할 수 있습니다 . 그런 다음 잘못된 비밀번호로 SSH를 통해 호스트 시스템에서 여러 번 연결을 시도하십시오. 몇 번의 시도 후에 연결을 거부해야 하고 fail2ban-client status sshd명령에 금지된 IP 주소가 표시되어야 합니다.

✅ 배운점

1Circle 프로젝트중 가장 오랜시간이 걸린 Born2beroot 프로젝트 입니다.

가상머신을 통해 Debian을 설치하면서 OS의 차이점과 리눅스 환경에 대한 공부와 그 외 다양한 CS지식에 대해 단순한 이론상 이해가 아닌 직접 하나하나 사용해보며 더욱 제대로 내용을 이해하는 계기가 되었습니다.

포스팅에 작성한 여러 개념 외에도 포트포워딩을 진행하면서 DHCP와 IPv4와 IPv6의 내용 및 차이점, TCP/IP주소에 대한 내용 등 나름 정처기와 정통기를 취득하면서 공부 한 CS에 대한 지식은 많이 안다고 자부했었는데, 아직 많이 부족함이 있다는 사실과
주변에서도 해당 과제를 통해 많은 지식향상과 더 전문적인 공부를 하고싶어 리눅스마스터를 준비하는 분도 생길 정도로 정말 많은걸 배운 프로젝트입니다.

profile
정통과 / 정처기 & 정통기 / 42seoul 7기 Cardet / 임베디드 SW 개발자

0개의 댓글