如何运行没有Root权限的Docker?干货来了!

作者 | Vaibhav Raizada

译者 | 天道酬勤责编 | 徐威龙

封图| CSDN 下载于视觉中国

在本文中,我们讨论了如何在没有root权限的情况下运行Docker,以便更好地管理容器中的安全性。

 

Docker作为Root用户

 

Docker以root用户身份运行其容器。但是你的工作负载真的需要root权限吗?答案是很少需要。尽管如此,默认情况下,你的容器仍将以root用户身份运行。这可能会带来严重的安全问题。实际上,以root用户身份在容器内部运行的进程实际上是在主机本身上以root用户身份运行的进程。这给恶意尝试获得对主机本身的不受限制的访问提供了机会。

你可以自己检查它,只需在常用的任何图像上使用以下命令:

Shell$ kubectl run -i --tty hello-world --image=hello-world --restart=Never -- sh
/ # ps aux
PID   USER     TIME  COMMAND
1   root     0:10  sh

显然,作为一种最佳实践,我们应该避免以超root用户身份运行容器。因此,我们如何解决此问题,让我们看看如何以非root用户身份运行容器。

 

将非超级用户添加到Dockerfile

 

创建一个仅具有容器内工作负载所需权限的用户。你可以在容器图像本身的Dockerfile中使用RUN命令创建用户。

DockerfileRUN groupadd --gid 5000 newuser \&& useradd --home-dir /home/newuser --create-home --uid 5000 \--gid 5000 --shell /bin/sh --skel /dev/null newuser

上面的代码行创建了一个用户newuser以及该用户的home和shell。现在,只需将用户添加到Dockerfile中,如以下示例所示:

DockerfileFROM ubuntu:18.04
COPY . /myapp
RUN make /myapp
...
USER newuser
CMD python /myapp/hello.py

从第7行(USER newuser)开始,每个命令都以newuser而不是root身份运行。这样做很简单,对不对?

但是,我们并不总是仅使用自定义的图像。我们还使用了许多第三方图像,因此我们无法像上面那样将非root用户注入到这些图像中。

默认情况下,这些第三方Docker图像将以root用户身份运行,除非我们对其进行处理。如果你使用的图像来自一个不太流行的源 ,那么该图像甚至可能嵌入了恶意命令,这可能会损害集群的安全性。

Kubernetes Pod安全上下文和Pod安全策略可以为我们提供帮助。

 

使用Pod安全上下文

 

你可以使用Pod安全上下文将Pod的执行限制为特定的非root用户。要为Pod指定这些安全设置,请在Pod规范中添加securityContext字段。

YAMLapiVersion: v1
kind: Pod
metadata:name: my-pod
spec:securityContext:runAsUser: 5000runAsGroup: 5000volumes:- name: my-volemptyDir: {}containers:- name: my-containerimage: hello-worldcommand: ["sh", "-c", "sleep 10 m"]volumeMounts:- name: my-volmountPath: /data/hellosecurityContext:allowPrivilegeEscalation: false

在以上规范中,runAsUser指定pod内的任何容器仅使用userID 5000运行。这是我们专门为非root用户创建的用户。  runAsGroup指定所有进程的群组ID。如果我们不提及这一点,则群组ID将是root(0)。

现在,你可以创建此pod并检查容器中运行的进程:

Shell$ kubectl apply -f my-pod.yaml
$ kubectl exec -it my-pod – sh
ps
PID   USER     TIME  COMMAND1   5000     0:00  sleep 10 m6   5000     0:00  sh

如上所示,PID 1正在以userID 5000而不是root用户身份运行的。

使用Kubernetes Pod安全策略

Kubernetes Pod安全策略定义了Pod必须运行的条件, 否则,它不会在集群中提供。换句话说,如果不满足这些条件,Kubernetes将阻止Pod运行。 

下面给出了一个示例PodSecurityPolicy:

YAMLapiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: my-psp
spec:privileged: false#Required to prevent escalations to root.allowPrivilegeEscalation: falseallowedCapabilities:- '*'volumes:- 'nfs'hostNetwork: truehostPorts:- min: 8000max: 8000hostIPC: truehostPID: truerunAsUser:#Require the container to run without root.rule: 'MustRunAsNonRoot'seLinux:rule: 'RunAsAny'supplementalGroups:rule: 'RunAsAny'fsGroup:rule: 'RunAsAny'

该安全策略实现以下目的:

  • 限制容器在权限模式下运行。

  • 限制需要root的容器。

  • 限制访问除NFS卷以外的esvolumes的容器。

  • 仅允许容器访问主机端口100。

激活策略:

Shell$ kubectl create -f my-psp.yaml

检查策略:

