跳到主要内容

Linux Docker 访问加密锁

名词解释

名词描述
锁包括精锐5硬件锁、深盾云锁、深盾软锁三种。
Linux DockerLinux 环境(CentOS、Ubuntu 等)部署 Docker,运行容器
宿主机部署 Docker 的计算机环境
SS 服务Virbox 用户工具的重要组成部分,安全中间件,是应用程序和锁通信的桥梁,可以简单的理解为锁驱动、锁管理服务。 本文中所述的安装 SS 服务即安装 Virbox 用户工具。

方案一:Docker 容器访问宿主机(Linux)锁

共享宿主机的锁(硬件锁、云锁、软锁),在宿主机中插锁(硬)、或者登录账号、绑定软锁,Docker 使用时只需要在启动的时候只需要将宿主机的 /tmp 目录映射到 docker 环境中即可,docker 中不需要安装SS,直接运行加壳后(或集成API)的程序就能使用宿主机的锁

img

适用场景

1.开发者的软件部署在 Docker 容器中,且经常发生变更,不需要根据容器进行授权限制时使用。

2.不熟悉 Docker 操作的开发者,相比 Docker 环境维护 SS 服务,Linux 环境安装部署 SS 服务部署简单,方便管理。


操作步骤

1.宿主机安装SS服务

在宿主机环境下安装SS服务,Ubuntu 选择 .deb 的安装包进行安装;CentOS 选择 .rpm 的安装包进行安装。

2.验证 SS 安装成功

执行 ps -ef | grep senseshield,查看到 senseshield 进程正在运行。

3.启动 Docker 容器

启动Docker时必须添加参数 -v /tmp/:/tmp/ 与宿主机共享 /tmp/ 系统目录,否则运行程序失败,提示“连接失败”。

示例:docker run -it -v /tmp/:/tmp/ centos:latest /bin/bash

警告

共享 /tmp/ 目录是否存在其他风险,如存在风险可考虑使用“Docker 容器内访问精锐5加密锁”方案。

4.Docker 容器内访问锁

Docker 容器内不需要安装 SS 服务,不需要修改配置,只需运行加壳后(或集成 Runtime API)的应用程序即可。

方案二:Docker 容器内访问精锐5加密锁(或软锁)

img

适用场景

开发者的软件打包,产品使用 Docker 镜像的形式发布,需要以 Docker 容器作为单位进行授权限制。

一. 安装SS服务

Linux Docker 环境部署时优先考虑使用 CentOS(.rpm) 和 Ubuntu(.deb)的安装包进行安装。

部分 Docker 镜像为了减少容器体积,默认并未安装相关的安装包管理工具(如 CentOS 的 rpm 或 Ubuntu 的 deb)时,尝试使用 .bin 或 .sh 格式的安装包进行安装。

挂载磁盘,在 Docker 容器中执行SS安装包进行安装。

  • 进入Docker 容器, 并映射本地目录

    docker run -it -v /scp/:/scp --privileged centos:latest /bin/bash

    -it 参数表示使用可交互的方式运行 docker 容器,执行命令后,控制台会切换到 docker 容器环境,然后可像平时命令行访问 Linux 进行操作。

    -v /<Virbox用户工具安装包所在目录>:/scp 参数表示将物理机环境的 scp 目录映射到 Docker 容器环境下,可以通过控制台的方式进行交互,与虚拟机共享目录的功能相同。其中第一个 /scp 指的是宿主机的文件目录,第二个 /scp 是映射到Docker里的目录。

    --privileged 该权限选项必须添加后 Virbox 用户工具才可以正常工作

  • 在容器内安装 Virbox 用户工具。 将 .bin 安装包拷贝到本地 /scp 目录,在 Docker 容器中执行安装操作。

  • 执行 ps -ef | grep senseshield,查看 senseshield 进程是否正在运行。

二. 查看设备是否挂载成功

正常情况下,此时将加密锁插入电脑后, 在 docker 中使用 ssclt -d all 命令即可查看到枚举出的加密锁信息。

加密锁正常加载,将显示如下信息:

img

提示

如果未能正常识别,请根据以下方式做必要筛查

步骤一: dmesg 命令

使用 dmesg | grep USB 命令查看设备是否被正常加载。

正常加载结果如下图所示:

img

如果未查看到任何关于 1BC0:0055 或 Senseshield 的相关信息,表示设备未被Docker容器加载,此情况下无法找到加密锁。

步骤二: lsusb 命令

使用 lsusb 查看 精锐5是否挂载成功。

​ 挂载成功后,可以在输出信息中看到以下内容,表示精锐5加密锁已经被系统正常识别。

​ Bus 002 Device 004: ID 1bc0:0055

步骤三:查找文件目录

部分 docker 镜像使用裁剪版系统,并未安装 lsusb 等工具。查看系统目录下是否产生相关设备文件,例如:/sys/bus/usb/drivers/usbhid 等。

  1. 使用 ls /dev/usb 命令查看目录下是否有 hiddev[序号] 的文件,如果存在,则说明加密锁已经被正常是被为HID模式。
  2. 使用 ls /dev/ | grep hid 命令查找否有 hiddev[序号] 的文件,如果存在,则说明加密锁已经被正常是被为HID模式,其中 hidraw[序号] 不属于正常识别,请忽略。

三. Docker 保存已修改的容器

Docker 环境部署安装 Virbox 用户工具,绑定软锁后,需要保存当前容器,方便后期使用和维护。

1.查看运行中容器 ID

执行 docker ps 得到 CONTAINER ID。保存容器的操作需要 CONTAINER ID 作为参数。

img

2.保存容器

docker commit edc9881ab709 5edf8cc2f250,其中 edc9881ab709 步骤1 中查询到的运行容器 ID,5edf8cc2f250 为保存后的镜像名成,本例使用无意义的 ID 作为镜像名,但实际操作过程中建议使用有意义名称作为镜像名,例如:CentOS_SS。

img

3.查看新增镜像

执行 docker images 查看镜像内容,5edf8cc2f250 已经被保存新的镜像。

img

4.启动新增容器

docker run -it --privileged 5edf8cc2f250:latest bash

备注:使用 run 命令运行已保存的镜像,Virbox 用户工具服务程序(senseshield)已停止,需要手动启动。

四. Docker 启动时运行 Virbox 用户工具

经过测试验证,docker 启动时不会加载已注册的 Virbox 用户工具,目前需要开发者使用 shell 命令运行 senseshield 进程。

在用户环境下部署 docker 通常是在后台运行,不提供交互操作终端,用户场景下 docker 启动时加载 Virbox 用户工具可以使用以下两种方法:

方法1:exec 指令运行进程

  1. 启动 docker 容器并在后台运行。使用 docker run -d,后台运行参数( -d)可以使用 sh -c 指定需要容器启动后执行的 shell 指令,在当前方法中指定的 shell 不会终止的指令,否则在指令执行完毕后 docker 也会随即关闭。

    //使docker进入后台
    docker run -it -d --privileged 5edf8cc2f250:latest
  2. 运行 Virbox 用户工具进程。使用 docker exec 执行启动 Virbox 用户工具指令,docker 可通过 exec 命令操作运行中的容器执行 shell 脚本,启动 Virbox 用户工具服务的命令如下:

    docker exec CONTAINER_ID "./usr/lib/senseshield/senseshield"
  3. 查看 Virbox 用户工具运行状态。

    docker exec CONTAINER_ID ps -aux | grep senseshield

方法2:dockerfile 配置启动 shell 脚本

编写 dockerfile,在 RUN 或 ENTRYPOINT 字段设置需要执行的 shell 脚本,在实际应用场景中,开发者会配置产品本身需要运行的命令,只需在启动产品前增加运行 senseshield 进程的命令即可。

方案三:独立 Docker 容器访问精锐5加密锁(支持软锁)

