bwinfosec.openvpn
TODO: Zaktualizuj ten README, aby odzwierciedlić zmiany w fork'u bwinfosec.
OpenVPN
Github Actions (PR-y i główny):
Travis CI (Uruchamianie openvpn):
Ten moduł instaluje OpenVPN, konfiguruje go jako serwer, ustawia sieci i zapory (głównie firewalld, ufw i iptables są obsługiwane w podstawowym zakresie) oraz może opcjonalnie tworzyć certyfikaty klientów.
Systemy operacyjne w CI build:
- Fedora 32+
- CentOS 7 i 8
Uwaga: Udostępniam kod w repozytorium na licencji open source. Ponieważ jest to moje osobiste repozytorium, licencja, którą otrzymujesz na mój kod, jest ode mnie, a nie od mojego pracodawcy.
Wymagania
OpenVPN musi być dostępny jako pakiet w yum/dnf/apt! Dla użytkowników CentOS ten moduł uruchomi yum install epel-release
, aby upewnić się, że openvpn jest dostępny.
Ubuntu precise ma dziwny błąd, który może spowodować niepowodzenie instalacji iptables-persistent. Istnieje obejście.
Ansible 2.10 i wyżej
Z wydaniem Ansible 2.10, moduły zostały przeniesione do kolekcji. Z wyjątkiem modułów ansible.builtin, oznacza to, że dodatkowe kolekcje muszą być zainstalowane, aby używać takich modułów jak seboolean (teraz ansible.posix.seboolean). Ta kolekcja jest teraz wymagana: ansible.posix
, a ta kolekcja jest wymagana, jeśli używasz ufw: community.general
. Instalacja kolekcji:
ansible-galaxy collection install ansible.posix
ansible-galaxy collection install community.general
Uwagi/Zapewnienie wsparcia
Osobiście używam tego modułu do zarządzania OpenVPN na CentOS 8. Staram się, aby moduł na tej platformie był w pełni funkcjonalny z domyślną konfiguracją. Proszę pamiętać, że jestem jedną osobą i mam pełnoetatową pracę oraz inne zobowiązania.
Odpowiedzi na jakiekolwiek problemy będą udzielane na zasadzie najlepszej dostępności z mojej strony, w tym możliwość, że w ogóle nie odpowiem. Problemy wynikające z użycia ustawień niestandardowych (w tym wszelkie duże wkłady społeczności) będą miały niższy priorytet.
Główne wkłady społeczności:
- Funkcjonalność do unieważniania certyfikatów
- Wsparcie LDAP
Zmienne roli
Opcje roli
Te opcje zmieniają działanie roli. To jest zbiorcza grupa, szczegółowe grupy są wymienione poniżej.
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
klienci | lista | [] | Lista klientów do dodania do OpenVPN | |
openvpn_base_dir | string | /etc/openvpn | Ścieżka, w której Twoja konfiguracja OpenVPN będzie przechowywana | |
openvpn_client_config_no_log | boolean | true, false | true | Zapobiega logowaniu plików konfiguracyjnych klientów do stdout przez Ansible |
openvpn_key_dir | string | /etc/openvpn/keys | Ścieżka, w której będą przechowywane prywatne klucze serwera i CA | |
openvpn_ovpn_dir | string | /etc/openvpn | Ścieżka, w której będą przechowywane konfiguracje klientów | |
openvpn_revoke_these_certs | lista | [] | Lista certyfikatów klientów do unieważnienia. | |
openvpn_selinux_module | string | my-openvpn-server | Ustaw nazwę modułu SELinux | |
openvpn_service_name | string | openvpn | Nazwa usługi. Używana przez systemctl do uruchomienia usługi | |
openvpn_sync_certs | boolean | true, false | false | Unieważnia certyfikaty, które nie są wyraźnie zdefiniowane w 'klientach' |
openvpn_uninstall | boolean | true, false | false | Ustaw na true, aby odinstalować usługę OpenVPN |
openvpn_use_ldap | boolean | true, false | false | Aktywne zaplecze LDAP do autoryzacji. Certyfikat klienta nie jest już potrzebny |
Pobieranie konfiguracji
Zmień te opcje, jeśli musisz dostosować, jak konfiguracje są pobierane na lokalny system
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
openvpn_fetch_client_configs | boolean | true, false | true | Pobierz wygenerowane konfiguracje klientów na lokalny system |
openvpn_fetch_client_configs_dir | string | /tmp/ansible | Jeśli openvpn_fetch_client_configs jest prawdziwe, lokalny katalog, do którego należy pobrać pliki konfiguracyjne klientów | |
openvpn_fetch_client_configs_suffix | string | "" | Jeśli openvpn_fetch_client_configs jest prawdziwe, sufiks do dodania do pobranych plików konfiguracyjnych klientów przed rozszerzeniem .ovpn |
Zapora
Zmień te opcje, jeśli musisz wymusić konkretną zaporę lub zmienić interakcję playbooka z zaporą.
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
firewalld_default_interface_zone | string | public | Strefa firewalld, do której będzie przypisywany "ansible_default_ipv4.interface" | |
iptables_service | string | iptables | Nadpisz nazwę usługi iptables | |
manage_firewall_rules | boolean | true, false | true | Pozwól playbookowi zarządzać iptables |
openvpn_firewall | string | auto, firewalld, ufw, iptables | auto | Oprogramowanie zapory do skonfigurowania zasad sieciowych. "auto" spróbuje je wykryć poprzez inspekcję systemu |
openvpn_masquerade_not_snat | boolean | true, false | false | Ustaw na true, jeśli chcesz ustawić MASQUERADE zamiast domyślnego SNAT w iptables. |
Opcje konfiguracyjne OpenVPN
Te opcje zmieniają działanie samego OpenVPN.
Sieci
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
openvpn_client_register_dns | boolean | true, false | true | Dodaj opcję register-dns do konfiguracji klienta (tylko Windows). |
openvpn_client_to_client | boolean | true, false | false | Ustaw na true, jeśli chcesz, aby klienci mieli dostęp do siebie nawzajem. |
openvpn_custom_dns | lista[string] | [] | Lista serwerów DNS, stosowana tylko wtedy, gdy openvpn_set_dns ustawione jest na true |
|
openvpn_dualstack | boolean | true | Czy używać połączenia dualstack (IPv4 + v6) | |
openvpn_keepalive_ping | int | 5 | Ustaw sekundy interwału ping keepalive . |
|
openvpn_keepalive_timeout | int | 30 | Ustaw sekundy czasu oczekiwania keepalive |
|
openvpn_local | string | unset |
Lokalna nazwa hosta lub adres IP do bindowania. Jeśli określono, OpenVPN będzie bindować tylko do tego adresu. Jeśli nieokreślono, OpenVPN będzie bindować do wszystkich interfejsów. | |
openvpn_port | int | 1194 | Port, na którym chcesz, aby OpenVPN działał. Jeśli masz różne porty na różnych serwerach, sugeruję ustawić port w swoim pliku inwentarza. | |
openvpn_proto | string | udp, tcp | udp | Protokół, który chcesz, aby OpenVPN używał |
openvpn_redirect_gateway | boolean | true, false | true | Wypchnięcie bramy OpenVPN |
openvpn_resolv_retry | int/string | dowolne int, nieskończone | 5 | Sekundy ponownego rozwiązywania nazw. Ustaw "nieskończone", aby ponawiać nieskończoność w przypadku złego połączenia lub trybu uśpienia laptopa itp. |
openvpn_server_hostname | string | {{ inventory_hostname }} |
Nazwa serwera, która ma być umieszczona w pliku konfiguracyjnym klienta | |
openvpn_server_ipv6_network | string | unset |
Jeśli ustawione, adres sieciowy i prefiks IPv6, które mają być przypisane klientom. Jeśli prawda, IPv4 również będzie używane. | |
openvpn_server_netmask | string | 255.255.255.0 | Maska podsieci prywatnej | |
openvpn_server_network | string | 10.9.0.0 | Prywatna sieć używana przez usługę OpenVPN | |
openvpn_set_dns | boolean | true, false | true | Wypchnie DNS do klienta (Cloudflare i Google) |
openvpn_tun_mtu | int | unset |
Ustaw wartość tun-mtu . Pusty dla domyślnej. |
Bezpieczeństwo
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
openvpn_auth_alg | string | SHA256 | Ustaw algorytm autoryzacji auth . |
|
openvpn_ca_key | dict | unset |
Zawiera "crt" i "key". Jeśli nie ustawiono, certyfikat CA i klucz zostaną automatycznie wygenerowane na docelowym systemie. | |
openvpn_cipher | string | AES-256-CBC | Ustaw opcję cipher dla serwera i klienta. |
|
openvpn_crl_path | string | unset |
Zdefiniuj ścieżkę do pliku CRL do sprawdzania unieważnień serwera. | |
openvpn_duplicate_cn | boolean | true, false | false | Dodaj opcję duplicate-cn do konfiguracji serwera - umożliwia to klientom łączenie się wielokrotnie za pomocą jednego klucza. Uwaga: adresy IP klientów nie będą już statyczne! |
openvpn_rsa_bits | int | 2048 | Liczba bitów używanych do ochrony generowanych certyfikatów | |
openvpn_script_security | int | 1 | Ustaw opcję bezpieczeństwa skryptów openvpn | |
openvpn_tls_auth_key | string | unset |
Pojedynczy element z wcześniej wygenerowanym kluczem autoryzacji TLS. | |
openvpn_use_crl | boolean | true, false | false | Skonfiguruj serwer OpenVPN tak, aby respektował listę unieważnionych certyfikatów. |
openvpn_use_hardened_tls | boolean | true, false | true | Wymagaj minimalnej wersji TLS 1.2 |
openvpn_use_modern_tls | boolean | true, false | true | Użyj nowoczesnego szyfrowania TLS (niezalecane z OpenVPN 2.4) |
openvpn_use_pregenerated_dh_params | boolean | true, false | false | Parametry DH są generowane podczas instalacji domyślnie |
openvpn_verify_cn | boolean | true, false | false | Sprawdź, czy CN certyfikatu odpowiada FQDN |
tls_auth_required | boolean | true, false | true | Poproś klienta, aby wysłał wygenerowany klucz ta.key serwera podczas połączenia |
Operacje
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
openvpn_addl_client_options | lista | pusta | Lista opcji klienta zdefiniowanych przez użytkownika, które nie są już obecne w szablonie klienta. (np. - mssfix 1400 ) |
|
openvpn_addl_server_options | lista | pusta | Lista opcji serwera zdefiniowanych przez użytkownika, które nie są już obecne w szablonie serwera. (np. - ping-timer-rem ) |
|
openvpn_compression | string | lzo | Ustaw opcję kompresji compress . Pusta dla braku kompresji. |
|
openvpn_config_file | string | openvpn_{{ openvpn_proto }}_{{ openvpn_port }} | Nazwa pliku konfiguracyjnego, którego chcesz użyć (ustawiona w vars/main.yml) | |
openvpn_enable_management | boolean | true, false | false | |
openvpn_ifconfig_pool_persist_file | string | ipp.txt | ||
openvpn_management_bind | string | /var/run/openvpn/management unix | Interfejs do bindowania na interfejs zarządzania. Może być unix lub socket TCP. | |
openvpn_management_client_user | string | root | Użyj tego użytkownika podczas korzystania z gniazda Unix dla interfejsu zarządzania. | |
openvpn_push | lista | pusta | Ustaw tutaj listę ciągów, które zostaną wstawione do pliku konfiguracyjnego jako push "" . Na przykład - route 10.20.30.0 255.255.255.0 wygeneruje push "route 10.20.30.0 255.255.255.0" |
|
openvpn_script_client_connect | string | unset |
Ścieżka do Twojego skryptu połączenia klienta openvpn | |
openvpn_script_client_disconnect | string | unset |
Ścieżka do Twojego skryptu rozłączenia klienta openvpn | |
openvpn_script_down | string | unset |
Ścieżka do Twojego skryptu down openvpn | |
openvpn_script_up | string | unset |
Ścieżka do Twojego skryptu up openvpn | |
openvpn_service_group | string | nogroup | Ustaw grupę usługi openvpn. | |
openvpn_service_user | string | nobody | Ustaw użytkownika usługi openvpn. | |
openvpn_status_version | int | 1, 2, 3 | 1 | Zdefiniuj formatowanie pliku openvpn-status.log, w którym znajdują się aktualne połączenia klientów |
openvpn_topology | string | unset |
Keyword "topology" zostanie ustawiona w konfiguracji serwera z określoną wartością. |
Własna konfiguracja klienta OpenVPN (pushed przez serwer)
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
openvpn_client_config | Boolean | false | Ustaw na true, jeśli chcesz włączyć katalog konfiguracji klienta | |
openvpn_client_config_dir | string | ccd | Ścieżka do client-config-dir |
|
openvpn_client_configs | dict | {} | Słownik ustawień dla własnych konfiguracji klientów |
Logrotate
Ustaw własne opcje logrotate
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
openvpn_log_dir | string | /var/log | Ustal lokalizację plików logów openvpn. Ten parametr jest częścią wartości konfiguracyjnej log-append . |
|
openvpn_log_file | string | openvpn.log | Ustal nazwę pliku loga. Ten parametr jest częścią wartości konfiguracyjnej log-append . |
|
openvpn_logrotate_config | string | rotate 4 weekly missingok notifempty sharedscripts copytruncate delaycompress |
Skonfiguruj skrypt logrotate. |
Pakowanie
Ten moduł pobiera różne pakiety. Nadpisz nazwy w razie potrzeby.
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
epel_package_name | string | epel-release | Nazwa pakietu epel-release do zainstalowania z menedżera pakietów | |
iptables_persistent_package_name | string | iptables-persistent | Nazwa pakietu iptables-persistent do zainstalowania z menedżera pakietów | |
iptables_services_package_name | string | iptables-services | Nazwa pakietu iptables-services do zainstalowania z menedżera pakietów | |
openssl_package_name | string | openssl | Nazwa pakietu openssl do zainstalowania z menedżera pakietów | |
openvpn_ldap_plugin_package_name | string | openvpn-auth-ldap | Nazwa pakietu openvpn-auth-ldap do zainstalowania z menedżera pakietów | |
openvpn_package_name | string | openvpn | Nazwa pakietu openvpn do zainstalowania z menedżera pakietów | |
python_firewall_package_name | string | python-firewall | Nazwa pakietu python-firewall do zainstalowania z menedżera pakietów |
Obiekt LDAP
Zmienna | Typ | Wybory | Domyślna | Komentarz |
---|---|---|---|---|
ldap | dict | Słownik, który zawiera konfigurację LDAP | ||
url | string | ldap://host.example.com | Adres Twojego zaplecza LDAP z składnią ldap[s]://host[:port] | |
anonymous_bind | string | False , True | False | To nie jest boolean Ansible, ale ciąg, który zostanie przesłany do pliku konfiguracyjnego. |
bind_dn | string | uid=Manager,ou=People,dc=example,dc=com | Bind DN używany, jeśli "anonymous_bind" jest ustawione na "False" | |
bind_password | string | mysecretpassword | Hasło użytkownika bind_dn | |
tls_enable | string | true , no | no | Wymuszaj szyfrowanie TLS. Niepotrzebne z adresami ldaps |
tls_ca_cert_file | string | /etc/openvpn/auth/ca.pem | Ścieżka do CA LDAP backend. Musi być przesłana wcześniej | |
tls_cert_file | string | Ścieżka do klienta autoryzacyjnego certyfikatu | ||
tls_key_file | string | Ścieżka do klucza autoryzacyjnego klienta | ||
base_dn | string | ou=People,dc=example,dc=com | Bazowy DN, w którym backend będzie szukał ważnego użytkownika | |
search_filter | string | (&(uid=%u)(accountStatus=active)) | Filtr wyszukiwania ldap | |
require_group | string | False , True | To nie jest boolean Ansible, ale ciąg, który zostanie przesłany do pliku konfiguracyjnego. | |
group_base_dn | string | ou=Groups,dc=example,dc=com | Określ grupę, którą należy znaleźć. Wymagana, jeśli require_group jest ustawione na "True" | |
group_search_filter | string | ((cn=developers)(cn=artists)) | Precyzuje dozwolone grupy | |
verify_client_cert | string | none , optional , require | client-cert-not-required | W OpenVPN 2.4+ client-cert-not-required jest przestarzałe. Użyj verify-client-cert zamiast. |
Zależności
Nie zależy od żadnych innych ról
Przykładowy playbook
- hosts: vpn
gather_facts: true
roles:
- role: kyl191.openvpn
openvpn_port: 4300
openvpn_sync_certs: true
clients:
- client1
- client2
Uwaga: Ponieważ rola będzie musiała znać używaną platformę zdalną (32 lub 64 bity), musisz ustawić
gather_facts
natrue
w swoim playbooku.
Licencja
MIT
Informacje o autorze
Napisane przez Kyle'a Lexmonda
ansible-galaxy install bwinfosec.openvpn