OK,
I will continue to discuss this with my-self, as apparently what I am
showing is not significant enough to have a proper technical
discussion. There is nothing wrong in open mind to other
possibilities, evaluate and with rational select the best approach.

For the lazy people of us, I added installation script[1] to do all
the steps automatically.

Compile the project, move the install.js, test.js,
OpenVPNUINetwork.dll, OpenVPNUITunnel.dll to some directory.

> cscript //nologo install.js --command=install --mode=enterprise
-- Add your user to OpenVPN Users group logout/login

> cscript //nologo test.js
> cscript //nologo install.js --command=update --mode=standalone
> cscript //nologo test.js
> cscript //nologo install.js --command=update --mode=enterprise
> cscript //nologo test.js

> cscript //nologo install.js --command=uninstall

BTW: For these who are not familiar with ATL programming, most of the
code is generated by the Microsoft wizards, the actual added code
resides in Network.cpp and Tunnel.cpp files.

Alon.

[1] 
https://github.com/alonbl/openvpn-gui-skeleton/blob/master/scripts/install.js

On Fri, Mar 2, 2012 at 1:20 AM, Alon Bar-Lev <alon.bar...@gmail.com> wrote:
> Hello Again,
>
> To make it easier to understand and help to demonstrate the
> technology, I created skeleton[1] for the alternative I suggested.
>
> It uses the COM+ infrastructure to achieve what we need avoiding
> complex programming.
>
> We have two COM+ objects:
> OpenVPNUI.Network - runs under user belongs to the network
> configuration operators group.
> OpenVPNUI.Tunnel - runs under unprivileged user.
>
> We control the identity and access to these object using the COM+
> infrastructure. COM+ does all the work for us, we don't need to do
> communication or security check within code.
>
> The manual configuration is quite long, I wrote step-by-step, it is
> good for people who wish to understand what happening. There is more
> configuration than actual coding which is great.
>
> The script/test.js script is used to test this infrastructure.
>
> Use the setup instructions bellow, you will get the most secured
> configuration, total privilege separation. OpenVPN daemon which will
> be run by the OpenVPNUI.Tunnel object runs under its own unprivileged
> account and only this account can access the OpenVPNUI.Network object
> which is within the network operators group. As a result the
> interactive user cannot change routes or hack into the OpenVPN daemon
> address space. Of course that in this configuration only Administrator
> is allowed to modify the configuration files, to not allowing the user
> to execute own script under the openvpn context. In this case the UI
> it-self should execute user specific connect/disconnect scripts, it
> receives these events, no reason why the daemon needs to do so. But be
> patient, I will show how it can be done if desired.
>
> The output of the script in this configuration is:
> ---
> Trying to access OpenVPNUI.Network directly
> Creating OpenVPNUI.Network
> ERROR: Permission denied
>
>
> Trying to access OpenVPNUI.Tunnel
> Creating OpenVPNUI.Tunnel
> OpenVPNTunnel identity is: openvpn
> Creating Route for 1.0.0.0
> ==============================
> Active Routes:
> Network Destination        Netmask          Gateway       Interface  Metric
>          0.0.0.0          0.0.0.0    192.168.151.1  192.168.151.10       1
>          1.0.0.0          1.0.0.0          2.0.0.0  192.168.151.10      1
>        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
> <snip>
> Default Gateway:     192.168.151.1
> ==============================
>
>
> Deleting Route for 1.0.0.0
> ==============================
> Active Routes:
> Network Destination        Netmask          Gateway       Interface  Metric
>          0.0.0.0          0.0.0.0    192.168.151.1  192.168.151.10       1
>        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
> <snip>
> Default Gateway:     192.168.151.1
> ==============================
>
> ---
>
> So what do we see here?
> My interactive user cannot access the  OpenVPNUI.Network object, but
> can access the  OpenVPNUI.Tunnel. The user of the OpenVPNUI.Network
> object is openvpn, this user can access the  OpenVPNUI.Network object,
> so the it can modify the route.
>
> Now, let's change the permissions the the standalone configuration,
> meaning the interactive user can modify the openvpn configuration, and
> we may want openvpn to run under the interactive user account to
> execute some scripts.
>
> Before we do this, I would like to say that I disagree with the fact
> that "connect/disconnect" scripts should be run by the daemon, I think
> that these scripts should be run by the UI it-self that is already run
> under the interactive user. No *NEW* security issue issue will be
> created if user is allowed to change configuration but daemon runs
> under the openvpn unprivileged account.
>
> Anyway, as this was discussed as an option, lets do the configuration
> adjustments for the sake of argument.
>
> At the OpenVPNUI.Network object roles, add OpenVPN Users group.
> At the OpenVPNUI.Tunnel, change the application identity to interactive user.
> Shutdown any OpenVPNUI.* at "Running Processes".
>
> Now let's run the script again:
> ---
> Trying to access OpenVPNUI.Network directly
> Creating OpenVPNUI.Network
> OpenVPNUI.Network identity is: openvpn-priv
> Creating Route for 1.0.0.0
> ==============================
> Active Routes:
> Network Destination        Netmask          Gateway       Interface  Metric
>          0.0.0.0          0.0.0.0    192.168.151.1  192.168.151.10       1
>          1.0.0.0          1.0.0.0          2.0.0.0  192.168.151.10      1
>        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
> <snip>
> Default Gateway:     192.168.151.1
> ==============================
>
> Deleting Route for 1.0.0.0
> ==============================
> Active Routes:
> Network Destination        Netmask          Gateway       Interface  Metric
>          0.0.0.0          0.0.0.0    192.168.151.1  192.168.151.10       1
>        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
> <snip>
> Default Gateway:     192.168.151.1
> ==============================
>
> Trying to access OpenVPNUI.Tunnel
> Creating OpenVPNUI.Tunnel
> OpenVPNTunnel identity is: alonbl
> Creating Route for 1.0.0.0
> ==============================
> Active Routes:
> Network Destination        Netmask          Gateway       Interface  Metric
>          0.0.0.0          0.0.0.0    192.168.151.1  192.168.151.10       1
>          1.0.0.0          1.0.0.0          2.0.0.0  192.168.151.10      1
>        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
> <snip>
> Default Gateway:     192.168.151.1
> ==============================
>
> Deleting Route for 1.0.0.0
> ==============================
> Active Routes:
> Network Destination        Netmask          Gateway       Interface  Metric
>          0.0.0.0          0.0.0.0    192.168.151.1  192.168.151.10       1
>        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
> <snip>
> Default Gateway:     192.168.151.1
> ==============================
>
> ---
>
> So what do we see now?
> My interactive user can access the OpenVPNUI.Network directly and
> change the routes. It can also access the OpenVPNUI.Tunnel. But notice
> that the OpenVPNUI.Tunnel now runs under my interactive user account.
>
> That's it... no services, no named pipe... minor modification to
> openvpn - ability to run a program to configure networking. This can
> be cross platform program with predefined parameters.
> Another feature required is the ability to provide certificate via the
> management interface.
>
> All this setup should be part of the openvpn-windows-ui package,
> maintained as a whole, no need to impact the openvpn project roadmap
> or maintenance.
>
> I hope people will see how simple it can be, and play with the solution.
>
> Regards,
> Alon Bar-Lev.
>
> [1] https://github.com/alonbl/openvpn-gui-skeleton
>
> ---
>
> === SET UP INSTRUCTIONS ===
>
> USERS AND GROUPS
>
> * Create user openvpn - no special privileged.
> * Create user openvpn-priv, add user to network configuration operators group.
> * Create OpenVPN Users group.
> * Put your interactive user within OpenVPN Users group.
>
> INSTALL APPLICATIONS
>
> * Open MMC and select Component Services snap-in.
> * Go to My Computer, COM+ applications.
>
> INSTALL OpenVPN-Priv APPLICATION
>
> This will install the OpenVPN-Priv application that runs under the
> openvpn-priv user. It will host the OpenVPNUI.Network object, and will
> enable access only to openvpn user.
>
> * New->Application
> * Create Empty Application
> * Application name: OpenVPNUI-Priv, select Server Application.
> * Account: openvpn-serv
> * Select OpenVPNUI-Priv properties
> * Security/Authorization = Enforce access checks for this application.
> * Security/Impersonation Level = Identity.
> * OpenVPNUI-Priv/Rules->New->Rule.
> * Rule name: Access.
> * Select Rule Access/Users New and add openvpn user.
> * OpenVPNUI-Priv/Components->New
> * Install new components
> * Select the OpenVPNNetwork.dll
> * Next, Finish.
> * Select The OpenVPN.Network properties
> * Security/Roles: select Access.
>
> INSTALL OpenVPNUI APPLICATION
>
> This will install the OpenVPN application that runs under the openvpn
> user or the interactive user. It will host the OpenVPNUI.Tunnel
> object, and will enable access to OpenVPN Users group.
>
> * New->Application
> * Create Empty Application
> * Application name: OpenVPNUI-Priv, select Server Application.
> * Account: openvpn
> * Select OpenVPNUI-Priv properties
> * Security/Authorization = Enforce access checks for this application.
> * Security/Impersonation Level = Identity.
> * OpenVPNUI-Priv/Rules->New->Rule.
> * Rule name: Access.
> * Select Rule Access/Users New and add OpenVPN Users group.
> * OpenVPNUI-Priv/Components->New
> * Install new components
> * Select the OpenVPNTunel.dll
> * Next, Finish.
> * Select The OpenVPN.Tunnel properties
> * Security/Roles: select Access.
>
> On Thu, Mar 1, 2012 at 2:38 PM, Alon Bar-Lev <alon.bar...@gmail.com> wrote:
>>
>> Sending this again, as it seems people did not receive it.
>>
>>
>> ---------- Forwarded message ----------
>> From: Alon Bar-Lev <alon.bar...@gmail.com>
>> Date: Wed, Feb 29, 2012 at 8:52 PM
>> Subject: [DISCUSSION] OpenVPN privilege separation (Windows)
>> To: "openvpn-devel@lists.sourceforge.net"
>> <Openvpn-devel@lists.sourceforge.net>
>>
>>
>> Hello,
>>
>> Following recent discussion on Windows platform, I open a new thread.
>> I don't think this topic is Windows specific as the security
>> principals are the same.
>>
>> VPN client product has [at least] two different type of configuration.
>>
>> 1. Standalone configuration.
>>
>> 2. Enterprise configuration.
>>
>> The main difference of these types is who control the workstation. In
>> standalone configuration the workstation is controlled by the
>> end-user, and in enterprise configuration the enterprise administrator
>> controlling the workstation.
>>
>> These two configurations have different purpose as well, the
>> standalone configuration usually protects the workstation against the
>> remote network, and the enterprise configuration usually protects the
>> remote network against the workstation.
>>
>> The "enemy" of the two configurations is also different, in standalone
>> configuration the "enemy" is the remote network administrator, while
>> in the enterprise configuration the "enemy" is the local workstation
>> user.
>>
>> The "scripts" in the standalone configuration or for the sake of the
>> user, but within the enterprise solution it usually need to scan the
>> computer, disconnect device and other privileged operations.
>>
>> There is no single solution for both configurations.
>>
>> Please read till the end before responding.
>>
>> Provided we have the following components:
>> 1. tap device aka tap - a virtual Ethernet interface.
>> 2. openvpn - a tunneling implementation.
>> 3. openvpn configuration - configuration files.
>> 3. network utilities aka utils - a set of utilities to manipulate
>> workstation network settings.
>> 4. user interaction aka UI - a program that manages user interaction.
>>
>> What is the security attribute for each component in each configuration?
>>
>> Standalone configuration
>> 1. tap - accessed by interactive user.
>> 2. openvpn - runs by the interactive user.
>> 3. openvpn configuration - read/write by interactive user.
>> 4. network utilities - privileged user required.
>> 5. UI - runs by interactive user.
>>
>> Enterprise configuration
>> 1. tap - access by openvpn user.
>> 2. openvpn - runs by openvpn user.
>> 3. openvpn configuration - read by openvpn, read/write by administrator.
>> 4. network utilities - privileged user required.
>> 5. UI - runs by interactive user.
>>
>> Major missing openvpn functionality:
>> Specify certificate via the management UI - this feature is required
>> so that a configuration in which openvpn knows nothing of
>> authentication can be established.
>>
>> A while back I added to openvpn the ability to create tun/tap device
>> with custom permissions
>> and the ability to wrap ip utility with custom utility.
>> As for now I am using the standalone Linux configuration[1], in few words:
>> 1. tap is configured so interactive user may access it.
>> 2. openvpn is run by the interactive user.
>> 3. openvpn configuration and keys are located at ~/openvpn
>> 4. network utilities - (ip utility and DNS update) are wrapped within
>> sudo scripts.
>> 5. UI is run by the interactive user.
>>
>> The network utilities' wrapper can do validation before actually
>> executing the commands.
>>
>> There is no reason why we cannot achieve the same in Windows:
>> 1. tap - configure ACL of TAP to specific permissions (Users for example).
>> 2. openvpn - runs by the interactive user, it will have permission to
>> open the tap.
>> 3. openvpn configuration - read/write by interactive user.
>> 4. network utilities are accessed by wrapper (I will discuss this bellow).
>> 5. UI is run by the interactive user.
>>
>> So the network utilities are the only component that needs privilege
>> escalation in this configuration.
>>
>> Let's take the enterprise configuration:
>> 1. tap - configure ACL of TAP to openvpn user.
>> 2. openvpn - runs by openvpn user.
>> 3. openvpn configuration - read by openvpn, read/write by administrator.
>> 4. network utilities are accessed by wrapper (I will discuss this bellow).
>> 5. UI runs by the interactive user.
>>
>> So in this case, network utilities needs privilege escalation, but
>> also the ability of the UI to start/stop the tunnel requires special
>> privilege.
>>
>> I gave an example of how this is done in Linux... Now, what is the
>> simplest solution to do the same in Windows?
>>
>> There was a suggestion to use named pipes, services and impersonation,
>> I would like to discuss another option.
>>
>> Windows Component Services provide the ability to create a component
>> that may be run in separate security context. It already implements
>> the process management and security isolation.
>>
>> Let's define two components:
>> 1. OpenVPN.Tunnel component (replaces current service).
>> 2. OpenVPN.Network component (aka network utilities wrapper).
>>
>> Now, let's see what we can do with these components.
>>
>> Standalone configuration
>> 1. TAP ACL - Group Users can access.
>> 2. OpenVPN.Tunnel - can be accessed by Users, Interactive User identity.
>> 3. openvpn configuration - read/write by user.
>> 4. OpenVPN.Network - can be accessed by Users, Network service identity.
>> 5. UI - runs under the interactive user, can access the OpenVPN.Tunnel
>> to run openvpn, within configuration it sets the iproute utility to
>> own wrapper that calls the OpenVPN.Network.
>>
>> Enterprise configuration
>> 1. TAP ACL - User openvpn
>> 2. OpenVPN.Tunnel - can be accessed by Users, openvpn user identity.
>> 3. openvpn configuration - read by openvpn, read/write by administrator.
>> 4. OpenVPN.Network - can be accessed by openvpn, Network service identity.
>> 5. UI - runs under the interactive user, can access the OpenVPN.Tunnel
>> to run openvpn, within configuration there is a call to iproute
>> utility to own wrapper that calls the OpenVPN.Network.
>>
>> The switch between the two configurations is simple:
>> 1. TAP: Change permission Users<->openvpn
>> 2. OpenVPN.Tunnel - change identity: Interactive User<->openvpn
>> 3. OpenVPN.Network - change access: Users<->openvpn
>> 4. openvpn configuration - specific user ACL<->openvpn read,
>> administrators read/write
>> 5. UI - nothing.
>>
>> As you can see the whole setup is a change in Windows configuration only!
>> Simple utility to select the mode can be provided.
>>
>> The impact on the openvpn project is small... we only need to allow
>> windows network configuration replacement similar to ip utility
>> replacement.
>> The UI can implement the OpenVPN.Tunnel, OpenVPN.Network and the
>> network utility wrapper that calls the OpenVPN.Network.
>> Well, it can be done as part of the OpenVPN project as well, this is
>> out of scope of this discussion.
>>
>> I think this implementation suggestion provides solution for the
>> threats and requirements without huge effort using windows best
>> practices.
>>
>> Then we should discuss how to write a proper UI... until now the UI
>> was a standalone none standard VPN program while TAPI integration
>> (much like PPTP, L2TP) is required. This will enable users to connect
>> to VPN even before login. But this is a totally different discussion.
>>
>> Alon.
>>
>> [1] http://en.gentoo-wiki.com/wiki/OpenVPN_Non_Root

Reply via email to