aws / aws/containers-roadmap

Add support for userns in ecs-agent and TaskDefinition

Open
#774 4 comments 13 reactions 0 assignees View on GitHub
ECS
Dominant language
Shell
Stars
5.4k
Forks
334
PR merge metrics
No merged PRs in 30d

Description

### Summary
we wish to enable UserNS remap support in our docker setup using ECS for security. The datadog agent container requires '--userns=host' when running in that mode, which is currently not supported by TaskDefinition

### Description
UserNS remap is documented in https://success.docker.com/article/introduction-to-user-namespaces-in-docker-engine

activation of the mode is easy and it generally works. But if the ECS service (like datadog agent) requires --pid=host (to monitor all processes on the EC2 instance), when using userns-remap, the container must also run with --userns=host otherwise, Docker will fail to start the container with the following error:

```
level=error msg="Handler for POST /v1.21/containers/create?name=ecs-ecs-int-datadog-agent-70-datadogagent-94c1bb86b1898abfdd01 returned error: cannot share the host's network namespace when user namespaces are enabled"
```

docker run supports the flag as per https://docs.docker.com/engine/reference/commandline/run/

it was mentioned in aws/amazon-ecs-agent#502 but never implemented (probably due to a lack of requests).

### Environment Details
* docker 19.06.3
* ecs-agent 1.37.0
* Kernel 4.19.104-linuxkit
* EC2 (t3.xlarge)

### Supporting Log Snippets

Docker logs issues with datadog agent:
```
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.369910602Z" level=info msg="Starting up"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.370051577Z" level=info msg="User namespaces: ID ranges will be mapped to subuid/subgid ranges of: dockremap:dockremap"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.372721442Z" level=warning msg="could not change group /var/run/docker.sock to docker: group docker not found"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.373519096Z" level=info msg="User namespaces: ID ranges will be mapped to subuid/subgid ranges of: dockremap:dockremap"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.376523753Z" level=info msg="parsed scheme: \"unix\"" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.376538082Z" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.376554880Z" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0 }] }" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.376562869Z" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.377827080Z" level=info msg="parsed scheme: \"unix\"" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.377843346Z" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.377857174Z" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0 }] }" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.377871244Z" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.407009277Z" level=info msg="Loading containers: start."
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.502508969Z" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.543803565Z" level=info msg="Loading containers: done."
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.562232469Z" level=info msg="Docker daemon" commit=369ce74a3c graphdriver(s)=overlay2 version=19.03.6
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.566166969Z" level=info msg="Daemon has completed initialization"
2020-02-26T21:18:59Z 030_docker time="2020-02-26T21:18:59.617651310Z" level=info msg="API listen on /var/run/docker.sock"
2020-02-26T21:19:19Z 030_docker time="2020-02-26T21:19:19.620968921Z" level=error msg="Handler for POST /v1.21/containers/create?name=ecs-ecs-int-datadog-agent-70-datadogagent-94d889ac99de97ffc701 returned error: cannot share the host's network namespace when user namespaces are enabled"
2020-02-26T21:20:03Z 030_docker time="2020-02-26T21:20:03.136315849Z" level=error msg="Handler for POST /v1.21/containers/create?name=ecs-ecs-int-datadog-agent-70-datadogagent-94f5c09fdca3e5c0f501 returned error: cannot share the host's network namespace when user namespaces are enabled"
2020-02-26T21:20:42Z 030_docker time="2020-02-26T21:20:42.967553698Z" level=error msg="Handler for POST /v1.21/containers/create?name=ecs-ecs-int-datadog-agent-70-datadogagent-94f1ac98a89395cf3000 returned error: cannot share the host's network namespace when user namespaces are enabled"
```

Contributor guide

Open the contributing guide

Research direction

The requested surface is ecs-agent and TaskDefinition; begin by tracing how TaskDefinition options become Docker container settings. Completion means a task can express --userns=host and the resulting container starts successfully with the host namespace configuration described in the issue.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker
Domain
backend, cloud
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.