Сервер в кармане, или просто о сложном!
Много интересного на канале

Настройка OpenVPN

Обновлено: 30.10.2020

Нам надо соединить удаленного сотрудника к рабочей сети. Это делается в том числе с помощью VPN, в нашем случае, OpenVPN. Это бесплатный, достаточно надежный и не очень сложный в настройке сервер и клиент VPN.


OpenVPN - настройка в Windows и Linux

Обновлено: 30.10.2020
Теги: OpenVPN VPN

OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой как интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый сетевым адаптером, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.

Это статья старая. Ссылка на актуальную статью по настройке OpenVPN.


Утилита командной строки rundll32.exe

Обновлено: 30.06.2025
Автор: Юрий Березин
Источник: http://www.goldfaq.ru/

Windows имеет в своем составе утилиту командной строки rundll32.exe, которая позволяет запускать некоторые команды-функции, заложенные в DLL-файлах. Вообще-то данная утилита была разработана для внутреннего пользования программистами Microsoft. Но богатые возможности этой программы дало повод на всеобщее использование пользователями. Список команд слишком обширен.

Приведем список наиболее значимых команд (в котором найдете ОЧЕНЬ интересные команды, ну а как их использовать, думайте сами!).

* rundll32 shell32.dll,Control_RunDLL hotplug.dll - диалоговое окно Отключение или извлечение аппаратного устройства

* rundll32 diskcopy,DiskCopyRunDll - вызов диалога "Копирование диска".

* rundll32 keyboard,disable - отключение клавиатуры, действует до следующей перезагрузки.

* rundll32 mouse,disable - отключение мыши вплоть до перезагрузки.

* rundll32 krnl386.exe,exitkernel - выгрузить ядро системы, выход из Windows.

* rundll32 mshtml.dll,PrintHTML "HtmlFileNameAndPath" - распечатать документ HTML, где "HtmlFileNameAndPath" - путь к файлу и его имя.

* rundll32 мсprint2.dll,RUNDLL_PrintTestPage - распечатать тестовую страницу на принтере.

* rundll32 netplwiz.dll,AddNetPlaceRunDll - вызов мастера подключения нового сетевого ресурса "Добавление в сетевое окружение".

* rundll32 rnaui.dll,RnaWizard - вызов мастера "Удаленный доступ к сети".

* rundll32 rnaui.dll,RnaWizard /1 - вызов мастера "Удаленный доступ к сети" без отображения начального окна.

* rundll32 shell,ShellExecute - открыть Проводник (папка "Рабочий стол").

* rundll32 shell32,Control_RunDLL - открыть в Проводнике папку "Панель управления".

* rundll32 shell32,Control_RunDLL appwiz.cpl,,n - вызов диалогового окна "Установка и удаление программ", в котором будет открыта вкладка с номером "n" (от 1 до 3).

* rundll32 shell32,Control_RunDLL main.cpl @0 - открыть диалог "Свойства мыши".

* rundll32 shell32,Control_RunDLL main.cpl @1 - открыть диалог "Свойства клавиатуры".

* rundll32 shell32,Control_RunDLL main.cpl @2 - открыть папку "Принтеры".

* rundll32 SHELL32,SHHelpShortcuts_RunDLL PrintersFolder - открыть папку "Принтеры" (другой способ).

* rundll32 shell32,Control_RunDLL main.cpl @3 - открыть папку "Шрифты".

* rundll32 SHELL32,SHHelpShortcuts_RunDLL FontsFolder - открыть папку "Шрифты" (другой способ).

* rundll32 SHELL32,Control_RunDLL modem.cpl, add - открыть диалог "Свойства модема".

* rundll32 shell32,Control_RunDLL timedate.cpl - открыть диалог "Дата и время".

* rundll32 shell32,OpenAs_RunDLL - вызвать диалог "Открыть с помощью...".

* rundll32 shell32,ShellAboutA WINHOWTO.RU - информация о версии Windows.

* rundll32 shell32,SHExitWindowsEx 0 - закрыть все программы, перегрузить оболочку.

* rundll32 shell32, SHExitWindowsEx 1 - выключить ПК.

* rundll32 SHELL32, SHExitWindowsEx -1 - перегрузить оболочку Windows.

* rundll32 shell32, SHExitWindowsEx 2 - перегрузить ПК.

* rundll32 shell32,SHExitWindowsEx 4 - принудительно закрыть все программы.

* rundll32 shell32,SHExitWindowsEx 8 - выход из Windows и выключение ATX-совместимого ПК.

* rundll32 shell32,SHFormatDrive - вызов диалога форматирования диска А:.

* rundll32 SHELL32,SHHelpShortcuts_RunDLL AddPrinter - запуск "Мастера установки принтера".

* rundll32 shell32,SHHelpShortcuts_RunDLL Connect - запуск мастера подключения сетевого диска.

* rundll32 SHELL32,SHHelpShortcuts_RunDLL PrintTestPage - распечатать тестовую страницу.

* rundll32 sysdm.cpl,InstallDevice_Rundll - вызов мастера установки оборудования.

* rundll32 url.dll,FileProtocolHandler %1 - открыть веб-страницу, где %1 - URL сайта (включая http://).

* rundll32 url.dll,MailToProtocolHandler %1 - создать новое письмо, где %1 - e-mail адресата.

* rundll32 user,CASCADECHILDWINDOWS - расположить все окна каскадом.

* rundll32 user,TILECHILDWINDOWS - расположить все окна по экрану.

* rundll32 user,disableoemlayer - сбой системы (!) - выключить все функции ввода-вывода

(клавиатура, дисплей, мышь). В результате будет черный экран с курсором и ни на что не реагирующая система, однако Windows продолжает работать.

* rundll32 user,ExitWindowsExec - быстрая перезагрузка Windows.

* rundll32 user,RepaintScreen - выполнить команду "Обновить".

* rundll32 user,SetCaretBlinkTime n - задать частоту мигания курсора, соответствующую значению параметра n.

* rundll32 user,SetCursorPos - переместить курсор мыши в верхний левый угол экрана.

* rundll32 user,SetDoubleClickTime n - задать скорость двойного нажатия левой кнопки мыши (Double Click), соответствующую параметру n.

* rundll32 user,SwapMouseButton - поменять местами клавиши мыши (обратная смена невозможна).

* rundll32 user,WNetConnectDialog - вызов диалога "Подключение сетевого диска".

* rundll32 user,WNetDisconnectDialog - вызов диалога "Отключение сетевого диска".

* rundll32 AppWiz.Cpl,NewLinkHere %1 - запуск мастера создания нового ярлыка, где %1 - путь к исходному файлу.

Некоторые из этих команд пригодились мне, когда обновлял Internet Explorer до версии 7 на Windows XP, при этом произошел какой-то сбой и в систему мне войти не удавалось, но можно было через три клавиши запускать приложения и программы из командной строки. Пригодилась команда "rundll32 shell32,Control_RunDLL appwiz.cpl,,n" - вызов диалогового окна "Установка и удаление программ". Я просто удалил IE7 и все заработало как и было. Это я привел пример моего конкретного случая, у вас их может быть гораздо больше. Удачи и не бойтесь консоли, она приятная на ощупь, вся до последней клавиши!

Источник: http://www.diwaxx.ru/win/rundll32.php

Миграция с sendmail на exim + saslauthd

Обновлено: 30.06.2025

Переход с sendmail на exim трудностей вызывать не должен. Общие рекомендации - сделать бэкап юзерской почты, находящейся в /var/mail/.

В данном случае, рассматривается вариант миграции с использованием системных пользователей, как оно обычно и бывает. Ибо если вы докатились до sendmail и LDAP, например, то он вам явно вштырил, и необходимости в миграции у вас нет. Для авторизации отправителей будем использовать saslauthd.

Итак, добавляем такие строки в файл /etc/make.conf:

# директория с портами
  PORTSDIR?=      /usr/ports
  # EXIM
  .if ${.CURDIR} == ${PORTSDIR}/mail/exim
  # MySQL затем, если будуте окончательно уходить от системных пользователей,
  # чтобы не пересобирать exim ещё раз.
  WITH_MYSQL=             yes
  LOG_FILE_PATH?=         syslog
  WITH_CONTENT_SCAN=      yes
  WITH_DEFAULT_CHARSET?=  koi8-r
  WITHOUT_IPV6=           yes
  WITH_BDB_VER?=          4
  WITH_SASLAUTHD=         yes
  .endif
  

После чего обновляем порты, и устанавливаем exim:

/usr/home/lissyara/>cd /usr/ports/mail/exim
  /usr/ports/mail/exim/>make && make install && make clean
  

Следом, ставим ClamAV, если он у вас не стоит:

/usr/ports/mail/exim/>cd ../../security/clamav
  /usr/ports/security/clamav/>make && make install && make clean
  

Вылазиет синенькое окошко, где ничё не надо выбирать. После установки, топаем править файл /etc/mail/mailer.conf до такого состояния:

sendmail        /usr/local/sbin/exim
  send-mail       /usr/local/sbin/exim
  mailq           /usr/local/sbin/exim -bp
  newaliases      /usr/local/sbin/exim -bi
  hoststat        /usr/local/sbin/exim
  purgestat       /usr/local/sbin/exim
  

После чего рихтуем конфиг exim:

#!/bin/sh
  # моя конфига экзма. Будь проклят тот день,
  # когда мне пришла в голову мысль подписать
  # русские поясния ко всем пунктам! :) Хоть и
  # делал я это в первую очередь для себя -
  # чтоб лучше понять его, но работа эта оказалась
  # слишком масштабная и неблагодарная...
  
  
  # Имя хоста. Используется в EHLO.
  # Фигурирует в других пунктах, если они не заданы -
  # типа qualify_domain и прочих..
  # Если тут ничё не установлено (строка закомметрована)
  # то используется то, что вернёт функция uname()
  primary_hostname = mx.lissyara.su
  
  # Делаем список локальных доменов. Далее этот
  # список будет фигурировать в виде +local_domains
  # Mожно их просто перечислить через двоеточие. Есть интересная
  # возможность, можно указать юзер@[хост] - lissyara@[222.222.4.5]
  domainlist local_domains = @
  
  # делаем список доменов с которых разрешены релеи.
  # Далее этот список будет в виде +relay_to_domains
  # Можно использовать символы подстановки, типа:
  # .... = *.my.domen.su : !spam.my.domen.su : first.su
  # тогда пропускается всё, что похоже на *.my.domen.su, но
  # от spam.my.domen.su релеится почта не будет.
  domainlist relay_to_domains =
  
  # Составляем список хостов с которых разрешён неавторизованый
  # релей. Обычно в нём находятся локальные сети, и локалхост...
  # ЛокалХост в двух видах был внесён сознательно - пару раз
  # сталкивался с кривым файлом /etc/hosts - результатом было
  # непонимание `localhost` но пониманием 127.0.0.1/8
  hostlist   relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/16
  
  # Вводим названия acl`ов для проверки почты. (В общем-то, это
  # необязательно, если вы делаете открытый релей, или хотите
  # принимать вообще всю почту с любого хоста для любых
  # получателей... Тока потом не жалуйтесь что у Вас спам
  # и провайдер выкатывает немеряный счёт :))
  acl_smtp_rcpt = acl_check_rcpt
  acl_smtp_data = acl_check_data
  
  # Прикручиваем антивирус - при условии, что exim собран
  # с его поддержкой. В качестве антивиря юзаем ClamAV,
  # ибо - ПО должно быть свободным! :)
  # Итак, указываем местоположение сокета clamd.
  av_scanner = clamd:/var/run/clamav/clamd
  
  # Адрес куда слать на проверку спама (SpamAssasin), но я
  # это не юзаю. Не так много у меня спама...
  # spamd_address = 127.0.0.1 783
  
  # Имя домена добавляемое для локальных отправителей (реальных
  # юзеров системы) т.е. почта отправляемая от root, будет от
  # root@домен_указанный_здесь. Если пункт незадан, то используется
  # имя хоста из `primary_hostname`. Логичней было бы написать здесь
  # lissyara.su, но мне удобней иначе:
  qualify_domain = mx.lissyara.su
  
  # Имя хоста для ситуации, обратной предыдущей, - это имя домена
  # добавляемое к почте для системных юзеров, ну и вообще для почты
  # пришедшей на адрес типа `root`, `lissyara`, & etc... Если этот
  # пункт незадан то используется значение полученное из
  # предыдущего пункта - `qualify_domain`
  qualify_recipient = mx.lissyara.su
  
  # А это как раз кусок вышеописанного анахронизма - про почту в
  # виде user@[222.222.222.222] - принимать её или нет. По дефолту
  # (когда строка закомментирована) значение - false. Если захотите
  # поставить true то надо будет добавить в список доменов
  # комбинацию @[] - она означает `все локальные адреса`
  allow_domain_literals = false
  
  # Пользователь от которого работает exim
  exim_user = mailnull
  
  # группа в кторой работает exim
  exim_group = mail
  
  # запрещаем работу доставки под юзером root - в целях безопасности
  never_users = root
  
  # Проверяем соответствие прямой и обратной зон для всех хостов.
  # Тока зачем это нужно - даже и незнаю... Спам на этом не режется...
  # Зато возможны проблемы - если сервер зоны скажет `сервер файлед`
  # то почту от этого хоста Вы не получите :)
  #host_lookup = *
  
  # Тоже анахронизм (на самом деле, не такой уж анахронизм, но все давно
  # забили на ident и закрыли файрволлом tcp:113...) Это проверка - Ваш
  # хост спрашивает у удалённого, с которого было подключение, а кто
  # собстно ко мне подключился на такой-то порт? Если на удалённом хосте
  # работает identd - он может ответить (а может и не ответить - как
  # настроить), скажет UID пользователя от которого установлено
  # соединение, тип ОС, и имя пользователя. Теперь, понимаете, почему
  # у всех оно зарублено и файрволлами позакрыто? :) Это же палево :)
  # Тока на мой взгляд, если на сервере всё настроено правильно -
  # то вовсе это и не страшно.
  # Короче - если хостс поставить * то будет проверять все. Таймаут -
  # если поставить 0 то не будет ждать ответа ни от кого. По
  # вышеописанным причинам - отключаем
  #rfc1413_hosts = *
  rfc1413_query_timeout = 0s
  
  # По дефолту, экзим отфутболивает все `неквалифицированные` адреса,
  # состоящие тока из локальной части. Для того чтобы разрешить такие письма
  # определённых хостов используются эти директивы:
  # для `неквалифицированных` отправителей
  sender_unqualified_hosts = +relay_from_hosts
  # для `неквалифицированных` получателей
  recipient_unqualified_hosts = +relay_from_hosts
  
  # Интересный пункт, тока я не вполне понимаю его логику.
  # Позволяет выполнять что-то типа - пришло сообщение на
  # локальный ящик user%test.su@lissyara.su и
  # переправляет его на user@test.su. Делается это для
  # перечисленного списка доменов (* - все):
  # percent_hack_domains = *
  
  # Если сообщение было недоставлено, то генерится соощение
  # об ошибке. Если сообщение об ошибке не удалось доставить
  # то оно замораживается на указанный в этом пункте срок,
  # после чего снова попытка доставить его. При очередной
  # неудаче - сообщение удаляется.
  ignore_bounce_errors_after = 45m
  
  # Замороженные сообщения, находящиеся в очереди, дольше
  # указанного времени удаляются и генерится сообщение
  # об ошибке (при условии, что это не было недоставленное
  # сообщение об ошибке :))
  timeout_frozen_after = 15d
  
  # собсно на этом штатный конфиг кончился, но
  # меня-то это не устраивает... Поэтому пошли пункты,
  # почёрпнутые из других источников.
  
  # список адресов, через запятую, на которые засылаются
  # сообщения о замороженных сообщениях (о замороженых
  # уведомлениях о заморозке, сообщения не генерятся. - я
  # надеюсь эта строка понятна :))
  #freeze_tell = admin@lissyara.su
  
  # Список хостов, почта от которых принимается, несмотря
  # на ошибки в HELO/EHLO (тут указана моя подсеть)
  helo_accept_junk_hosts = 192.168.0.0/16
  
  # Через какое время повторять попытку доставки
  # замороженного сообщения
  auto_thaw = 1h
  
  # Приветствие сервера
  smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"
  
  # Максимальное число одновременных подключений по
  # SMTP. Рассчитывать надо исходя из нагрузки на сервер
  smtp_accept_max = 50
  
  # максимальное число сообщений принимаемое за одно соединение
  # от удалённого сервера (или пользователя). C числом 25
  # я имел проблемы тока один раз - когда у меня три дня лежал
  # инет и после его подъёма попёрли мессаги. Но у меня не так
  # много почты - всего 30 пользователей.
  smtp_accept_max_per_connection = 25
  
  # чё-то про логи и борьбу с флудом - я так понимаю -
  # максимальное число сообщений записываемых в логи
  smtp_connect_backlog = 30
  
  # максимальное число коннектов с одного хоста
  smtp_accept_max_per_host = 20
  
  # Ход ладьёй - для увеличения производительности,
  # директория `spool` внутри, разбивается на
  # директории - это ускоряет обработку
  split_spool_directory = true
  
  # Если у сообщения много адресатов на удалённых хостах,
  # то запускатеся до указанного числа максимально число
  # параллельных процессов доставки
  remote_max_parallel = 15
  
  # при генерации сообщения об ошибке прикладывать
  # не всё сообщение, а кусок (от начала) указанного
  # размера (иногда полезно и целиком - в таком случае
  # просто закомментируйте эту строку)
  return_size_limit = 70k
  
  # размер сообщения. У меня стоит относительно большой
  # размер (`относительно` - потому, что на большинстве
  # хостов оно ограничено 2-5-10мб, либо стоит анлим.)
  message_size_limit = 64M
  
  # разрешаем неположенные символы в HELO (столкнулся
  # с этим случайно - имя фирмы состояло из двух слов
  # и какой-то раздолбай домен обозвал my_firme_name
  # прям с подчёркиваниями... Виндовые клиенты при
  # соединении радостно рапортовали о себе
  # `vasya.my_firme_name` ну а экзим их футболил :))
  helo_allow_chars = _
  
  # Принудительная синхронизация. Если отправитель
  # торопится подавать команды, не дождавшись ответа,
  # то он посылается далеко и надолго :) Немного,
  # спам режется.
  smtp_enforce_sync = true
  
  # Выбираем, что мы будем логировать
  # + - писать в логи,
  # - - Не писать в логи.
  # +all_parents - все входящие?
  # +connection_reject - разорваные соединения
  # +incoming_interface - интерфейс (реально - IP)
  # +lost_incoming_connections - потеряные входящие
  # соединения
  # +received_sender - отправитель
  # +received_recipients - получатель
  # +smtp_confirmation - подтверждения SMTP?
  # +smtp_syntax_error - ошибки синтаксиса SMTP
  # +smtp_protocol_error - ошибки протокола SMTP
  # -queue_run - работа очереди (замороженные мессаги)
  log_selector = 
      +all_parents 
      +connection_reject 
      +incoming_interface 
      +lost_incoming_connection 
      +received_sender 
      +received_recipients 
      +smtp_confirmation 
      +smtp_syntax_error 
      +smtp_protocol_error 
      -queue_run
  
  # Убираем собственную временную метку exim`a из логов, её ставит
  # сам syslogd - нефига дублировать
  syslog_timestamp = no
  
  
  
  ### конфигурация ACL для входящей почты
  begin acl
  
  # Эти правила срабатывают для каждого получателя
  acl_check_rcpt:
  
  
    # принимать сообщения которые пришли с локалхоста,
    # не по TCP/IP
    accept  hosts = :
  
    # Запрещаем письма содержащие в локальной части
    # символы @; %; !; /; |. Учтите, если у вас было
    # `percent_hack_domains` то % надо убрать.
    # Проверяются локальные домены
    deny    message       = "incorrect symbol in address"
            domains       = +local_domains
            local_parts   = ^[.] : ^.*[@%!/|]
  
    # Проверяем недопустимые символы для
    # нелокальных получателей:
    deny    message       = "incorrect symbol in address"
            domains       = !+local_domains
            local_parts   = ^[./|] : ^.*[@%!] : ^.*/\.\./
  
    # Принимаем почту для постмастеров локальных доменов без
    # проверки отправителя (я закомментировал, т.к. это -
    # основной источник спама с мой ящик).
  
    accept  local_parts   = postmaster
            domains       = +local_domains
  
    # Запрещщаем, если невозможно проверить отправителя
    # (отсутствует в списке локальных пользователей)
    # У себя я это закоментил, по причине, что некоторые
    # железяки (принтеры, & etc) и программы (Касперский, DrWEB)
    # умеют слать почту, в случае проблем но не умеют ставить
    # нужного отправителя. Такие письма эта проверка не пускает.
  #  require verify        = sender
  
    # Запрещщаем тех, кто не обменивается приветственными
    # сообщениями (HELO/EHLO)
    deny    message       = "HELO/EHLO require by SMTP RFC"
            condition     = ${if eq{$sender_helo_name}{}{yes}{no}}
  
    # Принимаем сообщения от тех, кто аутентифицировался:
    # Вообще, большинство конфигов в рунете - это один и тот же
    # конфиг написанный Ginger, в котором этот пункт расположен
    # внизу. Но при таком расположении рубятся клиенты с adsl,
    # ppp, и прочие зарезанные на последующих проверках. Но это
    # жа неправильно! Этом мои пользователи из дома! Потому
    # я это правило расположил до проверок.
    accept  authenticated = *
  
  # Рубаем нах, тех, кто подставляет свой IP в HELO
    deny    message       = "Your IP in HELO - access denied!"
            hosts         =  * : !+relay_from_hosts : !81-196.lissyara.su
            condition     = ${if eq{$sender_helo_name}
      {$sender_host_address}{true}{false}}
  
  
  # Рубаем тех, кто в HELO пихает мой IP (2500 мудаков за месяц!)
    deny    condition     = ${if eq{$sender_helo_name}
      {$interface_address}{yes}{no}}
            hosts         = !127.0.0.1 : !localhost : *
            message       = "main IP in your HELO! Access denied!"
  
  # Рубаем тех, кто в HELO пихает только цифры
  # (не бывает хостов ТОЛЬКО из цифр)
    deny    condition     = ${if match{$sender_helo_name}
      {N^d+$N}{yes}{no}}
            hosts         = !127.0.0.1 : !localhost : *
            message       = "can not be only number in HELO!"
  
  # Рубаем тех, кто не пишет отправителя
  #  deny    condition     = ${if eq{$sender_address}{}{yes}{no}}
  #          hosts         = !127.0.0.1 : !localhost : *
  #          message       = "А какого HELO пустое?! Не по RFC..."
  
  ## Рубаем тех, кто не пишет отправителя (пробел)
  #  deny    condition     = ${if match{$sender_address}{N^s+$N}{yes}{no}}
  #          hosts         = !127.0.0.1 : !localhost : *
  #          message       = "А какого HELO пустое (тока пробелы)?! Не по RFC..."
  
  # Рубаем тех, кто не пишет отправителя
  #  deny    condition     = ${if eq{$sender_address}{}{yes}{no}}
  #          hosts         = !127.0.0.1 : !localhost : *
  #          message       = "Where sender of this mail?!"
  
    # Рубаем хосты типа *adsl*; *dialup*; *pool*;....
    # Нормальные люди с таких не пишут. Если будут
    # проблемы - уберёте проблемный пункт (у меня клиенты
    # имеют запись типа asdl-1233.zone.su - я ADSL убрал...)
    deny    message       = "your hostname is bad (adsl, poll, ppp & etc)."
            condition     = ${if match{$sender_host_name} 
                                 {adsl|dialup|pool|peer|dhcp} 
                                 {yes}{no}}
  
    # Задержка. (это такой метод борьбы со спамом,
    # основанный на принципе его рассылки) На этом рубается
    # почти весь спам. Единственно - метод неприменим на
    # реально загруженных MTA - т.к. в результате ему
    # приходится держать много открытых соединений.
    # но на офисе в сотню-две человек - шикарный метод.
    #
    # более сложный вариант, смотрите в статье по exim и
    # курьер имап. Т.к. там метод боле умный (просто правил
    # больше :), то можно и на более загруженные сервера ставить)
    warn
          # ставим дефолтовую задержку в 20 секунд
          set acl_m0 = 30s
    warn
          # ставим задержку в 0 секунд своим хостам и
          # дружественным сетям (соседняя контора :))
          hosts = +relay_from_hosts:213.234.195.224/28:80.253.9.18/32
          set acl_m0 = 0s
    warn
          # пишем в логи задержку (если оно вам надо)
          logwrite = Delay $acl_m0 for $sender_host_name 
  [$sender_host_address] with HELO=$sender_helo_name. Mail 
  from $sender_address to $local_part@$domain.
          delay = $acl_m0
  
  
    # Проверка получателя в локальных доменах.
    # Если не проходит, то проверяется следующий ACL,
    # и если непрошёл и там - deny
    accept  domains       = +local_domains
            endpass
            message       = "In my mailserver not stored this user"
            verify        = recipient
  
    # Проверяем получателя в релейных доменах
    # Опять-таки если не проходит -> следующий ACL,
    # и если непрошёл и там - deny
    accept  domains       = +relay_to_domains
            endpass
            message       = "main server not know how relay to this address"
            verify        = recipient
  
    # Рубаем тех, кто в блэк-листах. Серваки перебираются
    # сверху вниз, если не хост не найден на первом, то
    # запрашивается второй, и т.д. Если не найден ни в одном
    # из списка - то почта пропускается.
    deny    message       = "you in blacklist - $dnslist_domain --> $dnslist_text"
            dnslists      = opm.blitzed.org : 
                            cbl.abuseat.org : 
                            bl.csma.biz
  
    # Разрешаем почту от доменов в списке relay_from_hosts
    accept  hosts         = +relay_from_hosts
  
    # Если неподошло ни одно правило - чувак явно ищет
    # открытый релей. Пшёл прочь. :)
    deny    message       = "relay not permitted"
  
  
  
  
  # Тут идут ACL проверяющие содержимое (тело) письма.
  # Без них будут пропускаться все сообщения.
  
  acl_check_data:
  
    # Проверяем письмо на вирусы
    deny malware = *
    message = "In e-mail found VIRUS - $malware_name"
  
    # Если есть необходимость - тут проверки на спам
  
    # Пропускаем остальное
    accept
  
  
  # чё делаем с почтой
  begin routers
  
  # Поиск маршрута к хосту в DNS. Если маршрут не найден в DNS -
  # то это `унроутабле аддресс`. Не проверяются локальные
  # домены, 0.0.0.0 и 127.0.0.0/8
  dnslookup:
    driver = dnslookup
    domains = ! +local_domains
    transport = remote_smtp
    ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
    no_more
  
  # В качестве файла альясов используется стандартный файл альясов.
  # Ребилдить БД командой newaliases не надо - т.к. в данном случае
  # используется не БД а именно текстовый файл.
  system_aliases:
    driver = redirect
    allow_fail
    allow_defer
    data = ${lookup{$local_part}lsearch{/etc/aliases}}
    user = mailnull
    group = mail
    file_transport = address_file
    pipe_transport = address_pipe
  
  # Это специфический транспорт для адресов сгенерённых форвардингом для
  # доставки в файл, pipe или для авто-ответов... Используется файло в
  # хомяке, для перенаправления почты... Надо сразу заметить, что если
  # системные юзеры используются без хомяков (указана несуществующая
  # директория), то придётся её создать, пустую, т.к. экзим начинает
  # искать файл в директории которой нет, и в итоге - ругань в логах
  # и недоставленные письма.
  userforward:
    driver = redirect
    check_local_user
  # local_part_suffix = +* : -*
  # local_part_suffix_optional
    file = $home/.forward
  # allow_filter
    no_verify
    no_expn
    check_ancestor
    file_transport = address_file
    pipe_transport = address_pipe
    reply_transport = address_reply
    condition = ${if exists{$home/.forward} {yes} {no} }
  
  
  # Этот роутер проверяет локальный юзер или нет. Если в нём будет
  # ошибка (юзер не найден) то он выдаст мессагу "Unknown user".
  localuser:
    driver = accept
    check_local_user
  # local_part_suffix = +* : -*
  # local_part_suffix_optional
    transport = local_delivery
    cannot_route_message = Unknown user
  
  # начинаются транспорты - как доставляем почту
  begin transports
  
  # Доставка на удалённые хосты - по SMTP
  remote_smtp:
    driver = smtp
  
  # Транспорт для доставки почты локальным адресатам.
  # Доставляем туда же, куда и sendmail - в файл, в диреткории /var/mail/
  local_delivery:
    driver = appendfile
    file = /var/mail/$local_part
    delivery_date_add
    envelope_to_add
    return_path_add
    group = mail
    user = $local_part
    mode = 0660
    no_mode_fail_narrower
  
  
  # Это транспорт для доставки через трубу по адресам сгенерённым
  # форвардингом или альясингом. Если эта pipe генерит стандартный вывод,
  # возвращается отправителью с руганью в виде этого вывода. Установив
  # return_fail_output вместо return_output можно добиться чтобы отлупы
  # шли тока в случае ошибок, а не просто ругани.
  address_pipe:
    driver = pipe
    return_output
  
  # Транспорт для доставки сгенерённой альясингом или форвардингом.
  address_file:
    driver = appendfile
    delivery_date_add
    envelope_to_add
    return_path_add
  
  # Транспорт для автоответов
  address_reply:
    driver = autoreply
  
  
  # Начинаются повторы недоставленных писем.
  begin retry
  
  # Этот кусок я не трогал. Думаю разработчики лучше знают,
  # какие тут должны быть цифирьки. Если же вы это знаете
  # лучше их - меняйте. Хотя... А какого, если Вы такой
  # умный, читаете этот мануал? Может ну, их, цифирьки, а? :)
  # Address or Domain  Error   Retries
  # -----------------  -----   -------
  *                    *       F,2h,15m; G,16h,1h,1.5; F,4d,6h
  
  
  # преобразование адресов. У меня такого нету.
  begin rewrite
  
  
  # Секция авторизации при отправке писем. Ввиду того,
  # что почтовых клиентов много, и все всё делают
  # по-своему, то и механизмов авторизации три...
  begin authenticators
  
  # следующие два пункта написаны мною, и ручаться могу тока за один - который
  # оутлук авторизует. 
  plain:
    driver = plaintext
    public_name = PLAIN
    server_condition = ${if saslauthd{{$1}{$2}}{1}{0}}
    server_set_id = $2
  
  login:
    driver = plaintext
    public_name = LOGIN
    server_prompts = "Username:: : Password::"
    server_condition = ${if saslauthd{{$1}{$2}}{1}{0}}
    server_set_id = $1
  
  # есть ещё така хрень - но она тока для нешифрованных паролей.
  # А системные - зашифрованы. Летучая мышь - пролетает...
  #cram_md5:
  #  driver = cram_md5
  #  public_name = CRAM-MD5
  #  server_secret = "тут кондишен :)"
  #  server_set_id = $1
  

Ну а затем запускаем exim, и убиваем sendmail:

/usr/home/lissyara/>echo 'exim_enable="YES"' >> /etc/rc.conf
  /usr/home/lissyara/>killall -9 sendmail
  /usr/home/lissyara/>killall -9 sendmail
  No matching processes were found
  /usr/home/lissyara/>echo 'saslauthd_enable="YES"' >> /etc/rc.conf
  /usr/home/lissyara/>/usr/local/etc/rc.d/saslauthd.sh start
  Starting saslauthd.
  /usr/home/lissyara/>/usr/local/etc/rc.d/exim.sh start
  /usr/local/etc/rc.d/exim.sh: WARNING: sendmail_submit_enable should be set to NO
  Starting exim.
  /usr/home/lissyara/>echo 'sendmail_enable="NONE"' >>  /etc/rc.conf
  /usr/home/lissyara/>/usr/local/etc/rc.d/exim.sh restart
  Stopping exim.
  Starting exim.
  /usr/home/lissyara/>ps -axj | grep exim
  root     65416     1 65416 65416    0 Ss    ??    0:00,03 /usr/local/sbin/exim
  root     65419   573 65418   569    2 R+    p0    0:00,02 grep exim
  /usr/home/lissyara/>
  /usr/home/lissyara/>sockstat | grep sasl
  root     saslauthd  62189 3  dgram  -> /var/run/logpriv
  root     saslauthd  62189 5  stream /var/run/saslauthd/mux
  root     saslauthd  62188 3  dgram  -> /var/run/logpriv
  root     saslauthd  62188 5  stream /var/run/saslauthd/mux
  root     saslauthd  62187 3  dgram  -> /var/run/logpriv
  root     saslauthd  62187 5  stream /var/run/saslauthd/mux
  root     saslauthd  62186 3  dgram  -> /var/run/logpriv
  root     saslauthd  62186 5  stream /var/run/saslauthd/mux
  root     saslauthd  62185 3  dgram  -> /var/run/logpriv
  root     saslauthd  62185 5  stream /var/run/saslauthd/mux
  root     saslauthd  20758 3  dgram  -> /var/run/logpriv
  root     saslauthd  20758 5  stream /var/run/saslauthd/mux
  root     saslauthd  20757 3  dgram  -> /var/run/logpriv
  root     saslauthd  20757 5  stream /var/run/saslauthd/mux
  root     saslauthd  20756 3  dgram  -> /var/run/logpriv
  root     saslauthd  20756 5  stream /var/run/saslauthd/mux
  root     saslauthd  20755 3  dgram  -> /var/run/logpriv
  root     saslauthd  20755 5  stream /var/run/saslauthd/mux
  root     saslauthd  20754 3  dgram  -> /var/run/logpriv
  root     saslauthd  20754 5  stream /var/run/saslauthd/mux
  /usr/home/lissyara/>
  

Затем запускаем ClamAV и его обновлялку:

/usr/home/lissyara/>echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
  /usr/home/lissyara/>echo 'clamav_freshclam_enable="YES"' >> /etc/rc.conf
  /usr/home/lissyara/>/usr/local/etc/rc.d/clamav-clamd.sh start
  Starting clamav_clamd.
  LibClamAV Warning: **************************************************
  LibClamAV Warning: ***  The virus database is older than 7 days.  ***
  LibClamAV Warning: ***        Please update it IMMEDIATELY!       ***
  LibClamAV Warning: **************************************************
  /usr/home/lissyara/>/usr/local/etc/rc.d/clamav-freshclam.sh  start
  Starting clamav_freshclam.
  /usr/home/lissyara/>
  

Собственно вот и всё. Конфиг самого экзима практически аналогичен тому, что используется в статье про exim и системных пользователей. При желании, в дальнейшем, можно извернуться и использовать и системных и виртуальных пользователей - не так сильно всё усложниться.

Автор: http://www.lissyara.ru

Настройка VPN через SSH с использованием Putty

Обновлено: 30.06.2025
Теги: VPN

Дата последнего редактирования: 22.11.2011.

Сегодня пришлось вспоминать минут 20 как сделать сабж, попарился и решил написать на сайт, для себя как памятку и для других - вдруг кому пригодиться.

Итак, имеем:

  1. компьютер на базе Windows (удаленная рабочая станция, условно КЛИЕНТ);
  2. почтовый сервер (не важно, какой именно, будь то Kerio MailServer, MDaemon или другой, условно СЕРВЕР_ПОЧТЫ в локальной сети - ну предположим, что вам надо с ним работать, а просто так локальный почтовый сервер в мир не подключен);
  3. шлюз (прокси-сервер) в интернет с запущенным сервером SSH (например, FreeBSD или Linux, которые во многих организациях стоят как брандмауэры, условно БРАНДМАУЭР).

Задача: осуществить безопасное (шифрованное) соединение от КЛИЕНТА к СЕРВЕРУ_ПОЧТЫ по протоколу POP3 (получение почты, обычно порт 110). Ну и пусть нам это надо не постоянно, а иногда (иначе надо все-таки настраивать нормальный VPN-сервер).

Безопасный VPN-туннель с использованием SSH и Putty

Решение

Т.к. по умолчанию трафик по протоколу POP3 передается открытым текстом, а мы передаем очень секретный пароль от почтового ящика, то почтовый трафик надо шифровать :) Чем мы будем его шифровать? Поднимать специальный VPN-сервер, редирект портов, настраивать сертификаты и прочее - часто не выход, т.к. это сложно даже для большинства системных администраторов, к тому же, как сказано чуть выше, нам все это надо для периодических сеансов работы, возможно, только для нас и нужных ;)

