对于在 Ubuntu Server 16.04 或 18.04 上运行我的 Web 服务的用户,我想集成 ImageMagick 等有用程序的功能。例如,我想裁剪他们的个人资料图片或创建缩略图。
但由于软件普遍存在缺陷,尤其是 ImageMagick很多其中[1] [2],显然最好将 ImageMagick 的执行与服务器的其余部分隔离开来,对吗?
那么,从安全角度来看,隔离 ImageMagick 的最佳方法是什么?考虑到设置应尽可能简单,并且 ImageMagick 必须每隔几秒运行一次(在高峰时段甚至每秒运行多次)。理想情况下,ImageMagick 不仅应与主机隔离,而且 ImageMagick 执行(及其操作的数据)也应相互隔离。
我猜可以使用虚拟机或容器(例如 Docker)来实现这一点?容器是否更适合,因为它们的安装和拆卸速度更快?
此外,如何开始比较好?我看过各种手册,但不知道从哪里开始,也不知道需要哪些组件。
到目前为止,我所拥有的是以下内容。虽然我不知道这是否真的安全,并且如果可能的话,昂贵的软件包安装应该只进行一次。此外,我不确定这是否真的允许多个用户并行执行。
Dockerfile:
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y imagemagick
VOLUME ["/my-images"]
WORKDIR /my-images
ENTRYPOINT ["convert"]
初始化:
docker build -t my-imagemagick .
用法:
docker run --rm --volume=$(pwd):/my-images:rw my-imagemagick -resize 500 /my-images/input.jpg /my-images/output.jpg
答案1
容器概述
Docker 容器或 KVM 的行为就像一个真正的系统。您甚至可以进入容器并在那里进行更改,没有问题。使用 bash、安装包等等(以防您忘记了什么或想要检查什么)。
容器的优点是升级和重建起来更容易。使用您自己的 Docker 注册表,您甚至可以同时拥有不同名称的版本。
将用户数据存储在额外的容器中
我建议将数据存储在附加到 Docker 容器的数据容器中。这将防止容器具有最终位于真实服务器上的文件夹的挂载点。相反,当您重建 ImageMagick Docker 容器并在任何给定时间将数据容器重新连接到它时,使用数据容器并附加/分离数据容器。没有数据丢失,但您将所有文件都放在一个容器中,该容器也可以很容易地移动。
关于安全
如上所述,容器的行为类似于真实系统,因此它也可以像真实系统一样受到黑客攻击。这意味着攻击者仍然可以获取客户数据和此机器的 root 访问权限。由于缺少补丁等原因,突破 docker 容器并不容易,但也可能实现。我自己有一个简单的技巧,用来让攻击者更难得逞。我只是每隔几个小时/一天根据 crontab 重建容器。因此,如果攻击者获得访问权限,他必须在几个小时/一天后重新开始。
还可以尝试将 nginx 容器附加到它,以便通过反向代理触发 ImageMagick,而不是让 ImageMagick 本身获得访问权限。很容易建立一个容器生产链 nginx --> Imagemagick --> 数据容器
因此,您最终会得到 2-3 个容器,它们被链接在一起形成一个独立的生产链。
哈,
延斯
PS:要了解更多细节,您需要更多有关 docker 的知识。但我认为您建议的方法是正确的。
PPS:您也可以采用传统方式,只需使用 chroot 环境即可。但设置起来更困难,维护起来更困难,因为位于您的服务器本身。
答案2
您可以使用一个容器来调整位于已安装文件夹中的所有图像的大小。您需要在 Docker 文件中进行幻灯片更改并构建 Docker 映像。
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y imagemagick
VOLUME ["/my-images"]
WORKDIR /my-images
CMD ["magick", "-help"]
构建 Docker 镜像。
docker build -t my-imagemagick .
运行docker容器并立即调整位于/my-images文件夹中的图像大小。
docker run --rm -v "$( pwd ):/my-images" my-imagemagick find -type f -iname '*.jpg' -o -iname '*.jpeg' -exec convert {} -verbose -resize "500x500>" {} \;
您还可以将命令作为 cronjob 运行以安排它。要允许系统上的多个用户运行此命令。您需要在 docker 组中添加用户。