虚拟化容器引擎——docker(一)基础

1501113044   ·   发表于 1个月前   ·   技术文章

1. Dcoker 与虚拟机的区别

隔离与共享:虚拟机通过添加hypervisor层,虚拟出网卡、内存、CPU等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。而docker容器则是通过隔离的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限、CPU资源等进行控制,最终让容器之间互不影响,容器无法影响宿主机。容器与宿主机共享内核、文件系统、硬件等资源。
性能与损耗:与虚拟机相比,容器资源损耗要小得多。同样的宿主机下,能够建立容器的数量要比虚拟机多得多。但是,虚拟机的安全性要比容器好一些,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破hypervisor层,这是极其困难的。而docker容器与宿主机共享内核、文件系统等资源,更有可能对其他容器,宿主机产生影响。

2. Docker 存在的安全问题

Docker 自身漏洞:Docker 作为一款应用本身实现上会有代码缺陷。CVE官方记录docker历史版本共有超过20项漏洞,参见
https://docs.docker.com/engine/security/non-events/。
黑客常用攻击手段主要有代码执行、权限提升、信息泄露、权限绕过这几类。
Docker版本更迭非常快,Docker用户最好将docker升级为最新版本。
Docker源码问题:Docker提供了Docker hub,可以让用户上传创建的镜像,以便其他用户下载,快速搭建环境。但同时也带来了一些安全问题。下载的镜像被恶意植入后门,传输的过程中镜像被篡改,镜像所搭建的环境是否本身就包含漏洞等等。
接下来主要介绍下面三种:
1)黑客上传恶意镜像: 如果有黑客在制作的镜像中植入木马、后门等恶意软件,那么环境从一开始就已经不安全了,后续更没有什么安全可言。
2)镜像使用有漏洞的软件:据一些报告显示,hub上能下载的镜像里面,75%的镜像都安装了有漏洞的软件。所以下载镜像后,需要检查里面软件的版本信息,对应的版本是否存在漏洞,并及时更新打上补丁。
3)中间人攻击篡改镜像:镜像在传输过程中可能被篡改,目前新版本的Docker已经提供了相应的校验机制来预防这个问题。

3. Docker架构缺陷与安全机制

由Docker本身的架构与机制可能产生的问题,这一攻击场景主要产生在黑客已经控制了宿主机上的一些容器(或者通过在公有云上建立容器的方式获得这个条件),然后对宿主机或其他容器发起攻击来产生影响。
容器之间的局域网攻击:主机上的容器之间可以构成局域网,因此针对局域网的ARP欺骗、嗅探、广播风暴等攻击方式便可以用上。所以,在一个主机上部署多个容器需要合理的配置网络,设置iptable规则。
DDoS攻击耗尽资源:cgroups安全机制就是要防止此类攻击的,不要为单一的容器分配过多的资源即可避免此类问题。
有漏洞的系统调用:Docker与虚拟机的一个区别就是,Docker与宿主机共用一个操作系统内核。一旦宿主内核存在可以越权或者提权漏洞,那么尽管Docker使用普通用户执行,在容器被入侵时,攻击者还可以利用内核漏洞逃逸到宿主机做更多的事情。
共享root用户权限:如果以root用户权限运行容器,容器内的root用户也就拥有了宿主机的root权限。

4. Docker 安全基线标准

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

5、docker的安装及基础用法

在了解用法之前需要知道docker由什么组成:
1)docker客户端/服务端
2)docker image 系统/服务的镜像
3)registry 仓库
4)docker容器

10440-z8ca5a31c4k.png

组件的意义:
docker客户端/服务端:其实就是常说的c/s架构,docker客户端只需要向docker服务器或者守护进程发送请求,服务器或者守护进程接受请求并全部处理完成后返回结果,守护进程也被称为docker引擎。
docker镜像:我们基于镜像才能运行自己的容器,需要知道,镜像是可读但不可写的,我们平常运行的容器相当于在原有的镜像上面镀了一层保护层。我们也可以把镜像当做是一个体积非常小、启动速度非常快、非常便携、易于分享、存储和更新的微型系统。
registry 仓库:分为公有仓库和私有仓库,我们可以将自己制作的镜像上传至仓库,公有仓库是公共的、谁都可以下载的,私有仓库为私密仓库,只有在团队或者组织内部可见的镜像。
docker容器:用户通过镜像部署和构建的容器,可以把自己需要的服务、应用程序打包放到容器内,简单说docker容器就是一个镜像格式、一个标准的操作系统、一个执行环境。
docker安装的需求非常低,只需要内核版本>=3.8以上的linux系统都可以安装。
docker安装:

1. 准备虚拟机环境
本地演示,不在云上面搞了
虚拟机:CentOS 7.6一台
IPaddr:192.168.163.130
GW:192.168.163.2
DNS:192.168.163.2
2. 配置yum仓库

  1. [root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  2. [root@localhost yum.repos.d]# yum update

3. 安装docker

安装依赖包

  1. [root@localhost yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker源

  1. [root@localhost yum.repos.d]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

检查docker版本信息

  1. [root@localhost yum.repos.d]# yum list docker-ce --showduplicates | sort -r

29205-qlum6jmgs9r.png

安装docker,选择最新版的安装

  1. [root@localhost yum.repos.d]# yum install docker-ce-18.06.3.ce

启动docker

  1. [root@localhost yum.repos.d]# systemctl start docker && systemctl enable docker
  2. 至此,docker安装完成,下面介绍docker基本操作

4. docker的基本操作(命令)

1)查看docker版本

  1. [root@localhost yum.repos.d]# docker version
  2. Client:
  3. Version: 18.06.3-ce
  4. API version: 1.38
  5. Go version: go1.10.3
  6. Git commit: d7080c1
  7. Built: Wed Feb 20 02:26:51 2019
  8. OS/Arch: linux/amd64
  9. Experimental: false
  10. Server:
  11. Engine:
  12. Version: 18.06.3-ce
  13. API version: 1.38 (minimum version 1.12)
  14. Go version: go1.10.3
  15. Git commit: d7080c1
  16. Built: Wed Feb 20 02:28:17 2019
  17. OS/Arch: linux/amd64
  18. Experimental: false

2)拉取镜像,启动容器

  1. docker search 搜索公共仓库中的镜像,如下面的搜索kali的镜像
  2. [root@localhost yum.repos.d]# docker search kali

64888-uld59kfh5f9.png

docker pull拉取镜像命令

也可以说下载镜像,只需要将想要下载的镜像的名字打在命令后面就行

  1. [root@localhost yum.repos.d]# docker pull kalilinux/kali
  2. ![76998-qpdtfxqq4t8.png](https://oss.iydui.com/blog/2020/09/25/76998-qpdtfxqq4t8.png)
  3. docker image list 将服务器中现有的镜像以列表的方式显示出来
  4. [root@localhost yum.repos.d]# docker image list
  5. REPOSITORY TAG IMAGE ID CREATED SIZE
  6. kalilinux/kali latest c824257d77f8 2 days ago 152MB

docker create创建容器命令

  1. [root@localhost yum.repos.d]# docker create -it kalilinux/kali /bin/bash //将镜像名为kalilinux/kali的镜像分配一个伪tty终端(-t选项),并以交互的方式运行容器(-i选项),且解释器环境为/bin/bash
  2. [root@localhost yum.repos.d]# docker create -ti c824257d77f8 /bin/bash //当然,除了可以用镜像的名称创建容器外,也可以用镜像的编号来创建容器

docker ps 查看容器命令

  1. [root@localhost yum.repos.d]# docker ps
  2. ![15833-0ab57gxbwfqp.png](https://oss.iydui.com/blog/2020/09/25/15833-0ab57gxbwfqp.png)
  3. docker ps 如果不加参数-a的话,是无法看到未启动的容器的。
  4. [root@localhost yum.repos.d]# docker ps -a

11139-kxwtgjcale.png

docker start 启动容器命令

  1. [root@localhost yum.repos.d]# docker start a41431c150eb
  2. [root@localhost yum.repos.d]# docker ps

58810-yqszk63xgg.png

docker stop 停止容器命令

  1. [root@localhost yum.repos.d]# docker stop a41431c150eb
  2. [root@localhost yum.repos.d]# docker ps

76720-e0cd9di1xb4.png

docker rm 删除容器命令

  1. [root@localhost yum.repos.d]# docker rm a41431c150eb //只能删除未运行的容器,如果想要删除正在运行的容器需要加选项-f。

34789-q9kvrphsaw.png

docker rmi 删除镜像命令

  1. [root@localhost yum.repos.d]# docker image list
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. kalilinux/kali latest c824257d77f8 2 days ago 152MB
  4. [root@localhost yum.repos.d]# docker rmi kalilinux/kali
  5. Untagged: kalilinux/kali:latest
  6. Untagged: kalilinux/kali@sha256:b86fddf006c6c5d942108d627fe7bbcaff7abb1638cddc2a8f52055af6ade65e
  7. Deleted: sha256:c824257d77f8de379834ba60d699806e42d5796768a5c623432121bc5e0360ae
  8. Deleted: sha256:7a89498604c53997481d626281a2edfd1dae9deca57d6e81a8e2c93c4a538b96

57078-r5bcw196eu.png

docker export 容器导出命令

  1. [root@localhost yum.repos.d]# docker export e9754ed4e2be > docker_kali_tar
  2. [root@localhost ~]# ll
  3. 总用量 154296
  4. -rw-------. 1 root root 1221 7月 8 18:10 anaconda-ks.cfg
  5. -rw-r--r--. 1 root root 157992960 9月 25 13:22 docker_kali_tar //此文件为docker容器导出的压缩文件

容器的导入

  1. [root@localhost ~]# docker image list

05818-xziba6bwj8.png

  1. [root@localhost ~]# cat docker_kali_tar | docker import - kali_linux //将刚才导出的压缩文件中的内容导出为镜像

82495-ohe5kzn1p0c.png

用户名金币积分时间理由
Track-聂风 30.00 0 2020-09-25 15:03:11 加油,同学~

打赏我,让我更有动力~

0 Reply   |  Until 1个月前 | 318 View
LoginCan Publish Content
返回顶部 投诉反馈

掌控者 © 2016. All Rights Reserved. 掌控者

Powered by 掌控者 Version 2.1.3