Điểm:3

podman: rootless container: quyền cho người dùng container

lá cờ za

Trong nginx thùng chứa podman nginx người dùng được sử dụng để chạy nginx người phục vụ.

Trên máy chủ ls -alh:

drwxrwx--- 2 myuser myuser 4.0K 22:23 ngày 10 tháng 8 .
drwxrwx--- 3 myuser myuser 4.0K 22:59 ngày 10 tháng 8 ..
-rw-rw---- 1 myuser myuser 46 ngày 10 tháng 8 22:24 .htpasswd

Cùng một thư mục bên trong container ls -alh:

drwxrwx--- 2 root root 4.0K 22:23 ngày 10 tháng 8 .
drwxr-xr-x 1 gốc root 4.0K 10 tháng 8 11:05 ..
-rw-rw---- 1 gốc gốc 46 ngày 10 tháng 8 22:24 .htpasswd

nginx người dùng bên trong container không thể truy cập .htpasswd bởi vì o-rwx.

Câu hỏi: mẫu thường được sử dụng để xử lý loại trường hợp này là gì? mất gốc container phổ biến? Có lẽ có thể tạo nhóm (sau này được sử dụng làm chủ sở hữu nhóm tệp) tập hợp tất cả các phạm vi từ dưới nước/cấp dưới cho người dùng máy chủ cụ thể - nhưng làm thế nào để đạt được điều này?

Điểm:2
lá cờ in

Bằng cách sử dụng tùy chọn dòng lệnh --uidmap bạn có thể chỉ định cách người dùng của tôi UID và người dùng của tôi UID phụ được ánh xạ vào vùng chứa. (Xem trang người đàn ôngchạy bộ).

Tùy chọn dòng lệnh --gidmap hoạt động theo cách tương tự nhưng đối với GID thay vì UID.

Hãy tra cứu UID và GID của người dùng nginx trong hình ảnh vùng chứa docker.io/library/nginx

$ podman chạy --rm docker.io/library/nginx grep nginx /etc/passwd
nginx:x:101:101:người dùng nginx,,,:/không tồn tại:/bin/false
$

Kết quả:

  • UID: 101
  • GID: 101

Các số sau này được sử dụng khi đặt hai biến trình bao

$ container_uid=101
$ container_gid=101

(Các biến shell container_uidcontainer_gid không có bất kỳ ý nghĩa bên ngoài bài viết này. Chúng chỉ được giới thiệu để làm cho câu trả lời dễ đọc hơn)

Hãy xem các tệp /etc/subuid và /etc/subgid trên máy chủ

Người dùng người dùng của tôi có các UID phụ và GID phụ này.

$ grep myuser /etc/subuid
người dùng của tôi:231072:65536
$ grep myuser /etc/subgid
người dùng của tôi:231072:65536
$ 

Kết quả:

người dùng của tôi có 65536 UID phụ và 65536 GID phụ.

Các số sau này được sử dụng khi đặt hai biến trình bao

$ subuid_size=65536
$ subgid_size=65536

(Các biến shell subuid_sizesubgid_size không có bất kỳ ý nghĩa bên ngoài bài viết này. Chúng chỉ được giới thiệu để làm cho câu trả lời dễ đọc hơn)

Thay vì nhìn lên subuid_sizesubgid_size Trong /etc/subuid/etc/subgid, một phương pháp tổng quát hơn là chạy các lệnh

 subuid_size=$(( $(podman info --format "{{ range .Host.IDMappings.UIDMap }}+{{.Size }}{{end }}" ) - 1 ))
 subgid_size=$(( $(podman info --format "{{ range .Host.IDMappings.GIDMap }}+{{.Size }}{{end }}" ) - 1 ))

Ưu điểm là điều này cũng hoạt động khi tệp /etc/nsswitch.conf được sử dụng thay vì /etc/subuid/etc/subgid. (Nhìn thấy người đàn ông phụ)

Bản trình diễn 1: ánh xạ người dùng người dùng của tôi trên máy chủ cho người dùng nguồn gốc bên trong thùng chứa

Không cần chỉ định --uidmap cũng không --gidmap bởi vì đây là ánh xạ tiêu chuẩn.

Tạo thư mục có thể ghi trên thế giới bản demo1

$ mkdir demo1
$ chmod 777 demo1
$

Tạo một tệp mới, chạy dưới dạng nguồn gốc bên trong thùng chứa:

$ podman chạy --rm \
    -v ./demo1:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_root
$

Tạo một tệp mới, chạy dưới dạng nginx bên trong thùng chứa:

$ podman chạy --rm \
    --người dùng 101:101 \
    -v ./demo1:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_nginx
$

Liệt kê các tập tin trên máy chủ

$ ls -l demo1
tổng số 0
-rw-r--r--. 1 231172 231172 0 27 tháng 8 20:24 created_by_nginx
-rw-r--r--. 1 myuser myuser 0 27 tháng 8 20:22 created_by_root
$ 

Kết quả: Tệp created_by_root được sở hữu bởi người dùng của tôi:người dùng của tôi

Bản trình diễn 2: ánh xạ người dùng người dùng của tôi trên máy chủ cho người dùng nginx bên trong thùng chứa

Tạo thư mục có thể ghi trên thế giới demo2

$ mkdir demo2
$ chmod 777 demo2
$

Tạo một tệp mới, chạy dưới dạng nguồn gốc bên trong thùng chứa:

$ subuid_size=65536
$ subgid_size=65536
$ container_uid=101
$ container_gid=101
$ podman chạy --rm \
    --uidmap=0:1:$container_uid \
    --uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid)) \
    --uidmap=$container_uid:0:1 \
    --gidmap=0:1:$container_gid \
    --gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid)) \
    --gidmap=$container_gid:0:1 \
    -v ./demo2:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_root
$

Tạo một tệp mới, chạy dưới dạng nginx bên trong thùng chứa.

$ subuid_size=65536
$ subgid_size=65536
$ container_uid=101
$ container_gid=101
$ podman chạy --rm \
    --user $container_uid:$container_gid \
    --uidmap=0:1:$container_uid \
    --uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid)) \
    --uidmap=$container_uid:0:1 \
    --gidmap=0:1:$container_gid \
    --gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid)) \
    --gidmap=$container_gid:0:1 \
    -v ./demo2:/dir:Z \
      docker.io/library/nginx touch /dir/created_by_nginx
$

Liệt kê các tập tin trên máy chủ

$ ls -l demo2
tổng số 0
-rw-r--r--. 1 myuser myuser 0 27 tháng 8 20:26 created_by_nginx
-rw-r--r--. 1 231072 231072 0 ngày 27 tháng 8 20:25 created_by_root
$ 

Kết quả: Tệp created_by_nginx được sở hữu bởi người dùng của tôi:người dùng của tôi

Phần kết luận

Sử dụng --uidmap--gidmap theo cách tương tự như trong Bản trình diễn 2.

mẹo khắc phục sự cố

Tôi đã viết một mẹo khắc phục sự cố: Không thể truy cập các thiết bị hoặc tệp được truyền vào trong vùng chứa không root (sự cố ánh xạ UID/GID) có chứa phương pháp được mô tả trong Bản trình diễn 2

lá cờ cn
Đây phải là câu trả lời tốt nhất. Nó giải quyết rất nhiều vấn đề của tôi khi cố gắng để một người dùng máy chủ không phải root duy nhất chạy nhiều vùng chứa chạy với các uid/gid nội bộ khác nhau và tất cả đều phải truy cập và ghi vào ổ đĩa được gắn trên máy chủ. Cảm ơn bạn rất nhiều!
Điểm:0
lá cờ cl
A.B

Bạn nên tìm ra UID máy chủ ban đầu cho vùng chứa là gì nginx UID (chỉ cần chạm vào một tệp từ vùng chứa bằng cách sử dụng người dùng theo đó nginx đang chạy, hoặc kiểm tra các tệp nhật ký của nó, hoặc kiểm tra các nginx tiến trình. Sau đó sử dụng thống kê hoặc ls -ln từ người dùng máy chủ ban đầu): một số giá trị UID lớn, giả sử đó là 100030.

Sau đó, từ người dùng không có đặc quyền của máy chủ lưu trữ ban đầu, bạn có thể sử dụng setfactl để cấp quyền truy cập bổ sung cho người dùng 100030. Điều này sẽ giống như:

thư mục setfacl -R -m u:100030:rX,d:u:100030:rX

Nếu bạn muốn nginx người dùng có thể viết (có thể không phải là một ý tưởng hay), bạn có thể thay thế rX với rwX hoặc chỉ làm điều đó trong các thư mục được chọn. Sự trùng lặp bắt đầu với d: viết tắt của mặc định ACL, vì vậy các thư mục và tệp mới được tạo cũng kế thừa các ACL bổ sung tương tự. Khi ACL được đặt, đầu ra của ls hiển thị một + và mặt nạ ACL thay vì nhóm, vì vậy nó có thể gây ngạc nhiên.

Dưới đây là các tài liệu tham khảo khác nhau về ACL:

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.