《Linux系统安全参考》由会员分享,可在线阅读,更多相关《Linux系统安全参考(60页珍藏版)》请在金锄头文库上搜索。
1、网络与信息安全系统安全:Linux系统安全第 04 讲 Linux系统安全(参考)内 容nLinux系统介绍qLinux内核qLinux文件系统nLinux的网络结构nLinux攻防技术n一次针对Linux的入侵过程第 04 讲 Linux系统安全(参考)Linux操作系统n背景q最初由Linus Benedict Torvalds于1991年开发的q1994年3月发布第一个正式版本q内核升级模式n稳定的内核,第二个数字为偶数,例如2.2.14n开发的内核,第二个数字为奇数,例如2.1.14nLinux系统特点q兼容UNIX:API兼容,管理命令和各种工具q源码开放q支持各种硬件平台,支持多C
2、PUqLinux平台上存在大量的应用软件,以及应用开发工具第 04 讲 Linux系统安全(参考)Linux内核n多用户,多任务,分时,软实时处理n不是微内核系统,但具有某些微内核特征nIntel版本:i386的保护模式,特权级q内核态(0)和用户态(3)q中断和系统调用两种特权级的切换nPCB:进程控制块,常驻内存n进程是最基本的调度单元q进程是动态的,每一个进程都有一个进程控制块q没有专门的调度进程,内核中有一个schedule函数完成调度任务q进程在调度过程中有多种状态第 04 讲 Linux系统安全(参考)进程调度:状态转换图TASK_RUNNINGHolding CPUTASK_UN
3、INTERRUPTIBLETASK_INTERRUPTIBLETASK_ZOMBIETASK_STOPPEDdo_fork()schedule()时间片到do_exit()申请资源未果申请资源未果跟踪系统调用所申请资源有效时收到SIG_KILL或SIG_CONT后所申请资源有效或者收到信号时第 04 讲 Linux系统安全(参考)Linux的系统调用n编程接口,与POSIX兼容,C语言函数集合n实现形式与DOS的INT 21H相似qLinux使用int 80hn函数名“sys_xxx”q比如系统调用fork的相应函数sys_fork()n系统调用号和系统调用表n系统调用都转换为Int 80h软
4、中断n所有的系统调用只有一个入口system_calln出口: ret_from_sys_call第 04 讲 Linux系统安全(参考)Linux内存管理n在i386机器上,每个进程有独立的4G虚存空间n32位线性地址利用硬件的分页机制n内核的代码段和数据段被映射到3G以上的空间中n用户态下的代码实际可申请的虚存空间为0-3GBn每个进程用两套段描述符来访问内存,分别用来访问内核态和用户态下的内存空间n在用户态下,代码不可能访问3G以上的地址空间,如果要访问内核空间,必须通过系统调用或者中断nLinux对虚存的管理使用vma(virtual memory area)机制n在进程数据结构中,指
5、定了用户空间的上界,在系统调用时,用户指定的指针不能超过此上界,但是内核代码可以重新设定此上界n页交换机制:缺页中断、页面换入第 04 讲 Linux系统安全(参考)Linux的的段选择符情况段选择符情况第 04 讲 Linux系统安全(参考)Linux的模块机制n可动态装载的内核模块(lkm)q一组命令:insmod/rmmod/lsmod/modprobe/n关于模块机制q可以让核心保持比较小的尺寸q动态装载,避免重新启动q模块机制常常用于设备驱动q内核模块一旦加载之后,与原有的核心代码同等q可动态装载的内核模块的一些缺点n可能会导致一定的性能损失,和内存开销n代码不规范的模块可能导致核心
6、崩溃q如果调用系统核心功能时,参数错误,同样会有问题第 04 讲 Linux系统安全(参考)Linux的模块机制原理ninsmod装载模块qLinux内核中有一个模块链表q首先通过一个特权级系统调用来找到核心的输出符号q然后将模块读入虚拟内存,并利用来自核心的输出符号,修改其未解析的核心例程和资源的引用地址q再次使用特权级系统调用来申请足够的空间来容纳新的核心模块,并拷贝到此内存空间中q每个模块必须包括初始化例程和注销例程,insmod将调用初始化代码,并执行一个特权级系统调用将模块的初始化与注销例程地址传递给核心nrmmod卸载模块q当一个模块不再被引用的时候,它可以被卸载q核心调用注销例程
7、,释放相应的核心资源q从模块链表中移除,它所占用的核心内存被回收第 04 讲 Linux系统安全(参考)内核中的ROOTKITn通过LKM机制,可以在系统内核中插入木马模块n一个典型的以Linux 2.2.x为基础的rootkit knarkq使用insmod knark.o就可以加载到内核中q一旦加载了knark后门之后n可以改变netstat的输出结果n可以改变运行进程的UID和GIDn可以不用SUID就能够获得root访问权限nn还有其他的ROOTKITS,比如adoren内核ROOTKITS的对策q根据每个rootkit的特征进行检测,然后设法删除q预防为主,安装内核检测系统,比如LI
8、DS第 04 讲 Linux系统安全(参考)Linux文件系统nLinux支持多种文件系统,包括ext、ext2、hpfs、vfat、ntfs、q通过虚拟文件系统VFS ,Linux操作系统可以支持不同类型的文件系统n文件系统类型管理q文件系统类型的注册途径:n在编译内核时确定n在文件系统作为模块装入时登记nextnext=0next第 04 讲 Linux系统安全(参考)虚拟文件系统(VFS)n是物理文件系统与服务之间的一个接口层,只存在于内存中n定义了关于各种特殊文件系统的公共接口抽象性qSuper_block、inode、文件操作函数入口q把所有的文件系统映射到同一个层次结构中,通过su
9、per_block与inode中的关联关系来实现,如下图所示n处理面向文件系统的通用操作n把针对文件系统的操作映射到相关的物理文件系统n许多复杂的cache机制,提高了文件系统的访问效率qVFS inode cacheqVFS directory cacheqBuffer cacheqrooti_mounti_sbs_coverds_mounted第 04 讲 Linux系统安全(参考)ext2文件系统n这是Linux系统专用的文件系统n文件也是分块存储,以块为整单位数据块三次间接块二次间接块一次间接块12个直接块数据块数据块数据块数据块数据块.组0组1组Ns_blockfs描述符 块位图 i
10、node位图 inode表数据块n数据结构qext2_super_blockqext2_inode: 内含一个32位的文件访问控制表和一个32位的目录访问控制表第 04 讲 Linux系统安全(参考)Linux文件系统的安全性nLinux文件系统安全模型与两个属性相关q文件的所有者(ownership)n文件所有者的idn文件所有者所在用户组的idq访问权限(access rights)n10个标志q第1个标志:d(目录), b(块系统设备), c(字符设备), .(普通文件)q第2-4个标志:所有者的读、写、执行权限q第5-7个标志:所有者所在组的读、写、执行权限q第8-10个标志:其他用户
11、的读、写、执行权限n用chmod修改权限:字符方式和数字方式第 04 讲 Linux系统安全(参考)Linux文件的安全性nSUID程序q正常情况下,一个程序在运行的时候,它的进程将属于当前用户q但是,对于SUID程序,它的进程不属于启动用户,而是属于该程序的所有者用户q通常,SUID/SGID程序中的bug往往是入侵的基础nmount和fstab命令q用mount装载文件系统的时候,可以使用一些选项控制文件系统的安全性,对于装载FAT系统比较有意义。qumash=Nquid=Nqgid=N第 04 讲 Linux系统安全(参考)Linux文件系统安全性n权限管理的不灵活q只能对所有者、所有者
12、所在组和其他用户分配权限,无法做到进一步的细致化nPOSIX ACLs for Linux软件包q内核补丁,可以做到用ACL来管理权限n需要重新编译内核,下载补丁:q两个命令:setfacl、getfacln真正删除文件q工具wipe第 04 讲 Linux系统安全(参考)Linux用户管理n用户文件/etc/passwdqShadow password: /etc/shadown此文件只对root可读n让用户拥有单独的组,而不是加入到共享的users组中qgroupaddn创建用户:useraddn改口令:passwdn管理口令的有效期qchage第 04 讲 Linux系统安全(参考)Li
13、nux中crypt口令加密方案ncrypt()是一个口令加密函数,它基于DES算法。我们可以认为这是一个单向加密操作n函数原型:char *crypt(const char *key, const char *salt);*salt是两个字符,每个字符可从a-zA-Z0-9./中选出来n算法qUNIX标准算法使用DES加密算法,用key对一个常量进行加密,获得一个13字节的密文编码输出,其中包括salt的两个字符from Red Hat Linux 6.2nSalt的作用q同样的口令产生不同的密文q增加了穷举空间n建议使用更为安全的MD5算法第 04 讲 Linux系统安全(参考)Linux中
14、Kerberos认证协议的支持n建立KDCq下载和安装Kerberos 5q配置Kerberosq启动服务n管理Kerberosqkadmin,管理Kerberos数据库n使用Kerberosqkinit,获得一个ticketqklist,列出所有的ticketsqkpasswd, 修改口令qkdestroy, 删除一个ticketq使用支持Kerberos的网络应用,例如ftp, telnet, 等第 04 讲 Linux系统安全(参考)PAM(Pluggable Authentication Modules)n一种可插入的认证机制n针对一个服务,指定一些认证相关的动作,放到/etc/pam
15、.conf文件中,或者放到/etc/pam.d/下与服务同名的配置文件中q每一行包含一个模块类型、一个控制级别、一个模块:service module-type control-flag module argsq例如passwd password required pam_cracklib.so type=user retry=3passwd password required pam_pwdb.so use_authtok第 04 讲 Linux系统安全(参考)PAM结构图logintelnetftp用户认证管理(auth)帐户管理(account)会话管理(session)口令管理(pas
16、sword)PAM配置文件管理员PAM APIUNIX认证Kerberos认证S/Key认证PAM SPIPAM核心库系统服务PAM服务模块第 04 讲 Linux系统安全(参考)Linux内核安全性nLinux内核机制存在的一些潜在缺陷q超级用户的特权可能会被滥用q系统文档不安全q系统内核可以比较容易地插入模块q内核中,进程不受保护第 04 讲 Linux系统安全(参考)Linux对网络的支持nLinux从UNIX继承了在网络方面的优势nLinux自身的发展也是与Internet息息相关的n介绍内容qLinux网络层次nLinux协议栈qLinux网络配置q内核防火墙第 04 讲 Linux
17、系统安全(参考)Linux中网络的层次结构BSD SocketsINET SocketsTCPUDPIPPPPSLIPEthernetARPUserKernelNetwork ApplicationsSocket InterfaceProtocol LayersNetwork DevicesAppletalkIPX第 04 讲 Linux系统安全(参考)BSD Socketn一个通用的接口qA part of VFS inodeqA socket can be operated just the same as a system call read(), write(), lseek()n一个
18、套接字描述一个通讯连接的一端,两个通讯程序中各自有一个套接字来描述它们自己那一端。n每一类型的套接字有它自己的通信寻址方法。Linux支持下列套接字地址族或域qUNIX Unix 域套接字 qINET Internet地址族支持通过TCP/IP协议的通信qAX25 Amateur radio X25 qIPX Novell IPX qAPPLETALK Appletalk DDP qX25 X25n对BSD socket进行准确操作要依赖于它下面的地址族第 04 讲 Linux系统安全(参考)Client/Server CommunicationClient1. Create a socket
19、2. Bind an addr3. Listen the client4. Create a socketServer ConnectAcceptSendRecv第 04 讲 Linux系统安全(参考)INET SocketnBSD socket层从已注册的INET proto_ops 数据结构中调用INET层 socket支持例程来为它执行工作。nBSD socket层把socket 结构传到INET层。为了不把BSD socket 与TCP/IP的特定信息搞混,INET socket层使用它自己的数据结构:sock ,它与BSD socket 结构相连。n建立BSD socket:地址族,
20、socket类型,协议q将地址与INET socket绑定绑定操作在INET socket层内处理,下面的TCP和UDP协议层提供一些支持。绑定的地址在sock结构中的 recv_addr 和 saddr 字段。q例如, fd=socket(AF_INET, SOCK_STREAM, 0)n下层网络设备接收的包必须通过正确的INET和BSD socket才能被处理。因此,UDP和TCP维护了一些hash表用来在输入IP消息内查找地址并将它们导向正确的 socket/sock 对。第 04 讲 Linux系统安全(参考)INET Socket(续)n在INET Socket上建立连接qUDP:I
21、P地址和端口号qTCP:建立虚联接n监听 INET SocketqUDP:改变socket的状态qTCP:建立一个新的 sock 结构,加到两个hash表中并激活 tcp_bound_hash 表和 tcp_listening_hash 表。n接收连接请求q只用于TCP协议q阻塞和非阻塞状态第 04 讲 Linux系统安全(参考)socket()sys_socket()socket()sock_create()inet_create()get_fd()returncheckprotocol, type, familynet_familiesfamily-create(sock, protoco
22、l)create socket structuretcp_v4_init_sock()sk-prot-init()INETinet_create()IPXipx_create()UNIXunix_create()第 04 讲 Linux系统安全(参考)Linux BSD Socket Data Structurecountclose_on_execopen_fsfd0fd1fd255filef_modef_posf_flagsf_countf_ownerf_opf_inodef_versioninodesocksockettypeprotocoldata (sk)typeprotocolsoc
23、ketSOCK_STREAMSOCK_STREAMAddress Familysocket operationsBSD SocketlseekreadwriteselectioctlclosefasyncINET socketBSD socket第 04 讲 Linux系统安全(参考)IP层nSocket缓存sk_buffq每一个包到来之后,都被放到一个sk_buff中qsk_buff是一个数据结构,包含一些与该包有关的信息q在包和sk_buff之间是一对一的关系qsk_buff大小按16字节的倍数分配空间n接收IP包q将接收的数据转换成 sk_buff 结构。这些 sk_buff 则被网络驱
24、动加入到了 backlog 队列中。q如果 backlog 队列太长,则丢弃接收的 sk_buff。n发送IP包q建立sk_buffq加上各种头。IP用路由表为目的IP地址解析路由nIP分片第 04 讲 Linux系统安全(参考)Packets in Linux kernel 2.2sys_write()sock_write()inet_sendmsg()tcp_v4_sendmsg()tcp_do_sendmsg()tcp_send_skb()tcp_transmit_skb()ip_queue_xmit()ip_output()ip_finish_output()dev_queue_xmi
25、t()hard_start_xmit()sys_read()sock_read()inet_recvmsg()tcp_recvmsg()tcp_v4_recv()ip_local_deliver()ip_rcv()net_bh()Netif_rx()Block_input()ei_receive()ei_interrupt()outputinput第 04 讲 Linux系统安全(参考)接收数据包的过程n首先是硬件接收到数据包n然后,硬件产生中断n驱动程序把数据从硬件拷贝到一个sk_buff中n调用netif_rx()把数据包放到系统全局的 backlog队列中n通知net_bh()n在适当的
26、时候net_bh()执行nnet_bh()试图发送所有的数据包,然后从backlog队列中移除,送到适当的包处理器,例如ip_rcv()nip_rcv()可能会调用ip_local_deliver()或ip_forward()nip_local_deliver()会导致调用tcp_v4_rcv()ntcp_v4_rcv()将数据放到某个socket的队列中n当socket的进程读数据时,tcp_recvmsg()被调用n如果socket进程阻塞在读操作上,则进程将被唤醒第 04 讲 Linux系统安全(参考)On Network level Ip_rcv()Route tableIp_forw
27、ard()DemasqIp_output()Route tableIp_local_deliver()inputforwardoutputTransport levelDatalink levelmasq第 04 讲 Linux系统安全(参考)网络设备工作原理图第 04 讲 Linux系统安全(参考)网络设备驱动n数据结构q面向对象的方法qstruct deviceq可见部分和隐藏部分。n可见部分是由外部赋值n隐藏部分的域段仅面向系统内部,它们可以随时被改变n初始化q主要工作是检测设备的存在、初始化设备的device结构及在系统中登记该设备。 q两种方式:模块初始化模式 & 启动初始化模式q网
28、络接口管理表:dev_baseq模块初始化模式第 04 讲 Linux系统安全(参考)网络设备驱动的职责n提供初始化功能q支持启动初始化模式:网络设备的检测及初始化函数q支持模块初始化模式:网络设备的初始化函数,供register_netdev调用;还需提供init_module和cleanup_module函数n提供该网络设备的打开和关闭操作(ifconfig命令使用)n提供该网络设备的数据传输函数,负责向硬件发送数据包,供dev_queue_xmit调用;n提供该网络设备的中断服务程序,处理数据传输完毕的善后事宜和数据的接收。当物理网络设备有新数据到达或数据传输完毕时,将向系统发送硬件中断
29、请求,该函数用来响应中断请求第 04 讲 Linux系统安全(参考)Linux网络配置nLinux用daemon程序来提供网络服务q有些服务直接由daemon程序一直运行q有些服务通过inetd提供nInetdq它的职责是监听大范围内的网络端口,根据进来的请求动态启动相应的服务daemon节约资源q在Linux上,其实大多数inetd服务并不是必需的,虽然,这些服务本身有一定的安全认证能力,但是为了安全起见,应该关闭这些服务q如何配置inetd?n编辑inetd.conf每行格式: n通过/etc/services文件,可以查到每个service的端口和协议类型n停止inetd进程,并重新启动
30、第 04 讲 Linux系统安全(参考)inetd.conf配置文件第 04 讲 Linux系统安全(参考)/etc/services配置文件n只影响inetd启动的网络服务,由其他脚本(例如rcN.d)启动的服务可能不受影响第 04 讲 Linux系统安全(参考)TCP wrappersn在Linux中为/usr/sbin/tcpd,用法nTCP wrapper使得系统可以在请求登录或者输入口令之前拒绝进来的连接nTCP wrapper的两个配置文件q/etc/hosts.deny 满足条件则拒绝q/etc/hosts.allow 满足条件则允许q配置规则:service :host(s)
31、:action n两个工具qtcpdchk, 检查配置文件有没有错误,是否与其他文件冲突qtcpdmatch, 模拟规则是否如期起作用第 04 讲 Linux系统安全(参考)日志、syslogdnsyslogd是一个专门用于记录日志信息的服务n配置文件/etc/syslog.confq可以记录本地日志,也可以记录远程的日志信息q可以指定把什么样的日志消息记录到哪个文件中第 04 讲 Linux系统安全(参考)Linux的内核防火墙n协议栈在IP层上调用三个函数,防火墙的功能将在这三个函数中实现:qip_rcv():接收qip_forward():转发qip_output():发送n 三条规则链
32、qInput链qOutput链qForward链第 04 讲 Linux系统安全(参考)Linux内核支持的NAT第 04 讲 Linux系统安全(参考)Linux内核防火墙的发展n从ipfwadm - ipchains - netfilternNetfilter是2.4内核中实现网络安全功能的通用框架q在框架中,定义了5个钩子q在每个钩子上可以挂接多个模块qIptables模块挂接在LOCAL_IN、FORWARD、LOCAL_OUT上q提供多种功能n包过滤防火墙n地址转换NATn网络状态检测nPre-routeForwardRoutePost-RouteLocal-inRouteLocal
33、-out第 04 讲 Linux系统安全(参考)针对Linux的攻防技术nLinux平台上有大量的黑客工具,而且往往以源码方式发布,所以,学会编译和使用这些工具,可以在攻击对抗中发挥作用n探查信息q用nmap可以查到Linux的版本信息n改变Linux的协议栈行为,可以掩盖这些信息q许多早期的标准TCP/IP服务,可以暴露系统的内部信息,比如finger,还有一些基于RPC的服务n尽量关闭不必要的服务q一些服务的欢迎界面,比如服务n修改这些服务的配置信息第 04 讲 Linux系统安全(参考)口令破解n如何获得Linux的口令文件q口令文件的格式是公开的q口令文件passwd中,如果口令移到了
34、shadow中,则没有口令信息q有一些工具能够获得shadow文件的副本n破解程序qCrack 猜口令qJohn the Ripper 字典攻击,也可以穷举攻击qXIT 字典攻击,DOS程序qn对策q使用shadow, MD5q使用强口令q失败多次之后,帐号锁定q结合其他的认证技术q日志记录第 04 讲 Linux系统安全(参考)Linux数据驱动攻击n目标:获得root权限n两种类型q缓冲区溢出攻击n通过缓冲区溢出,植入恶意代码,获得一个shell,可以是远程的shell,也可以是本地的q输入验证攻击n对于输入没有合理地检查,导致执行破坏性的代码(命令或者脚本等)n在Web服务中比较多见,缺
35、乏对于输入数据的语法检查n对策:加强编程中的安全意识。由用户输入的脚本代码,或者在脚本代码中要用到用户输入的数据,则一定要检查输入数据不会危害整条语句第 04 讲 Linux系统安全(参考)Linux的X及其他n针对X的攻击qX的功能太强大,一旦获得X的服务器访问控制权,则可以为所欲为qX的认证机制n基于主机的认证,脆弱n基于token交换的认证q对策:关闭X服务n其他攻防技术q木马技术q网络监听技术qNFS不安全性q检查SUID程序的安全性q日志记录q第 04 讲 Linux系统安全(参考)一次针对Linux的入侵过程(一)n1.收集信息 q一般ftp服务器都使用了linux系统,所以用ft
36、p搜索器寻找 第 04 讲 Linux系统安全(参考)一次针对Linux的入侵过程(二)n进一步探查目标第 04 讲 Linux系统安全(参考)一次针对Linux的入侵过程(三)n2. 漏洞扫描 第 04 讲 Linux系统安全(参考)一次针对Linux的入侵过程(四)n3 尝试进入qWu-(1)是一个有漏洞的版本,首先使用ftp攻击, wu是一个针对redhat linux 的wu-的site exec漏洞的攻击脚本 第 04 讲 Linux系统安全(参考)一次针对Linux的入侵过程(五)n前面的入侵企图没有成功q原因是该服务器上没有开放上载权限,没有可写目录。n尝试另外一个漏洞:rpc.
37、statd缓冲区溢出。qStatdx2是一个针对此漏洞攻击的脚本,但是要求提供准确的字符串地址。否则一次攻击过后如果不成功可能会使对方的rpc.statd进程终止,无法进行第二次攻击尝试。n如何获得这个地址:q找一台自己控制的主机,这台主机的系统版本必须和目标主机相同。将攻击脚本传到该主机上。q以root身份运行,如下图所示第 04 讲 Linux系统安全(参考)一次针对Linux的入侵过程(六)执行脚本statdx2第 04 讲 Linux系统安全(参考)一次针对Linux的入侵过程(七)n再次对目标主机进行远程攻击 成功!获得root shell, 输入命令ls第 04 讲 Linux系统
38、安全(参考)一次针对Linux的入侵过程(八)n4. 装上后门q把后门程序放在一个ftp站点上,让目标主机去下载 命令ls命令ftp命令mv执行后门加一个帐号第 04 讲 Linux系统安全(参考)一次针对Linux的入侵过程(九)n5 销毁证据/痕迹q销毁证据和消灭痕迹是有区别的n销毁证据是指不让对方找到证据进行追踪。方法很简单:删除n消灭痕迹是指不让对方感觉到被入侵:做法是,有选择地删除一些记录,而且删除的动作也不能被记录。q以上动作主要留下的记录在:/var/log/messages、/var/log/secure、/var/log/wtmp、/var/spool/ftpd等。q可以删除之,如右图所示第 04 讲 Linux系统安全(参考)参考资料nSource code: Linux Source code (release 2.2) in /usr/src/linux directoryn书q“黑客大曝光”(第二版),清华出版社qLinx系统安全基础(Sams Teach Yourself Linux Security Basics in 24 Hours),人民邮电出版社,2002qPractical UNIX & Internet Security (2e), OReillynWeb sites第 04 讲 Linux系统安全(参考)