Quoting Nikola Kotur (kotn...@gmail.com):
> There are scenarios in which we want to execute process with specific
> privileges elevated.
> 
> An example for this might be executing a process inside the container
> securely, with capabilities dropped, but not in container's cgroup so
> that we can have per process restrictions inside single container.
> 
> Similar to namespaces, privileges to be elevated can be OR'd:
> 
>     lxc-attach --elevated-privileges='CAP|CGROUP' ...
> 
> Backward compatibility with previous versions is retained. In case no
> privileges are specified behaviour is the same as before: all of them
> are elevated.

Hi,

thanks for submitting this patch.  No objection overall, however
there are a few existing places where elevated_privileges is set to 1
which you are not updating.  I also notice that currently it seems
broken as the manpage says that -R should imply -e, but i don't
see where that is enforced any more.

(Lastly, please do add a signed-off-by)

> ---
>  doc/lxc-attach.sgml.in | 13 ++++++++++++-
>  src/lxc/confile.c      | 37 +++++++++++++++++++++++++++++++++++++
>  src/lxc/confile.h      |  2 ++
>  src/lxc/lxc_attach.c   | 26 +++++++++++++++++---------
>  4 files changed, 68 insertions(+), 10 deletions(-)
> 
> diff --git a/doc/lxc-attach.sgml.in b/doc/lxc-attach.sgml.in
> index 8d75c7c..133e8fd 100644
> --- a/doc/lxc-attach.sgml.in
> +++ b/doc/lxc-attach.sgml.in
> @@ -23,6 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
> MA 02110-1301 USA
>  
>  -->
>  
> +
>  <!DOCTYPE refentry PUBLIC @docdtd@ [
>  
>  <!ENTITY commonoptions SYSTEM "@builddir@/common_options.sgml">
> @@ -107,7 +108,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA 02110-1301 USA
>  
>        <varlistentry>
>       <term>
> -       <option>-e, --elevated-privileges</option>
> +       <option>
> +      -e, --elevated-privileges <replaceable>privileges</replaceable>
> +    </option>
>       </term>
>       <listitem>
>         <para>
> @@ -117,6 +120,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA 02110-1301 USA
>           <emphasis>not</emphasis> be added to the container's cgroup(s)
>           and it will not drop its capabilities before executing.
>         </para>
> +    <para>
> +      You may specify privileges, in case you do not want to elevate all of
> +      them, as a pipe-separated list, e.g.
> +      <replaceable>CGROUP|LSM</replaceable>. Allowed values are
> +      <replaceable>CGROUP</replaceable>, <replaceable>CAP</replaceable> and
> +      <replaceable>LSM</replaceable> representing cgroup, capabilities and
> +      restriction privileges respectively.
> +    </para>
>         <para>
>           <emphasis>Warning:</emphasis> This may leak privileges into the
>           container if the command starts subprocesses that remain active
> diff --git a/src/lxc/confile.c b/src/lxc/confile.c
> index 0e0b7e8..fdfa418 100644
> --- a/src/lxc/confile.c
> +++ b/src/lxc/confile.c
> @@ -1568,6 +1568,43 @@ signed long lxc_config_parse_arch(const char *arch)
>       return -1;
>  }
>  
> +int lxc_fill_elevated_privileges(char *flaglist, int *flags)
> +{
> +     char *token, *saveptr = NULL;
> +     int i, aflag;
> +     struct { const char *token; int flag; } all_privs[] = {
> +             { "CGROUP",             LXC_ATTACH_MOVE_TO_CGROUP       },
> +             { "CAP",                LXC_ATTACH_DROP_CAPABILITIES    },
> +             { "LSM",                LXC_ATTACH_LSM_EXEC             },
> +             { NULL, 0 }
> +     };
> +
> +     if (!flaglist) {
> +             /* for the sake of backward compatibility, drop all privileges
> +                if none is specified */
> +             for (i = 0; all_privs[i].token; i++) {
> +                     *flags |= all_privs[i].flag;
> +             }
> +             return 0;
> +     }
> +
> +     token = strtok_r(flaglist, "|", &saveptr);
> +     while (token) {
> +             aflag = -1;
> +             for (i = 0; all_privs[i].token; i++) {
> +                     if (!strcmp(all_privs[i].token, token))
> +                             aflag = all_privs[i].flag;
> +             }
> +             if (aflag < 0)
> +                     return -1;
> +
> +             *flags |= aflag;
> +
> +             token = strtok_r(NULL, "|", &saveptr);
> +     }
> +     return 0;
> +}
> +
>  static int lxc_get_conf_int(struct lxc_conf *c, char *retv, int inlen, int v)
>  {
>       if (!retv)
> diff --git a/src/lxc/confile.h b/src/lxc/confile.h
> index 9d12071..eb7a8c2 100644
> --- a/src/lxc/confile.h
> +++ b/src/lxc/confile.h
> @@ -22,6 +22,7 @@
>   */
>  
>  #include <stdio.h>
> +#include "attach_options.h"
>  
>  #ifndef _confile_h
>  #define _confile_h
> @@ -47,6 +48,7 @@ extern int lxc_config_define_load(struct lxc_list *defines,
>  
>  /* needed for lxc-attach */
>  extern signed long lxc_config_parse_arch(const char *arch);
> +extern int lxc_fill_elevated_privileges(char *flaglist, int *flags);
>  
>  extern int lxc_get_config_item(struct lxc_conf *c, const char *key, char 
> *retv, int inlen);
>  extern int lxc_clear_config_item(struct lxc_conf *c, const char *key);
> diff --git a/src/lxc/lxc_attach.c b/src/lxc/lxc_attach.c
> index b49771b..5457d93 100644
> --- a/src/lxc/lxc_attach.c
> +++ b/src/lxc/lxc_attach.c
> @@ -38,7 +38,7 @@
>  lxc_log_define(lxc_attach_ui, lxc);
>  
>  static const struct option my_longopts[] = {
> -     {"elevated-privileges", no_argument, 0, 'e'},
> +     {"elevated-privileges", optional_argument, 0, 'e'},
>       {"arch", required_argument, 0, 'a'},
>       {"namespaces", required_argument, 0, 's'},
>       {"remount-sys-proc", no_argument, 0, 'R'},
> @@ -87,7 +87,11 @@ static int my_parser(struct lxc_arguments* args, int c, 
> char* arg)
>       int ret;
>  
>       switch (c) {
> -     case 'e': elevated_privileges = 1; break;
> +     case 'e':
> +             ret = lxc_fill_elevated_privileges(arg, &elevated_privileges);
> +             if (ret)
> +                     return -1;
> +             break;
>       case 'R': remount_sys_proc = 1; break;
>       case 'a':
>               new_personality = lxc_config_parse_arch(arg);
> @@ -138,9 +142,12 @@ Execute the specified COMMAND - enter the container 
> NAME\n\
>  \n\
>  Options :\n\
>    -n, --name=NAME   NAME for name of the container\n\
> -  -e, --elevated-privileges\n\
> -                    Use elevated privileges (capabilities, cgroup\n\
> -                    restrictions) instead of those of the container.\n\
> +  -e, --elevated-privileges=PRIVILEGES\n\
> +                    Use elevated privileges instead of those of the\n\
> +                    container. If you don't specify privileges to be\n\
> +                    elevated as OR'd list: CAP, CGROUP and LSM 
> (capabilities,\n\
> +                    cgroup and restrictions, respectively) then all of 
> them\n\
> +                    will be elevated.\n\
>                      WARNING: This may leak privileges into the container.\n\
>                      Use with care.\n\
>    -a, --arch=ARCH   Use ARCH for program instead of container's own\n\
> @@ -148,9 +155,10 @@ Options :\n\
>    -s, --namespaces=FLAGS\n\
>                      Don't attach to all the namespaces of the container\n\
>                      but just to the following OR'd list of flags:\n\
> -                    MOUNT, PID, UTSNAME, IPC, USER or NETWORK\n\
> -                    WARNING: Using -s implies -e, it may therefore\n\
> -                    leak privileges into the container. Use with care.\n\
> +                    MOUNT, PID, UTSNAME, IPC, USER or NETWORK.\n\
> +                    WARNING: Using -s implies -e with all privileges\n\
> +                    elevated, it may therefore leak privileges into the\n\
> +                    container. Use with care.\n\
>    -R, --remount-sys-proc\n\
>                      Remount /sys and /proc if not attaching to the\n\
>                      mount namespace when using -s in order to properly\n\
> @@ -199,7 +207,7 @@ int main(int argc, char *argv[])
>       if (remount_sys_proc)
>               attach_options.attach_flags |= LXC_ATTACH_REMOUNT_PROC_SYS;
>       if (elevated_privileges)
> -             attach_options.attach_flags &= ~(LXC_ATTACH_MOVE_TO_CGROUP | 
> LXC_ATTACH_DROP_CAPABILITIES | LXC_ATTACH_LSM_EXEC);
> +             attach_options.attach_flags &= ~(elevated_privileges);
>       attach_options.namespaces = namespace_flags;
>       attach_options.personality = new_personality;
>       attach_options.env_policy = env_policy;
> -- 
> 1.8.4.2
> 
> 
> ------------------------------------------------------------------------------
> Shape the Mobile Experience: Free Subscription
> Software experts and developers: Be at the forefront of tech innovation.
> Intel(R) Software Adrenaline delivers strategic insight and game-changing 
> conversations that shape the rapidly evolving mobile landscape. Sign up now. 
> http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel

------------------------------------------------------------------------------
Shape the Mobile Experience: Free Subscription
Software experts and developers: Be at the forefront of tech innovation.
Intel(R) Software Adrenaline delivers strategic insight and game-changing 
conversations that shape the rapidly evolving mobile landscape. Sign up now. 
http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to