Мы будем делать соединение между КЛИЕНТОМ и СЕРВЕРОМ_ПОЧТЫ внутри шифрованного содинения по протоколу ssh.

Возьмем бесплатный клиент ssh для Windows - Putty - и установим его на КЛИЕНТА (т.е. на наш домашний компьютер).

Командная строка Putty

Далее установим зашифрованное соединение между КЛИЕНТОМ и БРАНДМАУЭРОМ так, чтобы для КЛИЕНТА работа с почтой внутри локальной сети была бы точно такой, как если бы он (клиент) был бы у себя в офисе.

У КЛИЕНТА запускаем консоль: Пуск -> выполнить -> cmd

В консоли набираем команды:

cd путь_к_папке_с_putty
putty.exe -v -ssh -2 -P 22 -C -l user -pw password -L 8110:192.168.1.10:110 81.222.111.10

где "-v" - т.н. verbose режим, с расширенными комментариями, "-ssh -2" - использовать протокол ssh версии 2, "-P 22" - порт, открытый на БРАНДМАУЭРЕ для подключения по ssh, "-C" - использовать сжатие, "-l user" - имя пользователя, который имеет право входить на сервер ssh на БРАНДМАУЭРЕ, "-pw password" - пароль этого пользователя,

далее (я специально сделал отступ от предыдущего текста):
"-L 8110:192.168.1.10:110" - локальный порт, который будет доступен на компьютере КЛИЕНТА, а 192.168.1.10 - локальный ip-адрес почтового сервера внутри организации, 110 - соответственно, порт POP3 на этом сервере;
"81.222.111.10" - внешний ip-адрес БРАНДМАУЭРА, к которому и будет соединяться КЛИЕНТ по ssh с помощью putty.

