On Wed, Nov 29, 2017 at 9:57 AM, Serge E. Hallyn <serge@xxxxxxxxxx> wrote: > Quoting Mahesh Bandewar (महेश बंडेवार) (maheshb@xxxxxxxxxx): >> On Tue, Nov 28, 2017 at 3:04 PM, Serge E. Hallyn <serge@xxxxxxxxxx> wrote: >> > Quoting Mahesh Bandewar (महेश बंडेवार) (maheshb@xxxxxxxxxx): >> > ... >> >> >> diff --git a/security/commoncap.c b/security/commoncap.c >> >> >> index fc46f5b85251..89103f16ac37 100644 >> >> >> --- a/security/commoncap.c >> >> >> +++ b/security/commoncap.c >> >> >> @@ -73,6 +73,14 @@ int cap_capable(const struct cred *cred, struct user_namespace *targ_ns, >> >> >> { >> >> >> struct user_namespace *ns = targ_ns; >> >> >> >> >> >> + /* If the capability is controlled and user-ns that process >> >> >> + * belongs-to is 'controlled' then return EPERM and no need >> >> >> + * to check the user-ns hierarchy. >> >> >> + */ >> >> >> + if (is_user_ns_controlled(cred->user_ns) && >> >> >> + is_capability_controlled(cap)) >> >> >> + return -EPERM; >> >> > >> >> > I'd be curious to see the performance impact on this on a regular >> >> > workload (kernel build?) in a controlled ns. >> >> > >> >> Should it affect? If at all, it should be +ve since, the recursive >> >> user-ns hierarchy lookup is avoided with the above check if the >> >> capability is controlled. >> > >> > Yes but I expect that to be the rare case for normal lxc installs >> > (which are of course what I am interested in) >> > >> >> The additional cost otherwise is this check >> >> per cap_capable() call. >> > >> > And pipeline refetching? >> > >> > Capability calls also shouldn't be all that frequent, but still I'm >> > left wondering... >> >> Correct, and capability checks are part of the control-path and not >> the data-path so shouldn't matter but I guess it doesn't hurt to >> find-out the number. Do you have any workload in mind, that we can use >> for this test/benchmark? > > I suppose if you did both (a) a kernel build and (b) a webserve > like https://github.com/m3ng9i/ran , being hit for a minute by a > heavy load of requests, those two together would be re-assuring. > Well, I did (a) and (b). Here are the results. (a0) I used the ubuntu-artful (17.10) vm instance with standard kernel to compile the kernel mahesh@mahesh-vm0-artful:~/Work/Linux$ time make -j4 -s clean mahesh@mahesh-vm0-artful:~/Work/Linux$ time make -j4 -s real 6m47.525s user 22m37.424s sys 2m44.745s (b0) Now in an user-namespce create by an user that does not have SYS_ADMIN (just for apples-to-apples comparison) mahesh@mahesh-vm0-artful:~$ sysctl -q kernel.controlled_userns_caps_whitelist sysctl: cannot stat /proc/sys/kernel/controlled_userns_caps_whitelist: No such file or directory mahesh@mahesh-vm0-artful:~$ id uid=1000(mahesh) gid=1000(mahesh) groups=1000(mahesh),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),118(lpadmin),128(sambashare) mahesh@mahesh-vm0-artful:~/Work/Linux$ unshare -Uf -- bash nobody@mahesh-vm0-artful:~/Work/Linux$ id uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup) nobody@mahesh-vm0-artful:~/Work/Linux$ time make -j4 -s clean nobody@mahesh-vm0-artful:~/Work/Linux$ time make -j4 -s real 9m10.115s user 25m20.984s sys 2m48.129s (a1) Now patched the same kernel and built and booted with this new kernel - mahesh@mahesh-vm0-artful:~$ sysctl -q kernel.controlled_userns_caps_whitelist kernel.controlled_userns_caps_whitelist = 1f,ffffffff mahesh@mahesh-vm0-artful:~/Work/Linux$ time make -j4 -s clean mahesh@mahesh-vm0-artful:~/Work/Linux$ time make -j4 -s real 6m39.964s user 22m23.538s sys 2m34.258s (b1) Now in an user-namespace created by an user that does not have SYS_ADMIN mahesh@mahesh-vm0-artful:~$ id uid=1000(mahesh) gid=1000(mahesh) groups=1000(mahesh),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),118(lpadmin),128(sambashare) mahesh@mahesh-vm0-artful:~/Work/Linux$ unshare -Uf -- bash nobody@mahesh-vm0-artful:~/Work/Linux$ id uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup) nobody@mahesh-vm0-artful:~/Work/Linux$ make -s clean nobody@mahesh-vm0-artful:~/Work/Linux$ time make -j4 -s real 6m54.725s user 23m18.833s sys 2m38.996s --- For the http-get test, I used the same 'ran' utility you have proposed and wrapped inside a script like - mahesh@mahesh-vm0-artful:~/Work/Scripts$ cat RanLauncher1m.sh #!/bin/bash set -v (sleep 60; killall ran) & time (cd ~/go/bin; ./ran -i index.html >& /dev/null) and another script that constantly performs wget - mahesh@mahesh-vm0-artful:~/Work/Scripts$ cat WgetLoop.sh#!/bin/bash #set -v while true; do wget http://127.0.0.1:8080 >& /dev/null ... here are the results - (A0) Kernel that is unpatched and comes with ubuntu-artful mahesh@mahesh-vm0-artful:~/Work/Scripts$ ./RanLauncher1m.sh (sleep 60; killall ran) & time (cd ~/go/bin; ./ran -i index.html >& /dev/null) real 1m0.009s user 0m2.885s sys 0m2.774s (B0) Now in an user-ns created by an user that does not have SYS_ADMIN mahesh@mahesh-vm0-artful:~/Work/Scripts$ unshare -Uf -- bash nobody@mahesh-vm0-artful:~/Work/Scripts$ ./RanLauncher1m.sh (sleep 60; killall ran) & time (cd ~/go/bin; ./ran -i index.html >& /dev/null) real 1m0.004s user 0m3.003s sys 0m2.737s (A1) With the patched kernel mahesh@mahesh-vm0-artful:~/Work/Scripts$ ./RanLauncher1m.sh (sleep 60; killall ran) & time (cd ~/go/bin; ./ran -i index.html >& /dev/null) real 1m0.005s user 0m1.941s sys 0m1.507s (B1) With patched kernel and inside user-ns mahesh@mahesh-vm0-artful:~/Work/Scripts$ unshare -Uf -- bash nobody@mahesh-vm0-artful:~/Work/Scripts$ ./RanLauncher1m.sh (sleep 60; killall ran) & time (cd ~/go/bin; ./ran -i index.html >& /dev/null) real 1m0.004s user 0m1.513s sys 0m1.254s > thanks, > -serge -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html