Skip to content Skip to main navigation Skip to footer

Linux

在 Ubuntu 15.04 中如何安装和使用 Snort

对于网络安全而言入侵检测是一件非常重要的事。入侵检测系统(IDS)用于检测网络中非法与恶意的请求。Snort是一款知名的开源的入侵检测系统。其 Web界面(Snorby)可以用于更好地分析警告。Snort使用iptables/pf防火墙来作为入侵检测系统。本篇中,我们会安装并配置一个开源的入侵检测系统snort。

Snort 安装

要求

snort所使用的数据采集库(DAQ)用于一个调用包捕获库的抽象层。这个在snort上就有。下载过程如下截图所示。

downloading_daq

解压并运行./configure、make、make install来安装DAQ。然而,DAQ要求其他的工具,因此,./configure脚本会生成下面的错误。

flex和bison错误

flexandbison_error

libpcap错误

libpcap error

因此在安装DAQ之前先安装flex/bison和libcap。

install_flex

如下所示安装libpcap开发库

libpcap-dev installation

安装完必要的工具后,再次运行./configure脚本,将会显示下面的输出。

without_error_configure

make和make install 命令的结果如下所示。

make install

make

成功安装DAQ之后,我们现在安装snort。如下图使用wget下载它。

downloading_snort

使用下面的命令解压安装包。

#tar -xvzf  snort-2.9.7.3.tar.gz

snort_extraction

创建安装目录并在脚本中设置prefix参数。同样也建议启用包性能监控(PPM)的sourcefire标志。

#mkdir /usr/local/snort
#./configure --prefix=/usr/local/snort/ --enable-sourcefire

snort_installation

配置脚本会由于缺少libpcre-dev、libdumbnet-dev 和zlib开发库而报错。

配置脚本由于缺少libpcre库报错。

pcre-error

配置脚本由于缺少dnet(libdumbnet)库而报错。

libdnt error

配置脚本由于缺少zlib库而报错

zlib error

如下所示,安装所有需要的开发库。

# aptitude install libpcre3-dev

libpcre3-dev install

# aptitude install libdumbnet-dev

libdumnet-dev installation

# aptitude install zlib1g-dev

zlibg-dev installation

安装完snort需要的库之后,再次运行配置脚本就不会报错了。

运行make和make install命令在/usr/local/snort目录下完成安装。

# make

make snort

# make install

make install snort

最后,从/usr/local/snort/bin中运行snort。现在它对eth0的所有流量都处在promisc模式(包转储模式)。

snort running

如下图所示snort转储流量。

traffic

Snort的规则和配置

从源码安装的snort还需要设置规则和配置,因此我们需要复制规则和配置到/etc/snort下面。我们已经创建了单独的bash脚本来用于设置规则和配置。它会设置下面这些snort设置。

  • 在linux中创建用于snort IDS服务的snort用户。
  • 在/etc下面创建snort的配置文件和文件夹。
  • 权限设置并从源代码的etc目录中复制数据。
  • 从snort文件中移除规则中的#(注释符号)。

 

