Docker说明:如何创建运行Memcached功能的Docker容器

Docker说明:如何创建运行Memcached功能的Docker容器

Dec 16, 2013 Docker, Server Optimization Ubuntu

简介

对大多数网络应用来说,CPU很少成为HTTP请求丢失或者网络堵塞的元凶。更常见的情况是,设计的一个没有缓存层参与的工程,占用了所有的后端数据存储资源(例如你选择的数据库)。

Memcached——无需再多做介绍——可以极大的提升应用的栈部署性能,并且不需要对可用的资源进行任何修改(它能帮你用尽每一滴资源)。

在这篇DigitalOcean的文章中,记得特别注意主机运行了多个网络应用(比如多个WordPress实例,Python应用等),我们准备创建一个Docker镜像,可以快速的开始运行(一经要求)Memcached容器,并且可以独立运行。这些容器可以帮助被托管的应用程序变得更好更快,并保持一个安全的环境。

术语表

1. Docker简介

2. Memcached简介

3. 在Ubuntu上安装Docker

4. 基础Docker命令

1. Running the docker daemon and CLI Usage

2. docker命令

5. 从创建Memcached镜像开始

1. 快速回顾: 什么是Dockerfile?

2. Dockerfile命令回顾

3. 创建一个Dockerfile

4. Final Dockerfile

5. 为Memcached容器创建Docker镜像

6. 运行Dockerised化的Memcached容器

1. 创建一个安装Memcached的容器

2. 限制Memcached容器的内存大小

3. 测试Memcached容器

Docker简介

Docker项目提供的高级工具,支持协同工作,是在一些Linux内核功能的基础上建立的。目的是为了帮助开发者和系统管理员连接应用程序——联合所有的依赖关系——然后让它们能够跨系统、跨主机运行,免去了许多令人头疼的问题。

Docker为应用程序创建安全,基于LXC(即Linux容器)的环境,称为Docker容器。这些使用Docker镜像创建的容器,既可以通过人工执行命令,也可以通过Dockerfile自动创建。

Note:了解更多关于Docker和它的的组件(比如docker daemon, CLI, images等)的信息,参见我们对这个项目的介绍文章:docker Explained: Getting Started

Memcached简介

Memcached是一个分布式,开源的数据存储引擎。它被设计用来在RAM(替换了低速的传统硬盘)中存储特定种类的数据,供应用程序进行快速检索。减少了处理申请所花费的时间,通过减少查询的次数来抵消沉重缓慢的数据集或者API,比如传统的数据库(MySQL等)。

通过引进一个灵巧的,精心设计并经过最优化的缓存机制,它变得可以处理更大的请求量,执行更多的程序。这是Memcached最重要的应用实例,因为它也是这样缓存其他应用或内容的。

可以深度依赖,并被用在网站或者其他应用的生产中,Memcached已经成为一个即时提升性能的工具,而不必使用更好的硬件条件(比如更多的服务器或者服务资源)。

Memcached的工作方式是将关键词和他们对应的值(最大能达到1MB)保存在一个关联矩阵中(比如哈希表),延展和分布在大量的虚拟服务器中。

在Ubuntu上安装Docker(最新版)

想在你的VPS上开始使用Docker项目,你可以使用DigitalOcean的Ubuntu 13.04版本的Docker镜像,或者自行安装。在这一节中,我们会快速的复习Docker 0.7.1的基础安装方法。

Ubuntu安装操作指南

更新你的droplet

sudo aptitude    update
sudo aptitude -y upgrade

确保aufs支持功能可用

sudo aptitude install linux-image-extra-`uname -r`

为apt-key添加Docker仓库key进行包验证

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"

向aptitude源中添加Docker库

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"

更新拥有新特性的库:

sudo aptitude    update

最后,下载安装Docker

sudo aptitude install lxc-docker

Ubuntu默认设置的防火墙(UFW:Uncomplicated Firewall)默认禁止了所有转发流量,然而Docker需要这个功能。

启用UFW的转发功能:

使用nano文本编辑器更改UFW的配置

sudo nano /etc/default/ufw

往下翻,找到以DEFAULTFORWARDPOLICY开头的一行,

将:

DEFAULT_FORWARD_POLICY="DROP"

换成:

DEFAULT_FORWARD_POLICY="ACCEPT"

按下CTRL+X,然后按Y同意保存并关闭。

最后重启UFW:

sudo ufw reload

基本的Docker命令

在我们开始使用Docker之前,先快速的回顾的它的命令,温习一下我们的第一篇文章( Getting Started)中所学的知识吧。

运行Docker后台进程和CLI用量

在安装过程中,Docker应该有后台进程在运行,来随时接收Docker CLI发送的命令。在特定的情况下可能需要手动重启Docker,那就使用下面的命令。

运行Dcoker后台进程

sudo docker -d &

Docker CLI 用量

sudo docker [option] [command] [arguments]

Note:Docker需要sudo权限来工作。

命令列表

目前版本(0.7.1)的Docker可用命令总览。

attach

连接到一个正在运行的可用容器

build

从Dockerfile建立一个容器

commit

给一个容器的改变创建一个新镜像

cp

从容器的文件系统中复制文件/文件夹到主机路径中

diff

检查一个容器的文件系统的变更

events

获取服务器中的实时任务

export

将容器中的内容保存为一个tar归档

history

显示一个镜像的历史记录

images

列出所有镜像

import

使用一个tarball中的内容新建一个文件系统

info

显示系统信息

insert

在镜像中插入一个文件

inspect

返回容器的低等级信息

kill

结束一个运行中的容器

load

从一个tar归档中载入一个镜像

login

注册或者登陆到Docker仓库服务器

logs

取出容器的日志文件

port

查找被转换成私有接口的公有接口

ps

列出所有容器

pull

从Docker库服务器中拉出一个镜像或者仓库

push

向Docker库服务器推送一个镜像或者仓库

restart

重启一个容器

rm

移除一个或多个容器

rmi

移除一个或多个镜像

run

在一个新容器中运行命令

save

将一个镜像保存到tar归档

search

在Docker主页中搜索一个镜像

start

启动一个停止的容器

stop

停止一个正在运行的容器

tag

标记一个进入仓库的镜像

top

查看一个容器中运行的进程

version

显示Docker的版本信息

开始创建Memcached镜像

基于我们之前学习的Docker系列文章里面的知识,我们直接深入到创建Dockerfile来实现自动构建安装Mamcached功能的镜像(将可以用来运行沙盒化的Memcached实例)。

快速回顾:什么是Dockerfile?

Dockerfile是包含可执行的声明的命令的脚本,将以给定的顺序执行,来让Docker自动的创建一个新的Docker镜像。这给部署工作带来了极大的帮助。

这些文件(Dockerfile)使用FROM命令,总是以对基础镜像的描述开头。从那开始,构建进程开始运行,向主机提交(保存镜像的状态)的每一步的操作形成了最终的镜像。

用法:

# Build an image using the Dockerfile at current location
# Tag the final image with [name] (e.g. *nginx*)
# Example: sudo docker build -t [name] .
sudo docker build -t memcached_img . 

Note:了解更多有关Dockerfile的知识,参见我们的文章:Docker Explained: Using Dockerfiles to Automate Building of Images.

##Dockerfile 命令概览
Add

从主机复制一个文件到容器中

CMD

设置默认被执行的命令,或者传递到ENTRYPOINT

ENTRYPOINT

设置容器中的默认ENTRYPOINT应用

ENV

设置环境变量(例如”key = value”)

EXPOSE

对外展示一个端口

FROM

设置使用的基础镜像

MAINTAINER

设置Dockerfile的作者/拥有者数据

RUN

运行一个命令,并提交运行完成后的(容器)镜像

USER

设置运行容器的用户

VOLUME

从主机安装一个目录到容器

WORKDIR

设置要执行CMD指令的目录

创建一个Dockerfile

因为Dockerfile由纯文本组成,所以创建一个变换,来让你使用最爱的文本编辑器,写下创建一个镜像需要Docker执行的命令。在你开始写这个文件后,继续在下面添加内容(一条接着一条),直到保存得到最终的结果。

