bwinfosec.openvpn

TODO: このREADMEをbwinfosecフォークの変更を反映するように更新します。

OpenVPN

Github Actions(PRとメインライン): Github CI

Travis CI(実際にopenvpnを起動中): Build Status

このロールは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.0push "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_factstrueに設定する必要があります。

ライセンス

MIT

著者情報

Kyle Lexmondによって作成されました

プロジェクトについて

Ansible role to install and configure openvpn.

インストール
ansible-galaxy install bwinfosec.openvpn
ライセンス
eupl-1.2
ダウンロード
19.5k
所有者
The universities in the state of Baden-Württemberg have joined forces to form the bwInfoSec federation in order to jointly improve information security.