lawrencehero 发表于 2014-05-07 22:33

求指教Linux安全软件程序员的知识体系

楼主从事Linux安全软件行业不久,对于安全行业的知识体系还没有一个完整的把握,下图中我列出了我能想到的基础知识,以及获取这些基础知识的途径。
楼主诚恳地请求行业前辈指教补充,也邀请所有安全软件行业的同仁各抒己见。

lawrencehero 发表于 2014-05-07 23:05

上图中,各个子主题的优先级是从“通用基础知识”开始的顺时针方向,即:通用的基础知识 > Linux系统 > Linux内核 > Linux编程 > linux安全 > linux上常用软件

对于通用基础知识,我觉得是所有从事计算机软件行业都应该具备的知识,无关平台和开发语言。这些知识犹如大厦的地基,越牢固越好。当然这些知识并不是说搞定那几本书就能稳稳的收入囊中,而是要通过长期的磨练和体会。
1.《深入理解计算机系统》 这个是站在程序员的视角来理解计算机系统,写的相当的精彩和细致,是不可多得的好书。作为一个程序员,次数至少要读两遍以上。
2.《TCP/IP详解》是网络方面的经典书籍,把协议的来龙去脉讲的清清楚楚,是Stevens大神的经典之作,不可不读。
3.《算法导论》是讲算法的经典,但是要啃完本书绝非易事,需要扎实的数学基础
4.软件架构的设计对一个软件的开发和维护有着至关重要的作用,相信无需赘言各位也是深有体会。所以多掌握写设计模式对软件设计会有很大帮助,别跟说这些模式没什么用,那是因为你还没有融会贯通。这方面的经典之作是《设计模式》,但这里我用的是《大话设计模式》是因为这本书比较薄,更重要的是通俗易懂,读起来相当舒畅。
5.一个成功的软件是由很多人一起协作开发,并且会经历从需求分析、架构设计、详细设计、编码、调试、测试等各个阶段。《代码大全》教我们如何成功地完成一个软件项目,会对我们的软件设计和项目实施带来很多启发。整个阅读过程像是一个洗礼的过程,醍醐灌顶!

lawrencehero 发表于 2014-05-08 00:09

对于linux系统的理解,我觉得有一个较好的切入点是:它从哪里来?它干什么?

首先,整个系统是怎么来的?这就需要理解系统的整个启动过程:从你按下电源开关那一刻起,到你能在命令行上欢乐的运行命令,这中间到底发生了些什么事情?内核是如何初始化并运行起各个模块,init程序到底在用户层干了些什么?如果能对这中间的细节了解清楚,就会对整个系统有一个全面的认识。就好比你白手起家从无到有的创办了一家公司,创办过程中的各个环节你都经历过,那一定会对整个公司了若指掌。
      这里的分析方法:内核源码+init可执行文件的源码+gdb的内核动态调试。

第二、我的工作环境怎么来的?这就涉及到登录过程。怎么获得一个登录shell让你输入用户名和密码,然后如何判断密码的正确性,再然后系统如何给你准备环境。
第三、用ssh远程登录过程和第二点有很多相同的地方,不过这里多了伪终端的概念。sshd也本是一个很好的网络软件,认真研究对我们的网络编程也会有很多帮助。
      这两个登录过程会涉及到对系统至关重要的账户安全!这是Linux黑客入侵系统的第一道关,所以做安全的,一定要很了解这个过程才行。

