ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 Image Hardening
    K8S 2024. 1. 16. 22:14

     

     

     

    쿠버네티스에 한정된 이이기는 아니긴 한데... 이미지를 빌드할때 알아두면 좋은 내용들이다. 

    당연할 수 있지만, 나중에 또 알아보기 귀찮아서 정리해놓는다.  

     

    이미지 하드닝의 중요 전략들

    1. Multi-Staging 빌드 사용하기

    2. 패키지 특정 버전 사용하기
    3. Root로 실행시키지 않기
    4. Filesystem은 Read Only로 만들기
    5. Shell Access 삭제하기

     

    1. Multi-Staging 빌드 사용하기

    멀티 스테이징 빌드를 사용하여 불필요한 파일들이 이미지에 포함되지 않게끔 한다. 

    이미지의 크기가 줄어들면, container를 더욱 portable하게 사용할 수 있다. 

    FROM ubuntu
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install -y golang-go
    COPY app.go .
    RUN CGO_ENABLED go build app.go
    
    FROM alpine 
    COPY --from=0 /app /root/ #이 부분
    CMD ["/root/app"]

     


    2. 패키지 특정 버전 사용하기

    기반 image의 경우, 항상 버전을 명시해주자.

    그렇지 않으면, 항상 최신 버전을 받아오므로 이미지가 업데이트 되어 의도대로 동작하지 않는 경우가 생긴다.

    (실제로 겪어보았고 트러블 슈팅을 하느라 시간을 낭비한 경험이 있었다) 

    FROM ubuntu:20.04 #이 부분
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install -y golang-go
    COPY app.go .
    RUN CGO_ENABLED go build app.go
    
    FROM alpine:3.12.1 #이 부분
    COPY --from=0 /app /root/ 
    CMD ["/root/app"]

     


    3. Root로 실행시키지 않기

    컨테이너를 root로 실행시키지 않는다. 

    컨테이너가 탈취당해도 root 계정이 아니라면, 탈취자의 행동에는 제약이 생길 수 밖에 없다. 

    FROM ubuntu:20.04
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install -y golang-go
    COPY app.go .
    RUN CGO_ENABLED go build app.go
    
    FROM alpine:3.12.1
    RUN addgroup -S appgroup && adduser -S appuser -G appgroup -h /home/appuser #이 부분
    COPY --from=0 /app /home/appuser/
    USER appuser #이 부분
    CMD ["/home/appuser/app"] #이 부분


    4. Filesystem은 Read Only로 만들기

    이건 항상 해당되는 케이스는 아니지만, 알아두자!

    FROM ubuntu:20.04
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install -y golang-go
    COPY app.go .
    RUN CGO_ENABLED go build app.go
    
    FROM alpine:3.12.1
    RUN chmod a-w /etc #이 부분
    RUN addgroup -S appgroup && adduser -S appuser -G appgroup -h /home/appuser
    COPY --from=0 /app /home/appuser/
    USER appuser
    CMD ["/home/appuser/app"]

     

     

     

    5. Shell Access 삭제하기

    pod에 접근할 때 sh나 bash를 이용해서 접근 못하는 경우를 많이 경험했을 것이다.

    이는 /bin 경로의 sh 또는 bash 바이너리 파일들이 없기 때문이다. 

    프로덕션용 이미지를 만들 때는 /bin 하위 경로를 삭제해서 불필요한 바이너리를 실행할 수 없도록 하자.   

    FROM ubuntu:20.04
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install -y golang-go
    COPY app.go .
    RUN CGO_ENABLED go build app.go
    
    FROM alpine:3.12.1
    RUN chmod a-w /etc
    RUN addgroup -S appgroup && adduser -S appuser -G appgroup -h /home/appuser
    RUN rm -rf /bin/* #이 부분
    COPY --from=0 /app /home/appuser/
    USER appuser
    CMD ["/home/appuser/app"]



     

     

     

    반응형

    댓글

Designed by Tistory.