• 开源入侵检测系统SELKS系统搭建


     

    一、系统环境配置

    系统环境:centos7x64      ip地址:172.16.91.130

    1.设置静态IP地址

    [root@localhost backlion]#vi  /etc/sysconfig/network-scripts/ifcfg-*

    BOOTPROTO=static #dhcp改为static(修改)

    ONBOOT=yes #开机启用本配置,一般在最后一行(修改)

    IPADDR=172.16.91.130  #静态IP(增加)

    GATEWAY=172.168.91.1  #默认网关,虚拟机安装的话,通常是2,也就是VMnet8的网关设置(增加)

    NETMASK=255.255.255.0 #子网掩码(增加)

    DNS1=172.16.95.70  #DNS 配置,虚拟机安装的话,DNS就网关就行,多个DNS网址的话再增加(增加)

    [root@localhost ~]# /etc/init.d/network  restart 

    设置DNS:

    Vim  /etc/resolv.conf

    nameserver=114.114.114.114

    nameserver=8.8.8.8

     

    2.设置主机名

    [root@localhost network-scripts]# hostnamectl set-hostname  selks-server.com

    vim /etc/hosts最后加上你的IP与主机名的绑定
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    172.16.91.121   elk-server.com  elk#
    其中最后是主机名的别名
    主机名:内网名字
    域名:公网名字
    主机名不能是localhost
    绑定主机名就相当于内网的dns,非常重要。

    3.关闭防火墙

    [root@selks-server ~]# cat /etc/selinux/config

    # This file controls the state of SELinux on the system.

    # SELINUX= can take one of these three values:

    #enforcing - SELinux security policy is enforced.

    #permissive - SELinux prints warnings instead of enforcing.

    #disabled - No SELinux policy is loaded.

    SELINUX=disabled

    # SELINUXTYPE= can take one of three two values:

    #targeted - Targeted processes are protected,

    #minimum - Modification of targeted policy. Only selected processes are protected.

    #mls - Multi Level Security protection.

    SELINUXTYPE=targeted

    或者

    [root@localhost ~]# sed -i 7s/enforcing/disabled/ /etc/selinux/config

    关闭firewall

    [root@selks-server ~]# systemctl stop firewalld.service   #停止firewall 
    [root@selks-server ~]# systemctl disable firewalld.service  #
    禁止firewall开机启动 

    [root@localhost ~]# systemctl list-unit-files |grep firewalld  #查看是否随机启动firewall

     

    4. 安装wget

    [root@selks-server ~]#  yum install wget –y

    5.更换yum

    更换成阿里云源,更新系统、下载软件速度快4

    [root@selks-server ~]#yum install  wget

    [root@selks-server ~]# mv  /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

    [root@selks-server ~]#  wget  -O  /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    [root@selks-server ~]#  yum clean all

    [root@selks-server ~]#  yum makecache

    6.更新系统

    [root@selks-server ~]# yum -y update

    7.安装epel

    [root@selks-server rules]# yum -y install epel-release

    8.时间同步


    [root@localhost yum.repos.d]# yum -y install ntp ntpdate  #安装ntp时间同步相关软件包
    [root@localhost yum.repos.d]#cat  /etc/ntp.conf   #
    确认配置文件里有下列的时间同步源
    server 0.rhel.pool.ntp.org iburst
    server 1.rhel.pool.ntp.org iburst
    server 2.rhel.pool.ntp.org iburst
    server 3.rhel.pool.ntp.org iburst
    [root@localhost yum.repos.d]# systemctl enable ntpd   #
    设置开机自动启动ntpd
    [root@localhost yum.repos.d]#  systemctl start ntpd        #
    立即启动ntpd服务

    [root@localhost yum.repos.d]#

    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    [root@localhost yum.repos.d]#date #
    确认时间与现在时间一致

    9.添加路由

    用法:route add -net|-host DEST gw NEXTHOP

    route add -net 10.0.0.0/8 gw 192.168.10.1        #添加路由

    route add default gw 192.168.10.1                #添加一条默认路由

     

    永久添加/删除关于某个网卡的路由:编辑/etc/network-scripts/route-INTERFACE_NAME

    vim /etc/network-scripts/route-eth0

    ADDRESS0=222.16.60.148

    NETMASK0=255.255.255.0

    NEXTHOP0=222.16.60.254

     

    ADDRESS1=222.16.60.214

    NETMASK1=255.255.255.0

    NEXTHOP1=222.16.60.254

    二、安装Suricata

    1.安装依赖包

    [root@selks-server ~]# yum install wget libpcap-devel libnet-devel pcre-devel gcc-c++ automake autoconf libtool make libyaml-devel zlib-devel file-devel jansson-devel nss-devel

    2.下载解压Suricata

    下载最新安装包http://suricata-ids.org/download/(截至18614日,最新版本为4.0.4

    [root@selks-server ~]# wget  http://www.openinfosecfoundation.org/download/suricata-4.0.4.tar.gz

    [root@selks-server ~]# tar zxvf suricata-4.0.4.tar.gz

    [root@selks-server ~]# cd suricata-4.0.4

    3.编译安装

    [root@selks-server ~]#./configure && make && make install-full

    注意:

    默认从http://rules.emergingthreats.net/社区下载可用的社区规则集快照,并且将其存储在/usr/local/etc/suricata/rules目录下。

    suricata配置文件路径为:

    /usr/local/etc/suricata/suricata.yaml

    4.配置suricata

    请注意:不管使用哪个端口, Suricata都能自动检测HTTP流量。所以,正确指定HTTP_PORTS变量并不是很重要。命令如下:

    [root@selks-server ~]# vim   /usr/local/etc/suricata/suricata.yaml

    #Suricata 的配置文件默认在 /etc/suricata/suricata.yaml,在启动前我们需要先配置好一些重要的变量,其中变量分为两组,一个是地址组(address-groups),另一个是端口组(port-groups)。示例配置文件如下

    注意:如果HOME_NET设置了anyEXTERNAL_NET设置!HOME_NET的话会报错,如果HOME_NET设置了内网地址,EXTERNAL_NET设置为!$HOME_NET的话,有些内网之间的告警就无法匹配到

     

    address-groups:    #配置地址组 

    HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"  #指定 Suricata 检查的网络

    #HOME_NET: "[192.168.0.0/16]"

        #HOME_NET: "[10.0.0.0/8]"

        #HOME_NET: "[172.16.0.0/12]"

        #HOME_NET: "any"

     

        #EXTERNAL_NET: "!$HOME_NET"

         EXTERNAL_NET: "any"  #设置出本地以外的其他网络地址

     

        HTTP_SERVERS: "$HOME_NET"

        SMTP_SERVERS: "$HOME_NET"

        SQL_SERVERS: "$HOME_NET"

        DNS_SERVERS: "$HOME_NET"

        TELNET_SERVERS: "$HOME_NET"

        AIM_SERVERS: "$EXTERNAL_NET"

        DNP3_SERVER: "$HOME_NET"

        DNP3_CLIENT: "$HOME_NET"

        MODBUS_CLIENT: "$HOME_NET"

        MODBUS_SERVER: "$HOME_NET"

        ENIP_CLIENT: "$HOME_NET"

        ENIP_SERVER: "$HOME_NET"

     

      port-groups:

        HTTP_PORTS: "80"  #来辨别不同服务所用到的端口号

        SHELLCODE_PORTS: "!80"

        ORACLE_PORTS: 1521

        SSH_PORTS: 22

        DNP3_PORTS: 20000

        MODBUS_PORTS: 502

        FILE_DATA_PORTS: "[$HTTP_PORTS,110,143]"

    FTP_PORTS: 21

    ## Step 2: select the rules to enable or disable

    ##

    default-rule-path: /usr/local/etc/suricata/rules  #设置默认的规则库路径地址

    rule-files:

     - botcc.rules

     # - botcc.portgrouped.rules

     - ciarmy.rules

     - compromised.rules

     - drop.rules

     - dshield.rules

    # - emerging-activex.rules

     - emerging-attack_response.rules

     - emerging-chat.rules

     - emerging-current_events.rules

     - emerging-dns.rules

     - emerging-dos.rules

     - emerging-exploit.rules

     - emerging-ftp.rules

    # - emerging-games.rules

    # - emerging-icmp_info.rules

    # - emerging-icmp.rules

     - emerging-imap.rules

    # - emerging-inappropriate.rules

    # - emerging-info.rules

     - emerging-malware.rules

     - emerging-misc.rules

     - emerging-mobile_malware.rules

     - emerging-netbios.rules

     - emerging-p2p.rules

     - emerging-policy.rules

     - emerging-pop3.rules

     - emerging-rpc.rules

    # - emerging-scada.rules

    # - emerging-scada_special.rules

     - emerging-scan.rules

    # - emerging-shellcode.rules

     - emerging-smtp.rules

     - emerging-snmp.rules

     - emerging-sql.rules

     - emerging-telnet.rules

     - emerging-tftp.rules

     - emerging-trojan.rules

     - emerging-user_agents.rules

     - emerging-voip.rules

     - emerging-web_client.rules

     - emerging-web_server.rules

    # - emerging-web_specific_apps.rules

     - emerging-worm.rules

     - tor.rules

    # - decoder-events.rules # available in suricata sources under rules dir

    # - stream-events.rules  # available in suricata sources under rules dir

     - http-events.rules    # available in suricata sources under rules dir

     - smtp-events.rules    # available in suricata sources under rules dir

     - dns-events.rules     # available in suricata sources under rules dir

     - tls-events.rules     # available in suricata sources under rules dir

    # - modbus-events.rules  # available in suricata sources under rules dir

    # - app-layer-events.rules  # available in suricata sources under rules dir

    # - dnp3-events.rules       # available in suricata sources under rules dir

    # - ntp-events.rules       # available in suricata sources under rules dir

     

    classification-file: /usr/local/etc/suricata/classification.config

    reference-config-file: /usr/local/etc/suricata/reference.config

    threshold-file: /usr/local/etc/suricata/threshold.config

    ##

    ## Step 3: select outputs to enable

    ##

    types:

            - alert:

                # payload: yes             # enable dumping payload in Base64

                payload-buffer-size: 6kb    # max size of payload buffer to output in eve-log   paylaod大小限制

     

         payload-printable: yes   # enable dumping payload in printable (lossy) format  记录原始payload

     

                # packet: yes              # enable dumping of packet (without stream segments)

                # http-body: yes           # enable dumping of http body in Base64

              http-body-printable: yes # enable dumping of http body in printable format 记录http 原始响

     

                metadata: yes              # add L7/applayer fields, flowbit and other vars to the alert

     

    # pattern matcher buffers and scans as many packets as possible in parallel.
    max-pending-packets: 1024  #
    设置了suricata能够同时处理的数据包的数量,最少为1,最大值取决于内存的大小,更大的内存可以设置更大的值并拥有更好的性能,默认值是1024

     

     

     

    部分用于防御利用操作系统网络栈的自身行为来逃避检测的一些知名攻击手段(例如:TCP reassembly)。作为对策,通过针对目标操作系统而对检测引擎算法进行微调,现代 IDC 提供了基于目标的检测手段。因此,如果你知道某台主机运行了什么操作系统的话,将这个信息提供给 Suricata 就可以大幅提高检测的成功率。这就是 host-os-policy 存在的意义。本例中,默认的 IDC 策略是 Linux 系统。如果针对某个 IP 地址没有指定操作系统信息,Suricata 会默认应用基于 Linux 系统的检测策略。如下,当捕获到对 192.168.122.0/28 192.168.122.155通讯时,Suricata 就会应用基于 Windows 系统的检测策略。

    host-os-policy:

    # Make the default policy windows.

    windows: [10.22.0.0/24]

    bsd: []

    bsd-right: []

    old-linux: []

    linux: [0.0.0.0/0,10.22.0.188]

    old-solaris: []

    solaris: []

    hpux10: []

    hpux11: []

    irix: []

    macos: []

    vista: []

    windows2k3: []

    5.关闭网卡LGO/GRO功能(网卡名结合实际修改)

    [root@selks-server ~]# ethtool -K ens32 gro off lro off

    Cannot change large-receive-offload(说明你的网卡不支持LRO/GRO功能,忽略即可)

    6.查看所有可用的运行模式

    [root@selks-server ~]# /usr/local/bin/suricata --list-runmodes

     

    7.运行Suricata

    [root@selks-server ~]#

    /usr/local/bin/suricata   -c  /usr/local/etc/suricata/suricata.yaml

     -i   ens33  --init-errors-fatal &

    其中:

    • -c用来指定配置文件
    • -i 说明以 IDS 模式运行
    • Ens33 说明让 Suricata 监听 ens33 端口

     

    其中检测日志默认为 fast.log/usr/local/var/log/suricata/fast.log,同时还有json格式方便导入,位置是/usr/local/var/log/suricata/eve.json

    注意:

    启动命令:

    [root@selks-server ~]# ethtool -K ens33 gro off lro off   #ens33就是所需要监控的网卡地址

    [root@selks-server ~]#

    /usr/local/bin/suricata   -c  /usr/local/etc/suricata/suricata.yaml

     -i   ens33  --init-errors-fatal &

     

    三、安装ELK

    相关软件请到Elasticsearch官方网站下载

    Elasticsearch6.2.0下载
    Logstash6.2.0下载
    Kibana6.2.0下载

    1.安装elasticsearch

    [root@selks-server ~]#

    wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.0.rpm

    [root@selks-server ~]# chmod  +x elasticsearch-6.2.0.rpm

    [root@selks-server ~]# rpm -ivh elasticsearch-6.2.0.rpm

    [root@selks-server ~]# systemctl daemon-reload

    [root@selks-server ~]# systemctl enable elasticsearch.service

    [root@selks-server ~]# systemctl start elasticsearch.service

    访问本地9200端口,出现如下内容说明Elasticsearch安装成功

    [root@selks-server ~]# curl 127.0.0.1:9200

    {

    "name" : "79TP4oM",

    "cluster_name" : "elasticsearch",

    "cluster_uuid" : "9cxWmy3fQvmgiPRTtGYaZg",

    "version" : {

        "number" : "6.2.0",

        "build_hash" : "37cdac1",

        "build_date" : "2018-02-01T17:31:12.527918Z",

        "build_snapshot" : false,

        "lucene_version" : "7.2.1",

    "minimum_wire_compatibility_version" : "5.6.0",

    "minimum_index_compatibility_version" : "5.0.0"

    },

    "tagline" : "You Know, for Search"

    }

    2.安装logstash

    [root@selks-server ~]#

    wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.0.rpm

    [root@selks-server ~]# chmod  +x logstash-6.2.0.rpm

    [root@selks-server ~]# rpm -ivh logstash-6.2.0.rpm

    添加logstash过滤规则

    vim /etc/logstash/conf.d/logstash.conf

    input {

    file {

        path => ["/usr/local/var/log/suricata/eve.json "]

        codec =>"json"

        type => "SuricataIDPS"

    }

     

    }

     

    filter {

    if [type] == "SuricataIDPS" {

        date {

        match => [ "timestamp", "ISO8601" ]

        }

        ruby {

        code => "

            if event.get('[event_type]') == 'fileinfo'

            event.set('[fileinfo][type]', event.get('[fileinfo][magic]').to_s.split(',')[0])

            end

        "

        }

     

        ruby{

        code => "

            if event.get('[event_type]') == 'alert'

            sp = event.get('[alert][signature]').to_s.split(' group ')

            if (sp.length == 2) and /Ad+z/.match(sp[1])

                event.set('[alert][signature]', sp[0])

            end

            end

            "

        }

    }

     

    if [src_ip]  {

        geoip {

        source => "src_ip"

        target => "geoip"

        #database => "/opt/logstash/vendor/geoip/GeoLiteCity.dat"

        add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]

        add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]

        }

        mutate {

        convert => [ "[geoip][coordinates]", "float" ]

        }

        if ![geoip.ip] {

        if [dest_ip]  {

            geoip {

            source => "dest_ip"

            target => "geoip"

            #database => "/opt/logstash/vendor/geoip/GeoLiteCity.dat"

            add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]

            add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]

            }

            mutate {

            convert => [ "[geoip][coordinates]", "float" ]

            }

        }

        }

    }

    }

     

    output {

    elasticsearch {

        hosts => "localhost:9200"

    }

    }

    [root@selks-server ~]#  systemctl enable logstash.service

    [root@selks-server ~]# chmod 775 /usr/local/var/log/suricata/eve.json

    [root@selks-server ~]# systemctl start logstash.service

    3.安装kibana

    [root@selks-server ~]#

    wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.0-x86_64.rpm

    [root@selks-server ~]#chmod +x kibana-6.2.0-x86_64.rpm

    [root@selks-server ~]#rpm -ivh kibana-6.2.0-x86_64.rpm

    修改kibana允许访问的主机范围、默认只允许本地访问

    vim /etc/kibana/kibana.yml

    server.host: "0.0.0.0"

    systemctl start kibana.service

    systemctl enable kibana.service

    浏览器访问IP:5601,进入Kibana,这里应该会要求设置一个索引,这里使用logstash-*

     

    最终访问界面:

    附录Suricata规则详解

    ==botcc.portgrouped.rules botcc.rules==

     

    这些是已知和确认的活动僵尸网络和其C&C(command and control)服务器。由一些组织生成,每日更新。

     

    ==ciarmy.rules==

     

    封锁被ciArmy.com标记出来的Top Attackers

     

    ==compromised.rules==

     

    这是一个已知的受影响的主机列表,每天更新。

     

    decoder-events.rules

     

    解码器事件,里面包含了对解码器解码所产生的事件,比如包无效、包过大、过小等

     

    dnp3-events.rules

     

    包含对dnp3(分布式网络协议)的一些规则,不多,只有几条

     

    dns-events.rules

     

    包含对dns协议的一些规则,比如dnsflooded事件等,不多,只有几条

     

    ==drop.rules==

     

    每天更新的Spamhaus DROP(Don't Route or Peer)列表。列出了著名的、专业的垃圾邮件发送者。

     

    ==dshield.rules==

     

    每天更新的DShield top attackers。十分可靠。

     

    emerging-activex.rules

     

    主要用来检测与ActiveX控件有关的攻击

     

    ==emerging-attack_response.rules==

     

    这些规则是为了捕获成功攻击的结果,诸如“id=root”之类的东西,或者表示可能发生妥协的错误消息(即虽然产生了错误消息,但是攻击已经成功)。

     

    emerging-chat.rules

     

    主要检测聊天软件、即时通讯软件的攻击,大部分是国外的一些软件,比如facebook,雅虎,msn

     

    ==emerging-current_events.rules==

     

    这些规则是不打算在规则集中长期保存的,或者是在被包含之前进行测试。大多数情况下,这些都是针对当天的大量二进制URL的简单sigs,用来捕获CLSID新发现的易受攻击的应用程序,我们没有这些漏洞的任何细节。这些sigs很有用,却不是长期有效的。

     

    emerging-deleted.rules

     

    里面都是被注释掉的规则,可能删除后的规则放在这里

     

    emerging-dns.rules

     

    检测dns协议相关的攻击

     

    ==emerging-dos.rules==

     

    目的是捕获入站的DOS(拒绝服务)活动和出站指示。

     

    emerging-ftp.rules

     

    检测ftp协议相关的攻击

     

    ==emerging-games.rules==

     

    魔兽世界、星际争霸和其他流行的在线游戏都在这里。我们不打算把这些东西贴上邪恶的标签,只是它们不适合所有的攻击环境,所以将它们放在了这里。

     

    emerging-icmp_info.rules emerging-icmp.rules

     

    检测与icmp协议相关的攻击

     

    ==emerging-exploit.rules==

     

    直接检测exploits(漏洞)的规则。如果你在寻找windows的漏洞等,他们会在这里被列出。就像sql注入一样,exploits有着自己的体系。

     

    总之就是用来检测exploits漏洞的。

     

    emerging-imap.rules

     

    检测与imap相关的攻击

     

    ==emerging-inappropriate.rules==

     

    色情、儿童色情,你不应该在工作中访问的网站等等。WARNING:这些都大量使用了正则表达式,因此存在高负荷和频繁的误报问题。只有当你真正对这些规则感兴趣时才去运行这些规则。

     

    emerging-info.rules

     

    看了一些规则后,似乎是检测与信息泄露、信息盗取等事件的规则,里面会检测后门、特洛伊木马等与info相关的攻击

     

    ==emerging-malware.rules==

     

    我个人最喜欢的。这一套最初只是间谍软件,这就足够了。间谍软件和恶意软件之间的界限已经很模糊了。这里不仅仅是间谍软件,但是请放心,这里没有任何东西是你想在自己的网络或者PC上运行的。已知的更新模式、已知的恶意软件的UserAgent字符串和大量的其它有用的东西。如果你只准备运行一个规则集来保证安全性,这个规则集是首选。

     

    emerging-misc.rules

     

    检测混杂的攻击,这种攻击一般没有确切的分类,或者使用了多种技术

     

    emerging-mobile_malware.rules

     

    检测移动设备上的恶意软件

     

    emerging-netbios.rules

     

    检测与netbios有关的攻击

     

    ==emerging-p2p.rules==

     

    P2P(Peer to Peer)之类的。我们并不想将它定义为有害的,只是不适合出现在IPS/IDS的网络环境中。

     

    ==emerging-policy.rules==

     

    对于经常被公司或组织政策禁止的事务的规则。MyspaceEbay之类的东西。

     

    emerging-pop3.rules

     

    检测与pop3协议有关的攻击

     

    emerging-rpc.rules

     

    检测与rpc(远程过程调用协议)有关的攻击

     

    emerging-scada.rules

     

    检测与SCADA(数据采集与监控系统)相关的攻击

     

    ==emerging-scan.rules==

     

    检测探测行为。NessusNikto,端口扫描等这样的活动。这是攻击前准备时期的警告。

     

    emerging-shellcode.rules

     

    检测shellcodeshellcode是一段用于利用软件漏洞而执行的代码,以其经常让攻击者获得shell而得名。

     

    emerging-smtp.rules

     

    检测与smtp协议相关的攻击

     

    emerging-snmp.rules

     

    检测与snmp协议相关的攻击

     

    ==emerging-sql.rules==

     

    这是一个巨大的规则集,用于捕获在特殊应用程序上的特殊攻击。这里面有一些普遍的SQL注入攻击规则,效果很好,可以捕获大多数攻击。

     

    但是这些规则根据不同的app和不同的web服务器,有很大的差别。如果你需要运行非常严格的web服务或者很重视信息的安全性,请使用这个规则集。

     

    emerging-telnet.rules

     

    检测与telnet协议相关的攻击

     

    emerging-tftp.rules

     

    检测与tftp协议相关的攻击

     

    emerging-trojan.rules

     

    检测trojan木马

     

    emerging-user_agents.rules

     

    检测异常的user-agents

     

    ==emerging-voip.rules==

     

    检测voip相关的异常,它是一个新兴的规则集,目前还很小,但是我们预计它很快就会增长。

     

    emerging-web_client.rules

     

    检测web客户端的攻击

     

    emerging-web_server.rules

     

    检测web服务端的攻击

     

    emerging-web_specific_apps.rules

     

    检测特殊的web应用程序的异常

     

    emerging-worm.rules

     

    检测蠕虫

     

    modbus-events.rules

     

    检测modbus事件

     

    smtp-events.rulse

     

    检测smtp事件

     

    stream-events.rules

     

    检测stream事件

     

    tls-events.rules

     

    检测tls事件

     

    ==tor.rules==

     

    检测使用tor进行匿名通信的流量,tor本身没有威胁,但却是很可以的行为



    规则库更新管理

     [root@selks-server rules]#  yum installpython-pip python-yaml  

    [root@selks-server rules]#  pip install --pre --upgrade suricata-update 

    [root@selks-server rules]#suricata-update

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    企业应用的互联网化(2010年2月)
    Flex的危局,还是HTML5的盛宴?
    在MBP上自由切换显卡
    Django的中文编码问题
    Jenkins+Maven+SVN快速搭建持续集成环境(转)
    解决 phpmyadmin #2002 无法登录 MySQL 服务器
    Spring框架中获得DataSource对象的方法(转)
    jetty 源代码地址
    eclipse中js文件报missing semicolon
    等额本息贷款月付款额的推导公式
  • 原文地址:https://www.cnblogs.com/backlion/p/9244922.html
Copyright © 2020-2023  润新知