directory search
Compose About versions and upgrading (Compose) ASP.NET Core + SQL Server on Linux (Compose) CLI environment variables (Compose) Command-line completion (Compose) Compose(组成) Compose command-line reference(组合命令行参考) Control startup order (Compose) Django and PostgreSQL (Compose) Docker stacks and distributed application bundles (Compose) docker-compose build(docker-compose构建) docker-compose bundle docker-compose config docker-compose create docker-compose down docker-compose events docker-compose exec docker-compose help docker-compose images docker-compose kill docker-compose logs docker-compose pause docker-compose port docker-compose ps docker-compose pull docker-compose push docker-compose restart docker-compose rm docker-compose run docker-compose scale docker-compose start docker-compose stop docker-compose top docker-compose unpause docker-compose up Environment file (Compose) Environment variables in Compose Extend services in Compose Frequently asked questions (Compose) Getting started (Compose) Install Compose Link environment variables (deprecated) (Compose) Networking in Compose Overview of Docker Compose Overview of docker-compose CLI Quickstart: Compose and WordPress Rails and PostgreSQL (Compose) Sample apps with Compose Using Compose in production Using Compose with Swarm Engine .NET Core application (Engine) About images, containers, and storage drivers (Engine) Add nodes to the swarm (Engine) Apply custom metadata (Engine) Apply rolling updates (Engine) apt-cacher-ng Best practices for writing Dockerfiles (Engine) Binaries (Engine) Bind container ports to the host (Engine) Breaking changes (Engine) Build your own bridge (Engine) Configure container DNS (Engine) Configure container DNS in user-defined networks (Engine) CouchDB (Engine) Create a base image (Engine) Create a swarm (Engine) Customize the docker0 bridge (Engine) Debian (Engine) Default bridge network Delete the service (Engine) Deploy a service (Engine) Deploy services to a swarm (Engine) Deprecated Engine features Docker container networking (Engine) Docker overview (Engine) Docker run reference (Engine) Dockerfile reference (Engine) Dockerize an application Drain a node (Engine) Engine FAQ (Engine) Fedora (Engine) Get started (Engine) Get started with macvlan network driver (Engine) Get started with multi-host networking (Engine) How nodes work (Engine) How services work (Engine) Image management (Engine) Inspect the service (Engine) Install Docker (Engine) IPv6 with Docker (Engine) Join nodes to a swarm (Engine) Legacy container links (Engine) Lock your swarm (Engine) Manage nodes in a swarm (Engine) Manage sensitive data with Docker secrets (Engine) Manage swarm security with PKI (Engine) Manage swarm service networks (Engine) Migrate to Engine 1.10 Optional Linux post-installation steps (Engine) Overview (Engine) PostgreSQL (Engine) Raft consensus in swarm mode (Engine) Riak (Engine) Run Docker Engine in swarm mode Scale the service (Engine) SDKs (Engine) Select a storage driver (Engine) Set up for the tutorial (Engine) SSHd (Engine) Storage driver overview (Engine) Store service configuration data (Engine) Swarm administration guide (Engine) Swarm mode key concepts (Engine) Swarm mode overlay network security model (Engine) Swarm mode overview (Engine) Understand container communication (Engine) Use multi-stage builds (Engine) Use swarm mode routing mesh (Engine) Use the AUFS storage driver (Engine) Use the Btrfs storage driver (Engine) Use the Device mapper storage driver (Engine) Use the OverlayFS storage driver (Engine) Use the VFS storage driver (Engine) Use the ZFS storage driver (Engine) Engine: Admin Guide Amazon CloudWatch logs logging driver (Engine) Bind mounts (Engine) Collect Docker metrics with Prometheus (Engine) Configuring and running Docker (Engine) Configuring logging drivers (Engine) Control and configure Docker with systemd (Engine) ETW logging driver (Engine) Fluentd logging driver (Engine) Format command and log output (Engine) Google Cloud logging driver (Engine) Graylog Extended Format (GELF) logging driver (Engine) Journald logging driver (Engine) JSON File logging driver (Engine) Keep containers alive during daemon downtime (Engine) Limit a container's resources (Engine) Link via an ambassador container (Engine) Log tags for logging driver (Engine) Logentries logging driver (Engine) PowerShell DSC usage (Engine) Prune unused Docker objects (Engine) Run multiple services in a container (Engine) Runtime metrics (Engine) Splunk logging driver (Engine) Start containers automatically (Engine) Storage overview (Engine) Syslog logging driver (Engine) tmpfs mounts Troubleshoot volume problems (Engine) Use a logging driver plugin (Engine) Using Ansible (Engine) Using Chef (Engine) Using Puppet (Engine) View a container's logs (Engine) Volumes (Engine) Engine: CLI Daemon CLI reference (dockerd) (Engine) docker docker attach docker build docker checkpoint docker checkpoint create docker checkpoint ls docker checkpoint rm docker commit docker config docker config create docker config inspect docker config ls docker config rm docker container docker container attach docker container commit docker container cp docker container create docker container diff docker container exec docker container export docker container inspect docker container kill docker container logs docker container ls docker container pause docker container port docker container prune docker container rename docker container restart docker container rm docker container run docker container start docker container stats docker container stop docker container top docker container unpause docker container update docker container wait docker cp docker create docker deploy docker diff docker events docker exec docker export docker history docker image docker image build docker image history docker image import docker image inspect docker image load docker image ls docker image prune docker image pull docker image push docker image rm docker image save docker image tag docker images docker import docker info docker inspect docker kill docker load docker login docker logout docker logs docker network docker network connect docker network create docker network disconnect docker network inspect docker network ls docker network prune docker network rm docker node docker node demote docker node inspect docker node ls docker node promote docker node ps docker node rm docker node update docker pause docker plugin docker plugin create docker plugin disable docker plugin enable docker plugin inspect docker plugin install docker plugin ls docker plugin push docker plugin rm docker plugin set docker plugin upgrade docker port docker ps docker pull docker push docker rename docker restart docker rm docker rmi docker run docker save docker search docker secret docker secret create docker secret inspect docker secret ls docker secret rm docker service docker service create docker service inspect docker service logs docker service ls docker service ps docker service rm docker service scale docker service update docker stack docker stack deploy docker stack ls docker stack ps docker stack rm docker stack services docker start docker stats docker stop docker swarm docker swarm ca docker swarm init docker swarm join docker swarm join-token docker swarm leave docker swarm unlock docker swarm unlock-key docker swarm update docker system docker system df docker system events docker system info docker system prune docker tag docker top docker unpause docker update docker version docker volume docker volume create docker volume inspect docker volume ls docker volume prune docker volume rm docker wait Use the Docker command line (Engine) Engine: Extend Access authorization plugin (Engine) Docker log driver plugins Docker network driver plugins (Engine) Extending Engine with plugins Managed plugin system (Engine) Plugin configuration (Engine) Plugins API (Engine) Volume plugins (Engine) Engine: Security AppArmor security profiles for Docker (Engine) Automation with content trust (Engine) Content trust in Docker (Engine) Delegations for content trust (Engine) Deploying Notary (Engine) Docker security (Engine) Docker security non-events (Engine) Isolate containers with a user namespace (Engine) Manage keys for content trust (Engine) Play in a content trust sandbox (Engine) Protect the Docker daemon socket (Engine) Seccomp security profiles for Docker (Engine) Secure Engine Use trusted images Using certificates for repository client verification (Engine) Engine: Tutorials Engine tutorials Network containers (Engine) Get Started Part 1: Orientation Part 2: Containers Part 3: Services Part 4: Swarms Part 5: Stacks Part 6: Deploy your app Machine Amazon Web Services (Machine) Digital Ocean (Machine) docker-machine active docker-machine config docker-machine create docker-machine env docker-machine help docker-machine inspect docker-machine ip docker-machine kill docker-machine ls docker-machine provision docker-machine regenerate-certs docker-machine restart docker-machine rm docker-machine scp docker-machine ssh docker-machine start docker-machine status docker-machine stop docker-machine upgrade docker-machine url Driver options and operating system defaults (Machine) Drivers overview (Machine) Exoscale (Machine) Generic (Machine) Get started with a local VM (Machine) Google Compute Engine (Machine) IBM Softlayer (Machine) Install Machine Machine Machine CLI overview Machine command-line completion Machine concepts and help Machine overview Microsoft Azure (Machine) Microsoft Hyper-V (Machine) Migrate from Boot2Docker to Machine OpenStack (Machine) Oracle VirtualBox (Machine) Provision AWS EC2 instances (Machine) Provision Digital Ocean Droplets (Machine) Provision hosts in the cloud (Machine) Rackspace (Machine) VMware Fusion (Machine) VMware vCloud Air (Machine) VMware vSphere (Machine) Notary Client configuration (Notary) Common Server and signer configurations (Notary) Getting started with Notary Notary changelog Notary configuration files Running a Notary service Server configuration (Notary) Signer configuration (Notary) Understand the service architecture (Notary) Use the Notary client
characters

