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 네트워크 네임스페이스 간 통신

  • 물리 인스턴스를 가상화하여서 가상 인터페이스를 만들면, 컨테이너의 가상 네트워크 장치를 사용할 수 있다.

  • 여러 네이트워크 네임스페이스에 동시에 존재 가능하며 다른 네트워크 네임스페이스로 이동할 수 있다.

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

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

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

  • 맵핑된이후 tcp dump 를 떠서, ping을 줬는데 packet transmitted가 실패했다.

  • 이부분은 추가적으로 진행할 예정이다.

Last updated