|  | словник | перекладачка | факти | тексти | програми |
|  | щодо | посилання | новини | гостьова книга | пошук |
|  | початок тексти автор твір

## Встановлення DrWeb для поштовика Sendmail під Linux (n) Валентин Соломко, Київ, 2002 Вихідні дані: ОС: 2.4.18-18.7aspsmp (gcc version 2.96 20000731 (ASPLinux 7.3 2.96-113)) #1 SMP Вто Ноя 19 13:45:00 EET 2002 glibc: 2.2.5 drweb: ftp://ftp.drweb.ru/pub/unix/drweb-4.29.2-glibc.2.2.i386.rpm ftp://ftp.drweb.ru/pub/unix/drweb-clients-4.29-sources.tar.gz perl: perl-String-CRC32-1.2-15.i386.rpm - з дистрибутиву ASPLinux або http://cpan.org.ua:8101/modules/by-module/String/String-CRC32-1.2.tar.gz sendmail: sendmail-8.11.6-15.asp.i386.rpm - з дистрибутиву ASPLinux sendmail-devel-8.11.6-15.asp.i386.rpm - з дистрибутиву ASPLinux Локалізація: http://www.slovnyk.org/txt/solomkov/uk-en.tar.bz2 Встановлення та налаштування Встановлюємо антивірус
            [root@mailer wrk]# rpm -i drweb-4.29.2-glibc.2.2.i386.rpm
В результаті отримуємо:
            /opt/drweb      - домашня тека
            /etc/drweb      - файли налаштувань
            /etc/rc.d/init.d/drwebd - службовий скрипт
            /var/drweb      - робочі теки
!!! RTFM - там її цілком достатньо !!! Для більшої зручності подальшої роботи можна зробити налаштування доступними з домашньої теки:
            [root@mailer wrk]# ln -s /etc/drweb /opt/drweb
Створюємо користувача `drweb`
            [root@mailer wrk]# useradd -d /dev/null -s /bin/false drweb
            [root@mailer wrk]# cat /etc/passwd | grep drweb
            drweb:x:547:547::/dev/null:/bin/false
            [root@mailer drweb]# chown -R drweb.drweb /opt/drweb
            [root@mailer drweb]# chown -R drweb.drweb /var/drweb
Перевіряємо чи живий:
            [root@mailer wrk]# cd /opt/drweb
            [root@mailer drweb]# ./drweb
            Dr.Web (R) for Linux, version 4.29.2 (November 5, 2002)
            Copyright (c) Igor Daniloff, 1992-2002
            Daniloff's Labs and DialogueScience
            http://www.drweb.ru, support@drweb.ru: +7 (812) 387-64-08
            http://www.dials.ru, antivir@dials.ru: +7 (095) 137-01-50
            Key file: /opt/drweb/drweb.key
            Registration info:
            0100005167
            Evaluation Key (ID Anti-Virus Lab. Ltd, St.Petersburg)
            This is an EVALUATION version with limited functionality!
            To get your registration key, call regional dealer.
            Loading /var/drweb/bases/drwebase.vdb - Ok, virus records: 31578
Якщо немає таких рядків:
            Key file: /opt/drweb/drweb.key
            Registration info:
            XXXXXXXXXX
значить є проблеми з реєстраційним ключем Якщо немає такого рядку:
            Loading /var/drweb/bases/drwebase.vdb - Ok, virus records: 31578
значить є проблеми з правами користувача `drweb` Зауваження: Всі подальші дії виконуються з пробним ключем. Для фільтрації пошти його функціональності досить. Щодо комерційних ключів, читайте: `/opt/drweb/doc` Для перевірки пошуку вірусів скористаємося спеціальним тестовим псевдовірусом. Він міститься (і описаний) у файлі `/opt/drweb/doc/readme.eicar`. Створимо псевдовірус у файлі `virtest`:
            [root@mailer drweb]# cat doc/readme.eicar | grep X5O! >virtest
