Py学习  »  docker

Docker搭建与配置检查

雷神众测 • 4 年前 • 430 次点击  

No.1

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.2

前言

本文主要目的是以最快的方式带领没接触过Docker的小伙伴迅速掌握几个方便、快捷的Docker命令,然后可以简单的用这些命令进行靶机、实验环境的搭建以及配置检查。


首先需要了解2点:
1.什么是容器技术:

容器技术是一种类似于传统虚拟机的虚拟化技术,但是更加轻量化。

2.什么是Docker:

Docker是容器技术中的一种,也用的最多,但是容器并不止这一种,比如还有rkt等。


下面以搭建一个简单的wordpress站点为例子,从0开始讲解。

No.3

最基础命令

注:

  docker的安装教程网上很多,这里不再赘述
  docker命令前面往往需要以’docker’开头
  docker命令需要root权限


1.docker search 镜像名

在docker hub上搜索指定镜像,例如:

docker search centos7

2.docker pull 镜像名称

找到需要的镜像后,用该命令进行下载,一般系统镜像也就两三百M。

3.docker images

查看本地当前存在的镜像:

TAG是容器的标签,用来区分不同的容器,如果不填写的话默认是latest,如果本地不存在latest版本则会自行下载。

IMAGE ID是镜像的16位短ID

4.docker run -itd –-name 容器名称 -p 主机端口:容器端口 -p...... 镜像名称:标签 /bin/bash

这条命令基本能满足环境的搭建了

-p是用来映射端口的 ,不需要映射的情况下可以忽略。

例如:

这样就成功创建了一个centos的容器,并将容器的80端口映射到主机的81端口上。

下面这一长串是容器的完整ID.

5.docker ps

列出当前正在运行的容器,例如:

6.docker stop/start 容器名/ID

停止或启动容器,若是填写容器名则要全写上去,如果用的是ID,这里的ID并不需要写完整的ID或者16位短ID,只需要能与其他容器区分开即可,就算你只写第一个字符都是可以的,只要能区分开。

7.docker ps -a

列出所有的容器,包括运行中的和停止的

8.docker attach 容器名/ID

进入到容器中

进入后可以看到区域名称变成了容器的短ID

9.ctrl+d

退出并停止容器

再次连接会提示容器已经停止。

10.ctrl+p(按完放开)+q

退出而不停止容器:

进入容器后,往往容器中会缺少个别常用命令,例如ifconfig、wget等,只需要正常下载即可。然后就是正常的下载搭建wordpress所需的环境。例如这里为了方便我直接使用现成的集成环境:

wget http://dl.wdlinux.cn/files/lanmp_v3.tar.gz

tar zxvf lanmp_v3.tar.gz

sh lanmp.sh

然后选择1进行下载即可。

完成后httpd和mysqld默认已经启动

然后退出容器。

12.docker cp 主机中的文件目录 容器名:容器中的目录

将文件从主机拷贝到容器中

然后就是在容器中按照搭建环境的步骤去进行就可以了。

最后用ifconfig查看一下容器的ip即可在主机中直接访问对应的站点了,若是没有安装ifconfig的话,可以在容器外使用命令docker inspect 容器名 | grep IPAddress

查看容器信息,里面有ip:

若是搭建在虚拟机中的直接在物理机上访问虚拟机IP:81端口 即可访问到了(这里忽略防火墙的问题)

No.4

快速搭建靶机

由于docker技术很受欢迎,所以网上已经有很多现成的环境可供下载使用,例如vulhub、vulstudy等。

下面以vulstudy为例,讲解下如何使用:


注:docker-compose的安装教程网上很多,我就不赘述了。


1.下图是vulstudy目录中的文件,可以看到有一个docker-compose.yml文件,在这里我们只需要运行docker-compose up -d 即可同时创建所有目录中存在的靶机环境,当然,这个过程会有点慢,因为每个靶机环境中并不包含相应镜像文件,下载这些文件的操作被写到了每个环境对应的Dockerfile(用来描述如何创建镜像的过程的文件)中。会先去执行这些Dockerfile创建镜像,然后才运行它们。

2.下图是每个环境单独的目录内容,以DVWA为例:

docker-compose.yml中记录了容器启动时所要进行的一些配置:

例如端口那里,设置的就是端口映射,可以在使用之前自己根据需要进行修改。

要单独创建靶机的话,对于存在Dockerfile文件的,需要先到目录下执行如下命令先创建镜像:

docker build -t 要命名的镜像名称 . (注意这里有一个’点’,并且前面有空格)

然后:

docker-compose up -d

按.yml文件创建容器。

最后根据映射的端口或者IP进行访问就可以了。

No.5

配置检查

该脚本用于对Docker应用服务器的安全合规性检查和配置规范的检测。运行环境为python2,使用了os模块。


脚本检测结果有4种:

  1. qualified

  2. unqualified

  3. not found

  4. 列表

qualified是某条规范的检测结果,定义为合格。
unqualified是某条规范的检测结果,定义为合格。

not found说明脚本尝试打开的配置文件没有找到,出现这种情况的原因可能有以下情况导致的:

1、权限问题:有一些配置文件需要一定权限才能打开;
2、未能在指定位置(以《xxx技术有限责任公司Docker安全配置规范.docx》为准)找到对应的配置文件;
3、确认相应服务是否安装,且安装位置是否有问题(这会导致脚本不能在文档指定的位置找到相应配置文件)。


列表是某条规范的检测结果,需要个人自己去判断


需要提升权限的目录(参考,请结合实际环境进行相应的设置):
必须是root用户
docker命令需要使用root权限,需要获得以下几条命令的执行权限:

docker info | grep -e "^Storage Driver:\saufs\s$"

注意:

按照文档规范,一些检查项需要执行auditd命令,需要提前安装
2、3、13、14、15、16、17无法确定位置,是因为直接使用命令判断
19、20检测不了

#  -*-coding:utf8 -*-
import os
check_docker = {}
try:
   if os.path.isdir('/varlib/docker/etc/fstab'):
       check_docker['1.为容器创建独立的分区'] = os.popen('grep /varlib/docker/etc/fstab').read()
   else:
       check_docker['1.为容器创建独立的分区'] = '未找到file'
except:
   check_docker['1.为容器创建独立的分区'] = '在' + '/varlib/docker/etc/fstab' + '未找到'

try:
   check_docker['2.使用已更新过的Linux内核'] = os.popen('uname -r').read()
except:
   check_docker['2.使用已更新过的Linux内核'] = 'not found'

try:
   check_docker['3.只允许受信任的用户控制Docker deamon'] = os.popen('getent group docker').read()
except:
   check_docker['3.只允许受信任的用户控制Docker deamon'] = 'not found'

try:
   check_docker['4.审计Docker deamon'] = os.popen('auditctl -l | grep /usr/bin/docker').read()
except:
   check_docker['4.审计Docker deamon'] = '在' + '/usr/bin/docker' + '未找到'

try:
   check_docker['5.审计var/lib/docker'] = os.popen('auditctl -l | grep /usr/bin/docker').read()
except:
   check_docker['5.审计var/lib/docker'] = '在' + '/usr/bin/docker' + '未找到'

try:
   check_docker['6.审计/etc/docker'] = os.popen('auditctl -l | grep /etc/docker').read()
except:
   check_docker['6.审计/etc/docker'] = '在' + '/etc/docker' + '未找到'

try:
   f_dir_list = os.popen('systemctl show -p FragmentPath docker.service').read().split('=')[1]
   if f_dir_list == '\n':
       check_docker['7.审计docker.service'] = 'unqualified'
   else:
       infos = os.popen('auditctl -l | grep docker.service')
       check_docker['7.审计docker.service'] = infos
except:
   f_dir_list = os.popen('systemctl show -p FragmentPath docker.service').read().split('\n')
   check_docker['7.审计docker.service'] = '在' + str(f_dir_list) + '未找到'

try:
   f_dir_list = os.popen('systemctl show -p FragmentPath docker.socket').read().split('=')[1]
   if f_dir_list == '\n':
       check_docker['8.审计docker.socket'] = 'unqualified'
   else:
       infos = os.popen('auditctl -l | grep docker.socket')
       check_docker['8.审计docker.socket'] = infos
except:
   f_dir_list = os.popen('systemctl show -p FragmentPath docker.service').read().split('\n')
   check_docker['8.审计docker.socket'] = '在' + str(f_dir_list) + '未找到'

try:
   check_docker['9.审计/etc/default/docker'] = os.popen('auditctl -l | grep /etc/default/docker').read()
except:
   check_docker['9.审计/etc/default/docker'] = '在' + '/etc/default/docker' + '未找到'

try:
   check_docker['10.审计/etc/docker/daemon.json'] = os.popen('auditctl -l | grep /etc/docker/daemon.json').read()
except:
   check_docker['10.审计/etc/docker/daemon.json'] = '在' + '/etc/docker/daemon.json' + '未找到'


try:
   check_docker['11.审计/usr/bin/docker-containerd'] = os.popen('auditctl -l | grep /usr/bin/docker-containerd').read()
except:
   check_docker['11.审计/usr/bin/docker-containerd'] = '在' + '/usr/bin/docker-containerd' + '未找到'

try:
   check_docker['12.审计/usr/bin/docker-runc'] = os.popen('auditctl -l | grep /usr/bin/docker-runc').read()
except:
   check_docker['12.审计/usr/bin/docker-runc'] = '/usr/bin/docker-runc' + '未找到'

try:
   f = os.popen('ps -ef | grep docker').read()
   if 'icc=false' in f:
       check_docker['13.限制容器之间的网络流量'] = 'qualified'
   else:
       check_docker['13.限制容器之间的网络流量'] = 'unqualified'
except:
   check_docker['13.限制容器之间的网络流量'] = '未找到'

try:
   f = os.popen('ps -ef | grep docker').read()
   if 'iptables' in f or 'iptables=false':
       check_docker['14.允许Docker更改iptables'] = 'unqualified'
   else:
       check_docker['14.允许Docker更改iptables'] = 'qualified'
except:
   check_docker['14.允许Docker更改iptables'] = '未找到'

try:
   f = os.popen('ps -ef | grep docker').read()
   if 'insecure-registry' in f:
       check_docker['15.使用安全的镜像库'] = 'qualified'
   else:
       check_docker['15.使用安全的镜像库'] = 'unqualified'
except:
   check_docker['15.使用安全的镜像库'] = '未找到'

try:
   # check_docker['12.审计/usr/bin/docker-runc'] = os.popen('auditctl -l | grep /usr/bin/docker-runc').read()
   f_aufs = os.popen('docker info | grep -e "^Storage Driver:\s*aufs\s*$"').read()
   if f_aufs == '':
       check_docker['16.不使用aufs存储驱动'] = 'qualified'
   else:
       check_docker['16.不使用aufs存储驱动'] = 'unqualified'
except:
   check_docker['16.不使用aufs存储驱动'] = '未找到'

try:
   f_aufs = os.popen('ps -ef | grep docker').read()
   if '--tlsverify' in f_aufs and '--tlscacert' in f_aufs and '--tlscert' in f_aufs and '--tlskey' in f_aufs:
       check_docker['17.为Docker daemon配置TLS认证'] = 'qualified'
   else:
       check_docker['17.为Docker daemon配置TLS认证'] = 'unqualified'
except:
   check_docker['17.为Docker daemon配置TLS认证'] = '未找到'

# try:
   # check_docker['18.设置验证镜像库证书文件的权限'] = os.popen('stat -c %U:%G /etc/docker/certs.d/* | grep -v root:root').read()
# except:
#     check_docker['18.设置验证镜像库证书文件的权限'] = '在' + '/etc/docker/certs.d/*' + '未找到'

# try:
#     try:
#         check_docker['19.设置验证TLS CA证书文件的权限'] = os.popen('stat -c %U:%G | grep -v root:root').read()
#     except:
#         check_docker['19.设置验证TLS CA证书文件的权限'] = os.popen('stat -c %a ').read()
# except:
#     check_docker['19.设置验证TLS CA证书文件的权限'] = 'not found'

# try:
#     try:
#         check_docker['20.设置验证Docker 服务器证书文件的权限'] = os.popen('stat -c %U:%G | grep -v root:root').read()
#     except:
#         check_docker['20.设置验证Docker 服务器证书文件的权限'] = os.popen(
#             'stat -c %a ').read()
# except:
#     check_docker['20.设置验证Docker 服务器证书文件的权限'] = 'not found'