Note:你会在本节的最后看到最终的Dockerfile是什么样子。

现在使用nano文本编辑器创建一个新的空Dockerfile:

nano Dockerfile

我们需要先后列出所有的指令。然而,一切都从一个(设置了FROM指令的)基础镜像上开始。

首先让我们定义一下Dockerfile的目标,并声明需要使用的基础镜像。

############################################################
# Dockerfile to run Memcached Containers
# Based on Ubuntu Image
############################################################

# Set the base image to use to Ubuntu
FROM ubuntu

# Set the file maintainer (your name - the file's author)
MAINTAINER Maintaner Name

在这个声明部分结束后,我们就可以开始列出Memcached的安装命令。

# Update the default application repository sources list
RUN apt-get update

# Install Memcached
RUN apt-get install -y memcached

设置默认对外开放的容器端口:

# Port to expose (default: 11211)
EXPOSE 11211

设置默认的执行命令和入口(例如Memcached进程):

# Default Memcached run command arguments
CMD ["-u", "root", "-m", "128"]

# Set the user to run Memcached daemon
USER daemon

# Set the entrypoint to memcached binary
ENTRYPOINT memcached

最终的Dockfile

############################################################
# Dockerfile to run Memcached Containers
# Based on Ubuntu Image
############################################################

# Set the base image to use to Ubuntu
FROM ubuntu

# Set the file maintainer (your name - the file's author)
MAINTAINER Maintaner Name

# Update the default application repository sources list
RUN apt-get update

# Install Memcached
RUN apt-get install -y memcached

# Port to expose (default: 11211)
EXPOSE 11211

# Default Memcached run command arguments
CMD ["-m", "128"]

# Set the user to run Memcached daemon
USER daemon

# Set the entrypoint to memcached binary
ENTRYPOINT memcached

全部写完之后,按下CTRL+X,然后按Y同意保存并关闭。

通过使用这个Dockerfile,我们已经做好了开始使用Dockerised化的Memcached容器的准备!

为Memcached容器创建镜像

我们现在可以创建第一个Memcached镜像,参照Dockerfile一节中的用法说明。

运行命令,创建一个标记为“memcached_img”的镜像:

sudo docker build -t memcached_img .

Note:不要遗漏了最后的 . ,Docker需要它来找到Dockerfile。

运行dockerised化的Memcached容器

使用下面的命令来创建一个新容器,可以根据你的需求修改这个例子。

# Example: sudo docker run -name [container name] -p [port to access:port exposed] -i -t [memcached image name]
sudo docker run -name memcached_ins -d -p 45001:11211 memcached_img

现在有了一个名为“memcachedins”的Dockers容器,在端口45001可用,使用我们之前建立的标记为“memcachedimg”的镜像。

限制Memcached容器的内存

如果想要限制一个Docker容器进程可以使用的内存量,只要设置-m [memory amount]并标上限制就可以了。

运行一个内存限制为256MB的容器:

# Example: sudo docker run -name [name] -m [Memory (int)][memory unit (b, k, m or g)] -d (to run not to attach) -p (to set access and expose ports) [image ID]
sudo docker run -name memcached_ins -m 256m -d -p 45001:11211 memcached_img

如果想要确认内存限制,你可以检查这个容器:

# Example: docker inspect [container ID] | grep Memory
sudo docker inspect memcached_ins | grep Memory

Note:上面的命令会抓取检查输出中的内存相关信息。如果想要查看关于你的容器的所有相关信息,选择sudo docker inspect [container ID]

测试Memcached容器

有许多方法来尝试你新建的Memcached容器。我们使用一个简单的Python CLI程序来测试。你可以让程序使用附加组件,框架或者库立刻投入生产。

确保你的主机拥有为Python/Memcached准备的必要库文件:

sudo apt-get update && sudo apt-get -y upgrade 
sudo apt-get install -y python-pip
pip install python-memcached

现在使用nano创建一个简单的Python脚本:

nano cache.py

把下面的内容复制粘贴进去:

# Import python-memcache and sys for arguments
import memcache
import sys

# Set address to access the Memcached instance
addr = 'localhost'

# Get number of arguments
# Expected format: python cache.py [memcached port] [key] [value]
len_argv = len(sys.argv)

# At least the port number and a key must be supplied
if len_argv < 3:
    sys.exit("Not enough arguments.")

# Port is supplied and a key is supplied - let's connect!
port  = sys.argv[1]
cache = memcache.Client(["{0}:{1}".format(addr, port)])

# Get the key
key   = str(sys.argv[2])

# If a value is also supplied, set the key-value pair
if len_argv == 4:

    value = str(sys.argv[3])    
    cache.set(key, value)

    print "Value for {0} set!".format(key)

# If a value is not supplied, return the value for the key
else:

    value = cache.get(key)

    print "Value for {0} is {1}.".format(key, value)

保存并退出。

在主机上使用上面的脚本,测试Docker的Memcached实例:

# Example: python cache.py [port] [key] [value]
python cache.py 45001 my_test_key test_value

# Return: Value for my_test_key set

# See if the key is set:
python cache.py 45001 my_test_key

# Return: Value for my_test_key is test_value.

安装和使用Docker的完整说明,参见docker.io上的docker documentation.

能让你的网站变得与众不同的最佳实践

by Guest · June 16, 2015

Best Practices to Design a Website

如果你打算设计一个网站,了解这些最佳的实践很重要,因为你肯定想让你的自适应网站拥有令人钦佩的功能和适应性。

能让你的网站变得与众不同的最佳实践

专业的开发者如何成为高手?对大多数网页设计者来说,这是一个具有普遍性的问题。答案是:专业的设计师一直坚持这些最佳实践,来让他们的设计变得与众不同。

页面布局

如果网页在笔记本电脑上有三个连续的分段,那么在平板上可能就被划分成两段,手机上就可能只有一段了——这取决于设备的宽度。平板或智能手机上展示的用户界面显示可能是一对内容,然后第三段就被卷曲到下一行了。

笔记:页面布局的主要目标是在实践工作开始之前,为不同的设备准备不同的布局。

图片的大小和质量

图片最好要足够大和足够高的分辨率。因为如果分辨率不够,图片会失真,所以将不适合在宽屏上显示。因此必须使用合适的图片。

笔记:如果你是一个web开发者,那你可以通过使用不同的框架让图片可变,来自动适应不同的设备。如果你打算手动编写代码,你可以使用多媒体询问,决定图片的大小。

文字的大小和风格

70像素的标题和粗重的文本,在家用电脑或者笔记本电脑的屏幕上看起来的效果都会是非常棒的。但在平板或者手机上就不是很合适了。同样,文字的附加缩放或者倾斜也要考虑到正在使用的设备。

合适的导航

在大屏幕上,我们有一个浮起来的导航菜单。但在小屏幕上,菜单会是一个小标志,一旦被点击,它就会垂直出现。这可以通过利用引导程序的高亮导航条来执行,许多的额外插件也可用。

内容的展示

在大屏幕上,有足够的空间让我们展示更多的内容。然而在小屏幕上,比如平板或手机,不会有足够的空间来展示所有的内容。因此,我们要决定哪些内容应该被展示或者被覆盖。

为执行驱动设计均衡的内容

不仅网页设计师要尽早的参与进来,网页设计师(原文的错误?)也要参与。手机的性能是被传统的电脑碾压的(译者注:现在并不一定是。),所以页面布局会在智能手机上显著的恶化。因此,调整手机对执行的内容承载力很关键。

总结:这些最佳的实践都应该被仔细研究,并在你设计任何网页应用之前挑选好。这些都应该在重要性上占有一席之地,因为弄清楚这些不同的加固小技巧,能相应的有助于描绘网页的轮廓,设计更好的UI和更高效的开发者。

在Docker容器中实现安全与隔离

Saturday, November 7, 2015

在云计算中,多租户技术被认为是一个非常重要的功能。如果我们将容器中运行的应用看作一个租户,那么优秀的安全隔离技术设计可以确保租户只能使用它们可用的资源。

docker.jpg

随着容器技术的发展,它的安全、隔离和资源控制的功能也在不断进步。本文中,我们将回顾Dockers容器如何仅仅使用linux的原始功能来实现安全与隔离,比如namespaces, cgroups, capabilities等。

虚拟化和隔离

操作系统级的虚拟化,容器,空间,以及“chroot with steroids”,其实都定义了同一个概念:用户空间隔离。类似Dockers的产品都使用了操作系统级的虚拟化,通过用户空间隔离可以提供额外的安全性。

0.9版本起,Dockers包含了libcontainer库作为它直接虚拟化的方法,这个功能由Linux内核提供。 此外,它还通过 LXC[1],systemd-nspawn[2],和libvert[3]使用了抽象虚拟接口。
这些虚拟化库全部利用了Linux的原始容器(参见上图)

  • namespace
  • cgroup
  • capabilities

等。

Dockers在一个包装中联合了以上功能,并称之为容器格式。

Libcontainer

默认的容器格式被称为libcontainer。

Dockers也支持使用LXC的传统Linux容器。在将来,Dockers可能会支持其他的容器格式,比如结合BSD jails或者Solaris Zones。

执行驱动程序是一种特殊容器格式的实现,用来运行docker容器。在最新的版本中,libcontainer有以下特性:

  • 是运行docker容器的默认执行驱动程序。
  • 和LXC同时装载。
  • 使用没有任何其他依赖关系的Go语言设计的库,来直接访问内核容器的API。
    • 目前的Docker涵盖的功能有:命名空间使用,cgroups管理,capabilities权限集,进程运行的环境变量配置以及网络接口防火墙设置——所有功能是固定可预测的,不依赖LXC或者其它任何用户区软件包。
    • 只需提供一个根文件系统,和libcontainer对容器的操作配置,它会帮你完成剩下的事情。
    • 支持新建容器或者添加到现有的容器。
    • 事实上,对libcontainer最迫切的需求是稳定,开发团队也将其设为了默认。
      • 在Dockers 0.9中,LXC现在可以选择关闭。
        • 注意:LXC在将来会继续被支持。
      • 如果想要重新使用LXC驱动,只需输入指令docker -d –e lxc,然后重启Docker。

用户命名空间(namespace)

Docker不是虚拟化,相反的,它是一个支持命名空间抽象的内核,提供了独立工作空间(或容器)。当你运行一个容器的时候,Docker为容器新建了一系列的namespace。

一些Dockers使用的linux命名空间:

  • pid namespace
    • 用作区分进程(PID: Process ID)。
    • 容器中运行的进程就如同在普通的Linux系统运行一样,尽管它们和其他进程共享一个底层内核。
  • net namespace
    • 用作管理网络接口。
    • DNAT允许你单独配置主机中每个用户的的网络,并且有一个方便的接口传输它们之间的数据。
    • 当然,你也可以通过使用网桥用物理接口替换它。
  • ipc namespace
    • 用作管理对IPC (IPC: InterProcess Communication)资源的访问。
  • mnt namespace
    • 用作管理mount-points (MNT: Mount)。
  • uts namespace
    • 用作区分内核和版本标识符(UTS: Unix Timesharing System)。

cgroups (or Control Groups)

Linux上的Docker使用了被称为cgroups的技术。因为每个虚拟机都是一个进程,所有普通Linux的资源管理应用可以被应用到虚拟机。此外,资源分配和调度只有一个等级,因为一个容器化的Linux系统只有一个内核并且这个内核对容器完全可见。

总之,cgroup可以让Docker:

  • 实现组进程并且管理它们的资源总消耗。
  • 分享可用的硬件资源到容器。
  • 限制容器的内存和CPU使用。
    • 可以通过更改相应的cgroup来调整容器的大小。
    • 通过检查Linux中的/sys/fs/cgroup对照组来获取容器中的资源使用信息。
  • 提供了一种可靠的结束容器内所有进程的方法。
    ##Capabilities
    Linux使用的是“POSIX capabilities”。这些权限是所有强大的root权限分割而成的一系列权限。在Linux manpages上可以找到所有可用权限的清单。Docker丢弃了除了所需权限外的所有权限,使用了白名单而不是黑名单。

一般服务器(裸机或者虚拟机)需要以root权限运行一系列进程。包括:

  • SSH
  • cron
  • syslogd
  • 硬件管理工具 (比如负载模块)
  • 网络配置工具 (比如处理DHCP, WPA, or VPNs)

等。

每个容器都是不同的,因为几乎所有这些任务都由围绕容器的基础设施进行处理。默认的,Docker启用一个严格限制权限的容器。大多数案例中,容器不需要真正的root权限。举个例子,进程(比如说网络服务)只需要绑定一个小于1024的端口而不需要root权限:他们可以被授予CAP_NET_BIND_SERVICE来代替。因此,容器可以被降权运行:意味着容器中的root权限比真正的root权限拥有更少的特权。
Capabilities只是现代Linux内核提供的众多安全功能中的一个。为了加固一个Docker主机,你可以使用现有知名的系统:

如果你的发行版本附带了Docker容器的安全模块,你现在就可以使用它们。比如,装载了AppArmor模板的Docker和Red Hat自带SELinux策略的Docker。

图片版权

Docker Blog

引用

  1. LXC—Linuxcontainers.
  2. Control Centre:ThesystemdLinuxinitsystem
  3. The virtualization API:libvirt
  4. Solomon Hykes and others.What is Docker?
  5. How is Docker different from a normal virtual machine?(Stackoverflow)
  6. Docker 0.9:introducing execution driver sand libcontainer
    • UseslayeredfilesystemsAuFS.
  7. Is there a formula for calculating the overhead of a Docker container?
  8. An Updated Performance Comparisonof VirtualMachine sand Linux Containers
  9. capabilities(7)-Linuxmanpage
  10. Netlink (Wikipedia)
  11. The lost packages of docker
  12. ebtables/iptables interaction on a Linux-based bridge
  13. Comparsion Between AppArmor and Selinux
  14. The docker-proxy (netfilter)
  15. Hardware isolation
  16. Understand the architecture (docker)
  17. Linux kernel capabilities FAQ
  18. Docker: Differences between Container and Full VM(Xml and More)
  19. Docker vs VMs
    • There is one key metric where Docker Containers are weaker than Virtua lMachines, and that’s “Isolation”. Intel’s VT-d and VT-x technologies have provided Virtual Machines with ring-1 hardware isolation of which, it takes full advantage. It helps Virtual Machines from breaking down and interfering with each other.
  20. Docker Security

转载请注明出处和原文出处

需要译稿请联系QQ:545870054
或者邮件:fan_xq@live.com

用户命名空间已经来到Docker!

by estesp · October 13, 2015

好的,在如何实现和展示给用户的问题上,经过一路的拖延和很多细节的讨论,我很高兴的宣布:Docker容器用户命名空间的最初版本已经可用了!正如下面这条来自Arnaud的Tweet中所言,在Docker 1.9 发布时间表中,启用用户命名空间的功能已在试验版本可用,我们已经更加了解这个功能的边界和它是如何与Docker生态系统中的其他功能如何协作的。

Phase 1 @Docker support for user namespaces is now in experimental branch! Congratulations @estesp! 👏 https://t.co/a25LizygRV

—Arnaud Porterie (@icecrime) October 10, 2015

当然,兴奋之余,你的第一个问题肯定是,“用户命名空间到底是什么呢?”。用户命名空间是Linux内核中的一个可用的容器命名空间(最年轻的那个),类似于用来创建容器的关键命名空间——mount, uts, pid, and network。如果命名空间对你而言是一个全新的话题,那么Michael Crosby的文章 “Creating Containers”值得一读。如果想要了解Linux中用户命名空间的更多详尽细节,可以在LWN.net上Michael Kerrisk整理的“Namespaces in Operation, part 5”中找到。一旦你对命名空间有所了解,深入学习了一些用户命名空间的知识,你就会明白,用户命名空间最重要的功能之一就是可以让容器拥有看起来和宿主系统中不同的uidgid。特别的,进程(在我们的例子中,是容器中的进程)可以作为宿主系统中的一组映像被提供。当这个进程以为它是以uid 0(一般被认为是“root”)运行的时候,它在宿主系统中实际上可能是uid 1000,或者是uid 10000,甚至是uid 34934322。这完全由我们在用户命名空间中创建这个进程的时候提供的mappings决定。从安全方面来说,这是一个伟大的功能,因为这允许进程在容器中以root权限运行,但容器在宿主系统中却没有真正拥有root权限。

在Docker的实例中,我们已经提供了一个新的后台程序启动标志,来允许管理员提供一个用户名,或者一个可选的用户组(或者用户和组的数字ID),作为remapping user。Linux命名空间功能的创建者已经考虑到,通过提供名为下级范围的用户和组的数字ID,来区分使用/etx/subuid/etc/subgid文件的用户,Docker可以接着在用户下属范围内寻找 remapping user的范围。这个范围被用来创建程序创建过程中的映像,无论这些程序是通过docker run还是docker exex启动的。有关Docker是如何使用这些范围的更多完整文档,可以在用户命名空间试验文档中可以找到。

当然,用户(尤其是容器云操作员)下一步想要在每个容器而不是每个后台程序中指定某个映像。对公有云操作员来说,这将允许每个新增的租户(tenant)安全的拥有自己的uidgid范围,并且不会与其它租户的范围重叠。当然,我们提供了这个功能。然而,这里有一个关键功能的缺失,那就是在Linux系统中挂载文件系统同时“平移转换”每个文件系统的所有属性条目。如果没有这个功能,Docker就必须“不共享”现在通过各种写拷贝后台已经共享的文件系统中的内容。这意味着Docker中原本提供的磁盘空间节省功能的失效:容器间共享的文件系统层,比如ubuntu:14.04镜像的层。由于没有mount-with-uid-gid、shift-like功能,Docker不得不拷贝每个根文件系统,手动平移转换修改整个文件树的属权,来获取指定的容器在文件系统中运行所需的镜像的权限。在Linux社区已经有人在尝试从文件系统层上来实现,但这遥遥无期,因此,用户命名空间的“第二阶段”很难预测能否被正确执行。

已经开始使用用户命名空间的人们,请提供关于这个实验性功能的反馈,来让我们继续完善出一个稳定的版本。如果这一切听起来很有趣,但你不知道如何开始,那就阅读用户命名空间的文档,然后从https://experimental.docker.com/获取一个试验构建来尝试吧!

重要笔记:由于将映像提供的Docker的层数据在本地缓存中的内容,一旦使用了带有用户命名空间的实验版本,镜像根目录(默认是/var/lib/docker)就会多出一个间接附加的重映像的根uid和gid。例如,如果提供给--userns-remap标志的remapping user,有从10000开始的用户和组的ID,那么所有运行映像设置的镜像和容器的根目录将存放在/var/lib/docker/10000.10000中。如果你使用不提供用户命名空间重映射的实验版本,
如果你使用的是没有用户命名空间的实验版本,现有内容将会被转移到/var/lib/docker/0.0来与重映像的内容相区分。如果需要返回到没有用户命名空间的Docker版本,最简单的方法是终止现有的试验后台进程,将/var/lib/docker/0.0中的内容移回到/var/lib/docker中,最后重启没有用户命名空间的Docker二进制程序文件。

期待你们的来信,等待用户命名空间已久的用户们!

转载请注明出处和原文出处

需要译稿请联系QQ:545870054
或者邮件:fan_xq@live.com

Java序列化漏洞威胁着上百万的应用

https://dzone.com/articles/java-serialization-vulnerability-threatens-million

一个在Java环境中广泛传播的漏洞使得数千的商务信息被暴露。尽管这个漏洞没有一个酷炫的名字——比如心血(Heartbleed)、破壳(Shellshock)或者POODLE——它却被指出能让黑客通过互联网进行攻击。然而,目前没有一种方法能保护所有的应用。这意味着需要团队们花费很长一段时间来寻找和修复这个漏洞的变体。

Contrast安全公司(以下简称Contrast)开发了一种使用我们的专利,强大的应用安全构建平台,快速准确的修复了这个问题。Contrast可以使用我们的IAST方法来分辨出这个问题。它也可以通过使用我们的RASP功能来立即修复这个问题或者生成安全警报,并且不必重编码。在服务器上安装一个Contrast客户端就可以标记出这个服务器上所有存在问题的Jaca应用程序。

如果你想了解更多关于Jacaranda序列化漏洞的细节,请继续往下读。序列化是一种让开发者将数据结构转化成一串比特流来存储或者发送的方法。反序列化则是一个相反的过程,将接收后的数据转换为特定数据结构。早在2010年之前,序列化就已经开始出现安全问题。完整安全问题历史记录详见http://www.ibm.com/developerworks/library/se-lookahead 。最近,在一系列不同的Java环境中都发现了漏洞——遗憾的是,这可能是唯一一种能让安全问题得到重视的方式。

这些漏洞非常严重,可以被利用来实现执行整个远程命令——任何程序的主机将被接管,只要这个程序接受了序列化对象。

在Java中,读取一个序列化流中的SetBit是非常简单的:

ObjectInputStream in = new ObjectInputStream( inputStream );     
return (Data)in.readObject();

但问题在于,你不知道在解码之前你究竟反序列化了什么。所以一个攻击者可以序列化一串恶意对象,并把它们发送到你的程序。一旦你调用readObject(),一切就都已经迟了。有时候,它就像XXE漏洞,攻击者可以使用恶意文件格式,在XML解析的时候发起攻击。不过,在我们的例子中,没有一个简单的方法来终止解析过程。

现在所需的是一种可以运行序列化,但不会让攻击者有机会创建任意类的实例。比如:

List<Class<?>> safeClasses = Arrays.asList( BitSet.class, ArrayList.class );
Data d2 = safeReadObject( Data.class, safeClasses, new FileInputStream( f ) );

这允许开发者指定返回类型和希望在序列化对象中出现的类清单,一旦出现没有被授权的,我们将抛出一个安全异常并阻止请求。结果表明实现这个并不难。我们只需要重载一下ObjectInputStream的执行就可以了。

以下是是一种替代调用readObject的方法:

@SuppressWarnings("unchecked")
    public static <T> T safeReadObject(Class<?> type, List<Class<?>> safeClasses, InputStream in ) throws IOException, ClassNotFoundException {
        return (T) new ObjectInputStream(in) {
            protected Class<?> resolveClass(ObjectStreamClass d) throws IOException, ClassNotFoundException {
                Class<?> clazz = super.resolveClass(d);
                if (clazz.isArray()
                    || clazz.isPrimitive()
                    || clazz.equals(type)
                    || clazz.equals(String.class)
                    || Number.class.isAssignableFrom(clazz)
                    || safeClasses.contains(clazz)) return clazz;
                throw new SecurityException("Attempt to deserialize unauthorized " + clazz);
            }
        }.readObject();
    }

这个方法重载了ObjectInputStream中的resolveClass(),新增了一些检查,来确保被读取为反序列化进程部分的任何类,都是不可利用或者处于安全类的白名单中。作为一个替代项,你可以将不熟悉的类加入黑名单——那些会被用来开发的——但这注定失败。因为有太多被称为“小工具”的东西能够高效的列出所有可能被利用的漏洞。

这个简单的检查保护了你的程序,并且不用从底层修改代码。第一步要做的是搜索你的代码,找到所有易受攻击的地方——第二天,所有Contrast的用户就会收到一个更新来完成上面的事情。一旦发现程序包中存在由于反序列化不受信任数据而暴露的地方,你就会收到通知。

本文已被发布在程序员资料库

并被推荐到极客头条

转载请注明出处和原文出处

需要译稿请联系QQ:545870054
或者邮件:fan_xq@live.com