А потім перевіримо працездатність:
            [root@mailer drweb]# ./drweb virtest
            Dr.Web (R) for Linux, version 4.29.2 (November 5, 2002)
            Copyright (c) Igor Daniloff, 1992-2002
            Daniloff's Labs and DialogueScience
            http://www.drweb.ru, support@drweb.ru: +7 (812) 387-64-08
            http://www.dials.ru, antivir@dials.ru: +7 (095) 137-01-50
            Key file: /opt/drweb/drweb.key
            Registration info:
            0100005167
            Evaluation Key (ID Anti-Virus Lab. Ltd, St.Petersburg)
            This is an EVALUATION version with limited functionality!
            To get your registration key, call regional dealer.
            Loading /var/drweb/bases/drwebase.vdb - Ok, virus records: 31578
            /opt/drweb/virtest infected with EICAR Test File (NOT a Virus!)
            Scan report for "/opt/drweb/virtest":
            Scanned       : 1         Cured      : 0
            Infected      : 1         Deleted    : 0
            Modifications : 0         Renamed    : 0
            Suspicious    : 0         Moved      : 0
            Scan time     : 00:00:00  Scan speed : 1 Kb/s
Всі ці повідомлення відображаються у файлі `/var/drweb/log/drweb.log` Підправимо налаштування антивірусу в секції `[Linux]`:
    -->--------------------------------------<--
    --- drweb32.ini.orig    Tue Nov  5 00:44:48 2002
    +++ drweb32.ini Tue Nov 12 12:46:13 2002
    @@ -18,6 +18,9 @@
     InfectedFiles = Report
     SuspiciousFiles = Report
     IncurableFiles = Report
    +ActionInfectedArchive = move
    +ActionInfectedMail = move
    +ActionInfectedContainer = move
     ExcludePaths =
     LogToFile = Yes
     OverwriteLog = No
    -->--------------------------------------<--
Зауваження: при використанні пробного ключа антивірус не лікує, тому просто складуємо заражені листи у відстійнику. Зацікавлені сторони отримають відповідне повідомлення (`IncurableFiles, InfectedFiles` ) Та в секції `[Linux:Daemon]`:
    -->--------------------------------------<--
    --- drweb32.ini.orig    Tue Nov  5 00:44:48 2002
    +++ drweb32.ini Tue Nov 12 12:46:13 2002
    @@ -68,10 +71,12 @@
     LogPacked = Yes
     Interfaces = "localhost"
     ;User = drweb
    -;UserID =
    -;GroupID =
    +UserID = 547
    +GroupID = 547
     ScanFiles = All
     MaxCompressionRatio = 20
    +MaxFileSizeToExtract = 5000
     MaxChildren = 16
     SyslogFacility = "Daemon"
     SyslogPriority = "Alert"
    -->--------------------------------------<--
Зауваження: Я не використовував налаштування `User = drweb` бо не знайшов у документації пояснення чи це стосується тільки користувача `drweb`, чи і групи `drweb` також. Тому і вказав безпосередньо `UserID` та `GroupID`. Можна, також, добавити антиспамерської функціональності:
    -->--------------------------------------<--
    --- drweb32.ini.orig    Tue Nov  5 00:44:48 2002
    +++ drweb32.ini Tue Nov 12 12:46:13 2002
    @@ -79,6 +84,11 @@
     FilterRule X-Mailer ".*Mass.*Sender.*" Reject
     FilterRule To ".*undisclosed.*recipient.*" Reject
     FilterRule Subject ".*free.*xxx.*" Reject
    +FilterRule Subject ".*viagra.*" Reject
    +FilterRule Subject ".*pennis.*" Reject
    +FilterRule Subject ".*money.*" Reject
    +FilterRule From ".*Sarah.*Williams.*" Reject

     UpdatePath = "/opt/drweb/updates"
    -->--------------------------------------<--
Запуск демону антивірусу. Скористаємося службовим скриптом:
            [root@mailer drweb]# /etc/rc.d/init.d/drwebd start
            Starting Dr. Web daemon...Dr.Web (R) daemon for Linux, version 4.29.2 (November 5, 2002)
            Copyright (c) Igor Daniloff, 1992-2002
            Daniloff's Labs and DialogueScience
            http://www.drweb.ru, support@drweb.ru: +7 (812) 387-64-08
            http://www.dials.ru, antivir@dials.ru: +7 (095) 137-01-50
            Key file: /opt/drweb/drwebd.key
            Registration info:
            0100005168
            Evaluation Key (ID Anti-Virus Lab. Ltd, St.Petersburg)
            This is an EVALUATION version with limited functionality!
            To get your registration key, call regional dealer.
            Loading /var/drweb/bases/drwebase.vdb - Ok, virus records: 31578
            Daemon is installed, TCP socket created on port 3000
