1주차 [1] - 도커 컨테이너 격리
1. 도커 컨테이너 격리
1.1 도커 컨테이너 격리 요약
컨테이너는 독립된 리눅스 환경(pivot-root, namespace, Overlay filesystem, cgroup)을 보장받는 프로세스이다!컨테이너는 애플리케이션(프로세스) 동작에 필요한 파일들만 패키징된 이미지를 실행하여 동작한다.
컨테이너는 컨테이너 환경이 조성된 곳 어디서나 실행할 수 있다.
1.2 도커란?
도커는 가상 실행 환경을 제공해주는 오픈소스 플랫폼이다.
도커는 이 가상 실행 환경을 컨테이너라고 부른다.
1.3 컨테이너와 가상 머신
도커 컨테이너 vs 가상 머신
가상 머신은 운영체제 위에 하드웨어를 에뮬레이션하고 그 위에 운영체제를 올리고 프로세스를 실행한다.
도커 컨테이너는 하드웨어 에뮬레이션 없이, 커널을 공유해서 프로세스를 실행한다.
차이점은 하드웨어 에뮬레이션, 운영체제 vs 커널 공유 실행
가상머신 vs 컨테이너 환경 무엇이 격리 수준이 더 높을까?

가상 머신은 기존 서버에 하이퍼바이저가 올라간 형태
컨테이너는 운영체제를 제외한 나머지 애플리케이션 실행에 필요한 모든 파일을 패키징한다.
그러므로, 가상 머신은 고립성이 더 좋다!
컨테이너는 호스트의 커널을 공유하지만, 개별적인 사용자 공간을 가진다.
1.4 도커 아키텍처
도커에 대한 간단한 아키텍처는 다음과 같이 나타낼 수 있습니다.
Client에서 Docker Daemon으로 API 통신을 통해서 IMAGE에 대한 컨테이너 생성을 합니다.
2. 도커 기본 사용
2.1 사전 준비 사항
Linux Process에 대한 이해
2.2 도커 설치 및 확인
3. 컨테이너 격리 (이번주의 중요한 내용!)
3.1 Chroot + 탈옥
chroot 으로 user 디렉터리를 user 프로세스에게 root 라고 속일 수 있습니다.
먼저 chroot으로 bin/sh를 실행해 봅니다.

실패하는 것을 확인 할 수 있습니다.
이렇게 의존성을 파악한뒤 라이브러리 파일들을 복사해서 가져옵니다.


의존성 파일들을 가져와서 넣어주니깐, /bin/sh 가 동작하는 것을 확인 할 수 있습니다.
하지만, 탈출이 되지 않는것을 확인 할 수 있습니다!
탈옥 코드를 컴파일해서 사용해 볼까요?

실행 시키면, 탈출이 되는것을 확인할 수 있습니다.
3.2 마운트 네임스페이스 + Pivot_root
chroot 차단 위해서, pivot_root 와 mount ns 를 사용합니다.
루트 파일 시스템을 변경하게되고 프로세스 환경에 대한 격리를 하게됩니다.
unshare --mount /bin/sh를 사용했을때, 마운트 정보 확인해서 호스트와 동일한지 확인

처음은 동일한것을 확인하였습니다.
마운트 네임스페이스를 unshare를 진행하였습니다.


/root/new_root 가 unshared되서 안보이는 상태가 되었습니다!
이번에는, pivot_root를 사용해서 변경될 root 파일 시스템 경로로 진입하겠습니다.

탈옥이 되는지 실험해 보겠습니다!
코드를 돌려도 탈출이 되지 않는것을 확인할 수 있습니다!!
3.3 격리 Namespace
네임 스페이스와 관련된 프로세스에 대한 특징
모든 프로세스들은 네임스페이스 타입별로 특정 네임스페이스에 속한다.
Child는 Parent 네임스페이슬르 상속 받습니다.
프로세스는 네임 스페이스의 타입별로 일부는 호스트 네임스페이스를 사용하고 일부는 컨테이너의 네임스페이스를 사용합니다.
Namespace라는 격리 공간을 통해, Host System의 자원을 할당받고, 다른 namespace와 별개로 동작한다고한다.
name space는 짧게 얘기하면, 프로세스가 볼수 있는 범위이다.



Docker Root 사용으로 컨테이너 프로세스를 종료 할 수 있습니다.
이제 UserNamespace 격리를 진행한다.
UID/GID 넘버스페이스 격리로, 컨테이너의 루트 권한문제를 해결 합니다.
보안 관점에서는 큰 개선
1 . usernamespace를 격리합니다.
그리고 id를 확인합니다.

grep 시에, 일반 유저로 보인다.

3.4 자원 관리, cgroups
Cgroup 이란, 컨테이너별로 자원을 분배하고 limit 내에 운용할 수 있도록 함

5. 컨테이너 네트워크 & IP Tables
5.1 요약
컨테이너는 네트워크 네임스페이스로 호스트와 네트워크 격리 환경이 구성된다.
리눅스는 방화벽을 제공하는 IPTables로 호스트와 컨테이너 통신에 관여한다.
5.2 RED < - > BLUE 네트워크 네임스페이스 간 통신
물리 인스턴스를 가상화하여서 가상 인터페이스를 만들면, 컨테이너의 가상 네트워크 장치를 사용할 수 있다.
여러 네이트워크 네임스페이스에 동시에 존재 가능하며 다른 네트워크 네임스페이스로 이동할 수 있다.

먼저 RED, BLUE 네트워크 네임스페이스들을 생성합니다.

네임스페이스 변경 이후의 값 확인

라우팅에 대한 정보를 확인해보면 정상적으로 맵핑되어 있다!

맵핑된이후 tcp dump 를 떠서, ping을 줬는데 packet transmitted가 실패했다.
이부분은 추가적으로 진행할 예정이다.
Last updated


