Linux安全新高度 安全增强Linux (SELinux) 剖析

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入

  在访问内部对象之前对内核代码进行修改,以调用一个代表实施函数的钩子,该实施函数实现安全策略。该函数根据预定义的策略验证操作能否继续进行。安全函数存储在一个安全操作结构中,该结构包含必须受到保护的基本操作。例如,security_socket_create 钩子(security_ops->socket_create)在创建新 socket 之前检查权限,并考虑协议集、类型、协议,以及 socket 是在内核中创建还是在用户空间中创建。清单 1 提供了 socket.c 中用于创建 socket 的示例代码。

  清单 1. 创建 socket 的内核代码

   static int __sock_create(int family, int type, int protocol,   struct socket **res, int kern)   {   int err;   struct socket *sock;   /*   * Check protocol is in range   */   if (family < 0 || family >= NPROTO)   return -EAFNOSUPPORT;   if (type < 0 || type >= SOCK_MAX)   return -EINVAL;   err = security_socket_create(family, type, protocol, kern);   if (err)   return err;   …

  security_socket_create 函数在 ./linux/include/linux/security.h 中定义。它提供了从 security_socket_create 到 security_ops 结构中动态安装的函数的间接调用(参见清单 2)。

  清单 2. 用于 socket 创建检查的间接调用

   static inline int security_socket_create (int family, int type,   int protocol, int kern)   {   return security_ops->socket_create(family, type, protocol, kern);   }

  security_ops 结构中的函数通过安全模块安装。在本例中,这些钩子在可载入的 SELinux 内核模块中定义。每个 SELinux 调用在 hooks 文件内部定义,该文件实现从内核函数到特定安全模块的动态调用的间接性(参见清单 3 中的 …/linux/security/selinux/hooks.c 代码)。

  清单 3. SELinux socket 创建检查

   static int selinux_socket_create(int family, int type,   int protocol, int kern)   {   int err = 0;   struct task_security_struct *tsec;   if (kern)   goto out;   tsec = current->security;   err = avc_has_perm(tsec->sid, tsec->sid,   socket_type_to_security_class(family, type,   protocol), SOCKET__create, NULL);   out:   return err;   }

  清单 3 的核心部分是一个调用,用于验证当前操作是否是当前任务(通过 current->security 定义,其中 current 代表当前正在执行的任务)所允许的。访问向量缓存(Access Vector Cache,AVC)缓存了之前的 SELinux 决策(提高进程的性能)。此调用包括源安全标识符(sid)、安全类(根据请求操作的详细信息构造)、特定 socket 调用,以及可选的辅助审计数据。如果未在缓存中找到决策,那么会调用安全服务器来获取决策(此过程如图 2 所示)。

  图 2. 分层 Linux 安全进程

[1][2][3]

就得加倍付出汗水,赢得场场精彩

Linux安全新高度 安全增强Linux (SELinux) 剖析

相关文章:

你感兴趣的文章:

标签云: