• OS + Linux security / safe tools / ids / IDS


    Linux fork 炸*弹的分析

    http://blog.csdn.net/linuxgroup/article/details/4269043

    作为 Linux/Unix 系统上内核与用户之间的接口,shell 由于使用方便、可交互能力强、具有强大的编程能力等特性而受到广泛的应用。bash(Bourne Again shell)是对 Bourne shell 的扩展,并且综合了很多 csh 和 Korn Shell 中的优点,使得 bash 具有非常灵活且强大的编程接口,同时又有很友好的用户界面。bash 所提供的诸如命令补齐、通配符、命令历史记录、别名之类的新特性,使其迅速成为很多用户的首选。
    然而,作为一种 解释性语言,bash 在编程能力方面提供的支持并不像其他编译性的语言(例如 C 语言)那样完善,执行效率也会低很多,这些缺点在编写函数(尤其是递归函数)时都展现的一览无余。本文将从经典的 fork 炸*弹入手,逐一介绍在 bash 中编写递归函数时需要注意问题,并探讨各种问题的解决方案。
    尽管本文是以 bash 为例介绍相关概念,但是类似的思想基本上也适用于其他 shell。
    递归经典:fork 炸*弹
    函 数在程序设计中是一个非常重要的概念,它可以将程序划分成一个个功能相对独立的代码块,使代码的模块化更好,结构更加清晰,并可以有效地减少程序的代码 量。递归函数更是充分提现了这些优点,通过在函数定义中调用自身,可以将复杂的计算问题变成一个简单的迭代算法,当回溯到边界条件时,再逐层返回上一层函 数。有很多数学问题都非常适合于采用递归的思想来设计程序求解,例如阶乘、汉诺(hanoi)塔等。
    可能很多人都曾经听说过 fork 炸*弹,它实际上只是一个非常简单的递归程序,程序所做的事情只有一样:不断 fork 一个新进程。由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源。
    在 bash 中设计这样一个 fork 炸*弹非常简单,Jaromil 在 2002 年设计了最为精简的一个 fork炸*弹的实现,整个程序从函数定义到调用仅仅包含 13 个字符,如清单 1 所示。
    清单1. bash 中的 fork 炸*弹               
    .(){ .|.& };.
    这串字符乍看上去根本就看不出个所以然来,下面让我们逐一解释一下它究竟在干些什么。为了解释方便,我们对清单1中的内容重新设置一下格式,并在前面加上了行号,如清单 2 所示。
    清单2. bash 中的 fork 炸*弹的解释
      1 .()
      2 {
      3  .|.&
      4 }
      5 ;
      6 .
        第 1 行说明下面要定义一个函数,函数名为小数点,没有可选参数。
        第 2 行表示函数体开始。
        第 3 行是函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行。
        第 4 行表示函数体结束。
        第 5 行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。
        第 6 行表示调用本函数。
    对 于函数名,大家可能会有所疑惑,小数点也能做函数名使用吗?毕竟小数点是 shell 的一个内嵌命令,用来在当前 shell 环境中读取指定文件,并运行其中的命令。实际上的确可以,这取决于 bash 对命令的解释顺序。默认情况下,bash 处于非 POSIX 模式,此时对命令的解释顺序如下:
        关键字,例如 if、for 等。
        别名。别名不能与关键字相同,但是可以为关键字定义别名,例如 end=fi。
        特殊内嵌命令,例如 break、continue 等。POSIX 定义的特殊内嵌命令包括:.(小数点)、:(冒号)、break、continue、eval、exec、exit、export、readonly、 return、set、shift、times、trap 和 unset。bash 又增加了一个特殊的内嵌命令 source。
        函数。如果处于非 POSIX 模式,bash 会优先匹配函数,然后再匹配内嵌命令。
        非特殊内嵌命令,例如 cd、test 等。
        脚本和可执行程序。在 PATH 环境变量指定的目录中进行搜索,返回第一个匹配项。
    由 于默认情况下,bash 处于非 POSIX 模式,因此 fork 炸*弹中的小数点会优先当成一个函数进行匹配。(实际上,Jaromil 最初的设计并没有使用小数点,而是使用的冒号,也能起到完全相同的效果。)要使用 POSIX 模式来运行 bash 脚本,可以使用以下三种方法:
        使用 --posix 选项启动 bash。
        在运行 bash 之后,执行 set -o posix 命令。
        使用 /bin/sh 。
    最 后一种方法比较有趣,尽管 sh 在大部分系统上是一个指向 bash 的符号链接,但是它所启用的却是 POSIX 模式,所有的行为都完全遵守 POSIX 规范。在清单 3 给出的例子中,我们可以发现,小数点在默认 bash 中被解释成一个函数,能够正常执行;但是在 sh 中,小数点却被当作一个内嵌命令,因此调用函数时会被认为存在语法错误,无法正常执行。
    清单3. bash 与 sh 对命令匹配顺序的区别               
    [root@localhost ~]# ls -l /bin/bash /bin/sh
    -rwxr-xr-x 1 root root 735144 2007-08-31 22:20 /bin/bash
    lrwxrwxrwx 1 root root      4 2007-12-18 13:26 /bin/sh -> bash
    [root@localhost ~]# echo $SHELL
    /bin/bash
    [root@localhost ~]# .() { echo hello; } ; .
    hello
    [root@localhost ~]# sh
    sh-3.2# echo $SHELL
    /bin/bash
    sh-3.2# .() { echo hello; } ; .
    sh: `.': not a valid identifier
    sh: .: filename argument required
    .: usage: . filename [arguments]
    sh-3.2#
    一旦运行清单 1 给出的 fork 炸*弹,会以2的指数次幂的速度不断产生新进程,这会导致系统资源会被迅速耗光,最终除非重新启动机器,否则基本上就毫无办法了。为了防止这会造成太大的损 害,我们可以使用 ulimit 限制每个用户能够创建的进程数,如清单 4 所示。
    清单4. 限制用户可以创建的进程数  

    [root@localhost ~]# ulimit -u 128
    [root@localhost ~]# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    max nice                        (-e) 20
    file size               (blocks, -f) unlimited
    pending signals                 (-i) unlimited
    max locked memory       (kbytes, -l) unlimited
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) unlimited
    max rt priority                 (-r) unlimited
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 128
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    [root@localhost ~]# .() { .|.& } ; .
    [1] 6152
    [root@localhost ~]# bash: fork: Resource temporarily unavailable
    bash: fork: Resource temporarily unavailable
    bash: fork: Resource temporarily unavailable
    ...
    在清单 4 中,我们将用户可以创建的最大进程数限制为 128,执行 fork 炸*弹会迅速 fork 出大量进程,此后会由于资源不足而无法继续执行。

    我学习TRIPWIRE

    http://www.wangchao.net.cn/bbsdetail_74512.html

    黑客防线   http://www.Hacker.com.cn

    黑客手册   http://www.nohack.cn/bbs/

    黑客X档案 http://www.hackerxfiles.net/

    Linux 安全组件比较和介绍

    http://dingbuoyi.iteye.com/blog/916329

    Linux审计子系统(Linux Aduit Subsystem)
    LAus可以用来监控文件访问和操作系统的一些情况,是linux为了通过evl-4级认证的一个完全策略。从下面的一个连接可以大体的推断其支 持的 kernel和各发行版,http://www.securityfocus.com/bid/12309,尽管这是一个bug报告。

    SELinux
    SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制 (MAC)系统。对于目前可用的 Linux 安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。
    参考连接:
    SELinux实例:使用安全增强的Linux
    从头开始生成 SELinux
    揭开 SE Linux 的秘密:第 1部分
    SELinux 中基于角色的访问控制
    Gentoo SELinux Handbook

    ACL
    ACL是Access Control List的缩写,主要的目的是在提供传统的owner,group,others的read,write,execute权限之外的细部权限设定。 ACL可以针对单一使用者,单一档案或目录来进行r,w,x的权限规范,对于需要特殊权限的使用状况非常有帮助。 Grsecurity是其中比较典型和成熟的一种。
    Grsecurity ACL系统
    Linux 安全系列:用 grsecurity 保护 Linux

    CHROOT
    CHROOT就是Change Root,也就是改变程序执行时所参考的根目录位置。可以将程序限制在指定的目录之内。

    iptables
    Linux提供了一个非常优秀的防火墙工具—netfilter/iptables。它完全免费、功能强大、使用灵活、可以对流入和流出的信息进 行细化控制,且可以在一台低配置机器上很好地运行。netfilter/iptabels应用程序,被认为是Linux中实现包过滤功能的第四代应用程 序。 netfilter/iptables包含在2.4以后的内核中,它可以实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。 netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。netfilter/iptables从ipchains和 ipwadfm(IP防火墙管理)演化而来,功能更加强大。
    参考资料:
    iptables从入门到精通
    Iptables 指南 1.1.19

    Linux-PAM 的 limit
    Linux-PAM 的 limit 也很有用,可以限制用户启动进程所占用的资源。(为用户级别的限制,不能为单个程序制定限制。)
    配置文件在 /etc/security/limits.conf
    参考资料:
    Linux Shell命令ulimit的用法

    Tripwire 或 AIDE(Advanced Intrusion Detection Environment)

    AIDE即Advanced Intrusion Detection Environment,直译为高级入侵检测环境,AIDE,是一个文件完整性检测工具,AIDE 能够构造一个指定文件的数据库。

    Tripwire 是目前最为著名的unix下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来。当文件现在的数字签名与保留的数字签名不一致时,那么现在这个文件必定被改动过了。

    对了,各种虚拟技术也可以算上。
    用户模式内核为了安全需要为主机内核打上补丁,不然虚拟机内的程序可以访问其他程序的内存。

    http://www.ibm.com/developerworks/cn/linux/security/l-ossec/part3/

    本文内容包括:
    1 Sxid
    2 Skey
    3 三个日志管理工具
    4 ssh
    5 tripwire
    6 portsentry
    7 openssl
    8 Linux FreeS/WAN VPN
    小结
    参考资料
    关于作者
    对本文的评价
    developerWorks 中国   >   Linux   >

    linux系统安全(三): 系统安全工具介绍

    developerWorks
    文档选项
    <noscript></noscript> <noscript>&amp;amp;lt;tr valign=&amp;amp;quot;top&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;td width=&amp;amp;quot;8&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;img alt=&amp;amp;quot;&amp;amp;quot; height=&amp;amp;quot;1&amp;amp;quot; width=&amp;amp;quot;8&amp;amp;quot; src=&amp;amp;quot;//www.ibm.com/i/c.gif&amp;amp;quot;/&amp;amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;td width=&amp;amp;quot;16&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;img alt=&amp;amp;quot;&amp;amp;quot; width=&amp;amp;quot;16&amp;amp;quot; height=&amp;amp;quot;16&amp;amp;quot; src=&amp;amp;quot;//www.ibm.com/i/c.gif&amp;amp;quot;/&amp;amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;td class=&amp;amp;quot;small&amp;amp;quot; width=&amp;amp;quot;122&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;span class=&amp;amp;quot;ast&amp;amp;quot;&amp;amp;gt;未显示需要 JavaScript 的文档选项&amp;amp;lt;/span&amp;amp;gt;&amp;amp;lt; /p&amp;amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;</noscript> <script type="text/javascript"></script> <script type="text/javascript"></script>
    将打印机的版面设置成横向打印模式

    打印本页

    将此页作为电子邮件发送

    将此页作为电子邮件发送


    级别: 初级

    晋亮 (sound810@sina.com ), 网络安全工程师

    2003 年 1 月 09 日

    我们把主要精力放在用Linux搭建安全的服务器上面。我们通过系统设置和一些共享的安全软件固化我们的系统,使其能做到真正的安全。第一部分主要从安装和设置方面阐述 Linux 作为服务器应注意的方面。

    下面介绍一些可以用于 Linux 的安全工具,这些工具对于固化您的服务器将起到一定的作用,可以解决各方面的问题。我们的重点只是想让您了解这些工具,对安装配置以及使用不会给出很详细的介绍。

    介绍这些工具的目的只是给您一个提示的方向,并不是让您拘泥于这些工具。毕竟安全是一个过程,不是一个产品。

    1 Sxid

    sxid 是一个系统监控程序。它可以监视系统中 suid,sgid 文件以及没有属主的变化。并且以可选的形式报告这些改变,你可以在配置文件中设置用 email 的形式通知这些改变,也可以不使用 email 而直接在标准输出上显示这些变化。Suid,sgid 文件以及没有属主的文件很有可能是别人放置的后门程序,这些都是您所要特别注意的。

    如果您安装过其他工具,那么您一定也会安装这个工具,它在安装上没有什么特别的地方。

    缺 省安装的时候,配置文件为 /usr/local/etc/sxid.conf,这个文件中有很明显的注释很容易看懂。在这个文件中定义了 sxid 的工作方式。日志文件缺省为 /var/log/sxid.log,日志文件的循环次数在 sxid.conf 文件中定义。您可以在配置固定后把 sxid.conf 设置为不可改变,把 sxid.log 设置为只可添加(使用 chattr 命令)。

    您可以用 sxid -k 加上 -k 选项来进行检查,这时检查很灵活,既不记入日志,也不会发出 email。这样您就可以随时做检查。 但是我还是建议您把检查放入 crontab 中,使用 crontab -e 编辑加入下面的条目:

            0 4 * * * /usr/bin/sxid
        

    表示每天上午 4 点执行这个程序。

    如果您还想了解更详细的信息,可以参考:

    man  sxid
    man  5  sxid.conf
    





    回页首


    2 Skey

    您认为您的密码安全吗?即使您的密码很长,有很多特殊字符,解密工具很难破解,但您的密码在网络中传送时是以明文形式的,在以太网中随便一个嗅探器就可以截取您的密码。现在在交换环境中也能实现这种技术。在这种情况下,skey 对您来说是一个选择。

    Skey 是一次性口令的一个工具。它是一个基于客户\服务器的应用程序。首先在服务器端可以用 keyinit 命令为每个用户建立一个 skey 客户,这个命令需要指定一个秘密口令,然后就可以为客户端的用户产生一次性口令列表。当用户通过 telnet,ftp 等与服务器进行连接时就可以按照一次性口令列表中的口令顺序输入自己的密码,下次再连接时候密码就换成了列表中的下一个。

    skey 的服务器端使用有下面的步骤:

    1 使用下面的命令初始化用户 mary:

    keyinit mary
    keyinit 每次为用户生成 99 个一次性口令,这时就会在 /etc/skeykeys 文件
    建立这个用户,该文件中保存了服务器端计算下一个一次性口令的一些信息。用上面的 keyinit 命令时就会在 /etc/skeykeys 中有下面的记录:

    mary  0099  to25065  be9406d891ac86fb  Mar  11, 2001 04:23:12
    

    上面的记录中从左到右依次是用户名,要使用的一次性口令序号,口令的种类,16 进制表示的口令,日期和时间。

    2 将一次性口令列表提供给 mary
    您可以打印出口令列表然后送给 mary。这样比较安全,密码不会在网络中传递。

    3 为 mary 修改缺省的登陆 shell 为 /usr/local/bin/keysh
    由于 PAM 的作用,mary 登陆时要输入密码,她输入这个一次性口令后服务器端要对这个口令进行校验,校验通过连接就被许可了。
    可能有些用户不喜欢书面的口令列表,用户可以使用 key 命令在自己的客户端得到一次性口令。您可以通过开两个窗口,一个对服务器进行连接获得一次性口令的种类和序号,然后在另一个窗口用 key 命令根据口令的种类和序号获得所要的密码。但是必须提醒您,您这样的方便是以一定的危险性为代价的。
    如果您的缺省的 99 个口令用完了,您可以使用 keyinit -s 刷新口令列表。
    在 /usr/src/skey/misc 目录中有许多其他的替换 keysh 的提供其他服务的程序,例如:su,login,ftp 等等。这样您可以应付不同的服务的连接请求了。
    为了安全,您最好设置一下/etc/skeykeys 文件的属性和权限。





    回页首


    3 三个日志管理工具

    3.1 logrotate

    一般的 Linux 发行版中都自带这个工具。日志文件过大如何处理是一个问题。它可以自动使日志循环,删除保存最久的日志。你可以把它放在 crontab 中,每天定期运行。这在很多 linux 发行版中都是缺省设置的。

    您可以从下面的网址获得新版本的 logrotate:
    ftp://ftp.redhat.com/pub/redhat

    它的配置文件是 /etc/logrotate.conf 我们可以在这个文件中设置日志的循环周期,日志的备份数目,以及如何备份日志等等。

    在 /etc/logrotate.d 目录下包括一些工具的日志循环设置文件。例如:syslog,samba,cron 等等,在这些文件中指定如何根据 /etc/logrotate.conf 做日志循环,您也可以在这里面添加其他的文件以循环其他服务的日志。

    关于配置文件的详细信息您可以参阅 man logrotate。

    最后还是提醒您使用 cron 运行 logrotate。

    3.2 swatch

    swatch 是一个实时的日志监控工具。您可以设置您所感兴趣的事件,它可以在事件发生的时候告诉您。Swatch 有两种运行方式:一种可以在检查日志完毕退出,另一种可以连续监视日志中的新信息。

    Swatch 提供了许多通知方式,例如:email,振铃,终端输出,多种颜色等等。

    您可以从下面的站点下载:
    ftp://ftp.stanford.edu/general/security-tools/swatch/

    swatch 的安装需要一些 perl 库的支持,安装前确信您的系统已经可以支持 perl。

    Swatch 可以在命令行中进行一些简单的设置,例如日志循环时告诉 swatch 在循环完毕后重新启动等等。

    配 置文件 swatchmessage 是 swatch 软件的重点。这个文本文件告诉 swatch 需要监视什么日志,需要寻找什么触发器,和当触发时所要执行的动作。当 swatch 发现到与 swatchmessage 中定义的触发器正则表达式相符时,它将执行在 swatchrc 中定义的通知程序。Swatch 通过使用/usr/bin/tail -f 实时监视日志文件。

    在这里我们不想过多的将如何配置,配置 swatch 非常简单,您可以参考 swatch 自带的配置文件。针对每个服务例如:ftp,sendmail 等等,你必须为每个您所关心的服务配置一个 swatchmessage 文件。

    Swatch 启动时可以带很多参数,但使用通常如下格式启动它就可以了:

    /usr/local/bin/swatch -c /var/log/syslogmessage -t /var/log/syslog  -r 06:00&
    

    -c 参数用于指定配置文件,-t 参数指定实时监视的日志文件,-r 指定重起的时间,"&" 使 swatch 在后台运行。启动后,swatch 产生子进程,因此 swatch 是以两个进程运行的,在停止 swatch 时必须杀掉两个进程。

    也可以通过 logrotate 配置在日志循环后重起 swatch,可以在 /etc/logrotate.d 建立一个您所要关心的日志的循环文件,其中最关键的是要加入下面这行:

    /usr/local/bin/swatch -c /var/log/syslogmessage -t /var/log/syslog  -r + 0
    

    其他的地方可以仿造别的同目录下的文件。

    3.3 logcheck

    审 核和记录系统的事件是非常重要的。特别是当你的计算机连接到 Internet 上之后,系统管理员如果对"异常"的事件保持警觉,就能防止系统被入侵。在 Unix 系统中如果仅仅把系统事件作为日志记录下来,而不去查看,还是无济于事。logchek 可以自动地检查日志文件,先把正常的日志信息剔除掉,把一些有问题的日志保留下来,然后把这些信息 email 给系统管理员。Logcheck 被设计成自动运行,定期检查日志文件以发现违反安全规则以及异常的活动。logcheck 用 logtail 程序记住上次已经读过的日志文件的位置,然后从这个位置开始处理新的日志信息。

    可以在下面的站点获得 logcheck:
    http://www.psionic.com/abacus/logcheck/

    logcheck 主要由下面几个主要的文件:

    1 logcheck.sh
    这个是一个可执行的脚本文件,里面记录 logcheck 检查那些日志文件等 logcheck 运作所必须的信息。您可以把它加入 crontab 中定时运行。

    2 logcheck.hacking
    它和下面的三个文件一样,是 logcheck 检查的模式文件。他们四个文件按从上到下的顺序执行。这个文件表明了入侵活动的模式。

    3 logcheck.violations
    这个文件表示有问题,违背常理的活动的模式。优先级小于上面的那个模式文件。

    4 logcheck.violations.ignore
    这个文件和上面的 logcheck.violations 是相对的,是您所不关心的问题的模式文件。

    5 logcheck.ignore
    这是检查的最后一个模式文件。如果没有和前三个模式文件匹配,也没有匹配这个模式文件的话,则输出到报告中。

    6 logtail
    这个文件记录日志文件信息。

    Logcheck 首次运行时读入相关的日志文件的所有内容。Logtail 在日志文件的目录下为每个关心的日志文件建立一个 logfile.offset 的偏移量文件,以便于下次检查时从这个偏移量开始检查。Logcheck 执行时未被忽略的内容通过邮件的形式发送给 logcheck.sh 中 SYSADMIN 指定的用户。

    Logcheck 的通知没有那么实时,但是相对于 swatch 它更适合于分布式日志文件系统。因为它不必为每个日志文件建立一个进程。在 Turbolinux 中就集成了 logcheck 工具。





    回页首


    4 ssh

    传 统的网络服务程序,如:ftp、pop 和 telnet 在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有 其弱点的,就是很容易受到"中间人"(man-in-the-middle)这种方式的攻击。所谓"中间人"的攻击方式,就是"中间人"冒充真正的服务器 接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。

    通过使用 SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止 DNS 和 IP 欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替 telnet,又可以为 ftp、pop、甚至 ppp 提供一个安全的"通道"。

    最初 SSH 是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用 OpenSSH。OpenSSH 是 SSH 的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是 SSH。

    从客户端来看,SSH 提供两种级别的安全验证。

    第一种级别是基于口令的安全验证,这种机制就相当于普通的 telnet 等服务的口令认证机制。

    第 二种级别是基于密匙的安全验证。你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到 SSH 服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和 你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密"质询"(challenge)并把它发送给客户端软件。客户端软件收到"质 询"之后就可以用你的私人密匙解密再把它发送给服务器。

    可以在下面的站点下载:
    http://violet.ibs.com.au/openssh/

    "/etc/ssh/ssh_config" 文件是 OpenSSH 客户端的配置文件,允许你通过设置不同的选项来改变客户端程序的运行方式。这个文件的每一行包含"关键词-值"的匹配,其中"关键词"是忽略大小写的。用 man 命令查看帮助页(ssh (1))可以得到详细的说明。

    "/etc/ssh/sshd_config" 是 OpenSSH 的服务器端配置文件,允许设置选项改变这个 daemon 的运行。这个文件的每一行包含"关键词-值"的匹配,其中"关键词"是忽略大小写的。用 man 命令查看帮助页(sshd (8))可以得到详细的说明。

    配置 OpenSSH 使其使用 TCP-Wrappers inetd 超级服务器,编辑 "inetd.conf" 文件(vi /etc/inetd.conf)并加入这一行:

    ssh stream tcp nowait root /usr/sbin/tcpd sshd -i
    

    注意:"-i"参数很重要,它说明 sshd 是被 inetd 运行的。

    现在我们为本地服务器创建私有和公用密匙,执行下面的命令:

    [root@sound]# su username 
    [username@sound]$ ssh-keygen1 
    

    产生密钥后把本机的公用密匙(identity.pub)拷贝到远程主机的"/home/username/.ssh"目录下,例如,使用"authorized_keys"这个名字。

    用加上"-p"参数的"ssh-keygen"命令,在任何时候都可以改变初始的密码。

    下面列出的是一些我们经常要用到的命令,当然还有很多其它的命令,更详细的信息可以查看 man 帮助页或其它文档。

    1 ssh

    ssh(Secure Shell)是用来登录远程计算机和在远程计算机上执行命令的程序。它是用来替代 rlogin 和 rsh,以及在不安全的网络环境下在两台计算机之间提供安全和加密的信息交流。

    使用下面的命令可以从客户端连接到远程主机 server:

    [root@sound /]# su admin 
    [admin@sound /]$ssh server
    

    2 scp

    可以用这个命令把文件从本地计算机拷贝到远程计算机,或者反之,甚至可以在两台远程计算机之间用 "scp" 命令拷贝文件。

    用下面的命令把文件从远程主机拷贝到本地主机上:

    [root@sound /]# su admin 
    [admin@sound /]$ scp -p :/dir/for/file localdir/to/filelocation
    

    用下面的命令把文件从本地主机拷贝到远程主机上:

    [root@sound/]# su admin 
    [admin@sound /]$ scp -p localdir/to/filelocation :/dir/for/file
    

    注意:"-p" 选项表示文件的改变和访问时间属性以及权限,在拷贝过程中被保留。通常是需要这样的。





    回页首


    5 tripwire

    如 果有人侵入了您的系统,在您的系统中放置了木马和后门,您怎么才能知道呢?tripwire 就是这样一个对系统做完整性检查的工具。它是目前最为著名的 unix 下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来。当文件现在的数字签名与保留的数字签名不一 致时,那么现在这个文件必定被改动过了。

    当Tripwire 运行在数据库生成模式时,会根据管理员设置的一个配置文件对指定要监控的文件进行读取,对每个文件生成相应数字签名,并将这些结果保存在自己的数据库中, 在缺省状态下,MD5 和 SNCFRN(Xerox 的安全哈希函数)加密手段被结合用来生成文件的数字签名。除此以外,管理员还可使用 MD4,CRC32,SHA 等哈希函数,但实际上,使用上述两种哈希函数的可靠性已相当高了,而且结合 MD5 和 sncfrn 两种算法(尤其是 sncfrn)对系统资源的耗费已较大,所以在使用时可根据文件的重要性做取舍。当怀疑系统被入侵时,可由 Tripwire 根据先前生成的,数据库文件来做一次数字签名的对照,如果文件被替换,则与 Tripwire 数据库内相应数字签名不匹配, 这时 Tripwire 会报告相应文件被更动,管理员就明白系统不"干净"了。

    可以从下面站点获得 tripwire:
    http://www.tripwiresecurity.com

    "/usr/TSS/policy/twpol.txt" 文件是纯文本的策略文件,设置 Tripwire 需要检测哪些文件和目录(也叫系统对象)。其中有一个规则设定如何检测需要监控的对象,还有一个特性(property)设置如何检测。特性掩码 (property mask)设定进行一致性检验的时候单独文件的特性(property)。属性(Attributes)帮助规定成组的策略如何运作。

    您可以根据您的需要修改 twpol.txt 这个策略文件,然后当第一次准备使用策略文件的时候,用下面的安装它:

    [root@sound]# twadmin --create-polfile /usr/TSS/policy/twpol.txt
    

    第一次创建基准数据库:用下面的命令

    [root@sound]# tripwire { --init }
    

    一致性检查把当前文件系统中的对象及其属性和 Tripwire 数据库中的进行比较。一旦发现异常情况,就会在标准输出上显示出来,报表文件也会被保存下来,以后可以用 "twprint" 命令查看:

     [root@sound]# tripwire { --check }
     

    用下面的命令进行交互式的检查:

     [root@sound]# tripwire --check --interactive
     

    用下面的命令进行一致性检查并用email发送报表:

     [root@sound]# tripwire --check --email-report
     

    用下面的命令更新数据库:

     [root@sound]# tripwire --update -r /usr/TSS/report/sound.openarch.com-200001-021854.twr
     

    "-r"参数读取指定的报表文件(deep.openarch.com-200001-021854.twr)。因为当前的配置文件的 REPORTFILE 变量使用$(DATE),所以"-r"这个参数是必须的。

    用下面的命令更新策略文件:

    [root@deep]# tripwire --update-policy /usr/TSS/policy/newtwpol.txt
    

    在默认情况下,策略更新模式使 用"--secure-mode high"。如果文件系统在最近的一次数据库更新之后发生了变化,而且这个变化会违反策略文件中定义的规则,那么在高安全级别的模式下运行你可能会遇到一 些问题。例如这种情况:其他的管理员在策略更新的过程中,改变了一些文件。为了解决这个问题,确信在高安全级别的模式下所有的变化都是正常的之后,可以采 用低级别的安全模式更新策略文件:

    用下面的命令在低级别的安全模式下更新策略文件:

    [root@sound]# tripwire --update-policy --secure-mode low /usr/TSS/policy/newtwpol.txt
    

    如果想查找详细的资料可以用man命令查帮助页,读取相关信息。





    回页首


    6 portsentry

    我们可以通过防火墙限制自己系统中什么端口开放,什么端口不开放。对于外部的人们来说,这些信息都是保密的。黑客为了得到您机器中开放的端口,往往会进行各种方式的扫描,这样的扫描软件在互联网上也随处都是。一般的扫描活动都是进行入侵的前奏,对安全是极大的危险。

    Portsentry 就是一个反扫描工具。它可以实时发现并分析记录对本机的扫描, 它主要做以下工作:

    • 通过 syslog 做记录
    • 将扫描的主机加入 /etc/hosts.deny
    • 马上禁止所有通向扫描主机的网络流量
    • 过滤掉所有来自扫描主机的网络流量

    您可以从下面的网站获得portsentry:
    http://www.psionic.com/abacus/portsentry/

    "/usr /psionic/portsentry/portsentry.conf"是 portsentry 的主配置文件。您可以在这个文件中设置您所要监听的端口,以及哪些 ip 地址被拒绝,哪些被忽略等等信息。如果您了解详细的信息,可以查看 "README.install" 文件。

    "/usr/psionic/portsentry/portsentry.ignore" 文件定义了在执行端口扫描分析时必须要忽略的主机,也就是说即使这些主机进行了扫描活动,portsentry 也不会采取任何行动。

    Portsentry 有以下6种启动方式:

        portsentry -tcp (basic port-bound TCP mode)
      portsentry -udp (basic port-bound UDP mode)
      portsentry -stcp (Stealth TCP scan detection)
      portsentry -atcp (Advanced TCP stealth scan detection)
      portsentry -sudp ("Stealth" UDP scan detection)
      portsentry -audp (Advanced "Stealth" UDP scan detection)
      

    建议您可以使用下面两种方式启动 portsentry:

       portsentry -atcp (Advanced TCP stealth scan detection)
      portsentry -sudp ("Stealth" UDP scan detection)
      

    一种 tcp 启动方式和一种 udp 启动方式可以同时进行。

    您可以把下面的两个命令加入 "/etc/rc.d/rc.local" 中,当系统重起时自动启动:

    [root@sound /]# /usr/psionic/portsentry/portsentry -atcp
    [root@sound /]# /usr/psionic/portsentry/portsentry -sudp
    

    对于更详细的信息您可以查阅 man 手册和 portsentry 自带的帮助文件。





    回页首


    7 openssl

    一 些服务器端的软件例如:IMAP & POP, Samba, OpenLDAP, FTP, Apache 等等在给用户提供服务的时候要对用户进行认证,只有在认证通过后服务才会被许可。而 client/server 方式的服务客户端和服务端之间通讯都是以明文方式进行的,openssl 正是提供了对传输的数据的一种加密方式。Openssl 可以安装在 Linux 服务器上,它需要一些第三方提供的应用程序来为服务提供加密。

    下面看一些使用 openssl 加密能为我们提供的好处:

    1 数据的保密性

    openssl 实际在真正的数据加密上使用的是对称算法,一个密钥既用来加密也用来解密。我们在公开的网络介质上传输的再不是明文,即使有人能截获这些数据,没有密钥也是很难进行解密的。

    2 数据的完整性

    openssl 对数据用 hash 算法一个消息文摘,然后用对方的公钥对消息文载做数字签名,消息文摘的加密使用的是非对称算法。然后消息文摘和数据一起传给接收方,接收方用自己的密钥先对数字签名进行解密,这样就保证了数据的完整性。

    从下面的站点可以获得 openssl:
    http://www.openssl.org/

    编译安装以后还要执行下面几个命令:

    [root@sound openssl-0.9.5a]# mv /etc/ssl/misc/* /usr/bin/
    [root@sound openssl-0.9.5a]# install -m 644 libRSAglue.a /usr/lib/
    [root@so. openssl-0.9.5a]# install -m 644 rsaref/rsaref.h /usr/include/openssl/
    

    "/etc/ssl/openssl.cnf"是 openssl 的主配置文件,里面要改动的主要是[CA_default ] 和[ req_distinguished_name ] 两个部分。

    如 果你想要使用 "openssl ca" 这个命令做 CA 证书时时,你需要建立一个 "sign.sh" 的脚本,这个脚本实际是存在的,在"/usr/bin/sign.sh", 您所要做的是在这个文件中加入一些东西。在 mod_ssl 的发行版中您也可以找到这个脚本。

    下面我们举个例子讲述 openssl 的应用,我们用自己的 CA 为自己的 apache web server 做一个证书来签名我们自己的证书签名请求(CSR)。

    1 为 apache web server 建立一个有密码保护的RSA私钥

    [root@sound ssl]# openssl genrsa -des3 -out server.key 1024
    

    2 用上面的 RSA 私钥产生一个证书签名请求(CSR)

    [root@sound ssl]# openssl req -new -key server.key -out server.csr
    

    3 为我们自己的 CA 创建一个 RSA 私钥

    [root@sound ssl]# openssl genrsa -des3 -out ca.key 1024

    4 用 CA 的 RSA 密钥做一个自签名的 X509 格式的证书

    [root@sound ssl]# openssl req -new -x509 -days 365 -key ca.key -out ca.crt

    5 将上面产生的私钥和证书移动到合适的目录下

        [root@deep ssl]# mv server.key private/
       [root@deep ssl]# mv ca.key private/
    [root@deep ssl]# mv ca.crt certs/
    
        

    6 最后用我们自己的 CA 对证书签名

    [root@sound ssl]# /usr/bin/sign.sh server.csr
    

    更详细的信息请参考 man 帮助和程序自带的帮助。





    回页首


    8 Linux FreeS/WAN VPN

    对于客户端与服务器之间的通讯用SSL进行加密是一个很好的选择,但是很多情况下需要建立一种企业级的通讯通道。在两个网关之间的 Internet上点到点的传递极其私密的数据,出于这种加密和认证的需要,IPSEC 应运而生。

    IPSEC 是 Intenet 协议安全,它使用很强的密码系统提供认证和加密服务。IPSEC 在 IP 层进行加密,所以它对链路层的依赖型不大。它可以工作在各种底层网络上。IPSEC 可以为 IP 层以上的协议提供保护。对于用户来说,这种保护看起来是透明的。

    IPSEC 可以提供在两个网关之间的不安全的互联网上的安全通道的这种能力。在这种通道中传送的数据都是要求保密性非常高的数据,数据在发送者的网关处加密,在接收 者的网关处解密。这就是 VPN(Virtual Private Network)。Freeswan 就是在 Linux 下实现 IPSEC 的工具。

    您可以到下面的站点下载 freeswan:
    http://www.freeswan.org/

    由于 freeswan 是以内核补丁形式提供的,所以您必须先下载 Linux 内核,再下载对应于内核的 freeswan。 我们先要根据自己的系统情况修改 freeswan 的 Makefile 文件,然后用下面的命令进行编译,并且把 freeswan 加入到 Linux 内核的源代码中:

    [root@sound freeswan-1.3]# make insert
    [root@sound freeswan-1.3]# make programs
    [root@sound freeswan-1.3]# make install
    

    然后我们就需要编译内核,这里不想再介绍如何编译内核,只提示要改变的内核选项,下面这些选项您都要确定选"Y":

    IPSec options (FreeS/WAN)
    IP Security Protocol (FreeS/WAN IPSEC) (CONFIG_IPSEC) [Y/n/?]
    IPSEC: IP-in-IP encapsulation (CONFIG_IPSEC_IPIP) [Y/n/?]
    IPSEC: PF_KEYv2 kernel/user interface (CONFIG_IPSEC_PFKEYv2) [Y/n/?]
    IPSEC: Enable ICMP PMTU messages (CONFIG_IPSEC_ICMP) [Y/n/?]
    IPSEC: Authentication Header (CONFIG_IPSEC_AH) [Y/n/?]
    HMAC-MD5 authentication algorithm (CONFIG_IPSEC_AUTH_HMAC_MD5) [Y/n/?]
    HMAC-SHA1 authentication algorithm (CONFIG_IPSEC_AUTH_HMAC_SHA1) [Y/n/?]
    IPSEC: Encapsulating Security Payload (CONFIG_IPSEC_ESP) [Y/n/?]
    3DES encryption algorithm (CONFIG_IPSEC_ENC_3DES) [Y/n/?]
    IPSEC Debugging Option (DEBUG_IPSEC) [Y/n/?]
    

    一些内核选项会被 freeswan 自动打开,即使这些选项原来是关闭的。尽管这样还是建议您不要关闭下面的选项:

    Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?]
    Netlink device emulation (CONFIG_NETLINK_DEV) [Y/n/?]
    

    Freeswan 的配置文件 "/etc/ipsec.conf" 许可您设定您的 IPSEC 设置,连接类型以及控制信息等。IPSEC 目前支持两种类型的连接:手工连接和自动连接。手工连接需要的密钥保存在 "/etc/ipsec.conf" 文件中,这种连接没有自动连接安全。对于一个商业应用来说,使用手工(固定)密钥是不安全和不可靠的。在自动密钥连接模式下产生一个 256 位共享密钥,将其复制到连接通道的各个节点上后,那些企图截取数据包的网络攻击者将很难攻破这种安全连接。在自动密钥连接模式下,一个密钥的有效期是 8 个小时,这种配置有效地阻止了那些企图用暴力法猜出密钥的攻击者。自动连接的密钥由一个叫 Pluto 的密钥协商守候进程产生,缺省使用叫 IKE 的密钥协商协议。这个协议根据 "/etc/ipsec.secrets" 文件中的信息确定不同的系统。

    我们下面举一个例子论述配置和使用的整个过程。假如我们有下面的 VPN 通道:

    SubnetDeep===Deep------Deepgate..………....Mailgate-------Mail===SubnetMail
                               Untrusted net
    左边子网= SubnetDeep (192.168.1.0/24)
    左边的主机 = Deep (deep.openna.com)(202.164.186.1)
    左边的网关 = Deepgate (205.151.222.250)
    Internet = Untrusted net
    右边的网关 = Mailgate (205.151.222.251)
    右边的主机 = Mail (mail.openna.com)( 208.164.186.2)
    右边的子网= SubnetMail (192.168.1.0/24)
    

    我们要编辑 ipsec.conf 文件来来满足我们的需要。在这个文件中有两大个段落。第一个 "config" 是关于 IPSEC 的一些普通配置信息的,后一个 "conn" 指定特定的 IPSEC 连接通道。具体的配置信息可以参看 man 帮助页。

    "ipsec.secrets" 包含 pluto 守候进程认证网关之间通讯的密钥。有两种类型的密钥,一种是共享的密钥,一种是RSA的私人密钥。 下面的命令产生 256 位的共享密钥:

    [root@deep /]# ipsec ranbits 256 > temp
    

    现在这个共享密钥在 temp 文件中,我们要把它复制到 "ipsec.secrets" 文件中。"ipsec.conf" 和 "ipsec.secrets" 都要拷贝到 VPN 通道另一端的网关上。"ipsec.conf" 文件中的 "config setup" 字段可能要根据接口的不同有所改变。

    接下来我们要创建 RSA 的密钥对了:

    我们在两个网关上都建立密钥对:

    [root@deep /]# ipsec rsasigkey --verbose 1024 > deep-keys
    [root@mail /]# ipsec rsasigkey --verbose 1024 > mail-keys
    

    然后我们将前面产生的 temp 文件中的共享密钥放在每个网关的 "ipsec.conf" 文件中,在文件中的 "conn" 字段加入下面几行:

        authby=rsasig
       leftrsasigkey=<Public key of deep>
    rightrsasigkey=<Public key of mail>
    

    然后在两个网关上处理 deep-keys 和 mail-keys 这两个 RSA 公钥,我们把这个个文件中的 "#pubkey=" 部分拷贝到各自的 "ipsec.conf"中去,如下:

    authby=rsasig
    leftrsasigkey=0x010395daee1be05f3038ae529ef2668afd79f5ff1b16203c9ceaef801cea9cb74bcfb51a6ecc08890d3
    eb4b5470c0fc35465c8ba2ce9d1145ff07b5427e04cf4a38ef98a7f29edcb4d7689f2da7a69199e4318b4c8d0ea25d33e4f
    084186a2a54f4b4cec12cca1a5deac3b19d561c16a76bab772888f1fd71aa08f08502a141b611f
    rightrsasigkey=0x01037631b81f00d5e6f888c542d44dbb784cd3646f084ed96f942d341c7c4686cbd405b805dc728f86
    97475f11e8b1dd797550153a3f0d4ff0f2b274b70a2ebc88f073748d1c1c8821dc6be6a2f0064f3be7f8e4549f8ab9af649
    44f829b014788dd202cf7d2e320cab666f5e7a197e64efe0bfee94e92ce4dad82d5230c57b89edf
    

    最后把deep-keys和mail-keys这两个文件中的剩余部分包括(包括私钥)放进"ipsec.secrets"中去。

    然后重新启动带有IPSec支持的内核的系统。系统重启时会出现几个错误,这主要是IPSec在缺省情况下使用了实际并不存在的eth999接口。建议你将ipsec程序的路径加入到用户环境变量中。

    IPSec的网络设置首先,需要允许网关服务器的TCP-IP转发。在Red Hat Linux系统中的实现方法:

    将 FORWARD_IPV4="false" 改为 FORWARD_IPV4="yes" 即可。

    另一个方法是直接修改/proc文件系统,执行以下命令即可:

        cat 1 > /proc/sys/net/ipv4/ip_forward
        

    然后我们要重新启动网络:

    [root@deep /]# /etc/rc.d/init.d/network restart
    

    这时pluto守候进程要启动,它尝试去连接另一边的网关上的pluto守候进程,这样一个连接就可以建立了。所以我们要在ipchains的配置文件中加入一些包过滤规则许可以下的协议通过网关通往另一边的网关:

        UDP port 500 for IKE implemented by the Pluto daemon
      Protocol 50 for ESP encryption and/or authentication
      Protocol 51 for AH packet-level authentication
      

    必须保证IP欺骗选项没有被打开,可以将下面的命令添加到/etc/rc.d/rc.local文件中:

    [root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/ipsec0/rp_filter
    [root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
    

    最后要注意的是, 任何使用了 IPSec 的内部网络的所有伪装(masquerade),规则都必须在允许 IPSec 的规则之后进行,否则主机将试图伪装 (masquerade) 数据包,而不是将它们传递给 IPSec。所以我们还要在两边网关的 ipchains 配置文件中加入下面的设定来保证能够正常的转发 IPSEC 的数据包:

    # Masquerade internal traffic.
    # All internal traffic is masqueraded externally.
    ipchains -A forward -i $EXTERNAL_INTERFACE -s $LOCALNET_1 -j MASQ
    Where EXTERNAL_INTERFACE="eth0" # You external interface to the Internet.
    Where LOCALNET_1=" 192.168.1.0/24" # whatever private range you use.
    

    现在可以重启机器了,我们所要做的设置都完成了,一个 VPN 已经构建好了。

    详细的信息请参阅 man 帮助和工具自带的帮助文件。





    回页首


    小结

    我 们所讨论的以上内容都是为了更好的固化我们的 linux 系统,我们讨论了 linux 服务器的安装和安全设置中要注意的问题,我们还谈到了 linux 的日志系统,概要的举出了一些安全工具。由于篇幅所限不可能讲的非常详细彻底,也有很多其他好的安全工具并没有给大家列出。下面给出一个安全工具的列表供 大家参考,详细的说明可详见说明文档和 man 文档。

    工具名称工具作用
    Sxid检查系统中的 suid,sgid 以及没有主人的文件
    skey一次性口令工具
    logrotate日志循环工具
    logcheck日志管理工具
    swatch日志管理工具,比 logcheck 实时
    Ssh(openssh)提供安全的连接认证
    openssl提供加密的数据传送和认证
    Portsentry反扫描工具,监视自己的udp和tcp端口
    tripwire提供系统完整性检查
    gnupg对单个文件进行加密以及创建数字签名
    hostsentry基于主机的入侵检测,将连接记入日志
    ipchainsLinux发行版自带的包过滤形防火墙
    CFS 和 TCFS密码文件系统和透明的密码文件系统实现目录下所有文件加密,基于 NFS
    Anti-sniff反嗅探工具,检查网络中是否有嗅探器
    Freeswan在 linux 实现 VPN 的工具
    Syslog-ng替代 syslog 的日志文件系统
    Scandns进行 dns 检查追踪的工具
    WhiskerCgi 扫描器
    Snoopy通过跟踪 execve 系统调用记录执行的命令
    Linux kernel patch内核的安全补丁,防止缓冲溢出等
    krnsniff一个基于内核的监听模块
    iptable用来替代ipchains的包过滤防火墙
    Imsafe通过跟踪系统调用来检测缓冲溢出等问题
    Iplog对来往的包进行日志记录
    Solaris designer内核补丁,防止缓冲溢出等
    Stackguard作为补丁修补gcc,防止缓冲溢出
    DTKHoney port欺骗式防御
    Antiroute阻止和记录基于路由的跟踪

    安全工具介绍

    希望您能经常关心最新的安全漏洞和安全新闻,没有任何系统是完全安全的。这篇文章的目的不过是使大家对安全有一个明确的认识,使安全真正能够得到您的重视,做到深入人心。



    参考资料


    “Intrusion Detection Systems”

    http://baike.baidu.com/view/34066.htm

    http://safe.it168.com/a2008/1002/206/000000206986.shtml

    如果你只有一台电脑  , 那么对你而言花费大量的工夫仔细审查系统的弱点和问题是完全可能的。可能你并不真得希望这样,但却有此可能。不过,在现实世界中,我们需要一些好的工具来 帮助我们监视系统,并向我们发出警告,告诉我们哪里可能出现问题,因此我们可以经常地轻松一下。入侵检测可能是一种令我们操心的问题之一。不过,事情总有 两方面,幸好Linux的管理员们拥有可供选择的强大工具。最佳的策略是采用分层的方法,即将“老当益壮”的程序,如Snort、iptables等老前 辈与psad、AppArmor、SELinuxu等一些新生力量结合起来,借助强大的分析工具,我们就可以始终站在技术的前沿。 

      在现代  , 机器上的任何用户账户都有可能被用来作恶。笔者认为,将全部的重点都放在保护root上,就好像其它用户账户不重要一

    END

  • 相关阅读:
    Android实现App版本自动更新
    Android EditText+ListPopupWindow实现可编辑的下拉列表
    Android 侧滑面板的实现(DragLayout)
    android之SlideMenu双向滑动
    Android 从无到有打造一个炫酷的进度条效果
    Android 自定义View修炼-仿360手机卫士波浪球进度的实现
    TabLayout禁止选择
    Metasploit的攻击实例讲解----ms10_046快捷方式图标漏洞
    PowerDesigner 16.5的下载安装破解注册(图文详解)
    Metasploit的armitage初步使用
  • 原文地址:https://www.cnblogs.com/lindows/p/14390548.html
Copyright © 2020-2023  润新知