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/ansible-role-openvpn