Docker安全以及rhel6.5上容器的安全管理

设置特权级运行的容器:–privileged=true
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载
USB 磁盘,修改 MAC 地址等。

1.容器特权
[root@foundation24 docker]# docker run --help |grep privileged    ##过滤权限
      --privileged                            Give extended privileges to this container

在没加特权的时,容器默认只有ro权限

[root@foundation24 docker]# docker run -it --name vm1 ubuntu
root@64a079965cdc:/# ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever
root@64a079965cdc:/# ip link set down eth0   ##尝试down掉eth0
RTNETLINK answers: Operation not permitte

添加特权级运行,容器可以执行所有超级用户的权限:

[root@foundation24 docker]# docker run -it --name vm2 --privileged=true ubuntu

Docker安全以及rhel6.5上容器的安全管理_第1张图片

root@fcd094afbdd7:/# ip link set down eth0

Docker安全以及rhel6.5上容器的安全管理_第2张图片

2.内存memory的压侧
[root@foundation24 docker]# docker run --help |grep memory
      --kernel-memory string                  Kernel memory limit
  -m, --memory string                         Memory limit
      --memory-reservation string             Memory soft limit
      --memory-swap string                    Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --memory-swappiness int                 Tune container memory swappiness (0 to 100) (default -1)

做一个名字叫vm1 的 内存为100M swap分区为100M的容器,在调用stree镜像来压侧90M ,不会结束,这里后面的vm 1 代表单线程

[root@foundation24 docker]# docker run --rm -it --name vm1 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 90M

Docker安全以及rhel6.5上容器的安全管理_第3张图片

在开一台物理机: top 查看
Docker安全以及rhel6.5上容器的安全管理_第4张图片

在开启一个100M的容器,压侧为110M,还是不会停止,因为在允许范围内,当内存不够的时候,会占用swap分区,所以还是会一直跑下去,swap分区的大小为所给内存的2倍。

[root@foundation24 docker]# docker run --rm -it --name vm1 -m 100M stress --vm 1 --vm-bytes 110M

Docker安全以及rhel6.5上容器的安全管理_第5张图片

top查看,cpu已经没有很高的占有率,说明已经进入swap分区
Docker安全以及rhel6.5上容器的安全管理_第6张图片

当为199M时,压侧还是不会停止,但是很慢
Docker安全以及rhel6.5上容器的安全管理_第7张图片

当为200M时,停止

Docker安全以及rhel6.5上容器的安全管理_第8张图片

3.cup的压侧:

lscpu来看cup的基本信息
Docker安全以及rhel6.5上容器的安全管理_第9张图片

第一种方式
用各占一个cpu来工作,一个压侧512M 一个压侧1024M

[root@foundation24 docker]# docker run --rm -it --cpu-shares 512 stress -c 1

[root@foundation24 docker]# docker run --rm -it --cpu-shares 1024 stress -c 1

top查看
Docker安全以及rhel6.5上容器的安全管理_第10张图片

为什么不存在优先级,是因为,总共有4个cpu,一边调用一个,完全在工作承受范围了,系统的进程就是在允许范围了给与最大的工作能力调用,所以在承受范围之内是没有优先级的。

第二种方式:
当同时压侧所有的cpu ,4个时,一个压侧512M,一个压侧1024M

[root@foundation24 docker]# docker run --rm -it --cpu-shares 512 stress -c 4

[root@foundation24 docker]# docker run --rm -it --cpu-shares 1024 stress -c 4

top查看
Docker安全以及rhel6.5上容器的安全管理_第11张图片

可以清楚的看到4个cpu 被同时压侧时,会出现优先级,1024的比512的块两倍

4.最大吞吐量的限制
[root@foundation24 docker]# docker run --help |grep bps   
      --device-read-bps throttled-device      Limit read rate (bytes per second) from a device (default [])
      --device-write-bps throttled-device     Limit write rate (bytes per second) to a device (default [])

4.1限制
写入的吞吐量
docker run –rm -it –device-write-bps /dev/sda:10M ubuntu ##限制吞吐量为10M
dd if=/dev/zero of=testfile bs=1M count=1000 oflag=direct ##在无限零设备中取一个1000M的设备

[root@foundation24 ~]# docker run --rm -it --device-write-bps /dev/sda:10M ubuntu
root@7404a6735243:/# dd if=/dev/zero of=testfile bs=1M count=1000 oflag=direct


1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 99.9522 s, 10.5 MB/s

Docker是一个运用容器的服务,容器并不只有docker
Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC
Runc -> docker engine -> daemon

以下实验在rhel6.5上进行


[root@server6 ~]# yum isstall -y libcgroup.x86_64      ##下载容器


[root@server6 /]# /etc/init.d/cgconfig start
Starting cgconfig service:                                 [  OK  ]
[root@server6 ~]# cd /cgroup/     
[root@server6 cgroup]# ls
blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls
[root@server6 cgroup]# cd  memory/
1.内存memory:

最大的内存量 (理论上是无限的)

Docker安全以及rhel6.5上容器的安全管理_第12张图片

怎么设置容器的内存量:

[root@server6 memory]# vim /etc/cgconfig.conf  ##定义一个组x1,在x1组里面加上最大的内存为200M

Docker安全以及rhel6.5上容器的安全管理_第13张图片

[root@server6 cgroup]# /etc/init.d/cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]

查看先x1分组中最大内存:

[root@server6 memory]# cd x1/
[root@server6 x1]# cat memory.limit_in_bytes
209715200

真实的呢内存量为free+ buffers+cached