У разі нормального запуску демон створює потрібні сокети (`Interfaces:DaemonPort`), вказані у `/etc/drweb/drweb32.ini`:
            [root@mailer drweb]# netstat -napl | grep drweb
            tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      6697/drwebd
            unix  2      [ ]         DGRAM                    348573 6697/drwebd
Перевіряємо його роботу:
            [root@mailer drweb]# clients/drwebdc -fvirtest
            Results: daemon return code 0x10020 (known virus is found)
На демона, також, зав'язана робота скрипта оновлення антивірусних баз. Налаштовуємо оновлення антивірусних баз, яке відбувається за допомогою скрипта `/opt/drweb/update/update/pl`. Для його роботи потрібен перлівський модуль `String::CRC32`. Можна встановити його з пакету дистрибутиву:
            [root@mailer drweb]# cd ~/wrk
            [root@mailer wrk]# rpm -i perl-String-CRC32-1.2-15.i386.rpm
Або з архіву:
            [root@mailer drweb]# cd ~/wrk
            [root@mailer wrk]# tar xzvf String-CRC32-1.2.tar.gz
            String-CRC32-1.2/
            ...
            String-CRC32-1.2/CRC32.pod
            [root@mailer wrk]# cd String-CRC32-1.2
            [root@mailer String-CRC32-1.2]# perl Makefile.PL INSTALLDIRS=vendor
            Checking if your kit is complete...
            Looks good
            Writing Makefile for String::CRC32
            [root@mailer String-CRC32-1.2]# make && make test
            cp CRC32.pm blib/lib/String/CRC32.pm
            ...
            All tests successful.
            Files=1, Tests=27,  0 wallclock secs ( 0.08 cusr +  0.01 csys =  0.09 CPU)
            [root@mailer String-CRC32-1.2]# make install UNINST=1
            Installing /usr/lib/perl5/vendor_perl/5.6.1/i386-linux/auto/String/CRC32/CRC32.so
            ...
            Appending installation info to /usr/lib/perl5/5.6.1/i386-linux/perllocal.pod
Зауваження: визначення `INSTALLDIRS=vendor` залежить від дистрибутиву та Ваших вподобань. Завантажуємо свіжі оновлення:
            [root@mailer wrk]# su drweb -s /bin/sh -c /opt/drweb/update/update.pl
            [root@mailer wrk]# ll /var/drweb/bases
            mtotal 700
            -rw-r--r--    1 drweb    drweb         7853 Жов 30 18:45 drw42901.vdb
            -rw-r--r--    1 drweb    drweb         5130 Лис  3 23:45 drw42902.vdb
            -rw-r--r--    1 drweb    drweb         3994 Лис 10 23:00 drw42903.vdb
            -rw-r--r--    1 drweb    drweb        12475 Лис 21 00:38 drw42904.vdb
            -rw-r--r--    1 drweb    drweb         8130 Лис 24 23:40 drw42905.vdb
            -rw-r--r--    1 drweb    drweb         7564 Гру  1 23:06 drw42906.vdb
            -rw-r--r--    1 drweb    drweb         5568 Гру  8 22:35 drw42907.vdb
            -rw-r--r--    1 drweb    drweb       644617 Лис  5 00:44 drwebase.vdb
            -rw-r--r--    1 drweb    drweb         1794 Гру 11 08:35 drwtoday.vdb
            [root@mailer wrk]# ll /opt/drweb/updates
            total 28
            -rw-r--r--    1 drweb    drweb         2318 Лис  4 00:32 drw42902.txt
            -rw-r--r--    1 drweb    drweb         1601 Лис 10 23:28 drw42903.txt
            -rw-r--r--    1 drweb    drweb         6064 Лис 18 11:42 drw42904.txt
            -rw-r--r--    1 drweb    drweb         2880 Лис 24 23:40 drw42905.txt
            -rw-r--r--    1 drweb    drweb         3279 Гру  1 23:06 drw42906.txt
            -rw-r--r--    1 drweb    drweb         1398 Гру  8 23:07 drw42907.txt
Налаштовуємо періодичні оновлення за допомогою скрипту `/etc/cron.daily/drweb_update`.
    -->--------------------------------------<--
    #!/bin/sh
    su drweb -s /bin/sh -c /opt/drweb/update/update.pl
    -->--------------------------------------<--
