Linux Program Analysis

一、Linux 下的Docker 容器

我们可以把Docker 当作多功能沙盒,可以将需要的软件放在一个容器内运行,而不干扰容器外的系统。例如,在两个个容器内分别运行nginx服务器,容器一对外开放端口10801,容器二对外开放端口10802,这样,在同一台主机内,两个web服务器就可以同时互不干扰地运行。

使用Docker 时,主要区分以下两个概念:

1、Docker镜像 image

2、容器 Container

我们可以在Docker Hub上下载各种images,例如nginx,mysql,ubuntu等,也可以将自己的软件运行环境打包成一个image

使用image来新建一个container

举个栗子:用一个Windows 7 iso镜像,可以给好多电脑安装系统。用一个MySQL Docker 镜像,可以创建好多个MySQL 容器

Docker 入门

例如:

查阅Docker Hub内的官方MySQL 文档,首先下载MySQL镜像

docker pull mysql

如果要指定某个版本的MySQL,在mysql后加冒号指定版本,例如:

docker pull mysql:8.0.10

不指定版本则默认为latest(最新版)

等待下载完成,下载完成后查看目前已经下载好的images:

docker images

确认镜像已经下载成功,接下来使用这个镜像新建一个容器:

docker run --name first_mysql_container -p 23306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql

其中的命令和参数分别为:

  • run:docker操作,用来新建容器;

  • --name first_mysql_container:给容器命名,可选;

  • -p 23306:3306:端口映射,将容器内的3306端口映射到主机的23306端口

  • -e MYSQL_ROOT_PASSWORD=yourpassword:设置MySQL root密码

  • -d :容器创建后将会在后台运行,命令执行后返回一个container id

  • mysql:使用mysql镜像,如果要指定版本,则写为 mysql:tag

使用命令 docker ps来查看已经创建的容器,Docker会显示以下详情:

  • CONTAINER ID :唯一的容器id,对应每一个单独的容器
  • IMAGE:这个容器是使用什么镜像创建的
  • COMMAND
  • CREATED: 容器创建的时间
  • STATUS:容器已经运行了或者停止了多长时间
  • PORTS:端口映射情况
  • NAMES:容器的名字

创建好容器之后,进入容器,亲手操作mysql:

docker exec -it first_mysql_container bash

  • exec:docker命令,在运行的容器中执行命令
  • -it:我一般都加上这两个参数
  • first_mysql_container:容器名字,此处填容器ID亦可
  • bash:在这个容器内运行bash

之后输入 mysql -u root -p 即可使用MySQL

Docker 的配置目录与文件分析

1、如果系统还可以仿真运行,docker服务可以启动,使用一下命令:

docker version 查询docker client 和server 版本,

docker info 可以详细调查正在运行、暂停或停止的container数量,是否使用了docker集群需要的swarm网络模式,docker镜像源地址等

docker sespect ImageID 查询某个镜像的详细信息

2、如果系统不能仿真,或是仿真之后无法启动docker服务,应该首先考虑修复系统丢失的文件或进行合理配置,恢复docker服务。

3、如果只能从硬盘分析入手,则考虑一下方法:

  • 要确定Docker Server的版本,可以查找apt 包管理程序的日志:/var/log/apt/term.log

  • 查看已经下载了哪些镜像,检查 /var/lib/docker/image/overlay2/repositories.json 文件

* 需要注意的是,docker image 使用OverlayFS 分层存储在/var/lib/docker/overlay2,不好区分

  • 查看container的详细信息,在/var/lib/docker/containers找到对应containerID 的文件夹,查看config.v2.json 中的内容,其中包含:当前容器是否在运行、暂停或者停止,容器运行的虚拟主机名称Hostname,在容器内使用的端口ExposedPorts,容器内的环境变量Env,容器所使用的镜像ID,容器映射的端口Network Settings.Ports 等等

Docker 网络

//TODO: 等待完成

二、OpenSSH

使用SSH 来远程连接Linux 主机。

被连接的主机:安装SSH server

进行连接的主机:安装SSH client

查看SSH 连接日志、SSH config 文件可以检索到曾经连接过这台主机的客户机IP地址。

常见的几个文件:

文件名 说明
/var/log/secure 日志文件,记录登录历史记录
~/.ssh/config ssh 配置文件,用来进行快速密钥认证登录,其中可能记录了私钥
~/.ssh/authorized_keys 记录公钥

密钥认证基本流程:

使用ssh-keygen 命令生成一对密钥,私钥放在主机A 的config 文件里(当然需要编辑host等字段),公钥放在主机B 的authorized_keys 内,主机A 则可以无需密码通过SSH 连接主机B。

参考:

1、https://www.jianshu.com/p/806485990aea Docker文件目录 - 简书

2、https://hub.docker.com/_/mysql mysql - Docker Hub

3、李鹏超, 周凯. 基于Docker容器的电子数据取证方法[J]. 吉林大学学报(理学版), 2019, 57(06): 1485-1490.

4、