Libevent实例之系统密码保护程序设计

来源:互联网 发布:软件开发速成班 编辑:程序博客网 时间:2024/05/29 09:12

程序设计
程序实现

自毁主程序:cloudsf
自毁监听程序:cloudsm
程序自启脚本:cloudst.sh
自毁脚本:destory.sh
恢复脚本:recovery.sh

linux系统有被恶意篡改密码的情况,程序的目的就是通过实时监听linux系统密码是否被修改,在密码被修改的情况下,启动自毁程序
linux系统密码存放在/etc/shadow中,程序以守护进程运行,在程序首次在linux系统上运行时,获取系统密码,加密到文件中,
以后每次通过获取/etc/shadow下的密码与我们之前存放在文件中的密码匹配,若不一致,则执行destory.sh脚本,启动自毁
问题:
如何在确保密码被修改后立即启动自毁程序
libevent可以高效的实现,通过事件驱动以及定时检查密码是否被修改,到达高效,及时的性能
1.通过inotifywait监听/etc/shadow,当系统密码被更改时,inotifywait会检测到,并产生可读的事件,libevent监测到可读事件后,就会读取/etc/shadow下的密码与我们之前存放的 密码进行匹配,若匹配不成功,则启动自毁,否则继续监听
2.libevent也提供定时事件,我们可以通过定时取出/etc/shadow下的密码与之前存放的密码进行匹配

自毁程序主程序和自毁监听程序相互监控,形成一个循环,任意一个进程终止,另一个进程会重启被终止的程序

自毁监听程序实现:
父进程创建子进程,子进程通过execl执行程序自启脚本,若检测到cloudse终止,立刻重启,否则退出,
父进程等待子进程结束,然后再次循环创建子进程,子进程同样执行execl,一直循环下去

循环监听实现:
父进程创建子进程1,子进程1再次创建子进程2,子进程2通过execl执行程序自启脚本,若检测到cloudsm终止,立刻重启,否则退出,
子进程1等待子进程2结束,然后再次循环创建子进程2,子进程2同样执行execl
自毁实现:
程序第一次读取一份/etc/shadow下的root密码存放在文件中,存放在文件中的密码不再变化,文件也不再变,
每次通过读取文件中的内容与/etc/shadow中的密码匹配,若匹配成功,程序过一段时间再次匹配,
若没有匹配成功,则fork子进程,子进程通过execl执行自毁脚本,若自毁成功,子进程给父进程返回ok,否则,父进程继续循环,匹配密码,
可以知道密码肯定匹配失败,父进程创建子进程执行自毁脚本,直至自毁成功,父子进程之间通过管道进行通信
自毁成功后,cloudse退出,在退出的同时杀掉进程cloudsm,以及之前创建的子进程1

问题:cloudse发现密码被该后,自毁,退出,如何保证所有进程全部退出,可以在退出后执行execl脚本,杀掉所有进程
所遇到的问题:
不能直接粗暴的杀掉所有进程
因为循环监听进程在创建子进程后,通过execl去监听对方进程有没有在运行,在运行execl后的进程没有进程号,这个进程是不能杀死的,也就是说,通过进程号杀进程
只能杀死创建执行execl进程的父进程,而执行execl的进程又会创建新进程,导致进程无限循环创建
解决方案:在进程要退出时,监听进程1先杀死监听进程2,同时不再监听刚刚杀死的监听进程2,然后睡眠一会儿,等待监听进程2的execl进程执行完成后,通过进程号杀死自己的父进程以及自己

0 0