<div dir="ltr">Going forward I think we should support two approaches:<div><br></div><div>1) some faster mostly python based (because we are a python project) rootwrap solution, there are many good ideas proposed above.   Although <br class="">

<table cellpadding="0" class="" style="font-family:arial,sans-serif;font-size:13px"><tbody><tr class=""><td class="" style="width:917px"><table cellpadding="0" class="" style="width:917px"><tbody><tr><td><div class=""><span name="Robert Collins" class="" style="font-size:13px">Robert Collins</span> comments have yet to be addressed.</div>

<div class="">2) Also support just using sudo.</div><div class=""><br></div><div class="">Assuming any sort of rootwrap solution we propose will incur a non-zero overhead, I can imagine some users wanting to sacrifice some security for performance.   For example if they run a private cloud where the tenants are mostly trusted.</div>

</td></tr></tbody></table></td></tr></tbody></table><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jul 29, 2013 at 1:00 PM, Fox, Kevin M <span dir="ltr"><<a href="mailto:kevin.fox@pnnl.gov" target="_blank">kevin.fox@pnnl.gov</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">How about a hybrid C/Python approach?<br>
<br>
The biggest performance issue seems to be python startup overhead, not the actual code execution time. Caching the python process could be used to solve the issue.<br>
<br>
You need to be able to execute the command quickly, so that says the command executed can't be python. But you could also make that program as minimal as possible, leaving everything else to python.<br>
<br>
So how about something like the following:<br>
<br>
In C, create a setuid program that opens a named pipe for write. If it opens ok, it writes out argv to the socket in one write. This will limit the command line to 512 bytes (Posix fifo atomic grantee) but should be enough I think.<br>


If the socket can't be opened for writing, a new python handler process is executed on the socket. There is a slight race here but should be handleable in the python process, perhaps with using semaphore locking. It then writes argv to the socket as above.<br>


<br>
The Python program starts up, loads all the libraries it needs, exits if it isn't "The one" and then proceeds to read on the socket. For each atomic read, it forks with the child. The fork should be cheep since python is already initialized. From there, the child can proceed exactly as it does today with all the regex stuff still in python.<br>


<br>
The C code is then very basic and easy to get right.<br>
<br>
Thanks,<br>
Kevin<br>
________________________________________<br>
From: John Garbutt [<a href="mailto:john@johngarbutt.com">john@johngarbutt.com</a>]<br>
Sent: Monday, July 29, 2013 2:38 AM<br>
To: OpenStack Development Mailing List<br>
Subject: Re: [openstack-dev] Python overhead for rootwrap<br>
<div class="HOEnZb"><div class="h5"><br>
> Joe Gordon wrote:<br>
> time python -c "print 'test'"<br>
<br>
Is this a fair test, because I assume we don't need to compile<br>
rootwrap each time?<br>
<br>
Having said that, I believe you that there is overhead in starting python.<br>
<br>
>>> Mike Wilson wrote:<br>
>>>> In my opinion:<br>
>>>><br>
>>>> 1. Stop using rootwrap completely and get strong argument checking<br>
>>>> support into sudo (regex).<br>
<br>
It seems like this is hard, and might pull us away from the finer<br>
grained control we would like.<br>
<br>
Rewriting rootwrap in C (option 4?) might work, but it would be a mine<br>
field of string handing errors in the filters.<br>
<br>
I tend to agree that (option 3) aggregating all of the calls to<br>
rootwrap may be impractical:<br>
> Sean Dague wrote:<br>
> The reason there are 20 different call outs is that they aren't all in the<br>
> same place. There are phases that happen here, and different kind of errors<br>
> needed. I'm skeptical that you could push it all into one place.<br>
<br>
However it seems like the quickest way to reduce _some_ of the impact.<br>
<br>
Maybe just have python command-lets, like the filters (python code<br>
that runs as root) that chain a set of shell requests, and the input<br>
is restricted by the filters in the usual way. I do worry that it<br>
encourages larger chunks of code running as root, but that is<br>
something we should be able to avoid.<br>
<br>
>>>> 2. Some sort of long lived rootwrap process, either forked by the<br>
>>>> service that want's to shell out or a general purpose rootwrapd type<br>
>>>> thing.<br>
<br>
Not sure we can have explored this sort of option fully.<br>
<br>
In general, it creates interesting permissions issues around the IPC,<br>
and obviously increases the amount of memory we consume.<br>
<br>
I am assuming that running rootwrap as another RPC consuming service,<br>
that runs as root on each host, would perform worse that starting<br>
python lots of times? Also, I am assuming that we get the messaging<br>
security tight enough that it would be secure enough.<br>
<br>
To improve performance, what about some kind of named pipe based "same<br>
host" RPC driver to reduce the overhead. The service.hostname queue<br>
could have a "local" equivalent, that could be used as a quick path,<br>
where it is enabled. I am assuming we could get such name pipes<br>
secured by appropriate groups. As an example, a rootwrap process (or<br>
something specific like "nova-compute-rootwrap") may only listen on a<br>
local route. But you could imagine things like nova-network and<br>
nova-compute using the local fast path also, while at the same time<br>
listening on the existing remote queues.<br>
<br>
Its not clear to me that named pipes would be any more performant that<br>
starting lots of python processes. Anyone tried that? My gut feeling<br>
is that we would need to test it first.<br>
<br>
John<br>
<br>
_______________________________________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
<br>
_______________________________________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
</div></div></blockquote></div><br></div>