docker的安全
1、一般情况下,容器中操作权限受限(因为运行容器的是普通用户,并不是超户)
[root@server1 ~]# docker run -it --name vm1 ubuntu
root@f8f4008a8872:/# ip addr add 172.17.0.100/24 dev eth0
RTNETLINK answers: Operation not permitted #操作受限,因为没有网络管理的权限
root@f8f4008a8872:/# fdisk -l #看不到任何信息,因为没有查看磁盘的权限
2、授予所有权限
[root@server1 ~]# docker run -it --name vm2 --privileged=true ubuntu
root@32a9b0c57eb8:/# ip addr add 172.17.0.100/24 dev eth0 #给网卡eth0添加IP172.17.0.100/24
root@32a9b0c57eb8:/# ip addr show eth0
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 172.17.0.100/24 scope global eth0
valid_lft forever preferred_lft forever
root@32a9b0c57eb8:/# fdisk -l #查看vm1容器真实存在的设备
Disk /dev/vda: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000fc33
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 41943039 19921920 8e Linux LVM
3、授予指定权限(网络管理的权限)
[root@server1 ~]# docker run -it --name vm3 --cap-add=NET_ADMIN ubuntu
root@f6fe1679ff3b:/# ip addr add 172.17.0.200/24 dev eth0 #给网卡eth0添加IP172.17.0.200/24
root@f6fe1679ff3b:/# ip addr show eth0
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 172.17.0.200/24 scope global eth0
valid_lft forever preferred_lft forever
root@f6fe1679ff3b:/# fdisk -l #看不到任何信息,因为没有查看磁盘的权限,只有网络管理的权限
4、查看相应的权限
[root@server1 ~]# docker inspect -f {{.HostConfig.Privileged}} vm1 #查看容器vm1是否具有所有权限。如果是,则返回True;如果不是,则返回False。
false
[root@server1 ~]# docker inspect -f {{.HostConfig.Privileged}} vm2
true
[root@server1 ~]# docker inspect -f {{.HostConfig.Privileged}} vm3
false
[root@server1 ~]# docker inspect -f {{.HostConfig.CapAdd}} vm1 #查看容器vm1有哪些权限。如果有,则返回相应的权限,如果没有,则返回[]。
[]
[root@server1 ~]# docker inspect -f {{.HostConfig.CapAdd}} vm2
[]
[root@server1 ~]# docker inspect -f {{.HostConfig.CapAdd}} vm3
[NET_ADMIN]