Người dùng trong Docker

Andrey Kopylov, CTO của chúng tôi yêu thích, tích cực sử dụng và quảng bá Docker. Trong một bài viết mới, anh ấy giải thích cách tạo người dùng trong Docker. Làm việc đúng với họ, tại sao người dùng không nên để lại quyền root và cách giải quyết vấn đề về các chỉ báo không khớp trong Dockerfile.

Tất cả các quy trình trong vùng chứa sẽ chạy với tư cách là người dùng root, trừ khi bạn chỉ định nó theo cách đặc biệt. Điều này có vẻ rất thuận tiện vì người dùng này không có hạn chế nào. Đây là lý do tại sao việc sử dụng quyền root là sai từ quan điểm bảo mật. Nếu không có ai tỉnh táo làm việc trên máy tính cục bộ có quyền root, thì nhiều tiến trình chạy dưới quyền root trong vùng chứa.

Luôn có những lỗi cho phép phần mềm độc hại thoát khỏi vùng chứa và xâm nhập vào máy chủ. Trong trường hợp xấu nhất, chúng tôi phải đảm bảo rằng các quy trình bên trong vùng chứa được điều hành bởi người dùng không có bất kỳ quyền nào trên máy chủ.

Tạo người dùng

Việc tạo người dùng trong vùng chứa không khác gì việc tạo người dùng trong các bản phân phối Linux. Tuy nhiên, các lệnh có thể khác nhau đối với các hình ảnh cơ sở khác nhau.

Đối với các bản phân phối dựa trên debian, bạn cần thêm phần sau vào Dockerfile:

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

Đối với núi cao:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

Chạy các tiến trình từ người dùng

Để chạy tất cả các quy trình tiếp theo với tư cách là người dùng có UID 2000, hãy chạy:

USER 2000

Để chạy tất cả các quy trình tiếp theo với tư cách là người dùng nút, hãy chạy:

USER node

Thêm trong tài liệu.

Khối lượng lắp đặt

Khi gắn các tập đĩa bên trong một thùng chứa, hãy cung cấp cho người dùng khả năng đọc và/hoặc ghi tệp. Để thực hiện việc này, UID (GID) của người dùng trong vùng chứa và người dùng bên ngoài vùng chứa có quyền thích hợp để truy cập tệp phải khớp nhau. Trong trường hợp này, tên người dùng không quan trọng.

Thông thường trên máy tính Linux, UID và GID của người dùng bằng 1000. Những mã định danh này được gán cho người dùng máy tính đầu tiên.

Tìm ra số nhận dạng của bạn thật dễ dàng:

id

Bạn sẽ nhận được thông tin toàn diện về người dùng của bạn.
Thay thế 2000 trong các ví dụ bằng số nhận dạng của bạn và mọi thứ sẽ ổn.

Gán UID và GID cho người dùng

Nếu người dùng đã được tạo trước đó nhưng bạn cần thay đổi số nhận dạng, bạn có thể thực hiện như sau:

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Nếu bạn đang sử dụng hình ảnh cơ sở Alpine, bạn cần cài đặt gói bóng:

RUN apk add —no-cache shadow

Chuyển ID người dùng bên trong vùng chứa khi xây dựng hình ảnh

Nếu ID của bạn và ID của tất cả những người làm việc trong dự án khớp nhau thì chỉ cần chỉ định ID này trong Dockerfile. Tuy nhiên, thường ID người dùng không khớp.

Làm thế nào để đạt được điều bạn mong muốn vẫn chưa rõ ràng ngay lập tức. Đối với tôi đây là điều khó khăn nhất trong quá trình làm chủ Docker. Nhiều người dùng docker không nhận ra rằng có nhiều giai đoạn khác nhau trong vòng đời của một hình ảnh. Đầu tiên, hình ảnh được lắp ráp bằng Dockerfile. Khi chạy vùng chứa từ hình ảnh, Dockerfile không còn được sử dụng nữa.

Việc tạo người dùng phải diễn ra khi hình ảnh được xây dựng. Điều tương tự cũng áp dụng cho việc xác định người dùng mà các quy trình được khởi chạy. Điều này có nghĩa là bằng cách nào đó chúng ta phải chuyển UID (GID) bên trong vùng chứa.

Chỉ thị được sử dụng để sử dụng các biến bên ngoài trong Dockerfile ENV и ARG. So sánh chi tiết các chỉ thị đây.

Dockerfile

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

Bạn có thể truyền đối số qua docker-compose như thế này:

docker-soạn

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

Tái bút Để nắm vững tất cả sự phức tạp của Docker, việc đọc tài liệu hoặc bài viết là chưa đủ. Bạn cần phải thực hành nhiều, bạn cần có cảm nhận về Docker.

Nguồn: www.habr.com

Thêm một lời nhận xét