본문 바로가기

프로그래밍/Network

[study] Virtual box server 구축 개념 정리

1. 가상머신의 작동 방식 및 목적

:

가상 머신을 생성하고 구동하는 '하이퍼바이저(hypervisor)' 라는 소프트웨어가 다수의 운영체제를 동시에 실행시켜준다.

이는 실제 컴퓨팅 리소스(프로세서, 메모리 등)을 각 가상머신에 할당해주고 그를 이용하여 가상머신을 실제 컴퓨터처럼 동작하는 별도의 컴퓨팅 환경으로 실행시킨다. 

 

이렇게 가상머신을 사용 및 실행하게 되면, 다른 가상머신이나 물리적 호스트 머신(실제 컴퓨터)과 완전히 독립적으로 유지되는 것이 사용의 이점이다. (ex. Windows OS 에서 Linux VM 실행)


2. 운영 체제 Rocky와 Debian

:

우선, 리눅스 배포판은 주로 패키지 관리자와 저장소를 기준으로 묶는다.

레드햇(Red Hat) 계열은 서버 시장이 주 타겟인 배포판이며, 패키지 관리자로 yum을 사용하는 것이 특징이다.

데비안(Debian) 계열은 패키지 형식이 .deb이며, 패키지 관리자로 apt를 이용한다.

외에도, 맨드리바, 마제야, 우분투, 아치, 슬랙웨어, 젠투, SUSE, 안드로이드 등 여러 계열들이 존재하며

각각의 특징을 가진다.

 

Debian 은 리눅스 배포판으로, 자유 오픈 소스 소프트웨어이다.

현존 Linux 배포판 중 가장 넓은 사용자 층을 가지는 Ubuntu 이 Debian 계열이며,

수많은 리눅스 배포판의 모체가 되었다.

별도의 패키지 관리 도구인 apt, dpkg 를 통해 패키지 관련 업데이트를 자동 수행한다.

이 점이 편리하여 많은 지지를 받았다.

 

Rocky는 위에서 서술한 레드햇 계열의 리눅스 배포판이다. 패키지 관리자로 yum을 사용하고,

초보자에게 보다 쉬운 설치, 관리, 업그레이드를 도와주는 독자적 패키지 관리 도구인 RPMYUM을 이용한다.


3. aptitude와 apt

:

apt (Advanced Packaging Tool) 은 Debian 계열에서 소프트웨어 설치와 제거를 처리하는 패키지 관리자 툴이다.

.deb 패키지를 관리하기 위해 만들어졌지만, rpm 패키지 매니저와도 호환이 된다.

그래픽 인터페이스 없이 명령어로 사용하며, 유연하게 동작하여 시스템이 업그레이드 되어도 패키지를 업데이트하지 않게 해 현 버젼을 그대로 계속 사용할 수 있는 등의 작업이 가능하다.

apt-get : 패키지 설치, 업데이트 및 제거

apt-cache : 패키지 조회

dpkg -l : 시스템에 설치된 패키지 조회

이 3가지를 합쳐서 apt 패키지 관리자로 단일 명령으로 결합된다.

 

aptitude는 high-level 패키지 관리 도구로, 사용자 인터페이스가 추가되어 대화형으로 패키지를 검색해 설치, 제거가 가능하다. 마찬가지로 rpm 기반 패키지까지 확장되었다. apt-get, apt-cache의 기능도 포함되어 있다.

 

차이점은, aptitude는 설치된 패키지 목록을 보거나, 자동 또는 수동으로 패키지를 설치하게 표시하는 등의 추가적인 기능을 동작할 수 있다는 점이 가장 크다. apt는 설치나 제거가 충돌에 의해 멈추면 그냥 종료되지만, aptitude는 해결 방안을 제시하며, 동작이 안되는 이유를 사용자가 알 수 있도록 여러 기능들을 제공한다.


4. APPArmor

:

AppArmor는 리눅스 애플리케이션 보안 시스템으로, 내외부적 위협으로부터 운영체제 및 애플리케이션을 보호한다.

 

디렉토리나 파일 등의 시스템 자원을 적절한 권한이 있는 사용자 또는 그룹이 접근하여 사용하도록 통제해주는 기능을

접근 통제 (Access Control)라 하는데, AppArmor는 그 접근 통제로 MAC (강제적 접근 통제, Mandatory Access Control)을

제공하며, 이는 정해진 정책과 보안 등급에 의거해 통제하며, 관리자만이 객체의 보안레벨과 주체의 보안등급을 수정 가능하다. 높은 보안을 요구하는 정보는 낮은 보안등급의 주체가 접근하지 못하고, 정책에 어긋나면 객체 소유자도 객체 접근이 불가하다.


