bwinfosec.openvpn
TODO: このREADMEをbwinfosecフォークの変更を反映するように更新します。
OpenVPN
Github Actions(PRとメインライン):
このロールはOpenVPNをインストールし、サーバーとして設定し、ネットワーキングとファイアウォール(主にfirewalld、ufw、iptablesを最善を尽くして)を構成し、オプションでクライアント証明書を作成します。
CIビルドでのOS:
- 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で、ufwを使用する場合はcommunity.generalが必要です。コレクションのインストール:
ansible-galaxy collection install ansible.posix
ansible-galaxy collection install community.general
サポートノート/期待事項
私は個人的にこのロールをCentOS 8のOpenVPN管理に使用しています。私はそのプラットフォームで常にデフォルト設定で機能するように努めています。私は一人であり、フルタイムの仕事やその他の commitments がありますので、その点を理解してください。
問題へのレスポンスは最善を尽くす形になりますが、全く反応しない可能性もあります。非デフォルト(コミュニティの主要な貢献を含む)の使用から生じる問題は優先度が下がります。
主要なコミュニティの貢献:
- 証明書を取り消す機能
- 全てのLDAPサポート
ロール変数
ロールオプション
これらのオプションはロールの動作方法を変更します。これは包括的なグループであり、具体的なグループは下に分けられています。
| 変数 | タイプ | 選択肢 | デフォルト | コメント |
|---|---|---|---|---|
| clients | リスト | [] | OpenVPNに追加するクライアントのリスト | |
| openvpn_base_dir | 文字列 | /etc/openvpn | OpenVPN設定が保存されるパス | |
| openvpn_client_config_no_log | 真偽値 | true, false | true | クライアント設定ファイルをAnsibleによってstdoutにログとして記録しないようにする |
| 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 | OpenVPNサービスをアンインストールするにはtrueに設定 |
| 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がtrueの場合、クライアント設定ファイルをダウンロードするローカルディレクトリ | |
| openvpn_fetch_client_configs_suffix | 文字列 | "" | openvpn_fetch_client_configsがtrueの場合、ダウンロードしたクライアント設定ファイルに追加される接尾辞 |
ファイアウォール
特定のファイアウォールを強制的に設定する必要がある場合や、プレイブックがファイアウォールとどのように対話するかを変更する必要がある場合は、これらのオプションを変更します。
| 変数 | タイプ | 選択肢 | デフォルト | コメント |
|---|---|---|---|---|
| firewalld_default_interface_zone | 文字列 | public | "ansible_default_ipv4.interface"がプッシュされるfirewalldゾーン | |
| 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 | iptablesでデフォルトのSNATの代わりにMASQUERADEを設定する場合はtrueに設定。 |
OpenVPN設定オプション
これらのオプションはOpenVPN自体の動作方法を変更します。
ネットワーキング
| 変数 | タイプ | 選択肢 | デフォルト | コメント |
|---|---|---|---|---|
| openvpn_client_register_dns | 真偽値 | true, false | true | クライアント設定にregister-dnsオプションを追加(Windowsのみ)。 |
| openvpn_client_to_client | 真偽値 | true, false | false | クライアント間のアクセスを許可する場合はtrueに設定。 |
| openvpn_custom_dns | リスト[文字列] | [] | 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_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ネットワークのアドレスとプレフィックス。 | |
| 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オプションを追加します - これにより、クライアントは1つのキーで複数回接続できるようになります。NOTE:クライアントの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暗号化のための最新のCipherを使用します(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 | リスト | empty | クライアントテンプレートにすでに存在しないユーザー定義のクライアントオプションのリスト(例:- mssfix 1400) |
|
| openvpn_addl_server_options | リスト | empty | サーバーテンプレートにすでに存在しないユーザー定義のサーバーオプションのリスト(例:- 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 | リスト | empty | 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 |
OpenVPN downスクリプトへのパス | |
| openvpn_script_up | 文字列 | unset |
OpenVPN upスクリプトへのパス | |
| 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 | "anonymous_bind"が"False"に設定されている場合に使用されるバインドDN | |
| 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を使用します。 |
依存関係
他のロールには依存していません
例Playbook
- 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
著者情報
Kyle Lexmondによって作成されました
ansible-galaxy install bwinfosec.openvpn