一、从构建镜像的角度下手

将非root用户添加到Dockerfile

# RUN命令执行创建用户和用户组(命令创建了一个用户newuser设定ID为5000,并指定了用户登录后使用的主目录和shell)
RUN groupadd --gid 5000 newuser \
  && useradd --home-dir /home/newuser --create-home --uid 5000 --gid 5000 --shell /bin/sh --skel /dev/null newuser

# 指定用户,从这一行往下开始的每个命令都是以newuser身份而不是root身份运行(比如后面的CMD、EntryPoint)
USER newuser

在实际项目应用中,并不是所有要运行的镜像都是我们自己构建的。我们还使用了许多第三方镜像,这种情况我们无法像上面那样直接设定用户。
这些第三方Docker镜像默认情况下一般都是以root用户身份运行,除非我们对其进行处理。
如果是你用K8S,则Kubernetes中Pod安全上下文和Pod安全策略,可以帮助我们以非root身份运行镜像。

二、从K8S启动容器的角度下手

可以使用Pod安全上下文,将Pod的执行限制为特定的非root用户。
通过Pod构建文件中添加securityContext来配置Pod的安全设置。

如下示例:

apiVersion: v1
kind: Pod
metadata:	
  name: pod-helloworld
spec:  
  securityContext: 
    runAsNonRoot: true
    runAsUser: 5000
    runAsGroup: 5000
    fsGroup: 5000    

runAsUser指定Pod内的任何容器仅以userID为5000的运行,runAsGroup指定的容器内所有进程的组ID(组ID不指定默认为0)。
你可以先进入容器,然后使用 ps 命令查看进程的用户。

关于Pod的更多安全策略可以详见 http://docs.kubernetes.org.cn/690.html#FSGroup
查看容器当前用户的命令可以使用 whoami 或者 ps -aux


(END)

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