Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

493 views

Published on

- Краткая вводная про Docker (namespaces, cgroups и как Docker все это использует)
- Как заходить в Docker из вашего софта?
- Примеры: pam_docker и php_fpm_docker

Published in: Software
  • Be the first to comment

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

  1. 1. Дмитрий Столяров v4 Проникновение в Docker с примерами
  2. 2. Привет! # whoami dmitry.stolyarov # hostname -d flant.ru # cat /etc/motd Проникновение в Docker с примерами
  3. 3. 24×7×365 L1/L2/L3/L4 DevOps SLA
  4. 4. Опыт
  5. 5. Опыт OpenSolaris Zones
  6. 6. Опыт Gentoo и Linux-VServer 2006 OpenSolaris Zones
  7. 7. Опыт Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant 2008
  8. 8. Опыт Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant 2008 LXC
  9. 9. Опыт Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant 2008 jailer by flant 2009 LXC
  10. 10. Опыт Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant 2008 jailer by flant 2009 LXC Docker 2013, осень
  11. 11. Опыт Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant 2008 jailer by flant 2009 LXC Docker 2013, осень Docker 2014, 6 июня
  12. 12. Зачем проникать в Docker?
  13. 13. Continuous Delivery Зачем проникать в Docker?
  14. 14. Тестовые окружения Continuous Delivery Зачем проникать в Docker?
  15. 15. Тестовые окружения Continuous Delivery Контейнеры Зачем проникать в Docker?
  16. 16. Тестовые окружения Continuous Delivery Контейнеры Зачем проникать в Docker? }>90%
  17. 17. Тестовые окружения Continuous Delivery Контейнеры }>90% Не нужен доступ Зачем проникать в Docker?
  18. 18. Тестовые окружения Continuous Delivery Контейнеры Нужен доступ }>90% Не нужен доступ Зачем проникать в Docker?
  19. 19. OpenSSH OpenSSH
  20. 20. OpenSSH OpenSSH :22 :22
  21. 21. OpenSSH OpenSSH :22 :22 :23
  22. 22. OpenSSH OpenSSH :22 :22 :23 :24
  23. 23. OpenSSH OpenSSH :22 :22 reverse proxy :22
  24. 24. Петя OpenSSH :22 Вася
  25. 25. Что такое Docker?
  26. 26. Что такое Docker? capabilities
  27. 27. Что такое Docker? capabilities (2.2 / 1999)
  28. 28. Что такое Docker? capabilities (2.2 / 1999) namespaces
  29. 29. Что такое Docker? capabilities (2.2 / 1999) namespaces (2.6.19 / Nov 2006)
  30. 30. Что такое Docker? capabilities (2.2 / 1999) namespaces (2.6.19 / Nov 2006) cgroups
  31. 31. Что такое Docker? capabilities (2.2 / 1999) namespaces (2.6.19 / Nov 2006) cgroups (2.6.24 / Jan 2008)
  32. 32. Что такое Docker? capabilities (2.2 / 1999) namespaces (2.6.19 / Nov 2006) cgroups (2.6.24 / Jan 2008) veth (~ Sep 2007)
  33. 33. Что такое Docker? capabilities (2.2 / 1999) namespaces (2.6.19 / Nov 2006) cgroups (2.6.24 / Jan 2008) veth (~ Sep 2007) aufs (~ 2006)
  34. 34. Что такое 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)
  35. 35. Что такое 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) kernel
  36. 36. Что такое 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) kernel
  37. 37. Что такое 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) kernel
  38. 38. unshare( );
  39. 39. unshare(CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS);
  40. 40. unshare(CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS); if(fork()) { wait(NULL); return 0; }
  41. 41. 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);
  42. 42. 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);
  43. 43. #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); }
  44. 44. # gcc unshare.c -o unshare
  45. 45. # gcc unshare.c -o unshare # ./unshare
  46. 46. # gcc unshare.c -o unshare # ./unshare # ps ax PID TTY STAT TIME COMMAND 1 pts/0 S 0:00 /bin/bash 12 pts/0 R+ 0:00 ps ax
  47. 47. # gcc unshare.c -o unshare # ./unshare # ps ax PID TTY STAT TIME COMMAND 1 pts/0 S 0:00 /bin/bash 12 pts/0 R+ 0:00 ps ax # netstat -natu … nothing #
  48. 48. pid
  49. 49. snprintf(pathbuf, 100, "/proc/%d/ns/net", pid);
  50. 50. snprintf(pathbuf, 100, "/proc/%d/ns/net", pid); open(pathbuf, O_RDONLY)
  51. 51. snprintf(pathbuf, 100, "/proc/%d/ns/net", pid); setns(open(pathbuf, O_RDONLY), 0);
  52. 52. 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);
  53. 53. 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);
  54. 54. 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);
  55. 55. 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);
  56. 56. 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);
  57. 57. 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; }
  58. 58. 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);
  59. 59. #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); }
  60. 60. # gcc setns.c -o setns
  61. 61. # gcc setns.c -o setns # pstree -p $(pidof unshare) unshare(5136)───bash(5137)
  62. 62. # gcc setns.c -o setns # pstree -p $(pidof unshare) unshare(5136)───bash(5137) # ./setns 5137
  63. 63. # 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
  64. 64. Что такое 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) kernel ✔
  65. 65. Что такое 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) kernel ✔
  66. 66. # mkdir /sys/fs/cgroup/memory/mygroup
  67. 67. # mkdir /sys/fs/cgroup/memory/mygroup # echo $$ > /sys/fs/cgroup/memory/mygroup/tasks
  68. 68. # mkdir /sys/fs/cgroup/memory/mygroup # echo $$ > /sys/fs/cgroup/memory/mygroup/tasks # cat /proc/$$/cgroup | grep memory 6:memory:/mygroup
  69. 69. # mkdir /sys/fs/cgroup/memory/mygroup # echo $$ > /sys/fs/cgroup/memory/mygroup/tasks # cat /proc/$$/cgroup | grep memory 6:memory:/mygroup # bash
  70. 70. # mkdir /sys/fs/cgroup/memory/mygroup # echo $$ > /sys/fs/cgroup/memory/mygroup/tasks # cat /proc/$$/cgroup | grep memory 6:memory:/mygroup # bash # cat /sys/fs/cgroup/memory/mygroup/tasks 2165 4562 4572
  71. 71. # mkdir /sys/fs/cgroup/memory/mygroup # echo $$ > /sys/fs/cgroup/memory/mygroup/tasks # cat /proc/$$/cgroup | grep memory 6:memory:/mygroup # bash # cat /sys/fs/cgroup/memory/mygroup/tasks 2165 4562 4572 # echo $$ > /sys/fs/cgroup/memory/tasks # rmdir /sys/fs/cgroup/memory/mygroup
  72. 72. # mkdir /sys/fs/cgroup/memory/mygroup # echo $$ > /sys/fs/cgroup/memory/mygroup/tasks # cat /proc/$$/cgroup | grep memory 6:memory:/mygroup # bash # cat /sys/fs/cgroup/memory/mygroup/tasks 2165 4562 4572 # echo $$ > /sys/fs/cgroup/memory/tasks # rmdir /sys/fs/cgroup/memory/mygroup
  73. 73. Что такое 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) kernel ✔ ✔
  74. 74. Docker это rocket science?
  75. 75. Примочка непонятного действия?
  76. 76. Docker медленный для production?
  77. 77. Docker НЕ безопасный для production?
  78. 78. Что такое 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) kernel
  79. 79. Everything should be made as simple as possible, but not simpler. Albert Einstein
  80. 80. Что нужно чтобы войти в Docker?
  81. 81. Что нужно чтобы войти в Docker? Узнать pid и id контейнера
  82. 82. Что нужно чтобы войти в Docker? Узнать pid и id контейнера # docker inspect -f '{{.State.Pid}} {{.Id}}' container_name
  83. 83. Что нужно чтобы войти в Docker? Добавить в cgroup`ы Узнать pid и id контейнера
  84. 84. Что нужно чтобы войти в Docker? Добавить в cgroup`ы Узнать pid и id контейнера for f in $(ls /sys/fs/cgroup/*/docker/$CONTAINER_ID/tasks) do echo $$ > $f done
  85. 85. Что нужно чтобы войти в Docker? Добавить в cgroup`ы Узнать pid и id контейнера Сменить namepsace`ы
  86. 86. Что нужно чтобы войти в Docker? Добавить в cgroup`ы Узнать pid и id контейнера Сменить namepsace`ы Снять лишние capabilities
  87. 87. Петя OpenSSH :22 Вася
  88. 88. Петя OpenSSH :22 Вася
  89. 89. Петя OpenSSH :22 Вася PAM
  90. 90. Петя OpenSSH :22 Вася pam_docker
  91. 91. Петя OpenSSH :22 Вася pam_docker ProFTPd :21
  92. 92. Петя OpenSSH :22 Вася pam_docker ProFTPd :21 su / sudo
  93. 93. Петя OpenSSH :22 Вася pam_docker ProFTPd :21 su / sudo cron
  94. 94. php_fpm: master
  95. 95. php_fpm: master W W W
  96. 96. php_fpm: master W W W W W W
  97. 97. php_fpm: master W W W W W W
  98. 98. Наши docker-проекты github.com/flant/docker_penetration_experiment github.com/flant/pam_docker github.com/flant/php_fpm_docker Дмитрий Столяров dmitry.stolyarov@flant.ru linkedin.com/in/distol github.com/distol Всем спасибо! Тимофей Кириллов github.com/distorhead

×