summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/templates/ocserv/ocserv_config.j26
-rw-r--r--interface-definitions/include/openconnect-identity-based-config.xml.i54
-rw-r--r--interface-definitions/vpn-openconnect.xml.in53
-rwxr-xr-xsrc/conf_mode/vpn_openconnect.py3
4 files changed, 57 insertions, 59 deletions
diff --git a/data/templates/ocserv/ocserv_config.j2 b/data/templates/ocserv/ocserv_config.j2
index 8b9daed0f..1401b8b26 100644
--- a/data/templates/ocserv/ocserv_config.j2
+++ b/data/templates/ocserv/ocserv_config.j2
@@ -16,12 +16,10 @@ acct = "radius [config=/run/ocserv/radiusclient.conf]"
{% if "radius" in authentication.mode %}
auth = "radius [config=/run/ocserv/radiusclient.conf{{ ',groupconfig=true' if authentication.radius.groupconfig is vyos_defined else '' }}]"
-{% if "identity_based_config" in authentication %}
-{% if authentication.identity_based_config.disabled is not vyos_defined %}
-{% if "group" in authentication.identity_based_config.mode %}
+{% if authentication.identity_based_config.disabled is not vyos_defined %}
+{% if "group" in authentication.identity_based_config.mode %}
config-per-group = {{ authentication.identity_based_config.directory }}
default-group-config = {{ authentication.identity_based_config.default_config }}
-{% endif %}
{% endif %}
{% endif %}
{% elif "local" in authentication.mode %}
diff --git a/interface-definitions/include/openconnect-identity-based-config.xml.i b/interface-definitions/include/openconnect-identity-based-config.xml.i
deleted file mode 100644
index dfc51936d..000000000
--- a/interface-definitions/include/openconnect-identity-based-config.xml.i
+++ /dev/null
@@ -1,54 +0,0 @@
-<!-- include start from openconnect-identity-based-config.xml.i -->
-<node name="identity-based-config">
- <properties>
- <help>Configures OpenConnect to search the configured directory for a config file matching the Group name or Username</help>
- </properties>
- <children>
- <leafNode name="mode">
- <properties>
- <help>Configures OpenConnect to use config-per-group or config-per-user. Ignored if OpenConnect authentication group is configured.</help>
- <valueHelp>
- <format>user</format>
- <description>OpenConnect config file loaded by matching file in configured directory to the users username</description>
- </valueHelp>
- <valueHelp>
- <format>group</format>
- <description>OpenConnect config file loaded by matching RADIUS class attribute in the RADIUS server response to a file in the configured directory</description>
- </valueHelp>
- <constraint>
- <regex>(user|group)</regex>
- </constraint>
- <constraintErrorMessage>Invalid mode. Must be one of: user, group</constraintErrorMessage>
- <completionHelp>
- <list>user group</list>
- </completionHelp>
- </properties>
- </leafNode>
- <leafNode name="directory">
- <properties>
- <help>Directory to configure OpenConnect to use for matching username/group to config file</help>
- <valueHelp>
- <format>filename</format>
- <description>Must be a child directory of /config/auth e.g. /config/auth/ocserv/config-per-user</description>
- </valueHelp>
- <constraint>
- <validator name="file-path" argument="--directory --parent-dir /config/auth --strict"/>
- </constraint>
- </properties>
- </leafNode>
- <leafNode name="default-config">
- <properties>
- <help>Default/fallback config to use when a file cannot be found in the configured directory that matches the username/group</help>
- <valueHelp>
- <format>filename</format>
- <description>Child directory of /config/auth e.g. /config/auth/ocserv/defaults/user.conf</description>
- </valueHelp>
- <constraint>
- <validator name="file-path" argument="--file --parent-dir /config/auth --strict"/>
- </constraint>
- </properties>
- </leafNode>
- #include <include/generic-disable-node.xml.i>
- </children>
-</node>
-<!-- include end --> \ No newline at end of file
diff --git a/interface-definitions/vpn-openconnect.xml.in b/interface-definitions/vpn-openconnect.xml.in
index afc2a5383..75c64a99a 100644
--- a/interface-definitions/vpn-openconnect.xml.in
+++ b/interface-definitions/vpn-openconnect.xml.in
@@ -71,7 +71,58 @@
</leafNode>
</children>
</node>
- #include <include/openconnect-identity-based-config.xml.i>
+ <node name="identity-based-config">
+ <properties>
+ <help>Include configuration file by username or RADIUS group attribute</help>
+ </properties>
+ <children>
+ #include <include/generic-disable-node.xml.i>
+ <leafNode name="mode">
+ <properties>
+ <help>Select per user or per group configuration file - ignored if authentication group is configured</help>
+ <completionHelp>
+ <list>user group</list>
+ </completionHelp>
+ <valueHelp>
+ <format>user</format>
+ <description>Match configuration file on username</description>
+ </valueHelp>
+ <valueHelp>
+ <format>group</format>
+ <description>Match RADIUS response class attribute as file name</description>
+ </valueHelp>
+ <constraint>
+ <regex>(user|group)</regex>
+ </constraint>
+ <constraintErrorMessage>Invalid mode, must be either user or group</constraintErrorMessage>
+ </properties>
+ </leafNode>
+ <leafNode name="directory">
+ <properties>
+ <help>Directory to containing configuration files</help>
+ <valueHelp>
+ <format>path</format>
+ <description>Path to configuration directory, must be under /config/auth</description>
+ </valueHelp>
+ <constraint>
+ <validator name="file-path" argument="--directory --parent-dir /config/auth --strict"/>
+ </constraint>
+ </properties>
+ </leafNode>
+ <leafNode name="default-config">
+ <properties>
+ <help>Default configuration if discrete config could not be found</help>
+ <valueHelp>
+ <format>filename</format>
+ <description>Default configuration filename, must be under /config/auth</description>
+ </valueHelp>
+ <constraint>
+ <validator name="file-path" argument="--file --parent-dir /config/auth --strict"/>
+ </constraint>
+ </properties>
+ </leafNode>
+ </children>
+ </node>
<leafNode name="group">
<properties>
<help>Group that a client is allowed to select (from a list). Maps to RADIUS Class attribute.</help>
diff --git a/src/conf_mode/vpn_openconnect.py b/src/conf_mode/vpn_openconnect.py
index 7b3325d95..83021a3e6 100755
--- a/src/conf_mode/vpn_openconnect.py
+++ b/src/conf_mode/vpn_openconnect.py
@@ -17,6 +17,7 @@
import os
from sys import exit
+from vyos.base import Warning
from vyos.config import Config
from vyos.configdict import dict_merge
from vyos.pki import wrap_certificate
@@ -173,9 +174,11 @@ def verify(ocserv):
users_wo_pswd.append(user)
if users_wo_pswd:
raise ConfigError(f'password required for users:\n{users_wo_pswd}')
+
# Validate that if identity-based-config is configured all child config nodes are set
if 'identity_based_config' in ocserv["authentication"]:
if 'disabled' not in ocserv["authentication"]["identity_based_config"]:
+ Warning("Identity based configuration files is a 3rd party addition. Use at your own risk, this might break the ocserv daemon!")
if 'mode' not in ocserv["authentication"]["identity_based_config"]:
raise ConfigError('OpenConnect radius identity-based-config enabled but mode not selected')
elif 'group' in ocserv["authentication"]["identity_based_config"]["mode"] and "radius" not in ocserv["authentication"]["mode"]: