본문 바로가기

4-1. 2026-2 심화 스터디/컨테이너 보안

[고래]컨테이너 보안 4주차 - 공격면(Attack Surface) 분석: 권한, 네트워크, 파일시스템, Secret

<이번 주차 핵심목표>

컨테이너가 격리되어 있다고 해서 무조건 안전X.

->과도한 권한, 불필요하게 공개된 포트, 민감한 파일과 Secret 등이 공격자가 활용할 수 있는 진입점이 될 수 있음

이번 실습에서는 권한, 네트워크, 파일시스템, Secret을 중심으로 컨테이너의 공격면을 직접 확인해보기

권한(Permission) 컨테이너 내부 프로그램이 어떤 권한으로 실행되는가?
네트워크(Network) 외부에서 어떤 포트와 서비스에 접근할 수 있는가?
파일시스템(Filesystem) 컨테이너가 어떤 파일을 읽거나 수정할 수 있는가?
Secret 비밀번호, API Key 등 민감한 정보가 어디에 저장되어 있는가?

 

공격면이란?

공격면(Attack Surface)이란 공격자가 시스템에 접근하거나 악용할 수 있는 모든 지점과 요소를 의미

1. 권한(Permission) 공격면

Linux에서 root=가장 강한 권한을 가진 관리자 사용자
컨테이너 내부 애플리케이션이 필요 이상으로 높은 권한으로 실행되는 경우-> 공격자가 수행할 수 있는 작업의 범위도 커짐

(컨테이너 보안 측면)필요한 최소 권한만 부여하는 최소 권한 원칙(Principle of Least Privilege)중요

-권한 확인 실습-

컨테이너 내부에서 root 권한 사용이 가능하다는 것을 확인
중요한 것은 “root를 사용할 수 있다 = 바로 취약하다”가 아니라, 애플리케이션이 정말 root 권한을 필요로 하는가를 확인

2. 실행 중인 프로세스 확인

프로세스=현재 실행 중인 프로그램

docker top my-nginx=my-nginx 컨테이너 안에서 현재 어떤 프로세스가 실행되고 있는지 보여줘

확인하는 이유는?정상적인 웹 서버→nginx 같은 필요 프로세스만 존재 but 이상한 프로그램 실행 중이라면→악성코드나 공격자가 실행한 프로그램 가능성을 의심해 볼 수 있음

3. 네트워크(Network) 공격면

3-1. 왜 네트워크가 공격면일까?

외부에서 접근 가능한 서비스가 많아질수록 공격자가 접촉할 수 있는 지점도 많아진다.

따라서 컨테이너는 실제 서비스에 필요한 포트만 외부에 공개하는 것이 좋다.

container의 80번 포트→Mac의 8080번 포트가 연결

<구조>
브라우저
   ↓
localhost:8080
   ↓
Mac 8080번 포트
   ↓
Docker
   ↓
Container 80번 포트
   ↓
nginx

docker port를 확인하는 이유:이 컨테이너가 외부에 어떤 네트워크 서비스를 노출하고 있는지 확인

4. 파일시스템(Filesystem) 공격면

4-1. 왜 파일시스템이 공격면일까?

컨테이너 내부에 민감한 설정 파일, 인증정보, 개인키 등이 존재하고 공격자가 이를 읽을 수 있다면 추가 공격에 악용될 수 있다.

반대로 애플리케이션이 필요 이상으로 많은 파일을 수정할 수 있는 것도 위험 요소가 될 수 있다

 

컨테이너의 디렉터리에 어떤 것이 있는지 확인

→파일 내용까지 확인이 가능함

즉, 만약 개발자가 실수로 중요 파일을 컨테이너에 넣음→공격자가 컨테이너 내부에 들어와 중요 파일 출력 가능해짐

+파일 수정 가능 여부 확인하기

다음 명령어를 통해 웹 페이지 파일에 대한 권한을 확인할 수 있다.

docker exec my-web ls -l /usr/share/nginx/html/index.html

결과가 -rw-r--r-- 1 root root ... index.html 나올 것이다. 이를 통해 현재 컨테이너에서 파일을 수정할 수 있는 사용자와 실제 애플리케이션 프로세스의 권한이 적절한지 분석하면 된다.

  • rw- : 소유자는 읽기 및 쓰기 가능
  • r-- : 그룹은 읽기만 가능
  • r-- : 그 외 사용자는 읽기만 가능

보안측면:이미지와 컨테이너 안에 민감한 파일을 함부로 넣지 않음

5. Secret 공격면

5-1. Secret이란?

Secret은 외부에 노출되어서는 안 되는 민감한 정보를 의미

환경변수로 Secret 전달

새 컨테이너 하나를 환경변수와 함께 실행

docker run-d \--name secret-test \-eDB_PASSWORD=mysecret123 \
  nginx
  -e
→ 컨테이너에 환경변수를 전달

DB_PASSWORD
→ 환경변수 이름

mysecret123
→ 환경변수 값

프로그램이 DB에 접속하려면 여러 정보 필요→코드에 직접 비번을 입력하기보다 환경변수를 이용하여 넘김

But,,환경변수라고 무조건 안전 X

출력 중에:

DB_PASSWORD=mysecret123확인

이게 중요한 이유:비밀번호를 환경변수에 그냥 넣으면 컨테이너 내부에서 쉽게 확인이 가능함

🚩 보안 강화 방향

  • Dockerfile에 비밀번호 직접 작성하지 않기
  • 소스 코드에 API Key 저장하지 않기
  • Git 저장소에 Secret 업로드하지 않기
  • 환경변수를 사용할 때도 접근 권한과 노출 가능성을 고려하기
  • 운영 환경에서는 Docker Secrets 등 적절한 Secret 관리 기능 활용하기