CENTO OS上的网络安全工具(十七)搭建Cascade的Docker开发环境

这一篇,我们继续在Docker上折腾。之前我们已经展示了如何在容器上搭建安全产品的部署环境,这里我们需要更进一步,讨论如何在容器上搭建开发与调试环境。这是学习安全产品并且自己构建安全产品的基础步骤。 

一、 构建开发镜像

鉴于前期我们一直在VSCODE环境中讨论编程与调试的问题。所以在Docker中构建开发环境,我们在IDE上仍然首选VSCODE。但在这之前,我们还需要构建起一个可承载调试环境的镜像。

我们选择从centos:centos7(7.9.2009)官方镜像中构造开发环境。三点考虑:一是这个系统我们一直再用比较熟悉;二是centos-stream-8正在商用化,官方无镜像,且第三方可用的镜像较大,centos8已结束支持;三是centos7版本比较成熟,掉坑可能性要小很多。

C:\Users\lhyzw>docker run -it --name pigdev centos:centos7 bash
[root@aea73297ce7c /]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
[root@aea73297ce7c /]#

然后安装我们常用的三种编程环境:C/C++、Java、Python:

(一) gcc gdb gcc-c++

首先需要安装的是C/C++的开发调试环境,在centos:centos7镜像中并没有默认安装,但在后期安装诸如Python环境的时候,需要基于源代码进行编译,所以需要先行一步。在镜像源正常情况下,安装相对简单,之前文章也有涉及,不赘述:

[root@aea73297ce7c /]# yum install -y gcc gdb gcc-c++ make
………………
[root@aea73297ce7c /]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@aea73297ce7c /]# gdb -v
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
[root@aea73297ce7c /]# g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@aea73297ce7c Python-3.7.0]# make --version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@aea73297ce7c /]# yum install -y gcc gdb gcc-c++ make
………………
[root@aea73297ce7c /]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@aea73297ce7c /]# gdb -v
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
[root@aea73297ce7c /]# g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@aea73297ce7c Python-3.7.0]# make --version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

再次提及一下,C++的安装包名字为gcc-c++,但是命令是g++。……

(二)安装Python 3.7

实际上centos:centos7镜像中已经提供了python 2.7.5:

[root@aea73297ce7c /]# python

Python 2.7.5 (default, Oct 14 2020, 14:45:30)

[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> quit()

但是现在大多数应用都需要python3来开发。另外,VSCODE的python extension插件现在已经不支持低于3.7.0版本的python,所以我们还需要安装好python3的环境

另一层考虑在于我们需要开发或这调试的对象及其支撑环境。比如前篇提及的cascade,在python 3.11下会发生版本支持问题,我们在3.6.8中测试成功。所以为了尽量满足多方,我们选择3.7版本进行安装。

1. 源码下载

首先到Python官方站的源码下载页面Python Source Releases | Python.org,网页上搜索3.7.0,复制链接后在centos中下载:

 centos:centos7中curl可用,若使用wget需要另行安装:

[root@aea73297ce7c opt]# curl -o python-src-3.7.0.tgz https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 71 21.6M   71 15.5M    0     0  56360      0  0:06:43  0:04:49  0:01:54 75925
[root@aea73297ce7c opt]# tar -zxvf python-src-3.7.0.tgz
Python-3.7.0/
Python-3.7.0/Doc/
Python-3.7.0/Doc/c-api/
Python-3.7.0/Doc/c-api/sys.rst
Python-3.7.0/Doc/c-api/conversion.rst
………………

2. 安装条件准备

另外,需要提前准备好zlib解压缩工具

[root@aea73297ce7c Python-3.7.0]# yum install zlib-devel -y

 否则会有如下错误:

[root@aea73297ce7c Python-3.7.0]# make&&make install

………………………………

zipimport.ZipImportError: can't decompress data; zlib not available

make: *** [install] Error 1

还需要准备好openssl-devel和libffi-devel开发包:

[root@aea73297ce7c Python-3.7.0]# yum install -y openssl-devel libffi-devel

否则会有“pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.”及如下错误:

[root@aea73297ce7c Python-3.7.0]# make&&make install

………………………………

    from _ctypes import Union, Structure, Array

ModuleNotFoundError: No module named '_ctypes'

make: *** [install] Error 1

3. 配置编译选项

配置编译程序,使用—prefix指定安装位置,避免安装后出现在系统中多个地方,并设置—enable-optimizations,对python进行优化,提升运行速度。其它配置选项可使用./configure –help查看。

[root@aea73297ce7c opt]# ls

Python-3.7.0  python-src-3.7.0.tgz

[root@aea73297ce7c opt]# cd Python-3.7.0/

[root@aea73297ce7c Python-3.7.0]# ls

Doc      LICENSE  Makefile.pre.in  Objects  Parser    README.rst  config.guess  configure.ac  pyconfig.h.in

Grammar  Lib      Misc             PC       Programs  Tools       config.sub    install-sh    setup.py

Include  Mac      Modules          PCbuild  Python    aclocal.m4  configure     m4

[root@aea73297ce7c Python-3.7.0]# ./configure --enable-optimizations --prefix=/usr/local/python3

checking build system type... x86_64-pc-linux-gnu

checking host system type... x86_64-pc-linux-gnu

checking for python3.7... no

checking for python3... no

checking for python... python

………………………………


4. 安装,并耐心而漫长的等待

[root@aea73297ce7c Python-3.7.0]# make&&make install

………………………………

我不知道真是情况下需要多久,总之我在R9000P上都折腾了将近10分钟。也许是选择了优化选项的缘故。

5. 配置软链接

因为我们使用—prefix选项指定了安装位置,所以需要将其软连接到/usr/bin下面

[root@aea73297ce7c Python-3.7.0]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
[root@aea73297ce7c Python-3.7.0]# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

相对于将其直接链接到python而导致2.7不能用,我还是更习惯于将其链接到pythone3上。

6. 验证

[root@aea73297ce7c /]# python -V

Python 2.7.5

[root@aea73297ce7c /]# python3 -V

Python 3.7.0 (default, Dec 12 2022, 07:47:37)

[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

[root@aea73297ce7c /]# pip3 -V

pip 10.0.1 from /usr/local/python3/lib/python3.7/site-packages/pip (python 3.7)

[root@aea73297ce7c /]#

7. Ubuntu下的情况

如果是在Ubuntu系统下,这些需要预先安装的软件包的名称是:dist-upgrade build-essential python-dev python-setuptools python-pip python-smbus libncursesw5-dev libgdbm-dev libc6-dev libsqlite3-dev tk-de libssl-dev openssl libffi-dev

我没尝试。有兴趣可参考Python安装报错:”ModuleNotFoundError:No module named _ctypes“ 的解决方案_六指黑侠i的博客-CSDN博客

(三)安装JDK

JDK的安装要相对简单很多,前面的文章也多有涉及,不赘述。经验来看,JDK 11这个版本支持的场景多,相对也稳定,就它了。centos:centos7镜像没有自带JDK,所以直接安装就好。

[root@aea73297ce7c /]# yum install java-11-openjdk* -y
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
………………
[root@aea73297ce7c /]# java --version
openjdk 11.0.17 2022-10-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.17.0.8-2.el7_9) (build 11.0.17+8-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.17.0.8-2.el7_9) (build 11.0.17+8-LTS, mixed mode, sharing)
[root@aea73297ce7c /]#

(四)将当前容器转换为镜像

最终构建开发环境镜像有2种方法。一种是构建Dockerfile,将上面的步骤一一执行一遍;另一种是直接从上面已经安装好的容器里直接导出并转换。

出于后面设置VSCODE时还会用到的原因,我们打算两种都试一下。

1. 直接导出镜像

直接从当前已经安装好的容器,使用export方法导出文件系统,然后再使用import方法导入成镜像即可。作为镜像来说,1.53GB相当不小了。

F:\VM\share>docker ps -a
CONTAINER ID   IMAGE            COMMAND   CREATED       STATUS       PORTS     NAMES
aea73297ce7c   centos:centos7   "bash"    5 hours ago   Up 5 hours             pigdev
F:\VM\share>docker export -o pigdev.tar pigdev
F:\VM\share>docker import pigdev.tar pig/centos7:dev
sha256:186acb4411abbb204e5bce69409069e29d3962cfd179042b7a458aa04fdfe8eb
F:\VM\share>docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
pig/centos7   dev       186acb4411ab   47 seconds ago   1.53GB
ubuntu        bionic    251b86c83674   3 days ago       63.1MB
debian        latest    291bf168077c   6 days ago       124MB
ubuntu        latest    a8780b506fa4   5 weeks ago      77.8MB
centos        centos7   eeb6ee3f44bd   15 months ago    204MB
centos        latest    5d0da3dc9764   15 months ago    231MB

2. centos开发环境Dockerfile

将上面的步骤挨个写到如下的Dockerfile中。一般来说,一个RUN命令Docker会构建一个层,所以应该尽量使用&&来连接命令,并且将属于同一个任务的命令统筹到一个RUN当中去。

FROM centos:centos7

WORKDIR /opt

#更换镜像源

RUN sed  -e 's|^mirrorlist=|#mirrorlist=|g' \

         -e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \

         -i.bak \

         /etc/yum.repos.d/CentOS-*.repo

#C/C++环境

RUN yum install -y gcc gdb gcc-c++ make

#Python环境

RUN curl -o python-src-3.7.0.tgz https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz \

    && tar -zxvf python-src-3.7.0.tgz \

    && cd Python-3.7.0 \

    && yum install -y zlib-devel openssl-devel libffi-devel \

    && ./configure --enable-optimizations --prefix=/usr/local/python3 \

    && make \

    && make install \

    && ln -s /usr/local/python3/bin/python3 /usr/bin/python3 \

    && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

   

#Java环境

RUN yum install java-11-openjdk* -y

CMD /bin/bash

然后在windows下建立一个空目录,将Dockerfile扔进去,比如在我建立的空目录的名称是dockerbuild。从CMD进入到该目录下执行docker build命令即可:

F:\dockerbuild>docker build -t pig/centos7:code .

[+] Building 1334.9s (8/8) FINISHED

 => [internal] load build definition from Dockerfile                                                      0.0s

 => => transferring dockerfile: 665B                                                                      0.0s

 => [internal] load .dockerignore                                                                         0.0s

 => => transferring context: 2B                                                                           0.0s

 => [internal] load metadata for docker.io/library/centos:centos7                                         0.0s

 => [1/5] FROM docker.io/library/centos:centos7                                                           0.0s

 => [2/5] WORKDIR /opt                                                                                    0.0s

 => [3/5] RUN yum install -y gcc gdb gcc-c++ make                                                       209.5s

 => [4/5] RUN curl -o python-src-3.7.0.tgz https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz    1123.6s

=> CANCELED [5/5] RUN yum install java-11-openjdk* -y                                                  605.1s

context canceled

看看构建镜像所需要耗费的时间~~~,早知道先给centos:centos7换个镜像源,也许还能快一点。不过好在docker是按照RUN分层构建得,前4步都成功的情况下,掐断了更改一下5、6步也可以“断点续建”。当然,如果是从头开始的话,还是应该在一开始就更换源——如上面蓝色字体部分所示。

F:\dockerbuild>docker build -t pig/centos7:code .

[+] Building 1816.0s (10/10) FINISHED

 => [internal] load build definition from Dockerfile                                                      0.0s

 => => transferring dockerfile: 895B                                                                      0.0s

 => [internal] load .dockerignore                                                                         0.0s

 => => transferring context: 2B                                                                           0.0s

 => [internal] load metadata for docker.io/library/centos:centos7                                         0.0s

 => [1/6] FROM docker.io/library/centos:centos7                                                           0.0s

 => CACHED [2/6] WORKDIR /opt                                                                             0.0s

 => CACHED [3/6] RUN yum install -y gcc gdb gcc-c++ make                                                  0.0s

 => CACHED [4/6] RUN curl -o python-src-3.7.0.tgz https://www.python.org/ftp/python/3.7.0/Python-3.7.0.t  0.0s

 => [5/6] RUN sed -e 's|^mirrorlist=|#mirrorlist=|g'          -e 's|^#baseurl=http://mirror.centos.org|b  0.3s

 => [6/6] RUN yum install java-11-openjdk* -y                                                          1813.4s

 => exporting to image                                                                                    2.2s

 => => exporting layers                                                                                   2.2s

 => => writing image sha256:bfe277180b5f12ff801cdfd97d711f2d6fdbf5e5361aa89a9841d7c606eb30f2              0.0s

 => => naming to docker.io/pig/centos7:code                                                               0.0s

现在我们得到又一个开发环境镜像,由于我们没删掉下载的python源码包,这个镜像有点儿大:

F:\dockerbuild>docker images

REPOSITORY    TAG       IMAGE ID       CREATED          SIZE

pig/centos7   code      bfe277180b5f   53 minutes ago   1.92GB

pig/centos7   dev       52c6f118f6f6   3 hours ago      1.53GB

ubuntu        bionic    251b86c83674   3 days ago       63.1MB

debian        latest    291bf168077c   6 days ago       124MB

ubuntu        latest    a8780b506fa4   5 weeks ago      77.8MB

centos        centos7   eeb6ee3f44bd   15 months ago    204MB

centos        latest    5d0da3dc9764   15 months ago    231MB

当然,还有一个办法。之前我们采用导入导出方式的时候,导出容器的那个tar包,其实里面已经包含了我们之前下载过的python源码包,可以借用一下,放在dockerbuild目录中,只不过Dockerfile下载那句得改成COPY了(用ADD还能再简洁一点,docker会直接解压)。

 两种方式的对比如下:

PS D:\lhyprogram\testcontainer> docker history pig/centos7:code

IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT

bfe277180b5f   15 hours ago    CMD ["/bin/sh" "-c" "/bin/bash"]                0B        buildkit.dockerfile.v0

<missing>      15 hours ago    RUN /bin/sh -c yum install java-11-openjdk* …   825MB     buildkit.dockerfile.v0

<missing>      15 hours ago    RUN /bin/sh -c sed -e 's|^mirrorlist=|#mirro…   30.1kB    buildkit.dockerfile.v0

<missing>      16 hours ago    RUN /bin/sh -c curl -o python-src-3.7.0.tgz …   600MB     buildkit.dockerfile.v0

<missing>      16 hours ago    RUN /bin/sh -c yum install -y gcc gdb gcc-c+…   292MB     buildkit.dockerfile.v0

<missing>      16 hours ago    WORKDIR /opt                                    0B        buildkit.dockerfile.v0

<missing>      15 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B

<missing>      15 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B

<missing>      15 months ago   /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB

PS D:\lhyprogram\testcontainer> docker history pig/centos7:dev

IMAGE          CREATED        CREATED BY   SIZE      COMMENT

52c6f118f6f6   17 hours ago                1.53GB    Imported from -

二、构建VSCODE环境

​接下来,就是载入之前我们构建的镜像得到容器开发环境,然后在其基础上建立VSCODE的开发调试环境。和之前构建VSCODE相关的环境类似,我们主要需要做的事情,还是安装各种扩展。

(一)安装Dev Containers

VSCODE的插件安装方法在CENTOS上的网络安全工具(五)CODE来打个酱油_lhyzws的博客-CSDN博客提及,此处不赘述。

在VSCODE中依托容器进行开发,需要安装Dev Containers插件(Dev Containers - Visual Studio Marketplace)。

或者直接在VSCODE中搜索:

安装即可。

(二)编写Dockerfile

之前提到过,VSCODE的启动方式挺特别。不同于VS Studio是新建工程时自动创建文件夹,VSCODE是先建立文件夹,然后从文件夹启动工程。所以我们需要首先准备好开发环境的文件夹——比如新建一个名为testcontainer的文件夹。

然后,重要的一步,就是把我们前面构建开发环境的那个Dockerfile拷贝进来。如果是通过import得到的镜像,或者网上pull来的其它镜像,可以直接写一个类似下面的简单Dockerfile(当然,如果已经像上面那样构建完成了,最好直接用镜像,否则又会构建一遍以及漫长的等待):

FROM 镜像名

CMD /bin/bash

接下来CMD打开这个文件夹,运行'code .'

左下角远程连接的位置,鼠标左键点击:

弹出窗口选择Open in Container:

然后选择“From ‘Dockerfile’”。

紧接着这一步,可以选择安装一些附加功能。这里面甚至还有python、es等等,没试过安装。如果不需要,可以直接确定。

 稍等一会(前提是不需要当场build,否则就多等一会),成功载入后,左下角图标应该会发生变化。

 同时,在终端窗口里能够感觉到我们已经进入到容器的工作环境里面了。

至于为什么还是在testcontainer文件夹下,敲一个pwd就知道了:实际是将主机的文件夹映射到了/workspace下的同名子目录。检查一下我们在/opt下释放的那个python源代码,还在,确认确实实在我们构建的容器里面了。

PS D:\lhyprogram\drawio> docker images

REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE

pig/centos7                                          code      bfe277180b5f   15 hours ago    1.92GB

pig/centos7                                          dev       52c6f118f6f6   17 hours ago    1.53GB

vsc-testcontainer-0bf9df2d7b8bb859465f3c949ba89d5c   latest    d8a2e507c756   17 hours ago    1.53GB

ubuntu                                               bionic    251b86c83674   4 days ago      63.1MB

debian                                               latest    291bf168077c   7 days ago      124MB

ubuntu                                               latest    a8780b506fa4   5 weeks ago     77.8MB

centos                                               centos7   eeb6ee3f44bd   15 months ago   204MB

centos                                               latest    5d0da3dc9764   15 months ago   231MB

PS D:\lhyprogram\drawio> docker ps -a

CONTAINER ID   IMAGE                                                COMMAND                  CREATED          STATUS          PORTS     NAMES

62e42e8a1837   vsc-testcontainer-0bf9df2d7b8bb859465f3c949ba89d5c   "/bin/sh -c 'echo Co…"   33 minutes ago   Up 33 minutes             priceless_murdock

PS D:\lhyprogram\drawio>

可以看到,VSCODE代我们建立了容器,并做了工作空间的映射。实际上,官网上也是这么说的:

(三)安装其它Extension

进入容器后,打开extension,会发现我们现在只有中文语言包,这是因为使用VSCODE进行容器开发,实际也是远程开发的一种,相关的extension也需要在容器内安装。所以,剩下的步骤可以完全参考CENTOS上的网络安全工具(六)CODE之酱油打到底_lhyzws的博客-CSDN博客_centos 网络工具进行安装。

 1. C/C++ extension

 搜索并安装C/C++ Extension Pack,即可在工作环境下新建cpp文件,并启动调试

2. Python extension​​​​​​​

搜索并安装 Python Extension Pack

创建test.py并调试。

由于我们安装了两种版本的python,所以到这里右下角可能会弹出对话框要求指定python环境,点击select python interpreter,选择3.7.0即可。

3. Java extension

 搜索并安装Extension Pack for Java。然后新建一个test.java文件封装test类。当然,如果是比较复杂的、需要导入依赖包的Java项目,需要借助maven创建,可以参考CENTOS上的网络安全工具(十)走向Hadoop(2) MapReduce调试环境构建_lhyzws的博客-CSDN博客

 如是这般,如果真的不想去碰Linux系统又想在Linux上开发调试程序,直接装个Docker Desktop,然后把Dockerfile往目录下一扔就可以干活了,也甚是方便的呢。

三、 Dockercompse下的Cascade开发环境配置

事实上,Dev Container Extension也支持使用Docker-compose下的开发调试。我们可以采取2种方法来构造环境。

(一)常规打开工作目录方法

1. 工作目录构造

使用常规打开工作目录的方法,无非就是将项目相关的源代码、Dockerfile和Docker-compose.yml等文件放在预先准备的工作目录下,然后如上述构建开发环境方法一样操作即可。

例如我们构建的目录在d:lhyprogram\cascadedev。则打开后如下图所示:

 2. 插件安装

这个就不多说了,和前面一样。由于cascade使用python编写,所以python extension pack是少不了的。

3. 镜像构造

使用常规构建工作目录的方式,好处就在于docker-compose.yml、Dockerfile都受我们控制,我们可以按照程序调试的需要来改造。

(1)下载cascade

为此,首先我们需要下载cascade的zip版本,解压到我们准备好的工作目录。下载地址在https://github.com/mitre/cascade-server/archive/refs/heads/master.zip

 (2)调整python版本及更改镜像源

CENTOS上的网络安全工具(十五)cascade的部署_lhyzws的博客-CSDN博客中,我们提到,cascade在python 3.6.8上可以顺滑部署。但是VSCODE的python extension目前不支持低于3.7.0的python版本。保险起见,我们压边儿选择3.7.0的镜像进行安装:

如此,还需要修改Dockerfile中的FROM镜像为python:3.7.0

不幸的是,即使是3.7.0版本,在执行pip install requirements.txt时仍然出错。跟踪分析,错误主要发生在gevent-websock和gevent这2个包附近。由于requirements.txt中gevent-websock== 0.10.1在官网gevent-websocket · PyPI上查询其所对应的就是最新版本,所以应该不是3.7版本高的问题。

实际上,问题主要是2方面: 

一是python和pip的版本不匹配的问题。所以在安装requirements.txt前,需要执行pip install –upgrade pip进行升级;结合前面说的版本问题,一并改了。

Dockerfile

FROM python:3.7.0

RUN mkdir -p /opt/cascade-server

WORKDIR /opt/cascade-server

COPY requirements.txt .

RUN pip install –upgrade pip \

&& pip install -r requirements.txt

COPY . .

COPY docker_defaults.yml conf/defaults.yml

CMD /bin/bash docker_start.sh

二是cascade在requirements.txt中的第一行指定的默认镜像源实在时太慢了,经常发生连接无响应错误,这个随机发生,所以会把人搞得很疯。我们需要替换镜像源来解决。以更换到清华镜像源为例:

requirements.txt

-i https://pypi.tuna.tsinghua.edu.cn/simple

antlr4-python3-runtime==4.9.1

certifi==2020.12.5

cffi==1.14.5

chardet==4.0.0

click==7.1.2

或者把requirements.txt的第一行删掉,在Dockerfile中修改安装命令为:

pip install -r requirements.txt -I https://pypi.tuna.tsinghua.edu.cn/simple

亦可。

(3)更改docker-compose.yml

由于我们主要想调试的是cascade.py所在的主线程,而这个线程最后会被Dockerfile的最后一句 CMD /bin/bash docker_start.h中的cascade.py -vv执行起来。而cascade.py -vv执行起来后就作为daemon了。并且,按照docker 的PID=1进程的管理方法,这个CMD执行完了docker也就退出了。所以,为了调试cascade.py,我们只能将这句删掉,先执行/bin/bash,然后再手工启动cascade.py。

同样,有关splunk和es的cascade_job服务我们并不关心,且因其依赖cascade_web服务,可能会因为我们的调整加载失败,所以干脆删掉:

docker-compose.yml

---

version: '2'

volumes:

  mongo_data: {}

  cascade_conf: {}

services:

  mongodb:

    image: mongo:4.0

    ports:

      - "127.0.0.1:27017:27017"

    volumes:

      - mongo_data:/data

  cascade_web:

    build:

      context: .

      args:

        - "http_proxy:${http_proxy}"

        - "https_proxy:${https_proxy}"

        - "no_proxy:${no_proxy}"

    image: "cascade:latest"

    volumes:

      - cascade_conf:/opt/cascade-server/conf

    depends_on:

      - mongodb

    ports:

      - "5000:5000"

  cascade_jobs:

    image: "cascade:latest"

    volumes:

      - cascade_conf:/opt/cascade-server/conf

    depends_on:

      - cascade_web

      - mongodb

    command: python cascade.py -vv --jobs

4. 加载到VSCODE

一切准备好后,仍然左下角点击远程连接图标,然后Open Folder in Caintainer:

弹出对话窗口需要检查一下,是否确实在预计中的目录,一般都是,直接确认。与之前不同的是,在下一页需要选择From 'docker-compose.yml'。

dev container extension会检测docker-compose.yml种列举的服务,选择我们关注的那个,即cascade.web:

dev container extension会根据docker-compose.yml和Dockerfile构建、拉取镜像并依次启动容器,不出意外的话,应该就可顺利进入环境了。

PS:不过我这里总是会在最后发生“打不开工作目录的错误”,不知是否普遍现象。

 好在这不是多严重的问题,报错的时候按照提示重新选择工作目录就好。之所以找不到工作目录,是因为这次VSCODE并没有直接将cascadedev目录放到workspaces目录下,而是把我的整个D盘映射过来了——不知为何。

PS D:\lhyprogram\cascadedev> docker images

REPOSITORY    TAG       IMAGE ID       CREATED             SIZE

cascade       latest    5bb9cf658cc8   21 minutes ago      1.03GB

<none>        <none>    65fd0d9a42d6   About an hour ago   1.03GB

PS D:\lhyprogram\cascadedev> docker ps -a

CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS         PORTS                        NAMES

4d3f59a8c25f   cascade:latest   "/bin/sh -c 'echo Co…"   15 minutes ago   Up 9 minutes   0.0.0.0:5000->5000/tcp       cascadedev-cascade_web-1

530937fdb9e0   cascade:latest   "python cascade.py -…"   22 minutes ago   Up 9 minutes                                cascadedev-cascade_jobs-1

ddd1bca19267   mongo:4.0        "docker-entrypoint.s…"   22 minutes ago   Up 9 minutes   127.0.0.1:27017->27017/tcp   cascadedev-mongodb-1

好在成功装载后,VSCODE生成了3个服务所对应的容器。所以如果发生这种情况,可以使用docker exec 进入容器看一眼,VSCODE到底把哪个目录映射到工作空间了。重新选择即可。

5. 初始化与调试设置

由于我们进入容器的时候执行的是/bin/bash,cascade尚未初始化和启动。我们尚需要首先手工执行初始化操作,也就是被删掉的那句CMD /bin/bash docker_start.sh。实际上脚本中执行的是cascade.py --setup_with_defaults

root@972bc0ca7b98:/opt/cascade-server# python cascade.py --setup_with_defaults

Automatically updated configuration settings for CASCADE based on defaults.yml

Initializing database...

Importing collection attack_technique

Importing collection attack_tactic

Importing collection analytic

Importing collection session

需要注意的是必须到Dockerfile指定的那个工作目录(/opt/cascade-server)下去执行,否则mongodb会拒绝连接。

初始化后,安装好python extension pack就可以开始启动cascade.py进行调试了。当然,还可以通过编辑launch.json的方式,添加命令行参数“-vv”。

现在,可以下断点并一路跟踪到server.py了。

 (二)Attach容器方法

1. 迁移镜像

主要是利用我们前篇已经在vmware中安装过的cascade镜像来进行导出

[root@pig ~]# docker images

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE

cascade      latest    95e91c0b9574   3 days ago     1.02GB

mongo        4.0       fb1435e8841c   3 months ago   430MB

python       3.6.8     48c06762acf0   3 years ago    924MB

[root@pig ~]# docker save -o cascade.tar cascade:latest

[root@pig ~]# ls

公共  视频  文档  音乐  anaconda-ks.cfg  cascade.tar           share

模板  图片  下载  桌面  cascade-server   initial-setup-ks.cfg

在windows下导入镜像

PS F:\vm\share> docker image load -i .\cascade.tar

0db06dff9d9a: Loading layer  105.5MB/105.5MB

f32868cde90b: Loading layer  24.08MB/24.08MB

7b76d801397d: Loading layer  8.005MB/8.005MB

2c8d31157b81: Loading layer  146.4MB/146.4MB

a637c551a0da: Loading layer  576.4MB/576.4MB

24747797d2fa: Loading layer  17.36MB/17.36MB

b04c763f3532: Loading layer  66.18MB/66.18MB

02d7555642f3: Loading layer  4.608kB/4.608kB

d03a0ab13129: Loading layer  6.483MB/6.483MB

afe150caf6a5: Loading layer   2.56kB/2.56kB

0cf67bf3b3f8: Loading layer  3.584kB/3.584kB

860c8a3263a9: Loading layer   80.7MB/80.7MB

8b24324a16fd: Loading layer  20.24MB/20.24MB

6432de83d41d: Loading layer  4.608kB/4.608kB

Loaded image: cascade:latest

PS F:\vm\share> docker images

REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE

pig/centos7                                          code      bfe277180b5f   19 hours ago    1.92GB

vsc-testcontainer-0bf9df2d7b8bb859465f3c949ba89d5c   latest    d8a2e507c756   22 hours ago    1.53GB

pig/centos7                                          dev       52c6f118f6f6   22 hours ago    1.53GB

cascade                                              latest    95e91c0b9574   3 days ago      1.02GB

ubuntu                                               bionic    251b86c83674   4 days ago      63.1MB

debian                                               latest    291bf168077c   7 days ago      124MB

ubuntu                                               latest    a8780b506fa4   5 weeks ago     77.8MB

centos                                               centos7   eeb6ee3f44bd   15 months ago   204MB

centos                                               latest    5d0da3dc9764   15 months ago   231MB

2. 启动服务

然后执行docker-compose up。这样虽然还是在我们的cascade下载目录下,但因为镜像已经存在,cascade不会重新再构筑一遍了,要快不少。

PS D:\lhyprogram\cascadedev> docker-compose up

time="2022-12-13T18:23:27+08:00" level=warning msg="The \"http_proxy\" variable is not set. Defaulting to a blank string."

time="2022-12-13T18:23:27+08:00" level=warning msg="The \"https_proxy\" variable is not set. Defaulting to a blank string."

time="2022-12-13T18:23:27+08:00" level=warning msg="The \"no_proxy\" variable is not set. Defaulting to a blank string."

[+] Running 3/3

 - Container cascadedev-mongodb-1       Created                                                                                     0.0s

 - Container cascadedev-cascade_web-1   Created                                                                                     0.0s

 - Container cascadedev-cascade_jobs-1  Created                                                                                     0.0s

Attaching to cascadedev-cascade_jobs-1, cascadedev-cascade_web-1, cascadedev-mongodb-1

……

运行起来以后,可以看到3个正在运行的容器

PS C:\Users\lhyzw> docker ps -a

CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                        NAMES

11eeedf2414c   cascade:latest   "python cascade.py -…"   19 seconds ago   Up 16 seconds                                cascadedev-cascade_jobs-1

0da47944ea8e   cascade:latest   "/bin/sh -c '/bin/ba…"   19 seconds ago   Up 17 seconds   0.0.0.0:5000->5000/tcp       cascadedev-cascade_web-1

a51adb33cf8d   mongo:4.0        "docker-entrypoint.s…"   19 seconds ago   Up 18 seconds   127.0.0.1:27017->27017/tcp   cascadedev-mongodb-1

3. attach 容器

然后在VSCODE中,直接点击远程连接图标,在弹出对话中选择attach container,

从列举出的容器中选择需要attach的容器就行。

这里仍然有个工作路径的问题。一般来说attach上后VSCODE会询问工作路径,默认情况下在Dockerfile指定的工作目录,或者用户目录(\~)下——这个时候在根目录下是没有workspaces子目录的。我们也可以通过点击远程连接图标选择open Container Configuration File来配置workspaceFolder进行调整

 四、WSL代理设置及抓包软件

 (一)WSL代理

最后,还有一件事需要多说几句。在windows上的dockers desktop上工作,由于其docker engine实际是安装在wsl上的,也就是说wsl上的ubuntu才是宿主机。这种情况下,如果需要配置网络代理,就没有再vmware的交互式界面上那么方便了。我们可以参考WSL2(Windows下的Linux子系统)代理设置_fsociety_的博客-CSDN博客_wsl2设置proxy 进行设置,在~目录下:

[root@pig ~]# vi .bashrc

[root@pig ~]# export https_proxy="http://windows主机的IP:1080";

[root@pig ~]# export http_proxy=" http://windows主机的IP:108";

[root@pig ~]# source ~/.bashrc

这样再看docker-compose.yml里cascade_web的那几个参数,是不是就明白是干什么的了?

(二)Windows下抓包软件

这件事实在不值当单独写一篇的,所以在这凑合了。大意就是微软又一款不错的抓包分析软件,名曰nmcap,可在Download Microsoft Network Monitor 3.4 (archive) from Official Microsoft Download Center下载

 而且,这个软件有个不错的不间断抓包功能,使用如下命令可对所有网卡(如果对指定网卡,可以先用displaynetwork命令查出网卡序号进行指定)抓包,并根据指定大小将文件编号存储在给定的路径下:

PS C:\Users\lhyzw> nmcap /DisplayNetwork

Network Monitor Command Line Capture (nmcap) 3.4.2350.0

0. vEthernet (WSL) (Hyper-V Virtual Ethernet Adapter)

1. WLAN (MediaTek Wi-Fi 6 MT7921 Wireless LAN Card)

2. * 3 (Microsoft Wi-Fi Direct Virtual Adapter #3)

3. * 4 (Microsoft Wi-Fi Direct Virtual Adapter #4)

4.  (Realtek PCIe GbE Family Controller)

PS C:\Users\lhyzw> nmcap /Network * /Capture /File d:\downlaod\test.chn:2MB

Network Monitor Command Line Capture (nmcap) 3.4.2350.0

Saving info to: d:\downlaod\test.cap - using chain captures of size 2.00 MB.

ATTENTION: Conversations Disabled: Some filters require conversations and will not work correctly (see Help for details)

ATTENTION: Process Tracking Disabled: Use /CaptureProcesses to enable (see Help for details)

Note: Process Filtering Disabled.

Exit by Ctrl+C

Capturing   | Received: 16165 Pending: 0 Saved: 16165 Dropped: 0 | Time: 57 seconds.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值