05-Docker安全管理及资源限制

Dcoker与虚拟机的区别

隔离与共享
1.	每个虚拟机都有自己的系统内核核
2.	Docker容器则是通过隔离的方式让容器之间互不影响,容器无法影响宿主机
 	性能与损耗
1.	与虚拟机相比,容器资源损耗要小得多
2.	同样的宿主机下,能够建立容器的数量要比虚拟机多得多
3.	虚拟机的安全性要比容器好

Docker存在的安全问题
 - Docker自身漏洞
       CVE官方记录Docker历史版本共有超过20项漏洞
 -	Docker源码问题
         黑客上传恶意镜像
    	镜像使用有漏洞的软件
	    中间人攻击篡改镜像
Docker架构缺陷与安全机制
架构缺陷
 - 容器之间的局域网攻击
 - DDoS攻击耗尽
 - 资源有漏洞的系统调用
 - 共享root

Docker安全基线标准六大方面

内核级别、主机级别、网络级别
镜像级别、容器级别、其他设置

Docker安全基线标准
内核级别:
 - 及时更新内核。
 - User NameSpace (容器内的root权限在容器之外处于非高权限状态) 。
 - Cgroups (对资源的配额和度量)
 - SELiux/AppArmor/GRSEC (控制文件访问权限) 。
 - Capability (权限划分)
 - Seccomp (限定系统调用)
 - 禁止将容器的命名空间与宿主机进程命名空间共享。
主机级别
  • 为容器创建独立分区。
  • 仅运行必要的服务。
  • 禁止将宿主机上敏感目录映射到容器。
  • 对Docker守护进程、相关文件和目录进行审计。
  • 没置适当的默认文件描述符数。
  • 用户权限为root的Docker相关文件的访问权限应该为644或者更低权限。
  • 周期性检查每个主机的容器清单,并清理不必要的容器。
网络级别:
  • 通过iptables设定规则实现禁止或允许容器之间网络流量。
  • 允许 Dokcer修改iptables.
  • 禁止将Docker绑定到其他IP/Port或者Unix Socket.
  • 禁止在容器上映射特权端口。
  • 容器上只开放所需要的端口。
  • 禁止在容器上使用主机网络模式。
  • 若宿主机有多个网卡,将容器进入流量绑定到特定的主机网卡上。
镜像级别:
  • 创建本地镜像仓库服务器。
  • 镜像中软件都为最新版本。(使用中等版本,容易排错)
  • 使用可信镜像文件,并通过安全通道下载。
  • 重新构建镜像而非对容器和镜像打补丁。
  • 合理管理镜像标签,及时移除不再使用的镜像。
  • 使用镜像扫描。
  • 使用镜像签名。
容器级别:
  • 容器最小化,操作系统镜像最小集。
  • 容器以单一主进程的方式运行。
  • 禁止privileged标记使用特权容器。
  • 禁止在容器上运行ssh服务。
  • 以只读的方式挂载容器的根目录系统。
  • 明确定义属于容器的数据盘符。
  • 通过设置on-failure限制容器尝试重启的次数
  • 限制在容器中可用的进程树
其他设置:
  • 定期对宿主机系统及容器进行安全审计。
  • 使用最少资源和最低权限运行容器。
  • 避免在同一宿主机上部署大量容器,维持在一个能够管理的数量。
  • 监控Docker容器的使用,性能以及其他各项指标。
  • 增加实时威胁检测和事件响应功能。
  • 使用中心和远程日志收集服务。

Docker安全规则

容器最小化

仅在容器中运行必要的服务,像ssh等远程连接的服务,不要轻易开启,如果要连接到容器,则使用exec方式进入:
docker exec -it 容器id bash

Docker remote api访问控制

方法一

Docker的远程调用API接口存在未授权访问漏洞,应限制外网访问
docker -d -H uninx:///var/run/docker.sock -H tcp://192.168.10.101:2372

方法二

	可以在docker的配置文件中指定
	vim /usr/lib/systemd/system/docker.service
	14 ExecStart=/usr/bin/dockerd
	修改为:
14 ExecStart=/usr/bin/dockerd uninx:///var/run/docker.sock  -H tcp://192.168.10.101:2372
限制流量流向
使用iptables过滤器限制docker的源IP地址范围与外界通讯
firewall-cmd –permanent –zone=public –add-rich-rule=”rulefamily=”ipv4” source add=”192.168.10.0/24” reject”
镜像安全
  • 在镜像仓库客户端使用证书认证,对下载的镜像进行检查。通过与CVE数据库同步扫描镜像,一旦发现漏洞则通知用户处理,或者直接阻止镜像继续构建。
  • 如果使用的是公司自己的镜像源,可以跳过此步;否则,至少需要验证baseimage的md5等特征值,确认一致后再基于baseimage进一步构建。
避免Docker容器中信息泄露
检查容器创建模板的内容
Vim docker.sh
#!bin/bash
Dockerfile=$1
#check created users
grep authorized keys $dockerfile
#check OS users
grep "etc/group" $dockerfile
#Check sudo users
grep "etc/sudoers.d" $dockerfile
#Check ssh key pair
grep ".ssh/.*id rsa" $dockerfile
Docker Bench for Security

Docker Bench for Security是一个脚本,用于检查在生产环境中部署Docker容器的几十个常见的最佳实践
环境安装
下载二进制文件后,将其添加到环境变量PATH中

yum -y install git
git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security/
./docker-bench-security.sh

docker资源限制

ulimit

 可对包括core dump文件大小、进程数据段的大小、可创建文件的大小、常驻内存集大小、打开文件数、进程栈的大小、cpu时间、单个用户的最大线程数、进程的最大虚拟内存等类型的资源起到限制作用
 设置CPU时间

 [root@centos-02 ~]# docker run -it --rm --ulimit cpu=1200 busybox

	进行查看
/ # ulimit -t
1200
/ # exit
Cgroup资源配置方法

 Cgroup是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制
 Cgroup子系统

  • blkio:设置限制每个块设备的输入输出控制
  • cpu:使用调度程序为cgroup任务提供cpu的访问
  • cpuacct:产生cgroup任务的cpu资源报告
  • cpuset:如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存
  • ……
使用stress工具来测试CPU和内存

Stress:测试资源限制的工具

上传安装包:stress-1.0.4-16.el7.x86_64.rpm
[root@centos-02 ~]# mkdir test
[root@centos-02 ~]# mv stress-1.0.4-16.el7.x86_64.rpm test/
[root@centos-02 ~]# cd test/
[root@centos-02 test]# ls
stress-1.0.4-16.el7.x86_64.rpm
[root@centos-02 test]# vim Dockerfile
FROM centos:7
LABEL maintainer="fengbowem"
ADD stress-1.0.4-16.el7.x86_64.rpm .
RUN rpm -i stress-1.0.4-16.el7.x86_64.rpm
[root@centos-02 test]# docker build -t centos:stress-v1 .
Cpu的百分比比例分配

启动两个容器及运行查看CPU使用百分比.使用top查看比例

[root@centos-02 test]# docker run -it --cpu-shares 100 --rm centos:stress-v1
[root@7b06a18565d9 /]# stress -c 10 &
[root@7b06a18565d9 /]# top
[root@centos-02 test]# docker run -it --cpu-shares 200 --rm centos:stress-v1
[root@48baab19acbe /]# stress -c 10 &
[root@48baab19acbe /]# top
cpu周期限制

两个参数控制容器CPU时钟周期
–cpu-period:指定多久重新分配一次
–cpu-quota:指定分配这一次中可以是用多久
在多核情况下,允许容器进程需要完全占用两个CPU,则可以将cpu-period设置为100000 (即0.1秒)cpu-quota 设置为200000 (0.2秒)

[root@centos-02 test]# docker run -it --rm --cpu-period 100000 --cpu-quota 200000 centos:stress-v1
[root@73d4c6559c3e /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
[root@73d4c6559c3e /]#  cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000
CPU Core控制

对多核CPU的服务器, docker还可以控制容器运行限定使用哪些CPU内核,即使用-cpuset-cpu s参数

 生成cgroup的cpu内核配置

[root@centos-02 test]# docker run -it --rm --cpuset-cpus 0-2 centos:stress-v1
[root@9954251b4ca3 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-2
进程与CPU内核的绑定关系
[root@9954251b4ca3 /]# taskset -c -p 1
pid 1's current affinity list: 0-2
CPU配额控制参数的混合使用

cpuset-cpus, cpuset-mems参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的
创建测试用的容器并使用top命令查看

[root@centos-02 test]# docker run -it --rm --cpuset-cpus 3 --cpu-shares 512 centos:stress-v1
[root@c4bd686c9c26 /]# stress -c 1 &
[root@c4bd686c9c26 /]# top
继续创建测试用的容器并使用top命令查看
[root@centos-02 test]# docker run -it --rm --cpuset-cpus 3 --cpu-shares 1024 centos:stress-v1
[root@a60e61287d1a /]# stress -c 1 &
[root@a60e61287d1a /]# top 
内存限额项

Docker通过两组参数来控制容器内存的使用量
-m或—memory:内存的限制
–memory-swap:swap交换空间的限制
允许该容器最多使用200M的内存和100M的swap

[root@centos-02 ~]# docker run -it -m 200M --memory-swap 300M centos:stress-v1 stress --vm 1 --vm-bytes 280M --verbose
[root@centos-02 ~]# docker run -it -m 200M --memory-swap 300M centos:stress-v1 stress --vm 1 --vm-bytes 350M --verbose
Block IO的限制

默认情况下,所有容器能通过设置–blkio-weight参数来改变容器block IO的优先级
例如容器A读写磁盘的带宽是容器B的两倍

[root@centos-02 ~]# docker run -it --name ECS_A --blkio-weight 600 centos:stress-v1
[root@8430769d111f /]# cat /sys/fs/cgroup/blkio/blkio.weight
600
[root@centos-02 ~]# docker run -it --name ECS_B --blkio-weight 300 centos:stress-v1
[root@982d4db04f8a /]# cat /sys/fs/cgroup/blkio/blkio.weight
300
限制bps和iops

 bps是byte per second,每秒读写的数据量。
–device-read-bps:每秒读的次数
–device-write-bps:每秒写的次数
 iops是io per second,每秒IO的次数
–device-read-iops:读的次数
–device-write-iops:写的次数

查看磁盘的树形结构
[root@centos-02 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0   20G  0 disk
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0   19G  0 part
  ├─cl-root 253:0    0   17G  0 lvm  /
  └─cl-swap 253:1    0    2G  0 lvm  [SWAP]
sr0          11:0    1  4.1G  0 rom  /media/cdrom
限制容器写/dev/sda的速率为5 MB/s
[root@centos-02 ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress-v1
测试读写无限制的读写率
[root@centos-02 ~]# docker run -it centos:stress-v1
[root@9d2d606eed47 /]# dd if=/dev/zero of=./test.out bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 0.0232869 s, 2.3 GB/s
测试读写限制读写率
[root@5a871e1fe695 /]# dd if=/dev/zero of=./test.out bs=1M count=50 oflag=direct
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 10.0013 s, 5.2 MB/s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值