放弃的条件是入门Docker

本文将以比较简单的的方式让大家理解 docker,以平时常用到的测试环境为主,从用开始,慢慢理解 docker。

目录

0×00 用 docker 进行漏洞测试

0×01 docker 运行 busybox

0×02 Docker 搭建运行 apache-php 环境

0×03 用 Dockerfile 自动化构建可 ssh 登陆的镜像

0×04 Docker 搭建一个 wordpress 博客

0×05 Docker 容器互联

0×06 Docker 安全

0×00 用 docker 进行漏洞测试

vulhub 是一个开源的漏洞环境靶场(膜拜 p 牛一波)

接下来我们用 docker 来搭建一个 jboss 反序列漏洞的环境吧。

准备:Docker Docke-compose

以上环境安装方法:Docker 安装 Docker-compose 安装

什么?一开始就学这么难的?其实 docker 边用边学是比较合适的,用到什么学什么,没有必要从一大堆原理开始学。既然要学 docker,那就先装一个啦,边学边用。

那接下来就开始吧,其实也就一条命令。

https://raw.githubusercontent.com/vulhub/vulhub/master/jboss/CVE-2017-12149/docker-compose.yml

复制如上链接,然后保存到文件 docker-compose.yml,结果如下:Docker 从入门到放弃接下来,我们只需要

docker-compose up -d

Docker 从入门到放弃好了我们的靶场搭建完毕,访问 localhost:8080

接下来就可以进行漏洞复现了,步骤见:

https://github.com/vulhub/vulhub/blob/master/jboss/CVE-2017-12149/README.md

0×01 docker 运行 busybox

接下来我们边搭建环境边学习简单的 docker 命令

Busybox 是一个集成了三百多个最常用 Linux 命令和工具的软件,简单的 cat ls echo 等命令都集成在内,当然也有很多复杂的命令,我们就先来试试使用 docker 安装一个 busybox 吧

docker pull busybox

Docker 从入门到放弃

好了,我们 从 docker 官方库中得到了一个镜像

可以通过 docker images 查看到 id 以及其他信息,这里可以看到 busybox 镜像大小只有 1mb 左右

那接下来我们用这个 id 为 8c811b4aec35 的 busybox 镜像运行一下命令吧

先用来看下 ifconfig 命令

docker run 8c811b4aec35 ifconfig

Docker 从入门到放弃

可以看到,docker 使用 busybox 镜像创建了一个 busybox 容器,并且运行了我们的测试命令,而且 docker 运行的容器有自己的 ip 地址,这说明容器是一个相对独立的环境。

0×02 Docker 搭建运行 apache-php 环境

首先搜索下有哪些现成的 apache-php 环境

docker search apache-php

这里我们选择别人已经构建好的 start 数目较多的镜像:eboraas/apache-php

docker pull eboraas/apache-php

1.png

部署完成 还是用  docker images 查看我们 pull 到本地的镜像

 docker images

2.png

接下来我们进入到 id 为 1e9f5e13fb38 的容器

和之前的命令有些区别,因为我们运行的是 web 服务,所以我们需要把容器内部端口映射出来这样我们才能用外部的浏览器访问它。

docker run -itd -p 80:80 1e9f5e13fb38

好了,一个 apache+php 的容器就可以搭建成功,我们 可以在上面搭建其他服务了。

我们可以在宿主机 curl 测试一下我们 是否搭建成功(将容器放入后台可以使用 ctrl p+q)

Docker 从入门到放弃

Docker 从入门到放弃那我们 php 环境怎么样了呢?那就写一个 phpinfo 页面试试吧

Docker 从入门到放弃php 页面 创建好了,接下来我们需要将他放在docker 容器的 web 根目录 里, 这里需要用到 docker cp 命令

Docker 从入门到放弃使用 docker cp 命令复制到容器的 web 根目录/var/www/html/,这 里指定容器我直接 简写了开头的标识 4c1

Docker 从入门到放弃

可以看到,环境已经搭建好了。

我们已经在容器内做了改动 了,此时,如果我们停止容器,我们 的改动将会消失,如果我们想保存容器,那么就需要将我 们 的容器提交成镜像。

首先用 docker commit 提交成新镜像

docker commit -a “hayasec” -m "test.php" 4c1 haya/test

Docker 从入门到放弃此时可以查看一下镜像 id 然后使用 docker save 将镜 像导出

Docker 从入门到放弃Docker 从入门到放弃接下来我们可以将 test.tar 放到其他机器上,然后用 docker load 命令就可以进 行再次部署了。Docker 从入门到放弃这里已经载入镜 像了,我们可以用 docker tag 命令对 docker 镜像 进行命名