После набора последней команды:

putty.exe -v -ssh -2 -P 22 -C -l user -pw password -L 8110:192.168.1.10:110 81.222.111.10

откроется окно сеанса связи по протоколу ssh. Все, окно сворачиваем (не закрываем!), и настраиваем нашу почтовую программу на получение почты с адреса localhost и портом 8110, а не 110, который стоит по умолчанию.

Вроде бы все. Во время получения почты почтовая программа будет соединяться с портом 8110, который будет переадресован на удаленный почтовый сервер в офисе, при этом весь трафик соединения будет зашифрован. Завершить сеанс связи можно просто закрыв окно сеанса putty. После этого локальный порт 8110 уже не будет доступен.

... или же все это можно сделать немного проще:

GUI Putty

Для тех, кто пользуется графическим интерфейсом Putty, привожу скриншоты:

  • Source port: 8110 - порт к которому мы будем подключаться на нашей машине.
  • Destination ( [IP:]Port): 192.168.1.10:110 - удаленный почтовый сервер.
  • Нажимаем "Add" ("Добавить"). Думаю, многие могут не сделать этого и будут разочарованы, т.к. ничего не сработает.

Суть последнего скриншота: локальный порт 8110 прозрачно соединяет вас с 80 портом сервера 192.168.1.10.