Тепер збираємо клієнта для sendmail. Для його роботи потрібна підтримка `libmilter` у sendmail. Це вірно для ASPLinux. 7.3 Перевіряємо наявність відповідного пакета та власне бібліотеки у ньому:
            [root@mailer wrk]# rpm -ql sendmail-devel | grep milter
            /usr/include/libmilter/mfapi.h
            /usr/lib/libmilter.a
Збираємо клієнтів:
            [root@mailer wrk]# tar xzvf drweb-clients-4.29-sources.tar.gz
            drweb-clients-4.29-sources/
            drweb-clients-4.29-sources/addons/
            ...
            drweb-clients-4.29-sources/etc/smb_spider.conf
            [root@mailer wrk]# cd drweb-clients-4.29-sources
            [root@mailer drweb-clients-4.29-sources]# ln -s /usr/lib/libmilter.a lib/libmilter.a
            [root@mailer drweb-clients-4.29-sources]# ln -s /usr/lib/libsmutil.a lib/libsmutil.a
            [root@mailer drweb-clients-4.29-sources]# ln -s /usr/include/libmilter include
            [root@mailer drweb-clients-4.29-sources]# ./configure

            Do you want compile Sendmail filter ? [y or n]
             [default=y]:y

            Do you use Sendmail version 8.11 ? [y or n]
             [default=n]:y
            ...
            Do you want compile commandline client ? [y or n]
             [default=y]:y
            ...
            Enter compiler flags
             [default=-O2 -Wall -pipe]:

            ----------------------
            Configuration Summary:
              OS type = Linux
              Milter version = FFR
              Milter include dir = include/libmilter
              Sendmail util library = lib/libsmutil.a (-lsmutil)
              Compiler flag(s) = -O2 -Wall -pipe

            Configuration is okey ? [y or n]
             [default=y]:y

            Creating Makefile ... [.] [src]Done.
            [root@mailer drweb-clients-4.29-sources]# make
            gcc -c -O2 -Wall -pipe -D__UNIX_DW -DLinux_DW  -I./include...
            ...
            gcc dw_md5.o dw_users.o dwsm_dfork.o dwsm_opt.o dwsm_file.o...
Копіюємо клієнтів у домашній каталог:
            [root@mailer drweb-clients-4.29-sources]# strip drweb-smf
            [root@mailer drweb-clients-4.29-sources]# strip drwebdc
            [root@mailer drweb-clients-4.29-sources]# cp drweb-smf /opt/drweb
            [root@mailer drweb-clients-4.29-sources]# cp drwebdc /opt/drweb
А все для налаштування у каталог налаштування:
            [root@mailer drweb-clients-4.29-sources]# cp etc/drweb_smf.conf /etc/drweb
            [root@mailer drweb-clients-4.29-sources]# cp -R templates /etc/drweb
            [root@mailer drweb-clients-4.29-sources]# cd ..
