返回

Docker: Alpine Linux升级且安装openssh导致构建凉凉排查修正

后端

前言

最近在搞一个迭代,发现开发环境的持续集成有些地方可以优化,但需要动到前端基础镜像;而搞完基础镜像准备用起来的时候,问题就冒出来了。本着不能半途而废的态度,搞起~~

问题

这边是用Jenkins做CI,项目构建镜像用的Dockerfile如下:

FROM alpine:3.13.5

RUN apk --update add openssh-server openssh-client

COPY . /usr/src/app

WORKDIR /usr/src/app

CMD ["sh", "run.sh"]

构建的时候就报错:

#16 0.512 sh: 1: openssh: not found
The command '/bin/sh -c sh run.sh' returned a non-zero code: 127

排查

1. 查看Alpine版本

原来alpine是3.13,现在升级到最新版3.16,看看这个版本的变化。

Alpine官网:Alpine Linux 3.16 Release Notes

发现:

  • musl libc version changed to 1.2.3
  • OpenSSL version changed to 1.1.1q

2. 查看构建命令

猜测openssh服务的可执行文件路径变了,直接看看run.sh里面:

#!/bin/sh

# code

exec openssh -tt $(openssh-keygen -f ~/.ssh/id_rsa -q -l) 2>&1

果然,少了/usr/bin,是直接写的openssh。

修正

在构建镜像的时候,将openssh的可执行文件路径改为:

/usr/bin/openssh -tt $(/usr/bin/openssh-keygen -f ~/.ssh/id_rsa -q -l) 2>&1

结语

细心的伙伴就会发现,Alpine Linux的版本从3.15直接跳到了3.16,中间没有3.15.1、3.15.2这样的补丁版本。

这是因为之前版本中存在一个名为“Dirty COW”的高危漏洞,该漏洞的详细内容可以参考:https://www.freebuf.com/vuls/102053.html

这个漏洞的影响范围十分广泛,攻击者可利用该漏洞在未授权的情况下提升权限并执行任意代码,包括在目标主机上安装恶意软件、窃取敏感信息等。

为了解决该漏洞,Alpine Linux团队决定跳过所有低于3.16的版本,直接发布3.16版本,确保用户免受“Dirty COW”漏洞的威胁。

所以,如果您的应用程序需要使用Alpine Linux作为基础镜像,请务必使用3.16版本或更高版本,以确保应用程序的安全性。