将服务器日志存储在板条板上,以进行快速搜索和聚合
#安全 #database #docker #containers

您是否知道CratedB可以成为服务器日志的好商店?

如果您一直在使用日志聚合工具,甚至是一些最先进的商业SIEM系统,您可能会经历与我相同的挫败感:

  • 搜索登录时间长时间时的超时
  • 复杂而专有的查询语法
  • 困难将日志数据上的查询集成到应用程序监视仪表板

将服务器日志存储在CRATEDB上可以解决这些问题,它允许使用标准SQL查询日志,并从支持PostgreSQL协议的任何工具中查询日志;其独特的索引还使全文查询和聚合超快。
让我举一个例子。

首先,我们需要一个cratedB的实例,为此目的最好有一个专用群集,将监视系统与正在监视的系统分开,但是为了该演示,我们只能拥有一个Docker容器上的节点群集:

sudo docker run -d --name cratedb --publish 4200:4200 --publish 5432:5432 crate -Cdiscovery.type=single-node

接下来,我们需要一个表来存储日志,让我们连接到http://localhost:4200/#!/console并运行:

CREATE TABLE doc.systemevents (
    message TEXT
    ,INDEX message_ft USING FULLTEXT(message)
    ,facility INTEGER
    ,fromhost TEXT
    ,priority INTEGER
    ,DeviceReportedTime TIMESTAMP
    ,ReceivedAt TIMESTAMP
    ,InfoUnitID INTEGER
    ,SysLogTag TEXT 
    );

提示:如果您在无头系统上,也可以使用command-line tools运行查询。

然后我们需要一个记录系统的帐户:

CREATE USER rsyslog WITH (PASSWORD='pwd123');

我们需要在上表上授予权限:

GRANT DML ON TABLE doc.systemevents TO rsyslog;

我们将使用rsyslog将日志发送到cratedB,对于此设置,我们需要rsyslog V8.2202或更高版本,并且ompgsql模块:

sudo add-apt-repository ppa:adiscon/v8-stable
sudo apt-get update
sudo apt-get install rsyslog
sudo debconf-set-selections <<< 'rsyslog-pgsql rsyslog-pgsql/dbconfig-install string false'
sudo apt-get install rsyslog-pgsql

现在,我们将其配置为使用我们之前创建的帐户:

echo 'module(load="ompgsql")' | sudo tee /etc/rsyslog.d/pgsql.conf
echo '*.* action(type="ompgsql" conninfo="postgresql://rsyslog:pwd123@localhost/doc")' | sudo tee -a /etc/rsyslog.d/pgsql.conf
sudo systemctl restart rsyslog

如果您对涉及排队的更高级设置感兴趣,以获得生产方案的其他可靠性,则可以在rsyslog documentation中阅读有关可用设置的更多信息。

现在,让我们想象我们想运行一个带有MediaWiki的容器来托管Intranet,我们希望所有日志都进入CratedB,我们可以使用以下部门部署:

sudo docker run --name mediawiki -p 80:80 -d --log-driver syslog --log-opt syslog-address=unixgram:///dev/log mediawiki

如果我们现在将Web浏览器指向端口80 http://localhost/,我们将看到一个新的MediaWiki页面。
让我们稍微播放以生成日志条目,只需单击“设置Wiki”,然后继续进行一次。

这将在doc.systemevents表中生成条目,syslogtag匹配运行该站点的容器的容器ID。

我们现在可以使用MATCH predicate查找我们感兴趣的错误消息:

SELECT devicereportedtime,message
FROM doc.systemevents
WHERE MATCH(message_ft, 'Could not reliably determine') USING PHRASE
ORDER BY 1 DESC;
+--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| devicereportedtime | message                                                                                                                                                                     |
+--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|      1691510710000 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message |
|      1691510710000 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message |
+--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

现在让我们看看哪些日志源创建了最多的条目:

SELECT syslogtag,count(*)
FROM doc.systemevents
GROUP BY 1
ORDER BY 2 DESC
LIMIT 5;
+----------------------+----------+
| syslogtag            | count(*) |
+----------------------+----------+
| kernel:              |       23 |
| 083053ae8ea3[52134]: |       20 |
| systemd[1]:          |       15 |
| sudo:                |       10 |
| rsyslogd:            |        5 |
+----------------------+----------+

希望您发现这很有趣。请随时让我们知道您在CrateDB Community中的想法。