Доступ к приватным ресурсам

13 августа 2019

Доступ к приватным ресурсам из Ansible playbooks

Дано:

  • сервисы разработки (gitlab и т.д.) изолированы от внешнего мира;
  • серверы production находятся во внешнем мире и не имеют доступа в gitlab;
  • в задаче Ansible необходимо клонировать проект из gitlab на production-сервер;
  • задача запускается с компьютера, имеющего к сервисам разработки полный доступ.

Решение:

  • в качестве транспорта по умолчанию в Ansible используется OpenSSH;
  • в состав OpenSSH входит прокси-сервер Socks5, запускаемый на локальной либо удалённой стороне (ключами “-D” и “-R” соответственно, с номером TCP-порта);
  • большинство утилит в Linux/Unix умеет использовать прокси, и читает его адрес из переменных окружения;
  • Ansible поддерживает настройку переменных окружения для ролей, playbooks, блоков и отдельных задач с помощью раздела “environment”.

В inventory/hosts добавляем запуск socks5-прокси на стороне сервера prod.host.name при подключении Ansible к нему:

prod.host.name  ansible_ssh_extra_args="-R 1080"

В tasks/main.yml указываем git-клиенту через переменную окружения — обращаться к серверу через прокси:

- name: clone repo from private git
  git:
     repo: https://gitlab+deploy-token-1:VerySecretPassphrase@git.private.lan/aa/aa.git
     dest: /opt/aa
     depth: 1
  environment:
     https_proxy: "socks5://localhost:1080"

При каких условиях такое решение не применимо?

  • Ansible-модуль или Linux-утилита не умеет работать через socks-прокси
  • ..или не умеет читать его адрес из переменной окружения.

В этом случае можно использовать более примитивный TCP-прокси:

  • в дополнение к номеру локального порта для “-R” указывается адрес и порт целевого сервера, например,
    “-R 1022:git.private.lan:22”;
  • обращение из модуля или утилиты делается на локальный порт:
- name: clone repo from private git
  git:
     repo: git+ssh://git@127.0.0.1:1022/aa/aa.git
     dest: /opt/aa
     depth: 1

Недостатки TCP-прокси:

  • в большинстве случаев перенаправление http/https не заработает, т.к. в HTTP-запросе сервер будет получать в качестве имени сайта “127.0.0.1”;
  • если необходим доступ к нескольким сервисам, для каждого из них потребуется отдельный порт/прокси.

Преимущество TCP-прокси:

если через socks5 злонамеренные процессы могут обращаться к абсолютно любым ресурсам, доступным с вызывающего компьютера, то через TCP-прокси — только к явно перечисленным, что является более безопасным.

Как использовать прокси без Ansible?

  • добавляйте ключ “-R” в командную строку ssh для однократного использования или директиву “RemoteForward” в файл ~/.ssh/config для постоянного:
  • Host prod.host.name
        RemoteForward 1080
        RemoteForward 1022:git.private.lan:22
    
  • это позволит открывать удалённому серверу временный доступ к внутренним сервисам в те моменты, когда вы подключаетесь к нему по ssh, и автоматически закрывать его при отключении.


← Назад в Блог

Подпишитесь на новые статьи: