一、docker安全问题

1、共享内核

docker的安全问题一直被业内所诟病,而导致这个问题的原因也是多种多样的,而最关键的一个点在于,容器和宿主机共享一个内核。虽然docker借助了namespace来实现隔离,但是隔离只实现了PID、MOUNT、NETWORK、UTS、IPC、USER,其他未隔离的资源仍存在巨大的风险。比如docker没有对procfs进行隔离,可以访问到宿主机信息

  1. [root@VM-0-13-centos ~]# docker run -d nginx
  2. 20f0c4c7a10b5184d9988d823d0050cc01221edd9e1ecd0a2f08f4640ba7c4e2
  3. [root@VM-0-13-centos ~]#
  4. [root@VM-0-13-centos ~]# docker exec -it 20f0c4c7a10b5184d9988d823d0050cc01221edd9e1ecd0a2f08f4640ba7c4e2 bash
  5. root@20f0c4c7a10b:/# ls /proc/1
  6. buddyinfo cpuinfo driver interrupts kcore kpageflags misc pagetypeinfo self sys tty zoneinfo 28 bus crypto execdomains iomem key-users loadavg modules partitions slabinfo sysrq-trigger uptime 29 cgroups devices fb ioports keys locks mounts sched_debug softirqs sysvipc version 34 cmdline diskstats filesystems irq kmsg mdstat mtrr schedstat stat timer_list vmallocinfo acpi consoles dma fs kallsyms kpagecount meminfo net scsi swaps timer_stats vmstat
  7. root@20f0c4c7a10b:/# cat /proc/cpuinfo
  8. processor : 0
  9. vendor_id : AuthenticAMD
  10. cpu family : 23
  11. model : 49
  12. model name : AMD EPYC 7K62 48-Core
  13. Processor stepping : 0
  14. microcode : 0x1000065
  15. cpu MHz : 2595.124
  16. cache size : 512 KB
  17. physical id : 0
  18. siblings : 1
  19. core id : 0
  20. cpu cores : 1
  21. apicid : 0
  22. initial apicid : 0
  23. fpu : yes
  24. fpu_exception : yes
  25. cpuid level : 13
  26. wp : yes
  27. flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm art rep_good nopl extd_apicid eagerfpu pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext retpoline_amd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 arat
  28. bogomips : 5190.24
  29. TLB size : 1024 4K
  30. pages clflush size : 64
  31. cache_alignment : 64
  32. address sizes : 48 bits physical, 48 bits
  33. virtual power management:

可以看到,容器内通过procfs读到了cpu的信息

2、docker引入的安全问题

2.1、docker自身漏洞

docker作为一款应用,我们在CVE官方通过docker这一关键词搜索,就出现了数十条记录

囊括了代码执行、权限、隔离等方面,当然了,docker自身迭代非常快,这类问题可以通过迭代到最新版来避免。

2.2、docker源引入的问题

image作为docker的部署包,用户是可以自行上传镜像到docker hub,分享给他人使用,就像node的工具集一样,但是,当镜像内被人恶意植入木马或者是引入了具有漏洞的软件时,image也就存在了风险。

2.3、root权限

这里的root包括两个方面,一是docker以root权限启动,给与了软件过高的权限,二是构建镜像时未使用USER来实现images的降权,从而使容器获得root权限。

2.4、环境引入的漏洞

这个就包括很多方面了,比如网络攻击,比如DDOS供给,再比如系统自身未修复的漏洞等等。

二、如何应对docker安全问题

1、针对镜像的安全优化

1.1、搭建私有镜像仓库
为了避免从第三方引入存在风险的镜像,可选择搭建私有仓库,同时从官方拉取基础镜像,如centos,ubuntu,debian等等,根据自己的需求来构建业务镜像。
1.2、选择可信的软件安装源
在构建镜像时,选择可靠的安装源,如阿里源,清华大学源,华为云源等等,如果选择部署包部署,需从官网下载,同时校验md5以确保部署包的安全性,同时尽可能少的引入第三方软件,来减少安全漏洞。
1.3、启用镜像扫描机制,以确保镜像的安全性,避免将有安全漏洞的镜像引入生产环境。
1.4、及时清理无用的镜像。
1.5、尽可能避免使用root启动容器服务。

2、针对容器级别的优化

2.1、确保容器为单进程模式,避免出现多个主进程,同时限制进程数,避免fork炸弹。
2.2、禁止在容器内构建ssh服务。
2.3、设置 on-failure,避免频繁重启给系统带来过大压力而引发其他问题。

3、针对内核的优化

3.1、及时更新内核,针对存在安全漏洞的内核,需要及时更新。
3.2、禁止将敏感目录映射到容器内。
3.3、对docker的文件进行审计,包括但不限于日志,数据文件。
3.4、周期性检查容器,清理不必要容器。

4、使用非root权限启动docker