# 가상화
> 하나의 기기에서 여러 운영체제를 작동하게 하는 기술
Virtualbox, VMWare ESXi 등이 대표적인 가상화 소프트웨어이다. 가상화 기술을 이용하면 다른 운영체제를 사용하거나(ex. 맥에서 은행업무를 하기 위해 Windows 가상머신을 실행), 기기를 여러 사용자에게 공유 가능(ex. VPS 호스팅).
초기 가상화는 모든 하드웨어를 에뮬레이팅하는 방식이었지만, 최근에는 KVM 등의 가상화 방식으로 커널레벨에서 가상화가 작동해 하드웨어를 직접 사용하여 성능을 올리고 있음(반가상화).
> Cf. 컨테이너 가상화
게스트 운영체제를 별도로 실행하는 것이 아니라 호스트 운영체제를 사용하되 실행환경을 모두 독립적으로 분리한다. 호스트 운영체제를 사용하므로 하드웨어에 접근이 가능하고, 게스트 운영체제를 실행하는 데 필요한 자원 낭비를 줄일 수 있다. Docker 등이 대표적인 컨테이너 가상화 방식.
# Virtualbox Network 설정
주로 세 종류의 네트워크 설정을 이용한다. NAT, Bridged, Host-Only networking
## Host-Only Networking
호스트 OS와 가상머신들만 묶여있는 가상 네트워크를 생성한다. 외부와 연결되지 않은 가상 네트워크이므로, (호스트 OS에서 라우터를 설치하지 않는 이상) Host-Only Network를 이용해 인터넷에 접근할 수 없다.
VirtualBox에서는 DHCP 서버를 지원하는데, 기본 설정은 사설 네트워크 대역(`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`)을 사용한다.
> 장점
- 외부 네트워크 환경에 영향을 받지 않고, 쉽게 설정할 수 있다
- 가상머신끼리의 네트워킹, 가상머신과 호스트간의 네트워킹을 독립된 구간에서 수행하도록 만들 수 있다
- 실제 네트워크 인터페이스를 사용하지 않으므로 호스트 성능에 영향을 미치지 않는다
> 단점
- 인터넷에 접근할 수 없다
## Bridged Networking
## NAT(Network Address Translation)
라우터를 통해 소스, 목적지의 IP 주소 등을 다시 계산해주는 기술이다.
> 장점
- 쉽게 연결 가능
> 단점
- 호스트에서 게스트로의 연결이 어려움 (별도의 포트포워딩이 필요)
---
# Linux 배포판
배포판은 운영체제의 핵심이 되는 커널과, 기본 설치되는 소프트웨어로 구성된다. 사용자의 취향에 따라 기본 설치되는 소프트웨어가 다르다.
대표적인 distro에는
- 최소한의 소프트웨어만 가지는 Arch Linux
- 커뮤니티가 가꾸는 Debian Linux
- 기업환경에서 사용하는 데 초점을 맞춘 Redhat Enterprise Linux (RHEL)
등이 있다.
(Ubuntu는 Debian 기반)
- 배포판 확인법: `lsb_release -a`, `cat /etc/os-release`
- 커널 확인법: `uname -a`
## 패키지 관리자
설치된 소프트웨어를 한 곳에서 관리, 표준화된 배포 방법을 제공. 저장소(apt repository)를 이용해 설치파일을 배포해서 간단하게 신뢰된 파일을 배포할 수 있음
> apt vs aptitude
공통적으로 `dpkg` 매니저를 백엔드로 사용하는 패키지 관리자. apt는 명령어 기반의 프론트엔드, aptitude는 CLI 기반의 통합적인(?) 프론트엔드
- 의존성 업데이트: `apt update`
- 저장소 추가: `apt-add-repository (저장소 주소)`
- 패키지 설치: `apt install (패키지 이름)`
- 패키지 삭제: `apt remove (패키지 이름)`
## AppArmor
특정 명령의 실행을 제한하는 보안 기능 - 네트워크 엑세스 / 소켓 엑세스 / File IO 등을 제한
커널 단에서 적용되는 MAC(Mandatory Access Control)이기 때문에 루트 권한이 있어도 유저 레벨에서는 어길 수 없다.
레드햇 계열의 SELinux와 유사한 역할을 하는 모듈으로, Debian / Arch linux 등 배포판에 기본 탑제되어 있다.
- 상태 확인: `aa-status`
# Partitions
물리적인 볼륨(PV; Physical Volume)만으로 부족할 때, 여러 개의 PV를 모아 하나의 볼륨 그룹(VG; Volume Group)을 만든다. 이 VG는 파티션 간의 경계를 넘을 수도 있고, 여러 디스크 사이를 넘어 구성될 수 있다.
이 VG 위에 논리적인 볼륨(LV; Logical Volume)을 생성한다. 리눅스에서는 이런 과정을 LVM(Logical Volume Manager)가 처리한다.
![lvm](https://www.redhat.com/sysadmin/sites/default/files/styles/embed_small/public/2020-11/basic-lvm-volume.png?itok=YGy0D84W)
LV는 파티션으로 취급될 수 있으므로, LV는 각각의 파일시스템(FS; File System)을 가지고 마운트된다.
- 파티션 확인법: `lsblk`
- 파티션 설정법: `fdisk (...)`
- PV를 VG에 등록하는 방법: `pvcreate /dev/(디스크)` -> `vgextend (VG이름) (디스크)`
- LV 확장법: `lvextend -L+(크기) /dev/(VG이름)/(LV이름)`
# debian DHCP 설정
- 인터페이스 목록: `ls /sys/class/net`
- 인터페이스 DHCP 설정: ~~netplan 돌려줘~~ `vi /etc/network/interfaces` >> `iface (인터페이스) dhcp`을 추가 (static 설정도 가능)
- 인터페이스 활성화: `ifup (인터페이스)`
- 네트워크 서비스 재시작: `systemctl restart networking`
- 할당된 주소 확인: ~~ifconfig 돌려줘~~ `ip a`
---
# SSH
Secure SHell의 약자로, 원격으로 터미널에 접근하기 위해 사용한다.
- Publickey 추가: `ssh-copy-id (사용자)@(호스트)` - `~/.ssh/authorized_keys`에 PK 정보를 추가
## scp
- 파일 전송: `scp -p (포트) (로컬파일) (사용자)@(호스트):/(리모트 경로)` - SFTP 프로토콜을 이용해 파일을 전송
## 터미널
tty, pty, pts, ...
ssh는 기본적으로 pty를 이용해 tty를 사용한다. `-t` 옵션을 이용해 강제로 pty 모드로 접근하도록 만들 수 있다.
```
ssh kyungjle@192.168.56.106 -p 4242 -t <<EOT
sudo echo test
EOT
```
# 방화벽 구성
방화벽은 네트워크 트래픽을 차단하는 역할을 한다. `ufw`와 같이 단순하게 특정 포트 / 호스트를 기반으로 차단하는 방화벽도 있지만, `warning.or.kr`과 같이 특정 사이트의 접근을 차단하는 방화벽, `WAF`와 같이 해킹 시도를 차단하는 방화벽도 있다.
ufw는 시스템 서비스로 동작하므로, systemd 매니저를 이용해 활성화/비활성화 할 수 있다.
- ufw 서비스 활성화: `systemctl enable ufw`
- ufw 서비스 상태 확인: `systemctl status ufw`
- ufw 방화벽 정책 확인: `ufw status verbose`
- ufw 정책 추가: `ufw allow 4242/tcp`
- ufw 정책 제거: `ufw remove 4242/tcp`
# hostname 설정
hostname은...
최신버전의 데비안은 systedm의 hostnamectl 모듈을 이용해 호스트네임을 관리한다.
- hostname 확인: `hostnamectl `
# sudo
관리자 권한으로 실행.
## sudo 정책
/etc/sudoers, visudo
# 비밀번호 정책
## pam.d
## /etc/pam.d/common-password
## /etc/login.defs
Markdown
복사