5. UFW

:

데비안 계열 및 여러 리눅스 환경의 방화벽으로 UFW(Uncomplicated FireWall) 가 쓰이며,  사용하기  쉬워서 많이 사용한다. 방화벽이란 네트워크 트래픽을 모니터링하고 제어하는 네트워크 보안 시스템인데, 이는 필터링의 수행이 필요하다.

그 필터 중 리눅스에서 많이 쓰는 것이 iptable이고, 이 iptable의 작업을 간편하게 해주는 것이 UFW 의 기능이다.

(iptable : 사용자 공간 응용 프로그램. 테이블, 체인, 규칙들을 구성하게 해준다. 설정, 관리가 복잡.)

 

전문적이고 정밀한 방화벽 설정을 위해서는 iptable을 사용하고, 쉽고 단순한 사용에 초점을 맞추면 UFW를 사용하면 된다.


6. SSH 서비스

:

SSH (Secure SHell protocol)는 네트워크 프로토콜 중 하나로, Public Network (인터넷 등)에서 서로 통신할 때 보안이 안전하도록 사용하는 프로토콜이다. '데이터 전송 / 원격 제어'에 주로 쓰인다. (ex. 데이터 전송 - github 등)

이는 비밀번호를 입력하는 일반적인 방식의 접속을 하지 않고, 한 쌍의 Key를 통해 인증 과정을 거친다.

Private Key / Public Key 로 나뉘는 한 쌍인데, 공개되어도 되는 Public Key를 통해 메시지를 전송하기 전 암호화를 하며,

외부에 절대 노출되어서는 안되는 Private Key는 본인 컴퓨터 내부에 저장되어 암호화 메시지를 복호화하는 기능을 한다.

 

[ SSH의 작동 원리 단계 ]

1. 클라이언트가 서버에 원격 접속하기 위해 연결 설정 프로세스를 시작

(클라이언트가 서버의 특정 포트로 통신하여 접속 요청을 보내면, 서버가 프로토콜 버전을 클라이언트에 전송,

서버가 지원하는 프로토콜의 버전이 자신과 버전 일치시 연결 지속)

2. 서버가 자신의 공개키를 클라이언트에게 전송

(클라이언트에게 SSH 접속 요청을 받으면 서버의 Public Key(공개키)를 클라이언트에게 전송,

클라이언트는 서버로부터 받은 공개키를 로컬에 저장.)

3. 클라이언트는 서버가 올바른지 확인

(클라이언트에서 난수 만들어 서버 공개키로 암호화 후 서버로 전송, 서버는 Private Key로 복호화하여 난수 추출,

난수 값을 클라이언트에게 전송하여, 클라이언트에 저장된 난수와 비교하여 동일한지 확인)

4. 대칭키 생성하여 모든 통신을 대칭키를 통해 암호화

5. 서버는 접근할 수 있는 클라이언트인지 확인

6. 클라이언트가 서버에 원격 접속 가능

 

[ SSH의 사용가치 ]

데이터 전송 시 평문으로 전송되어 쉽게 스니핑에 노출 되기 쉬운 Telnet, Rlogin, RSH 등의 원격 접속 프로토콜에 비해,

암호화를 사용하였기에 SSH는 안전한 네트워크 서비스가 제공되며 네트워크 공격으로부터 보호해준다.

 

+)

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 4242 [사용자id]@[ip주소] : ssh 접속시의 비밀번호를 저장 시켜두는 명령어.


7. 사용자 그룹 (sudo, 사용자 지정 그룹) 생성 및 설정

:

리눅스 시스템에서는 사용자를 생성하면 사용자명과 같은 그룹이 생성되고, 사용자명과 같은 그룹에 반드시 속하게 된다.

그 외에 추가적으로 특정 그룹을 만들어서 사용자들이 소속되게 할 수 있다.

 

groupadd 그룹명 : 그룹을 추가해준다. 항상 가장 마지막 GID(그룹 아이디)의 다음 번호로 할당된다.

groupadd -g 특정GID번호 그룹명 : 원하는 특정 GID로 그룹을 추가해준다.

groupdel 그룹명 : 그룹을 삭제해준다.

groups : 그룹을 확인할 수 있다. 명령어 뒤에 사용자명을 입력하면 해당 사용자의 그룹들을 나열해준다.

 

usermod -g 그룹명 유저명 : 특정 유저의 primary group을 해당 그룹으로 변경한다.

(primary group 이란? 리눅스 계정이 반드시 가지는 하나의 그룹. 사용자가 파일이나 디렉토리를 만들면,

해당 사용자와 그 사용자의 Primary Group이 해당 파일의 소유 권한을 가짐.)

usermod -G 그룹명 유저명 : 특정 유저의 secondary groups을 해당 그룹으로 변경한다.

usermod -G 그룹명 -a 유저명 : 해당 그룹을 특정 유저의 secondary groups에 추가한다.

(secondary groups 란? 사용자가 원할시 한 계정을 여러 그룹에 소속시킬 수 있는데, 최대 31개의

secondary groups 에 속할 수 있다.)

 

id 명령어를 통해서 확인해보면, uid(유저명), gid, groups가 존재하는데, gid가 Primary, groups가 secondary 그룹이다.


8. sudo 란?

:

sudo : Super User DO, Substitute User DO 의 줄임말로, sudo를 명령어 앞에 붙이면 root 권한(최고 관리자)으로

실행이 되도록 해준다. visudo 라는 명령어를 통해 /etc/sudoers 설정 파일에 명시되어 있는 User만 사용 가능하다.

가장 쉬운 이해로는 windows의 '관리자 권한으로 실행' 과 비슷한 기능이라는 것이다.

 

sudo 명령어 : 일반 사용자가 root 권한을 잠시 빌려서 명령을 실행함.

su 계정명 : 현재 사용자를 로그아웃하지 않고 유지하며, 그 상태에서 다른 사용자의 계정으로 전환하는 명령어.

su - 계정명 : 다른 사용자의 계정으로 완전히 전환하고, 해당 사용자의 환경설정을 불러오는 명령어.

su - : root 계정으로 전환하는 명령어.


9. 비밀번호 정책 / 복잡도 

:

/etc/login.defs 에서 비밀번호 정책에 대한 옵션을 설정할 수 있다.

PASS_MAX_DAYS : 비밀번호 최대 사용기간

PASS_MIN_DAYS : 비밀번호 최소 사용기간

PASS_MIN_LEN : 비밀번호 최소 길이 설정

PASS_WARN_AGE : 비밀번호 기간 만료 경고 기간

 

특정 계정의 비밀번호 설정 정보를 변경하려면 chage 명령어를 사용할 수 있다.

chage -l 계정명 : 해당 계정의 비밀번호 정보가 나온다.

chage -m 일자 계정명 : 해당 계정의 비밀번호 최소 사용 기간을 설정할 수 있다.

chage -M 일자 계정명 : 해당 계정의 비밀번호 최대 사용 기간을 설정할 수 있다.

chage -W 일자 계정명 : 해당 계정의 비밀번호 기간 만료 경고 기간을 설정할 수 있다.

 

- 비밀번호 복잡도 설정

apt install libpam-pwquality 를 통해 설치

vim /etc/pam.d/common-password 로 켜고,

password requisite pam_pwquality.so retry=3 minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 maxrepeat=3 reject_username difok=7 enforce_for_root 로 해당 부분 작성.

 

retry : 암호 입력 가능 횟수 (현재 설정 값 : 3)

minlen : 암호의 최소 길이 (현재 설정 값 : 10)

ucredit : 대문자 포함 개수 (현재 설정 값 : -1  => 1개 이상 포함하기)이 값이 양수 이면 최대 포함 개수가 된다.

lcredit : 소문자 포함 개수 (현재 설정 값 : -1)

dcredit : 숫자 포함 개수 (현재 설정 값 : -1)

maxrepeat : 같은 문자 n번 이상 연속해서 나오지 않도록 설정 (현재 설정 값 : 3)

reject_username : 암호에 유저명이 포함되지 않도록 설정

difok : 기존 암호와 달라야하는 문자 수, 겹치지 않아야하는 문자의 수 (현재 설정 값 : 7)

enforce_for_root : 루트 계정에도 해당 규칙을 적용하도록 설정


10. 포트 포워딩

:

포트(Port)란?

- 서버가 여러 역할을 하게 되면, 클라이언트가 서버에게 어떤 요청을 보냈을 때 어떤 요청인지 구분할 방법이 필요하다. 그럼

숫자로 표현되어 있는 포트를 통해서 구분을 한다.

0 ~ 1023번 포트는 잘 알려진 포트로, 정해진 규격 포트들이 존재한다. (ex. 20: FTP / 22: SSH / 80: HTTP ...)

1024 ~ 49151번 포트는 등록된 포트로, 사용자가 등록하여 다른 용도로 포트들을 할당할 수 있다.

49152 ~ 65535번 포트는 동적 포트로, 용도가 지정되있지 않고 어느 프로그램에서나 사용가능한 포트이다.