Ну и, понятное дело, чтобы это не вписывать каждый раз, ПЕРЕД ТЕМ, КАК НАЖАТЬ "Open", вернитесь на вкладку Session (первый скриншот) и сохраните настройки. Только потом жмите "Open".

Резюме

Можно добавить, что похожим образом можно соединяться не только к почтовому серверу, но и к другим сервисам, например, я таким образом соединялся с RAdmin, установленным на компьютере в локальной сети, при этом никаких port-мапперов на самом шлюзе делать не надо. Вот что самое хорошее! Достаточно иметь актуальную версию сервера ssh на шлюзе и, желательно, фильтровать на брандмауэре подключения к порту 22 (ssh), например по ip-адресу, если у вас дома или где там еще подключение к интернет постоянное. Но это уже мелочи жизни и тема другой статьи.

Вообще у ssh и putty, есть ооочень много всяких разных приятностей, которые здесь не упомянуты. Надеюсь, эта статья подтолкнет вас к небольшому исседованию, начать которое очень просто: http://www.google.ru/search?complete=1&hl=ru&newwindow=1&q=ssh&lr=&aq=f.

Кроме того, упомянутые в статье программы (за исключением почтовых серверов и ОС самого клиента ;)) являются бесплатными и свободно распространяемыми, а стремление быть легальным и бесплатным - хороший стимул приглядеться к реализации подобного безопасного соединения через ssh.