这样也可以压侧300M,因为swap分担了100M
[root@server6 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           996        260        735          0         33        159
-/+ buffers/cache:         68        928
Swap:          991          0        991
[root@server6 ~]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=300        ##压侧一个300M的
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 0.922426 s, 341 MB/s
[root@server6 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           996        465        530          0         33        358
-/+ buffers/cache:         74        922
Swap:          991          0        991

设置容器总共可以使用内存和swap总共为200M

[root@server6 memory]# vim /etc/cgconfig.conf  ##设置内存和swap分区总共200M

Docker安全以及rhel6.5上容器的安全管理_第14张图片

[root@server6 ~]# cd /dev/shm/    ##进入内存管理空间
[root@server6 shm]# free -m
             total       used       free     shared    buffers     cached
Mem:           996        261        735          0         33        159
-/+ buffers/cache:         68        928
Swap:          991          0        991
[root@server6 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=300   ##压侧300M
Killed
illed
[root@server6 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=199     ##压侧
Killed
[root@server6 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=190   ##压侧
190+0 records in
190+0 records out
199229440 bytes (199 MB) copied, 0.0963854 s, 2.1 GB/s
[root@server6 shm]# free -m
             total       used       free     shared    buffers     cached
Mem:           996        451        544          0         33        349
-/+ buffers/cache:         68        927
Swap:          991          0        991

内存管理的实验:
利用了两个脚本加载出来的内存页不一样来进行压侧的比对

加权:

[root@server6 ~]# ls
memapp1  memapp2
[root@server6 ~]# chmod +x memapp*

下载插件:

[root@server6 ~]# yum install -y /lib/ld-linux.so.2

运行脚本memapp1 ,可以看出内存页为4096,一内存页=4kb

[root@server6 ~]# ./memapp1

Process ID is: 2414

Grabbing 4096 pages of memory

Success!

Press any key to exit

运行脚本memapp2 ,可以看出内存页为8192

[root@server6 ~]# ./memapp2

Process ID is: 2415

Grabbing 8192 pages of memory


Success!

Press any key to exit

进行环境内存内存的设置:

[root@server6 ~]# vim /etc/cgconfig.conf  ##这样设置就可以使得只有脚本一压侧才可以,二不可以

Docker安全以及rhel6.5上容器的安全管理_第15张图片

[root@server6 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]

建立用户

[root@server6 shm]# useradd xqq
[root@server6 shm]# su  - xqq

在/dev/shm 目录下重无限零设备中拉取一个300M的空间,作为压侧使用

[xqq@server6 ~]$ cd /dev/shm/
[xqq@server6 shm]$ dd if=/dev/zero of=file1 bs=1M count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 0.214833 s, 1.5 GB/s
[root@server6 shm]# vim /etc/cgrules.conf 

Docker安全以及rhel6.5上容器的安全管理_第16张图片

开启cgred服务

[root@server6 shm]# /etc/init.d/cgred start
Starting CGroup Rules Engine Daemon:                       [  OK  ]

将脚本防到xqq用户的加目录下:

[root@server6 ~]# ls
memapp1  memapp2
[root@server6 ~]# mv * /home/xqq/

测试:


[xqq@server6 ~]$ ls
memapp1  memapp2
[xqq@server6 ~]$ ./memapp1 

Process ID is: 2513

Grabbing 4096 pages of memory

Success!

Press any key to exit
[xqq@server6 ~]$ ./memapp2

Process ID is: 2514

Grabbing 8192 pages of memory
Killed
2.cpu
[root@server6 cpu]# vim /etc/cgconfig.conf

Docker安全以及rhel6.5上容器的安全管理_第17张图片

测试:

[root@server6 ~]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
[1] 2327

top查看:
Docker安全以及rhel6.5上容器的安全管理_第18张图片

3.设置设备吞吐量
blkio.throttle.read_bps_device   读取设备的吞吐量

[root@server6 blkio]# ll /dev/vda    ##设备型号很重要
brw-rw---- 1 root disk 252, 0 Aug 21 13:53 /dev/vda
[root@server6 blkio]# vim /etc/cgconfig.conf 

[root@server6 blkio]# vim /etc/cgconfig.conf ##设置读取最大吞吐量为1000kb/s

Docker安全以及rhel6.5上容器的安全管理_第19张图片

[root@server6 ~]# /etc/init.d/cgconfig restart
Stopping cgconfig service:                                 [  OK  ]
Starting cgconfig service:                                 [  OK  ]
[root@server6 x3]# cat blkio.throttle.read_bps_device
252:0   1000000
[root@server6 ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
[1] 2353
[root@server6 ~]# yum install -y iotop   

查看iotop
Docker安全以及rhel6.5上容器的安全管理_第20张图片

4.容器的暂停与恢复
[root@server6 cgroup]# cd freezer/
[root@server6 freezer]# ls
cgroup.event_control  cgroup.procs  notify_on_release  release_agent  tasks
[root@server6 freezer]# vim /etc/cgconfig.conf    ##设置一个空的组

这里写图片描述

[root@server6 freezer]# cd x4/
[root@server6 x4]# dd if=/dev/zero of=/dev/null  &
[1] 2388

这里写图片描述

[root@server6 x4]# echo 2388 > tasks
[root@server6 x4]# cat freezer.state 
THAWED
[root@server6 x4]# echo FROZEN > freezer.state        ##冻结,有时候不确定服务是否有用,所以冻结,而不kill
[root@server6 x4]# cat freezer.state 
FROZEN

top查看,任务被冻结
Docker安全以及rhel6.5上容器的安全管理_第21张图片

解冻:

[root@server6 x4]# echo THAWED > freezer.state 
[root@server6 x4]# cat freezer.state 
THAWED

top查看,任务出现继续运行:
Docker安全以及rhel6.5上容器的安全管理_第22张图片

你可能感兴趣的:(个人作业)