[Born2beRoot]가상머신 세팅

JH Bang·2022년 5월 10일
0

42 Seoul

목록 보기
2/9
post-thumbnail

가상머신 설치

✓ 가상머신(virtual machine)이란 특정 물리적 컴퓨터 위에 물리자원을 가상화한 컴퓨터 환경을 구축하여 어떠한 운영체제라도 설치할 수 있게 하는 소프트웨어를 말한다. 하나의 물리적 자원 위에 다수의 운영체제를 설치하는 식으로 서버용 컴퓨터를 보다 효율적으로 사용하기 위해 주로 사용한다. VM외에 Docker로 대표되는 컨테이너라는 개념도 있다.

✓ 가상머신을 설치하기 앞서 하이퍼바이저(Hypervisor)라는 개념을 알아야 한다. 하이퍼바이저는 실제 물리 자원을 가상화하고 이를 가상머신(Guest OS)이 사용할 수 있도록 중간에서 매개체 역할을 하는 소프트웨어다. 윈도우에서는 Hyper-V가 대표적으로 잘 알려진 하이퍼바이저인 반면, 리눅스에서는 가상화를 위해 KVM/QEMU 하이퍼바이저를 기본적으로 지원하고 있다.

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

✓ 하이퍼바이저는 타입 1과 타입 2로 나뉜다. 타입 1의 경우 네이티브(Native) 혹은 베어 메탈(Bare Metal) 하이퍼바이저라고도 불리며, 하드웨어와 직접 상호작용한다. KVM/QEMU, XEN 등이 타입 1 하이퍼바이저에 속한다.

✓ 반면 타입 2는 호스트 운영체제 위에서 하이퍼바이저가 동작한다. 따라서 타입 2를 호스티드(Hosted) 하이퍼바이저라고 부르기도 한다. VMware Fusion, VMware Workstation, Parallels Workstation, VirtualBox 등이 있다. 과제에서 요구하는 대로 버추얼박스를 설치하기로 한다.

✓ 버추얼박스를 설치하려면 원래는 공식 링크(https://www.virtualbox.org/wiki/Downloads)에서 virtual box 다운로드 해야하나 맥 클러스터 환경에서는 권한이 없다. Managed software center에서 다운받도록 한다.

Debian vs CentOS

✓ 버추얼박스를 설치했다면 이제 서버용 운영체제를 선택해야 한다.

CentOS = 기업용으로 주로 사용하며 RHEL(Red Hat Enterprise Linux)을 그대로 가져옴. 간단히 말해 Redhat 체험판으로 보면 됨. 다만 업데이트가 느리고 개인이 다루기 어려움.
Redhat 계열로 CentOS 외에 Fedora, Oracle 등이 있음.

Debian = 개인용으로 CentOS보다 사용하기 쉬움. Debian 계열로는 Ubuntu, Kali 등이 있음. 문제 요구사항에서 초보자일 경우 데비안을 선택할 것을 추천.

✓ chobo라서 데비안을 선택했고, 아키텍처에 맞는 데비안 버전을 다운로드해야 한다.
https://www.debian.org/releases/stable/debian-installer/

✓ 데비안 설치를 위해 아키텍처 중 하나를 선택해야 한다.
32비트 인텔 계열 = x86, i386, i686
64비트 인텔 계열 = x86_64, amd64

이외 포트 설명은 아래 참조
https://www.debian.org/ports/

✓ 클러스터 맥은 어떤 아키텍처인지 확인해보기 위해 arch 명령어를 사용하여 확인해보니...

$arch
i386

✓ 이유를 찾아보니...

arch reports i386 for Intel architectures that are capable of running 32-bit; it doesn't tell you whether they can run 64-bit or not. The behavior appears to be a legacy of when arch was used to distinguish between ppc and i386 platforms when Intel support was first introduced in OS X.

참고로 PowerPC(PPC)는 MAC(맥)이 과거 사용했던 프로세서이다.

✓ 이에 OS 이름을 출력해주는 uname 명령어로 확인해 본 결과...
uname -m(hardware name) 은 x86_64
uname -p(architecture name) 는 i386
이라는 결과를 나타냈다.

✓ x86_64에 대해 찾아보니 amd64라고 한다.

x86_64 is name of specific 64-bit ISA. This instruction set was released in 1999 by AMD (Advanced Micro Devices). AMD later rebranded it to amd64.

참고로 ARM 아키텍처는 SoC(system on chip)에서 주로 사용한다고 한다.

✓ ISA (Instruction Set Architecture)는 소프트웨어와 하드웨어의 중간 단계에 있으며 CPU가 이해하는 기계어 명령어를 의미한다.

✓ netinst amd64 Debian 설치 CD 이미지를 다운 받도록 한다. netinst CD는 전체 운영 체제를 설치할 수 있는 단일 CD로, 기본 시스템을 설치하고 인터넷을 통해 나머지 패키지를 가져오는 데 필요한 최소한의 소프트웨어만 들어 있다.

Debian 설치과정

✓ VDI (VirtualBox Disk Image) : Virtualbox에서만 사용 가능한 포맷 방식
✓ VHD (Virtual Hard Disk) : Virtualbox, Hyper-V, Xen에서 사용 가능한 포맷 방식
✓ VMDK (Virtual Machine Disk) : Virtualbox, VMware Player에서 사용 가능한 포맷 방식

✓ debian iso 파일을 마운트한 후 실행

✓ 과제에서 요구하는 대로 GUI(Grapical User Interface)가 아닌 CLI(Command-Line Interface)방식을 선택

✓ Language는 영어, Location 한국 등 설정

Locale setting은 사용되는 언어, 숫자, 날짜, 시간 등의 형식, 기본 용지 크기, 문자열 정렬 및 비교 방법 및 기타 몇 가지 동작을 결성하는 방식

✓ Debian-installer는 DHCP를 사용하여 네트워크를 자동으로 설정

DHCP(Dynamic Host Configuration Protocol): 호스트의 IP주소와 각종 TCP/IP 프로토콜의 기본 설정을 클라이언트에게 자동적으로 제공해주는 프로토콜, 즉 네트워크 안에 컴퓨터에 자동으로 네임 서버 주소, IP주소, 게이트웨이 주소를 할당해주는 것을 의미하고, 해당 클라이언트에게 일정 기간 임대를 하는 동적 주소 할당 프로토콜
자동으로 네트워크 설정에 실패할 시 수동으로 설정 가능

과제 요구사항대로 hostname 끝에 42를 추가

도메인은 필요 없으므로 무시하고 패스워드 설정하고, name은 jibang2로 설정

파티션닝 할 때 Manual을 선택하여 과제 요구사항에 맞춰 root, swap, home, var, var/log, src, tmp 등을 설정해야 함.
✓ 파티셔닝은 하나의 물리 저장장치를 시스템 내부에서 여러 디스크 공간으로 나누는 작업이다. 이 공간은 물리적으로 나뉠 수도 있고, 논리적으로 나뉠 수도 있다. 물리적으로 나뉜 공간은 프라이머리(Primary), 논리적으로 나뉜 공간은 익스텐디드(Extended)다.
✓ 프라이머리 공간의 경우, 리눅스에서 최대 4개(primary 3개, extended 1개)의 공간으로 나뉠 수 있다. 더 많은 파티셔닝이 필요한 경우, 익스텐디드 공간으로 논리적으로 확장해야 한다. 일반적으로 익스텐디드 공간으로 확장해서 사용하며, LVM이라고 부르는 파일 시스템을 통해 하나의 물리 공간을 논리적으로 나눠 사용하기도 한다.
✓ 각 파티션의 위치와 크기는 디스크의 파티션 테이블에 저장되며, 운영체제는 디스크를 읽을 때 해당 테이블을 우선적으로 읽는다. 각 파티션은 운영체제에 논리적으로 독립된 디스크로 인식된다.
✓ 논리 파티션(Logical partition): 확장 파티션이 갖는 범위 안에서 생성되는 파티션이다. 데이터를 저장할 수 있지만 운영체제 설치는 불가능하며, 확장 파티션의 디스크 할당 용량만큼 생성 가능하다.
✓ 확장 파티션 (Extended partition) : 주 파티션에서 확장 가능한 파티션이다. 부족한 파티션 영역을 확장하는 용도로 사용한다. 확장파티션은 하나의 물리디스크에 하나만 설정할 수 있으며 4개의 논리드라이브를 가질수 있다.

✓ LVM(Logical Volume Manager)은 리눅스의 저장 공간을 효율적이고 유연하게 관리하기 위한 커널의 한 부분이다.
✓ LVM은 파티션 대신에 volume이라는 단위로 저장 장치를 다룬다. 스토리지의 확장,변경에 유연하고 크기를 변경할 때 기존 데이터의 이전이 필요 없다. 즉, 파티션은 물리적으로 나누는 단위, volume은 논리적으로 나누는 단위라고 할 수 있다.
✓ 물리적인디스크를 논리적 볼륨그룹으로 구성해서 이 논리적인 볼륨그룹 내에 사용자가 원하는 크기만큼의 논리볼륨을 할당하여 사용하는 방법으로, 여러개의 디스크를 하나의 논리적인 볼륨그룹(VG)으로 구성할 수 있다.
✓ 각 논리볼륨(LV)는 독립적이므로, 하나의 디스크에도 여러 가지의 파일 시스템을 설치할 수 있다.
✓ 디스크의 용량증설이 요구 될 경우에도 볼륨그룹에 물리볼륨(PV)만 추가하여 용량 증설이 가능하다.
✓ 데이터량이 감소하여 더 이상 많은 양의 저장공간이 필요 없는 경우, 볼륨그룹에 속한 물리볼륨 개수를 축소하여 용량 감소가 가능하다.
✓ LVM이 아닌 기존 방식의 경우, 하드 디스크를 파티셔닝 한 후 OS 영역에 마운트하여 read/wirte를 수행했다. 이 경우 저장 공간의 크기가 고정되어서 증설/축소가 어렵다.

Small Computer System Interface 3 (SCSI-3)는 컴퓨터에 주변기기를 연결할 때 직렬 방식으로 연결하기 위한 표준을 일컫는다. 다시 말해, 컴퓨터에서 주변기기를 연결하기 위한 병렬 표준 인터페이스로 입출력 버스를 접속하는 데에 필요한 기계적, 전기적인 요구 사항과 모든 주변 기기 장치를 중심으로 명령어 집합에 대한 규격을 말한다.
iSCSI(인터넷 소형 컴퓨터 시스템 인터페이스)는 데이터 저장 장비들을 연결하는 인터넷 프로토콜(IP) 기반의 저장 네트워킹 표준이다. 쉽게 말해 원거리용 SCSI이다.
SCSI3 (0, 0, 0) 의미는 Controller 0, Disk 0, Partition 0

SCSI-3 표준
SCSI-1,SCSI-2 처럼 하나의 단일 표준이 아니라 여러 표준들이 모아져 하나의 집합을 이룸
ㅇ SPI (SCSI-3 Parallel lnterface)
ㅇ SIP (SCSI-3 Interlock Protocol)
ㅇ SAM (SCSI-3 Architectural Model)
ㅇ SPC (SCSI-3 Primary Commands)
ㅇ SBC (SCSI-3 Block Commands)
ㅇ SSC (SCSI-3 Stream Commands)
ㅇ SCC (SCSI-3 Controller Commands)
ㅇ MMC (SCSI-3 Multimedia Commands)
ㅇ FCP (SCSI-3 Fiber Channel Protocol)
ㅇ SBP (SCSI-3 Serial Bus Protocol)
ㅇ SSP (SCSI-3 Serial Storage Protocol)

우선 첫번째 하드디스크의 첫번째 파티션(sda1)에 500M를 할당해 root partition을 만들어준다.

primary partition으로 설정하면 부팅을 할 수 있는 기본 파티션이 되며, 하나의 하드 디스크에서는 최대 3개의 프라이머리 파티션과 하나의 확장 파티션(논리 파티션 4개)이 생성 가능하다.

부팅용이므로 Mount point를 /boot로 설정해준다.
✓ ext4(extended file system 4) : 주로 리눅스에서 쓰이는 파일 시스템 중 하나로 저널링 파일 시스템(journaling file system)이다. 저널링 파일 시스템은 시스템의 일정 부분을 시스템 변경 사항 기록용으로 할당해 두어 백업이나 복구가 가능해진 시스템이다. ext3에서 더 향상된 버전이며, 대부분 리눅스 배포판(우분투 등)들은 이것을 기본 파일 시스템으로 채택하는 경향이 있다.
✓ Mount Point(마운트 포인트): 리눅스 운영체제에서 사용하고자 하는 장치들을 인식시키기 위한 특정 디렉토리이다. 파티션 또한 장치와 동일하게 디렉토리로 지정하여 사용 가능하다.
✓ Mount : 파티션의 자원을 사용자가 사용할 수 있도록 디렉토리에 연결하는 과정이다. 물리적인 장치 또한 디렉토리에 연결하여 사용 가능하다.

나머지 파티션은 논리 파티션으로 설정하고, 용량은 max로 한다.

논리 파티션에 암호화 설정

이후 논리파티션에 암호를 설정한다.

볼륨 세분화

✓ 각 볼륨그룹의 이름과 용량을 설정. 용량은 충분한 정도로 임의 설정한다.
✓ /root : 최상위 마운트 파티션으로 최상위 디렉토리로 비교적 크기가 작은 /bin, /etc를 포함.
✓ /swap : 스왑 파티션으로 가상 메모리로 사용되는 파티션으로 실제 물리적인 램이 부족할 때 대신 사용됨. /root와 함께 반드시 필요한 파티션
✓ /home : 사용자 계정 파티션으로 사용자 계정이 위치함. 웹 호스팅 서비스를 할 경우 해당 파티션의 용량을 가능한 한 크게 설정해야 한다.
✓ /var : 로그 파일 파티션으로 시스템의 로그 파일들이 저장됨. 로그 파일들로 인해 하드 공간을 많이 차지하기 때문에 디스크 용량 부족으로 인해 시스템이 마비되지 않도록 처리하는 것이 필요하다.
✓ /srv : 서버 파티션으로 프로토콜을 이용하여 외부 사용자와의 공유를 위해 사용됨. 다른 파티션에 비해 외부 사용자들이 비교적 쉽게 접근 가능.
✓ /tmp : 임시 파티션으로 임시 파일들을 저장하거나 시스템에서 임시로 작업을 진행할 때 사용하는 파티션. 멀티미디어 프로그램의 경우 이미지 파일을 해당 디렉토리에 임시로 저장한다.
✓ /var/log : 프로그램 로그파일들이 따로 저장되는 디렉토리로, 이 외에는 /var와 동일하다. 만들 때는 var-log라고 쓴다.

만든 파티션과 이름을 일치시켜 주는 마운트 과정을 진행한다.
swap만 Use as에서 swap area로 설정

var/log의 경우 enter manually를 선택하여 이름을 적어준다.

추가 미디어 검사. no 선택

✓ 미러 사이트(mirror site): 미러 사이트는 다른 인터넷 사이트의 복사본이다. 미러 사이트들은 가장 일반적으로 동일한 정보를 여러 곳에서 제공하기 위해 클라이언트가 요청하는 대량의 안정적인 다운로드를 제공한다.

✓ 프록시 서버: 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램. 설정할 필요 없음(공백)

콘솔 환경만 설치할 것이므로 SSH server와 standard system utilities만 선택

GRUB 설정
✓ 부트로더란 운영체제를 실행하기 위해 필요한 일련의 프로그램 작업들을 실행하는 프로그램이다.
✓ GRUB(Grand Unified Bootloader)는 GNU하에서 개발된 리눅스와 윈도우에서 모두 사용할 수 있는 멀티부트로더이다. 예전에는 리눅스에서 LILO(Linux Loader)라는 리눅스 전용 부트로더를 사용했다고 한다./boot가 존재하는 sda 선택

완료 후 설정한 username과 비밀번호 입력

✓ $ lsblk - list block devices
LVM을 할당한 디스크가 sda5인 이유는 1 ~ 4 까지의 번호는 기본 파티션, 5번부터 논리 파티션이기 때문이다.

apt vs aptitude

✓ apt
apt(advanced packaging tool)는 데비안 사용에 필요한 각종 소프트웨어 프로그램을 설치하기 위해 필요한 cli용 패키지 관리 툴이다.
무료 오픈 소스이면서 low level이지만 자유도가 높다. 프로그램 충돌이 발생할 경우 충돌 패키지 자동 제거는 -auto-remove 등의 추가 옵션이 필요하다. 또한 apt는 다른 고수준 패키지 매니저에 의해 사용될 수 있다.

✓ aptitude
apt보다 기능이 더 많고, 편리한 high level 패키지 매니저이다. 사용자 인터페이스를 추가해 대화형으로 패키지를 검색하고 설치 및 제거를 할 수 있다.
사용하지 않는 패키지를 자동적으로 제거해주거나 설치,제거,업데이트 과정에서 충돌이 있을 경우엔 다른 대안도 함께 제시해준다.

기본적으로 깔려 있는 apt를 이용해 필요한 프로그램을 설치하고 세팅을 해 준다.

sudo 설치

✓ sudo는 유닉스 및 유닉스 계열 운영 체제에서, 다른 사용자의 보안 권한, 보통 슈퍼유저로서 프로그램을 구동할 수 있도록 하는 프로그램이다.
root가 아닌 사용자가 root에 준하는 능력으로 실행할 수 있게 하는 명령어이며, 사용을 허락한 사용자는 모두 사용할 수 있다. 관리자 권한을 가지지만 근본적으로는 해당 사용자가 내리는 명령이다.

✓ 데비안에서는 sudo 패키지가 없기 때문에 설치해야 한다.
먼저 su(switch user) 명령어로 root계정으로 전환해야 한다.
그다음에 apt install sudo

✓ dpkg는 package manager for Debian
$ dpkg -l sudo :sudo 설치 여부 확인

vim 설치

$ sudo apt install vim 

AppArmor

✓ AppArmor(Application Armor)는 시스템 관리자가 프로그램 프로필 별로 프로그램 보안을 세팅할 수 있게 해주는 리눅스 커널 보안 모듈이다.
✓ Mandatory Access Control(MAC)로 관리자가 특정 프로그램에 대한 네트워크, 소켓, 입출력 등에 대한 접근을 제한할 수 있게 한다.

앱아머 프로필은 /etc/apparmor.d 디렉토리에 저장된다.
두가지 모드가 있다.
✓ Enforce mode – 로그를 남김과 동시에 제한을 강제한다.
✓ Complain mode – 제한은 안 하지만 로그를 남긴다.

✓ DAC(Discretionary Access Control)는 임의 접근 통제로 시스템 객체에 대한 접근을 사용자나 또는 그룹의 신분을 기준으로 제한하는 방법이다.
✓ MAC(Mandatory Access Control)는 강제 접근 통제로 미리 정해진 정책과 보안 등급에 의거하여 주체에게 허용된 접근 권한과 객체에게 부여된 허용 등급을 비교하여 접근을 통제하는 모델이다.

✓ AppArmor 설치 및 확인

$ apt install apparmor apparmor-profiles apparmor-utils

AppArmor가 실행 중인지 확인하고 싶다면 아래 명령어를 입력하면 된다.

$ sudo apparmor_status //앱아머 상태보기(또는 $ sudo aa-status)
$ sudo aa-enabled //활성화 여부 확인

UFW 설정

✓ 방화벽은 네트워크의 통로를 단일화하여 내부 정보망을 보호하기 위한 시스템이다. 외부망과 내부망을 분리하여 접근 제어를 한다.
✓ 이 중 iptables는 리눅스상에서 방화벽을 설정하는 도구로서 커널 2.4 이전 버전에서 사용되던 ipchains를 대신하는 방화벽 도구이다. iptables는 커널상에서의 netfilter 패킷필터링 기능을 사용자 공간에서 제어하는 수준으로 사용할 수 있다.
✓ 패킷필터링이란 패킷의 해더를 보고 전체 패킷을 필터링할지 결정하는 것을 말한다. 일반적으로 패킷은 헤더와 데이터를 가진다.
✓ UFW(Uncomplicated Firewall)는 iptables의 설정 도구로서 복잡하지 않은 방화벽을 의미한다. iptables가 설정과 관리가 복잡해 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 : 규칙번호 확인

$ sudo ufw delete 규칙번호 : 규칙번호 삭제

SSH 설정

✓ SSH(Secure Shell)는 원격으로 public network를 통해 호스트 컴퓨터와 통신을 할 때 보안을 위해 사용되는 프로토콜이다. 기존의 텔넷(telnet)이 취약했기에 암호화 기능을 추가한 보안 프로토콜이다. 개인키-공개키 쌍의 비대칭키 방식을 사용한다. 셸로 원격 접속하기 때문에 기본적으로 CLI로 실행하며 기본 포트는 22번이다.

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

$ ss -tunpl 명령어로 정보 확인

A SSH service will be running on port 4242 only. For security reasons, it must not be possible to connect using SSH as root.

/etc/ssh/sshd_config에서 원하는 포트번호(4242)로 바꿔준다. 또 PearmitRootLogin을 no로 설정한다. 참고로 ssh_config는 client일 때의 설정, sshd_config는 server일 때의 설정이다.

$ sudo systemctl restart ssh : ssh 설정 적용

$ sudo apt-get install net-tools
넷툴즈 설치해야 ifconfig 사용 가능

포트포워딩

Add forward rule for VirtualBox
✓ Go to VirtualBox-> Choose the VM->Select Settings
✓ Choose “Network”-> “Adapter 1"->”Advanced”->”Port Forwarding”
✓ Restart SSH server (go to the your VM machine)
$ sudo systemctl restart ssh
✓ Check ssh status:
$ sudo service sshd status✓ From host side from iTerm2 or Terminal enter as shown below:
$ ssh [your_username]@127.0.0.1 -p 4242
✓ Quit the connection:
$ exit

✓ Port : 인터넷 연결은 하나인데 통신을 필요로 하는 프로그램이 다수일때 프로그램을 구별할 수 있는 번호가 port이다.

✓ IPv4체계에서는 0~255까지의 숫자 4개로 구성되는 IP주소를 가지며 2의 32제곱(약 42억)개의 주소가 할당된다.
✓ 따라서 부족한 IP주소(공인IP)를 효율적으로 사용하기 위해 사설네트워크를 구축하여 사용하게 된다.
✓ 이 때 사설 IP 대역에서 특정 컴퓨터는 임의의 사설IP주소값을 가지기 때문에 이를 공인IP와 연결하는 작업이 포트포워딩이다.

✓ DHCP(Dynamic Host Configuration Protocol)는 호스트의 IP주소와 각종 TCP/IP 프로토콜의 기본 설정을 처음 부팅된 클라이언트에게 자동으로 제공해주는 프로토콜이다. DHCP는 사용 가능한 IP주소 풀을 가지고 있어서 클라이언트에게 IP를 자동으로 할당해주고, 제한된 시간이 지나면 반환받은 뒤 재할당 해준다.

✓ TCP/IP는 컴퓨터가 인터넷을 통해 정보를 주고받는데 필요한 통신 규약의 모음이다. 패킷통신방식의 인터넷 프로토콜인 IP와 IP에서 동작하는 전송조절 프로토콜인 TCP로 이뤄져 있다. TCP를 기반으로 한 어플리케이션 프로토콜에는 HTTP, FTP, SMTP 등이 있다. 즉, TCP/IP를 사용한다는 것은 IP주소를 이용해 데이터를 주고받고, 전송 여부를 확인한다는 뜻이다. OSI가 네트워크 통신을 위한 이론적 모델이라면 TCP/IP는 실제 구현에서의 모델이라고 할 수 있다.

참고로 고정IP로만 하려면...
$ ip addr
$ ip route

virtualbox는 기본적으로 10.0.2.15로 할당
$ vi /etc/network/interfaces아래와 같이 설정 변경
reboot 명령어로 설정 적용

Hostname 변경

$ hostnamectl : 호스트네임 체크

$ sudo hostnamectl set-hostname [호스트네임] : 호스트네임 변경

패스워드 설정

다음과 같은 Password 정책을 설정하려고 한다.
• Your password has to expire every 30 days.(패스워드는 30일마다 만료되어야 한다.)
• The minimum number of days allowed before the modification of a password will be set to 2. (패스워드는 최소 2일을 사용해야 한다. 즉, 2일 이후에 패스워드 변경이 가능하다는 의미)
• The user has to receive a warning message 7 days before their password expires. (유저는 패스워드가 말료되기 7일 전부터 경고 메세지를 받아야 한다.)
• Your password must be at least 10 characters long. (비밀번호는 최소 10자리이어야 한다.)
• It must contain an uppercase letter and a number. Also, it must not contain more than 3 consecutive identical characters. (영어 대문자와 숫자는 반드시 포함되어야 하고, 3개 이상의 연속된 문자가 올 수 없다.)
• The password must not include the name of the user. (패스워드에 유저의 이름이 포함되어서는 안된다.)
• The following rule does not apply to the root password: The password must have at least 7 characters that are not part of the former password. (새로운 패스워드는 이전의 패스워드와 최소 7글자는 달라야 한다.)
• Of course, your root password has to comply with this policy. (root 또한 동일한 패스워드 정책을 적용 받아야 한다.)

$ sudo vi /etc/login.defsPASS_MAX_DAYS 30/PASS_MIN_DATS 2/PASS_WARN_AGE 7로 변경

추가적인 패스워드 정책을 설정하기 위해 패스워드 만료 모듈인 libpam-pwdquality를 설치한다. (잘 설치가 안 되면 sudo apt-get update하고 다시해본다.)
$ sudo apt install libpam-pwquality
$ sudo vi /etc/pam.d/common-password
pam_pwquailty.so 에 아래 추가
✓ retry=3 : 암호 입력 3회까지
✓ minlen=10 : 암호 최소 길이 10
✓ difok=7 : 기존 암호와 달라야 하는 문자 수 7
✓ ucredit=-1 : 대문자 1개 이상(-1은 최소 한개)
✓ lcredit=-1 : 소문자 1개 이상
✓ dcredit=-1 : 숫자 1개 이상
✓ reject_username : username이 그대로 또는 뒤집혀서 패스워드에 드러있는지 검사, 들어있으면 거부
✓ maxrepeat=3 : 중복 글자 제한
✓ enforce_for_root : root 사용자가 암호를 바꿔도 위의 조건들 적용

이제 강화된 패스워드를 적용한다.
$ passwd -e [user_name] :-e: 강제적으로 사용자의 암호를 만료시키는 옵션

✓ 위 명령어를 실행할 경우 다음 로그인 시 패스워드가 만료되어 패스워드를 변경해야지만 로그인이 가능하다.

이후 패스워드 기간이 적용되지 않은 root와 기존 유저에 대해 subject에서 요구하는 패스워드 기간을 설정하기 위해 다음 명령어를 실행한다.

$ chage -m 2 -M 30 -W 7 [user_name]
chage: 시스템 보안을 위해 사용자 패스워드의 만기일을 설정하너가 변경하는 명령어
-m: 패스워드 변경 후 다시 변경할 수 있는 최소 날짜 설정 옵션
-M: 패스워드가 유효한 최대 날짜 설정 옵션
-W: 경고 메세지 기간 설정 옵션

비밀번호 관련 설정들이 저장된 /etc/shadow에 들어가보면,
$ sudo vi /etc/shadow

사용자 그룹 설정

다음 조건을 가지고 sudo group을 설정하려 한다.
• Authentication using sudo has to be limited to 3 attempts in the event of an incor- rect password. (sudo 비밀번호 인증 시 최대 3번까지 시도 가능)
• A custom message of your choice has to be displayed if an error due to a wrong password occurs when using sudo.(sudo 인증 실패 시 커스텀 경고 메세지 출력)
• Each action using sudo has to be archived, both inputs and outputs. The log file has to be saved in the /var/log/sudo/ folder. (sudo 명령어 실행 시 로그를 /var/log/sudo에 저장)
• The TTY mode has to be enabled for security reasons.(보안 상의 이유로 TTY(Tele Type Writer; 터미널 환경)에서만 sudo를 실행 가능
• For security reasons too, the paths that can be used by sudo must be restricted. Example: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin(보안 상의 이유로 sudo 실행 시 사용할 수 있는 명령어 경로는 제한되어야 함)

sudo log 저장을 위한 디렉토리 생성

$ mkdir /var/log/sudo
$ sudo visudo

/etc/sudoers 파일에 sudo 설정이 존재하지만, visudo은 /etc/sudoers 파일을 관리하기 위한 application으로 안전하게 sudo 파일들을 편집할 수 있기 때문에 일반적인 파일 편집기를 사용하는 것보다 권장된다.

visudo 실행시
env_reset: HOME, LOGNAME, PATH, SHELL, TERM, USER을 제외한 모든 환경 변수를 reset
mail_badpass: 잘못된 패스워드로 sudo 실행 시, 지정된 메일로 보고
secure_path: sudo 명령은 현재 계정의 셸이 아닌 가상 셸을 생성하고 그 안에서 실행된다. 이 때, 이 가상 셸의 환경변수 PATH의 값을 secure_path 옵션을 통해 지정한다.

secure_path에 서브젝트에서 요구하는대로 /snap/bin를 추가한다.
shell 명령어들은 PATH 환경변수에 지정된 경로에서 바이너리 파일을 찾는다.
이 때, sudo 권한이 있는 사용자의 PATH 환경변수에 악성 코드로 인한 경로가 포함되어 있어 특정 명령 실행 시 해당 경로에서 악성 파일이 실행될 경우 시스템에 큰 문제가 생길 것이다.
이러한 상황을 방지하기 위해 sudo가 실행되는 가상 셸에서 명령어의 바이너리 파일 경로를 secure_path로 제한하는 것이다.

각 Defaults 뒤에 의미하는 바는 다음과 같다.

Defaults authfail_message="원하는 에러메세지" #권한 획득 실패 시 출력 (sudo 인증 실패 시)
Defaults badpass_message="원하는 에러메세지" #sudo인증에서 비밀번호 틀리면 출력
Defaults log_input #sudo명령어 실행 시 입력된 명령어 log로 저장
Defaults log_output #sudo명령어 실행 시 출력 결과를 log로 저장
Defaults requiretty #sudo명령어 실행 시 tty강제
Defaults iolog_dir="/var/log/sudo/" #sudo log 저장 디렉토리 설정
Defaults passwd_tries=3 #sudo실행 횟수를 지정. default가 3

log의 경우 /var/log/sudo/00/00에서 확인 할 수 있으며, sudo 명령어 하나마다 하나의 폴더가 생성된다. 폴더에는 총 7개의 log 파일이 존재한다.

log: sudo 실행 시 실행한 위치와 실행한 명령어의 위치 저장
stderr: sudo로 실행한 명령어가 오류로 인해 실행되지 않았을 경우 출력되는 내용 저장
stdin: sudo로 실행한 명령어가 표준 입력을 받은 내용 저장
stdout: sudo로 실행한 명령어가 표준 출력으로 결과를 출력한 내용 저장
timing: session(세션)이 실행된 시간 저장
ttyin: sudo로 실행한 명령어가 TTY로 입력받은 내용 저장
ttyout: sudo로 실행한 명령어가 TTY로 출력한 결과가 저장

This user has to belong to the user42 and sudo groups

groupadd user42 명령어를 통해 user42그룹 추가

$ $ cat /etc/group : 그룹 조회
$ groupadd [그룹명] : 그룹 추가
$ groupdel [그룹명] : 그룹 삭제
$ groupmod -n [그룹명][새 그룹명] : 그룹명 수정
$ usermod -aG [그룹명,그룹명, ... ][사용자명] : 사용자를 그룹에 추가
$ usermod -g [그룹명][사용자명] : primary group 설정
$ id [사용자명] : 사용자의 gruop 확인

usermod -aG sudo,user42 <사용자이름> 명령어를 통해 해당 그룹에 유저를 추가
이 때 그룹이 여러 개인 경우, 그룹은 공백 없이 콤마로 구분되어야 한다.
usermod -g user42 <사용자이름> 명령어를 통해 user42 그룹이 primary group이 되도록 한다.
G 옵션:
G옵션만 붙힌 상태에서 그룹 설정 시, gid그룹을을 제외하고 명령어에 나열된 그룹만 추가가 되며 명령어에 나열되어 있지 않지만 유저가 속해있는 그룹은 전부 탈퇴된다.

a 옵션:
G옵션에서만 함께 쓰일 수 있고, G옵션만 붙었을 때와 달리, 유저가 속해있지만 명령어에 나열되어있지 않는 그룹에 관하여 탈퇴처리 되지 않는다.

Shell Script

다음 조건을 가지는 셸스크립트를 작성하려고 한다.
• At server startup, the script will display some information (listed below) on all ter- minals every 10 minutes (take a look at wall).
(서버 시작 시 스크립트는 10분마다 모든 터미널에 일부 정보를 표시해야 한다.)
• The banner is optional. No error must be visible. (배너는 선택 사항이며, 오류를 볼 수 없어야 한다.)
• The architecture of your operating system and its kernel version. (운영 체제의 아키텍처 및 커널 버전을 보여주어야 한다.)
• The number of physical processors. (물리적 프로세서의 수를 보여주어야 한다.)
• The number of virtual processors. (가상 프로세서 수를 보여주어야 한다.)
• The current available RAM on your server and its utilization rate as a percentage. (서버의 현재 사용 가능한 RAM과 활용률을 백분율로 보여주어야 한다.)
• The current available memory on your server and its utilization rate as a percentage. (서버의 현재 가용 메모리와 활용률을 백분율로 보여주어야 한다.)
• The current utilization rate of your processors as a percentage. (프로세서의 현재 활용률을 백분율로 보여주어야 한다.)
• The date and time of the last reboot. (마지막으로 재부팅한 날짜 및 시간을 보여주어야 한다.)
• Whether LVM is active or not. (LVM의 활성 여부를 보여주어야 한다.)
• The number of active connections. (활성 연결 수를 보여주어야 한다.)
• The number of users using the server. (서버를 사용하는 사용자 수를 보여주어야 한다.)
• The IPv4 address of your server and its MAC (Media Access Control) address. (서버의 IPv4 주소와 MAC(Media Access Control) 주소를 보여주어야 한다.)
• The number of commands executed with the sudo program. (sudo 프로그램으로 실행된 명령의 수를 보여주어야 한다.)

$ sudo crontab -l : 크론탭 리스트 확인
$ sudo crontab -e : 크론탭 수정

✓ monitoring.sh작성
✓ chmod 744 monitoring.sh : 실행 권한부여.
✓ monitoring.sh | wall : 모든 사용자에게 스크립트 출력 내용이 띄워짐.
✓ root 계정의 crontab 스케쥴러 열기
✓ sudo crontab -e
/10 * * * /monitoring.sh | wall : 10분마다 root권한에서 "/monitoring.sh | wall" 실행
✓ sleep [ ]; command : 초단위로 컨트로 하려면
✓ 명령어 & sleep 30; 명령어

#!/bin/bash

printf "#Architecture: "
 uname -a

printf "#CPU physical : "
 nproc --all

printf "#vCPU : "
 cat /proc/cpuinfo | grep processor | wc -l

printf "#Memory Usage: "
 free -m | grep Mem |awk '{printf"%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'

printf "#Disk Usage: "
df -a -BM | grep /dev/map | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
df -a -BM | grep /dev/map | awk '{sum+=$4}END{print sum}' | tr -d '\n'
printf "MB ("
df -a -BM | grep /dev/map | awk '{sum1+=$3 ; sum2+=$4 }END{printf "%d", sum1 / sum2 * 100}' | tr -d '\n'
printf "%%)\n"

printf "#CPU load: "
mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}'

printf "#Last boot: "
who -b | awk '{printf $3" "$4"\n"}'

printf "#LVM use: "
if [ "$(lsblk | grep lvm | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n" ; fi

printf "#Connections TCP : "
ss | grep -i tcp | wc -l | tr -d '\n'
printf " ESTABLISHED\n"

printf "#User log: "
who | wc -l

printf "#Network: IP "
hostname -I | tr -d '\n'
printf "("
ip link show | awk '$1 == "link/ether" {print $2}' | sed '2, $d' | tr -d '\n'
printf ")\n"

printf "#Sudo : "
journalctl _COMM=sudo | wc -l | tr -d '\n'
printf " cmd\n"

exit 0

uname: 시스템 정보 출력 명령어
-a: 커널 이름, 네트워크 호스트명, 커널 릴리즈 정보, 커널 버전, 시스템의 하드웨어 타입(아키텍쳐), 운영체제 이름을 출력한다.

nproc --all: 설치된 모든 코어 / 프로세스 수 출력

/proc/cpuinfo: CPU 정보가 담겨있는 파일

cat /proc/cpuinfo | grep processor | wc -l: CPU 정보가 담겨 있는 파일 중 프로세스만 찾아 개수를 출력

free: 시스템 메모리 사용 현황 출력 명령어
-m: 메가바이트 단위로 표시

df: 파일시스템 디스크 공간의 사용량을 출력하는 명령어
-a: 0 블록의 파일시스템을 포함해 모든 파일시스템을 출력하는 옵션
-B: 지정한 크기(SIZE)를 블록단위로 정하여 용량 표시하는 옵션
-BM: 크기를 1M으로 블록단위를 정해 용량을 표시

mpstat: 사용가능한 CPU와 Core 별 사용량을 출력하는 명령어 (sysstat 설치 필요)

who: 호스트에 로그인한 사용자 정보 출력
-b: 마지막 시스템 부팅 시간을 출력하는 옵션
ss: 소켓 상태를 조회할 수 있는 유틸리티로 netstat와 비슷한 역할을 수행한다.

hostname: 시스템 이름을 확인하고 설정하는 명령어
-I: 호스트의 IP 주소를 출력하는 옵션

ip: IP 유틸리티는 모든 최신 Linux 배포 환경에 설치된 iproroute2 패키지의 일부로, 인터페이스를 위/아래로 가져오고, 주소와 경로를 할당 및 제거하고, ARP 캐시를 관리하는 등 다양한 용도로 사용된다.

link: 네트워크 인터페이스를 표시하고 수정한다.

show: 관련 인터페이스 출력한다.

journalctl: systemd의 서비스 로그를 확인할 수 있고 systemd-journald.service에 의해서 systemd의 정보들을 분석한다.

systemd: 일부 리눅스 배포판에서 '유닉스 시스템 V'나 'BSD init 시스템' 대신 사용자 공간을 부트스트래핑하고 최종적으로 모든 프로세스들을 관리하는 init 시스템

_COMM=sudo: 특정로그(sudo) 보기

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에 추가해 주면 서버에서 웹 페이지를 렌더링해준다.

PHP 웹사이트(https://www.php.net)에서 버전 확인 후 설치

$ sudo apt-get install php7.4-fpm //2022년 4147.4.29 릴리스

PHP-FPM: PHP FastCGI Process Manager
CGI(Common Gateway Interface): 웹서버와 외부 프로그램을 연결해주는 표준화된 프로토콜
FastCGI: 하나의 요청에 하나의 프로세스를 생성하는 CGI와는 달리 하나의 프로세스로 요청들을 처리하여 프로세스를 생성하고 제거하는 부하를 경감

PHP 설치 후 php.ini파일의 cgi.fix_pathinfo=1이 적혀있는 행의 주석을 해제한다.

$ vi /etc/php/7.4/fpm/php.ini 

이후 설치한 lighttpd의 Fastcgi 설정 파일을 편집한다.

$ vi /etc/lighttpd/conf-available/15-fastcgi-php.conf

해당 파일에서 "bin-path"와 "socket"이 존재하는 행을 주석처리하고, "socket" => "/var/run/php/php7.4-fpm.sock"을 추가한다.

변경사항 적용 후 lighttpd를 재시작

$ sudo lighttpd-enable-mod fastcgi 
$ sudo lighttpd-enable-mod fastcgi-php
$ service lighttpd force-reload //service: initscripts 패키지 설치 필요

lighttpd의 설정을 확인하면

$ vi /etc/lighttpd/lighttpd.conf

기본 설정은 80번 포트로 되어 있다. 80번 포트를 허용해준다.

$ ufw allow 80

가상머신을 호스트 컴퓨터와 포트포워딩으로 연결해준다.

사파리나 크롬에서 localhost:8000으로 접속하면...

이 화면은 lighttpd.conf파일의 server.document-root에 해당하는 디렉토리인 /var/www/html/의 index.lighttpd.html에 해당한다.

PHP 연동이 잘 되었는지 확인해 보기 위해 /var/www/html/info.php를 만들고 다음과 같이 작성해 준다.

<?php
	phpinfo();
?>

저장 후 (hostip):8000/info.php에 접속하면 FPM/FastCGI가 적용되어있다.

마지막으로 추후 설치할 DB와 연동하기 위한 패키지를 설치한다.

$ sudo apt install php7.4-mysql 

MariaDB 설치

RDBMS Software, Opensource
Unix 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)

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

$ sudo mysql_secure_installation

DB의 root 계정 비밀번호 설정 등 필요한 사항 확인. 모두 Y로 진행해도 됨.

재시작

$ sudo systemctl restart mysql.service

WordPress에 연동할 DB 생성

아래 명령어를 실행하고 MariaDB의 보안설정에서 설정한 패스워드를 입력하면 MariaDB로 진입할 수 있다.


sudo mysql -u root -p

SQL 문법을 통해 DB를 생성하고, 계정을 만들고, 권한을 부여

$ sudo mysql -u root -p
진입 후 SQL 문법을 이용해 DB를 생성, 계정 생성 후 권한을 부여한다.

CREATE DATABASE [DB이름];  //DB 생성 
CREATE USER '[유저 이름]'@'localhost' IDENTIFIED BY '[패스워드]'; //계정 생성 및 패스워드 설정  
GRANT ALL ON [DB이름].* TO '[유저 이름]'@'localhost' IDENTIFIED BY '[패스워드]' WITH GRANT OPTION; //생성한 DB에 대해 생성한 계정에 full access 부여
FLUSH PRIVILEGES; //설정 마침
EXIT;  //종료

WordPress 설치

워드프레스는 웹사이트를 누구나 쉽게 만들 수 있는 플랫폼이다. 워드프레스를 설치하려면 PHP를 사용할 수 있는 웹서버와 데이터베이스 서버가 필요하다.

lighttpd 설정 파일(/etc/lighttpd/lighttpd.conf)에 들어간다.

server.document-root는 웹 페이지를 불러올 디렉토리로 여기에 WrodPress를 설치하면 된다.

$ sudo apt-get install wget
$ sudo wget -O /tmp/wordpress.tar.gz "http://wordpress.org/latest.tar.gz"
$ sudo tar -xvzf /tmp/wordpress.tar.gz -C /var/www/html

설치 후 (hostip):8000/wordpress에 접속하면 아래와 같이 DB에 관한 설정을 진행하는 페이지가 표시된다.

WordPress와 MariaDB 연동

설치한 WordPress와 MariaDB를 연동하기 위해 WordPress를 설치한 경로에 있는 config 파일을 편집해야한다.
wp-config-sample.php인 샘플 설정 파일에서 생성한 DB와 계정, 패스워드를 편집해준다.

$ vi /var/www/html/wordpress/wp-config-sample.php

그 다음, 아래 부분에

https://api.wordpress.org/secret-key/1.1/salt/
에 있는 키를 적어 넣는다. (호스트 컴퓨터로 접속한 다음 복붙하도록 한다.)

편집한 내용을 저장한 후 wq-config-sample.php파일의 이름을 mv 명령어를 사용하여 wp-config.php로 변경한다.

다시 접속하면 WordPress가 설치된 것이 확인된다.

Signature

✓ vm을 상태 저장하고 종료 한 뒤 스냅샷
✓ 호스트 터미널에서 가상머신이 설치된 폴더로 들어가서 shasum vm이름.vdi 를 실행

✓ shasum vm이름.vdi > signature.txt(깃 푸시)

profile
의지와 행동

0개의 댓글