Обычно внутри корпоративной сети нынче полно всяких приложений, и хотелось бы чтобы они работали по SSL. Можно, конечно, поднять свой УЦ, раздать сертификаты, прописать пользователям свой корневой сертификат - и это будет работать. А можно просто воспользоваться сервисом Let's Encrypt, раздав его сертификаты своим внутренним серверам, которые не видны из Интернета, причем сделать это просто и с минимумом трудозатрат на поддержку.

Необходимые условия

  • Наличие зарегистрированного домена, допустим, mycompany.ru и адресация внутренних серверов в нем.

  • Использование split-DNS, т.е. разрешение доменных имен mycompany.ru в разные IP адреса для внутренней сети и для всего Интернета. Делается либо через механизм View сервера BIND либо просто путем использования разных DNS серверов.

  • Внутренние сервера имеют доступ в Интернет по HTTPS - через маскирующий/NAT шлюз, файрвол, прокси, как угодно. Впрочем, это можно преодолеть, просто эту статью придется дочитать до конца, а поработать чуть больше.

Как это работает

Логика работы сервиса Let's Encrypt:

  • Сервер-претендент обращается к API Let's Encrypt по HTTPS, сообщает ему домены, для которых нужен сертификат. Например, server.mycompany.ru.

  • В ответ сервис формирует некий код, который должен быть размещен по запрошенному доменному адресу чтобы подтвердить принадлежность домена. Есть варианты: размещение файла с кодом на веб-сервере или добавление в DNS домена определенной записи. Мы будем использовать файл на веб-сервере.

  • "Проверялка" Let's Encrypt лезет простым GET запросом на адрес http://server.mycompany.ru/.well-known/acme-challenge/{а здесь сам код}, и если получает ожидаемый ответ - то считает, что домен проверен.

  • Let's Encrypt выпускает сертификат и предоставляет его серверу.

На самом деле все немного сложнее, но нам детали и не потребуются.

Что мы делаем и зачем

Нам понадобится один прокси-сервер (nginx) и правильная настройка DNS. Больше, удивительным образом, ничего. Прокси-сервер должен быть доступен из Интернет и иметь доступ во внутреннюю сеть (dual-homed).

Полагаем, что все наши сервера во внутреннем DNS прописаны по именам. Во внешнем DNS, в зоне mycompany.ru задаем имя для внешнего адреса прокси-сервера, пусть будет proxy. И там же для каждого сервера из внутренней сети делаем запись CNAME, указывающую на proxy.

Конфигурируем nginx, общая конфигурация самая обычная, нужные нам блоки server в контексте http выглядит так:

server {
    listen       80;
    server_name  .mycompany.ru;     # Принимаем любые имена в домене
    location /.well-known { 
        if ($request_method != GET) { # Разрешаем только метод GET
            return 444;               # иначе - сбрасываем TCP соединение
        }
        resolver 10.0.0.2 10.0.1.2; # Обязательно ипользуем внутренние DNS
        proxy_pass http://$host;    # проксируется на сервер внутрь сети с тем же именем
    }

    location / {                    # Все остальные запросы -
        return 444;                 # просто сбрасываем TCP соединение
        log_not_found off;          # и ничего не пишем в лог
        access_log off;
    }

}
server {                            # На все запросы по IP адресу без домена
    listen       80 default_server; # отвечаем сбросом TCP соединения
    server_name  _;
    return 444;
    log_not_found off;
    access_log off;
}

Кстати, если у вас уже есть dual-homed сервер с nginx для каких-то других задач, то эту конфигурацию можно просто добавить к нему, она не будет мешать обслуживанию других серверов даже с именами в том же домене.

Работает это очень просто:

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

  • "Проверялка" Let's Encrypt разрешает запрошенное имя в адрес proxy и посылает туда запрос GET, естественно доменное имя указано в запросе.

  • Получив запрос, прокси еще раз разрешает доменное имя, но уже внутренним DNS и выполняет запрос на реальный сервер, получает ответ и отдает его "проверялке".

  • Проверка пройдена, наш внутренний сервер получает сертификат.

Вуаля! Все работает! Ставим на внутреннем сервере Certbot или активируем встроенную поддержку сертификатов Let's Encrypt у нужного нам софта - и погнали. Не забываем повесить задачу на автообновление сертификатов!

За, против и немного про безопасность

Преимущества:

  • Простота реализации. По плечу очень среднему админу.

  • Совместимость. Работают любые ACME-клиенты с проверкой по HTTP на всех платформах, в том числе родной Certbot, встроенные ACME клиенты (проверено на Proxmox), да и вообще нет ограничений по использованию ACME кроме верификации по HTTP. И да, работать должно не только с Let's Encrypt.

  • Минимальные усилия на изменения: чтобы Let's Encrypt стал доступен для любого сервера внутри - достаточно просто добавить CNAME для него во внешний DNS. Ну и сделать соответствующие ACME-настройки на самом сервере, конечно.

