从【SELINUX】策略中学习【LSM】编写规则

本文介绍了如何从SELinux的LSM(Linux Security Modules)代码学习访问控制策略编写。通过分析内核源码中的hook机制和security_operations结构体,探讨了avc_has_perm_noaudit函数在决策过程中的作用,该函数检查策略并决定操作的合法性。作者分享了自己在XEN和KVM领域的经验,并鼓励学习和交流。
摘要由CSDN通过智能技术生成

最近涉及到了LSM的编写,在网上基本上搜不到关于LSM的编写规则和使用方法,LSM是我觉得菜鸟非常适合的一种访问控制策略编写,所以今天从SELinux的LSM代码学习。

在内核源码/security/SELinux中hook.c中定义了LSM模块的hook机制。hook主要根据的是struct security_operations结构体,里面提供了各种函数的回调机制。

struct security_operations {
      int (*ptrace) (struct task_struct * parent, struct task_struct * child);
      int (*capget) (struct task_struct * target,
                   kernel_cap_t * effective,
                   kernel_cap_t * inheritable, kernel_cap_t * permitted);
      int (*capset_check) (struct task_struct * target,
                        kernel_cap_t * effective,
                        kernel_cap_t * inheritable,
                        kernel_cap_t * permitted);
      void (*capset_set) (struct task_struct * target,
                       kernel_cap_t * effective,
                       kernel_cap_t * inheritable,
                       kernel_cap_t * permitted);
      int (*capable) (struct task_struct * tsk, int cap);
      int (*acct) (struct file * file);
      int (*sysctl) (struct ctl_table * table, int op);
      int (*quotactl) (int cmds, int type, int id, struct super_block * sb);
      int (*quota_on) (struct dentry * dentry);
      int (*syslog) (int type);
      int (*settime) (struct timespec *ts, struct timezone *tz);
      int (*vm_enough_memory) (long pages);
 
      int (*bprm_alloc_security) (struct linux_binprm * bprm);
      void (*bprm_free_security) (struct linux_binprm * bprm);
      void (*bprm_apply_creds) (struct linux_binprm * bprm, int unsafe);
      void (*bprm_post_apply_creds) (struct linux_binprm * bprm);
      int (*bprm_set_security) (struct linux_binprm * bprm);
      int (*bprm_check_security) (struct linux_binprm * bprm);
      int (*bprm_secureexec) (struct linux_binprm * bprm);
 
      int (*sb_alloc_security) (struct super_block * sb);
      void (*sb_free_security) (struct super_block * sb);
      int (*sb_copy_data)(struct file_system_type *type,
                       void *orig, void *copy);
      int (*sb_kern_mount) (struct super_block *sb, void *data);
      int (*sb_statfs) (struct dentry *dentry);
      int (*sb_mount) (char *dev_name, struct nameidata * nd,
                     char *type, unsigned long flags, void *data);
      int (*sb_check_sb) (struct vfsmount * mnt, struct nameidata * nd);
      int (*sb_umount) (struct vfsmount * mnt, int flags);
      void (*sb_umount_close) (struct vfsmount * mnt);
      void (*sb_umount_busy) (struct vfsmount * mnt);
      void (*sb_post_remount) (struct vfsmount * mnt,
                            unsigned long flags, void *data);
      void (*sb_post_mountroot) (void);
      void (*sb_post_addmount) (struct vfsmount * mnt,
                            struct nameidata * mountpoint_nd);
      int (*sb_pivotroot) (struct nameidata * old_nd,
                        struct nameidata * new_nd);
      void (*sb_post_pivotroot) (struct nameidata * old_nd,
                             struct nameidata * new_nd);
 
      int (*inode_alloc_security) (struct inode *inode);
      void (*inode_free_security) (struct inode *inode);
      int (*inode_init_security) (struct inode *inode, struct inode *dir,
                              char **name, void **value, size_t *len);
      int (*inode_create) (struct inode *dir,
                          struct dentry *dentry, int mode);
      int (*inode_link) (struct dentry *old_dentry,
                        struct inode *dir, struct dentry *new_dentry
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值