记录到 MySQL 时不包含空行/跳过的记录吗?

记录到 MySQL 时不包含空行/跳过的记录吗?

我正在尝试弄清楚如何让 Squid 代理记录到 MySQL。我知道 ACL 顺序非常重要,但我不确定我是否完全理解 ACL 是什么或做什么,这很难解释,但希望您在阅读时能明白我的意思!

我创建了以下几行代码以使 Squid 与 squid.conf 中的辅助程序进行交互:

external_acl_type mysql_log %LOGIN %SRC %PROTO %URI php /etc/squid3/custom/mysql_lg.php
acl ex_log external mysql_log
http_access allow ex_log

外部 ACL 帮助程序 (mysql_lg.php) 是一个 PHP 脚本,如下所示:

error_reporting(0);

if (! defined(STDIN)) {
    define("STDIN", fopen("php://stdin", "r"));
}

$res = mysql_connect('localhost', 'squid', 'testsquidpw');
$dbres = mysql_select_db('squid', $res);

while (!feof(STDIN)) {
    $line = trim(fgets(STDIN));
    $fields = explode(' ', $line);
    $user = rawurldecode($fields[0]);
    $cli_ip = rawurldecode($fields[1]);
    $protocol = rawurldecode($fields[2]);
    $uri = rawurldecode($fields[3]);

    $q = "INSERT INTO logs (id, user, cli_ip, protocol, url) VALUES ('', '".$user."', '".$cli_ip."', '".$protocol."', '".$uri."');";
    mysql_query($q) or die (mysql_error());

    if ($fault) {
            fwrite(STDOUT, "ERR\n");
    };

    fwrite(STDOUT, "OK\n");
}

我现在的配置如下:

## Authentication Handler
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 30

auth_param negotiate program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param negotiate children 5

# Allow squid to update log
external_acl_type mysql_log %LOGIN %SRC %PROTO %URI php /etc/squid3/custom/mysql_lg.php
acl ex_log external mysql_log
http_access allow ex_log

acl localnet src 172.16.45.0/24
acl AuthorizedUsers proxy_auth REQUIRED

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https

acl CONNECT method CONNECT

acl blockeddomain url_regex "/etc/squid3/bl.acl"

http_access deny blockeddomain
deny_info ERR_BAD_GENERAL blockeddomain

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Allow the internal network access to this proxy
http_access allow localnet

# Allow authorized users access to this proxy
http_access allow AuthorizedUsers

# FINAL RULE - Deny all other access to this proxy
http_access deny all

从测试来看,我将日志行放在越靠近底部的位置,记录的内容就越少。通常,它甚至会在 MySQL 表中放置空行。/var/log/squid3/access.log 中的基于文件的日志是正确的,但 MySQL 日志中缺少访问日志中的许多行。我不禁想到这是因为我输入行的顺序,因为我想将所有内容记录到 MySQL、未经身份验证的请求、阻止的请求以及阻止特定请求的类别。

我之所以想在 MySQL 中实现这一点,是因为我试图通过自定义的基于 Web 的前端来管理一切,并且如果可以的话,我想避免使用任何 shell 命令和访问系统日志文件。最终结果是让它尽可能容易维护,而不必让员工在电话上等待我添加新规则并重新加载服务器!

希望有人能帮助我,因为这对我来说是一次学习经历,而且我很困惑。

在此先非常感谢您的帮助!

答案1

正确的 php 代码如下:

#!/usr/bin/php

<?php

error_reporting(0);

if (! defined(STDIN)) {
    define("STDIN", fopen("php://stdin", "r"));
}

$res = mysql_connect('127.0.0.1', 'root', 'kbpbdxgh9j');
$dbres = mysql_select_db('intranet', $res);

while (!feof(STDIN)) {
    $line = trim(fgets(STDIN));
    $fields = explode(' ', $line);
    $user = rawurldecode($fields[0]);
    $cli_ip = rawurldecode($fields[1]);
    $protocol = rawurldecode($fields[2]);
    $uri = rawurldecode($fields[3]);

    if ($user!="") {

        $q = "INSERT INTO log (usuario, ip, protocolo, url) VALUES ('".$user."', '".$cli_ip."', '".$protocol."', '".$uri."');";
        mysql_query($q) or die (mysql_error());

    if ($fault) {
                fwrite(STDOUT, "ERR\n");
        };

    }

    fwrite(STDOUT, "OK\n");
}

答案2

我建议遵循这些指示关于如何启用所有 ACL 请求/允许/拒绝的日志记录。从这些您应该能够找出哪些 ACL 规则被正确/错误地应用。

相关内容