그리하여, 80번 포트로 들어오는 요청은 http 요청임을 알고 해당 역할을 하고, 21번 포트로 오는 요청은 파일 요청임을 알고

파일을 공유하는 등 Lan선 하나에 통신 프로그램이 다수이면 이렇게 프로그램들을 구별해주는 역할을 한다.

 

포트포워딩(Port-Forwarding) 이란?

- '외부 IP : 포트번호 -----> 내부 IP : 포트번호' 를 연결해주는 기능

- 외부에서도 내부망에 접속이 가능하도록 해주는 것인데, 예시를 들면,

A에서 B공유기(IP: 1.2.3.4)의 21번 Port로 접속한다고 요청한다. 그럼, 이 공유기는 연결되어있는 C, D, E PC 중

어느 PC의 어느 포트로 연결해야할지 모르는 상황이고, 이 요청이 오면 C PC(IP:5.6.7.8)의 2222번 Port로 연결하겠다고

미리 정해두면 해당 요청 시 연결을 시켜줄 수 있다. 이 연결해주는 것을 '포트포워딩' 이라 할 수 있다.

- 인터넷에서 공유기에 접속하기 위해선 외부 IP가 반드시 공인 IP여야 하고, 이를 내부망의 사설 IP로 연결 시키기 위해

이러한 포트포워딩 과정을 거쳐준다. (해당 사설 IP만 알아봤자 인터넷에서는 특정 기기로 알 수 없다. 공인 아이피를 통해야함.)


11. 호스트 설정

:

hostname : 호스트 이름을 확인한다.

hostnamectl set-hostname 호스트명 : 호스트 이름을 변경한다. (시스템 재시작 필요)

hostname 호스트명 : 호스트 이름을 변경한다. (시스템 재시작 필요)


12. 가상머신 파티션 / LVM 작동 방식 및 내용

:

LVM(Logical Volume Manager) 절차 정리


13. CRON 이란?

:

cron : 특정 시간에 특정 작업을 하도록 해주는 리눅스의 데몬(daemon).

crontab : cron이 언제 무엇을 하는지 특정 파일에 저장하는 것.

원하는 시간에 원하는 명령이나 작업을 수행하게 하는 것을 crontab 작업이라 하며, 윈도우의 스케쥴러와 비슷하다.

 

crontab -e : 크론탭 편집

crontab -l : 크론탭 작업 내용 확인

crontab -r : 크론탭 삭제

 

* * * * * 실행명령 : 순서대로 분, 시, 일, 월, 요일이 *에 대응되는데, 모두 *로 해두면 매 분마다 해당 명령이 실행된다.

0 * * * * 실행명령 : 매 시 0분에 실행된다는 것으로, 매 시 정각에 실행되는 것이다.

0 14 * * * 실행명령 : 매일 14시 0분에 실행된다는 것이다.

*/10 * * * * 실행명령 : 매 10분마다 실행된다는 것이다. (0시 10분, 0시 20분, 0시 30분 ...)


 14. monitoring 스크립트

:

wall 은 리눅스 시스템에서 모든 사용자의 터미널로 메시지를 보내는 방법이다.

이를 통해서 시스템 상태를 모니터링하는 스크립트를 .sh 파일로 작성하여, wall로 메시지를 보낼 수 있다.

위에서 만든 cron을 통해 특정 시간마다 이 스크립트를 실행하도록 하면 주기적으로 점검하는 기능을 할 수 있다.

arch=$(uname -a)
cpup=$(grep "physical id" /proc/cpuinfo | sort | uniq | wc -l)
vcpu=$(grep "processor" /proc/cpuinfo | wc -l)
memu=$(free -tm | awk '/Total/ {print $3"/"$2"MB","("((int($3*100 / $2*100)) / 100)"%)"}')
disu=$(df -h --total | awk '/total/ {print int($3 * 1024)"/"$2"b ("$5")"}')
cpul=$(mpstat | tail -1 | awk '{print 100-$13"%"}')
lasb=$(who -b | awk '{print $3" "$4}')
lvmi=$(lsblk | grep "lvm" | wc -l)
lvmu=$(if [ lvmi > 0 ]; then echo "Yes"; else echo "No"; fi)
cont=$(netstat | grep "tcp" | wc -l)
conc="ESTABLISHED"
usel=$(who | wc -l)
honi=$(hostname -I)
netw=$(ifconfig | grep "ether" | awk '{print $2}')
sudn=$(journalctl -a | grep "sudo" | wc -l)

