chroot
- change root directory
- root dir.를 특정 디렉토리로 변경
- UNIX command 및 system call(c언어 함수)로 존재
초기 chroot의 사용(SVr4)
- system 설치 및 복구 등의 시스템 부팅 및 관련 과정에서 사용
- 부수적으로 jail(가두는) 기능을 가지고 있다
- FreeBSD의 경우 jail system call을 개발하기도 했다
작동 방법
/
: root directory
chroot /mnt/chroot
명령어 : root directory가 /mnt/chroot로 변경
- 이 기능을 통해 각자 private mount layout을 가질 수 있다
chroot의 부수적 기능
보안적 측면의 격리
- chroot를 통해 기초적인 격리를 할 수 있다
- sandbox의 개념 (격리된 공간의 타입 의미)
- 보안적 측면, 특수한 목적을 위해 격리된 형태의 공간을 필요로 할 때 사용
- 개념적인 부분으로 구현체는 아니다
- 하지만 구현체 중에 sandbox라는 이름이 실제 존재 -> UNIX의 fifo named pipe가 fifo의 개념과 이름만 같다
- chroot로 격리된 directory hierarchy를 통해 경로를 속일 수 있다
- 동일한 프로그램을 쉽게 다른 환경으로 복제할 수 있다는 사실
Practice : chroot, filezilla
준비 작업
- ftp 서비스를 제공하는 vsftpd 설치
$ sudo apt -y install vsftpd
- 설치 후 서비스가 running 되었는지 확인하고 running이 아니라면 start
$ sudo systemctl is-active vsftpd
결과로 active가 안나오면
$ sudo systemctl start vsftpd
- ftp 클라이언트 프로그램인 filezilla 설치 후 실행
$ sudo apt -y install filezilla
$ filezilla
- filezilla로 접속 후 HOME directory 확인 (확인 후 접속 끊기)
- 설정 변경 (chroot 켜주기)
$ sudo vi etc/vsftpd.conf
해당파일에 아래의 내용 추가
chroot_local_user=YES
allow_writeable_chroot=YES
- 설정 저장 후 vsftpd 재시작
$ sudo systemctl restart vsftpd
$ sudo systemctl status vsftpd
- filezilla 재접속 후 HOME directory 확인
Isolation
격리의 필요성
- 시스템 내에 존재하는 자원은 한정적
- 한정적인 자원을 효율적으로 분배하면 시스템의 가용성을 올릴 수 있다
process의 scope
- 현대적인 OS는 프로세스가 독립적인 공간을 가지게 해준다
- 장점 : 프로세스는 고유한 공간을 받을 수 있다
- 단점
- 외부 통신을 위해서 IPC를 사용하여 I/O 비용 증가
- 여러 프로세스가 협동해야하는 프로그램에서는 단점이 더 커진다 (DBMS, server system의 경우)
Isolation의 활용
1. 보안, 자원 관리적 측면
- 특정 파일 경로의 접근을 제한 (특정 시스템 자원의 사용 제한)
- 예를 들어 FTP 프로세스가 /home/ftp 디렉터리 이하에서는 이동할 수 있도록 하고 싶다 -> chroot
- 호스팅 업체라면 고성능 컴퓨터 1대로 여러 사업자에게 DB나 웹 제공
2. 호환, 충돌 측면
- 동일한 directory를 사용하는 프로세스는 독립된 실행을 어떻게?
- 혹은 서로 다른 버전의 파일을 사용하는 프로세스가 있다면?
- 이럴때 격리된 공간을 제공하면 문제가 해결된다
Name space
history
- 분산 컴퓨팅 시스템으로서 local system, remote system을 hierarchical file system으로 표현
- 특정 리소스의 사용은 계층화된 file name space를 가지는 것과 같다
Linux Namespace
- Linux-specific 구현
- isolated resource를 NS의 hierarchical file system 형태로 구현
- 줄여서 NS로 표기하기도 한다
Linux Namespace
- 7종류
- mount : 디렉토리 관련
- UTS* : unix time sharing, 유닉스 시분할 시스템
- IPC : 장치 관련
- network
- PID
- user
- cgroup : 권한 관련
- Linux Namespace 관리 명령어
Practice : Namespace
- NS의 기본 작동
- unshare : 고유의 공간을 만들고 그 안에서 프로그램 실행
- lsns : Namespace를 리스팅
unshare
- 프로세스 격리
$ unshare -pf --mount-proc /bin/bash
$ ps
$ exit
- unshare로 격리된 프로세스를 만드는데 그 프로세스 이름은 bash
- option
-p
, --pid
: pid 격리
-f
, --fork
: 자식 프로세스를 만들어서 실행
--mount-proc
: proc 파일을 고유의 공간으로 가져온다 -> proc은 process control block(PCB) 가지고 있는데 이를 고유하게
- network 격리
listen하고 있는 것 확인
$ ss -nltp
5000번 포트를 listen
$ nc -l 5000 >nc_host_output.txt &
4036은 host
$ ss -nltp
-n : network 격리
$ unshare -n /bin/bash
$ ps
$ ss -nlt
확이해보면 5000번 포트가 안나온다
$ nx -l 5000 >nc_ns_output.txt &
다시 점유할 수 있다
$ ss -nlt
lsns
- unshare가 실행되는 터미널을 그대로 두고 터미널 하나 더 실행
$ lsns
시스템의 namespace가 쭉 나온다
unshare -pf --mount-proc /bin/bash
명령으로 NS를 만들면 --fork때문에 자식 프로세스 bash가 실행된다 -> NPROCS의 수가 1개에서 2개로 증가
container
cgroup (control group)
- process container 였는데 cgroup으로 rename
- group별로 가상화된 공간을 만들고 자원을 제약할 수 있게 되었다
- 마치 물리적으로 다른 host처럼 인식
- docker, hadoop, systemd 등의 많은 프로젝트들이 cgroup을 사용
docker
- container runtime 기술
- container를 세련된 방식으로 구현한 제품의 일종
- 격리된 자원의 묶음(image)과 런타임으로 구성
- 기본적으로 C/S 구조(client/server)를 가지므로 daemon(백그라운드에서 돌면서 여러 작업을 하는 프로그램)이 작동된다
- host OS 위에서 작동하는 격리된 프로세스의 일종이므로 virtual machine과 달리 memory, file system의 I/O에서 발생하는 크리티컬한 overhead가 없다
- 이 특징이 docker의 가장 큰 장점
- host os의 튜닝이나 성능 향상은 docker에게도 향상을 가져다 주기 때문
- 단점(보안, 안정성 측면)
- daemon으로 작동하면서 child process로 수직 관리 : daemon이 문제가 생기면 아래의 모든 container가 죽을 수 있다
- 관리자 권한 사용
container(docker) vs Hypervisor(virtual machine)
podman
- alternative of linux container
- docker가 가장 많이 쓰이고 있지만 단점과 상용화 문제로 인해 대안 요구
- podman은 redhat에서 지원
- daemon, admin account 사용하지 않는다
- systemd unit support -> 서비스와 시킬 수 있다, 중앙 집중화가 잘 된다
future of container(20~21년 기준)
- docker : 입지 불안, 구조적, 기술적 문제가 있지만 여전히 매력적인 기술
- container 기술의 복잡성 증가
Virtualization
Virtual machine
- virtual machine도 isolation의 일종
- full virtualization(hypervisor) 사용
- 소프트웨어로 가상화된 하드웨어를 구현
- 완전히 격리된 공간 제공
- 보안, 호환성 문제를 거의 대부분 해결
- 단점
- 낮은 성능! (절반 이하ㅠ)
- 독점적인 자원 점유
- host-guest간의 자원 교환의 어려움 및 비효율
H/W, OS, Application/VM/Hypervisor
- os가 관리하는 h/w를 접근하는 방식 차이 : 직접 접근 vs 간접 접근
- vm을 사용하면 오버헤드가 커지는 단점
sandbox
- 격리된 모래 장난을 위한 공간의 개념 차용
- 임시로 쓸수 있는 공간을 만들어 주는 것
- 구현 : 다양한 방법 (vm, container, chroot)
- 목적 : 테스트 유닛으로서 격리된 공간, 보안 공간, 복제된 서비스 공간..
- sandbox를 더 경량화할 수 없을까? -> container
- 단지 격리가 목적이라면 굳이 vm를 쓸 필요가 없다
- lightweight container로 공유하는 부분은 공유하고 공유하지 않는 부분만 분리해서 만들자
- 버전 충돌 문제 등의 여러 문제를 해결한다
summary
- chroot는 root dir.를 변경
- isolation할 수 있는 자원은 여러 종류, 즉 선택적이다
- 이를 편리하게 해주는 것이 container
- container는 기존의 namespace, cgroup, chroot 등을 결합한 기술
- docker, podman 등은 container 구현체
- container의 가장 큰 장점은 성능과 배포
- vm 특히 full virtualization은 성능 문제가 심각