#!/bin/bash#
# snort源代码的路径
snort_src="/home/test/Downloads/snort-2.9.7.3"
echo "adding group and user for snort..."
groupadd snort &> /dev/null
useradd snort -r -s /sbin/nologin -d /var/log/snort -c snort_idps -g snort &> /dev/null#snort configuration
echo "Configuring snort..."mkdir -p /etc/snort
mkdir -p /etc/snort/rules
touch /etc/snort/rules/black_list.rules
touch /etc/snort/rules/white_list.rules
touch /etc/snort/rules/local.rules
mkdir /etc/snort/preproc_rules
mkdir /var/log/snort
mkdir -p /usr/local/lib/snort_dynamicrules
chmod -R 775 /etc/snort
chmod -R 775 /var/log/snort
chmod -R 775 /usr/local/lib/snort_dynamicrules
chown -R snort:snort /etc/snort
chown -R snort:snort /var/log/snort
chown -R snort:snort /usr/local/lib/snort_dynamicrules
###copy  configuration and rules from  etc directory under source code of snort
echo "copying from snort source to /etc/snort ....."
echo $snort_src
echo "-------------"
cp $snort_src/etc/*.conf* /etc/snort
cp $snort_src/etc/*.map /etc/snort##enable rules
sed -i 's/include \$RULE\_PATH/#include \$RULE\_PATH/' /etc/snort/snort.conf
echo "---DONE---"

改变脚本中的snort源目录路径并运行。下面是成功的输出。

running script

上面的脚本从snort源中复制下面的文件和文件夹到/etc/snort配置文件中

files copied

snort的配置非常复杂,要让IDS能正常工作需要进行下面必要的修改。

ipvar HOME_NET 192.168.1.0/24  # LAN side

ipvar EXTERNAL_NET !$HOME_NET   # WAN side

veriable set

var RULE_PATH /etc/snort/rules     # snort signature path
var SO_RULE_PATH /etc/snort/so_rules        #rules in shared libraries
var PREPROC_RULE_PATH /etc/snort/preproc_rules  # Preproces path
var WHITE_LIST_PATH /etc/snort/rules        # dont scan
var BLACK_LIST_PATH /etc/snort/rules        #  Must scan

main path

include $RULE_PATH/local.rules   # file for custom rules

移除ftp.rules、exploit.rules前面的注释符号(#)。

path rules

现在下载社区规则并解压到/etc/snort/rules。启用snort.conf中的社区及紧急威胁规则。

wget_rules

community rules

进行了上面的更改后,运行下面的命令来检验配置文件。

# snort -T -c /etc/snort/snort.conf

snort running

总结

本篇中,我们关注了开源IDPS系统snort在Ubuntu上的安装和配置。通常它用于监控事件,然而它可以被配置成用于网络保护的在线模式。snort规则可以在离线模式中可以使用pcap捕获文件进行测试和分析


via: http://linoxide.com/security/install-snort-usage-ubuntu-15-04/

作者:nido 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

如何为你的平台部署一个公开的系统状态页

如果你是一个系统管理员,负责关键的 IT 基础设置或公司的服务,你将明白有效的沟通在日常任务中的重要性。假设你的线上存储服务器故障了。你希望团队所有人达成共识你好尽快的解决问题。当你忙来忙去时,你不会想一半的人问你为什么他们不能访问他们的文档。当一个维护计划快到时间了你想在计划前提醒相关人员,这样避免了不必要的开销。

这一切的要求或多或少改进了你、你的团队、和你服务的用户之间沟通渠道。一个实现它的方法是维护一个集中的系统状态页面,报告和记录故障停机详情、进度更新和维护计划等。这样,在故障期间你避免了不必要的打扰,也可以提醒一些相关方,以及加入一些可选的状态更新。

有一个不错的开源, 自承载系统状态页解决方案叫做 Cachet。在这个教程,我将要描述如何用 Cachet 部署一个自承载系统状态页面。

Cachet 特性

在详细的配置 Cachet 之前,让我简单的介绍一下它的主要特性。

  • 全 JSON API:Cachet API 可以让你使用任意的外部程序或脚本(例如,uptime 脚本)连接到 Cachet 来自动报告突发事件或更新状态。
  • 认证:Cachet 支持基础认证和 JSON API 的 API 令牌,所以只有认证用户可以更新状态页面。
  • 衡量系统:这通常用来展现随着时间推移的自定义数据(例如,服务器负载或者响应时间)。
  • 通知:可选地,你可以给任一注册了状态页面的人发送突发事件的提示邮件。
  • 多语言:状态页被翻译为11种不同的语言。
  • 双因子认证:这允许你使用 Google 的双因子认证来提升 Cachet 管理账户的安全性。
  • 跨数据库支持:你可以选择 MySQL,SQLite,Redis,APC 和 PostgreSQL 作为后端存储。

剩下的教程,我会说明如何在 Linux 上安装配置 Cachet。

第一步:下载和安装 Cachet

Cachet 需要一个 web 服务器和一个后端数据库来运转。在这个教程中,我将使用 LAMP 架构。以下是一些特定发行版上安装 Cachet 和 LAMP 架构的指令。

Debian,Ubuntu 或者 Linux Mint

$ sudo apt-get install curl git apache2 mysql-server mysql-client php5 php5-mysql
$ sudo git clone https://github.com/cachethq/Cachet.git /var/www/cachet
$ cd /var/www/cachet
$ sudo git checkout v1.1.1
$ sudo chown -R www-data:www-data .

在基于 Debian 的系统上设置 LAMP 架构的更多细节,参考这个教程

Fedora, CentOS 或 RHEL

在基于 Red Hat 系统上,你首先需要设置 REMI 软件库(以满足 PHP 的版本需求)。然后执行下面命令。

$ sudo yum install curl git httpd mariadb-server
$ sudo yum --enablerepo=remi-php56 install php php-mysql php-mbstring
$ sudo git clone https://github.com/cachethq/Cachet.git /var/www/cachet
$ cd /var/www/cachet
$ sudo git checkout v1.1.1
$ sudo chown -R apache:apache .
$ sudo firewall-cmd --permanent --zone=public --add-service=http
$ sudo firewall-cmd --reload
$ sudo systemctl enable httpd.service; sudo systemctl start httpd.service
$ sudo systemctl enable mariadb.service; sudo systemctl start mariadb.service

在基于 Red Hat 系统上设置 LAMP 的更多细节,参考这个教程

配置 Cachet 的后端数据库

下一步是配置后端数据库。

登录到 MySQL/MariaDB 服务,然后创建一个空的数据库称为‘cachet’。

$ sudo mysql -uroot -p
mysql> create database cachet;
mysql> quit

现在用一个示例配置文件创建一个 Cachet 配置文件。

$ cd /var/www/cachet
$ sudo mv .env.example .env

在 .env 文件里,填写你自己设置的数据库信息(例如,DB_*)。其他的字段先不改变。

APP_ENV=production
APP_DEBUG=false
APP_URL=http://localhost
APP_KEY=SomeRandomString
DB_DRIVER=mysql
DB_HOST=localhost
DB_DATABASE=cachet
DB_USERNAME=root
DB_PASSWORD=
CACHE_DRIVER=apc
SESSION_DRIVER=apc
QUEUE_DRIVER=database
MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ADDRESS=null
MAIL_NAME=null
REDIS_HOST=null
REDIS_DATABASE=null
REDIS_PORT=null

第三步:安装 PHP 依赖和执行数据库迁移

下面,我们将要安装必要的PHP依赖包。我们会使用 composer 来安装。如果你的系统还没有安装 composer,先安装它:

$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

现在开始用 composer 安装 PHP 依赖包。

$ cd /var/www/cachet
$ sudo composer install --no-dev -o

下面执行一次性的数据库迁移。这一步会在我们之前创建的数据库里面创建那些所需的表。

$ sudo php artisan migrate

假设在 /var/www/cachet/.env 的数据库配置无误,数据库迁移应该像下面显示一样成功完成。

下面,创建一个密钥,它将用来加密进入 Cachet 的数据。

$ sudo php artisan key:generate
$ sudo php artisan config:cache

生成的应用密钥将自动添加到你的 .env 文件 APP_KEY 变量中。你不需要自己编辑 .env。

第四步:配置 Apache HTTP 服务

现在到了配置运行 Cachet 的 web 服务的时候了。我们使用 Apache HTTP 服务器,为 Cachet 创建一个新的虚拟主机,如下:

Debian,Ubuntu 或 Linux Mint

$ sudo vi /etc/apache2/sites-available/cachet.conf

    ServerName cachethost
    ServerAlias cachethost
    DocumentRoot "/var/www/cachet/public"
    
        Require all granted
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    

启用新虚拟主机和 mod_rewrite:

$ sudo a2ensite cachet.conf
$ sudo a2enmod rewrite
$ sudo service apache2 restart

Fedora, CentOS 或 RHEL

在基于 Red Hat 系统上,创建一个虚拟主机文件,如下:

$ sudo vi /etc/httpd/conf.d/cachet.conf

    ServerName cachethost
    ServerAlias cachethost
    DocumentRoot "/var/www/cachet/public"
    
        Require all granted
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    

现在重载 Apache 配置:

$ sudo systemctl reload httpd.service

第五步:配置 /etc/hosts 来测试 Cachet

这时候,初始的 Cachet 状态页面应该启动运行了,现在测试一下。

由于 Cachet 被配置为Apache HTTP 服务的虚拟主机,我们需要调整你的客户机的 /etc/hosts 来访问他。你将从这个客户端电脑访问 Cachet 页面。(LCTT 译注:如果你给了这个页面一个正式的主机地址,则不需要这一步。)

打开 /etc/hosts,加入如下行:

$ sudo vi /etc/hosts
    cachethost

上面名为“cachethost”必须匹配 Cachet 的 Apache 虚拟主机文件的 ServerName。

测试 Cachet 状态页面

现在你准备好访问 Cachet 状态页面。在你浏览器地址栏输入 http://cachethost。你将被转到如下的 Cachet 状态页的初始化设置页面。

选择 cache/session 驱动。这里 cache 和 session 驱动两个都选“File”。

下一步,输入关于状态页面的基本信息(例如,站点名称、域名、时区和语言),以及管理员认证账户。

你的状态页初始化就要完成了。

继续创建组件(你的系统单元)、事件或者任意你要做的维护计划。

例如,增加一个组件:

增加一个维护计划:

公共 Cachet 状态页就像这样:

集成了 SMTP,你可以在状态更新时发送邮件给订阅者。并且你可以使用 CSS 和 markdown 格式来完全自定义布局和状态页面。

结论

Cachet 是一个相当易于使用,自托管的状态页面软件。Cachet 一个高级特性是支持全 JSON API。使用它的 RESTful API,Cachet 可以轻松连接单独的监控后端(例如,Nagios),然后回馈给 Cachet 事件报告并自动更新状态。比起手工管理一个状态页它更快和有效率。

最后一句,我喜欢提及一个事。用 Cachet 设置一个漂亮的状态页面是很简单的,但要将这个软件用好并不像安装它那么容易。你需要完全保障所有 IT 团队习惯准确及时的更新状态页,从而建立公共信息的准确性。同时,你需要教用户去查看状态页面。最后,如果没有很好的填充数据,部署状态页面就没有意义,并且/或者没有一个人查看它。记住这个,尤其是当你考虑在你的工作环境中部署 Cachet 时。

故障排查

补充,万一你安装 Cachet 时遇到问题,这有一些有用的故障排查的技巧。

  1. Cachet 页面没有加载任何东西,并且你看到如下报错。

    production.ERROR: exception 'RuntimeException' with message 'No supported encrypter found. The cipher and / or key length are invalid.' in /var/www/cachet/bootstrap/cache/compiled.php:6695
    

    解决方案:确保你创建了一个应用密钥,以及明确配置缓存如下所述。

    $ cd /path/to/cachet
    $ sudo php artisan key:generate
    $ sudo php artisan config:cache
    
  2. 调用 composer 命令时有如下报错。

    - danielstjules/stringy 1.10.0 requires ext-mbstring * -the requested PHP extension mbstring is missing from your system.
    - laravel/framework v5.1.8 requires ext-mbstring * -the requested PHP extension mbstring is missing from your system.
    - league/commonmark 0.10.0 requires ext-mbstring * -the requested PHP extension mbstring is missing from your system.
    

    解决方案:确保在你的系统上安装了必要的 PHP 扩展 mbstring ,并且兼容你的 PHP 版本。在基于 Red Hat 的系统上,由于我们从 REMI-56 库安装PHP,所以要从同一个库安装扩展。

    $ sudo yum --enablerepo=remi-php56 install php-mbstring
    
  3. 你访问 Cachet 状态页面时得到一个白屏。HTTP 日志显示如下错误。

    PHP Fatal error:  Uncaught exception 'UnexpectedValueException' with message 'The stream or file "/var/www/cachet/storage/logs/laravel-2015-08-21.log" could not be opened: failed to open stream: Permission denied' in /var/www/cachet/bootstrap/cache/compiled.php:12851
    

    解决方案:尝试如下命令。

    $ cd /var/www/cachet
    $ sudo php artisan cache:clear
    $ sudo chmod -R 777 storage
    $ sudo composer dump-autoload
    

    如果上面的方法不起作用,试试禁止 SELinux:

    $ sudo setenforce 0
    

via: http://xmodulo.com/setup-system-status-page.html

作者:Dan Nanni 译者:wyangsun 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

细说 Data URI

细说 Data URI
细说 Data URI

Data URL 早在 1995 年就被提出,那个时候有很多个版本的 Data URL Schema 定义陆续出现在 VRML 之中,随后不久,其中的一个版本被提上了议案——将它做个一个嵌入式的资源放置在 HTML 语言之中。从 RFC 文档定稿的时间来看(1998年),它是一个很受欢迎的发明。

Data URI 定义的内容可以作为小文件被插入到其他文档之中。URI 是 uniform resource identifier 的缩写,它定义了接受内容的协议以及附带的相关内容,如果附带的相关内容是一个地址,那么此时的 URI 也是一个 URL (uniform resource locator),如:

ftp://10.1.1.10/path/to/filename.ext
http://example.com/source/id

协议后面的内容,可以告诉客户端一个准确下载资源的地址,而 URI 并不一定包含一个地址信息,如(demo):

data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7

其协议为 data,并告诉客户端将这个内容作为 image/gif 格式来解析,需要解析的内容使用的是 base64 编码。它直接包含了内容但并没有一个确定的资源地址。

格式

Data URI 的格式十分简单,如下所示:

data:[][;charset=][;base64],
  • 第一部分是 data: 协议头,它标识这个内容为一个 data URI 资源。

  • 第二部分是 MIME 类型,表示这串内容的展现方式,比如:text/plain,则以文本类型展示,image/jpeg,以 jpeg 图片形式展示,同样,客户端也会以这个 MIME 类型来解析数据。

  • 第三部分是编码设置,默认编码是 charset=US-ASCII, 即数据部分的每个字符都会自动编码为 %xx,关于编码的测试,可以在浏览器地址框输入分别输入下面两串内容,查看效果:

    // output: ä½ å¥½ -> 使用默认的编码展示,故乱码
    data:text/html,你好
    // output: 你好 -> 使用 UTF-8 展示
    data:text/html;charset=UTF-8,你好
    // output: 浣犲ソ -> 使用 gbk 展示(浏览器默认编码 UTF-8,故乱码)
    data:text/html;charset=gbk,你好
    // output: 你好 -> UTF-8 编码,内容先使用 base64 解码,然后展示
    data:text/html;charset=UTF-8;base64,5L2g5aW9 
  • 第四部分是 base64 编码设定,这是一个可选项,base64 编码中仅包含 0-9,a-z,A-Z,+,/,=,其中 = 是用来编码补白的。

  • 最后一部分为这个 Data URI 承载的内容,它可以是纯文本编写的内容,也可以是经过 base64编码 的内容。

很多时候我们使用 data URI 来呈现一些较长的内容,如一串二进制数据编码、图片等,采用 base64 编码可以让内容变得更加简短。而对图片来说,在 gzip 压缩之后,base64 图片实际上比原图 gzip 压缩要大,体积增加大约为三分之一,所以使用的时候需要权衡。

兼容性

由于出现时间较早,目前主流的浏览器基本都支持 data URI:

  • Firefox 2+
  • Opera 7.2+
  • Chrome (所有版本)
  • Safari (所有版本)
  • Internet Explorer 8+

但是部分浏览器对 data URI 的使用存在限制:

  • 长度限制,长度超长,在一些应用下会导致内存溢出,程序崩溃

    Opera 下限制为 4100 个字符,目前已经去掉了这个限制
    IE 8+ 下限制为 32,768 个字符(32kb),IE9 之后移除了这个限制
  • 在 IE 下,data URI 只允许被用到如下地方:

    • object (images only)
    • img、input type=image、link
    • CSS 中允许使用 URL 声明的地方,如 background
  • 在 IE 下,Data URI 的内容必须是经过编码转换的,如 “#”、”%”、非 US-ASCII 字符、多字节字符等,必须经过编码转换

低版本IE的解决之道 – MHTML

MHTML 就是 MIME HTML,是 “Multipurpose Internet Mail Extensions HyperText Markup Language” 的简称,它就像一个带着附件的邮件一般,如下所示:

/** FilePath: http://example.com/test.css */
/*!@ignore
Content-Type: multipart/related; boundary="_ANY_SEPARATOR"
--_ANY_SEPARATOR
Content-Location:myidBackground
Content-Transfer-Encoding:base64
iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==
--_ANY_SEPARATOR--
*/
.myid {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==");
  *background-image: url(mhtml:http://example.com/test.css!myidBackground);
}

上方的一串注释就像是一个附件,这个附件内容是一个名叫 myidBackgroundbase64 编码图片,在一个 class 叫做 myid 的 css 中用到了它。这里有几点需要注意:

  • _ANY_SEPARATOR 可以是任意内容
  • 在”附件”结束位置需要加上结束符 _ANY_SEPARATOR,否则在 Vista 和 Win7 的 IE7 中会出错
  • 附件代码注意不要被压缩工具给干掉了

这里存在一个坑:部分系统兼容模式下的 IE8 也认识 css 中的 hack 符号 *,但是不支持 mhtml,所以上面的内容不会生效。处理方案估计就只有使用 IE 的条件注释了。

HTTPS 下的安全提示

HTTPS 打开页面,当在 IE6、7 下使用 data URIs 时,会看到如下提醒:

MS 的解释是:

您正在查看的网站是个安全网站。它使用了 SSL (安全套接字层)或 PCT(保密通讯技术)这样的安全协议来确保您所收发信息的安全性。 当站点使用安全协议时,您提供的信息例如姓名或信用卡号码等都经过加密,其他人无法读取。然而,这个网页同时包含未使用该安全协议的项目

很明显,IE 嗅到了”未使用安全协议的项目”。

浏览器在解析到一个 URI 的时候,会首先判断协议头,如果是以 http(s) 开头,它便会建立一个网络链接下载资源,如果它发现协议头为data:,便会将其作为一个 Data URI 资源进行解析。

但是从 chrome 的瀑布流,我们可以做这样的猜测:

图中每个 Data URI 都发起了请求,不过状态都是 data(from cache),禁用缓存之后,依然如此。所以可以断定,浏览器在下载源码解析成 DOM 的时候,会将 Data URI 的资源解析出来,并缓存在本地,最后 Data URI 每个对应位置都会发起一次请求,只是这个请求还未建立链接,就被发现存在缓存的浏览器给拍死了。

安全阀门

Data URI 在 IE 下有诸多安全限制,事实上,很多 xss 注入也可以将 data URI 的源头作为入口,使用 data URI 绕过浏览器的过滤。

// 绕过浏览器过滤
http://example.com/text.php?t=">