<이번 주차 핵심목표>
컨테이너가 격리되어 있다고 해서 무조건 안전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 관리 기능 활용하기
'4-1. 2026-2 심화 스터디 > 컨테이너 보안' 카테고리의 다른 글
| 컨테이너 보안 3주차 (ft. 이미지부터 차근차근) (0) | 2026.10.02 |
|---|---|
| 컨테이너 보안 2주차 (ft. 내 컴퓨터에서는 되는데?) (0) | 2026.09.16 |