И еще, конечно же, при написании этой заметки я использовал другие ресурсы для "освежения" памяти. Вот самая полезная ссылка, которая и стала финальной в моих тестовых экспериментах перед опубликованием статьи: http://wiki.kaytaz.ru/doku.php/ssh-tunnel_cherez_putty.

Примечания (составлены по итогам комментариев на 27.03.2008)

1. (isx) Если туннель простаивает некоторое время, то соединение рвется, потому стоит поменять параметры сервера: TCPKeepAlive. Увеличить LoginGraceTime, выставить ClientAliveInterval и ClientAliveCountMax. Убрать UseDns, иначе длительные ожидания при установке соединений.

2. (isx) А отчего не сделаешь все через ssl? Если не хочется возиться с почтовиком, то можно воспользоваться программой stunnel, поднимая ее на шлюзе(брандмауэре). // Stunnel (http://stunnel.mirt.net/) использует OpenSSl или SSLeavy для шифрования трафика. Используется для установления шифрованных тонелей связи между клиентом и сервером. Работает в Linux, Windows, OS/2 и прочих осях.

3. (Serg) Если человек не админ брендмауэра - могут быть проблемы. Кто-то может гарантировать, что в настройках sshd не выключен форвардинг и/или туннелирование? // Действительно, к данному решению надо подходить взвешенно и понимать, что указанный способ туннелирования действительно больше всего подходить только для админа.


