[libvirt] [PATCH] Include pid namespace inode in LXC audit messages

Gao feng gaofeng at cn.fujitsu.com
Mon Mar 11 08:27:58 UTC 2013


On 2013/03/06 23:10, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> To allow the efficient correlation of container audit messages
> with host hosts, include the pid namespace inode in audit
> messages.
> 
> The resulting audit message will be
> 
> type=VIRT_CONTROL msg=audit(1362582468.378:50): pid=19284 uid=0 auid=0 ses=312 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='virt=lxc op=init vm="demo" uuid=0770f019-2d4e-09e9-8e4a-719e12b3a18e vm-pid=19620 init-pid=19622 pid-ns=23434 exe="/home/berrange/src/virt/libvirt/daemon/.libs/lt-libvirtd" hostname=? addr=? terminal=pts/6 res=success'
> 
> Note the 'pid-ns' field showing the inode number of the PID
> namespace of the container init process. Since /proc/PID/ns/pid
> doesn't exist on older kernels, we keep the previous 'init-pid'
> field too, showing the host PID of the init process.
> 

The inode numbers of /proc/PID/ns/pid are different even two task
in the same pid namespace...

We can't use this inode number to identify pid namespace.
Or I misunderstand what's the purpose of this patch?

> ---
>  src/conf/domain_audit.c |  8 +++++---
>  src/conf/domain_audit.h |  3 ++-
>  src/lxc/lxc_process.c   | 44 +++++++++++++++++++++++++++++++++++++++++++-
>  3 files changed, 50 insertions(+), 5 deletions(-)
> 
> diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c
> index c00bd11..8cd522a 100644
> --- a/src/conf/domain_audit.c
> +++ b/src/conf/domain_audit.c
> @@ -649,7 +649,8 @@ virDomainAuditStart(virDomainObjPtr vm, const char *reason, bool success)
>  
>  void
>  virDomainAuditInit(virDomainObjPtr vm,
> -                   pid_t initpid)
> +                   pid_t initpid,
> +                   ino_t pidns)
>  {
>      char uuidstr[VIR_UUID_STRING_BUFLEN];
>      char *vmname;
> @@ -668,8 +669,9 @@ virDomainAuditInit(virDomainObjPtr vm,
>      }
>  
>      VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, true,
> -              "virt=%s op=init %s uuid=%s vm-pid=%lld init-pid=%lld",
> -              virt, vmname, uuidstr, (long long)vm->pid, (long long)initpid);
> +              "virt=%s op=init %s uuid=%s vm-pid=%lld init-pid=%lld pid-ns=%lld",
> +              virt, vmname, uuidstr, (long long)vm->pid, (long long)initpid,
> +              (long long)pidns);
>  
>      VIR_FREE(vmname);
>  }
> diff --git a/src/conf/domain_audit.h b/src/conf/domain_audit.h
> index 381fe37..9486216 100644
> --- a/src/conf/domain_audit.h
> +++ b/src/conf/domain_audit.h
> @@ -32,7 +32,8 @@ void virDomainAuditStart(virDomainObjPtr vm,
>                           bool success)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
>  void virDomainAuditInit(virDomainObjPtr vm,
> -                        pid_t pid)
> +                        pid_t pid,
> +                        ino_t pidns)
>      ATTRIBUTE_NONNULL(1);
>  void virDomainAuditStop(virDomainObjPtr vm,
>                          const char *reason)
> diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
> index aaa81a7..5f4a3aa 100644
> --- a/src/lxc/lxc_process.c
> +++ b/src/lxc/lxc_process.c
> @@ -630,6 +630,36 @@ static void virLXCProcessMonitorExitNotify(virLXCMonitorPtr mon ATTRIBUTE_UNUSED
>                priv->stopReason, status);
>  }
>  
> +static int
> +virLXCProcessGetNsInode(pid_t pid,
> +                        const char *nsname,
> +                        ino_t *inode)
> +{
> +    char *path = NULL;
> +    struct stat sb;
> +    int ret = -1;
> +
> +    if (virAsprintf(&path, "/proc/%llu/ns/%s",
> +                    (unsigned long long)pid, nsname) < 0) {
> +        virReportOOMError();
> +        goto cleanup;
> +    }
> +
> +    if (stat(path, &sb) < 0) {
> +        virReportSystemError(errno,
> +                             _("Unable to stat %s"), path);
> +        goto cleanup;
> +    }
> +
> +    *inode = sb.st_ino;
> +    ret = 0;
> +
> +cleanup:
> +    VIR_FREE(path);
> +    return ret;
> +}
> +
> +
>  /* XXX a little evil */
>  extern virLXCDriverPtr lxc_driver;
>  static void virLXCProcessMonitorInitNotify(virLXCMonitorPtr mon ATTRIBUTE_UNUSED,
> @@ -637,8 +667,20 @@ static void virLXCProcessMonitorInitNotify(virLXCMonitorPtr mon ATTRIBUTE_UNUSED
>                                             virDomainObjPtr vm)
>  {
>      virLXCDomainObjPrivatePtr priv = vm->privateData;
> +    ino_t inode;
> +
>      priv->initpid = initpid;
> -    virDomainAuditInit(vm, initpid);
> +
> +    if (virLXCProcessGetNsInode(initpid, "pid", &inode) < 0) {
> +        virErrorPtr err = virGetLastError();
> +        VIR_WARN("Cannot obtain pid NS inode for %llu: %s",
> +                 (unsigned long long)initpid,
> +                 err && err->message ? err->message : "<unknown>");
> +        virResetLastError();
> +    } else {
> +        inode = 0;
> +    }
> +    virDomainAuditInit(vm, initpid, inode);
>  
>      if (virDomainSaveStatus(lxc_driver->caps, lxc_driver->stateDir, vm) < 0)
>          VIR_WARN("Cannot update XML with PID for LXC %s", vm->def->name);
> 




More information about the libvir-list mailing list