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
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
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