Shell$ kubectl get psp
NAME    PRIV   RUNASUSER         FSGROUP   SELINUX   VOLUMES
My-psp  false  MustRunAsNonRoot  RunAsAny  RunAsAny  [nfs]

现在已经创建了策略,你可以通过尝试以root权限运行容器来对其进行测试。

Shell$ kubectl run --image=my-root-container

pod安全策略将禁止其运行并给出一个错误消息: 

Shell$ kubectl get pods
NAME         READY    STATUS
my-root-pod  0/1      container has runAsNonRoot and image will run as root

 

结论

 

在这篇文章中,我们强调了在root用户的默认设置下运行Docker容器的固有风险。我们还提出了多种方法来克服这种风险。

  • 如果你正在运行自定义图像,那么可以创建一个新的非root用户并在Dockerfile中指定它。

  • 如果使用的是第三方图像,则可以在Pod或容器级别设置安全上下文。

  • 还有一种方法是创建一个Pod安全策略,该策略将不允许任何容器以root权限运行。

如果有不清楚的地方或其他意见,欢迎评论告诉我们。

原文:https://dzone.com/articles/docker-without-root-privileges

2020 AI 开发者万人大会将于6月26日通过线上直播形式,让开发者们一站式学习了解当下 AI 的前沿技术研究、核心技术与应用以及企业案例的实践经验,同时还可以在线参加精彩多样的开发者沙龙与编程项目。参与前瞻系列活动、在线直播互动,不仅可以与上万名开发者们一起交流,还有机会赢取直播专属好礼,与技术大咖连麦。

今日福利:评论区留言入选,都可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。  快来动动手指,写下你想说的话吧!

推荐阅读:破解面试难题8个角度带你解读SQL面试技巧!
GitHub 接连封杀开源项目惹众怒,CEO 亲自道歉!
5 亿微博数据疑泄露,Python 爬虫如何避免踩天坑?
我就不信 35 岁做不了程序员!
在非托管钱包中可能会出现价值3000万美元的BCH SIM 交换黑客攻击吗?
对标Pytorch,清华团队推出自研AI框架“计图”
真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建主从数据库出现的错误 error connecting to master ‘slave@172.17.0.2:3306‘ - retry-time: 30 retries: 1

在搭建主从数据库的时候出现了报错 出现错误的截图: 解决办法: 重新授权 CREATE USER slave% IDENTIFIED BY 123456; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave%;参考链接: 搭建主从数据库出现的错误error connecting to master …

Java-For循环

public class ForDemo01 {public static void main(String[] args) {int a 1; // 初始化条件while (a<100){ // 条件判断System.out.println(a);a2;}System.out.println("while 循环结束&#xff01;");// 初始化 // 条件判断 // 迭代for(int i1;i<100;i){S…

spring.shardingsphere.rules.sharding.sharding-algorithms.database_inline.props‘ is not valid

spring.shardingsphere.rules.sharding.sharding-algorithms.database_inline.props is not valid 解决方案&#xff1a; 原配置 修改后

以云战“疫”,这次阿里云又让人们惊了……

本文转载自CSDN博主「L-JingJing」的原创文章 近日&#xff0c;阿里云对外宣布其容器服务调度GPU云服务器启动加速计算&#xff0c;最快只需60秒即可完成新冠病毒的核酸对比工作&#xff1b;同时将向医疗科研机构、疾控中心等一线病毒研究机构免费开放基因计算服务&#xff0c…

Java-增强for循环

public class ForDemo05 {public static void main(String[] args) {int[] numbers {10, 20, 30, 40}; // 定义一个数组for (int number : numbers) {System.out.println(number);}} }https://www.bilibili.com/video/BV12J41137hu?p42&spm_id_frompageDriver

五年从P5到P8,在阿里学做个靠谱的人

师兄文化&#xff0c;是阿里的老传统&#xff0c;新人入职都要认个师兄。 不是江湖上这种师兄哈&#xff0c;但帅是一样帅的 今天和大家聊聊我在阿里当师兄的故事。 我是“改之”&#xff0c;不是“有则改之无则加勉”的改之&#xff0c;而是“杨过&#xff0c;字改之”的那…

@开发者,微软 CEO 萨提亚带领 60 位大咖的集结令,你敢接吗?

2020年初&#xff0c;一场突如其来的疫情打乱了所有人的脚步&#xff0c;给人们的生活、工作、学习带来诸多不便&#xff0c;与此同时&#xff0c;我们看到一些企业迅速响应&#xff1a;各式买菜小程序、远程工具、在线教育的火爆……这背后&#xff0c;是企业的数字化转型步伐…

支付宝技术风险负责人陈亮:把事情做到极致,技术的差异性才会体现出来

“很多事情&#xff0c;说出来很多人都在做&#xff0c;但是只有真正做到极致&#xff0c;技术的差异性才会体现出来”&#xff0c;蚂蚁金服技术风险部研究员陈亮&#xff08;花名&#xff1a;俊义&#xff09;在接受 InfoQ 采访时如是说道。在此前的支付宝技术嘉年华&#xff…

Java-break-continue

https://www.bilibili.com/video/BV12J41137hu?p43&spm_id_frompageDriver

2020 年,为什么非要采用 DevOps 文化不可?

来源 | DevOps Zone 译者 | 苏本如&#xff0c;责编 | 夕颜头图 | CSDN 下载自视觉中国出品 | CSDN&#xff08;ID:CSDNnews&#xff09;2020年已经到来&#xff0c;它的到来带来了信息和技术&#xff08;IT&#xff09;领域的诸多创新和变革&#xff0c;特别是对DevOps技术的创…

走进KeyDB

KeyDB项目是从redis fork出来的分支。众所周知redis是一个单线程的kv内存存储系统&#xff0c;而KeyDB在100%兼容redis API的情况下将redis改造成多线程。 网上公开的技术细节比较少&#xff0c;本文基本是通过阅读源码总结出来的&#xff0c;如有错漏之处欢迎指正。 多线程架…

Java-打印三角形

public class TestDemo01 {public static void main(String[] args) {// 打印三角形 5 行for (int i 1; i < 5; i) {// 先打印出左边的 直角三角形for (int j 5; j > i; j--) {System.out.print(" ");}for (int j 1; j<i; j) {System.out.print("*…

Springboot2.x +JPA 集成 Apache ShardingSphere 读写分离

分库分表背景: 数据库性能瓶颈&#xff1a;主要分为按照业务来划分或者按照数据量来划分。 拆分方式&#xff1a; 水平拆分(每个表的结构都一样)&#xff1a;订单表数据量大&#xff0c;我们可以水平拆分 &#xff0c;分成order表1、order表2、order表3 。。。 垂直拆分&#x…

只要 8 个步骤,学会这个 Docker 命令终极教程!

作者 | Timothy Mugayi译者 | 弯月 责编 | 徐威龙封图| CSDN 下载于视觉中国Docker容器已经从一种锦上添花的技术转变成了部署环境的必需品。有时&#xff0c;作为开发人员&#xff0c;我们需要花费大量时间调试或研究Docker工具来帮助我们提高生产力。每一次新技术浪潮来临之际…

优秀工程师必备的一项技能,你解锁了吗?

阿里妹导读&#xff1a;很多程序员在工作一段时间后会遇到迷茫期&#xff0c;虽有技术傍身&#xff0c;也难免会产生焦虑&#xff0c;反复思考怎样才能快速成长。关于如何提高自己的思考力&#xff0c;运用思考的力量推动能力提升&#xff0c;以此实现技术成长&#xff0c;阿里…

Springboot2.x +JPA 集成 Apache ShardingSphere 分表+读写分离

分库分表背景: 数据库性能瓶颈&#xff1a;主要分为按照业务来划分或者按照数据量来划分。 拆分方式&#xff1a; 水平拆分(每个表的结构都一样)&#xff1a;订单表数据量大&#xff0c;我们可以水平拆分 &#xff0c;分成order表1、order表2、order表3 。。。 垂直拆分&#x…

Java-方法重载

https://www.bilibili.com/video/BV12J41137hu?p47&spm_id_frompageDriver

Blink 有何特别之处?菜鸟供应链场景最佳实践

作者&#xff1a;晨笙、缘桥 菜鸟供应链业务链路长、节点多、实体多&#xff0c;使得技术团队在建设供应链实时数仓的过程中&#xff0c;面临着诸多挑战&#xff0c;如&#xff1a;如何实现实时变Key统计&#xff1f;如何实现实时超时统计&#xff1f;如何进行有效地资源优化&a…

为什么要在油气行业中应用 IoT?这 8 个应用场景告诉你 IoT 在油气行业中可以做什么...

作者 | Vova Shevchyk译者 | 风车云马 责编 | 徐威龙封图| CSDN 下载于视觉中国如今&#xff0c;物联网已经进入了各行各业&#xff1a;汽车、农业、绿色能源。物联网还将征服的领域之一是石油和天然气领域。在这些特殊的行业环境中&#xff0c;公司雇佣专业人员来预测机器何时…

Java-命令行传递参数

package method;public class Demo01 {public static void main(String[] args) {// args.length 数组长度for (int i 0; i < args.length; i) {System.out.println("args["i"]: "args[i]);}} }https://www.bilibili.com/video/BV12J41137hu?p48&…