• L
    security: add new virSecurityManagerSetChildProcessLabel API · 7bf1aa0b
    Laine Stump 提交于
    The existing virSecurityManagerSetProcessLabel() API is designed so
    that it must be called after forking the child process, but before
    exec'ing the child. Due to the way the virCommand API works, that
    means it needs to be put in a "hook" function that virCommand is told
    to call out to at that time.
    
    Setting the child process label is a basic enough need when executing
    any process that virCommand should have a method of doing that. But
    virCommand must be told what label to set, and only the security
    driver knows the answer to that question.
    
    The new virSecurityManagerSet*Child*ProcessLabel() API is the way to
    transfer the knowledge about what label to set from the security
    driver to the virCommand object. It is given a virCommandPtr, and each
    security driver calls the appropriate virCommand* API to tell
    virCommand what to do between fork and exec.
    
    1) in the case of the DAC security driver, it calls
    virCommandSetUID/GID() to set a uid and gid that must be set for the
    child process.
    
    2) for the SELinux security driver, it calls
    virCommandSetSELinuxLabel() to save a copy of the char* that will be
    sent to setexeccon_raw() *after forking the child process*.
    
    3) for the AppArmor security drivers, it calls
    virCommandSetAppArmorProfile() to save a copy of the char* that will
    be sent to aa_change_profile() *after forking the child process*.
    
    With this new API in place, we will be able to remove
    virSecurityManagerSetProcessLabel() from any virCommand pre-exec
    hooks.
    
    (Unfortunately, the LXC driver uses clone() rather than virCommand, so
    it can't take advantage of this new security driver API, meaning that
    we need to keep around the older virSecurityManagerSetProcessLabel(),
    at least for now.)
    7bf1aa0b
security_nop.c 8.6 KB