如何检查 Docker 镜像是否存在漏洞
Posted 小小怪物
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查 Docker 镜像是否存在漏洞相关的知识,希望对你有一定的参考价值。
定期检查管道中的漏洞非常重要。要执行的步骤之一是对 Docker 映像执行漏洞扫描。在本博客
如何检查 Docker 镜像是否存在漏洞
Docker 镜像是构建容器化应用程序的重要组成部分。与使用虚拟机相比,Docker 镜像具有轻量级、快速部署、易于管理等优点。然而,Docker 镜像中存在的漏洞可能会导致应用程序的整体安全性受到威胁。因此,我们需要检查 Docker 镜像是否存在漏洞。
Docker 镜像漏洞扫描工具
为了检查 Docker 镜像是否存在漏洞,我们可以使用一些工具,如 Clair、Trivy、Dagda 等。这些工具可以根据 Docker 镜像的元数据和包含的软件包信息,检测镜像中是否存在已知的漏洞。
Clair
Clair 是一个开源项目,它可以检测 Docker 镜像中的已知漏洞。它通过与漏洞数据库进行比较,来查找镜像中的漏洞。Clair 具有可扩展性,可以与多种容器编排工具和容器注册表集成。使用 Clair 可以快速地检测 Docker 镜像中的漏洞,并提供详细的漏洞报告。
Trivy
Trivy 是一个轻量级的容器镜像漏洞扫描器。它可以扫描 Docker 镜像中的软件包,并与漏洞数据库进行比对,以检测是否存在已知的漏洞。Trivy 具有良好的易用性和丰富的功能,支持多种镜像格式和运行环境。使用 Trivy 可以快速地检测 Docker 镜像中的漏洞,并提供详细的漏洞报告。
Dagda
Dagda 是一个开源的漏洞扫描器,可以用于 Docker 和 Kubernetes 集群中的安全检查。它可以检测 Docker 镜像中的漏洞,并提供详细的报告和建议。Dagda 还可以检测容器运行时的安全问题,如容器间通信和文件访问权限等。使用 Dagda 可以全面地检测 Docker 镜像中的漏洞和安全问题,并提供针对性的建议和解决方案。
使用 Trivy 检查 Docker 镜像漏洞
Trivy 是一个轻量级的容器镜像漏洞扫描器。它可以扫描 Docker 镜像中的软件包,并与漏洞数据库进行比对,以检测是否存在已知的漏洞。
要使用 Trivy,首先需要在本地安装该工具。安装完成后,可以使用以下命令检查 Docker 镜像是否存在漏洞:
trivy 镜像名称:标签
例如:
trivy nginx:latest
Trivy 将扫描 Docker 镜像中的软件包,并与漏洞数据库进行比对。如果发现镜像中存在已知漏洞,Trivy 将会报告这些问题。
Docker 镜像的漏洞检查是确保容器化应用程序安全的重要步骤。使用 Clair、Trivy、Dagda 等工具可以帮助我们快速检查 Docker 镜像中是否存在已知的漏洞。在使用这些工具时,我们需要及时更新漏洞数据库,以保证检测的准确性。同时,我们也需要注意镜像的来源和更新频率,以避免使用存在漏洞的镜像。最后,我们还需要定期对 Docker 镜像进行漏洞检查和修复,以确保应用程序的安全性和稳定性。
中,您将学习如何执行漏洞扫描,如何修复漏洞,以及如何将其添加到 Jenkins 管道中。享受!
检查Docker镜像是否存在漏洞
在当前的软件开发领域中,Docker已经成为了一个非常流行的选择,其容器化技术可提高应用程序的可移植性,灵活性和安全性。然而,由于Docker容器的特性,容器中的应用程序也可能存在漏洞。 在这篇文章中,我们将探讨如何检查Docker镜像是否存在漏洞。
使用Docker Bench进行安全检查
Docker Bench是Docker官方提供的一个开源工具,用于检查本地机器上的Docker安全设置是否符合最佳实践。Docker Bench可以检查Docker安全设置的各个方面,包括主机配置,Docker配置和容器配置等。使用Docker Bench来检查Docker镜像的漏洞非常方便,只需在本地机器上运行Docker Bench,并提供要检查的Docker镜像的名称即可。
Docker Bench工具使用CIS Docker安全基线作为检测指南,它可以检查Docker主机和容器的安全设置是否符合CIS Docker安全基线。一旦您提供了要检查的Docker镜像的名称,Docker Bench将会下载此镜像并在本地运行一个容器。然后,它会分析容器的配置并向您报告其中存在的安全风险。Docker Bench还会建议必要的修复措施以确保Docker镜像的安全性。
使用Clair进行漏洞扫描
除了Docker Bench之外,还有一款工具可以用于检查Docker镜像中的漏洞,那就是Clair。Clair是一个开源的漏洞扫描工具,它可以分析Docker镜像中的软件包并与已知漏洞数据库进行比较。如果发现Docker镜像中的软件包存在已知漏洞,则Clair将会报告这些漏洞。
Clair工具使用漏洞数据库来扫描Docker镜像中的软件包,如果它发现软件包存在漏洞,则会向您报告这些漏洞。Clair通过扫描Docker镜像中的每个软件包来实现漏洞检测。它还会为每个软件包提供漏洞报告,并列出所有已知的漏洞。这将有助于您快速识别Docker镜像中存在的漏洞并采取必要的修复措施。
使用Docker Security Scanning
Docker Security Scanning是Docker官方提供的一项服务,可用于检查Docker镜像中的漏洞。Docker Security Scanning使用漏洞数据库来扫描Docker镜像中的软件包,并报告已知的漏洞。
Docker Security Scanning是Docker的一项付费服务,您需要在Docker Hub上购买计划才能使用此服务。一旦您购买了Docker Security Scanning计划,您就可以将其集成到Docker Hub中,并使用它来检查Docker镜像中存在的漏洞。 Docker Security Scanning会扫描Docker镜像中的每个软件包,并与漏洞数据库进行比较,以查找已知漏洞。如果发现存在漏洞,则Docker Security Scanning将向您报告这些漏洞,并提供必要的修复建议。
结论
在Docker容器中使用安全的镜像是确保容器安全性的首要步骤。在本文中,我们介绍了三种工具来检查Docker镜像是否存在漏洞。使用这些工具,您可以快速识别Docker镜像中存在的安全漏洞并采取必要的修复措施。请记住,使用这些工具来检查Docker镜像的漏洞只是保证容器安全性的第一步,您还需要采取其他安全措施来确保容器的安全性。
如何检查本地是不是存在带有特定标签的 Docker 镜像?
【中文标题】如何检查本地是不是存在带有特定标签的 Docker 镜像?【英文标题】:How to check if a Docker image with a specific tag exist locally?如何检查本地是否存在带有特定标签的 Docker 镜像? 【发布时间】:2015-08-13 03:16:34 【问题描述】:我想知道本地是否存在带有特定标签的 Docker 映像。如果 Docker 客户端本身无法执行此操作,我可以使用 bash 脚本。
只是为潜在的 bash 脚本提供一些提示,运行 docker images
命令的结果返回以下内容:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
rabbitmq latest e8e654c05c91 5 weeks ago 143.5 MB
busybox latest 8c2e06607696 6 weeks ago 2.433 MB
rabbitmq 3.4.4 a4fbaad9f996 11 weeks ago 131.5 MB
【问题讨论】:
【参考方案1】:我通常测试docker images -q
的结果(如this script):
if [[ "$(docker images -q myimage:mytag 2> /dev/null)" == "" ]]; then
# do something
fi
但是由于。docker images
只接受REPOSITORY
作为参数,你需要在标签上grep,而不使用-q
docker images
现在接受标签(docker 1.8+)[REPOSITORY[:TAG]]
下面提到的另一种方法是使用docker inspect。
但是对于 docker 17+,图像的语法是:docker image inspect
(在不存在的图像上,exit status will be non-0)
正如iTayb 在the comments 中所指出的:
docker images -q
方法在具有大量图像的机器上会变得非常慢。在 6500 张图像的机器上运行需要 44 秒。
docker image inspect
立即返回。
Henry Blyth 在 cmets 中指出:
如果你使用
docker image inspect my_image:my_tag
,并且你想忽略输出,你可以添加--format="ignore me"
,它会直接打印出来。您也可以通过添加
>/dev/null
来重定向标准输出,但是,如果您不能在脚本中这样做,那么格式选项可以正常工作。
【讨论】:
嗯不确定这是否适用于标签?当我执行“docker images -q rabbitmq”时,它返回“e8e654c05c91 and a4fbaad9f996”,但如果我执行“docker images -q rabbitmq:3.4.4”,即使标签存在,也不会返回任何内容。 @Johan 即使标签存在于本地? @Johan 我只是仔细检查了一遍,docker images 参数确实只接受了 repo,而不是标签。我已编辑答案以提出替代解决方案。 谢谢,这似乎有效。但也许你应该编辑你的答案并在我接受之前从“myimage:mytag”中删除“:mytag”? @HenryBlyth 感谢您的反馈。我已将您的评论包含在答案中以提高知名度。【参考方案2】:试试docker inspect
,例如:
$ docker inspect --type=image treeder/hello.rb:nada
Error: No such image: treeder/hello.rb:nada
[]
但是现在有了一个存在的图像,你会得到一堆信息,例如:
$ docker inspect --type=image treeder/hello.rb:latest
[
"Id": "85c5116a2835521de2c52f10ab5dda0ff002a4a12aa476c141aace9bc67f43ad",
"Parent": "ecf63f5eb5e89e5974875da3998d72abc0d3d0e4ae2354887fffba037b356ad5",
"Comment": "",
"Created": "2015-09-23T22:06:38.86684783Z",
...
]
而且它是一个不错的 json 格式。
【讨论】:
这是最适合编写脚本的答案。 确实,images
和 ps
命令总是以 0 退出,inspect
很简单:docker inspect "$image_id:$image_tag" > /dev/null 2>&1 || echo "does not exist!"
docker inspect
很棒,因为在不存在图像时返回非零代码。
这也比docker images -q
快得多。
如果你想在你的脚本中禁止输出:if ! docker inspect <CONDITION> >> temp_docker-inspect.txt; then ...
【参考方案3】:
tldr:
docker image inspect myimage:mytag
通过演示的方式...
成功,找到图片:
$ docker image pull busybox:latest
latest: Pulling from library/busybox
Digest: sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f
Status: Image is up to date for busybox:latest
$ docker image inspect busybox:latest >/dev/null 2>&1 && echo yes || echo no
yes
失败,图片丢失:
$ docker image rm busybox:latest
Untagged: busybox:latest
Untagged: busybox@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f
$ docker image inspect busybox:latest >/dev/null 2>&1 && echo yes || echo no
no
参考:
https://docs.docker.com/engine/reference/commandline/image_inspect/
【讨论】:
这很简单,快速且兼容未来。我会坚持这个解决方案。 更具体地说,为图像指定--type image
,或为现有容器指定--type container
@smac89,我不熟悉那个选项。 ``` $ docker --version Docker version 20.10.6, build 370c289 $ docker image inspect --help 用法:docker image inspect [OPTIONS] IMAGE [IMAGE...] 显示一个或多个图像的详细信息 选项:-f , --format string 使用给定的 Go 模板格式化输出```
哦,哎呀,我在做docker inspect
,而不是docker image inspect
。【参考方案4】:
你可以像下面这样使用:
[ -n "$(docker images -q someimage:sometag)" ] || echo "does not exist"
或者:
[ -z "$(docker images -q someimage:sometag)" ] || echo "already exists"
【讨论】:
不起作用,至少在macOS上,返回值始终为0。 代码正确,适用于linux。我唯一要添加的是子shell命令的引号 @GaborCsardi 这个适用于 MacOS:[[ -z "$(docker images -q someimage:sometag)" ]] || echo "exists"
和 [[ -n "$(docker images -q someimage:sometag)" ]] || echo "doesn't exist"
。编辑答案。现在应该可以正常工作了。 Gabor,你能确认一下吗?【参考方案5】:
在上面Vonc's answer 的帮助下,我创建了以下名为check.sh
的bash 脚本:
#!/bin/bash
image_and_tag="$1"
image_and_tag_array=($image_and_tag//:/ )
if [[ "$(docker images $image_and_tag_array[0] | grep $image_and_tag_array[1] 2> /dev/null)" != "" ]]; then
echo "exists"
else
echo "doesn't exist"
fi
将其用于现有图像和标签将打印exists
,例如:
./check.sh rabbitmq:3.4.4
将它用于不存在的图像和标签将打印doesn't exist
,例如:
./check.sh rabbitmq:3.4.3
【讨论】:
【参考方案6】:如果您尝试从 docker 注册表中搜索 docker 映像,我想检查 docker 映像是否存在的最简单方法是使用 Docker V2 REST API Tags list service
例子:-
curl $CURLOPTS -H "Authorization: Bearer $token" "https://hub.docker.com:4443/v2/your-repo-name/tags/list"
如果上面的结果返回 200Ok 并带有图像标签列表,那么我们知道图像存在
"name":"your-repo-name","tags":["1.0.0.1533677221","1.0.0.1533740305","1.0.0.1535659921","1.0.0.1535665433","latest"]
如果你看到类似的东西
"errors":["code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":"name":"your-repo-name"]
那么你肯定知道该图像不存在。
【讨论】:
【参考方案7】:使用test
if test ! -z "$(docker images -q <name:tag>)"; then
echo "Exist"
fi
或一行
test ! -z "$(docker images -q <name:tag>)" && echo exist
【讨论】:
【参考方案8】:在 bash 脚本中,我这样做是为了通过标签检查图像是否存在:
IMAGE_NAME="mysql:5.6"
if docker image ls -a "$IMAGE_NAME" | grep -Fq "$IMAGE_NAME" 1>/dev/null; then
echo "could found image $IMAGE_NAME..."
fi
上面的示例脚本检查是否存在带有 5.6 标签的 mysql 映像。如果您只想检查是否存在任何没有特定版本的 mysql 映像,那么只需传递不带标签的存储库名称:
IMAGE_NAME="mysql"
【讨论】:
【参考方案9】:受上述@rubicks 回复的启发。
检查图像是否已经存在
image_name_tag="alpine:3.13.3"
docker image inspect $image_name_tag > /dev/null
echo $?
如果图片不存在则拉取
docker image inspect $image_name_tag > /dev/null || docker pull $image_name_tag
演示执行
# image_name_tag="alpine:3.13.3"
#
# docker image inspect $image_name_tag > /dev/null
echo $?
Error: No such image: alpine:3.13.3
# echo $?
1
# docker image inspect $image_name_tag > /dev/null || docker pull $image_name_tag
Error: No such image: alpine:3.13.3
3.13.3: Pulling from library/alpine
9aae54b2144e: Pull complete
Digest: sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa
Status: Downloaded newer image for alpine:3.13.3
docker.io/library/alpine:3.13.3
# docker image inspect $image_name_tag > /dev/null || docker pull $image_name_tag
$
【讨论】:
【参考方案10】:我只是给非常好的读者一点点:
构建
#!/bin/bash -e
docker build -t smpp-gateway smpp
(if [ $(docker ps -a | grep smpp-gateway | cut -d " " -f1) ]; then \
echo $(docker rm -f smpp-gateway); \
else \
echo OK; \
fi;);
docker run --restart always -d --network="host" --name smpp-gateway smpp-gateway:latest
观看
docker logs --tail 50 --follow --timestamps smpp-gateway
运行
sudo docker exec -it \
$(sudo docker ps | grep "smpp-gateway:latest" | cut -d " " -f1) \
/bin/bash
【讨论】:
【参考方案11】:对于特定的标签名称
$ docker images --filter reference='<REPOSITORY>:TAG'
for "like 子句" tagname:my_image_tag --> start my_ima*
$ docker images --filter reference='<REPOSITORY>:my_ima*'
如果你想要一些“图像”,例如删除所有图像标签开始“my_ima”试试这个
docker rmi -f $(docker images -q --filter reference='myreponame:my_ima*')
【讨论】:
如果镜像不存在,退出码依然为0。因此,它与在脚本中使用无关,仅对人类(谁可以使用更通用的docker镜像| grep 也是)【参考方案12】:我认为这个功能应该在docker build
命令中实现(使用标志?),这样可以避免大量的代码重复。
我在名为docker_build
的包装函数中使用了与accepted answer 相同的条件,以便在调用原始docker build
命令之前进行必要的检查。
# Usage: docker_build <...> (instead of docker build)
docker_build()
local arguments=("$@")
local index
for (( index=0; index<$#; index++ )); do
case $arguments[index] in
--tag)
local tag=$arguments[index+1]
if [[ ! -z $(docker images -q "$tag" 2> /dev/null) ]]; then
echo "Image $tag already exists."
return
fi
;;
esac
done
command docker build "$@"
免责声明:这不适用于生产,因为它仅适用于长格式的空格分隔参数,即--tag hello-world:latest
。此外,这只是修改了docker build
命令,所有其他命令保持不变。如果有人有改进,请告诉我。
我之所以愿意分享这个 sn-p,是因为在 bash-functions 中包装标准命令以避免代码重复的想法似乎比编写包装语句更优雅和可扩展。
【讨论】:
【参考方案13】:我喜欢这个,因为它简洁并且具有正确的语义。如果图像存在,那是真的,还有什么比这更容易的呢?
if [ $(docker image ls $build_env --format="true") ] ;
then
echo "does exist"
fi
【讨论】:
以上是关于如何检查 Docker 镜像是否存在漏洞的主要内容,如果未能解决你的问题,请参考以下文章