100
Дмитрий Столяров v4 Проникновение в Docker с примерами

Docker penetration

Embed Size (px)

Citation preview

Page 1: Docker penetration

Дмитрий Столяров

v4

Проникновение в Docker с примерами

Page 2: Docker penetration

Привет!# whoamidmitry.stolyarov# hostname -dflant.ru# cat /etc/motdПроникновение в Dockerс примерами

Page 3: Docker penetration

24×7×365 L1/L2/L3/L4 DevOps SLA

Page 4: Docker penetration

Опыт

Page 5: Docker penetration

ОпытOpenSolaris Zones

Page 6: Docker penetration

Опыт

Gentoo и Linux-VServer 2006

OpenSolaris Zones

Page 7: Docker penetration

Опыт

Gentoo и Linux-VServer 2006

OpenSolaris Zones

procfs v1 by flant 2008

Page 8: Docker penetration

Опыт

Gentoo и Linux-VServer 2006

OpenSolaris Zones

procfs v1 by flant 2008

LXC

Page 9: Docker penetration

Опыт

Gentoo и Linux-VServer 2006

OpenSolaris Zones

procfs v1 by flant 2008

jailer by flant 2009

LXC

Page 10: Docker penetration

Опыт

Gentoo и Linux-VServer 2006

OpenSolaris Zones

procfs v1 by flant 2008

jailer by flant 2009

LXC

Docker 2013, осень

Page 11: Docker penetration

Опыт

Gentoo и Linux-VServer 2006

OpenSolaris Zones

procfs v1 by flant 2008

jailer by flant 2009

LXC

Docker 2013, осень

Docker 2014, 6 июня

Page 12: Docker penetration

Зачем проникать в Docker?

Page 13: Docker penetration

Continuous Delivery

Зачем проникать в Docker?

Page 14: Docker penetration

Тестовые окружения

Continuous Delivery

Зачем проникать в Docker?

Page 15: Docker penetration

Тестовые окружения

Continuous Delivery

Контейнеры

Зачем проникать в Docker?

Page 16: Docker penetration

Тестовые окружения

Continuous Delivery

Контейнеры

Зачем проникать в Docker?

}>90%

Page 17: Docker penetration

Тестовые окружения

Continuous Delivery

Контейнеры

}>90% Не нужен доступ

Зачем проникать в Docker?

Page 18: Docker penetration

Тестовые окружения

Continuous Delivery

Контейнеры Нужен доступ

}>90% Не нужен доступ

Зачем проникать в Docker?

Page 19: Docker penetration
Page 20: Docker penetration
Page 21: Docker penetration

OpenSSH OpenSSH

Page 22: Docker penetration

OpenSSH OpenSSH

:22 :22

Page 23: Docker penetration

OpenSSH OpenSSH

:22 :22

:23

Page 24: Docker penetration

OpenSSH OpenSSH

:22 :22

:23 :24

Page 25: Docker penetration

OpenSSH OpenSSH

:22 :22

reverse proxy

:22

Page 26: Docker penetration

Петя

OpenSSH

:22

Вася

Page 27: Docker penetration

Что такое Docker?

Page 28: Docker penetration

Что такое Docker?

capabilities

Page 29: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

Page 30: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces

Page 31: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

Page 32: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups

Page 33: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

Page 34: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

Page 35: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

Page 36: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

overlay (3.18, Dec 2014)

Page 37: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

overlay (3.18, Dec 2014)

kern

el

Page 38: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

overlay (3.18, Dec 2014)

Docker (~2014)

kern

el

Page 39: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

overlay (3.18, Dec 2014)

Docker (~2014)

kern

el

Page 40: Docker penetration

unshare( );

Page 41: Docker penetration

unshare(CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS);

Page 42: Docker penetration

unshare(CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS);

if(fork()) { wait(NULL); return 0;}

Page 43: Docker penetration

unshare(CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS);

if(fork()) { wait(NULL); return 0;}

umount("/proc");mount("proc", "/proc", "proc", 0, 0);

Page 44: Docker penetration

unshare(CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS);

if(fork()) { wait(NULL); return 0;}

umount("/proc");mount("proc", "/proc", "proc", 0, 0);

execl("/bin/bash", "/bin/bash", NULL);

Page 45: Docker penetration

#define _GNU_SOURCE#include <sched.h>#include <unistd.h>#include <sys/mount.h>#include <sys/wait.h>

int main() { unshare(CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS);

if(fork()) { wait(NULL); return 0; }

umount("/proc"); mount("proc", "/proc", "proc", 0, 0);

execl("/bin/bash", "/bin/bash", NULL);}

Page 46: Docker penetration

# gcc unshare.c -o unshare