第四、进程是怎么来的?进程就是运行可执行文件之后内存中的对应实例。那么从你在shell上输入完可执行文件的名字并敲下回车的那一刻起,到可执行文件的main函数被调用这段期间究竟发生了些什么事情?shell在其中干了些什么事情?内核又干了些什么事情?另外这个可执行文件有什么特殊的?为什么普通的文本文件就不能运行呢?
第五、当我们成功得登录系统后,面对的最多的就是文件系统。磁盘上的那些冷冰冰的数据为什么就按照树型的方式摆在我的面前了呢?我敲下了ls命令后,内核到底怎样找到这些文件名的呢?一个文件的大小权限等信息是存放在哪里的呢?linux的内核中相当聪明的使用了虚拟文件系统,这个东东又是怎样来跟实际的文件系统发生联系的呢?好好的研究下文件系统,答案就在其中。
第六、日志系统。系统运行期间有大量的日志产生,记录了系统中的各个进程做了哪些事情,发生了些什么错误等等。通过这些日志可以分析出用户的很多行为,对安全来说,日志分析就是一项很重要的工作。
第七、proc系统。这个是内核与用户层的一个交互的窗口,内核中的实时数据都在该系统中,搞清楚/proc下各个文件的意义会让我们的系统的实时情况有确切的掌握。
第八、各个系统命令。要在linux上讨生活,当然就要熟悉linux上的各种工具,一些重要命令,我们不仅要会使用它,还要去读它的源码了解它的工作原理。这也是了解linux系统原理的一个好方法。

yuetwo 发表于 2014-05-08 10:34

牛,兄弟梳理的很有系统性啊

lawrencehero 发表于 2014-05-08 22:52

Linux内核

    对于Linux内核这个庞然大物,想要彻底弄懂,也许要穷尽半生甚至毕生的精力。当今世界除了linus等几个神级大牛之外,几乎没有人能够对linux所有的部分都了若指掌。所以,我们能做的,就是了解其中的某些模块。
    对于安全软件程序员来说,从事的就是系统安全和网络安全的研发。那么对应这两个方面,最相关的就是文件系统和TCP/IP协议栈了。所以要这两块的内核代码要尽量的熟悉。至于进程调度管理跟内存分配管理,这两块能够熟悉当然最好,不过这两块的难度也是相当的大,因为它们作为操作系统最核心最基础的功能,几乎在跟内核其他所有的内核部件在打交道。要想研究明白这两块,首先需要对相应的计算机原理(还记得”通用基础知识“中的《深入理解计算机系统》吗?)搞清楚才行,不然一走进去就只见树木不见森林了。
    对于内核模块的研究方法:当然首先是要明白相关原理。这个可以通过相关书籍如《深入理解Linux内核》来搞定,第二就是要阅读源码了。阅读时可以借助源码解析书籍毛德操的《LINUX内核源代码情景分析》,第三,gdb内核动态调试。没有什么比自己动手调试代码更直观的了,解剖一个运行起来的动态的内核会让你瞬间明白困扰你已久的问题原来是这样的!

    要玩内核,当然就要编译内核;要玩专属自己的内核,当然就要懂得裁剪内核;这两块在网上已经有相当多的资料在说明,所以,大胆地踩着前辈的肩膀前进吧!
    最后是内核模块的编写。作为安全软件的开发者要懂得:任何没有内核支持的安全防护功能都是纸老虎!要获得内核的支持,有两种方式:一是利用已有的内核安全模块,二是自己编写内核模块。自己编写内核模块要建立在对内核代码足够熟悉的基础上,不然写出来的代码会各种潜在的问题,到时候可能你写的不是安全防护功能,而是沦为黑客利用的”卧底“。至于如何加载和卸载模块等都是小儿科,看看帮助文档就会明白,不说也罢。

lawrencehero 发表于 2014-05-08 23:59

