On 01/09/16 20:04, David Sommerseth wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> On 31/08/16 20:55, David Sommerseth wrote:
>> Hi,
>>
>> I have for a long time pondered on how we can make the management
>> API more suitable for more modern tools and tasks.  So I am just
>> giving an extremely early heads-up on on what I'm poking at ... and
>> hopefully receive some feedbacks on what you think.
> [...snip...]  (I'll try to respond to all feedback in this single mail)
>
> Thank you to all of you who raised your voice, this is very helpful!
>
> First of all, I understand the scepticism.  And I also do not want to
> bloat OpenVPN needlessly.
>
> JJK have also made a very good point, that there is a contradiction
> between the need on the server and client.  In regards to splitting
> client and server code, the OpenVPN 3 code base is actually far better
> separated in this regards - so we are moving towards that direction.
>
> I also understand the argument "If it ain't broken, don't fix it".
> The problem is what and who defines what is broken or not.  I see a
> great potential to make OpenVPN integrate better, both towards the OS
> level but also towards the user interfaces.  From my point of view,
> OpenVPN is still stuck in how things were done in 90s, and to enable
> possibilities which is found in modern OS we need to adopt OpenVPN
> likewise.  I still wouldn't call it broken, but seeing it more mature
> for a real update.
>
> Samuli's comment regarding easing the client management on the server
> side, is quite spot-on.  But it won't be that much extra work at all
> to add client side support in addition.  Hence, I am daring to also
> consider client-side needs.
>
> I understand that the client-side is quite happy with the situation as
> it is now.  So I will therefore then focus these next steps on the
> server side primarily.  If the client-side see some advantages later
> on, it shouldn't be too hard adding those features later on.  And
> having both the old TCP based management interface and a newer D-Bus
> interface will therefore be the primary goal - with D-Bus enabling
> will happen both at compile time (to allow building without extra
> dependencies) and runtime (to not enforce D-Bus to be used).  And I
> will not spend time adding new features to the TCP based management
> interface for the time being.
>
> So just to provide a few more examples why I'm so persistent on
> providing D-Bus support ... I'll bring up both a few already mentioned
> use cases, for completeness, as well as some new ones.
>
> * Better and easier integration with modern management tools (like
>    Cockpit)
>
> * Enables a simpler way to manage OpenVPN also from shell scripts,
>    by using standard D-Bus clients such as gdbus or qdbus.
>
> * Allow multiple management tools to interact with OpenVPN at the same
>    time, even allowing differentiated access controls per management
>    client (more on that in a bit)
>
> * Enable management of OpenVPN plug-ins without needing to extend
>    OpenVPN core code additionally per plug-in and allow plug-ins
>    full control of the API it will provide (not restricted to the
>    OpenVPN capabilities the core OpenVPN code is designed for - each
>    plug-in can provide its own D-Bus interface independently of others)
>
> * Allow for PUSH notifications (in D-Bus jargon: signals) instead of
>    management tools need to constantly pull for information
>
> * Enable possibility to add (set) triggers (which uses D-Bus signals)
>
> * Provide possibility to do user/password authentication via D-Bus
>    as an alternative to plug-ins or script hooks.  Can also extend this
>    to provide the TLS verification methods too.  This allows for more
>    powerful authentication modules where using script hooks easily
>    gets complex and writing a C plug-in is a too big challenge.
>
> * New tools can more easily manipulate firewalls on the fly using
>    more fine grained information for connected sessions at once.  Also
>    considering that FirewallD is also D-Bus based can ease this
>    integration too.
>
> * Enable policy management of methods ("function calls") provided over
>    D-Bus.  This can allow non-admin users to have limited power while
>    admin users can be allowed to do more.  These policies can also
>    be completely controlled by using user groups defined by the system.
>    All user authentication is done by the OS via D-Bus (using polkit).
>    This means, a non-root user can actually control much of an OpenVPN
>    process if the policy allows it - including restarting OpenVPN.
>    The OpenVPN process itself can run as a different user or even root.
>
> * Enable possibility to have better understanding of the current network
>    situation, as OpenVPN can through D-Bus query NetworkManager (or
>    similar D-Bus interfaces for networks) for the general network
>    situation.  This is probably more useful on the client side than
>    server side, though.  (No need to try to reconnect every 5th second
>    if the network state is "offline")
>
> * Prepare the ground for seamless restart of the OpenVPN process without
>    needing to do complete reconnect with all TLS key exchanges for all
>    connected clients.  This can be done such that the new OpenVPN
>    process connects to the D-Bus, signals the already running process to
>    pass over all client states.  These client states can also include
>    byte/packet counters as well, if that is used for accounting.
>
>    By adding an extra "link program", it can, in theory at least, also
>    be made possible to sync client states across hosts.
>
>    This can probably be done today too, but would we enable such things
>    over an unencrypted TCP link?  As it is unencrypted, I'd say that the
>    management password you can set is quite moot and useless.  So to get
>    the security right, the management today needs to be even further
>    extended - as D-Bus provides the authentication and access control
>    in the basic API.
>
> These are just some of the possibilities I see D-Bus can more easily
> enable.  As I said, OpenVPN ain't broke as it is, but it can be
> improved to be better integrated with more advanced use cases which is
> harder to achieve today.
>
> As an example in the end, I'll consider up a question I've heard every
> now and then on the #openvpn IRC channel.  "How can I add quotas to
> VPN clients?"  Today, I would say, that can only be achieved by either
> writing a plug-in and/or some tools using the management interface to
> retrieve information and do the quota controls.
>
> With D-Bus this can be done with a few simple scripts ... here as a
> very simple pseudo code.  These scripts can be written in your
> favourite language as long as it has D-Bus libraries available.
>
>
>     * ConnectionSetup ... a script which prepares the triggers
>     =====================================================================
>     system_bus = dbus.connect(DBUS_SYSTEM)
>     while (1) {
>        # wait for a client to connect
>        res = system_bus.wait_for_signal(dest="net.openvpn.managment",
>              path="/net/openvpn/management/Triggers",
>              signal="sys_vpn_connect");
>
>        # Fetch client info and log
>        client = system_bus.call(dest="net.openvpn.management",
>              path="/net/openvpn/management/ClientInfo/" + res,
>                 method="QueryClients");
>
>        # Retrieve quota and do some logging
>        quota = corp_function_get_quota(client.cn);
>        printf("Client %s connected, used %i bytes of quota, " \
>               "setting quota to %i bytes\n",
>            client.cn, quota.used, quota.max);
>
>        # Set the quota for this session, account for already used quota
>        system_bus.call(dest="net.openvpn.management",
>              path="/net/openvpn/management/Triggers/" + res,
>                 method="SetQuota"
>              quota=(quota.max - quota.used));
>     }
>     =====================================================================
>
>
>     * ConnectionDisconnected ... a script which logs used quota
>     =====================================================================
>     system_bus = dbus.connect(DBUS_SYSTEM)
>     while (1) {
>        # wait for a client to connect
>        res = system_bus.wait_for_signal(dest="net.openvpn.managment",
>              path="/net/openvpn/management/Triggers",
>              signal="sys_vpn_disconnect");
>
>        # Fetch session info
>        session = system_bus.call(dest="net.openvpn.management",
>                    path="/net/openvpn/management/Sessions/" + res,
>                       method="QuerySession");
>
>        # Log some statistics
>        printf("Client %s disconnects, used %i bytes in this session\n",
>               session.cn,
>               (session.bytes_received + session.bytes_sent));
>
>        # Update corp database with used quota
>        corp_function_add_used_quota(session.cn,
>                (session.bytes_received + session.bytes_sent));
>     }
>     =====================================================================
>
>
>     * QuotaControl .... a script which kicks out clients exceeding quota
>     =====================================================================
>     system_bus = dbus.connect(DBUS_SYSTEM)
>     while (1) {
>        # wait for a client who exceeds the quota
>        res = system_bus.wait_for_signal(dest="net.openvpn.managment",
>              path="/net/openvpn/management/Triggers",
>              signal="quota_exceed");
>
>        # Fetch client info and log
>        client = system_bus.call(dest="net.openvpn.management",
>              path="/net/openvpn/management/ClientInfo/" + res,
>                 method="QueryClients");
>
>        printf("Client %s exceeded quota, killing session\n",
>               client.cn);
>
>        # Kill the session
>        system_bus.call(dest="net.openvpn.management",
>              path="/net/openvpn/management/Sessions/" + res,
>                 method="KillClientSession");
>     }
>     =====================================================================
>
>     (I admit this over-simplifies the D-Bus calls, but this is in
>      essence of how these calls would work)
>
>
> So three individual scripts, which can be added/modified/restarted at
> will outside of OpenVPN without influencing any established OpenVPN
> connections.
>
> Doing a similar thing using the TCP based management interface is
> going to be considerably harder, as you need to manage everything
> through a single TCP connection and it is needed to do regular polls
> to the OpenVPN server as there are no push features.  Plus you need to
> manage the TCP connection setup and all communication over the socket.
>
> I'll let you all know when I have something more concrete to show; but
> I am still very much open for more feedback!
>
>
> - -- 
> kind regards,
>
> David Sommerseth
> OpenVPN Technologies, Inc
>
David, that all sounds fantastic but .. One note of caution:

* If it sounds too good to be true .. then it probably is.

If it is possible; a run time option eg. --dbus enabled|disabled
or at least a compile time option --enable-dbus might be preferable.

For me personally, it sounds like a lot of openvpn 'control' is being
handed over to another entity and I am not convinced that is ideal.

Regards



------------------------------------------------------------------------------
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to