Answers:
运行非特权容器是在生产环境中运行容器的最安全方法。容器在安全性方面的宣传很差,原因之一是因为一些用户发现,如果用户在容器中成为root用户,那么也有可能在主机上获得root用户。基本上,无特权的容器所做的是从主机屏蔽用户ID。使用非特权容器,非root用户可以创建容器,并且将以root身份出现在容器中,但在主机上将以userid 10000的形式出现(无论您将userid映射为什么)。我最近基于Stephane Graber在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。
总结一下:好处-增加了安全性,并增加了安全性隔离。缺点-刚开始时有点困惑,而不是初学者。
它们是用于测试,沙箱和封装的非常有价值的工具。希望将网络服务器安全地锁定在其自己的工作环境中,从而无法访问敏感的私有文件吗?使用容器。您的应用程序需要旧版本的库以及特定的配置文件,而这些版本与其他应用程序不兼容吗?也是一个容器。基本上chroot做对了。它使您可以将服务分别维护得足够分开,因此维护每个服务都非常容易,并且可以将它们移动或复制到另一台计算机上,而不必打扰现有系统。
缺点是您需要记住名称空间,因为几乎所有内容都是容器本地的。您必须了解自己所在的位置,并且容器之间的通信并非易事。当您需要模块化但又不想虚拟机的开销时,这是个好主意,而且您保存在容器中的东西实际上并没有多大关系。
对于“普通”用户,您可以使用容器将一台机器供两个人使用,同时将它们保持在完全不同的机器上。例如,室友。
好吧,尽管有了共享内核,尽管它以某种方式增加了攻击者释放攻击的要求(或者说,它有助于限制攻击面),但是尽管如此,未获得特权的容器仍无法与获得主机根的直接黑客完全隔离开来。 。
因此,这是一个错误的假设/主张。话虽这么说,互联网上许多用户的技术能力水平仍将以许多他们在技术上并不真正有能力的方式来运行inet服务。:)