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)主要支持"限制型"的訪問控制決策:當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相關的系統調用

 

參數分析,找出sendto系統調用正在發送的數據:

接下來要做的就是用自己hook 函數替換掉default_security_ops中的socket_sendmsg函數指針

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章