Page 47: Docker penetration

# gcc unshare.c -o unshare

# ./unshare

Page 48: Docker penetration

# gcc unshare.c -o unshare

# ./unshare

# ps axPID TTY STAT TIME COMMAND 1 pts/0 S 0:00 /bin/bash 12 pts/0 R+ 0:00 ps ax

Page 49: Docker penetration

# gcc unshare.c -o unshare

# ./unshare

# ps axPID TTY STAT TIME COMMAND 1 pts/0 S 0:00 /bin/bash 12 pts/0 R+ 0:00 ps ax

# netstat -natu… nothing#

Page 50: Docker penetration

pid

Page 51: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);

Page 52: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid); open(pathbuf, O_RDONLY)

Page 53: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);setns(open(pathbuf, O_RDONLY), 0);

Page 54: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/ipc", pid);setns(open(pathbuf, O_RDONLY), 0);

Page 55: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/ipc", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/uts", pid);setns(open(pathbuf, O_RDONLY), 0);

Page 56: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/ipc", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/uts", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/pid", pid);setns(open(pathbuf, O_RDONLY), 0);

Page 57: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/ipc", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/uts", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/pid", pid);setns(open(pathbuf, O_RDONLY), 0);snprintf(pathbuf, 100, "/proc/%d/ns/mnt", pid);setns(open(pathbuf, O_RDONLY), 0);

Page 58: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);setns(open(pathbuf, O_RDONLY), 0);............snprintf(pathbuf, 100, "/proc/%d/ns/mnt", pid);setns(open(pathbuf, O_RDONLY), 0);

Page 59: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);setns(open(pathbuf, O_RDONLY), 0);............snprintf(pathbuf, 100, "/proc/%d/ns/mnt", pid);setns(open(pathbuf, O_RDONLY), 0);

if(fork()) { wait(NULL); return 0;}

Page 60: Docker penetration

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);setns(open(pathbuf, O_RDONLY), 0);............snprintf(pathbuf, 100, "/proc/%d/ns/mnt", pid);setns(open(pathbuf, O_RDONLY), 0);

if(fork()) { wait(NULL); return 0;}

execl("/bin/bash", "/bin/bash", NULL);

Page 61: Docker penetration

#define _GNU_SOURCE#include <sched.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>#include <fcntl.h>

int main(int argc, char **argv) { int pid = atoi(argv[1]); char pathbuf[100];

snprintf(pathbuf, 100, "/proc/%d/ns/net", pid); setns(open(pathbuf, O_RDONLY), 0); snprintf(pathbuf, 100, "/proc/%d/ns/ipc", pid); setns(open(pathbuf, O_RDONLY), 0); snprintf(pathbuf, 100, "/proc/%d/ns/uts", pid); setns(open(pathbuf, O_RDONLY), 0); snprintf(pathbuf, 100, "/proc/%d/ns/pid", pid); setns(open(pathbuf, O_RDONLY), 0); snprintf(pathbuf, 100, "/proc/%d/ns/mnt", pid); setns(open(pathbuf, O_RDONLY), 0);

if(fork()) { wait(NULL); return 0; }

execl("/bin/bash", "/bin/bash", NULL);}

Page 62: Docker penetration

# gcc setns.c -o setns

Page 63: Docker penetration

# gcc setns.c -o setns

# pstree -p $(pidof unshare)unshare(5136)───bash(5137)

Page 64: Docker penetration

# gcc setns.c -o setns

# pstree -p $(pidof unshare)unshare(5136)───bash(5137)

# ./setns 5137

Page 65: Docker penetration

# gcc setns.c -o setns

# pstree -p $(pidof unshare)unshare(5136)───bash(5137)

# ./setns 5137

# ps ax PID TTY STAT TIME COMMAND 1 pts/0 S+ 0:00 /bin/bash 42 pts/2 S 0:00 /bin/bash 52 pts/2 R+ 0:00 ps ax

Page 66: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

overlay (3.18, Dec 2014)

Docker (~2014)

kern

el ✔

Page 67: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

overlay (3.18, Dec 2014)

Docker (~2014)

kern

el ✔

Page 68: Docker penetration

# mkdir /sys/fs/cgroup/memory/mygroup

Page 69: Docker penetration

# mkdir /sys/fs/cgroup/memory/mygroup

# echo $$ > /sys/fs/cgroup/memory/mygroup/tasks

Page 70: Docker penetration

# mkdir /sys/fs/cgroup/memory/mygroup

# echo $$ > /sys/fs/cgroup/memory/mygroup/tasks

# cat /proc/$$/cgroup | grep memory6:memory:/mygroup

Page 71: Docker penetration