with open('check_docker.txt', 'w') as file:
   for v, k in check_docker.items():
       file.write('{v}:{k}'.format(v=v, k=k))
       file.write('\n')

No.6

安服东北大区招聘

安全服务部东北大区致力于东北三省的安全检测和咨询规划业务支撑。团队拥有非常完善的渗透测试、应急响应、网络安保的服务体系和技术能力。同时,主要负责区域内CTF比赛支撑、红蓝对抗业务和DevSecOps体系建设等,致力于打造一个规范、安全、高效、诚信、专业的安全服务团队。

安全服务售前工程师

————————

任职地点:沈阳

【岗位职责】
1.负责售前工作,配合销售人员参与投标项目,负责撰写投标方案技术文件部分和过程中的技术应答文件,完成现场讲标、答疑等整个投标过程工作;
2.负责挖掘和引导客户服务需求,为客户提供合理有效的安全解决方案;与用户进行现场交流,包括初次交流、具体项目交流和投标交流;
3.针对客户网络架构和安全服务需求,制定合理的安全服务解决方案;
4.负责和参与对用户的短期培训和讲座等;
5.作为对销售部门售前过程的唯一接口,负责帮助销售协调售前支持和其他部门的资源。 


【任职要求】
1.具有较强的沟通能力、学习能力、灵活的处事能力、文档编写能力,擅长PPT编写和演示;
2.熟悉安全服务业务(漏洞扫描、渗透测试、风险评估、安全评估、安全培训、代码审计、应急响应、网络安保等)服务内容及流程;
3.熟悉主流安全技术和流行安全产品(防火墙、防毒、入侵检测、漏洞扫描等)的应用部署方案;
4.熟悉网络攻击、黑客攻防等安全技术;了解国内外网络、安全界发展现状;了解各主流安全厂家厂家安全服务的技术优劣势。
5.较强的敬业精神与工作责任心。


【优先考虑的条件】
1.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP证书者优先;
2.具有运营商、金融、央企、政府等行业工作经验或从事2年以上行业安全服务售前工作。
3.具备行业安全标准、政策者,同类安全公司从业经验者优先;


简历投递至:

john.wang@dbappsecurity.com.cn

安全服务工程师

————————

任职地点:沈阳、长春、哈尔滨

【岗位职责】
1.参与渗透测试、安全加固、应急响应等安全服务实施工作;
2.对Web应用、APP应用、数据库、主机等进行安全评估,并给出解决方案;
3.负责安全攻防渗透相关技术研究; 


【任职要求】
1.具备良好的职业道德,具备良好的团队合作精神,自学能力;
2.熟悉渗透测试的步骤、方法、流程、熟练掌握各种渗透测试工具的使用;
3.熟悉常见的Web代码,熟悉SQL注入、XSS等常见的安全漏洞的评估方法、利用及修复。
4.熟悉常见的主机系统和网络的攻击、防御方法、网络渗透技术;
5.良好的语言表达能力、文档编写能力。
6.熟悉内网渗透;
7.具备良好合作态度及团队精神、学习能力、沟通能力,并富有工作激情、创新欲望和责任感。
8.有CTF比赛经验,并获得名次者优先;
9.有CISP、CISSP等证书者优先;


简历投递至:

john.wang@dbappsecurity.com.cn

安全服务实习生

————————

任职地点:沈阳

【岗位要求】 
1、熟悉Owasp Top10漏洞原理、攻击、防御手法,有渗透测试经验; 
2、熟悉操作系统、中间件、数据库、框架等常见问题; 
3、善于沟通交流、表达能力强; 
4、热爱网络安全、好学、抗压能力强; 
5、至少熟悉一种编程语言(php/java/python/c),并可以编写POC者优先; 
6、熟悉后渗透技术者优先 
7、在各大安全论坛、博客上发表过文章者优先 
8、2021年毕业。 


【岗位职责】
1、负责对客户系统进行渗透测试、安全基线等安全服务工作; 
2、跟踪国内外信息安全动态,自我学习; 


简历投递至:john.wang@dbappsecurity.com.cn

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/55198
 
430 次点击