Недостатки:

  • Мы вроде как показываем имена внутренних серверов в Интернете. На самом деле - нет, если только внешний DNS настроен правильно и не позволяет кому попало забирать зону целиком, что является хорошей практикой независимо от целей.
    UPDATE: Как правильно заметил в комментарии @HxShard , используя публичные сертификаты внутри сети мы неизбежно делаем доступными доменные имена узлов, для которых мы их получили, как минимум таким вот образом https://crt.sh/?q=habr.com. Тут уж придется каждому решить - насколько большой риск тем самым создается. Лично я оцениваю его как весьма небольшую цену за удобство, во всяком случае вряд ли именно это станет самым низким участком моего виртуального забора.

  • Теоретически, прокси-сервер, как любой dual-homed, создает угрозу. Но и меры защиты - самые обычные. Если они непонятны и вы не можете правильно настроить защиту для Linux + Nginx - то вам вообще не стоит иметь дела с серверами, подключенными к Интернету. Позовите взрослых пожалуйста!

  • Опять же, теоретически, существует возможность DoS на внутренний сервер при условии что его имя получено - путем заваливания его запросами в каталог /.well-known. Крайне маловероятный сценарий, но его можно легко купировать, ограничив скорость запросов на прокси. Это же nginx!

  • Внутренние серверы должны иметь доступ в Интернет. Но если это для вас проблема - то ниже покажу как ее решить.

К сожалению, Let's Encrypt не поддерживает и не публикует список собственных IP-адресов, поэтому ограничить обращение внутренних серверов наружу и запросы извне по IP - не получится.

И все же, изолированные сервера, сделаем?

Ценою усложнения схемы - сделаем и это. Дело в том, что ACME-клиент посылает запрос по HTTPs. С одной стороны - его тоже можно проксировать, но при этом "ломается" сертификат, и скорее всего ACME-клиент выдаст ошибку. SSL соединение нормально проксируется только на уровне TCP, но к счастью nginx и это умеет.

Нам понадобится:

  • По два внутренних IP адреса на каждый ACME сервис (для основного и staging).

  • "Перехватить" домен сервиса - либо путем записей в hosts либо на своем внутреннем DNS.

  • Настроить nginx для проксирования на уровне TCP.

Кстати: адреса API разных ACME-сервисов можно взять из скрипта acme.sh

Ок, делаем, на примере Let's Encrypt. Будем считать, что для внутренних интерфейсов прокси выделены адреса 10.0.1.34 и 10.0.1.35.

Перехват DNS

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

10.0.1.34 acme-v02.api.letsencrypt.org
10.0.1.35 acme-staging-v02.api.letsencrypt.org

Перехват внутренним DNS сервером сложнее, но зато сделать его надо один раз и работать он будет для всех серверов. Для этого на внутреннем DNS создаем зону api.letsencrypt.org, и заводим в ней нужные хосты, пример файла зоны для BIND:

;Перехват api.letsencrypt.org
; SOA
api.letsencrypt.org.   3600     IN     SOA     localhost.      root.localhost. (
                                                2022122900
                                                28800
                                                7200
                                                604800
                                                3600
                                                )
;основной сервер
acme-v02                3600     IN     A      10.0.1.34

;staging сервер
acme-staging-v02        3600     IN     A      10.0.1.35

Вне зависимости от способа, проверяем результат пингуя с внутреннего сервера по именам acme-v02.api.letsencrypt.org и acme-staging-v02.api.letsencrypt.org, пинги должны проходить на .34 и .35 адреса соответственно. Значит, перехват DNS удался.

Настройка Nginx

Обратите внимание, что эти директивы должны находиться в контексте main, в то время как все привычные файлы конфигурации виртуальных хостов в каталоге "из коробки" уже находятся в контексте http. Поэтому надо либо добавлять в основной файл конфигурации /etc/nginx/nginx.conf, либо в каталог либо в отдельный файл и в правильном месте ставить include.

stream {
    resolver 8.8.8.8; # А вот здесь нам нужен DNS, способный разрешать имена в Интернете

    server { # Проксируем 443 порт на .34 адресе и отправляем на основной сервер 
        listen 10.0.1.34:443;
        proxy_pass acme-v02.api.letsencrypt.org:443;
    }

    server { # Проксируем 443 порт на .35 адресе и отправляем на stageing сервер
        listen 10.0.1.35:443;
        proxy_pass acme-staging-v02.api.letsencrypt.org:443;
    }
}

Ну вот и все! Теперь и серверы внутренние доступа наружу не имеют и Let's Encrypt на них работает.

P.S. Дед мой, добрая ему память, частенько говорил: "Кабы не клин да мох, да и плотник бы сдох!". Так и хочется перелицевать на "Кабы не nginx, да ???, так и сисадмин бы ???". Но вот что подставить? Предлагайте! :-)

