Docker( 八)docker的安全以及安全加固

╰+哭是因爲堅強的太久メ 2021-11-05 14:06 604阅读 0赞

一.基础知识

1.Docker容器的安全性,很大程度上依赖于Linux系统自身,评
估Docker的安全性时,主要考虑以下几个方面:

  • Linux内核的命名空间机制提供的容器隔离安全
  • Linux控制组机制对容器资源的控制能力安全。
  • Linux内核的能力机制所带来的操作权限安全
  • Docker程序(特别是服务端)本身的抗攻击性。
  • 其他安全增强机制对容器安全性的影响。

2.命名空间隔离的安全

  • 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命 名空间。命名空间提供了最基础也最直接的隔离。
  • 与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
  • 容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
  • 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时 间。

3.控制组资源控制的安全

  • 当docker run启动一个容器时,Docker将在后台为容器创建一个独 立的控制组策略集合。
  • Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分 享主机的内存、CPU、磁盘IO等资源。
  • 确保当发生在容器内的资源压力不会影响到本地主机系统和其他 容器,它在防止拒绝服务攻击(DDoS)方面必不可少。

4.内核能力机制

  • 能力机制(Capability)是Linux内核一个强大的特性,可以提供细 粒度的权限访问控制。
  • 大部分情况下,容器并不需要“真正的”root权限,容器只需要 少数的能力即可。
  • 默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。

5.Docker服务端防护

  • 使用Docker容器的核心是Docker服务端,确保只有可信的用户才 能访问到Docker服务。
  • 将容器的root用户映射到本地主机上的非root用户,减轻容器和 主机之间因权限提升而引起的安全问题。
  • 允许Docker 服务端在非root权限下运行,利用安全可靠的子进程 来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。

6.其他安全特性

  • 在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安 全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置。
  • 使用一些有增强安全特性的容器模板。
  • 用户可以自定义更加严格的访问控制机制来定制安全策略。
  • 在文件系统挂载到容器内部时,可以通过配置只读模式来避免容 器内的应用通过文件系统破坏外部环境,特别是一些系统运行状 态相关的目录。

二.系统基础安全实验

1.docker与系统共享内核并且会在宿主机上产生相应的进程

  1. [root@server1 ~]# docker run -it --name vm1 ubuntu
  2. root@f1c5528bcddb:/# ls
  3. bin dev home lib64 mnt proc run srv tmp var
  4. boot etc lib media opt root sbin sys usr
  5. root@f1c5528bcddb:/# free -m
  6. total used free shared buffers cached
  7. Mem: 992 442 550 12 0 257
  8. -/+ buffers/cache: 184 808
  9. Swap: 2047 0 2047
  10. [root@server1 ~]# docker inspect vm1 | grep Pid
  11. "Pid": 3435,
  12. "PidMode": "",
  13. "PidsLimit": 0,
  14. [root@server1 ~]# cd /proc/3435
  15. [root@server1 3435]# ls
  16. attr environ mem pagemap stat
  17. autogroup exe mountinfo personality statm
  18. auxv fd mounts projid_map status
  19. cgroup fdinfo mountstats root syscall
  20. clear_refs gid_map net sched task
  21. cmdline io ns schedstat timers
  22. comm limits numa_maps sessionid uid_map
  23. coredump_filter loginuid oom_adj setgroups wchan
  24. cpuset map_files oom_score smaps
  25. cwd maps oom_score_adj stack
  26. [root@server1 3435]# cd ns/
  27. [root@server1 ns]# ll
  28. total 0
  29. lrwxrwxrwx 1 root root 0 Aug 7 09:51 ipc -> ipc:[4026532227]
  30. lrwxrwxrwx 1 root root 0 Aug 7 09:51 mnt -> mnt:[4026532225]
  31. lrwxrwxrwx 1 root root 0 Aug 7 09:50 net -> net:[4026532230]
  32. lrwxrwxrwx 1 root root 0 Aug 7 09:51 pid -> pid:[4026532228]
  33. lrwxrwxrwx 1 root root 0 Aug 7 09:51 user -> user:[4026531837]
  34. lrwxrwxrwx 1 root root 0 Aug 7 09:51 uts -

在这里插入图片描述在这里插入图片描述
2.cgroup

  1. 查看cgroup服务路径
  2. [root@server1 ~]# mount -t cgroup

在这里插入图片描述
依次查看cpu,内存和容器的目录下的文件
在这里插入图片描述
在这里插入图片描述注意:cgroup目录下有对容器进行相应的限制的参数,如cpu,memory等,新建的容器的id会出现在相应限额的docker的目录下,在memory目录下新建目录时直接会从上级目录继承.

查看内存,发现没有限制
在这里插入图片描述
在linux系统中可以通过修改/etc/security/limits.conf文件来限制cpu内存

  1. [root@server1 ~]# cd /etc/security/limits.d/
  2. [root@server1 limits.d]# ls
  3. 20-nproc.conf
  4. [root@server1 limits.d]# vim /etc/security/limits.conf

三.对cpu进行资源限制

1.cpu独占

  1. [root@server1 ~]# cd /sys/fs/cgroup/cpu
  2. [root@server1 cpu]# mkdir x1
  3. [root@server1 cpu]# cd x1/
  4. [root@server1 x1]# ls
  5. cgroup.clone_children cpu.cfs_quota_us
  6. cgroup.event_control cpu.rt_period_us
  7. cgroup.procs cpu.rt_runtime_us
  8. cpuacct.stat cpu.shares
  9. cpuacct.usage cpu.stat
  10. cpuacct.usage_percpu notify_on_release
  11. cpu.cfs_period_us tasks
  12. [root@server1 x1]# cat cpu.cfs_period_us
  13. 100000 ##限制的长度
  14. [root@server1 x1]# cat cpu.cfs_quota_us
  15. -1 ##没有时间限制
  16. [root@server1 x1]# dd if=/dev/zero of=/dev/null & ##占用cpu
  17. [1] 3951
  18. [root@server1 x1]# top ##查看cpu的占有百分比(只有一个cpu)

在这里插入图片描述

若有两个cpu需要按下列操作:

  1. [root@server1 x1]# cd /sys/devices/system/cpu/
  2. [root@server1 cpu]# ls
  3. [root@server1 cpu]# cd cpu0/
  4. [root@server1 cpu]# echo 0 > online
  5. [root@server1 cpu]# lscpu

在这里插入图片描述
注意:
1.cpu.cfs_period_us:cpu分配的周期(微秒),默认为100000。
2.cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。如果设为50000,表示占用50000/100000=50%的CPU。

2.对cpu资源进行限制(docker容器)

1.清除之前创建的容器

  1. [root@server1 ~]# docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 7c111fe00da9 ubuntu "/bin/bash" About an hour ago Up About an hour vm1
  4. [root@server1 ~]# docker rm -f vm1
  5. vm1
  6. [root@server1 ~]# docker ps -a
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

2.对容器暂停,和解除暂停

  1. [root@server1 ~]# cd /sys/fs/cgroup/
  2. [root@server1 cgroup]# ls
  3. blkio cpu,cpuacct freezer net_cls perf_event
  4. cpu cpuset hugetlb net_cls,net_prio pids
  5. cpuacct devices memory net_prio systemd
  6. [root@server1 cgroup]# cd freezer/
  7. [root@server1 freezer]# ls
  8. cgroup.clone_children cgroup.sane_behavior release_agent
  9. cgroup.event_control docker tasks
  10. cgroup.procs notify_on_release
  11. [root@server1 freezer]# cd docker/
  12. [root@server1 docker]# ls
  13. cgroup.clone_children freezer.self_freezing
  14. cgroup.event_control freezer.state
  15. cgroup.procs notify_on_release
  16. freezer.parent_freezing tasks
  17. [root@server1 docker]# cat freezer.state
  18. THAWED ##显示开启状态

创建容器,并暂停

  1. [root@server1 docker]# docker run -it --name vm1 ubuntu
  2. root@797f2da104ec:/# [root@server1 docker]#
  3. [root@server1 docker]# ls
  4. 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5
  5. cgroup.clone_children
  6. cgroup.event_control
  7. cgroup.procs
  8. freezer.parent_freezing
  9. freezer.self_freezing
  10. freezer.state
  11. notify_on_release
  12. tasks
  13. [root@server1 docker]# docker ps
  14. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  15. 797f2da104ec ubuntu "/bin/bash" 29 seconds ago Up 27 seconds vm1
  16. [root@server1 docker]# docker container pause vm1 ##暂停容器vm1
  17. vm1
  18. [root@server1 docker]# cd 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5
  19. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# ls
  20. cgroup.clone_children freezer.self_freezing
  21. cgroup.event_control freezer.state
  22. cgroup.procs notify_on_release
  23. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad604978[root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# cat freezer.state FROZEN ##暂停状态
  24. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# cat tasks
  25. 4382 ##进程id
  26. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# ps ax ##进程4382显示暂停

在这里插入图片描述
打开暂停容器进程

  1. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# docker container unpause vm1
  2. vm1
  3. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# cat freezer.state
  4. THAWED
  5. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# docker ps
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. 797f2da104ec ubuntu "/bin/bash" 7 minutes ago Up 7 minutes vm1
  8. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# cat tasks
  9. 4382
  10. [root@server1 797f2da104ecda43a84eb833d2ed49900e6c5216ad60497865c5d269bce4faf5]# ps ax

在这里插入图片描述

设置swap和内存总共的大小(针对docker容器)

  1. [root@server1 ~]# docker run -it --name vm1 --memory 300MB --memory-swap 300MB ubuntu
  2. root@4057f95e93bf:/# free -m
  3. total used free shared buffers cached
  4. Mem: 992 442 550 12 0 261
  5. -/+ buffers/cache: 179 813
  6. Swap: 2047 0 2047
  7. root@4057f95e93bf:/# [root@server1 ~]#
  8. [root@server1 ~]# free -m
  9. total used free shared buff/cache available
  10. Mem: 992 133 558 12 300 695
  11. Swap: 2047 0 204

安全加固

1.容器中的内存信息和主机中的内存信息

  1. [root@server1 ~]# docker run -it --name vm1 --memory 300MB --memory-swap 300MB ubuntu
  2. root@4057f95e93bf:/# free -m
  3. total used free shared buffers cached
  4. Mem: 992 442 550 12 0 261
  5. -/+ buffers/cache: 179 813
  6. Swap: 2047 0 2047
  7. root@4057f95e93bf:/# [root@server1 ~]#
  8. [root@server1 ~]# free -m
  9. total used free shared buff/cache available
  10. Mem: 992 133 558 12 300 695
  11. Swap: 2047 0 2047

2.启用lxcfs

1.安装

  1. [root@server1 ~]# ls
  2. [root@server1 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y

在这里插入图片描述
2.启用(按enter)

  1. [root@server1 ~]# cd /var/lib/lxcfs/
  2. [root@server1 lxcfs]# ls
  3. [root@server1 lxcfs]# lxcfs /var/lib/lxcfs/ &
  4. [2] 4802
  5. [root@server1 lxcfs]# hierarchies:
  6. 0: fd: 5: freezer
  7. 1: fd: 6: memory
  8. 2: fd: 7: net_prio,net_cls
  9. 3: fd: 8: devices
  10. 4: fd: 9: blkio
  11. 5: fd: 10: perf_event
  12. 6: fd: 11: hugetlb
  13. 7: fd: 12: cpuacct,cpu
  14. 8: fd: 13: cpuset
  15. 9: fd: 14: pids
  16. 10: fd: 15: name=systemd
  17. [root@server1 lxcfs]#

3.启动lxcfs之后,会在/var/lib/lxcfs目录下生成两个目录

  1. [root@server1 ~]# cd /var/lib/lxcfs/
  2. [root@server1 lxcfs]# ls
  3. cgroup proc
  4. 如果在/var/lib/lxcfs目录下启动的lxcfs,之后需要重新进入才可以看到新生成的目录
  5. [root@server1 lxcfs]# ps ax | grep lxcfs
  6. 4802 pts/0 Sl 0:00 lxcfs /var/lib/lxcfs/

测试:

创建容器,限制内存发现限制成功

  1. [root@server1 ~]# docker run -it --name vm1 --memory 300MB --memory-swap 300MB \
  2. > -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
  3. > -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
  4. > -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
  5. > -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
  6. > -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
  7. > ubuntu

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,604人围观)

还没有评论,来说两句吧...

相关阅读

    相关 docker(11):安全

    1.内核名字空间 Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独

    相关 docker安全

    docker内部的隔离机制是通过namespace来做的,但是在Linux系统里面很多东西是不能通过namespace来隔离的,比如:时间。 容器的资源控制,而namesp

    相关 docker容器安全加固

    社区中常用的做法是利用lxcfs来提供容器中的资源可见性。lxcfs是一个开源的FUSE(用户态文件系统)实现来支持LXC容器。 LXCFS通过用户态文件系统,在容器中提供下

    相关 Docker 安全

    由内核的命名空间和控制组机制提供的容器内在安全 Docker 程序(特别是服务端)本身的抗攻击性