CENTO OS上的网络安全工具(十七)搭建Cascade的Docker开发环境 您所在的位置:网站首页 美国签证费用多少 CENTO OS上的网络安全工具(十七)搭建Cascade的Docker开发环境

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

2023-05-23 13:31| 来源: 网络整理| 查看: 265

这一篇,我们继续在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 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: . [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 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 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: . [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 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       15 hours ago    RUN /bin/sh -c yum install java-11-openjdk* …   825MB     buildkit.dockerfile.v0       15 hours ago    RUN /bin/sh -c sed -e 's|^mirrorlist=|#mirro…   30.1kB    buildkit.dockerfile.v0       16 hours ago    RUN /bin/sh -c curl -o python-src-3.7.0.tgz …   600MB     buildkit.dockerfile.v0       16 hours ago    RUN /bin/sh -c yum install -y gcc gdb gcc-c+…   292MB     buildkit.dockerfile.v0       16 hours ago    WORKDIR /opt                                    0B        buildkit.dockerfile.v0       15 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B       15 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B       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             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.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有