nhân rộng và cô lập môi trường người dùng một cách nhanh chóng


8

Tôi sẽ sử dụng Ubuntu Linux cho dự án này.

Để đào tạo một ứng dụng cụ thể tại một hội nghị tôi cần:

  1. Để mỗi sinh viên có thể ssh vào cùng một tài khoản người dùng trên một máy chủ
  2. Sau mỗi lần đăng nhập, tự động đưa người dùng vào các môi trường riêng biệt
  3. Mỗi môi trường bị cô lập bao gồm ứng dụng, tệp cấu hình ví dụ và bộ công cụ unix tiêu chuẩn (ví dụ: grep, awk, sort, uniq, v.v.) Tuy nhiên, truy cập vào toàn bộ hệ thống tệp linux cũng được miễn là người dùng chỉ có thể làm hỏng chính mình môi trường bị cô lập và không phải của những người khác.
  4. Các môi trường ảo sẽ bị hủy khi phiên SSH của người dùng kết thúc

Đối với # 1, chúng tôi muốn thực hiện một tài khoản người dùng để chúng tôi không phải đối phó với việc tạo tài khoản cho mỗi sinh viên và cung cấp tên người dùng và mật khẩu.

Có ai biết làm thế nào tôi có thể đáp ứng những mục tiêu này? Công nghệ nào, ví dụ LXC, Chroot, v.v. là tốt nhất cho việc này? Tôi đã từng chơi đùa với ý tưởng sử dụng .bash_profile và .bash_logout để xử lý việc tạo và phá hủy các môi trường này nhưng không chắc công nghệ nào có khả năng tạo ra môi trường tôi cần.

Câu trả lời:


8

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 dockernhó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.
 


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.