中国领先的IT技术网站
|
|

应对SUID程序带来隐患,增强Docker程序安全

Docker的安全问题一直是大家关心的热点,本文重点提出启用SUID的程序所带来的安全隐患,提出了对应的解决方法,从而加强Docker的安全保障,值得一读。

作者:崔婧雯来源:dockerone|2015-02-13 10:06


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参数描述了文件拥有者,组以及其他用户对某个特定文件享有的权限。比如:

  1. "-rwxr-xr-x 1 root root" (or 755)
  • 文件拥有者可以读、写和执行该文件
  • 在文件组里的用户可以读和执行该文件
  • 其他任何用户可以读和执行该文件

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

  1. "-rwsr-xr-x 1 root root" 

或者

  1. "-rwxr-sr-x 1 root root" 

很多时候普通用户需要访问某个需要特定权限才能访问的程序。最常见的时ping命令。我喜欢这个例子因为它有时候显得很微不足道而无害。ping要求root权限因为它要使用ICMP协议。一个典型的Linux安装后会包含多个这样的工具。在ubuntu:latest镜像里有22个带有SUID设置的程序。

  1. /sbin/unix_chkpwd 
  2. /usr/bin/chage 
  3. /usr/bin/passwd 
  4. /usr/bin/mail-touchlock 
  5. /usr/bin/mail-unlock 
  6. /usr/bin/gpasswd 
  7. /usr/bin/crontab 
  8. /usr/bin/chfn 
  9. /usr/bin/newgrp 
  10. /usr/bin/sudo 
  11. /usr/bin/wall 
  12. /usr/bin/mail-lock 
  13. /usr/bin/expiry 
  14. /usr/bin/dotlockfile 
  15. /usr/bin/chsh 
  16. /usr/lib/eject/dmcrypt-get-device 
  17. /usr/lib/pt_chown 
  18. /bin/ping6 
  19. /bin/su 
  20. /bin/ping 
  21. /bin/umount 
  22. /bin/mount 

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

  1. FROM ubuntu:latest 
  2.  
  3. RUN chmod u+s /usr/bin/whoami 
  4.  
  5. RUN adduser --system --no-create-home --disabled-password --disabled-login --shell /bin/sh example 
  6.  
  7. USER example 
  8.  
  9. CMD printf "Container running as: %s\n" `id -u -n` && printf "Effectively running whoami as: %s\n" `whoami` 

从这个Dockerfile构建并运行镜像会得到如下输出:

  1. docker build -t tutumblog/suid_whoami . \ 
  2. && docker run --rm tutumblog/suid_whoami 
  3.  
  4. … 
  5.  
  6. Container running as: example 
  7. 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参数的设置。如下示例:

  1. FROM ubuntu:latest 
  2.  
  3. RUN adduser --system --no-create-home --disabled-password --disabled-login --shell /bin/sh example 
  4.  
  5. RUN for i in `find / -perm +6000 -type f`; do chmod a-s $i; done 
  6.  
  7. USER example 
  8.  
  9. CMD /bin/bash 

或者,可以直接删除这些程序来解决问题:

  1. … 
  2. RUN for i in `find / -perm +6000 -type f`; do rm -f $i; done 
  3. … 

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

原文链接:http://dockerone.com/article/193

【编辑推荐】

  1. 基于Docker开发的PaaS平台 DINP
  2. Docker 1.5新特性:支持IPV6、只读容器、容器运行监控,还有彩蛋
  3. 完美应对企业生产环境的挑战,Docker是否已做好准备?
  4. 赞!Docker生态系统常用组件介绍 开启快乐开发之旅
  5. Java开发人员:如何穿过Docker现象这片"丛林"
【责任编辑:Ophira TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

C#2005编程进阶与参考手册

本书非常详细而全面地介绍了C#程序设计语言。本书不是“5分钟学习C#”式的手册,也不是那种教您“照猫画虎”地创建一些与您的实际工作需要...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