The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Доступен pam_docker, PAM-модуль для аутентификации внутри Docker

05.10.2016 13:53

Компания «Флант» представила pam_docker — экспериментальный PAM-модуль, позволяющий «помещать» пользователей и группы хост-системы внутрь контейнеров Docker. Исходный код pam_docker написан на языке Си и распространяется под лицензией GNU GPLv3.

Созданный PAM-модуль призван упростить аутентификацию пользователей хост-системы внутри Docker-контейнеров и может применяться в различных системных сервисах, включая su/sudo, cron, SSH, FTP и т.п. Использовать pam_docker можно, например, для организации входа по SSH в Docker-контейнеры, используя учётную запись хост-системы, однако сами разработчики сообщают, что модуль является больше исследовательским — реализация позволяет улучшить понимание, как на практике работает Docker.

Подробнее с устройством модуля можно познакомиться посмотрев видеозапись доклада «Проникновение в Docker с примерами», представленного этим летом на встрече meetup-группы Docker Moscow в Badoo.



  1. Главная ссылка к новости (http://flant.ru/news/58...)
Автор новости: Dmitry Shurupov
Тип: Программы
Короткая ссылка: https://opennet.ru/45279-docker
Ключевые слова: docker, pam
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (62) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 20:51, 05/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +10 +/
    > для организации входа по SSH в Docker-контейнеры

    Костыли-костылики

     
     
  • 2.2, A.Stahl (ok), 20:53, 05/10/2016 [^] [^^] [^^^] [ответить]  
  • +7 +/
    PAM-PAM-PARAM
     

  • 1.3, Аноним (-), 20:54, 05/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    любители goto для одной строчки...
     
     
  • 2.12, Аноним (-), 06:40, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Я вот недавно размышлял стоит ли юзать готу для одной строчки и пришел к выводу что стоит.
    Пришел к выводу что стоит чтоб избежать дублирования этой самой строчки, пусть готу и занимает столько же места, но в будущем ты можешь дописать там еще пару строчек освобождения ресурсов и в итоге там где готу могло стоять забыть дописать, а так готу устраняет дублирование кода и уменьшает вероятность будущих ошибок.
    Давай, переубеди меня, или готу плохо потому что готу?
     
     
  • 3.15, Илья (??), 11:09, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Вы, главное, не борщите с этим делом. Прежде всего нам важно чтобы вы не поседели раньше времени
     
  • 3.43, Аноним (-), 20:10, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Если goto не превращает код в макароны, не вижу ничего предосудительного в его использовании. Ведь его не используют только из-за этого.
     

  • 1.5, freehck (ok), 23:40, 05/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ммм... Шурупов. Флант.

    Я так вижу, что дело не остановилось на "готовых серверных решениях на базе Ubuntu Server", теперь вы там фанатеете от контейнеризации всего и вся?

    И для чего используете? Как продвигается?

     
     
  • 2.9, Dmitry Shurupov (ok), 05:38, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Привет. Мы фанатеем от разных вещей, но как компания выбираем практичные (эффективные, надёжные) Open Source-решения для задач клиентов там, где это имеет смысл. Docker у нас активно используется для нужд DevOps (автоматизация выкатов релизов веб-приложений и всё рядом). Кто-то, возможно, удивится, но на нём в production работают серьёзные и нагруженные ресурсы.
     
     
  • 3.19, crypt (ok), 12:46, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    а репозиторий образов у вас свой или официальный используете?
     
     
  • 4.27, Dmitry Shurupov (ok), 14:16, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > а репозиторий образов у вас свой или официальный используете?

    Процитирую коллегу:
    > Если образ opensource, то мы его храним в hub. Если этот образ связан с конкретным клиентом — храним или в приватном hub'е этого клиента, или ставим отдельный registry для этого клиента. Своего централизованного registry у нас нет, предпочитаем не плодить сущности без надобностей. Периодически посматриваем в сторону JFrog Bintray: он бы нам был очень полезен не только для Docker, но и для Vagrant-образов, и для RPM/DEB-пакетов.

     
     
  • 5.28, crypt (ok), 14:53, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >> а репозиторий образов у вас свой или официальный используете?
    > Процитирую коллегу:
    >> Если образ opensource, то мы его храним в hub. Если этот образ связан с конкретным клиентом — храним или в приватном hub'е этого клиента, или ставим отдельный registry для этого клиента. Своего централизованного registry у нас нет, предпочитаем не плодить сущности без надобностей. Периодически посматриваем в сторону JFrog Bintray: он бы нам был очень полезен не только для Docker, но и для Vagrant-образов, и для RPM/DEB-пакетов.

    Кажется, мы о разных вещах. Я сам негативно отношусь к Docker и соответственно не особо знаю экосистему (без понятия, что за JFrog). Одна из моих претензий к докеру, это невозможность (?) развернуть свой собственный репозиторий образов без использования того же докера. Т.е. вы используете "приватные" хабы в чужой инфраструктуре. По моим понятиям доверять данные клиента третьим лицам, если не смешно, то, скажем мягко, не всегда возможно.

     
     
  • 6.34, Dmitry Shurupov (ok), 16:36, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > в чужой инфраструктуре

    Мы ставим отдельностоящий registry (https://github.com/docker/distribution). Свой собственный репозиторий образов поднимается за 3 минуты, в самом простом виде на файловом бэкенде, а протокол взаимодействия Docker с registry полностью открытый; сам registry (который теперь называется distribution, раньше был тут: https://github.com/docker/docker-registry) — тоже открытый. «Приватные» хабы мы можем использовать у тех, кого это устраивает (нет особых требований). Такие клиенты зачастую уже живут у третьих лиц (github/bitbucket/amazon/digitalocean и т.д.), и платить 10$ за виртуалку в DO под registry или за приватный хаб — проще за хаб, чтобы просто не тратить бессмысленно время на настройку и поддержку.

     
     
  • 7.56, crypt (ok), 15:59, 08/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >  поднимается за 3 минуты

    ну да, с использованием самого докер?:)

    Deploying a registry server

    docker run ...

    Я говорю о том, чтобы настроить такой registry с нуля в типовом окружении с типовыми компонентами.


    > сам registry (который теперь называется distribution

    даже в базовых названиях еще не стабилизировался...

     
  • 7.57, crypt (ok), 16:10, 08/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >а протокол взаимодействия Docker с registry полностью открытый

    я вполне знаю, что это за технология и на чем она базируется. про открытость есть смысл рассказывать клиентам, а не админам.

     
  • 5.29, crypt (ok), 14:54, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • –3 +/
    > Процитирую коллегу:

    какого коллегу? кто вы и откуда вообще?

     
  • 3.22, freehck (ok), 13:44, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Мы фанатеем от разных вещей, но как компания выбираем практичные (эффективные,
    > надёжные) Open Source-решения для задач клиентов там, где это имеет смысл.

    Мы помнится так и не закончили спор про ненадёжность Ubuntu Server. :)
    Ты моё мнение знаешь: я бы с Ubuntu не связывался в продакшене. Вот Debian/Devuan - другое дело.

    > Docker у нас активно используется для нужд DevOps (автоматизация выкатов релизов
    > веб-приложений и всё рядом). Кто-то, возможно, удивится, но на нём в
    > production работают серьёзные и нагруженные ресурсы.

    Кстати да, для выкатки веб-приложений возможно и не плохое решение.

     
     
  • 4.24, Аноним (-), 13:59, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Devuan себя ещё никак не показал.
     
     
  • 5.38, freehck (ok), 18:39, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Devuan себя ещё никак не показал.

    А как он должен себя "показать"? Люди ставят на серверы, пользуют. Чего ещё надо-то?

     
  • 4.44, insider (??), 22:04, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >я бы с Ubuntu не связывался в продакшене

    А у вас есть продакшн и насколько большой?

     
     
  • 5.45, freehck (ok), 23:22, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > А у вас есть продакшн и насколько большой?
    > insider

    Предлагаете мне побыть Вами? :D

     
  • 4.58, Аноним (-), 18:15, 09/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Это юношеский максимализм и подмена рациональных подходов предпочтениями и убежд... большой текст свёрнут, показать
     
     
  • 5.63, freehck (ok), 13:44, 10/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >> Ты моё мнение знаешь: я бы с Ubuntu не связывался в продакшене.
    > Реально серверная убунта LTS - не найдешь 10 отличий от debian stable.

    Это по-твоему аргумент *за* Ubuntu?

    > Самое приятное по сравнению с дебианом - предсказуемость циклов релиза.

    Отлично. И что тебе даёт предсказуемый релизный цикл для *сервера*?

    > Devuan вообще какие-то побочные максималисты-маргиналы с непонятным результатом на выходе.

    Почему же не понятным. Дистрибутив есть, рабочий, многие знакомые дебианщики ставят и хвалят.

    >> Кстати да, для выкатки веб-приложений возможно и не плохое решение.
    > Так его для этого все и используют в основном.

    По моему опыту чаще его скорее используют для создания сборочных окружений. Впрочем, я в среде программистов живу, так что такие наблюдения закономерны.

     

  • 1.6, Аноним (-), 03:15, 06/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Пусть их Проникновение останется при них, смысл тогда в изоляции приложения, используя докер
     
     
  • 2.7, Аноним (-), 03:29, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Пусть их Проникновение останется при них, смысл тогда в изоляции приложения, используя
    > докер

    Посмотрел, брошурку их компании, не поверите но эти ребята обслуживают форбс. А еще у них много красивых логотипов и названий всяких Open Source проектов. Это был сарказм. Исследователи блин, ну раз этот модуль носит такой смысл не обязательно трындеть об этом 50 минут.

     
     
  • 3.8, Аноним (-), 03:34, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Ах да чуть не забыл, любой системный администратор и веб разработчик знает почти все что у них перечислено в брошурке. Блин ну удивительные люди, придумали модуль чтобы связать то что было изолировано, ну это же на медаль тянет
     
     
  • 4.11, Dmitry Shurupov (ok), 05:47, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Ах да чуть не забыл, любой системный администратор и веб разработчик знает
    > почти все что у них перечислено в брошурке.

    Если вы действительно знакомы с людьми, которые _знают_ (не просто указывают в резюме длинным списком, поскольку «где-то видели» и «пару раз перезапускали») почти всё, что там перечислено, готовы обсудить их трудоустройство.

     
     
  • 5.14, anonymous (??), 11:01, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Столько пафоса, а по факту:
    > на испытательный срок — от 60 000 руб.; первое время после исп. срока — от 70 000 руб.

    Хотя, я уже давно понял, что Docker для люмпенов.

     
     
  • 6.16, Dmitry Shurupov (ok), 11:45, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Надеюсь, вы правильно увидели «от» в вакансии для регионов.
     
     
  • 7.17, anonymous (??), 12:00, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Правильно, ваше "от" в 2 раза ниже рыночного.

    И хватит уже прикрываться этими вашими регионами, тем более в контексте удаленной работы.

     
     
  • 8.18, Dmitry Shurupov (ok), 12:25, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Это банальная неправда в контексте процитированной вакансии Подтверждается реал... текст свёрнут, показать
     
     
  • 9.20, anonymous (??), 13:28, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я 2ой месяц ищу себе напарника на подобную вашей вакансию, требования примерно т... текст свёрнут, показать
     
     
  • 10.23, freehck (ok), 13:48, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Поддерживаю В Москве 60-70 тысяч получают только мартышки, которые ничего не ум... текст свёрнут, показать
     
  • 10.25, Dmitry Shurupov (ok), 14:03, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Я уже не один год ищу людей, провёл десятки собеседований, набрал многих людей в... текст свёрнут, показать
     
     
  • 11.30, anonymous (??), 14:55, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Мы видим то, что у них получается Docker, Ubuntu, это все Логично предположить... текст свёрнут, показать
     
     
  • 12.32, Dmitry Shurupov (ok), 15:54, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Вместо предположений можно сделать минимальные действия и для начала зайти хотя ... текст свёрнут, показать
     
     
  • 13.36, anonymous (??), 18:03, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Это первое, что я сделал - не впечатлило Это все в данном случае подразумевае... текст свёрнут, показать
     
  • 13.37, anonymous (??), 18:16, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Ок, перефразирую вопрос зачем кому-то удаленно работать на вас, а не на кого-то... текст свёрнут, показать
     
  • 11.49, Drew DeVault (?), 11:07, 07/10/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    в месяц это 160000 таким образом, компания flant имеет с человека более, чем в ... текст свёрнут, показать
     
     
  • 12.59, Аноним (-), 18:20, 09/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Ты так ненавязчиво спалил почему много народа уходит во фриланс А зачем делитьс... текст свёрнут, показать
     
     
  • 13.62, Drew DeVault (?), 07:48, 10/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    так в том и дело, что барыги плачут к ним никто не идёт но не доходит додумать... текст свёрнут, показать
     
  • 3.10, Dmitry Shurupov (ok), 05:44, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Посмотрел, брошурку их компании, не поверите но эти ребята обслуживают форбс. А
    > еще у них много красивых логотипов и названий всяких Open Source
    > проектов. Это был сарказм.

    Брошюра немного устарела (в процессе обновления) и основной фокус у нас сейчас не на всём этом многообразии логотипов, с которыми мы успели поработать и по-прежнему где-то поддерживаем, а на DevOps, где активно применяется Docker.

    > Исследователи блин, ну раз этот модуль носит
    > такой смысл не обязательно трындеть об этом 50 минут.

    Если не интересует Docker, то нет обязательного смысла в комментировании того, что не интересует. Доклад для тех, кто хотел бы узнать больше про устройство Docker, а pam_docker — практическая реализация, чтобы увидеть, как это работает. Дополнительные демонстрационные исходники к презентации можно найти здесь: https://github.com/flant/docker_penetration_experiment

     
     
  • 4.21, freehck (ok), 13:40, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >> Исследователи блин, ну раз этот модуль носит такой смысл не обязательно трындеть об этом 50 минут.

    Ну это-то как раз логично. Если повсюду пихаете контейнеры, рано или поздно встаёт вопрос о том, что они должны как-то взаимодействовать.

    > Если не интересует Docker, то нет обязательного смысла в комментировании того, что не интересует.

    Расслабься, Дим. Это анонимная новостная борда, чего ты от неё хочешь? :)

    > Доклад для тех, кто хотел бы узнать больше про устройство Docker, а pam_docker — практическая реализация, чтобы увидеть, как это работает.

    Ну я вот доклад прослушал от и до. Ты уж меня заранее извини, но... весьма муторно и малоинформативно. Много слов не по делу. Очень раздражает такой подход к ведению презентации. Такое чувство, что читается лекция студентам какого-нибудь МИЭМа. А суть можно было бы передать минут за 5.

     
     
  • 5.26, Dmitry Shurupov (ok), 14:05, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Отсылка к МИЭМу, конечно, греет душу… :-) Но я не верю, что за 5 минут можно передать аналогичный уровень понимания. Не утверждаю, что это лучший доклад, но и с обратным утрированием не согласен. Однако раздражение — это дело индивидуальное.
     
  • 4.41, Аноним (-), 19:43, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    В наших Российских IT компаниях, основной прием это красивые логотипы из мира Op... большой текст свёрнут, показать
     

  • 1.13, Аноним (-), 10:09, 06/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Jail ему не нравиться, неосиляторы мигрировали на другой костыль.
     
     
  • 2.31, нет (??), 15:01, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    грамар нацы, фас
     
     
  • 3.33, Аноним (-), 16:19, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    азазаза
     
  • 2.39, Аноним (-), 19:17, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Они даже не пробовали. "Хотя мы никогда FreeBSD не использовали не любили".

    А вот сломать форкфлоу doker, чтобы полюбить docker - это доставило.

    - Ребят, может быть инструмент выбран неправильно, раз мы вносим такие правки?
    - Не, всё нормально, коммить!

     
     
  • 3.42, anonymous (??), 19:46, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Чуть менее, чем все окружение докера сделано именно так - костыли на костылях.
     
     
  • 4.61, Аноним (-), 18:27, 09/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Чуть менее, чем все окружение докера сделано именно так - костыли на костылях.

    Докер может и костыль, но осваивается быстро, проблем создает минимум и решает конкретные практические задачи по деплою и автоматизации. А jails - формально как бы есть, но практически значимые задачи ими решать - полная порнография. По сравнению с костыльным докером. Не говоря о том что jals есть только а bsd где до сих пор не могут сделать по человечески тот же пакетный менеджер и репы. Вот их и позаменяли везде на убунты и дебианы.

     
  • 2.60, Аноним (-), 18:23, 09/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Jail ему не нравиться, неосиляторы мигрировали на другой костыль.

    Никто не собирается что-то там "осиливать". Берут какое-нибудь решение которое делает что надо как можно проще и быстрее. Желательно популярное, чтобы костылить поменьше. Нормальная оптимизация рабочих процессов - делать какие-то приносящие результат действия вместо того чтобы что-то "осиливать".

     

  • 1.40, Аноним (-), 19:30, 06/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    "Я не знаю как fork объяснить."

    Дальше не смог смотреть это голосование.

     
     
  • 2.46, freehck (ok), 23:27, 06/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > "Я не знаю как fork объяснить."
    > Дальше не смог смотреть это голосование.

    А я до 13й минуты выписывал в блокнотик, но потом тоже плюнул. :)
    Кстати, правильное слово. Голосование.

     

  • 1.47, Аноним (-), 00:32, 07/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    доклад просто ужасный, докладчик скорее маркетолог, внятных ответов на вопросы не увидел. понял только, что он уже больше 11 лет любит контейнеры
     
     
  • 2.48, Аноним (-), 02:13, 07/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > доклад просто ужасный, докладчик скорее маркетолог, внятных ответов на вопросы не увидел.
    > понял только, что он уже больше 11 лет любит контейнеры

    Докладчик просто не дисциплинированный человек, да и маркетолог не очень, так как маркетологи специализируются на привлечение внимания. И умение подать большой объем информации в короткий промежуток времени. А любовь свою изучать надо, тщательнее, за 11 лет то можно было

     

  • 1.50, Аноним (-), 16:21, 07/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    надо было назвать "двойное проникновение" подчёркивало бы извращенский подход ;-)
     
  • 1.51, Аноним (-), 17:11, 07/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вопрос к разработчикам. Зачем вам PAM? PAM служит для аутентификации. Вы же делаете docker shell в контейнере.

    проще было бы заменить это все на маленький bash скрипт который пропишете как ваш login shell
    #!/bin/sh
    /usr/bin/docker exec -ti [container_id] /bin/sh

    и вы и при логине и при su сразу в попадете внутрь докер контейнера.
    Ну если хотите можно дополнительно свою логику накрутить и это будет куда проще и правильней чем пихать это в PAM.

     
     
  • 2.52, Dmitry Shurupov (ok), 17:31, 07/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Формально: такой скрипт очень ограничен в применении, а PAM — это не только для SSH (в тексте приведен пример с тем же FTP). По существу: не костыль был самоцелью, а взаимодействие с Docker на таком уровне. Костыли действительно можно сделать проще :-)
     
     
  • 3.54, Аноним (-), 22:37, 07/10/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я вас понял, спасибо за ответ.
    Просто в самом докладе не хватает юзкейсов из реальной жизни, где бы можно было использовать данный модуль. Ну да наверное для хостинга, в какой то степени для тестов.
    Как то подробнее расписать как вы используете данный модуль. Может быть это останется для другого доклада. Но еще раз спасибо за доклад и за отрытые сорци.
     

  • 1.53, Аноним (-), 18:07, 07/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как, мля? Уже давно есть pam_script.
     
     
  • 2.55, Аноним (-), 13:26, 08/10/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Как, мля? Уже давно есть pam_script.

    Слишком простое решение, надо свое, правильное. А вообще весь доклад это просто предлог для рекламы самой компании. Мы IT компания а вот наши многочасовые труды...

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2020 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру