强化Docker容器:禁用SUID程序

简介: 本文讲的是强化Docker容器:禁用SUID程序,【编者的话】Docker的安全问题一直是大家关心的热点,本文重点提出启用SUID的程序所带来的安全隐患,提出了对应的解决方法,从而加强Docker的安全保障,值得一读。
本文讲的是强化Docker容器:禁用SUID程序 【编者的话】Docker的安全问题一直是大家关心的热点,本文重点提出启用SUID的程序所带来的安全隐患,提出了对应的解决方法,从而加强Docker的安全保障,值得一读。

大部分人考虑强化Docker容器的时候,首先想到的是将默认用户设置为非root账户。在黑客攻击容器之前,他们需要得到该容器的root权限。如果以非root账户运行容器就会使攻击更为困难。

运行 docker run 或者 docker create 命令时,通过 -u 或者 -user 参数,可以以任意已经存在在目标镜像里的非root用户启动容器。可以先用 docker history 查看容器命令历史记录,在其中查找 adduser 命令,这样可以查出现存用户。可以查看 USER 命令确定是否设定了默认用户。或者,直接从镜像启动一个容器并进入shell命令行直接手动检查。如果你不喜欢这么查来查去,通常也可以直接使用“nobody”用户。

我觉得Tutum最近不会提供特定的接口帮助查看正在容器里运行的用户。因此如果你想要以非root用户运行,必须确保你想启动的镜像服务的默认用户设置成了这个非root用户。

以非root用户运行是一个好的开始,但是还可以做得更好。其中一件有趣的事情是去取消文件里SUID参数的设置,或者直接从镜像里删除带这个参数的文件。现在你可能会问:“SUID参数到底是什么?”

SUID参数是指Linux文件权限。大多数Linux用户对Linux文件权限都有一定的了解。较为熟知的9参数描述了文件拥有者,组以及其他用户对某个特定文件享有的权限。比如:
"-rwxr-xr-x 1 root root" (or 755)

  • 文件拥有者可以读、写和执行该文件
  • 在文件组里的用户可以读和执行该文件
  • 其他任何用户可以读和执行该文件

SUID参数是可执行参数的细化。它告诉Linux在执行该文件时,将活动的组或用户设置为该文件的拥有组或用户。
"-rwsr-xr-x 1 root root"

或者
"-rwxr-sr-x 1 root root"

很多时候普通用户需要访问某个需要特定权限才能访问的程序。最常见的时 ping 命令。我喜欢这个例子因为它有时候显得很微不足道而无害。 ping 要求root权限因为它要使用ICMP协议。一个典型的Linux安装后会包含多个这样的工具。在ubuntu:latest镜像里有22个带有SUID设置的程序。
/sbin/unix_chkpwd
/usr/bin/chage
/usr/bin/passwd
/usr/bin/mail-touchlock
/usr/bin/mail-unlock
/usr/bin/gpasswd
/usr/bin/crontab
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/wall
/usr/bin/mail-lock
/usr/bin/expiry
/usr/bin/dotlockfile
/usr/bin/chsh
/usr/lib/eject/dmcrypt-get-device
/usr/lib/pt_chown
/bin/ping6
/bin/su
/bin/ping
/bin/umount
/bin/mount

如下例子展示SUID参数如何工作。有如下Dockerfile:
FROM ubuntu:latest

RUN chmod u+s /usr/bin/whoami

RUN adduser --system --no-create-home --disabled-password --disabled-login --shell /bin/sh example

USER example

CMD printf "Container running as:          %s\n" `id -u -n` && printf "Effectively running whoami as: %s\n" `whoami`

从这个Dockerfile构建并运行镜像会得到如下输出:
docker build -t tutumblog/suid_whoami . \
&& docker run --rm tutumblog/suid_whoami

…

Container running as:                  example
Effectively running whoami as:  root

在这个例子里,我从基础Ubuntu镜像启动,将 whoami 命令设置上SUID参数。然后为这个镜像添加example用户,并且设置其为从此镜像创建出的容器的默认用户。可以看出问题是,展示了两个不同的当前用户。当example用户执行 whoami 时,因为其带有SUID参数设置,Linux用root用户执行它,所以显示文件的拥有者是root。

现在很明显 whoami 不是一个需要由其拥有者才能执行的程序。实际上它显示了错误的结果。现在需要解决的问题是:“在运行时里我需要带有SUID设置的程序吗?”我认为大部分时候的回答是:“不需要。”

我知道你能找到一些例子说明运行时需要带有SUID参数设置的程序。有些人需要 crontab 。有些人需要 ping 来诊断问题。但是如果这22个程序的其中某个程序有bug怎么办?如果这个程序设置了SUID参数,黑客又探测到这个bug,那么他们将控制整个容器。

取消SUID参数的设置就可以解决这个问题。可以考虑在Dockerfile里增加一行来取消镜像里所有SUID参数的设置。如下示例:
FROM ubuntu:latest

RUN adduser --system --no-create-home --disabled-password --disabled-login --shell /bin/sh example

RUN for i in `find / -perm +6000 -type f`; do chmod a-s $i; done

USER example

CMD /bin/bash

或者,可以直接删除这些程序来解决问题:
…
RUN for i in `find / -perm +6000 -type f`; do rm -f $i; done
…

容器是用来隔离而不是虚拟化的。基于这一点,Docker镜像是用来提供应用或服务启动所需最小的文件集。如果你的确需要其中一些程序以root用户运行,那么可以选择哪些容器需要加强,哪些容器不需要。但是要意识到其中存在的风险。

原文链接:Hardening Docker Containers: Disable SUID Programs (翻译:崔婧雯)

===========================
译者介绍
崔婧雯,现就职于VMware,高级软件工程师,负责桌面虚拟化产品的质量保证工作。曾在IBM WebSphere业务流程管理软件担任多年系统测试工作。对虚拟化,中间件技术有浓厚的兴趣。

原文发布时间为:2015-02-10
本文作者:崔婧雯 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:强化Docker容器:禁用SUID程序
目录
相关文章
|
4月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
4月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
454 6
|
4月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
636 5
|
4月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
769 4
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1024 108
|
7月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
586 57
|
7月前
|
存储 监控 Java
如何对迁移到Docker容器中的应用进行性能优化?
如何对迁移到Docker容器中的应用进行性能优化?
507 59