Комментарии (63)


  1. pavlyuts Автор
    29.12.2022 21:56

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


  1. inkvizitor68sl
    29.12.2022 18:53
    +2

    Или нам понадобится dns-плагин к certbot, одна штука.


    1. pavlyuts Автор
      29.12.2022 19:23

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


      1. dimsoft
        29.12.2022 21:17
        +1

        использую acme.sh пишу в соседнюю специальную зону которую держу на Cloudflare, на которую есть в основной одна не меняемая cname.

        dnsapi · acmesh-official/acme.sh Wiki · GitHub


      1. inkvizitor68sl
        29.12.2022 21:24
        +1

        Зачем людям с чем-то разбираться?

        https://pdnsmanager.org/documentation/letsencrypt/


        1. pavlyuts Автор
          29.12.2022 21:38

          Ну, мануал, который начинается с:

          sudo apt-get install openssl jq curl git
          

          Afterwards, change into the directory you want the tools located at and issue the following command:

          git clone --recurse-submodules https://github.com/loewexy/pdns-acme

          Ну, знаете, такое. На любителя. Я не любитель.

          Я предпочитаю сделать один раз так чтобы потом вот вообще не париться вообще ничем. Самое сложное при написании статьи было вспомнить где же точно вертится прокся ))))
          Ну а на любой машине - install certbot, certbot run/certonly -d xxxx, ВСЕ )))
          А, забыл еще systemctl enable --now certbot-renew.timer
          Ну или просто галочка в интерфейсе "использовать летсенкрипт", в прикладе оно сейчас на каждом шагу.


  1. HxShard
    29.12.2022 19:19
    +2

    На самом деле - нет, <…>

    А точно нет? https://crt.sh/?q=habr.com


    1. pavlyuts Автор
      29.12.2022 19:23

      Хм... Спасибо!
      Вы, конечно, тут правы.
      Наверное, следует сделать апдейт ибо это значимая информация.


    1. pavlyuts Автор
      29.12.2022 21:56

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


  1. aborouhin
    29.12.2022 20:59
    +2

    Split-DNS нормально работает только в "корпоративном концлагере", где все устройства тоже корпоративные, состоят в домене, с урезанными правами пользователей и пр. В схеме BYOD всё более популярный и кое-где уже зашитый по умолчанию DoH, да и просто разумное желание пользователя прописать DNS от Google или Cloudflare, сводят полезность такой конфигурации к нулю.

    У меня просто внешний (он же единственный) DNS отдаёт для внутренних серверов внутренние же адреса. А сертификаты через DNS-плагин к certbot обновляются, да.


    1. pavlyuts Автор
      29.12.2022 21:29

      Между "кговагым ынтырпрайзом" и живопыркой на троих есть еще примерно весь спектр разного размера инфраструктур -- как виртуальных, так и не очень. Поэтому широко обобщать я бы не стал.
      DNS-плагин это прекрасно, как и вайлкарды. Но парадокс в том, что в моей схеме все и всегда работает а) из коробки б) без бубна в) без кучи дополнительных условий.
      Включая весь спектр софта, в который АСМЕ вшито, и далеко не всегда там под капотом именно Certbot, а и когда он - возможность им управлять зачастую неочевидна.

      Я люблю простые решения, которые работают как калаш. С абсолютным минимумом условий и потенциальных нестыковок.

      )


      1. avelor
        29.12.2022 22:43

        Простой вариант как калаш - один балансировщик-реверпрокси (тот же нжиникс или хапрокси или и то, и то - тут по вкусу) с терминацией ссл и вайлдкардами для нужных обслуживаемых доменов…


        1. pavlyuts Автор
          29.12.2022 23:08

          Кхм... У меня такое ощущение, что Вы не прочитали написанное мною или прочитали там что-то то свое.
          Я вообще-то о внутренних ресурсах, предназначенных для внутренних пользователей (ну или пришедших через VPN, что одно и то же), и НЕ предназначенных для доступа из Интернета.


          1. avelor
            29.12.2022 23:35

            всё правильно, внутренние ресурсы, для внутренних пользователей.

            и один балансировщик. с терминацией ссл. смотрящий наружу (одной ногой условно для www.domain.name) и запрашивающий вайлдкард *.domain.name. обращения к внутренним сервисам - через этот балансировщик, по уже внутренней ноге. одна точка терминации, один сертбот.
            заодно внутренни сервисы принимают подключения только с одного внутреннего адреса (ну если делать ha - c нескольких) что упрощает фаерволенг и сегментирование сети.

            в целом для внутренних клиентов обращаться по внешнему адресу тоже допустимо, но без настройки маршрутизации между внешними и внутренними адресами (например с полноценной DMZ и своей AS) - оно будет ну такое, на балансировщике внутренних адресов не увидите.


            1. pavlyuts Автор
              30.12.2022 07:53

              Все правильно, но есть нюанс: оправдано начиная с некоторого масштаба. Создает дополнительную точку отказа, куда сведены все приложения.
              Немного повышает цену ошибки в том смысле что одно неверное движение - и вот все твои внутренние ресурсы немного опубликованы в Сеть.
              Но концептуально идея зареверсить все внутренние ресурсы - понятная и по- своему богатая )))


      1. aborouhin
        29.12.2022 23:37

        В части получения сертификатов всё работает безусловно. А вот в части Split-DNS... подключается к нашей внутренней сети пользователь со своим смартфоном, в котором system-wide зашито использование DNS over HTTPS - и получает "внешние" адреса вместо внутренних. Далее одно из трёх. Либо мы такое вообще запрещаем, и тогда мы таки уже "кровавый энтерпрайз". Либо у нас нормально настроен доступ по внешним адресам из внутренней сети тоже (и тогда зачем нам в DNS внутренние адреса вообще). Либо как я предлагаю, раздавать внутренние адреса с внешнего DNS (особенно учитывая, что внешние адреса отнюдь не у всех серверов могут быть вообще, зачем они, прости Господи, какому-нибудь принтеру).


        1. pavlyuts Автор
          30.12.2022 07:57

          Кстати!
          А что у нас за девайсы такие, которые возлагают болт на, допустим, профиль сети выданный им по DHCP и настойчиво используют DoH? Можно пару моделей? И что, это в принципе не лечится?
          Ну так-то в принципе желание производителей смартфонов иметь покупателя всеобъемлюще - оно понятно. Другой вопрос что почти наверняка они будут криво работать не только в корпоративных сетях, но и во многих других случаях.


          1. d-stream
            30.12.2022 08:50
            +2

            Почти все броузеры по дефолту пытаются так работать.


            1. pavlyuts Автор
              30.12.2022 10:06

              Мда?
              У меня весьма свежий Андроид и винда, с которой я использую последние версии Хром, Вивальди, иногда - Оперу. Все обновляется до свежака.

              Ни разу не сталкивался с ситуацией что где-то не работает DNS потому что вот оно хочет DoH и все.

              ЧЯДНТ?


              1. d-stream
                30.12.2022 18:43

                "я вот давеча медку поел и не зажужжал")

                Уж не знаю сами далёкие от техники юзеры понажимали или оно так было дефолтно или они согласились "сделать безопасно", но не единичные проблемы у людей были. Притом кому-то хватало в hosts прописать нужный адрес, кому-то отключать... Ну и в будущем думаю вектор направлен на безопасность по аналогии с https и таких ситуаций будет всё больше.

                Так что splitDNS будет иметь проблемы и в будущем их будет больше.


                1. pavlyuts Автор
                  31.12.2022 18:53

                  Это очень частные проблемы и по многим причинам поддержка старого доброго ДНС будет продолжаться еще долгие, долгие годы ;)
                  Вас не удивляет что сохранился SMTP, который старше уже очень многих читателей хабра? ;)
                  Потому что некоторые вещи очень живучи в силу своей простоты и отработанности.


                  1. d-stream
                    31.12.2022 20:50

                    https пришел на смену http очень даже быстро и очень принудительно, так что ещё пара-тройка лет...


                    1. pavlyuts Автор
                      01.01.2023 15:28

                      Искренне прошу прощения, минуснул коммент промазав мышой, а отменить это нельзя (((

                      Есть огромная разница, сравните сами: DNSsec вроде бы существует чудовищное количество времени, а с распространением у него - проблемы. Потому что он весьма и весьма сложен.

                      HTTPS на самом деле не отдельный протоков, а очень простая комбинация HTTP и SSL/TLS и связанных с ним базовых библиотек.
                      И "поперло" его тогда, когда была разрешена проблема "невидимости" имени http-сервера в момент SSL-хэндшейка и массово появилась поддержка SNI. Ну и дальше тот же самый Летсенкрипт и другие, кто давал сертификаты бесплатно, сделали для его распространение.

                      C DNS ситуация другая: использовать TLS не стали, потому что так-то запрос-ответ - это UDP и два пакета, у TLS один хендшейк в разы больше требует - соответственно большие проблемы могут быть с таймингом рекурсивных запросов и еще много с чем. Сделали DNS-sec, но он оказался немного сложен "для среднего админа".

                      Ваше мнение о том, что DoH прямо быстро-быстро сменит DNS, кмк, основано на том, что его поддерживают большие корпорации для массово обслуживаемых ими клиентов. Но, к сожалению, есть еще и весь остальной мир ;)


          1. aborouhin
            30.12.2022 14:07

            Любой Андроид, если на уровне девайса. Любой современный браузер, если на уровне браузера. В последнем случае оно ещё где-то и по умолчанию было, ЕМНИП, но и желание включить DoH вручную вполне объяснимо, если домашний или мобильный провайдер использует апстрим сервера НСДИ (а он-таки использует), выдающие вместо достоверных данных зацензурированное сами знаете что.


            1. pavlyuts Автор
              30.12.2022 15:34

              Дубль:
              У меня весьма свежий Андроид и винда, с которой я использую последние версии Хром, Вивальди, иногда - Оперу. Все обновляется до свежака.

              Ни разу не сталкивался с ситуацией что где-то не работает DNS потому что вот оно хочет DoH и все.

              ЧЯДНТ?


              1. aborouhin
                30.12.2022 15:36

                Наверное, путаете ситуацию "оно хочет только DoH и не умеет использовать обычный DNS, полученный по DHCP" и ситуацию "оно не использует обычный DNS, полученный по DHCP, если в настройках включить DoH". А право пользователя включить этот самый DoH я понимаю, чту и уважаю, точно так же, как и его право использовать удобный ему почтовый клиент по IMAP, а не веб-интерфейс (из ветки комментов выше :)


                1. pavlyuts Автор
                  30.12.2022 15:44

                  Права пользователя заканчиваются там, где начинаются его обязанности ;) Это вообще-то базовый жизненный принцип трудовой деятельности )))

                  Концепция BYD, в моему понимании, заключается не в том, что пользователь делает что хочет и как ему удобно, а в том, что его устройство адаптируется ТАКЖЕ и под инфру работодателя - в разумных, но необходимых пределах.

                  Поэтому если пользователь начинает ныть "ой, у меня ваш випиен конфликтует с тем, через который я инстаграмчики листаю, вы не должны уважать мои желания", - то он логично идет... в Инстаграмм )))

                  Ну а так-то любому человеку работать неудобно. От работы кони дохнут, усталость и все такое )))


                  1. aborouhin
                    30.12.2022 15:53

                    Поэтому если пользователь начинает ныть "ой, у меня ваш випиен конфликтует с тем, через который я инстаграмчики листаю, вы не должны уважать мои желания", - то он логично идет... в Инстаграмм )))

                    Мой корпоративный VPN (а в офисной сети и без VPN) просто позволяет и в Инстаграм ходить тоже :) Причём без ущерба хождению на российские сайты. Там вообще хитрая маршрутизация между 4 странами для минимизации ситуаций, когда хоть что-то не работает, поэтому пользователям нет смысла какими-то другими сервисами разной степени сомнительности пользоваться, что тоже позитивно сказывается на безопасности.


                    1. pavlyuts Автор
                      30.12.2022 17:11

                      Про инстаграм - это был пример ;)

                      Я так понимаю, что сам тезис возражений все же не вызывает? )))


                      1. aborouhin
                        30.12.2022 17:16

                        Сам тезис - вопрос уже слишком философский, и очень зависит от состава коллектива и специфики работы. Я предпочитаю от технических вопросов так далеко не отклоняться :)


                      1. pavlyuts Автор
                        30.12.2022 17:33

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


    1. avelor
      29.12.2022 22:40
      +1

      Отдавать наружу внутренние адреса чот ну такое. Мало того, что относительно публичны имена внутренних хостов, так ещё и ip их известны - а лучше отдавать наружу меньше инфы об инфраструктуре:)


      1. pavlyuts Автор
        29.12.2022 23:08

        Еще раз призываю прочитать и разобраться в сути ДО комментирования. Потому что никто наружу внутренние адреса не отдает и речь вообще про другое.


        1. avelor
          29.12.2022 23:28

          этот комментарий не вам:)


      1. aborouhin
        29.12.2022 23:40

        Есть такая мысль, но данный риск был сочтён минимальным. А решать проблему нормального доступа к внутренним сервисам с устройств с разными системными настройками DNS на уровне системы или браузера как-то надо было, в комменте выше по ветке расписал варианты, которые были.


        1. avelor
          30.12.2022 00:38
          +1

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

          Я как чувак, что ближе к кровавому тыртырпрайзу предпочитаю сплитднс при отсутствии возможности/желания работать с внешними адресами сервисов или реверс-прокси (подробнее про нюансы отож писал выше).


          1. aborouhin
            30.12.2022 00:49

            Ну в детали вдаваться не буду, но про риски такие думал, моделировал. Может, что-то и пропустил, конечно. Но всё, что принимает чувствительные данные, таки имеет те самые сертификаты, в отсутствие которых софт ничего никуда не отправляет и матерно ругается. Ну и специфика работы (наличие сотрудников, которых самих и их устройства ни разу в жизни в глаза не видишь) особо на сохранность пароля рассчитывать не позволяет в любом случае, классический стикер с паролем на крышке ноута куда больший, и не особо управляемый риск :) А вот доступ в VPN уже изрядно параноидален - логин/пароль через LDAP + индивидуальные сертификаты + OTP + мониторинг новых устройств, в общем, для достаточно мелкой конторы, насколько я себя успокаиваю, хватает :)


            1. avelor
              30.12.2022 01:28
              +1

              Подумайте над имплементацией в том или ином формате подхода zero trust security. Условно нам не важно, где комп - в локалке (в впн) или дома, мы одинаково защищаем сервисы. Оно хорошо ложится на byod-подход и в целом не особо затратно можно сделать без накручивания conditional access и client posture/profiling.

              Как вариант имплементации (не факт что подойдёт вам, чисто вариант концепта) сервисы вывешиваем на внешний адрес, но помимо аутентификации и авторизации через ldap крутим mfa, и проверяем наличие клиентского сертификата выданного внутренним СА. Сертификатом спасаемся от всяких zero-day, mfa - на случай если и учётка и серт утекут (например стырили ноут, а он нешифрован и пароль на рабочем столе). Можно использовать и совместно с впн, например mfa запрашивать только при внешнем подключении (тут понадобится опять же сплит/дмз, но по крайней мере часть сотрудников не будет страдать от mfa). Mfa хорошо крутить с sso вроде самл/oauth (в один сервис зашёл, в другие в период n часов влетаешь без запросов).


              1. aborouhin
                30.12.2022 02:07

                Оно всё прекрасно, но спотыкается о почту, которая в грубом приближении бывает или Exchange (у меня - нет, по разным причинам), или IMAP, к которому MFA и прочие прелести не прикручиваются от слова "совсем". Посему она и прячется за VPN (либо локальной сетью с WPA Entreprise), который является основным рубежом защиты.

                А поскольку почта диктует именно такую модель, то и остальное по тому же принципу.

                SAML / OAuth в планах есть, но это всё легко и ненапряжно поднимается с использованием Azure AD / Onelogin / Okta и прочих облачных сервисов, которые в один прекрасный момент стали не очень доступны к покупке без обходных путей, а рисковать использованием обходных путей, которые могут в любой момент отвалиться, не хотелось. А поднимать это полностью у себя задачка нетривиальная, начинал, отложил на потом :)


                1. avelor
                  30.12.2022 09:27

                  Да, оно красивое на бумажке, но требует осмысления, доработки и изменений. Тот же imap можно объявить легаси и похоронить в пользу вебинтерфейса условной зимбры. Или прикрутить к нему mtls (так же закрыть на серт клиентский)..

                  Если винда - с adfs тож не особо сложно. Больше проблем с сервисами, что или заводят для галочки поддержку, или начинают считать что это суперентерпрайзно и хотеть множество деняк:)


                  1. pavlyuts Автор
                    30.12.2022 10:02
                    +3

                    Простите, но "чтобы тебе с почтой только через веб-интерфейс работать" - звучит как проклятие ;)
                    Не надо трогать аймап, пожалуйста. Для почты ничего лучше не придумано и придумано в обозримом будущем не будет. Нравится нам это или нет.
                    Ну и не надо забывать что защита должна быть соразмерна угрозам, а кривую зависимости защищенности и удобства никто не отменял ;)

                    Классика же:

                    Сисадмин спросил Учителя:
                    – В статье написано, что любое усиление безопасности снижает лояльность работников. Это правда?

                    Инь Фу Во ответил:
                    – На самом деле усиление безопасности снижает удобство. Снижение удобства повышает усталость. Повышение усталости снижает добросовестность. А снижение добросовестности работников – это и есть то, чего следует избегать.

                    – Тогда что же такое лояльность? – спросил Сисадмин.

                    – "Лояльность", – усмехнулся Инь Фу Во, – это японцы выдумали, чтоб денег не платить.


                    1. aborouhin
                      30.12.2022 14:12
                      +2

                      Вот тут поддержу. Стараюсь не делать пользователям ничего, что мне самому было бы неудобно. А поменять свой Thunderbird с тремя десятками любовно отобранных расширений на веб-интерфейс - ну такое... В основном народ, конечно, так не заморачивается, но даже обычный десктопный Outlook на порядок удобнее любого веб-интерфейса.


                1. tuupic
                  31.12.2022 17:25

                  Для конкретно thunderbird можно сделать плагин(нужно зашивать конкретные домены туда) для авторизации через oauth в dovecot. А oauth уже через keycloak и прочие штуки с MFA, отрубив нативные IMAP способы. Минус, что оно только для thunderbird


                  1. pavlyuts Автор
                    31.12.2022 18:54

                    Ну и вообще - в гамаке на лыжах, все как мы любим )))))


                  1. aborouhin
                    31.12.2022 22:31

                    Даже если всех перевести на Thunderbird (чего не хотелось бы, ибо у непродвинутых пользователей будет больше вопросов, им привычный Outlook из коробки проще), остаётся доступ с мобильных устройств, который не менее важен. В итоге работающая более или менее везде почта с MFA - это практически без вариантов только Exchange.


  1. lehha
    29.12.2022 23:10
    +2

    Делайте проще через DNS-01 challenge и делегирование CNAME для домена на сторонний домен. Например, для внутреннего домена и всех поддоменов *.secret.ru сделать запись:
    _acme-challenge.secret.ru CNAME _acme-challenge.publicdomain.ru

    В записи _acme-challenge.publicdomain.ru сделать TXT со значением, который выдаст challenge.

    Всё это дело упаковывается в скрипт, которому дать права на управление txt-записями доменам publicdomain.ru

    В итоге у вас сертификат на все поддомены *.secret.ru, даже если к нему нет публичного доступа из вне (там конечно есть нюанс, что нужно будет указывать 2 домена при запросе сертификата: secret.ru и *.secret.ru, но wildcard поможет не светить все внутренности в логах crt.sh и подобных сканеров).

    https://www.eff.org/deeplinks/2018/02/technical-deep-dive-securing-automation-acme-dns-challenge-validation


    1. pavlyuts Автор
      29.12.2022 23:30

      Ну по поводу "попроще" - это смело сказано! Там слова "скрипт" и "делегирование туда-сюда" и "дать права" прямо вопят о простоте реализации )))

      Давайте сравним трудоемкость и, самое главное, вероятность ошибки для а) собрать всю схему и б) добавить еще одни сервер в) нигде ничего не поломать при изменениях

      Кстати, забавный факт: я написал эту статью после того, как у одних моих, партнеров вдруг не смог зайти на один из их внутренних серверов - сертификат протух, а без него не пущает вообще - ибо запрещено. Ну, потрещали с админом - а там как раз Ваша схема - получает вайлдкард сертификат и потом скриптами разгоняет его по всем серверам. Все работало-работало, а потом нолик за единичку завалился, сертификат скрипт недослал на другой сервер. Ну и упс.

      Это мы даже не говорим о примерно тыщще вариантов встройки ACME клиента в разный софт, где, конечно, можно и по Вашей схеме отработать, но обычно это требует отдельных танцев со специальными моделями бубнов ;)


      1. aborouhin
        29.12.2022 23:46

        Все работало-работало, а потом нолик за единичку завалился, сертификат скрипт недослал на другой сервер

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


        1. pavlyuts Автор
          30.12.2022 07:17

          Можно прозевать, да.

          Но давайте поговорим о вероятностях. Чем сложнее и навороченнее схема, чем больше в ней кастомных скриптов, шагов и звеньев - тем больше вероятность возникновения проблемы при малейшем изменении условий.
          Ну вот просто умозрительно, что имеет меньшую вероятность принести проблемы: тиражируемый софт, который запускается миллион раз в сутки по миру или самописный разлапистый скрипт, который даже протестировать толком на все возможные варианты раскладов нельзя - чисто по соображениям здравого смысла?

          Лично я считаю, что с точки зрения практической надежности любюе решение через конфигурирование серийных продуктов штатными средствами даст огромную фору самопису любого генеза )))


          1. aborouhin
            30.12.2022 14:09

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


            1. pavlyuts Автор
              30.12.2022 15:31

              Ну например в Проксмокс ты нажимаешь кнопку "получить сертификат". А, ну емейл надо указать.
              Дело в том, что помимо Цертбота сейчас куча всяких приложений "из коробки" поддерживает ACME, там просто опция включается и все.
              И да, кстати, чтобы тот же цертбот по моей схеме запустить с примерно 100% успехом - никаких редактирований конфига не требуется. Требуется 1(одна) команда на получение сертификата и 1(одна) на запуск таймера его обновления.
              Как бы все.

              Как альтернативу мне тут каждый первый предлагает набор скриптов. Кстати, надо будет спросить сколько примерно строк )))


      1. lehha
        29.12.2022 23:53

        В любом решении есть своя стоимость косяков)

        Мы запилили внешний сервис, которому делегировали эти записи. Сервис сам выпускает и продлевает сертификаты и кладет их в хранилище. Клиент при сборке/запуске контейнера просто забирает актуальный сертификат, хоть каждые 5 минут со 100 нод одновременно. Обычный lets encrypt забанит за частный перевыпуск сертификата если вы его случайно потеряете.


        1. pavlyuts Автор
          30.12.2022 07:25

          Вопрос в масштабе. И выборе в соразмерного подхода.

          Я прежде чем писать, почитал что понаписано в этих ваших энторнетах на эту тему. Была, в частности, шикарная статья про то, как раздавать Летсенктипт тысячами, сейчас не найду, но там смысл в динамическом одоменивании и так далее.

          И да, если тебе надо много, если у тебя это важная часть процесса, то "запилили сервис" - это логично и правильно.

          Но если у тебя еще примерно до пенсии не переделать разных других задач и надо раздать сертификаты на десяток-полтора хостов быстро, просто и надежно - то вот это как раз вариант, за час с нуля сделал и забыл про проблему навсегда )))

          Поэтому мы оба правы в подходах, если, конечно, вы соразмерно подходите )))


  1. LeKovr
    30.12.2022 07:59

    А нет ли у вас конкретики о том, почему не подошел вариант "для своей сети поднимем свой CA и к нему прикрутим свой аналог LE"?


    1. pavlyuts Автор
      30.12.2022 08:04

      Это имеет смысл для достаточно большой компании, с способной содержать продвинутых админов и держать юзверей в крепком стойле, потому что:

      • Требует существенно большей квалификации на установку и настройку

      • Требует раскатки своего корневого сертификата в системы пользователей, в противном случай как минимум броузеры будут материться на невалидный серт, в наихудшем - не будут давать открывать ресурс вообще. Это легко сделать через всякие там полиси, но весьма геморройно руками.

      Ну а у меня из серии "быстро, просто, доступно, не без недостатков, но за эти деньги...". Определенно это для НЕбольших компаний, и людей с НЕ слишком высокой квалификацией. Все максимально из-коробочно и прямолинейно.


  1. KillJ0y
    01.01.2023 13:10

    Я конечно все понимаю, но зачем такой оверхед?

    Я все сделал проще (для домашних серверов) есть vps, он получает wildcard *.mydomain.ru (при всем этом нам не обязательно в панели dns создавать поддомены на общее обозрение, внутренний dns справиться) и далее переправка безопасным туннелем на внутренний сервер, и с внутреннего сервера все это раскидывается по машинам и контейнерам. Профит. Валидные сертификаты в локалке, без своего уц которой все равно есть.


    1. pavlyuts Автор
      01.01.2023 15:08

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

      Нуууу ок. Рискну предположить, что скриптинг - Ваша сильная сторона, поэтому она и является для Вас простейшим путем. У меня, к сожалению, на такие вещи тупо нет времени.

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


      1. KillJ0y
        01.01.2023 15:17

        Bash родной язык - это да, и не только он.

        А городить конструкции с прокси сайтами докер контейнерами не оверхед? Круто конечно прийти на все готовое запустил контейнер пару строк поменял и все. Изначально было написано на bash был оверхед да. Нужно было ещё безопасное туннелирование делать для этого openvpn использовался. В текущей реализации написан софт он то и делает большую часть работы. Шифрует файлы, пихает в tls передает, расшифровывает, кидает по местам меняет права рестартует. Если нужно добавить сервер в цепочку нужно скомпилировать клиента с настройками что куда положить, что рестартануть и откуда взять. Импровизированный с&с сервер и клиенты


        1. KillJ0y
          01.01.2023 15:23

          Дополню для авторизации на с&с используются УЦ, а все остальное что пытается стучатся на порт сервиса просто дропается, в принципе идея взята у openvpn с tls-crypt, при сканировании порт так же невидим, Профит.


        1. pavlyuts Автор
          01.01.2023 15:33

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

          Я это писал для тех, у кого а) инфра довольно статична, а не буйство оркестрации б) ее сравнительно немного, а не многие десятки и сотни серверов в) у кого не так высока профильная квалификация и не так глубоко понимание ACME чтобы самому накатать решение.


          1. KillJ0y
            01.01.2023 15:59

            Я не спорю что данное решение это плохо, или ещё что то. Нет, как вы сказали у всех свои потребности и задачи.

            Например у меня дома две серверные железки обе на proxmox (включая Вирт для сборок). и резервная машина старый пк в качестве точки бекапа. + 2 vps разной мощности и задачи. Рабочих серверов 2+1. В итоге написал такой софт который решает проблемы с сертификатами, сделал его проприетарным для защиты в том числе. Ну и что бы на работе его потом не свиснули. Подписываю своим ключом от своего уц мне не напряжно держать на всех своих машинах свои корневые сертификаты, это же не от минцифры... а для рабочих машин подписываю их уц. В процессе версия 2, с большим фунционалом. Когда нибудь я напишу статьи об этом.


            1. pavlyuts Автор
              01.01.2023 16:07

              Ну, Вы начали про "слишком большой оверхед" )))

              Я, напомню, констатировал, что здесь все решение, которое работает (не без недостатков!) занимает примерно час-два на все про все, после чего про него забываем вообще - есть другие задачи ))) И что как раз "оверхед" для средней руки админа здесь совершенно минимальный.

              Вы рассказываете о своем подходе, реализация которого явно потребовала сотни человеко-часов. Который делает, конечно, все лучше и правильное ;)

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

              Собственно весь предмет дискуссии только в этом.


              1. KillJ0y
                01.01.2023 16:14

                Я не любитель использовать docker для чувствительной информации - это раз. Второе меньше чем за неделю была написана эта утилита изначально на с, в планах переписать на rust. И третье, ведь действительно если мало динамики контейнеры например сами не пересобираются, можно все было кинуть в bash скрипт и закинуть в cron (моя альфа версия так сказать), типо два скрипта сервер (где получаются сертификаты) и клиенты которые забирают сертификаты с сервера. Простым скриптом проверяем не истёк ли серт, если да то перевыпускаем, клиенты ходят на сервер по таймеру, видят что серт обновился забирают его раскидывают, а ночью рестарт сервисов.


              1. KillJ0y
                01.01.2023 16:16

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