Доступ к журналам системы через web-интерфейс

Лабораторная работа посвящена вопросам хранения журналов системы в реляционной базе данных. В ней демон журнализации настраивается на хранение информации в базе данных СУБД MySQL, а затем к ней осуществляется доступ через Web-интерфейс.

Интеграция Syslog-ng и MySQL

Настройте Syslog-NG так, чтобы он заносил журнальную информацию не в файлы, а в базу данных под управлением MySQL.

  1. Инсталляция MySQL.

    Проверьте, установлена ли в системе СУБД MySQL, и если нет, проинсталлируйте её.

  2. Изменение конфигурации Syslog-NG.

    Отредактируйте конфигурационный файл syslog-ng.conf. Добавьте в него следующие строки:

    destination d_mysql { pipe("/var/log/mysql.pipe" 
        template("INSERT INTO logs 
               (  host,    facility,    priority,    level,    tag,    datetime, program, msg)
        VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC',
            '$PROGRAM', '$MSG' );\n") template-escape(yes)); };
    
    log { source(src); destination(d_mysql); };
    

    Сделанные изменения заставят Syslog-NG направлять все поступающие из источника src сообщения в канал /var/log/mysql.pipe. Сообщения будут записываться в канал в виде строк с заданной структурой, структурой команд MySQL, что позволит впоследствии просто подать канал на вход MySQL-клиенту. Клиент начнёт читать строки из канала, интерпретировать их, и, в результате интерпретации, добавлять данные в базу данных.

    Старые получатели сообщений не исчезнут – в канал будут попадать копии сообщений.

  3. Создание канала для записи данных Syslog-NG.

    # mkfifo /var/log/mysql.pipe
    

  4. Перезапуск демона Syslog-NG.

    Перезагрузите демон Syslog-NG принятым в операционной системе способом:

    # /etc/init.d/syslog-ng restart
    

    # /usr/local/etc/rc.d/syslog-ng stop
    # /usr/local/etc/rc.d/syslog-ng start
    

  5. Создание таблицы syslog для MySQL.

    Подключитесь к MySQL

    # mysql -u root -p
    Password:
    

    Если пароль для подключение к СУБД отсутствует, в ответ на приглашение Password: нужно просто нажать <key>enter</key>. В этом случае ключ -p можно было и не использовать:

    # mysql -u root
    

    и создайте базу данных и таблицу в ней для хранения данных системного журнала:

    # создаём базу данных syslog
    CREATE DATABASE syslog;
    
    USE syslog;
    
    # в базе данных syslog создаём таблицу logs
    # для хранения журнальной информации
    CREATE TABLE logs (
    host varchar(32) default NULL,
    facility varchar(10) default NULL,
    priority varchar(10) default NULL,
    level varchar(10) default NULL,
    tag varchar(10) default NULL,
    datetime datetime default NULL,
    program varchar(15) default NULL,
    msg text,
    seq bigint(20) unsigned NOT NULL auto_increment,
    PRIMARY KEY (seq), KEY host (host),
    KEY program (program), KEY datetime (datetime),
    KEY priority (priority), KEY facility (facility)
    ) TYPE=MyISAM;
    USE mysql;
    
    # создаём пользователей syslog и syslogadmin
    INSERT INTO user (Host, User, Password) VALUES ('localhost','syslog', password('ПАРОЛЬ'));
    INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','syslog');
    
    INSERT INTO user (Host, User, Password) VALUES ('localhost','syslogadmin',password('ПАРОЛЬ'));
    INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','syslogadmin');
    COMMIT;
    
    # Записать кэш привилегий во избежание ошибок
    FLUSH PRIVILEGES;
    
    # пользователь syslogadmin получил права, необходимые для резервного копирования
    REVOKE ALL PRIVILEGES ON syslog.* FROM syslogadmin@localhost;
    REVOKE GRANT OPTION ON syslog.* FROM syslogadmin@localhost;
    GRANT RELOAD ON *.* TO syslogadmin@localhost;
    GRANT SELECT, INSERT, DELETE, CREATE,
    ALTER, LOCK TABLES ON syslog.* TO syslogadmin@localhost;
    
    REVOKE ALL PRIVILEGES ON syslog.* FROM syslog@localhost;
    REVOKE GRANT OPTION ON syslog.* FROM syslog@localhost;
    GRANT USAGE ON *.* TO syslog@localhost;
    GRANT SELECT ON syslog.* TO syslog@localhost;
    

  6. Создание скрипта резервного копирования.

    Создайте каталог, в котором будет находиться резервная копия базы данных:

    # mkdir /var/log/backup
    # chmod 600 /var/log/backup
    

    Создайте скрипт backup_syslog.sh, который будет выполнять резервное копирование базы данных syslog СУБД MySQL:

    # vi /usr/local/sbin/backup_syslog.sh
    

    #!/bin/sh
    # каталог /var/log/backup должен быть создан с правами доступа 600
    /usr/bin/mysqlhotcopy --user=syslogadmin --password=ПАРОЛЬ --allowold syslog /var/log/backup
    

    Копирование будет выполняться в каталог /var/log/backup. Убедитесь, что это каталог существует, и что права доступа к этом каталогу равны 600.

    Для работы скрипта требуется mysql-scripts, в состав которого входит mysqlhotcopy

  7. Создание скрипта переноса данных из журнала в MySQL.

    Данные не будут попадать в MySQL автоматически. Syslog-NG записывает данные в созданный канал mysql.pipe, но нужно чтобы кто-то считывал эти данные оттуда, и переносил их базу данных.

    Создайте скрипт syslog_mysql.sh, который будет переносить данные из канала в базу данных:

    # vi /usr/local/sbin/syslog_mysql.sh
    

    #!/bin/sh
    
    if [ -e /var/log/mysql.pipe ]; then
        while [ -e /var/log/mysql.pipe ]
        do
            /usr/bin/mysql -u syslogadmin --password=ПАРОЛЬ syslog < /var/log/mysql.pipe
            /usr/local/bin/mysql -u syslogadmin --password=ПАРОЛЬ syslog < /var/log/mysql.pipe
        done
    else
        mkfifo /var/log/mysql.pipe
    fi
    

    Скрипт должен быть исполняемым:

    # chmod +x /usr/local/sbin/syslog_mysql.sh
    

  8. Запуск скрипта.

    Запустите скрипт на исполнение.

    # /usr/local/sbin/syslog_mysql.sh
    

  9. Добавление скрипта в загрузку.

    Добавьте запуск скрипта /usr/local/sbin/syslog_mysql.sh в загрузку.

    # vi /etc/rc.local
    

    nohup /usr/local/sbin/syslog_mysql.sh &
    

  10. Создание скрипта ротации журнала.

    Используйте скрипт Паснака (Pasnak), выполняющего ротацию журналов в базе MySQL, написанный на PHP или аналогичный скрипт, написанный на Shell (см. ниже):

    # vi /etc/cron.monthly/syslog_rotate.php
    

    # vi /etc/periodic/monthly/syslog_rotate.php
    

    #!/usr/bin/php
    <?php
    # syslog_rotate.php
    # J.P. Pasnak
    # 29/09/2004
    #
    # This script rotates the mysql syslog-ng database
    # on a monthly basis.   Place in "/etc/cron.monthly".
    # To change to weekly/daily, adjust "$date" and place
    # in the appropriate cron folder.
    
    $link = mysql_connect("localhost", "syslogadmin", "$pwadmin");
    if (!$link) {
    die("Could not connect: " . mysql_error());
    }
    echo "Connected successfully\n";
    // make syslog the current db
    $db_selected = mysql_select_db("syslog", $link);
    if (!$db_selected) {
    die ("Can\"t use syslog : " . mysql_error());
    }
    // Rename the table, appending short month
    $last= mktime(0, 0, 0, date("m")-1, date("d"),  date("Y"));
    $date = date("M", $last);
    $result = mysql_query("ALTER TABLE `logs` RENAME `logs-$date`");
    if (!$result) {
    die("Invalid query: " . mysql_error());
    }
    // Recreate the original table
    $result="CREATE TABLE logs (host varchar(32) default NULL, facility
    varchar(10) default NULL, priority varchar(10) default NULL, level
    varchar(10) default NULL, tag varchar(10) default NULL, datetime datetime
    default NULL, program varchar(15) default NULL,
    msg text, seq int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (seq),
    KEY host (host), KEY program (program), KEY datetime (datetime),
    KEY priority (priority), KEY facility (facility)) TYPE=MyISAM;";
    if (mysql_query($result)){
    echo "success in table creation.\n";
    } else {
    echo "no table created.\n";
    }
    
    mysql_close($link);
    ?>
    

    Павел Кудин переписал этот скрипт для интерпретатора shell. В том случае, если в системе не используется php, лучше использовать этот скрипт:

    # vi /etc/cron.monthly/syslog_rotate.sh
    

    # vi /etc/periodic/monthly/syslog_rotate.sh
    

    #!/bin/sh
    # P. Kudin (based on J.P. Pasnak php script)
    # 18/10/2005
    
    dbuser=syslogadmin
    dbpwd=syslogadmin
    
    last=`date --date='-1 month' +%b`;
    
    echo "ALTER TABLE logs RENAME logs_$last;" | mysql -u $dbuser --password=$dbpwd syslog || exit 1
    
    cat << SQL | mysql -u $dbuser --password=$dbpwd syslog  || exit 1
    CREATE TABLE logs (host varchar(32) default NULL, facility
    varchar(10) default NULL, priority varchar(10) default NULL, level
    varchar(10) default NULL, tag varchar(10) default NULL, datetime datetime
    default NULL, program varchar(15) default NULL,
    msg text, seq int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (seq),
    KEY host (host), KEY program (program), KEY datetime (datetime),
    KEY priority (priority), KEY facility (facility)) TYPE=MyISAM;
    SQL
    

    Файл должен быть доступен для чтения/изменения/исполнения только суперпользователю:

    # chmod 700 /etc/cron.monthly/syslog_rotate.php
    # chown root:root /etc/cron.monthly/syslog_rotate.php
    

    # chmod 700 /etc/periodic/monthly/syslog_rotate.php
    # chown root:wheel /etc/periodic/monthly/syslog_rotate.php
    

    или, если используется shell-скрипт:

    # chmod 700 /etc/cron.monthly/syslog_rotate.sh
    # chown root:root /etc/cron.monthly/syslog_rotate.sh
    

    # chmod 700 /etc/periodic/monthly/syslog_rotate.sh
    # chown root:wheel /etc/periodic/monthly/syslog_rotate.sh
    

  11. Настройка периодического выполнения скриптов.

    Отредактируйте общесистемный файл-расписание crontab и добавьте в него следующие строки:

    0 0 * * * root /usr/local/sbin/backup_mysql.sh >> /var/log/mysql.log 2>&1
    

    Резервное копирование базы данных будет выполняться ежедневно в 0:00. Ошибки выполнения команд (если таковые будут), будут записываться в файл /var/log/mysql.log.

Доступ к системным журналам через Web

Проинсталлировать и настроить PHP-Syslog-ng для доступа к журналам системы через Web-интерфейс

  1. Получение архива PhpSyslogNG.

    Загрузите архив PHPSyslogNG отсюда PHPSyslogNG

  2. Инсталляция.

    Распакуйте полученный архив и разместите в дерева каталогов web-сервера Apache или где-либо в файловой системе Далее будем считать, что архив находится в каталоге /usr/local/share/phpsyslogng

    [Замечание]Замечание

    В том случае, если приложение находится за пределами дерева каталогов Web-сервера, в конфигурационном файле Apache должен быть создан алиас, указывающий на положение программы в файловой системе.

    # tar xvfz архив.tar.gz
    # mv phpsyslog* /usr/local/share/phpsyslogng
    

    Для работы PHPSyslogNG необходимы Web-сервер, php4 и php4-extensions.

  3. Конфигурирование.

    Укажите в конфигурационном файле PHPSyslogNG, адрес для подключения к базе данных MySQL и параметры подключения.

    # vi /usr/local/share/phpsyslogng/config/config.php
    

    42c42
    < define('DBUSER', 'user');
    < define('DBUSER', 'user');
    ---
    > define('DBUSER', 'syslogadmin');
    > define('DBUSERPW', 'ПАРОЛЬ');
    70c70
    < define('REQUIRE_AUTH', TRUE);
    ---
    > define('REQUIRE_AUTH', FALSE);
    
    

  4. Проверка.

    Обратитесь на страничку PHPSyslogNG вашего web-сервера для того чтобы убедиться, что он работает верно.

    Рисунок 1.1. Графический интерфейс PHPSyslogNG

    Графический интерфейс PHPSyslogNG

© 2002-2005 Игорь Чубин
Учебный центр Сетевые Технологии, ug-ids, 2006-06-25
Слушатель отсутствует, ДЕМО-ВЕРСИЯ