bwinfosec.openvpn
TODO: Обновите этот README, чтобы отразить изменения в форке bwinfosec.
OpenVPN
Github Actions (PR и основная ветка):
Travis CI (Фактический запуск OpenVPN):
Эта роль устанавливает OpenVPN, настраивает его как сервер, настраивает сетевые подключения и файрволы (в основном firewalld, ufw и iptables, если возможно), и может по желанию создавать клиентские сертификаты.
ОС в сборках CI:
- Fedora 32+
- CentOS 7 и 8
Примечание: Я предоставляю вам код в репозитории под открытой лицензией. Поскольку это мой личный репозиторий, лицензия на мой код предоставляется мной, а не моим работодателем.
Требования
OpenVPN должен быть доступен как пакет в yum/dnf/apt! Для пользователей CentOS, эта роль выполнит yum install epel-release, чтобы обеспечить доступность OpenVPN.
Ubuntu precise имеет странную ошибку, которая может привести к сбою установки iptables-persistent. Есть обходное решение.
Ansible 2.10 и выше
С выходом Ansible 2.10, модули были перемещены в коллекции. За исключением модулей ansible.builtin, это означает, что дополнительные коллекции должны быть установлены для использования таких модулей, как seboolean (теперь ansible.posix.seboolean). Теперь эта коллекция обязательна: ansible.posix, и эта коллекция требуется, если используется ufw: community.general. Установка коллекций:
ansible-galaxy collection install ansible.posix
ansible-galaxy collection install community.general
Замечания/Ожидания по поддержке
Я лично использую эту роль для управления OpenVPN на CentOS 8. Я стараюсь поддерживать работу роли на этой платформе с использованием конфигурации по умолчанию. Пожалуйста, имейте в виду, что я один человек, и у меня есть работа и другие обязанности.
Ответы на любые вопросы будут на основе лучших усилий с моей стороны, включая возможность, что я вообще не отвечу. Проблемы, возникающие из-за использования нестандартных конфигураций (включая любые крупные вкладки сообщества) будут приоритетными.
Основные вкладки сообщества:
- Функциональность для отзыва сертификатов
- Полная поддержка LDAP
Переменные роли
Опции роли
Эти опции изменяют работу роли. Это общая группа, конкретные группы указаны ниже.
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| clients | список | [] | Список клиентов, которых нужно добавить в OpenVPN | |
| openvpn_base_dir | строка | /etc/openvpn | Путь, где будет храниться ваша конфигурация OpenVPN | |
| openvpn_client_config_no_log | логическое | true, false | true | Запретить запись файлов конфигурации клиента в stdout Ansible |
| openvpn_key_dir | строка | /etc/openvpn/keys | Путь, где будут храниться ваши закрытые ключи сервера и CA | |
| openvpn_ovpn_dir | строка | /etc/openvpn | Путь, где будут храниться ваши конфигурации клиентов | |
| openvpn_revoke_these_certs | список | [] | Список клиентских сертификатов для отзыва. | |
| openvpn_selinux_module | строка | my-openvpn-server | Установить имя модуля SELinux | |
| openvpn_service_name | строка | openvpn | Имя службы. Используется systemctl для запуска службы | |
| openvpn_sync_certs | логическое | true, false | false | Отзыв сертификатов, не указанных явно в 'clients' |
| openvpn_uninstall | логическое | true, false | false | Установите на true, чтобы удалить службу OpenVPN |
| openvpn_use_ldap | логическое | true, false | false | Активный бэкэнд LDAP для аутентификации. Сертификат клиента больше не нужен |
Получение конфигурации
Измените эти опции, если нужно настроить, как конфигурации загружаются на вашу локальную систему
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| openvpn_fetch_client_configs | логическое | true, false | true | Скачать сгенерированные клиентские конфигурации на локальную систему |
| openvpn_fetch_client_configs_dir | строка | /tmp/ansible | Если openvpn_fetch_client_configs истинно, локальный каталог для загрузки файлов конфигурации клиента | |
| openvpn_fetch_client_configs_suffix | строка | "" | Если openvpn_fetch_client_configs истинно, суффикс, который будет добавлен к загруженным файлам конфигурации клиента перед завершающим расширением .ovpn |
Файрвол
Измените эти опции, если нужно применить определённый файрвол или изменить, как плейбук взаимодействует с файрволом.
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| firewalld_default_interface_zone | строка | public | Зона firewalld, куда будет перенаправлен "ansible_default_ipv4.interface" | |
| iptables_service | строка | iptables | Переопределить имя службы iptables | |
| manage_firewall_rules | логическое | true, false | true | Позволить плейбуку управлять iptables |
| openvpn_firewall | строка | auto, firewalld, ufw, iptables | auto | Программное обеспечение файрвола для настройки сетевых правил. "auto" попытается определить его, проверив систему |
| openvpn_masquerade_not_snat | логическое | true, false | false | Установите на true, если хотите настроить MASQUERADE вместо SNAT по умолчанию в iptables. |
Опции конфигурации OpenVPN
Эти опции изменяют работу самого OpenVPN.
Сетевое взаимодействие
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| openvpn_client_register_dns | логическое | true, false | true | Добавить опцию register-dns к конфигурации клиента (только Windows). |
| openvpn_client_to_client | логическое | true, false | false | Установите на true, если хотите, чтобы клиенты могли взаимодействовать друг с другом. |
| openvpn_custom_dns | список[string] | [] | Список DNS-серверов, применяется только если openvpn_set_dns установлен в true |
|
| openvpn_dualstack | логическое | true | Нужно ли использовать дуаусток (IPv4 + v6) | |
| openvpn_keepalive_ping | целое | 5 | Установите интервал пинга keepalive в секундах. |
|
| openvpn_keepalive_timeout | целое | 30 | Установите таймаут keepalive в секундах |
|
| openvpn_local | строка | unset |
Локальное имя хоста или IP-адрес для привязки. Если указано, OpenVPN будет привязываться только к этому адресу. Если не указано, OpenVPN будет привязываться ко всем интерфейсам. | |
| openvpn_port | целое | 1194 | Порт, на котором вы хотите запускать OpenVPN. Если у вас разные порты на разных серверах, я рекомендую установить порт в вашем инвентарном файле. | |
| openvpn_proto | строка | udp, tcp | udp | Протокол, который вы хотите использовать для OpenVPN |
| openvpn_redirect_gateway | логическое | true, false | true | Прокси-шлюз OpenVPN |
| openvpn_resolv_retry | целое/строка | любое целое, бесконечное | 5 | Время повторной попытки разрешения имен. Установите "бесконечное", чтобы повторять попытки бесконечно в случае плохого соединения или восстановления режима сна ноутбука и т.д. |
| openvpn_server_hostname | строка | {{ inventory_hostname }} |
Имя сервера, которое будет помещено в файл конфигурации клиента | |
| openvpn_server_ipv6_network | строка | unset |
Если установлено, адрес сети и префикс IPv6, который нужно присвоить клиентам. Если true, также будет использован IPv4. | |
| openvpn_server_netmask | строка | 255.255.255.0 | Маска подсети частной сети | |
| openvpn_server_network | строка | 10.9.0.0 | Частная сеть, используемая службой OpenVPN | |
| openvpn_set_dns | логическое | true, false | true | Будет передан DNS клиенту (Cloudflare и Google) |
| openvpn_tun_mtu | целое | unset |
Установите значение tun-mtu. Пусто для значения по умолчанию. |
Безопасность
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| openvpn_auth_alg | строка | SHA256 | Установите auth алгоритм аутентификации. |
|
| openvpn_ca_key | словарь | unset |
Содержит "crt" и "key". Если не установлено, сертификат CA и ключ будут автоматически сгенерированы на целевой системе. | |
| openvpn_cipher | строка | AES-256-CBC | Установите опцию cipher для сервера и клиента. |
|
| openvpn_crl_path | строка | unset |
Определите путь к файлу CRL для проверки отзыва сервера. | |
| openvpn_duplicate_cn | логическое | true, false | false | Добавьте опцию duplicate-cn к конфигурации сервера - это позволяет клиентам подключаться несколько раз с одним ключом. ПРИМЕЧАНИЕ: ip-адреса клиента больше не будут статическими! |
| openvpn_rsa_bits | целое | 2048 | Количество бит, используемых для защиты сгенерированных сертификатов | |
| openvpn_script_security | целое | 1 | Установите опцию безопасности скрипта openvpn | |
| openvpn_tls_auth_key | строка | unset |
Единый элемент с заранее сгенерированным ключом аутентификации TLS. | |
| openvpn_use_crl | логическое | true, false | false | Настройте сервер OpenVPN, чтобы учитывать список отзыва сертификатов. |
| openvpn_use_hardened_tls | логическое | true, false | true | Требовать минимальную версию TLS 1.2 |
| openvpn_use_modern_tls | логическое | true, false | true | Использовать современный шифр для шифрования TLS (не рекомендуется с OpenVPN 2.4) |
| openvpn_use_pregenerated_dh_params | логическое | true, false | false | Параметры DH генерируются при установке по умолчанию |
| openvpn_verify_cn | логическое | true, false | false | Проверить, чтобы CN сертификата соответствовал FQDN |
| tls_auth_required | логическое | true, false | true | Попросите клиента отправить сгенерированный ta.key сервера во время подключения |
Операции
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| openvpn_addl_client_options | список | пусто | Список пользовательских параметров клиента, которые уже не присутствуют в шаблоне клиента. (например, - mssfix 1400) |
|
| openvpn_addl_server_options | список | пусто | Список пользовательских параметров сервера, которые уже не присутствуют в шаблоне сервера. (например, - ping-timer-rem) |
|
| openvpn_compression | строка | lzo | Установите опцию compress. Пусто для отключения сжатия. |
|
| openvpn_config_file | строка | openvpn_{{ openvpn_proto }}_{{ openvpn_port }} | Имя конфигурационного файла, который вы хотите использовать (установите в vars/main.yml) | |
| openvpn_enable_management | логическое | true, false | false | |
| openvpn_ifconfig_pool_persist_file | строка | ipp.txt | ||
| openvpn_management_bind | строка | /var/run/openvpn/management unix | Интерфейс для связывания с интерфейсом управления. Может быть unix или TCP сокетом. | |
| openvpn_management_client_user | строка | root | Используйте этого пользователя при использовании unix-сокета для интерфейса управления. | |
| openvpn_push | список | пусто | Установите здесь список строк, который будет вставлен в файл конфигурации как push "". Например, - route 10.20.30.0 255.255.255.0 создаст push "route 10.20.30.0 255.255.255.0" |
|
| openvpn_script_client_connect | строка | unset |
Путь к вашему скрипту подключения клиента openvpn | |
| openvpn_script_client_disconnect | строка | unset |
Путь к вашему скрипту отключения клиента openvpn | |
| openvpn_script_down | строка | unset |
Путь к вашему скрипту down openvpn | |
| openvpn_script_up | строка | unset |
Путь к вашему скрипту up openvpn | |
| openvpn_service_group | строка | nogroup | Установите группу службы openvpn. | |
| openvpn_service_user | строка | nobody | Установите пользователя службы openvpn. | |
| openvpn_status_version | целое | 1, 2, 3 | 1 | Определите форматирование файла openvpn-status.log, в котором перечислены текущие соединения клиентов |
| openvpn_topology | строка | unset |
Ключевое слово "topology" будет установлено в конфигурации сервера с заданным значением. |
Пользовательская конфигурация клиента OpenVPN (с сервера)
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| openvpn_client_config | логическое | false | Установите на true, если необходимо включить каталог конфигураций клиента | |
| openvpn_client_config_dir | строка | ccd | Путь к client-config-dir |
|
| openvpn_client_configs | словарь | {} | Словарь настроек пользовательских конфигураций клиентов |
Logrotate
Установите свои собственные пользовательские параметры logrotate
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| openvpn_log_dir | строка | /var/log | Установите местоположение файлов журналов openvpn. Этот параметр является частью значения конфигурации log-append. |
|
| openvpn_log_file | строка | openvpn.log | Установите имя файла журнала. Этот параметр является частью значения конфигурации log-append. |
|
| openvpn_logrotate_config | строка | rotate 4 weekly missingok notifempty sharedscripts copytruncate delaycompress |
Настройка скрипта logrotate. |
Упаковка
Эта роль включает множество различных пакетов. Переопределите имена по мере необходимости.
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| epel_package_name | строка | epel-release | Название пакета epel-release для установки из менеджера пакетов | |
| iptables_persistent_package_name | строка | iptables-persistent | Название пакета iptables-persistent для установки из менеджера пакетов | |
| iptables_services_package_name | строка | iptables-services | Название пакета iptables-services для установки из менеджера пакетов | |
| openssl_package_name | строка | openssl | Название пакета openssl для установки из менеджера пакетов | |
| openvpn_ldap_plugin_package_name | строка | openvpn-auth-ldap | Название пакета openvpn-auth-ldap для установки из менеджера пакетов | |
| openvpn_package_name | строка | openvpn | Название пакета openvpn для установки из менеджера пакетов | |
| python_firewall_package_name | строка | python-firewall | Название пакета python-firewall для установки из менеджера пакетов |
LDAP объект
| Переменная | Тип | Варианты | По умолчанию | Комментарий |
|---|---|---|---|---|
| ldap | словарь | Словарь, который содержит настройки LDAP | ||
| url | строка | ldap://host.example.com | Адрес вашего LDAP бэкенда с синтаксисом ldap[s]://host[:port] | |
| anonymous_bind | строка | False, True | False | Это не логическое значение Ansible, а строка, которая будет отправлена в конфигурационный файл. |
| bind_dn | строка | uid=Manager,ou=People,dc=example,dc=com | Связанный DN, используемый, если "anonymous_bind" установлен в "False" | |
| bind_password | строка | mysecretpassword | Пароль пользователя bind_dn | |
| tls_enable | строка | true, no | no | Принудительное использование шифрования TLS. Не обязательно с адресами ldaps |
| tls_ca_cert_file | строка | /etc/openvpn/auth/ca.pem | Путь к CA ldap бэкенду. Это должно быть передано ранее | |
| tls_cert_file | строка | Путь к сертификату аутентификации клиента | ||
| tls_key_file | строка | Путь к ключу аутентификации клиента | ||
| base_dn | строка | ou=People,dc=example,dc=com | Основной DN, где бэкенд будет искать действующих пользователей | |
| search_filter | строка | (&(uid=%u)(accountStatus=active)) | Фильтр ldap-поиска | |
| require_group | строка | False, True | Это не логическое значение Ansible, а строка, которая будет отправлена в конфигурационный файл. | |
| group_base_dn | строка | ou=Groups,dc=example,dc=com | Конкретизируйте группу, которую необходимо искать. Требуется, если require_group установлен в "True". | |
| group_search_filter | строка | ((cn=developers)(cn=artists)) | Уточните допустимые группы | |
| verify_client_cert | строка | none, optional, require | client-cert-not-required | В OpenVPN 2.4+ client-cert-not-required устарело. Используйте вместо этого verify-client-cert. |
Зависимости
Не зависит от других ролей
Пример плейбука
- hosts: vpn
gather_facts: true
roles:
- role: kyl191.openvpn
openvpn_port: 4300
openvpn_sync_certs: true
clients:
- client1
- client2
Примечание: Так как роли потребуется знать используемую платформу (32 или 64 бита), вы должны установить
gather_factsвtrueв вашем плейбуке.
Лицензия
MIT
Информация об авторе
Написано Кайл Лексмонд
ansible-galaxy install bwinfosec.openvpn