Linux编程

    对于一个安全软件来说,光有内核的支持是不够的。Linux内核的设计思想是只提供功能,不提供策略,简单点说就是——只告诉你我有这些个功能,至于你怎么使用它们那是你的事情。所以在用户层编写代码也是很重要的工作!
    首先,你得把代码编译成可执行文件。Linux上没有windows的vs这样的IDE环境(即使有,可能你也不会愿意去使用它——在Linux图形界面上工作,就像把餐厅设在了茅房一样难受),所以第一步你就要编写makefile。如果你是从windows转行过来的,别惊慌失措,看这个文档就好了——《makefile详解》。在编写makefile时无可避免地要用到编译器的一些选项,所以你还得熟悉gcc才行!gcc的网络资料也是一搜一大把,最准确的当然就是阅读官方资料啦。
    编译好程序后,一运行,可能会蹦出几个找不到某某符号之类的错误,然后程序就罢工退出。碰到这种情况咋办?可以先用一些分析工具,如ldd、nm、readelf之类的查看符号表、动态链接库之类的信息,看看是不是漏编了几个文件,少链接了几个动态库,然后在再修改makefile,重新编译链接。
    好了,现在程序能run起来了,但是跑着跑着,”噔“又弹出了一个”段错误“!这个是内存操作错误。日,那我咋知道哪里内存操作错了!让我上源码中用肉眼去找吗?杀了我好了。别着急,现在就该gdb上场了。gdb具有丰富的调试功能,凡是你在windows上能看到的调试功能,在gdb里都有。调试对于一个程序员来说,重要性堪比编码,所以gdb是无论如何都要精通的。有个程序员老鸟曾经说过:程序员的成就感不是来自编码,而是来自解决了别人解决不了的bug!那感觉,那酸爽。。
   
    OK,终于可以坐下来正儿八经的编码了。前面说过,安全分为系统安全和网络安全,对应到编程上,就是系统编程和网络编程。这两方面的经典书籍就是《UNIX环境高级编程》(简称APUE)和《UNIX网络编程》(简称UNP)了,都是由敬爱的Stevens老师著作的。两本书相比而言,APUE有些章节略感晦涩,可能是由于翻译的原因。UNP写的很细致明了,可以看出Stevens大师的学术态度之严谨,我辈中人应好好学习。
    除了用C/C++语言编写大型软件之外,有时候我们还免不了要写些小程序,比如测试程序,安装脚本,文件的批量操作等。这时候用C/C++感觉性价比太低——写一大堆C/C++代码就相当于SHELL程序或者python程序的两三条语句。当然python也是可以用来开发较大型的软件的,不过我们只要能够用它编写一些小脚本就够了。语言的东西,用到的时候突击一下,翻翻手册就好了。

lawrencehero 发表于 2014-05-09 00:05

Linux编程

    对于一个安全软件来说,光有内核的支持是不够的。Linux内核的设计思想是只提供功能,不提供策略,简单点说就是——只告诉你我有这些个功能,至于你怎么使用它们那是你的事情。所以在用户层编写代码也是很重要的工作!
    首先,你得把代码编译成可执行文件。Linux上没有windows的vs这样的IDE环境(即使有,可能你也不会愿意去使用它——在Linux图形界面上工作,就像把餐厅设在了茅房一样难受),所以第一步你就要编写makefile。如果你是从windows转行过来的,别惊慌失措,看这个文档就好了——《makefile详解》。在编写makefile时无可避免地要用到编译器的一些选项,所以你还得熟悉gcc才行!gcc的网络资料也是一搜一大把,最准确的当然就是阅读官方资料啦。
    编译好程序后,一运行,可能会蹦出几个找不到某某符号之类的错误,然后程序就罢工退出。碰到这种情况咋办?可以先用一些分析工具,如ldd、nm、readelf之类的查看符号表、动态链接库之类的信息,看看是不是漏编了几个文件,少链接了几个动态库,然后在再修改makefile,重新编译链接。
    好了,现在程序能run起来了,但是跑着跑着,”噔“又弹出了一个”段错误“!这个是内存操作错误。日,那我咋知道哪里内存操作错了!让我上源码中用肉眼去找吗?杀了我好了。别着急,现在就该gdb上场了。gdb具有丰富的调试功能,凡是你在windows上能看到的调试功能,在gdb里都有。调试对于一个程序员来说,重要性堪比编码,所以gdb是无论如何都要精通的。有个程序员老鸟曾经说过:程序员的成就感不是来自编码,而是来自解决了别人解决不了的bug!那感觉,那酸爽。。
   
    OK,终于可以坐下来正儿八经的编码了。前面说过,安全分为系统安全和网络安全,对应到编程上,就是系统编程和网络编程。这两方面的经典书籍就是《UNIX环境高级编程》(简称APUE)和《UNIX网络编程》(简称UNP)了,都是由敬爱的Stevens老师著作的。两本书相比而言,APUE有些章节略感晦涩,可能是由于翻译的原因。UNP写的很细致明了,可以看出Stevens大师的学术态度之严谨,我辈中人应好好学习。
    除了用C/C++语言编写大型软件之外,有时候我们还免不了要写些小程序,比如测试程序,安装脚本,文件的批量操作等。这时候用C/C++感觉性价比太低——写一大堆C/C++代码就相当于SHELL程序或者python程序的两三条语句。当然python也是可以用来开发较大型的软件的,不过我们只要能够用它编写一些小脚本就够了。语言的东西,用到的时候突击一下,翻翻手册就好了。

lawrencehero 发表于 2014-05-09 19:26

Linux编程

    对于一个安全软件来说,光有内核的支持是不够的。Linux内核的设计思想是只提供功能,不提供策略,简单点说就是——只告诉你我有这些个功能,至于你怎么使用它们那是你的事情。所以在用户层编写代码也是很重要的工作!
    首先,你得把代码编译成可执行文件。Linux上没有windows的vs这样的IDE环境(即使有,可能你也不会愿意去使用它——在Linux图形界面上工作,就像把餐厅设在了茅房一样难受),所以第一步你就要编写makefile。如果你是从windows转行过来的,别惊慌失措,看这个文档就好了——《makefile详解》。在编写makefile时无可避免地要用到编译器的一些选项,所以你还得熟悉gcc才行!gcc的网络资料也是一搜一大把,最准确的当然就是阅读官方资料啦。
    编译好程序后,一运行,可能会蹦出几个找不到某某符号之类的错误,然后程序就罢工退出。碰到这种情况咋办?可以先用一些分析工具,如ldd、nm、readelf之类的查看符号表、动态链接库之类的信息,看看是不是漏编了几个文件,少链接了几个动态库,然后在再修改makefile,重新编译链接。
    好了,现在程序能run起来了,但是跑着跑着,”噔“又弹出了一个”段错误“!这个是内存操作错误。晕,那我咋知道哪里内存操作错了!让我上源码中用肉眼去找吗?杀了我好了。别着急,现在就该gdb上场了。gdb具有丰富的调试功能,凡是你在windows上能看到的调试功能,在gdb里都有。调试对于一个程序员来说,重要性堪比编码,所以gdb是无论如何都要精通的。有个程序员老鸟曾经说过:程序员的成就感不是来自编码,而是来自解决了别人解决不了的bug!那感觉,那酸爽。。
   
    OK,终于可以坐下来正儿八经的编码了。前面说过,安全分为系统安全和网络安全,对应到编程上,就是系统编程和网络编程。这两方面的经典书籍就是《UNIX环境高级编程》(简称APUE)和《UNIX网络编程》(简称UNP)了,都是由敬爱的Stevens老师著作的。两本书相比而言,APUE有些章节略感晦涩,可能是由于翻译的原因。UNP写的很细致明了,可以看出Stevens大师的学术态度之严谨,我辈中人应好好学习。
    除了用C/C++语言编写大型软件之外,有时候我们还免不了要写些小程序,比如测试程序,安装脚本,文件的批量操作等。这时候用C/C++感觉性价比太低——写一大堆C/C++代码就相当于SHELL程序或者python程序的两三条语句。当然python也是可以用来开发较大型的软件的,不过我们只要能够用它编写一些小脚本就够了。语言的东西,用到的时候突击一下,翻翻手册就好了。
页: [1]
查看完整版本: 求指教Linux安全软件程序员的知识体系