mnshome.info
marzenia się spełniają



  Логи Apache в syslog
23.12.2015 15:28

Возникла задача писать логи Apache в SysLog. 

Решение оказалось практически на ладони

Ниже привожу цитируемый блок-выдержку из статьи (форматирование убрано)


Apache пишет логи сам, это сделано из тех соображений, что при большой нагузке отправка записей по UDP(UDP используется протоколом syslog) может терять часть сообщений, ведь UDP протокол не гарантирующий доставку пакетов.
Но у Apcheвского модуля есть возможность отправлять записи на скрипт. Настройки выглядят так:

CustomLog |/usr/local/share/apache22/logging common


/usr/local/share/apache22/logging – это перловый скрипт.
Выглядит он так:

#!/usr/bin/perl
use Sys::Syslog qw( :DEFAULT setlogsock );
 
setlogsock('unix');
openlog('apache', 'daemon', 'local2');
while ($log = <STDIN>) {
        syslog('notice', $log);
}
closelog

Для работы скрипта требуется перловый модуль /usr/ports/sysutils/p5-Sys-Syslog/. Я при работе пишу логи с фасилити local2. Можно использовать любой свободный фасилити.
В настройках syslog настройки логирования сообщений с facility2 выглядят так:

local2.*      /var/log/apache.log

Но если вы используете rsyslog, то возможности по логированию значительно возрастают. rsyslog умеет фильтровать сообщения по содержимому.
И если, к примеру, обычный лог в rsyslog.conf, записывающий сообщения с facility2 в лог /var/log/apacheserv.log настраивается так:

if $hostname contains 'apacheserv' and ( $syslogfacility-text contains 'local2') \
        then /var/log/apacheserv.log;TraditionalFormat

Мы фильтруем сообщения по имени сервера и фасилити.
А в случае, если в сообщении Apache, присутствует имя виртуального сервера, то вполне можно настроить запись отчетов по каждому виртуальному серверу в отдельный файл.
Формат логов Apache для этой ситуации у меня настроен так:

LogFormat "%h %l %u %t http://%v%U %>s %b" common

%v – эта переменная обозначает имя виртуального сервера к которому относится запись. Имя вирутального сервера – это то , что в настройках апача внесено в параметр ServerName.
А настройки rsyslog для виртуального сервера hilik.org.ua я использую такие:

if $hostname contains 'apacheserv' and ( $syslogfacility-text contains 'local2' and $msg contains 'hilik.org.ua') \
        then /var/log/hilik.org.ua.log;TraditionalFormat

Этот фильтр определяет, что все сообщения от сервера apacheserv c фасилити local2 и в сообщении содержащий строку hilik.org.ua будет записываться в /var/log/hilik.org.ua.log

На этом настройка закончена.

  WWW::MLite / Аутентификация и авторизация с использованием внешнего credentials на базе авторизации HTTP + WWW::MLite::AuthSsn
03.03.2015 13:24

Задача: 
Создать механизм аутентификации без привязки к базе данных но при
этом создать политики доступа Group/User on service в простом исполнении.

0. Разворячиваем полноценный проект Foo используя команду:

 # mlite foo.localhost

Далее, после адаптации исходных файлов под свой проект в конфигурации виртуального
хоста определяем локациюавторизационных данных. например:

    <Directory "D:/web/www/foo/share/auth">
        AuthName "Foo file authorization"
        AuthType basic
        AuthGroupFile D:/web/www/foo/.htgroups
        AuthUserFile  D:/web/www/foo/.htpasswd
    </Directory>
 
1. создаем в проекте папку share/auth и в ней 5 файлов с содержимым "Ok.":

    admin.txt
    ok.txt
    root.txt
    test.txt
    user.txt

Помимо этого нужно создать файл .htaccess с содержимым:

Require valid-user

<Files "root.txt">
    Require user root
</Files> 

<Files "admin.txt">
    Require group admin
</Files> 

<Files "user.txt">
    Require group admin user
</Files> 

<Files "test.txt">
    Require group admin user test
</Files> 

2. В файле inc/Foo/Auth.pm необходимо секцию аутентификации и авторизации привести к следующему виду:

    # Аутентификация
    unless ($authssn->authen( sub { # AAA-authen
        my $self = shift;
        my $login = shift || '';
        my $password = shift || '';
    
        # Простые проверки
        $self->reason("LOGIN_INCORRECT") && return unless $login;
        $self->reason("PASSWORD_INCORRECT") && return unless $password;
        
        # "Хитрая" авторизация
        my $sok = _fetch(sprintf($baseurl,"ok"), $login, $password);
        $self->reason("DECLINED") && return unless $sok;
    
        # Добавляем данные по сессии
        $self->set(login    => $login);      # Логин пользователя
        $self->set(password => $password);   # Пароль пользователя (MD5 and etc.)
    
        return 1;
    }, $usr->{login}, $usr->{password} )) {
        push @$error, sprintf("%s: %s",$authssn->reason, $authssn->reason_translate);
        return 0;
    }

    # Авторизация
    unless ($authssn->authz( sub { # AAA-authz
        my $self = shift;
        my $login = $self->get("login") || '';
        my $password = $self->get("password") || '';
    
        # "Хитрая" установка ролей
        $self->set(role_user => 1); # Простая роль
        foreach (qw/root admin user test/) {
            $self->set("role_$_" => _fetch(sprintf($baseurl,$_), $login, $password) ? 1 : 0);
        }
        
        return 1;
    } )) {
        push @$error, sprintf("%s: %s",$authssn->reason, $authssn->reason_translate);
        return 0;
    }

Далее добавляем функцию _fetch с объявлением LWP зависимости:

    use LWP;

    sub _fetch { # Получение URL
        my $url = shift;
        my $login = shift;
        my $password = shift;
        
        my $ua = new LWP::UserAgent(
            agent => "Altair/1.0",
            max_redirect => 10,
            requests_redirectable => ['GET','HEAD','POST'],
            protocols_allowed     => ['http', 'https'],
            timeout => 5,
        );
        my $req = new HTTP::Request("GET", $url);
        $req->authorization_basic($login, $password) if defined($login);
        my $res = $ua->request($req);
        
        return 0 unless $res->is_success && $res->content =~ /^\s*ok/i;
        return 1;
    }

3. В корневой файл inc/Foo.pm добавляем акцессоры для админов, пользователей и тестировщиков

    sub admin_access { # Доступ только для администраторов
        my $self    = shift;
        my $error   = $self->error;
        my $authssn = $self->authssn;

        $authssn->access(sub { # AAA-access
                my $self = shift;
                return 1 if $self->get("role_admin");
                push @$error, to_utf8("Доступ разрешен только администраторам ресурса");
                $self->reason("FORBIDDEN") && return;
            });
    }
    sub user_access { # Доступ только к залогиненным
        my $self    = shift;
        my $error   = $self->error;
        my $authssn = $self->authssn;

        $authssn->access(sub { # AAA-access
                my $self = shift;
                return 1 if $self->get("role_user");
                return 1 if $self->get("role_test");
                push @$error, to_utf8("Доступ разрешен только авторизированным пользователям и тестировщикам");
                $self->reason("FORBIDDEN") && return;
            });
    }

В этом же файле правим процедуру after_view в секции работы с данными авторизации:

    # Работа с некоторыми данными авторизации
    my $roles = ROLES;
    if (value($mdata => "session_enable")) {
        my $authssn = $self->authssn;
        $template->cast_if('authorized', $authssn->access);
        foreach (@$roles) { $template->cast_if($_, $authssn->get($_)) }; # По ролям
        $h->{login} = $authssn->get("login");
        $h->{usid} = $authssn->sid || '';
    } else {
        $template->cast_if('authorized', 0);
        foreach (@$roles) { $template->cast_if($_, 0) }; # По ролям
        $h->{login} = '';
        $h->{usid} = "";
    }

И определить в константах массив ролей (правки делать в начале файла):

    use constant {
            # Определяем таблицу доступных ролей
            ROLES => [qw/
                    role_test
                    role_user
                    role_admin
                    role_root
                /],
        };

4. Для распределения прав доступа достаточно в метаопределениях указывать соответствующие вызовы

    demo => { # Демо верстки
        handler => {
            access  => \&Foo::admin_access, # Доступ только для администраторов
            form    => [ \&Foo::before_view, sub {1}, \&Foo::after_view, ],
            deny    => sub {1},
            chck    => sub {1},
            proc    => sub {1},
        },
        description => "Demo page",
    },

5. Редактируем файл групп и пользователей (.htgroups и .htpasswd), и... 

PROFIT :)

THUD XYZZY PLUGH FRED WALDO GARPLY
GRAULT CORGE QUUZ QUX BAZ BAR FOO

День памяти перевода часов на летнее время

0
0
0
days
:
0
0
hrs
:
0
0
min
:
0
0
sec

поиск по дате...
поиск по содержимому...
GGCzat 1.00
Tagi
Artefakty
28.12.2015 13:09:22
MDScore: Marionette.js
06.05.2016 13:07:16
Создать RESTfull обработчик как модуль
01.12.2017 22:56:38
SubProject: static-site
24.06.2017 17:34:47
MNSHOME: Переходить на Centos!
30.10.2017 13:05:21
Создать функционал 2 в 1: mod_perl библиотеку для получения отчета по бэкапам за последние сутки
19.08.2015 11:35:42
Переезд разработчиков на тестовый MySQL сервере
02.03.2016 18:20:19
По вёрстке - loftblog
02.06.2015 13:52:56
С Даши за ECB/VTB24
29.11.2017 18:05:16
Создать простые функции криптования AES256+Blowfish+base64
Tue, 16 Oct 2018 13:09:22 +0400

Linki zewnętrzne

#OPERA
Czytam
GRY
MnshomeInfo
Monitoring
Photo
Przyjaciele
Serwisy
fla-master

IP

Valid XHTML 1.0 Transitional

Valid CSS!


Copyright © 1998-2017 Serż Minus. All rights reserved


do góry