首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 密钥保留服务入门(1)

Linux 密钥保留服务入门(1)

Linux 密钥保留服务(Linux key retention service)是在 Linux 2.6 中引入的,它的主要意图是在 Linux 内核中缓存身份验证数据。远程文件系统和其他内核服务可以使用这个服务来管理密码学、身份验证标记、跨域用户映射和其他安全问题。它还使 Linux 内核能够快速访问所需的密钥,并可以用来将密钥操作(比如添加、更新和删除)委托给用户空间。
本文将概述 Linux 密钥保留服务,定义它的术语,帮助您快速掌握 Linux 密钥的使用方法。您将通过示例代码了解如何在内核模块中使用 Linux 密钥保留服务。在编写本文时使用的内核版本是 2.6.20。
什么是密钥?密钥(key)是一组密码学数据、身份验证标记或某些相似的元素,它在内核中由 struct key 表示。在 Linux 内核源代码中,struct key 是在 include/linux/key.h 下定义的。
清单 1 给出 struct key 中一些重要的字段。注意,为了支持密钥,已经修改了 task_struct、user_struct 和 signal_struct。
清单 1. struct key 中的重要字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct key {
      atomic_t                 usage;       /* number of references */
      key_serial_t           serial;        /* key serial number */
      struct key_type      *type;        /* type of key */
      time_t                     expiry;  /* time at which key expires (or 0) */
      uid_t                       uid;           /* UID */
      gid_t                       gid;           /* GID */
      key_perm_t            perm;        /* access permissions */
      unsigned short       quotalen;   /* length added to quota */
      unsigned short       datalen;     /* payload data length
      char                      *description;
      union {
          unsigned long             value;
          void                            *data;
          struct keyring_list       *subscriptions;
      } payload;                                 /* Actual security data */
      ....
      ....
};




密钥的属性密钥具有以下属性:
  • 序号(Serial number):一个惟一的 32 位非零正数。
  • 类型(Type):Linux 密钥保留服务定义两个标准密钥类型:user 和 keyring。要添加新的密钥类型,必须由一个内核服务注册它。用户空间程序不允许创建新的密钥类型。密钥类型在内核中由 struct key_type 表示,这是在 include/linux/key.h 中定义的。key_type 结构的一些重要字段见清单 2。          清单 2. key_type 的重要字段
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    struct key_type {
        const char *name;
        size_t def_datalen;
         
        /* Operations that can be defined for a key_type */
        int (*instantiate)(struct key *key, const void *data, size_t datalen);
        int (*update)(struct key *key, const void *data, size_t datalen);
        int (*match)(const struct key *key, const void *desc);
        void (*revoke)(struct key *key);
        void (*destroy)(struct key *key);
        void (*describe)(const struct key *key, struct seq_file *p);
        long (*read)(const struct key *key, char __user *buffer, size_t buflen);
        ....
        ....
    };





              还可以将一组操作与一个密钥类型相关联。key_type 可以定义以下操作:
    • instantiate 创建指定类型的一个新密钥。
    • describe 输出描述这个密钥的文本。
    • match 根据描述搜索密钥。
    • destroy 清除与一个密钥相关的所有数据。
    • request_key 搜索密钥。
    • revoke 清除密钥数据并将密钥的状态改为 REVOKED。
    • read 读取密钥数据。
    • update 修改密钥。
  • 描述(Description):一个描述密钥的可输出字符串。这个属性还可以用来执行搜索操作。
  • 访问控制信息(Access control information):每个密钥有一个所有者 ID、一个 GID 和一个权限掩码,权限掩码表示如何响应用户级或内核级程序。权限掩码给四个可能的密钥访问者类型各分配 8 位:所有者、用户、组和其他。在这 8 位中,只定义了 6 位。可能的权限如下:
    • View 允许权限持有者查看密钥属性。
    • Read 允许权限持有者读取密钥并列出 keyring 的密钥。
    • Write 允许权限持有者修改密钥或 keyring 的有效内容和修改链接的密钥。
    • Search 允许权限持有者搜索 keyring 和寻找密钥。
    • Link 允许权限持有者将特定的密钥或 keyring 链接到 keyring。
    • Set Attribute 允许权限持有者设置密钥的 UID、GID 和权限掩码。
  • 过期时间(Expiry Time):密钥的生存期。密钥也可以是永久的。
  • 有效内容(Payload):实际的安全内容。可以通过 struct key_type 定义的操作用数据对有效内容进行实例化,还可以读取数据或修改数据。对于内核来说,有效内容仅仅是一组数据。
  • 状态(State):密钥可以处于以下状态:
    • UNINSTANTIATED:已经创建了密钥,但是还没有附加任何数据。
    • INSTANTIATED:密钥已经实例化并附加了数据;这是一个完整的 状态。
    • NEGATIVE:这是一个临时状态,表示前面对用户空间的调用失败了。
    • EXPIRED:表示密钥已经超过了预定义的生存期。
    • REVOKED:一个用户空间操作将密钥转移到这个状态。
    • DEAD:key_type 取消了注册。
密钥类型有两种预定义的密钥类型:keyring 和 user。
keyring 包含一组到其他密钥或 keyring 的链接。有六种标准的 keyring:
  • 线程特有的
  • 进程特有的
  • 会话特有的
  • 用户特有的会话
  • 用户默认的会话
  • 组特有的(还未实现)
限额对于一个用户可以拥有的密钥和 keyring 的数量有限制(密钥数量限额),对于在密钥描述和有效内容中使用的信息量也有限制(密钥大小限额)。进程特有的和线程特有的 keyring 不在用户限额的范围内。

只有前三个 keyring 被自动搜索,自动搜索会按照次序进行。第四种类型(用户特有的会话 keyring)不被直接搜索,但是,它通常会链接到一个会话特有的 keyring。登录进程(比如 PAM)将绑定到用户默认的会话 keyring,直到创建另一个会话为止。
用户密钥由用户空间程序操作。
返回列表