Linux名称空间为正在运行的进程提供了隔离,限制了它们对系统资源的访问,而不需要运行进程意识到这些限制。有关linux命名空间的更多信息,请参见Linux命名空间;

防止容器内权限升级攻击的最佳方法是将容器的应用程序配置为以非特权用户的身份运行。对于进程必须以root容器中的用户,您可以在Docker主机上将该用户重新映射到特权较低的用户。映射的用户被分配了一个UID范围,这些UID在命名空间中作为普通UID在0到65536之间运行,但是在主机本身上没有特权。

关于重映射和从属用户和组ID

重映射本身由两个文件处理:/etc/subuid/etc/subgid每个文件的工作方式相同,但一个文件涉及用户ID范围,另一个文件涉及组ID范围。中的下列条目/etc/subuid*

testuser:231072:65536

这意味着testuser的从属用户ID范围为230172接下来的65536个整数按顺序排列。UID231072映射到容器内的命名空间%28中,在本例中%29映射为UID。0%28root29%。UID231073映射为1等等。如果某个进程试图在命名空间之外提升权限,则该进程在主机上作为一个非特权的高数字uid运行,它甚至不映射到真正的用户。这意味着进程在主机系统上完全没有特权。

多重范围 属性中的同一用户或组添加多个非重叠映射,从而为给定用户或组分配多个从属范围。/etc/subuid/etc/subgid档案。在这种情况下,Docker只使用六映射,这与内核仅限制在/proc/self/uid_map/proc/self/gid_map...

当您将Docker配置为使用userns-remap特性,您可以选择指定现有用户和/或组,也可以指定default.如果您指定default,用户和组dockremap被创建并用于此目的。

警告某些发行版(如rhl和CentOS 7.3)不会自动将新组添加到/etc/subuid/etc/subgid档案。在本例中,您负责编辑这些文件并分配不重叠的范围。此步骤将在先决条件...

非常重要的是,范围不能重叠,这样进程就不能在不同的命名空间中获得访问权限。在大多数Linux发行版上,系统实用程序在添加或删除用户时为您管理范围。

这种重新映射对容器是透明的,但是在容器需要访问Docker主机上的资源的情况下,例如绑定安装到系统用户无法写入的文件系统的区域时,会引入一些配置复杂性。从安全的角度来看,最好避免这些情况。

先决条件

  1. 从属UID和GID范围必须与现有用户相关联,即使关联是实现细节。用户将拥有下面的命名空间存储目录。/var/lib/docker/如果您不想使用现有用户,Docker可以为您创建一个用户并使用它。如果要使用现有的用户名或用户ID,则必须已经存在。通常,这意味着相关条目需要在/etc/password/etc/group但是,如果您使用的是不同的身份验证后端,则此要求可能会有不同的转换。 若要验证这一点,请使用id指挥: $id testuser uid=1001%28 testuser%29 gid=1001%28 testuser%29组=1001%28 testuser%29

  1. 主机上处理名称空间重映射的方式是使用两个文件,/etc/subuid/etc/subgid这些文件通常在添加或删除用户或组时自动管理,但在少数发行版(如RHEL和CentOS 7.3)上,可能需要手动管理这些文件。

每个文件包含三个字段:用户的用户名或ID,后面是起始UID或GID%28,在命名空间%29中被视为UID或GID 0,以及用户可用的UID或GID的最大值。例如,考虑到以下条目:

测试用户:231072:65536

这意味着由testuser将由主机UID拥有。231072%28,它看起来像UID0在命名空间%29到296608%28231072+65536%29中。这些范围不应重叠,以确保命名空间进程不能访问对方的命名空间。

添加用户后,请检查/etc/subuid/etc/subgid若要查看用户在每个项目中是否有一个条目,请执行以下操作。如果不是,您需要添加它,小心避免重叠。

如果您想使用dockremap由Docker自动创建的用户,您需要检查dockremap这些文件中的条目配置和重新启动Docker。

  1. 如果Docker主机上有任何位置需要非特权用户写入,则相应地调整这些位置的权限。如果要使用dockremap由Docker自动创建的用户,但在配置和重新启动Docker之前,您将无法修改权限。

  1. 使能userns-remap将有效地屏蔽现有图像和容器层,以及内部的其他Docker对象。/var/lib/docker/这是因为Docker需要调整这些资源的所有权,并将它们实际存储在/var/lib/docker/最好是在新的Docker安装上启用此功能,而不是在现有的安装上启用此功能。

如果您禁用userns-remap您将不会看到在启用时创建的任何资源。

  1. 检查局限性在用户名称空间上,以确保您的用例是可能的。启用userns-在守护进程上重新映射你可以开始dockerd带着--userns-remap标记或按照此过程使用daemon.json配置文件。大daemon.json推荐方法。如果使用此标志,请使用以下命令作为模型:$ dockerd --userns-remap="testuser:testuser"

  1. 编辑/etc/docker/daemon.json假设文件以前是空的,下面的条目将启用userns-remap使用用户和组调用testuser.您可以按ID或名称对用户和组进行寻址。如果组名或ID与用户名或ID不同,则只需要指定它。如果同时提供用户名和组名或ID,请用冒号%28分隔它们:%29字符。假设UID和GID为testuser1001*

- `testuser`- `testuser:testuser`- `1001`- `1001:1001`- `testuser:1001`- `1001:testuser`

{“userns-remap”:“testuser”}

*使用dockremap用户和让Docker为您创建它,将值设置为default而不是testuser...

保存文件并重新启动Docker。

  1. 如果您使用的是dockremap用户,验证Docker使用id命令。 $id dockremap uid=112%28 dockremap%29 gid=116%28 dockremap%29组=116%28 dockremap%29 验证条目是否已添加到/etc/subuid/etc/subgid* $grep dockremap/etc/subuid dockremap:296608:65536$grep dockremap/etc/subgid dockremap:296608:65536 如果这些条目不存在,请将文件编辑为root用户并分配一个起始UID和GID,这是分配最多的UID加上偏移量%28在本例中,6553629%。小心不要让范围内有任何重叠。

  1. 控件验证以前的图像不可用。docker image ls命令。输出应该是空的。

  1. hello-world图像。 $docker运行Hello-world

  1. 验证名称空间目录是否存在于/var/lib/docker/命名为名称空间用户的UID和GID,由该UID和GID拥有,而不是组或世界可读的。一些子目录仍然属于root并拥有不同的权限。

$sudo ls-ld/var/lib/docker/231072.231072/drwx。11 231072 231072 11 6月21日上午21:19/var/lib/docker/231072.231072/$sudo ls-l/var/lib/docker/231072.231072/共计14 drwx。5 231072 231072 5 6月21日6月21日上午21:19。3 231072 231072 3 6月21日上午21:21集装箱。3根根3 6月21日21:19图像drwxr-x-3根根3 6月21日21:19网络drwx。4根根4 6月21日21:19插件drwx。2根根2,6月21日上午21:19。2 231072 231072 2 6月21日上午21:21。2根根2 6月21日21:19信任drwx。2 231072 231072 3 6月21日21:19卷

您的目录清单可能有一些不同,特别是如果您使用的容器存储驱动程序与aufs...

由重新映射的用户拥有的目录将被使用,而不是直接位于下面的相同目录。/var/lib/docker/和未使用的版本%28,如/var/lib/docker/tmp/在这里的示例中,%29可以删除。码头工人不会在userns-remap已经启用。

禁用容器的命名空间重映射

如果在守护进程上启用用户名称空间,默认情况下,所有容器都是以启用的用户命名空间启动的。在某些情况下,例如特权容器,您可能需要禁用特定容器的用户命名空间。见用户命名空间已知限制其中一些限制。

若要禁用特定容器的用户命名空间,请添加--userns=host标志到docker create,,,docker run,或docker exec命令。

用户命名空间已知限制

以下标准Docker功能与启用用户命名空间的Docker守护进程不兼容:

  • 与主机%28共享PID或网络命名空间--pid=host--network=host29%。

  • --read-only容器文件系统。这是Linux内核的限制,禁止在用户命名空间内重新安装带有修改标志的已安装的文件系统。

  • 外部%28卷或存储%29驱动程序,这些驱动程序不知道或无法使用守护进程用户映射。

  • 使用--privileged模式标志打开docker run也没有指定--userns=host...

用户名称空间是一种高级特性,需要与其他功能进行协调。例如,如果从主机挂载卷,则必须预先安排文件所有权,需要对卷内容进行读或写访问。

虽然用户命名空间容器进程中的根用户拥有容器内超级用户的许多预期权限,但Linux内核基于内部知识施加限制,即这是一个用户命名空间进程。一个值得注意的限制是无法使用mknod命令。对象运行时,将拒绝在容器内创建设备的权限。root用户。

保安,,,命名空间

 © 2017 Docker, Inc.

根据ApacheLicense,版本2.0获得许可。

Docker和Docker标志是Docker公司在美国和/或其他国家的商标或注册商标。

Docker,Inc.和其他各方也可以在这里使用的其他术语中拥有商标权。

Previous article: Next article: