Lỗi Docker Kinh Điển: Xóa file env Vẫn Lộ Secret Key? Đây Là Sự Thật!

Chuyện về devsecops

Chuyện Thực Chiến DevSecOps

Lỗi Docker Kinh Điển: Xóa file .env Vẫn Lộ Secret Key?

Một câu chuyện mà "Infrastructure Challenger" nào cũng nên biết.

@devsecopsstory Tưởng `RUN rm .env` là an toàn? Docker không nghĩ vậy đâu! 👻 Một "cú lừa" kinh điển về Docker layers mà có thể làm bạn lộ hết bí mật lúc nào không hay. Hiểu đúng để không phải "trả giá" trên production nhé anh em. Bạn đã bao giờ "dính chưởng" tương tự chưa? Comment kể chuyện cho mọi người cùng né nào! 😂👇 #devsecops  #docker  #secret  #security  #LearnOnTikTok ♬ nhạc nền  - Chuyện về DevSecOps

Xin chào anh em, người kể chuyện kỹ thuật của DevSecOps Story đây! Hôm nay, chúng ta sẽ cùng mổ xẻ một sai lầm "nhỏ nhưng có võ" mà rất nhiều kỹ sư, kể cả những người đã có 3-5 năm kinh nghiệm, đôi khi vẫn mắc phải. Đó là câu chuyện về việc build container Docker và lỡ tay làm lộ bí mật (secret key) dù đã "cẩn thận" xóa nó đi.

Nghe có vẻ vô lý phải không? Hãy cùng theo dõi hành trình "sửa sai thành sai hơn" và khám phá ra đâu mới là "chân ái" của DevSecOps nhé!

Giai đoạn 1: Vấn đề "Tưởng Ngon Ăn" 😱

Mọi chuyện bắt đầu rất đơn giản. Bạn đang cần build một image Docker cho ứng dụng của mình. Trong Dockerfile, bạn hồn nhiên gõ lệnh:

# Dockerfile
FROM node:18-alpine

WORKDIR /app

# Copy tất cả mọi thứ vào...
COPY . .

RUN npm install
# ... Các lệnh khác
CMD ["node", "server.js"]

Lệnh `COPY . .` đã sao chép tất cả file trong thư mục hiện tại, bao gồm cả file `.env` chứa toàn bộ secret keys, API tokens, và database credentials quý giá vào trong image. "Build container Docker, tưởng ngon ăn..." cho đến khi một công cụ quét lỗ hổng như Trivy hét lên một dòng cảnh báo đỏ chói:

CRITICAL: Found secret key in image layer!

Giai đoạn 2: "Sửa Sai" (Nhưng Sai Hơn!) 😏

Giật mình, bạn nghĩ ngay ra một giải pháp "thông minh": "Hehe, xóa đi là xong chứ gì!". Và bạn tự tin thêm dòng `RUN rm .env` vào Dockerfile:

# Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY . .
RUN npm install

# Đây, xóa nó đi là an toàn!
RUN rm .env

CMD ["node", "server.js"]

Build lại image, bạn thấy file `.env` đã biến mất trong container đang chạy. Bạn thở phào nhẹ nhõm. Nhưng đó chính là lúc bạn đã rơi vào một cái bẫy còn nguy hiểm hơn.

Giai đoạn 3: Sự Thật Phũ Phàng - Docker Layers

SAI BÉT! Secret vẫn còn nằm trong layer cũ!

Để hiểu tại sao, chúng ta cần nhớ lại cách Docker hoạt động. Mỗi một lệnh trong Dockerfile (như `COPY`, `RUN`, `ADD`) sẽ tạo ra một layer (lớp) mới. Các layer này được xếp chồng lên nhau và không thể thay đổi (immutable).

Khi bạn thực hiện:

  1. COPY . .: Docker tạo ra Layer A, chứa tất cả các file của bạn, bao gồm cả file .env.
  2. RUN rm .env: Docker không xóa file trong Layer A. Thay vào đó, nó tạo ra một Layer B mới nằm trên Layer A, và trong Layer B này, file .env được đánh dấu là "đã bị xóa".

Kết quả? File `.env` và toàn bộ secret của bạn vẫn tồn tại nguyên vẹn trong Layer A. Bất kỳ ai có quyền truy cập vào image của bạn đều có thể dùng các công cụ như docker history hoặc `dive` để "bóc tách" từng layer và lấy lại file `.env` một cách dễ dàng. Việc bạn xóa nó ở layer sau chỉ là che giấu, chứ không phải loại trừ.

Giai đoạn 4: Chân Ái DevSecOps - Dùng `.dockerignore` ✅

Giải pháp đúng đắn và an toàn nhất là ngăn chặn file .env ngay từ đầu, không cho nó có cơ hội được copy vào image. Và công cụ để làm việc đó chính là file `.dockerignore`.

Tương tự như `.gitignore`, bất cứ thứ gì bạn khai báo trong `.dockerignore` sẽ bị Docker bỏ qua trong quá trình build.

1. Tạo file `.dockerignore` ở thư mục gốc, ngang hàng với Dockerfile.

# .dockerignore

# Bỏ qua các file credentials và environment
.env
*.env
.env.*

# Bỏ qua thư mục node_modules và log
node_modules
npm-debug.log

# Bỏ qua các file hệ thống
.DS_Store
.git
.idea

2. Giữ nguyên Dockerfile đơn giản của bạn.

# Dockerfile (An toàn hơn)
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "server.js"]

Bây giờ, khi bạn chạy `docker build`, Docker client sẽ đọc file `.dockerignore` trước, loại trừ file `.env` ra khỏi "build context", và do đó nó sẽ không bao giờ được copy vào bất kỳ layer nào của image. Đây mới chính là cách tiếp cận "Shift Left Security" - ngăn chặn vấn đề từ gốc rễ.

Bài học rút ra: Đừng che giấu, hãy loại trừ!

Trong bảo mật, việc che giấu một vấn đề (như xóa file ở layer sau) chỉ tạo ra một cảm giác an toàn giả tạo. Nguyên tắc cốt lõi là phải loại trừ hoàn toàn các dữ liệu nhạy cảm ra khỏi các tạo tác (artifacts) của bạn. File `.dockerignore` là một công cụ đơn giản nhưng cực kỳ mạnh mẽ trong bộ công cụ DevSecOps của bạn.

TikTok icon

Thích câu chuyện này? Còn nhiều hơn thế nữa!

Theo dõi kênh @devsecopsstory trên TikTok để không bỏ lỡ những video thực chiến, tips & tricks và các câu chuyện "dở khóc dở cười" trong ngành nhé!

Bạn đã bao giờ gặp phải một lỗi "kinh điển" tương tự trong quá trình làm việc với Docker hay CI/CD chưa? Hãy chia sẻ câu chuyện của bạn ở phần bình luận nhé!

Đăng nhận xét