Розпаковуємо файл локалізації `uk-en.tar.bz2` у теку `/etc/drweb/templates` Налаштовуємо клієнта:
    -->--------------------------------------<--
    --- drweb_smf.conf.orig Wed Dec 11 16:53:23 2002
    +++ drweb_smf.conf      Wed Dec 11 16:59:19 2002
    @@ -50,7 +50,7 @@
     LocalScan = yes

     # Enable or disable spam-filter (on/off)
    -SpamFilter = off
    +SpamFilter = on

     # User account used by filter
     FilterAccount = drweb
    @@ -95,7 +95,7 @@
     #        pass - pass such messages
     #        discard - discard such messages
     #        reject - reject such message
    -SpamFilterAlert = pass
    +SpamFilterAlert = reject

     # EmptyFrom  - mean that SMTP session initiated with empty envelope From:
     #              used for mail notifications (reports) and by spammers
    @@ -108,7 +108,8 @@
     #
     #        discard - discard such messages
     #        reject - reject such message
    -EmptyFrom = continue
    +#EmptyFrom = continue
    +EmptyFrom = reject

     # SkipObject - mean that daemon found object that cannot be checked:
     #              password protected archive, broken archive, sym-link,
    @@ -147,10 +148,10 @@
     ProcessingErrors = reject

     # Admin mail address (may be unix-local address)
    -AdminMail = av-admin@example.com
    +AdminMail = av-admin@slovnyk.org

     # Filter address, that be used in From:
    -FilterMail = DrWeb-DAEMON@example.com
    +FilterMail = DrWeb-DAEMON@slovnyk.org

     # Quarantine directory.
     # The infected files could be moved in that dir
    @@ -176,7 +177,8 @@
     # Text string used for generate notification hashes,
     # used only if FastNotify = Yes
     # PLEASE EDIT - !!! SECURITY CRITICAL !!!
    -NotifyHashSalt = !!!___EDIT_THIS___!!!
    +#NotifyHashSalt = !!!___EDIT_THIS___!!!
    +NotifyHashSalt = !!! Щось секретне !!!

     [VirusNotifications]
     # Enable or disable sending notifications to the persons (yes/no)
    @@ -185,32 +187,32 @@
     RcptsNotify = yes

     # Files with notification templates
    -AdminTemplate = /etc/drweb/templates/en-ru/sendmail/virus-admin.msg
    -SenderTemplate = /etc/drweb/templates/en-ru/sendmail/virus-sender.msg
    -RcptsTemplate = /etc/drweb/templates/en-ru/sendmail/virus-rcpts.msg
    +AdminTemplate = /etc/drweb/templates/uk-en/sendmail/virus-admin.msg
    +SenderTemplate = /etc/drweb/templates/uk-en/sendmail/virus-sender.msg
    +RcptsTemplate = /etc/drweb/templates/uk-en/sendmail/virus-rcpts.msg

     [SkipNotifications]
     AdminNotify = no
     SenderNotify = yes
     RcptsNotify = no
     AdminTemplate =
    -SenderTemplate = /etc/drweb/templates/en-ru/sendmail/skip-sender.msg
    +SenderTemplate = /etc/drweb/templates/uk-en/sendmail/skip-sender.msg
     RcptsTemplate =

     [MailbombNotifications]
     AdminNotify = yes
     SenderNotify = yes
     RcptsNotify = no
    -AdminTemplate = /etc/drweb/templates/en-ru/sendmail/mailbomb-admin.msg
    -SenderTemplate = /etc/drweb/templates/en-ru/sendmail/mailbomb-sender.msg
    +AdminTemplate = /etc/drweb/templates/uk-en/sendmail/mailbomb-admin.msg
    +SenderTemplate = /etc/drweb/templates/uk-en/sendmail/mailbomb-sender.msg
     RcptsTemplate =

     [ErrorNotifications]
     AdminNotify = yes
     SenderNotify = yes
     RcptsNotify = no
    -AdminTemplate = /etc/drweb/templates/en-ru/sendmail/error-admin.msg
    -SenderTemplate = /etc/drweb/templates/en-ru/sendmail/error-sender.msg
    +AdminTemplate = /etc/drweb/templates/uk-en/sendmail/error-admin.msg
    +SenderTemplate = /etc/drweb/templates/uk-en/sendmail/error-sender.msg
     RcptsTemplate =

     ###################
    -->--------------------------------------<--
