1. 18 6月, 2020 2 次提交
  2. 17 4月, 2020 1 次提交
    • M
      security: Introduce virSecurityManagerDomainSetPathLabelRO · 55cbb94e
      Michal Privoznik 提交于
      This API allows drivers to separate out handling of @stdin_path
      of virSecurityManagerSetAllLabel(). The thing is, the QEMU driver
      uses transactions for virSecurityManagerSetAllLabel() which
      relabels devices from inside of domain's namespace. This is what
      we usually want. Except when resuming domain from a file. The
      file is opened before any namespace is set up and the FD is
      passed to QEMU to read the migration stream from. Because of
      this, the file lives outside of the namespace and if it so
      happens that the file is a block device (i.e. it lives under
      /dev) its copy will be created in the namespace. But the FD that
      is passed to QEMU points to the original living in the host and
      not in the namespace. So relabeling the file inside the namespace
      helps nothing.
      
      But if we have a separate API for relabeling the restore file
      then the QEMU driver can continue calling
      virSecurityManagerSetAllLabel() with transactions enabled and
      call this new API without transactions.
      
      We already have an API for relabeling a single file
      (virSecurityManagerDomainSetPathLabel()) but in case of SELinux
      it uses @imagelabel (which allows RW access) and we want to use
      @content_context (which allows RO access).
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      Reviewed-by: NErik Skultety <eskultet@redhat.com>
      55cbb94e
  3. 15 10月, 2019 1 次提交
  4. 14 10月, 2019 3 次提交
    • M
      security_stack: Perform rollback if one of stacked drivers fails · 9d03e9ad
      Michal Privoznik 提交于
      In order to have multiple security drivers hidden under one
      virSecurity* call, we have virSecurityStack driver which holds a
      list of registered security drivers and for every virSecurity*
      call it iterates over the list and calls corresponding callback
      in real security drivers. For instance, for
      virSecurityManagerSetAllLabel() it calls
      domainSetSecurityAllLabel callback sequentially in NOP, DAC and
      (possibly) SELinux or AppArmor drivers. This works just fine if
      the callback from every driver returns success. Problem arises
      when one of the drivers fails. For instance, aforementioned
      SetAllLabel() succeeds for DAC but fails in SELinux in which
      case all files that DAC relabelled are now owned by qemu:qemu (or
      whomever runs qemu) and thus permissions are leaked. This is even
      more visible with XATTRs which remain set for DAC.
      
      The solution is to perform a rollback on failure, i.e. call
      opposite action on drivers that succeeded.
      
      I'm providing rollback only for set calls and intentionally
      omitting restore calls for two reasons:
      
      1) restore calls are less likely to fail (they merely remove
      XATTRs and chown()/setfilecon() file - all of these operations
      succeeded in set call),
      
      2) we are not really interested in restore failures - in a very
      few places we check for retval of a restore function we do so
      only to print a warning.
      
      Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1740024Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      Reviewed-by: NCole Robinson <crobinso@redhat.com>
      9d03e9ad
    • M
      security_stack: Turn list of nested drivers into a doubly linked list · cd355a52
      Michal Privoznik 提交于
      In near future we will need to walk through the list of internal
      drivers in reversed order. The simplest solution is to turn
      singly linked list into a doubly linked list.
      We will not need to start from the end really, so there's no tail
      pointer kept.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      Reviewed-by: NCole Robinson <crobinso@redhat.com>
      cd355a52
    • M
      security: Pass @migrated to virSecurityManagerSetAllLabel · 458d0a8c
      Michal Privoznik 提交于
      In upcoming commits, virSecurityManagerSetAllLabel() will perform
      rollback in case of failure by calling
      virSecurityManagerRestoreAllLabel(). But in order to do that, the
      former needs to have @migrated argument so that it can be passed
      to the latter.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      Reviewed-by: NCole Robinson <crobinso@redhat.com>
      458d0a8c
  5. 03 7月, 2019 1 次提交
  6. 31 1月, 2019 1 次提交
  7. 16 11月, 2018 1 次提交
  8. 06 6月, 2018 1 次提交
    • S
      security: Label the external swtpm with SELinux labels · 2fc665bb
      Stefan Berger 提交于
      In this patch we label the swtpm process with SELinux labels. We give it the
      same label as the QEMU process has. We label its state directory and files
      as well. We restore the old security labels once the swtpm has terminated.
      
      The file and process labels now look as follows:
      
      Directory: /var/lib/libvirt/swtpm
      
      [root@localhost swtpm]# ls -lZ
      total 4
      rwx------. 2 tss  tss  system_u:object_r:svirt_image_t:s0:c254,c932 4096 Apr  5 16:46 testvm
      
      [root@localhost testvm]# ls -lZ
      total 8
      -rw-r--r--. 1 tss tss system_u:object_r:svirt_image_t:s0:c254,c932 3648 Apr  5 16:46 tpm-00.permall
      
      The log in /var/log/swtpm/libvirt/qemu is labeled as follows:
      
      -rw-r--r--. 1 tss tss system_u:object_r:svirt_image_t:s0:c254,c932 2237 Apr  5 16:46 vtpm.log
      
      [root@localhost 485d0004-a48f-436a-8457-8a3b73e28567]# ps auxZ | grep swtpm | grep ctrl | grep -v grep
      system_u:system_r:svirt_t:s0:c254,c932 tss 25664 0.0  0.0 28172  3892 ?        Ss   16:57   0:00 /usr/bin/swtpm socket --daemon --ctrl type=unixio,path=/var/run/libvirt/qemu/swtpm/testvm-swtpm.sock,mode=0660 --tpmstate dir=/var/lib/libvirt/swtpm/testvm/tpm1.2 --log file=/var/log/swtpm/libvirt/qemu/testvm-swtpm.log
      
      [root@localhost 485d0004-a48f-436a-8457-8a3b73e28567]# ps auxZ | grep qemu | grep tpm | grep -v grep
      system_u:system_r:svirt_t:s0:c254,c932 qemu 25669 99.0  0.0 3096704 48500 ?    Sl   16:57   3:28 /bin/qemu-system-x86_64 [..]
      Signed-off-by: NStefan Berger <stefanb@linux.vnet.ibm.com>
      Reviewed-by: NJohn Ferlan <jferlan@redhat.com>
      Reviewed-by: NJán Tomko <jtomko@redhat.com>
      2fc665bb
  9. 10 1月, 2018 1 次提交
    • C
      security: full path option for DomainSetPathLabel · a5486e57
      Christian Ehrhardt 提交于
      virSecurityManagerDomainSetPathLabel is used to make a path known
      to the security modules, but today is used interchangably for
       - paths to files/dirs to be accessed directly
       - paths to a dir, but the access will actually be to files therein
      
      Depending on the security module it is important to know which of
      these types it will be.
      
      The argument allowSubtree augments the call to the implementations of
      DomainSetPathLabel that can - per security module - decide if extra
      actions shall be taken.
      
      For now dac/selinux handle this as before, but apparmor will make
      use of it to add a wildcard to the path that was passed.
      Signed-off-by: NChristian Ehrhardt <christian.ehrhardt@canonical.com>
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      a5486e57
  10. 05 12月, 2017 1 次提交
  11. 25 11月, 2017 1 次提交
  12. 16 6月, 2017 1 次提交
  13. 27 4月, 2017 1 次提交
  14. 15 3月, 2017 1 次提交
  15. 10 1月, 2017 1 次提交
    • M
      security driver: Introduce transaction APIs · 95576b4d
      Michal Privoznik 提交于
      With our new qemu namespace code in place, the relabelling of
      devices is done not as good is it could: a child process is
      spawned, it enters the mount namespace of the qemu process and
      then runs desired API of the security driver.
      
      Problem with this approach is that internal state transition of
      the security driver done in the child process is not reflected in
      the parent process. While currently it wouldn't matter that much,
      it is fairly easy to forget about that. We should take the extra
      step now while this limitation is still fresh in our minds.
      
      Three new APIs are introduced here:
        virSecurityManagerTransactionStart()
        virSecurityManagerTransactionCommit()
        virSecurityManagerTransactionAbort()
      
      The Start() is going to be used to let security driver know that
      we are starting a new transaction. During a transaction no
      security labels are actually touched, but rather recorded and
      only at Commit() phase they are actually updated. Should
      something go wrong Abort() aborts the transaction freeing up all
      memory allocated by transaction.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      95576b4d
  16. 08 12月, 2016 1 次提交
  17. 19 4月, 2016 1 次提交
  18. 15 12月, 2015 1 次提交
  19. 24 8月, 2015 1 次提交
  20. 09 7月, 2014 1 次提交
    • P
      security: Introduce APIs to label single images · 1797128e
      Peter Krempa 提交于
      Add security driver functions to label separate storage images using the
      virStorageSource definition. This will help to avoid the need to do ugly
      changes to the disk struct and use the source directly.
      1797128e
  21. 26 6月, 2014 2 次提交
  22. 20 6月, 2014 2 次提交
  23. 21 3月, 2014 1 次提交
  24. 31 10月, 2013 1 次提交
    • E
      maint: avoid further typedef accidents · fb861352
      Eric Blake 提交于
      To make it easier to forbid future attempts at a confusing typedef
      name ending in Ptr that isn't actually a pointer, insist that we
      follow our preferred style of 'typedef foo *fooPtr'.
      
      * cfg.mk (sc_forbid_const_pointer_typedef): Enforce consistent
      style, to prevent issue fixed in previous storage patch.
      * src/conf/capabilities.h (virCapsPtr): Fix offender.
      * src/security/security_stack.c (virSecurityStackItemPtr):
      Likewise.
      * tests/qemucapabilitiestest.c (testQemuDataPtr): Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      fb861352
  25. 29 10月, 2013 1 次提交
  26. 19 7月, 2013 2 次提交
    • E
      security: fix deadlock with prefork · bfc183c1
      Eric Blake 提交于
      Attempts to start a domain with both SELinux and DAC security
      modules loaded will deadlock; latent problem introduced in commit
      fdb3bde3 and exposed in commit 29fe5d74.  Basically, when recursing
      into the security manager for other driver's prefork, we have to
      undo the asymmetric lock taken at the manager level.
      
      Reported by Jiri Denemark, with diagnosis help from Dan Berrange.
      
      * src/security/security_stack.c (virSecurityStackPreFork): Undo
      extra lock grabbed during recursion.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      bfc183c1
    • E
      security: framework for driver PreFork handler · fdb3bde3
      Eric Blake 提交于
      A future patch wants the DAC security manager to be able to safely
      get the supplemental group list for a given uid, but at the time
      of a fork rather than during initialization so as to pick up on
      live changes to the system's group database.  This patch adds the
      framework, including the possibility of a pre-fork callback
      failing.
      
      For now, any driver that implements a prefork callback must be
      robust against the possibility of being part of a security stack
      where a later element in the chain fails prefork.  This means
      that drivers cannot do any action that requires a call to postfork
      for proper cleanup (no grabbing a mutex, for example).  If this
      is too prohibitive in the future, we would have to switch to a
      transactioning sequence, where each driver has (up to) 3 callbacks:
      PreForkPrepare, PreForkCommit, and PreForkAbort, to either clean
      up or commit changes made during prepare.
      
      * src/security/security_driver.h (virSecurityDriverPreFork): New
      callback.
      * src/security/security_manager.h (virSecurityManagerPreFork):
      Change signature.
      * src/security/security_manager.c (virSecurityManagerPreFork):
      Optionally call into driver, and allow returning failure.
      * src/security/security_stack.c (virSecurityDriverStack):
      Wrap the handler for the stack driver.
      * src/qemu/qemu_process.c (qemuProcessStart): Adjust caller.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      fdb3bde3
  27. 11 7月, 2013 1 次提交
  28. 10 7月, 2013 1 次提交
  29. 14 2月, 2013 1 次提交
    • 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
  30. 11 2月, 2013 1 次提交
  31. 21 12月, 2012 2 次提交
  32. 18 12月, 2012 1 次提交
  33. 12 12月, 2012 1 次提交
    • S
      add security hook for permitting hugetlbfs access · 88bd1a64
      Serge Hallyn 提交于
      When a qemu domain is backed by huge pages, apparmor needs to grant the domain
      rw access to files under the hugetlbfs mount point.  Add a hook, called in
      qemu_process.c, which ends up adding the read-write access through
      virt-aa-helper.  Qemu will be creating a randomly named file under the
      mountpoint and unlinking it as soon as it has mmap()d it, therefore we
      cannot predict the full pathname, but for the same reason it is generally
      safe to provide access to $path/**.
      Signed-off-by: NSerge Hallyn <serge.hallyn@ubuntu.com>
      88bd1a64