{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Андрей Садулин: заметки с тегом docker",
    "_rss_description": "Андрей Садулин — заметки разработчика",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/closed-ai.tech\/tags\/docker\/",
    "feed_url": "https:\/\/closed-ai.tech\/tags\/docker\/json\/",
    "icon": "https:\/\/closed-ai.tech\/pictures\/userpic\/userpic@2x.jpg?1715292324",
    "authors": [
        {
            "name": "Андрей Садулин",
            "url": "https:\/\/closed-ai.tech\/",
            "avatar": "https:\/\/closed-ai.tech\/pictures\/userpic\/userpic@2x.jpg?1715292324"
        }
    ],
    "items": [
        {
            "id": "17",
            "url": "https:\/\/closed-ai.tech\/all\/obnovlenie-infrastruktury\/",
            "title": "Обновление инфраструктуры",
            "content_html": "<p>Сегодня хочу рассказать про то, как я подключил платформу <b>Cloudflare<\/b> для обеспечения безопасного доступа к сервисным приложениям, которыми я пользуюсь для управления этим сайтом.<\/p>\n<h3>Начало<\/h3>\n<p>Кратко про архитектуру: «под капотом» здесь VPS c Ubuntu 22.04, веб-сервер и база данных запускаются в Docker-контейнерах, для их удобного администрирования я использую <a href=\"https:\/\/docs.portainer.io\/v\/2.20\">Portainer<\/a>. Также здесь установлен <a href=\"https:\/\/nginxproxymanager.com\/\">Nginx Proxy Manager<\/a> (тоже в контейнере), который перенаправляет трафик с www на основной домен, обеспечивает подключение по HTTPS, проверяет подлинность домена, и т. д. В качестве удобного интерфейса для конфигурации сервера и доступа к терминалу я выбрал <a href=\"https:\/\/cockpit-project.org\/\">Cockpit<\/a>.<\/p>\n<p>Поскольку все эти инструменты — веб-приложения, доступные публично (мне хотелось иметь возможность подключаться с любого устройства), необходимо было по-максимуму <b>защитить их от несанкционированного доступа<\/b>. Да, у них у всех по-умолчанию есть формы авторизации, но проверка там однофакторная, по логину и паролю — они хоть и длинные, но все равно могут быть скомпрометированы путем фишинга или подбора. Также вполне возможно появление уязвимостей и эксплойтов для них, позволяющих, в теории, каким-то образом обойти защиту. В общем, хотелось бы что-то понадежнее, в идеале — вообще не давать случайному пользователю доступ к этим сервисам.<\/p>\n<h3>Подключаем Cloudflare<\/h3>\n<p><a href=\"https:\/\/developers.cloudflare.com\/cloudflare-one\/connections\/connect-networks\/\">Zero Trust Tunnel<\/a> позволяет связать субдомен и внутренний адрес на host-машине с установленным приложением-коннектором (его, кстати, тоже можно развернуть в контейнере). Не нужно открывать порты или отключать firewall, т. к. коннектор поднимает egress-соединение с облаком, и самое крутое — через панель управления Cloudflare можно также <b>задать правила доступа<\/b> к ресурсу и <b>подключить дополнительный фактор аутентификации<\/b>, например, отправку одноразового кода на почту или вход через Google-аккаунт.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/network-diagram_hu35c98d3bbf0ecf738b5b543af7009e44_79161_2296x1101_resize_q75_box_3-fe1feb83.png.jpg\" width=\"2560\" height=\"1427\" alt=\"\" \/>\n<\/div>\n<p class=\"lead\">То есть, можно буквально в два клика открыть доступ по HTTPS к <tt>localhost:9090<\/tt> через <tt>private-service.my-site.com<\/tt> для тех, кто введет правильный email из whitelist’а и укажет верный код, отправленный в письме.<\/p>\n<p>Красота! ❤️<\/p>\n<p>Вот, как это выглядит в панели управления Cloudflare: на каждый «приватный» сервис я создал отдельный туннель. Обратите внимание на адреса — контейнер с коннектором <tt>cloudflared<\/tt> я добавил в bridge-сеть в Docker, которую создал вручную. Благодаря этому, во-первых, работает DNS, и можно обращаться к контейнерам по имени, а также легко можно получить доступ к host, указав Default Gateway.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-01.52.08@2x.png.jpg\" width=\"2560\" height=\"1722\" alt=\"\" \/>\n<\/div>\n<p>Добавим policy с группой доступа по-умолчанию — у меня это «разрешить любому пользователю с email из списка получать одноразовый код на почту». Настраивать можно как угодно: работает фильтрация по странам, по IP-адресам, можно проверять токены и т. д.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"2560\" data-ratio=\"1.3897937024973\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-15.51.20@2x.png.jpg\" width=\"2560\" height=\"1842\" alt=\"\" \/>\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-15.51.49@2x.png.jpg\" width=\"2560\" height=\"1842\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>Теперь при попытке обратиться к туннелю по public hostname, откроется форма авторизации. Выглядит она вот так, и её, кстати, можно настроить — добавить свой логотип, поменять цвет фона, написать какой-нибудь текст, добавить подсказки для входа.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"2560\" data-ratio=\"1.4997070884593\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-03.57.53@2x.png.jpg\" width=\"2560\" height=\"1707\" alt=\"\" \/>\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-04.38.08@2x.png.jpg\" width=\"2560\" height=\"1722\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>На всякий случай повторюсь — если введенного адреса нет в whitelist, код просто не придет.<\/p>\n<p>А ещё можно создать «приложения» и добавить их на главный экран — он называется App Launcher. Естественно, он тоже доступен только для авторизованных пользователей.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-01.47.32@2x.png.jpg\" width=\"2560\" height=\"1722\" alt=\"\" \/>\n<\/div>\n<p>Отмечу, что работает это всё только с доменами, перенесенными в Cloudflare или изначально приобретенными у них. Мой был куплен в reg.ru, перенос занял минут 15, ничего сложного.<\/p>\n<h3>Сколько стоит?<\/h3>\n<p>Весь описанный выше функционал <b>абсолютно бесплатен<\/b>, как и кэширование, защита от DDOS, и куча разных дополнительных виртуальных сетевых функций, но нужно привязать карточку. Наверное, единственный минус, который я могу выделить — Cloudflare функционально довольно перегружен: много дашбордов, панелей, настроек; но, благо, есть хорошая документация.<\/p>\n<h3>P. S.<\/h3>\n<p>В Cloudflare можно автоматически добавить SSL-сертификат и настроить редиректы с HTTP на HTTPS — об этом читайте <a href=\"\/all\/cloudflare-https-i-ssl\/\">в следующей заметке<\/a>.<\/p>\n<p>Большое спасибо Михаилу Щербине за консультации.<\/p>\n",
            "date_published": "2024-05-28T04:58:32+05:00",
            "date_modified": "2024-07-02T00:27:54+05:00",
            "tags": [
                "administration",
                "cloudflare",
                "docker",
                "networking"
            ],
            "image": "https:\/\/closed-ai.tech\/pictures\/network-diagram_hu35c98d3bbf0ecf738b5b543af7009e44_79161_2296x1101_resize_q75_box_3-fe1feb83.png.jpg",
            "_date_published_rfc2822": "Tue, 28 May 2024 04:58:32 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "17",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/closed-ai.tech\/pictures\/network-diagram_hu35c98d3bbf0ecf738b5b543af7009e44_79161_2296x1101_resize_q75_box_3-fe1feb83.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-01.52.08@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-15.51.20@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-15.51.49@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-03.57.53@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-04.38.08@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-01.47.32@2x.png.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}