# mkdir /sys/fs/cgroup/memory/mygroup

# echo $$ > /sys/fs/cgroup/memory/mygroup/tasks

# cat /proc/$$/cgroup | grep memory6:memory:/mygroup

# bash

Page 72: Docker penetration

# mkdir /sys/fs/cgroup/memory/mygroup

# echo $$ > /sys/fs/cgroup/memory/mygroup/tasks

# cat /proc/$$/cgroup | grep memory6:memory:/mygroup

# bash# cat /sys/fs/cgroup/memory/mygroup/tasks216545624572

Page 73: Docker penetration

# mkdir /sys/fs/cgroup/memory/mygroup

# echo $$ > /sys/fs/cgroup/memory/mygroup/tasks

# cat /proc/$$/cgroup | grep memory6:memory:/mygroup

# bash# cat /sys/fs/cgroup/memory/mygroup/tasks216545624572

# echo $$ > /sys/fs/cgroup/memory/tasks# rmdir /sys/fs/cgroup/memory/mygroup

Page 74: Docker penetration

# mkdir /sys/fs/cgroup/memory/mygroup

# echo $$ > /sys/fs/cgroup/memory/mygroup/tasks

# cat /proc/$$/cgroup | grep memory6:memory:/mygroup

# bash# cat /sys/fs/cgroup/memory/mygroup/tasks216545624572

# echo $$ > /sys/fs/cgroup/memory/tasks# rmdir /sys/fs/cgroup/memory/mygroup

Page 75: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

overlay (3.18, Dec 2014)

Docker (~2014)

kern

el ✔ ✔

Page 76: Docker penetration

Docker это rocket science?

Page 77: Docker penetration

Примочка непонятного действия?

Page 78: Docker penetration

Docker медленный для production?

Page 79: Docker penetration

Docker НЕ безопасный для production?

Page 80: Docker penetration

Что такое Docker?

capabilities (2.2 / 1999)

namespaces (2.6.19 / Nov 2006)

cgroups (2.6.24 / Jan 2008)

veth (~ Sep 2007)

aufs (~ 2006)

overlay (3.18, Dec 2014)

Docker (~2014)

kern

el

Page 81: Docker penetration

Everything should be made as simple as possible, but not simpler.

Albert Einstein

Page 82: Docker penetration

Что нужно чтобы войти в Docker?

Page 83: Docker penetration

Что нужно чтобы войти в Docker?

Узнать pid и id контейнера

Page 84: Docker penetration

Что нужно чтобы войти в Docker?

Узнать pid и id контейнера# docker inspect -f '{{.State.Pid}} {{.Id}}' container_name

Page 85: Docker penetration

Что нужно чтобы войти в Docker?

Добавить в cgroup`ы

Узнать pid и id контейнера

Page 86: Docker penetration

Что нужно чтобы войти в Docker?

Добавить в cgroup`ы

Узнать pid и id контейнера

for f in $(ls /sys/fs/cgroup/*/docker/$CONTAINER_ID/tasks) do echo $$ > $fdone

Page 87: Docker penetration

Что нужно чтобы войти в Docker?

Добавить в cgroup`ы

Узнать pid и id контейнера

Сменить namepsace`ы

Page 88: Docker penetration

Что нужно чтобы войти в Docker?

Добавить в cgroup`ы

Узнать pid и id контейнера

Сменить namepsace`ы

Снять лишние capabilities

Page 89: Docker penetration

Петя

OpenSSH

:22

Вася

Page 90: Docker penetration

Петя

OpenSSH

:22

Вася

Page 91: Docker penetration

Петя

OpenSSH

:22

Вася

PAM

Page 92: Docker penetration

Петя

OpenSSH

:22

Вася

pam_docker

Page 93: Docker penetration

Петя

OpenSSH

:22

Вася

pam_docker

ProFTPd

:21

Page 94: Docker penetration

Петя

OpenSSH

:22

Вася

pam_docker

ProFTPd

:21

su / sudo

Page 95: Docker penetration

Петя

OpenSSH

:22

Вася

pam_docker

ProFTPd

:21

su / sudo

cron

Page 96: Docker penetration

php_fpm: master

Page 97: Docker penetration

php_fpm: master

W W W

Page 98: Docker penetration

php_fpm: master

W W W W W W

Page 99: Docker penetration

php_fpm: master

W W W W W W

Page 100: Docker penetration

Наши docker-проекты github.com/flant/docker_penetration_experiment

github.com/flant/pam_docker

github.com/flant/php_fpm_docker

Дмитрий Столяров [email protected]

linkedin.com/in/distol

github.com/distol

Всем спасибо!

Тимофей Кириллов github.com/distorhead