技术解释什么是非特权容器相当不错。然而,它并不适合普通PC用户。人们何时以及为什么应该使用非特权容器,是否有一个简单的答案,它们的优点和缺点是什么?
答案1
运行非特权容器是在生产环境中运行容器的最安全方法。在安全性方面,容器的宣传效果不佳,原因之一是一些用户发现,如果用户在容器中获得 root 权限,那么也有可能在主机上获得 root 权限。基本上,非特权容器所做的就是从主机中屏蔽用户 ID。对于非特权容器,非 root 用户可以创建容器,并且会以 root 身份出现在容器中,但会在主机上显示为 userid 10000(无论您将 userid 映射为什么)。我最近写了一篇关于此的博客文章斯蒂芬·格雷伯的博客LXC 系列(LXC 的杰出人才/首席开发人员之一,绝对值得关注的人)。我再说一遍,非常出色。
来自我的博客:
从容器中:
lxc-attach -n ubuntu-unprived
root@ubuntu-unprived:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 04:48 ? 00:00:00 /sbin/init
root 157 1 0 04:48 ? 00:00:00 upstart-udev-bridge --daemon
root 189 1 0 04:48 ? 00:00:00 /lib/systemd/systemd-udevd --daemon
root 244 1 0 04:48 ? 00:00:00 dhclient -1 -v -pf /run/dhclient.eth0.pid
syslog 290 1 0 04:48 ? 00:00:00 rsyslogd
root 343 1 0 04:48 tty4 00:00:00 /sbin/getty -8 38400 tty4
root 345 1 0 04:48 tty2 00:00:00 /sbin/getty -8 38400 tty2
root 346 1 0 04:48 tty3 00:00:00 /sbin/getty -8 38400 tty3
root 359 1 0 04:48 ? 00:00:00 cron
root 386 1 0 04:48 console 00:00:00 /sbin/getty -8 38400 console
root 389 1 0 04:48 tty1 00:00:00 /sbin/getty -8 38400 tty1
root 408 1 0 04:48 ? 00:00:00 upstart-socket-bridge --daemon
root 409 1 0 04:48 ? 00:00:00 upstart-file-bridge --daemon
root 431 0 0 05:06 ? 00:00:00 /bin/bash
root 434 431 0 05:06 ? 00:00:00 ps -ef
来自主持人:
lxc-info -Ssip --name ubuntu-unprived
State: RUNNING
PID: 3104
IP: 10.1.0.107
CPU use: 2.27 seconds
BlkIO use: 680.00 KiB
Memory use: 7.24 MiB
Link: vethJ1Y7TG
TX bytes: 7.30 KiB
RX bytes: 46.21 KiB
Total bytes: 53.51 KiB
ps -ef | grep 3104
100000 3104 3067 0 Nov11 ? 00:00:00 /sbin/init
100000 3330 3104 0 Nov11 ? 00:00:00 upstart-udev-bridge --daemon
100000 3362 3104 0 Nov11 ? 00:00:00 /lib/systemd/systemd-udevd --daemon
100000 3417 3104 0 Nov11 ? 00:00:00 dhclient -1 -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0
100102 3463 3104 0 Nov11 ? 00:00:00 rsyslogd
100000 3516 3104 0 Nov11 pts/8 00:00:00 /sbin/getty -8 38400 tty4
100000 3518 3104 0 Nov11 pts/6 00:00:00 /sbin/getty -8 38400 tty2
100000 3519 3104 0 Nov11 pts/7 00:00:00 /sbin/getty -8 38400 tty3
100000 3532 3104 0 Nov11 ? 00:00:00 cron
100000 3559 3104 0 Nov11 pts/9 00:00:00 /sbin/getty -8 38400 console
100000 3562 3104 0 Nov11 pts/5 00:00:00 /sbin/getty -8 38400 tty1
100000 3581 3104 0 Nov11 ? 00:00:00 upstart-socket-bridge --daemon
100000 3582 3104 0 Nov11 ? 00:00:00 upstart-file-bridge --daemon
lxc 3780 1518 0 00:10 pts/4 00:00:00 grep --color=auto 3104
正如您所看到的,进程在容器内以 root 身份运行,但不是以 root 身份出现,而是在主机上显示为 100000。
总结一下: 好处 - 增加安全性并增加安全隔离。缺点 - 一开始有点令人困惑,不适合新手用户。
答案2
它们是非常有价值的测试、沙箱和封装工具。想要网络服务器被安全地锁定在自己的工作环境中,无法访问敏感的私人文件吗?使用容器。您的应用程序需要旧版本的库和特定的配置文件,与其他应用程序不兼容?也是一个容器。基本上 chroot 就完成了。它允许您将服务维护得足够独立,因此维护每个服务都变得更加容易,并且可以将它们移动或复制到另一台计算机,而不必干扰现有系统。
缺点是您需要记住名称空间,因为几乎所有内容都是容器本地的。你必须知道自己在哪里,容器之间的通信并不是微不足道的。当您需要模块化,但不想要虚拟机的开销,并且您保存在容器中的东西实际上没有太大关系时,这是一个好主意。
对于“普通”用户,您可以使用容器为两个人使用一台机器,同时让他们就像在完全不同的机器上一样。以室友为例。
答案3
好吧,使用共享内核,尽管它增加了对手以某些方式挣脱束缚的要求(或者更确切地说;它有助于限制攻击面),但非特权容器仍然没有完全与获得主机根的直接黑客隔离,尽管如此。
因此,这是一个有点错误的假设/主张。话虽如此,互联网上许多用户的技术能力水平仍然会运行 inet 服务,但他们在技术上并不真正能够以多种方式运行,所以嘿。 :)