Для активізації клієнта створюємо службовий скрипт `/etc/rc.d/init.d/drweb-sendmail` (див.:`drweb-clients-4.29-sources/doc/sendmail/example/drweb-sendmail`):
    -->--------------------------------------<--
    #!/bin/sh
    #
    # $Id: template.initscript,v 1.8 2002/05/15 16:41:27 cvser Exp $
    #
    # description: Dr.Web for Sendmail is a antivirus filter
    #              for e-mails that comes thru SMTP protocol
    #
    # chkconfig: 2345 79 31
    # processname: drweb-smf
    # Use these if cannot found functions
    dw_daemon() {
        ulimit -c 0
        $*
        return $?
    }
    dw_killproc() {
        killall $2 $1 >/dev/null 2>&1
        return $?
    }
    dw_status() {
        killall -0 $1 >/dev/null 2>&1
        if [ $? -eq 0 ] ; then
            echo "$1 is running..."
            return 0
        else
            echo "$1 is not running."
            return 1
        fi
    }
    # Source function library.
    if [ -f /etc/rc.d/init.d/functions ] ; then
        . /etc/rc.d/init.d/functions
        PROC_DAEMON="daemon"
        PROC_KILL="killproc"
        PROC_STATUS="status"
        MSG_START="Starting drweb for sendmail: "
        MSG_RELOAD="Reload drweb for sendmail: "
        MSG_STOP="Shutdowning drweb for sendmail: "
        MSG_WAIT="Wait for shutdown drweb for sendmail: "
    else
        PROC_DAEMON="dw_daemon"
        PROC_KILL="dw_killproc"
        PROC_STATUS="dw_status"
        MSG_START=" drweb-sendmail"
        MSG_RELOAD="Reload drweb-sendmail"
        MSG_STOP=" drweb-sendmail"
        MSG_WAIT=" drweb-sendmail(wait)"
    fi
    if [ ! -f "/opt/drweb/drweb-smf" ] ; then
        echo "DrWeb Sendmail Filter not found"
        return 1
    fi
    RETVAL=0
    FILTER_UNIX="no"
    FILTER_SOCKET=
    start() {
            # Start daemons.
            echo -n $MSG_START
        [ "x$FILTER_UNIX" = "xyes" ] && rm -f $FILTER_SOCKET
        $PROC_DAEMON /opt/drweb/drweb-smf
        RETVAL=$?
            echo
            return $RETVAL
    }
    stop() {
            # Stop daemons.
            echo -n $MSG_STOP
        $PROC_KILL drweb-smf
            RETVAL=$?
        if [ $RETVAL -eq 0 ] ; then
            if [ "x$FILTER_UNIX" = "xyes" ] ; then
                RETRY=3
                while [ -f $FILTER_SOCKET -a $RETRY -gt 0 ] ; do
                    if [ $RETRY -lt 3 ] ; then
                        echo
                        echo $MSG_WAIT
                    fi
                    sleep 1
                    RETRY=$(($RETRY-1))
                done
                if [ -f $FILTER_SOCKET ] ; then
                    RETVAL=70
                fi
            else
                # Cannot check inet socket
                # For future: use pidfile
                sleep 3
            fi
        fi
            echo
            return $RETVAL
    }
    # See how we were called.
    case "$1" in
      start)
            start
            RETVAL=$?
            ;;
      stop)
            stop
            RETVAL=$?
            ;;
      restart)
            stop
            start
            RETVAL=$?
            ;;
      status)
        $PROC_STATUS drweb-smf
            RETVAL=$?
            ;;
      *)
            echo "Usage: $0 { start | stop | restart | status }"
            exit 1
    esac
    exit $RETVAL
    -->--------------------------------------<--
Та прописуємо і запускаємо його:
            [root@mailer wrk]# chkconfig --add drweb-sendmail
            [root@mailer wrk]# chkconfig --list drweb-sendmail
            drweb-sendmail  0:off   1:off   2:on    3:on    4:on    5:on    6:off
            [root@mailer wrk]# /etc/rc.d/init.d/drweb-sendmail start
Для підключення клієнта до sendmail додаємо підтримку у `sendmail.mc` (див.: `drweb-clients-4.29-sources/doc/sendmail/example/sendmail.mc.addon`):
    -->--------------------------------------<--
    --- sendmail.mc.old     Mon Jun 10 00:00:00 2002
    +++ sendmail.mc Wed Dec 11 16:39:21 2002
    @@ -60,3 +60,7 @@
     MAILER(smtp)dnl
     MAILER(procmail)dnl
     Cwlocalhost.localdomain
    +define(`_FFR_MILTER',1)dnl
    +MAIL_FILTER(`drweb-filter',`S=inet:3001@127.0.0.1,F=T,T=S:5m;R:5m;E:1h')dnl
    +define(`confINPUT_MAIL_FILTERS', `drweb-filter')dnl
    +dnl define(`confMILTER_LOG_LEVEL', `1')dnl
    -->--------------------------------------<--
Та відтворюємо новий `/etc/sendmail.cf`:
            [root@mailer wrk]# m4 /etc/mail/sendmail.mc /etc/sendmail.cf
Перезапускаємо sendmail:
            [root@mailer wrk]# /etc/rc.d/init.d/sendmail restart

вгору |  |  |
[an error occurred while processing this directive] |
|  | © 2000-2003, Київ, Соломко Валентин -- ідея та наповнення, графічне опрацювання -- проєкт дизайн, змiнено -- 08.06.2003 14:29:35 |