Почему плохо работает WiFi

Обновлено: 26.08.2021
Теги: WiFi

Проблем с WiFi может быть настолько много, что перечислить все просто нереально, но все же, есть достаточно очевидные проблемы, которые можно решить или хотя бы улучшить ситуацию с плохим качеством WiFi.


Шифрование GPG (GnuPG, ex PGP)

Обновлено: 28.08.2021

Защита конфиденциальной информации периодически востребована всеми, кто пользуется электронной почтой и хранит документы на своем компьютере, т.е. практически каждый современный человек хоть раз, но сталкивался с проблемой защиты передавемых или хранимых данных. GnuPG - это полная и бесплатная реализация стандарта OpenPGP, определенного в RFC4880 (также известном как PGP). GnuPG позволяет вам шифровать и подписывать ваши данные и сообщения; он оснащен универсальной системой управления ключами, а также модулями доступа для всех видов каталогов открытых ключей. GnuPG, также известный как GPG, представляет собой инструмент командной строки с функциями для легкой интеграции с другими приложениями. Доступно множество интерфейсных приложений и библиотек. GnuPG также поддерживает S/MIME и Secure Shell (ssh).


Шифрование PGP

Обновлено: 28.08.2021

PGP (Pretty Good Privacy) - криптографическое приложение для обеспечения защиты и аутентификации данных. Используя его можно быть уверенным, что никто не сможет прочитать или изменить Вашу информацию. Подробнее о программе и истории ее создания можно прочитать на сервере www.pgpi.org. Защита гарантирует, что только получатель информации сможет воспользоваться ей. Оказавшись в чужих руках, она будет совершенно бесполезной, поскольку ее невозможно декодировать.


Идентификация и ограничение доступа в Apache

Обновлено: 30.06.2025

Директива Satisfy определяет способ взаимодействия директив идентификации (используемые для защиты паролем) с директивами доступа (например, Allow/Deny). С ее помощью вы, например, можете заставить Apache выполнять те запросы, которые удовлетворяют только требованиям идентификации, либо только требованиям доступа. Или вы можете сделать, чтобы запрос удовлетворял всем требованиям. Директива Satisfy принимает два значения:

  1. Satisfy Any Пропускает запрос, если выполнено любое из требований (идентификация или проверка доступа)
  2. Satisfy All Пропускает запрос, только если оба требования выполнены (и идентификация и проверка доступа).

Для примера возьмем следующий сценарий:

<Directory /home/www/site1/private>
AuthUserFile /home/www/site1-passwd
AuthType Basic
AuthName MySite
Require valid-user
</Directory>

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

<Directory /home/www/site1/private>
AuthUserFile /home/www/site1-passwd
AuthType Basic
AuthName MySite
Require valid-user
Order allow,deny
Allow from 172.17.10
Satisfy any
</Directory>

Такая конфигурация заставит всех "внешних" пользователей пройти процедуру идентификации, а тех, кто пришел с локальной сети, пропустит. Apache предоставит им полный доступ к каталогу private без идентификации.

