linux安全加固技术--内核安全模块LSM

Linux安全相关技术

  • SELinux
  • AppArmor
  • openSSL
  • TPM
  • SGX
  • LSM

 

linux上六种常用的安全加固技术:

1 安全的编码(Secure Code),减少编写的错误。

2 应用层漏洞缓解技术(Application-level exploitation)(SSP,relro)

3 系统级漏洞缓解技术(System-level exploit mitigation)(ASLR,NX),

4 降权处理(Privilege Dropping)(Sandboxing)

5 强制访问控制(Mandatory access control)(MAC,SELinux)

6 更新策略(Update strategy)

 

feature

SELinux

AppArmor

grsecurity

Automated

No (audit2allow and system-config-selinux)

Yes (Yast wizard)

Yes (auto traning / gradm)

Powerful policy setup

Yes (very complex)

Yes

Yes

Default and recommended integration

CentOS / RedHat / Debian

Suse / OpenSuse

Any Linux distribution

Training and vendor support

Yes (Redhat)

Yes (Novell)

No (community forum and lists)

Recommend for

Advanced user

New / advanced user

New users

Feature

Pathname based system does not require labelling or relabelling filesystem

Attaches labels to all files, processes and objects

A

 

监控网络在主防领域是一个必须要完成的任务,下面以监控发送数据的系统调用API sendto为例讲解实现思路,首先,找到合适的监控点,我们先来看一看sendto系统调用的调用栈:

 

linux在构架设计时,还是考虑到了安全需求,在/include/linux/security.h文件定义了安全相关的操作集合

linux安全加固技术--内核安全模块LSM_第1张图片

Linux安全模块(LSM)主要支持"限制型"的访问控制决策:当Linux内核授予文件或目录访问权限时,Linux安全模块(LSM)可能会拒绝,而当 Linux内核拒绝访问时,可以跳过LSM。

新的安全模块由register_security注册

能够操作的内核内部对象:

  1. task_struct结构:代表任务(进程)
  2. linux_binprm结构:代表程序
  3. super_block结构:代表文件系统
  4. inode结构:代表管道,文件,或者Socket套接字
  1. file结构:代表打开的文件
  1. sk_buff结构:代表网络缓冲区(包)
  1. net_device结构:代表网络设备
  1. kern_ipc_perm结构:代表Semaphore信号,共享内存段,或者消息队列
  1. msg_msg:代表单个的消息

            LSM接口的核心是security_ops,当系统启动时,他们被初始化为传统的DAC策略。传统DAC访问控制是指控制系统中的主体(如进程)对系统中的客体(如文件目录、文件)的访问(读、写和执行等)。自主访问控制DAC 是指主体(进程,用户)对客体(文件、目录、特殊设备文件、IPC等)的访问权限是由客体的属主或超级用户决定的,而且此权限一旦确定,将作为以后判断主体对客体是否有访问权限的依据。

 

以Linus Torvalds为代表的内核开发人员对Linux安全模块(LSM)提出了三点要求:

只有Gentoo和Debian Mempo提供了直接使用Grsecurity/PaX的途径

1、真正的通用,当使用一个不同的安全模型的时候,只需要加载一个不同的内核模块。

2、概念上简单,对Linux内核影响最小,高效,并且。

3、能够支持现存的POSIX.1e capabilities逻辑,作为一个可选的安全模块

 

struct security_operations {

char name[SECURITY_NAME_MAX + 1];

          。。。。。

int (*unix_stream_connect) (struct sock *sock, struct sock *other, struct sock *newsk);

int (*unix_may_send) (struct socket *sock, struct socket *other);

 

int (*socket_create) (int family, int type, int protocol, int kern);

int (*socket_post_create) (struct socket *sock, int family,

   int type, int protocol, int kern);

int (*socket_bind) (struct socket *sock,

    struct sockaddr *address, int addrlen);

int (*socket_connect) (struct socket *sock,

       struct sockaddr *address, int addrlen);

int (*socket_listen) (struct socket *sock, int backlog);

int (*socket_accept) (struct socket *sock, struct socket *newsock);

int (*socket_sendmsg) (struct socket *sock,

       struct msghdr *msg, int size);

int (*socket_recvmsg) (struct socket *sock,

       struct msghdr *msg, int size, int flags);

int (*socket_getsockname) (struct socket *sock);

int (*socket_getpeername) (struct socket *sock);

int (*socket_getsockopt) (struct socket *sock, int level, int optname);

int (*socket_setsockopt) (struct socket *sock, int level, int optname);

int (*socket_shutdown) (struct socket *sock, int how);

int (*socket_sock_rcv_skb) (struct sock *sk, struct sk_buff *skb);

int (*socket_getpeersec_stream) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len);

int (*socket_getpeersec_dgram) (struct socket *sock, struct sk_buff *skb, u32 *secid);

int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority);

           。。。。。。

    }

 

   用crash查看default_security_ops里定义的socket相关的系统调用

linux安全加固技术--内核安全模块LSM_第2张图片

 

参数分析,找出sendto系统调用正在发送的数据:

linux安全加固技术--内核安全模块LSM_第3张图片

接下来要做的就是用自己hook 函数替换掉default_security_ops中的socket_sendmsg函数指针

你可能感兴趣的:(linux内核研究)