Docker 从入门到放弃这时候有个小问题,之前我们运行了一个 apache-php 容器,现在我们已经不需要它了,所以我们用 docker ps 查看镜像 id 然后用 docker stop 镜像 id  来停止它。

0×03 用 Dockerfile 自动化构建可 ssh 登陆的镜像

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基 础镜 像并最终创建一个新的镜像。

接下来就利用之前我们 pull 下来的 apache-php 镜像来制作一个可以 ssh 登陆的镜像吧

这里需要创建三个文件 Dockerfile run.sh sources163.txt,处于同级目录。

dockerfile 如下内容如下:

FROM eboraas/apache-php #设置基础镜像镜像
MAINTAINER haya #指定作者
COPY sources163.txt /etc/apt/sources.list #更换国内源
RUN apt-get -y update
RUN apt-get install -y openssh-server --force-yes #安装 ssh 服务
RUN mkdir -p /root/.ssh #创建 ssh 目录
ADD run.sh /run.sh #将 run.sh 添加到容器内
RUN chmod 755 /run.sh
EXPOSE 22 #为暴漏容器运行时的监听端口给外部
EXPOSE 80
EXPOSE 443
CMD ["/run.sh"] #容器启动时要运行的命令

run.sh 文件内容如下:

#!/bin/bash
service ssh start

sources163.txt 内容如下:

deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

然后利用这个 dockerfile 构建镜像

Docker 从入门到放弃

镜像构建完毕后,可以看到:

Docker 从入门到放弃然后运行镜像

docker run -itd -p 22222:22 57b46801d43c

这时候看到,内部容器的 ssh 服务的 22 端口已经被映射到本机 22222 端口了

Docker 从入门到放弃接下来通过 ssh 服务连接容器

Docker 从入门到放弃这时候有个问题,我们并不知道容器的密码是多少?怎么办呢?

而且这里需要注意一点是 ssh 的默认配置是不允许 root 登录的,我们需要添加一个用户或者修改 sshd_config,这里进入容器的方法就有很多了

第一种:进入容器添加用户

第二种:最开始 build 镜像的时候将自己的公钥添加进容器内的~/.ssh/authorized_keys,然后实现免密码 ssh 登录

第三:通过 docker exec -it 98defd0c6e6b /bin/bash 进入容器添加用户修改密码,在通过 ssh 登录

第四:修改 ssh 配置文件

这里说一下第一种,我们先用 docker exec 进入容器,然后添加一个可登录的用户

Docker 从入门到放弃

添加用户、修改完密码之后,我们再次登录

Docker 从入门到放弃

到这里,我们就完成了利用 dockerfile 对原镜像添加功能。

随后我们可以通过 docker commit 将目前我们修改过的容器再次提交成一个新的镜像。

Docker 从入门到放弃Docker 从入门到放弃

现在一个 apache-php-ssh 的镜像我们就制作完毕了Docker 从入门到放弃0×04 Docker 搭建一个 wordpress 博客

最开始我们尽量使用最简单方法部署,这里我们用到的是 docker-compose。

Docker Compose 是 Docker 官方 编排(Orchestration)项 目之一, 负责快速的部署分布式应用

这里用到的 github 中的一个开源项目,作者已经编写好用于 worfpress 的 docker-compose 文件,接下来我们只需要直接部署就行。

项目地址:https://github.com/nezhar/wordpress-docker-compose

我们将项目 clone 下来

Docker 从入门到放弃docker-compose.yml 是容器运行的关键,具体编写方法可以参考:

https://docs.docker.com/compose/

我们 clone 下来的是别人写好的项目,所以可以直接用了

Docker 从入门到放弃然后 docker-compose up -d 启动

Docker 从入门到放弃docker  ps 可以看到容器运行情况,这里启动了 wordpress、mysql 两个容器,分别映射到了 127.0.0.1 的 80、3306 端口Docker 从入门到放弃接下来访问 127.0.0.1 即可Docker 从入门到放弃到这里,wordpress 已经搭建完毕, 我们结束它吧Docker 从入门到放弃0×05 Docker 容器互联

接下来讲解docker 容器通信。

网上大量文章采用 docker link 进行连接,根据目前官方文档 –link 是一个被遗弃,最终可能会被删除的命令。

Docker 从入门到放弃所以这里我们使用 docker networks 进行容器连接,我们将启动两个容器,一个 apache-php 一个 mysql,然后用 docker network 对容器进行连通。

首先创建一个名为 test-net 的网络,默认连接方式 bridge.

Docker 从入门到放弃启动一个 mysql 容器,映射 3306 端口,连接到 test-net 网络,设置别名为 db,设置 mysql 密码为 password