img

适用场景

  1. 开发者的软件部署在 Docker 容器中,且经常发生变更,不需要根据容器进行授权限制时使用。

  2. 开发者将 Virbox 用户工具 打包部署在独立的 Docker 容器中,减少用户环境的操作步骤,启动独立部署 Virbox 用户工具 的 Docker 后,再次启动其他打包应用的 Docker 即可使用。

相比方案二,方案三具有更强的灵活性。

警告

如果使用软锁,不能在制作docker镜像时就将软锁激活到docker内。因为软锁需要绑定宿主机的硬件指纹,当 “已绑定” 软锁 Docker 更换宿主机再次启动时,由于宿主机硬件信息变更,软锁无法使用,需要重新绑定、激活。所以如果开发者要使用软锁,请在用户环境下启动docker镜像,之后再激活软锁,再次保存激活软锁后的 Docker 镜像。

一、打包独立部署 Virbox 用户工具 的 Docker 镜像

具体的操作步骤请参考“方案二”。

1.下载 CentOS 或 Ubuntu 的 Docker 镜像

2.启动 Docker 镜像

3.在镜像中安装 SS 服务

4.检查 SS 服务安装

5.保存已修改的容器

二、启动独立部署Docker

启动Docker时必须添加参数 (--privileged)管理员权限和(-v /tmp/:/tmp/)与宿主机共享 /tmp/ 系统目录,否则打包应用的 Docker 容器启动后,应用程序运行无法访问加密锁(硬件锁或软锁),提示“连接失败”。

docker run -it --privileged -v /tmp/:/tmp/ centos:latest /bin/bash 

三、启动打包应用的 Docker

打包应用的 Docker 容器内不需要安装 Virbox 用户工具 服务,只需在启动 Docker 时挂载宿主机的 /tmp 目录,再启动后的 Docker 容器中运行加壳后(或集成 Runtime API)的应用程序即可。** **

启动Docker时必须添加参数 -v /tmp/:/tmp/ 与宿主机共享 /tmp/ 系统目录,否则运行程序失败,提示“连接失败”。

docker run -it -v /tmp/:/tmp/ centos:latest /bin/bash 

常见问题

1.CentOS 安装 rpm 错误 Failed to get D-Bus connection

CentOS 系统对 Docker 兼容性的一个已知问题,需要通过增加启动参数解决。

[root@6e661512068a scp]# rpm -ivh senseshield-2.2.0.34298-1.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:senseshield-2.2.0.34298-1 ################################# [100%]
Failed to get D-Bus connection: Operation not permitted
Failed to get D-Bus connection: Operation not permitted
install failed. senseshield service is not running.

解决方案

  1. 检查是否在启动docker镜像时已经添加了 --privileged

  2. 如果已经添加后依然不行。 请在启动时增加参数 -v /sys/fs/cgroup:/sys/fs/cgroup 后重试。

    docker run -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup -v /tmp/:/tmp/ centos:latest /bin/bash 
  3. 第二步操作如果依然未能正常安装,请增加以下步骤:

    • 使用
      docker run -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup -v /tmp/:/tmp/ centos:latest /sbin/init
      启动docker(窗口会出现阻塞现象)
    • 单独开一个终端窗口,使用 docker exec -it CONTAINER_ID /bin/bash 进入docker容器
    • 安装Virbox用户工具,安装后需要保存镜像
    • 使用
      docker run -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup -v /tmp/:/tmp/ <保存后的镜像> /bin/bash
      启动保护后的镜像

2.Docker 共享宿主机 /tmp 目录风险

Docker 启动时共享宿主机 /tmp 目录实现跨 Docker 的许可访问时深盾产品的技术特点,但 Docker 共享宿主机 /tmp 目录后,会在宿主机的磁盘目录下残留文件,增加磁盘占用空间,不会随着 Docker 容器的重启回收资源。

本文只列出已知的风险项,是否存在其他风险,仍需进一步的测试和验证。