Với Docker bạn có thể làm điều này rất dễ dàng.
docker pull ubuntu
docker run -t -i ubuntu /bin/bash
# make your changes and then log out
docker commit $(docker ps -a -q | head -n 1) sandbox
cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF
chmod a+x /usr/local/bin/sandbox
echo /usr/local/bin/sandbox >> /etc/shells
useradd testuser -g docker -s /usr/local/bin/sandbox
passwd testuser
Bất cứ khi nào testuser
đăng nhập, chúng sẽ được đặt vào một thùng chứa riêng biệt, nơi chúng không thể nhìn thấy bất cứ thứ gì bên ngoài nó, thậm chí không phải là thùng chứa của những người dùng khác.
Các container sau đó sẽ được tự động loại bỏ khi họ đăng xuất.
Giải trình:
docker pull ubuntu
Ở đây chúng tôi lấy hình ảnh cơ sở mà chúng tôi sẽ làm việc với. Docker cung cấp hình ảnh tiêu chuẩn, và Ubuntu là một trong số đó.
docker run -t -i ubuntu /bin/bash
# make your changes and then log out
Ở đây chúng tôi khởi chạy một shell từ hình ảnh Ubuntu. Mọi thay đổi bạn thực hiện sẽ được giữ nguyên cho người dùng của bạn.
Bạn cũng có thể sử dụng Dockerfile để xây dựng hình ảnh, nhưng đối với một lần, tôi nghĩ rằng điều này đơn giản hơn.
docker commit $(docker ps -a -q | head -n 1) sandbox
Ở đây chúng tôi chuyển đổi container cuối cùng đã được chạy thành một hình ảnh mới được gọi là sandbox
.
cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF
Đây sẽ là một vỏ giả mà người dùng buộc phải chạy khi đăng nhập. Kịch bản sẽ khởi chạy chúng vào một thùng chứa docker sẽ tự động được dọn sạch ngay khi chúng đăng xuất.
chmod a+x /usr/local/bin/sandbox
Tôi hy vọng điều này là hiển nhiên :-)
echo /usr/local/bin/sandbox >> /etc/shells
Điều này có thể không được yêu cầu trên hệ thống của bạn, nhưng trên vỏ của tôi không thể là vỏ đăng nhập trừ khi nó tồn tại /etc/shells
.
useradd testuser -g docker -s /usr/local/bin/sandbox
Chúng tôi tạo một người dùng mới mà với trình bao của họ được đặt thành tập lệnh chúng tôi sẽ tạo. Kịch bản sẽ buộc chúng khởi chạy vào thùng chứa hộp cát. Họ là thành viên của docker
nhóm để người dùng có thể khởi chạy một container mới.
Một cách khác để đưa người dùng vào nhóm docker sẽ cấp cho họ quyền sudo cho một lệnh duy nhất.
passwd testuser
Tôi hy vọng điều này cũng rõ ràng.