wall "#Architecture : ${arch}
#CPU physical : ${cpup}
#vCPU : ${vcpu}
#Memory Usage : ${memu}
#Disk Usage : ${disu}
#CPU load : ${cpul}
#Last boot : ${lasb}
#LVM use : ${lvmu}
#Connections TCP : ${cont} ${conc}
#User log : ${usel}
#Network : IP ${honi}(${netw})
#Sudo : ${sudn} cmd"

 

grep, awk 등을 활용해서 특정 명령어에서 특정 부분만을 추출하여 출력하는 스크립트를 작성하였다.

변수로 만들고 해당 명령어들을 wall에서 불러와 모두 실행하여 출력해준다.


15. wordpress 설정

:

apt-get install php php-fpm php-mysql lighttpd mariadb-server mariadb-client

: 필요한 패키지들을 다운로드 받아오기.

 

cd /etc/lighttpd/ 이후, vim lighttpd.conf로 열기

그리고, server.port 를 특정포트(ex.4321) 로 변경

ufw allow 4321 을 통해 4321 포트의 ufw 방화벽을 해제해준다.

 

apt-get install wget

: wget 명령어는 웹에서 파일 다운로드를 도와주는 리눅스 커맨드라인 유틸리티이다.

 

wget https://ko.wordpress.org/wordpress-6.0-ko_KR.tar.gz

: 이를 통해 워드프레스를 다운로드 받아준다.

 

tar xfz wordpress-6.0-ko_KR.tar.gz

: 압축을 풀어주는 과정.

 

mv wordpress /var/www/html

: 해당 위치로 wordpress 폴더를 옮겨 준다.

 

chmod 707 wordpress

: 워드 프레스의 권한을 변경해주어 유저가 읽기쓰기실행이 가능하도록 해준다.

 

lighty-enable-mod fastcgi-php

: fastcgi-php 활성화하기.

 

vim /etc/lighttpd/conf-available/15-fastcgi-php.conf

: 해당 파일에서

"bin-path" => "/usr/bin/php-cgi",
"socket" => "/run/lighttpd/php.socket"

부분을

"socket" => "/var/run/php/php8.2-fpm.sock"

으로 대체 해준다.

 

mariadb 에서 db를 생성하고, 기본세팅을 해준다.

 

이제, 웹브라우저로 가서 자신의 ip와 port를 입력하고 들어가면, ex) 000.000.000.000:4321

wordpress 첫 기본 설정 창이 오픈되고, 정보들을 기입하고 나면 wordpress 첫 기본 세팅이 완료된다.


[ 출처 ]

더보기

UFW방화벽 : https://apost.dev/linux-ubuntu-banghwabyeog-ufw-gico-sayong-bangbeob/

ssh : (https://baked-corn.tistory.com/52

비밀번호 정책 : https://techbrad.tistory.com/16

계정비밀번호 개별 정책 변경 : https://skd03052.tistory.com/239

비밀번호 복잡도 설정 : https://kiki-100.tistory.com/124

https://velog.io/@kyj93790/Born2beroot-5.-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%B2%B4%EA%B3%84-%EB%8F%84%EC%9E%85

group 생성 : https://webdir.tistory.com/134

group 설정 : https://m.blog.naver.com/wideeyed/221512008307

호스트 이름 수정 : https://webinformation.tistory.com/40

sudo, su : https://velog.io/@byeol4001/root%EC%99%80-admin-user-%EA%B7%B8%EB%A6%AC%EA%B3%A0-sudo%EC%99%80-su-su-%EC%9D%98-%EC%B0%A8%EC%9D%B4

sudo 설정 파일 수정하기 (visudo) : https://kiki-100.tistory.com/122

리눅스 크론탭 - 특정 시간에 특정 작업하기 : https://jdm.kr/blog/2

wall 명령어 : https://jjeongil.tistory.com/2056

uname 으로 architecture (운영체제 아키텍쳐 보기) : https://m.blog.naver.com/anysecure3/222358732241

physical CPU 확인 : https://bookfriend.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4Linux-CPU-%EC%BD%94%EC%96%B4-%EC%88%98-%ED%99%95%EC%9D%B8-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%EB%B2%95%EA%B8%B0%EB%B3%B8-%EC%98%B5%EC%85%98%EB%A7%8C

free 명령어 사용 : https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=235927

포트포워딩 관련 1: https://sangbeomkim.tistory.com/105 

포트포워딩 관련 2 : https://velog.io/@dha/%ED%8F%AC%ED%8A%B8-%ED%8F%AC%EC%9B%8C%EB%94%A9-%EC%99%9C-%ED%95%98%EB%8A%94-%EA%B1%B8%EA%B9%8C

포트포워딩 관련 3 : https://ooeunz.tistory.com/104

Recent Posts
Popular Posts
Recent Comments