Linux安全相关技术
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注册
能够操作的内核内部对象:
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函数指针