Назад | Перейти на главную страницу

Вход в 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, заключается в том, что я пытаюсь управлять всем через настраиваемый веб-интерфейс и хочу избегать использования каких-либо команд оболочки и доступа к файлам системного журнала, если я могу помочь. Конечный результат - максимально упростить обслуживание, не заставляя персонал ждать у телефона, пока я добавляю новое правило и перезагружаю сервер!

Надеюсь, кто-нибудь сможет мне помочь, потому что для меня это очень полезный опыт, и я в большой тупик.

Большое спасибо за любую помощь!

правильный код 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");
}

Я бы посоветовал следовать этим инструкции о том, как включить ведение журнала всех запросов / разрешений / запретов ACL. По ним вы сможете определить, какие правила ACL применяются правильно / неправильно.