Docker 从入门到放弃启动一个 apache-php 容器,映射 80 端口,连接到 test-net 网络,设置别名为 webDocker 从入门到放弃

tips:遇到容器已经存在的报错

docker 停止所有容器 docker stop $(docker ps -q)

docker 删除所有容器 docker rm $(docker ps -aq)

接下来我们进入到其中一个容器,初始容器是没有 ping 命令的,所以我们现在安装 ping

更新源

Docker 从入门到放弃然后安装 ping

apt-get install iputils-ping

接下里我们在 apache-php 容器 ping mysql 容器,可以看到 mysql 容器与 apache 容器实现互联。

Docker 从入门到放弃

0×06 Docker 安全

docker 安全主要体现在以下方面

docker 容器的安全性

镜像的安全性

docker daemon 的安全性

——-摘自 Docker 进阶与实战

容器安全性的根源在于,容器和 host 共用内核,因此受攻击面特别大。

这里就抛砖引玉地讲一下 docker 虚拟机逃逸。

Docker 与宿主机是共享内核的,一旦内核出现漏洞,那么docker 容器的安全问题将危机到宿主机。

这里以大名鼎鼎的 Dirty COW 脏牛为例,演示 docker 逃逸。

在做这个实验之前,我们先了解下脏牛漏洞。

脏牛是一个 linux 本地提权漏洞,脏牛漏洞(CVE-2016_5195)是公开后影响范围 最广和最深的漏洞之一,这十年来的每一个 Linux 版本,包括 Android 、桌面版和服务器版都受到其影响。

具体影响范围见:https://m.aliyun.com/yunqi/articles/63023

我们现在一个下载一个 ubuntu14.04 镜像来对漏洞进行 简单地复现

为了试验方便,我选择直接用 vmware 搭建虚拟机。

Docker 利用脏牛逃逸的关键在于宿主机存在脏牛漏洞

Docker 从入门到放弃这样的内核版本是存在脏牛的,我们可以在主机上创建一个低权限用户(可读权限即可),然后提权,由于可读即可写,所以利用方式很多,具体见:

POCS:https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs

我用到的 POC:https://github.com/gbonacini/CVE-2016-5195

  • 通过替换/ etc / passwd 为用户提供 root 权限

git clone   make 编译运行。

Docker 从入门到放弃这样就可以直接提权了,这节主要关注 docker 安全,所以这里不再细讲。

接下来我们给虚拟机安装 docker

apt-get install docker.io

然后 pull 一个带了 POC 的容器(这样做主要是为了方便,当然也可以用其他的)

POC 地址:https://github.com/scumjr/dirtycow-vdso

Docker 从入门到放弃

Docker 从入门到放弃然后运行镜像 进入容器 make 编译 POC

Docker 从入门到放弃运行

Docker 从入门到放弃

注意,这里并不是每次都能成功的,失败之后 vdso_patch 数组也会被填充,payload 的内存地址数据不 为 0,无法再次复现。失败输出:

[-] failed to win race condition…

[-] failed to restore vDSO

这时候无法再次做实验了,如果用虚拟机的话做之前最好做一个快照。

Docker 从入门到放弃这里可以看到,已经完全获得宿主机的权限了。

实际生产环境中,还经常遇到一个问题

docker 通过环境变量的方式传递 MySQL 存储引擎的密码,所以造成 mysql 密码是明文

Docker 从入门到放弃

比较流行的解决办法是

一、

1.创建两个 MySQL 容器 MySQL1 与 MySQL2,MySQL 的 root 密码分别为 daocloud 与 docker;

2.待 MySQL1 启动完毕,使用 docker stop 命令停止 MySQL1 容器,并将 MySQL1 容器的 volume1 全部拷贝出来,最终使用 docker rm 命令删除 MySQL1 容器;

3.待 MySQL2 启动完毕,使用 docker stop 命令停止 MySQL2 容器,并将 MySQL2 容器 volume2 内的文件全部删除,接着将 volume1 的内容拷贝至 volume2 下,最终启动 MySQL2。

Docker 从入门到放弃详见:https://www.csdn.net/article/2015-12-21/2826519

二、

还可以使用docker swarm 提供的 secret 机制,它允许将敏感信息加密后保存到 secret 中,用户可以指定哪些容器可以使用此 secret

详见:如何使用 swarm 中的 secret

最后的建议:Docker 近几年发展迅速,官方为 Docker 的发展付出了很大的努力。官方了大量的官方文档可以帮助我们更好地理解和使用 Docker,日常阅读官方文档、更新日志是很有必要的。

Docker 官方文档

Docker 命令文档


Summer Blog , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:放弃的条件是入门 Docker
喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址