Все вышеописанное также работает и с подкаталогами вашего защищенного каталога. Допустим, вам нужен незакрытый подкаталог nonprotect, который находится в каталоге private. Причем к каталогу nonprotect должен иметь доступ любой пользователь без ввода какого-либо пароля. Делается это следующим образом:

<Directory /home/www/site1/private/nonprotect>
Order allow,deny
Allow from all
Satisfy any
</Directory>

И, наконец, если у вас есть очень секретный каталог, тогда вы можете ограничить к нему доступ, как с помощью пароля, так и с помощью проверки IP пользователя.

<Directory /home/www/site1/super-secret>
AuthUserFile /home/www/site1-passwd
AuthType Basic
AuthName MySite
Require valid-user
Order allow,deny
Allow from 172.17.10
Satisfy all
</Directory>

В приведенном выше примере директива "Order allow, deny" по умолчанию блокирует доступ для всех, директива "Allow" разрешает доступ пользователям из локальной сети, а директива "Satisfy all" требует проверки как IP, так и пароля.

Источник: http://apachedev.ru/

Скрыть версию Apache

Обновлено: 30.06.2025

Прочитал недавно статью на сайте www.debuntu.org, в которой автор (chantra) описывает способ улучшения безопасности сервера за счет сокрытия информации о версии серверного ПО. Утверждение автора, что данный способ повышает безопасность Apache довольно спорно, но об этом ниже. А пока давайте посмотрим на эксперименты автора по работе с заголовками сервера. На любой GET или HEAD запрос, отправленный серверу, Apache, помимо запрошенного контента (для GET запроса), возвращает клиенту HTTP-заголовки. Вот типичный список заголовков, полученный от сервера Apache:

Date: Tue, 25 Jul 2006 10:47:13 GMT
Server: Apache/2.0.55 (Ubuntu) PHP/5.1.4-1.dotdeb.2
Last-Modified: Mon, 20 Mar 2006 09:51:25 GMT
ETag: “3057-1f8-1a0f4140?
Accept-Ranges: bytes
Content-Length: 504
Connection: close
Content-Type: text/html; charset=ISO-8859-1

Для получения этого списка автор заметки использовал telnet. C его помощью chantra отправил HEAD запрос на свой локальный сервер. Вот эта сессия telnet:

~$ telnet localhost 80
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
HEAD / HTTP/1.0

Обычно данные заголовки скрыты от пользователей, так как содержат в основном служебную информацию. Однако есть много способов просмотреть этот список. Например, для пользователей браузера Firefox хочу порекомендовать плагин LiveHTTPHeaders. В этом списке нас интересует заголовок Server. Как видно из его значения [Apache/2.0.55 (Ubuntu) PHP/5.1.4-1.dotdeb.2], у автора установлено следующее ПО: ОС - Ubuntu, сервер - Apache 2.0.55 и PHP 5.1.4-1.dotdeb.2. Так вот, способ повышения безопасности, предложенный автором, состоит в том, чтобы скрыть от получателя (HTTP-клиента) эту информацию. Делается это с помощью директивы Apache - ServerTokens. Вот значения, которые принимает директива и соответствующие ей значения заголовка Server:

Значение директивы Значение заголовка Server
ServerTokens Prod Server: Apache
ServerTokens Major Server: Apache/2
ServerTokens Minor Server: Apache/2.0
ServerTokens Minimal Server: Apache/2.0.55
ServerTokens Os Server: Apache/2.0.55 (Ubuntu)
ServerTokens Full Server: Apache/2.0.55 (Ubuntu) PHP/5.1.4-1.dotdeb.2 my_mod1/X.Y my_mod2/W.Z

Все очень просто. Одно лишь замечание по поводу значения Full. Если используется это значение, то сервер выдает не только версии ОС и сервера, но и версии модулей, установленных на сервере - PHP/5.1.4-1.dotdeb.2 my_mod1/X.Y my_mod2/W.Z. Причем модуль сам должен добавить свою версию. Делается это с помощью функции ap_add_version_component(server_pool, "my_mod1/X.Y"). По умолчанию в Apache используется значение Full, а автор статьи рекомендует использовать Prod, тем самым сокращая информацию, отправляемую клиенту, до одного названия сервера.

Также некоторыми возможностями в этой области обладает и PHP. В файле php.ini есть переменная expose_php, которая может принимать значения: On и Off. Которые, соответственно, добавляют или удаляют информацию о версии PHP в заголовок Server (а также в X-Powered-By).

Ну и для полноты картины опишем еще одну подобную директиву, про которую автор не упомянул, а именно ServerSignature. Она также выводит данные о версии ПО, но в отличие от ServerTokens делает это не в заголовок Server, а в некоторые HTML страницы, например: листинг каталогов, страницы ошибок и т.п. Вот ее значения и соответствующие результаты:

Значение директивы Результат
ServerSignature On Apache/2.0.59 (Ubuntu) PHP/4.3.10 Server at 127.0.0.2 Port 80
ServerSignature Off  
ServerSignature Email

Apache/2.0.59 (Ubuntu) PHP/4.3.10 Server at 127.0.0.2 Port 80

Разница On и Email заключается в ссылке mailto на виртуальном хосте.

Теперь поговорим о том, насколько данный способ пригоден для повышения безопасности. Такой способ даже имеет свой термин - Security through obscurity (Безопасность через сокрытие). В практической жизни он применяется довольно часто, потому что только в теории системы безопасности могут обеспечить надежную защиту. А когда дело доходит до практики, то вся надежность улетучивается благодаря пресловутому "человеческому фактору", а точнее - ошибкам в ПО. Поэтому сокрытие всей информации о системе (помимо необходимой пользователю) повышает ее безопасность. Но, как было справедливо замечено в комментариях к статье, сегодня почти все атаки на веб-сервера производятся ботами, которые не утруждают себя проверкой версий серверного ПО - они берут количеством, а не качеством. Поэтому автор комментария рекомендует сперва использовать более надежные способы защиты, например - mod_security, а потом уж беспокоиться о заголовке Server.

Ну и напоследок, приведу цитату, касающуюся заголовка Server, из спецификации HTTP/1.1 - RFC 2616:
Note: Revealing the specific software version of the server might allow the server machine to become more vulnerable to attacks against software that is known to contain security holes. Server implementors are encouraged to make this field a configurable option.

Как вы видите, и тут есть неявная рекомендация скрывать "лишнюю" информацию о ПО. Но, как в принципе и всегда, окончательное решение остается за вами.

Автор: Сипягин Максим
Источник: ApacheDev.ru



Принимаю заказы на настройку серверов, mikrotik и других роутеров, точек доступа, nginx и т.п. В пределах Санкт-Петербурга возможен выезд к заказчику. См. контакты.


Последние комментарии