kubernetes 在k8s上安全地运行apache容器

jhkqcmku  于 2023-04-05  发布在  Kubernetes
关注(0)|答案(2)|浏览(202)

我构建了一个基于httpd:2.4的docker镜像。在我的k8s部署中,我定义了以下securityContext

securityContext:
  privileged: false
  runAsNonRoot: true
  runAsUser: 431
  allowPrivilegeEscalation: false

当我在没有此securityContext的情况下应用部署时,一切正常,服务器可以正确启动,等等。但是,当我在上面添加securityContext时,我的pod的状态为CrashLoopBackOff,我从$ kubectl logs...获得以下信息

(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs

通过在线搜索,我发现这是因为Apache需要root才能运行,所以以非root身份运行会失败。
我还发现httpd.conf具有以下特性

#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.  
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User daemon
Group daemon

这似乎表明,如果我在securityContext中没有使用runAsNonRootrunAsUser,它应该自动切换到我在httpd.conf中指定的任何用户。但是,当我在本地运行docker run -p 5000:80 my-registry/my-image:1.0.12-alpha的图像,然后运行docker exec -it my-container whoami时,它会打印root
所以我的问题是,我能做些什么来在k8s中以非root身份安全地运行我的容器(并确保它是非root)

3qpi33ja

3qpi33ja1#

在大于1024的端口上运行Apache。
1024以下的端口是特权端口,仅对root用户可用。
因为在此之前你会有一些入口负载均衡器,所以这不重要:-)

ijxebb2r

ijxebb2r2#

尝试在Dockerfile中运行此命令

RUN sed -i "s/Listen 80/Listen ${PORT:-8080}/g" /etc/apache2/ports.conf

此命令是一个Dockerfile指令,它运行sed命令,以使用指定的端口号替换/etc/apache 2/ports.conf文件中的默认Listen 80配置。以下是该命令的详细信息:
RUN是一个Dockerfile指令,允许您在构建过程中在容器内运行命令。
sed是一个命令行实用程序,用于使用正则表达式就地编辑文件。
-i标志告诉sed就地修改文件,这意味着原始文件将被更改覆盖。
“s/Listen 80/Listen ${PORT:-8080}/g”是sed用来查找Listen 80字符串并将其替换为${PORT}环境变量的值,如果未设置${PORT},则替换为默认值8080。
/etc/apache 2/ports.conf是sed要编辑的文件的路径。
该命令可以解释如下:在Docker映像构建过程中,将默认Apache Web服务器端口Listen 80替换为${PORT}环境变量中指定的端口号。如果未设置${PORT},则使用默认端口号8080。这可以通过运行sed命令编辑/etc/apache 2/ports.conf文件来完成。
此命令通常用于在特定端口上运行的Web应用程序的Dockerfiles中,允许用户在运行时通过环境变量定义端口号。

相关问题