[컨테이너 보안] 1장. 컨테이너와 도커의 기본 개념
작성자 - S1ON개요
작은 대학교의 서버실에 가보면 혼자 들기에도 버거운 서버 수십 개가 빼곡하게 들어서있다. 수강신청 서버는 자원이 부족해서 매 번 렉과 전쟁이고 입시 홈페이지 서버는 지원자가 없어서 자원이 남아돈다. 어떻게 물리자원을 효율적으로 활용할 수 있을까에 대한 질문에 대한 답은 '컨테이너'이다.
현재 컨테이너의 기반이 되는 LXC(리눅스 컨테이너) 기술이 2008년 발표되고, 해당 기술로 만들어진 도커가 2013년 공개되었다. 그로부터 10년이 지난 지금은 컨테이너 기술의 효율성과 안정성이 충분히 검증되었고 기업들은 서비스들을 컨테이너화 하고 있다.
하지만 아무리 검증되었다 한들 이 바닥엔 괴물들이 즐비하기 때문에 또 어떻게든 뚫어낸다.
그래서 나는 어쩔 수 없이 또 컨테이너 보안을 공부해야 한다.
기본용어
일단 이해를 돕기 위해 간단한 용어부터 먼저 보고가자.
용어 | 의미 |
컨테이너 | 앱이 구동되는 환경까지 감싸서 실행할 수 있도록 하는 격리 기술 |
컨테이너 런타임 | 컨테이너를 다루는 도구 |
도커 | 컨테이너를 다루는 도구 중 가장 많이 쓰이고 유명한 것 |
쿠버네티스 | 컨테이너 런타임을 통해 컨테이너를 오케스트레이션 하는 도구 |
오케스트레이션 | 여러 서버에 걸친 컨테이너 및 사용하는 환경 설정을 관리하는 행위 |
``
컨테이너란?
디지털 세계에서 컨테이너는 Host OS에서 논리적인 구역을 할당받아 서비스를 제공하기 위해 필요한 라이브러리 또는 어플리케이션 등을 하나로 모아 별도의 서버처럼 활용할 수 있도록 만들어주는 '서비스 경량 패키지' 이다.
컨테이너를 내가 사는 깡통 전세집으로 비유를 해보자.
구분 | 나의 작고 소듕한 9200만원짜리 깡통 전세집 | 컨테이너 |
1 | 계약을 통해 건물주로부터 필요한 자원(1.5룸)을 계약 | Host OS로부터 필요한 자원(CPU, 메모리, 저장공간) 할당 |
2 | 깡통전세라 꼭 필요한 가전/가구만 구성(침대,에어컨 등) | 서비스 제공 목적에 필요한 최소한의 구성(앱/미들웨어) |
3 | 무주택이지만 세대주인 것을 공표하기 위해 전입신고 | 각각의 컨테이너는 독립적인 격리된 공간 |
4 | 이후 예쁜 여자친구와 새 집에 같이 살기 위해 포장이사 | Host OS가 바뀌더라도 동일한 서비스 가능(이식성/호환성) |
도커란?
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼으로 위에서 언급한 컨테이너를 편리하게 다루기 위한 도구이며 전세계 가장 많은 이용자들이 애용하는 제품이다.
도커 아키텍처
Docker는 클라이언트-서버 아키텍처를 사용한다. Docker 클라이언트는 Docker 컨테이너를 빌드, 실행 및 배포하는 무거운 작업을 수행 하는 Docker 데몬과 통신한다. Docker 클라이언트와 데몬은 동일한 시스템에서 실행되거나 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있다. Docker 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다.
도커 데몬
Docker 데몬( dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리한다. 데몬은 Docker 서비스를 관리하기 위해 다른 데몬과 통신할 수도 있다.
도커 클라이언트
Docker 클라이언트( docker)는 많은 Docker 사용자가 Docker와 상호 작용하는 기본 방법이다. 와 같은 명령을 사용할 때 docker run클라이언트는 이러한 명령을 보낸다 dockerd. 이 docker명령은 Docker API를 사용하며 Docker 클라이언트는 둘 이상의 데몬과 통신할 수 있다.
도커 데스크탑
Docker Desktop은 컨테이너화된 애플리케이션과 마이크로서비스를 구축하고 공유할 수 있는 Mac, Windows 또는 Linux 환경을 위한 설치하기 쉬운 애플리케이션이다. Docker Desktop에는 Docker 데몬( dockerd), Docker 클라이언트( docker), Docker Compose, Docker Content Trust, Kubernetes 및 Credential Helper가 포함된다. 자세한 내용은 Docker Desktop 을 참고하자.
도커 레지스트리
Docker 레지스트리 는 Docker 이미지를 저장한다다. Docker Hub는 누구나 사용할 수 있는 공용 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있다. 자신의 개인 레지스트리를 실행할 수도 있다.
docker pull또는 명령 을 사용하면 docker run구성된 레지스트리에서 필요한 이미지를 가져오며, 명령을 사용하면 docker push이미지가 구성된 레지스트리로 푸시한다.
도커 객체
Docker를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 개체를 만들고 사용하게 된다. 이 섹션은 이러한 개체 중 일부에 대한 간략한 개요이다.
이미지
이미지 는 Docker 컨테이너 생성 지침이 포함된 읽기 전용 템플릿이다 . 종종 이미지는 몇 가지 추가 사용자 정의와 함께 다른 이미지 를 기반으로 한다. 예를 들어 이미지를 기반으로 하는 이미지를 빌드할 수 ubuntu 있지만 Apache 웹 서버와 애플리케이션을 설치하고 애플리케이션을 실행하는 데 필요한 구성 세부 정보를 설치할 수 있다.
자신만의 이미지를 만들거나 다른 사람이 만들고 레지스트리에 게시한 이미지를 사용할 수 있다. 고유한 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하기 위한 간단한 구문으로 Dockerfile 을 만든다. Dockerfile의 각 명령은 이미지에 계층을 생성한다. Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드된다. 이것은 다른 가상화 기술과 비교할 때 이미지를 가볍고 작고 빠르게 만드는 부분이다.
컨테이너
컨테이너는 이미지의 실행 가능한 인스턴스이다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있다. 컨테이너를 하나 이상의 네트워크에 연결하거나, 스토리지를 연결하거나, 현재 상태를 기반으로 새 이미지를 생성할 수도 있다.
기본적으로 컨테이너는 다른 컨테이너 및 해당 호스트 시스템과 비교적 잘 격리되어 있다. 컨테이너의 네트워크, 저장소 또는 기타 기본 하위 시스템이 다른 컨테이너나 호스트 시스템과 얼마나 격리되었는지 제어할 수 있다.
컨테이너는 이미지와 컨테이너를 만들거나 시작할 때 제공하는 구성 옵션으로 정의된다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항이 사라진다.
도커허브
도커가 많은 유저들에게 사랑받는 데에는 이처럼 컨테이너를 손쉽게 생성할 수 있는 이미지들이 다양하다는 것이다.
아래 https://hub.docker.com 페이지에 접속해보면 공유 레포지토리에 업로드된 이미지가 9,683,624개나 존재한다는 것을 알 수 있다. 물론 필자가 쓸데없는 이미지를 6개정도 올려놨기 때문에 모든 이미지가 양질이 아니라는 것은 감수해야 한다.
도커 설치 및 명령어 사용에 관해서는 이전에 9tape가 도커에 관한 내용이 작성한 게시글이 있으므로 참고하자.
예고편
도커는 가장 널리 사용되는 컨테이너 기반 기술이다. 우리가 도커 컨테이너를 사용할 때, 어떤 보안 취약점이 발생할 수 있으며 예방하기 위해 어떻게 해야하는지에 대해 알아보자.
'Season 1 > 기술 보안' 카테고리의 다른 글
Project Discovery 소개 - nuclei (2) (0) | 2022.09.30 |
---|---|
[AWS 기초 입문] 네트워크 기초 01 (0) | 2022.09.30 |
RPA를 위한 고민,, (0) | 2022.09.28 |
Project Discovery 소개 - nuclei (1) (0) | 2022.09.14 |
정규 표현식을 이용한 xss 조치 방안 (0) | 2022.08.31 |