6 отличных способов борьбы с заказчиком

Типа юмор. Грустный.
6 лучших способов затянуть работы или вообще отказаться их делать.
  1. Ссылаться на то, что такого требования нет в тех. задании. «Ну и что что база синхронизируется 25 часов, скорость синхронизации не регламентирована в ТЗ».
  2. Сказать — «да, да, хорошо, мы согласны», но ничего не сделать.
  3. Все обращения засылать в тикет систему, в автоответе указать, что срок реакции 72 часа.
  4. Говорить, что «обновляем базу», но не присылать отчетов о сделанных обновлениях
  5. Говорить о том, что «мы производим внутреннее тестирование», а потом (через неделю) быстро что то править в рабочей базе.
  6. В то время, когда проблема клиента находится в острой стадии консультант всегда должен быть на встрече. Когда встреча заканчивается, уже все, проблема рассосалась.
Рубрика: ЧАВО | Добавить комментарий

PEAP аутентификация Wi-Fi пользователей через Active Directory (AD) или Wi-Fi Enterprise без геморроя

Настройка сервера и точки доступа

Я ставил радиус на контреллер домена

1. Ставим на Windows cлужбы "IAS" и "Службы сертификации"

2. Авторизировать службу IAS в домене.

3. Создаем центр сертификации через оснастку "Центр сертификации"

4. Разрешаем автоматический запрос сертификата в Default Domain Policy

Шаблон сертификата "Компьютер". Это нужно, чтобы клиенты могли проверять валидность RADIUS сервера. После изменения политики необходимо запустить gpupdate, чтобы компьютер запросил сертификат у центра сертификации. После обновления политики в оснастке "Центр сертификации" должен появиться такой феншуй:

5. Создаем политику уделнного доступа

Далее выбрать "Беспроводной доступ" и "Разрешения группы". С "Разрешениями Группы" мне так больше нравится, чтобы только члены определенных групп могли пользоваться привилегией беспроводного доступа.

5. Добавить точку доступа как RADIUS клиент сервера

6. Настроить точку доступа как WPA2-Enterprise, в настройках RADIUS точки доступа указать адрес IAS сервера и (опционально, но желательно) разделяемый секрет RADIUS клиента и сервера.

Настройка клиента

С клиентами на Андроиде и с компьютерави входящими в домен проблем вообще никаких, есть небольшие сложности с Windows не в домене. Так как комп не имеет корневого СА в домене, нужно выключить галку "Проверять сертификат сервера" и включить режим "проверки подлинности пользователя".

Рубрика: ЧАВО | Добавить комментарий

Наcтройка звука в терминальной сессии

Дано: просто сервер без звуковой карты или виртуальный сервер на Windows 2003, например под VMWare.
Хочется: слушать звук на подключенном по RDP клиенте.

Кажется, что слушать звук с удаленного клиента, это блажь, однако с появлением Windows 7 использование виртуальных машин с более древними версиями Windows, это панацея. Панацея от ActiveX контролов, которые отказываются работать под семерку. Пример от уважаемой фирмы. Avaya Workflow Optimization (WFO), система записи телефонных разговоров. Клиент не работает хоть тресни.

Рубрика: ЧАВО | Добавить комментарий

Совместная работа graylist и popauth

У меня на нескольких почтовиках используется pop-before-smtp для того, чтобы пользователи могли отправлять почту из любого конца мира. Однако, одолел спам и захотелость нанести очередной удар. В очереди был milter-greylist. Собрал из портов, вставил что надо в .mc файл sendmail. Порадовался. И тут до меня дошло, что пользователи, который работают через pop-before-smtp получат при отправке облом в вида "Временно не доступно, зайдите со своего IP попозже".

Эх и вспомнил я Эрика Олмена добрым словом в 3 ночи! Вот оно:

Kpopauth hash -a /etc/mail/popauth

SLocal_check_rcptR$*         $: $(popauth $&{client_addr} $:  $)R$*         $: $(storage {greylist} $@ OK $)R$*         $: $(popauth $&{client_addr} $:  $)R<?>        $@ NoPopAuthR$*         $# OK 

Важно не забыть:

define(`confMILTER_MACROS_HELO', confMILTER_MACROS_HELO``, {verify}'')
define(`confMILTER_MACROS_ENVRCPT', confMILTER_MACROS_ENVRCPT``, {greylist}'')

Не отношу себя к знатоками синтаксиса sendmail.cf, однако суть такова — если клиент находится в базе popauth.db, макросу по имени {greylist} назначается значение OK. Таким образом мы извращенным способом используем фичу milter-graylist access DB as a whitelisting source.

Рубрика: ЧАВО | Добавить комментарий

FreeBSD crypt disk via GBDE

Во FreeBSD есть замечательная подсистема GEOM, в рамках которой реализована фича, которая называется GEOM based disk encryption или GBDE. GBDE позволяет создавать шифрованные разделы, а утилита mdconfig позволяет создавать разделы, которые физичeски распологаются в файле.

Итак:

cd ~
dd if=/dev/zero of=.crypt bs=512 count=скока вешать в граммах?
mdconfig -a -t vnode -u 1 -f .crypt
gbde init /dev/md1
gbde attach /dev/md1
newfs /dev/md1.bde
mount /dev/md1.bde /mnt

Готово! Теперь у нас есть шифрованный диск. Но! Нет удобного способа его монтирования/размонтирование/резервного копирования, поэтому … Скрипт в студию!

Отмаз: Это болванка скрипта, обработка ошибочных ситуаций практически не реализована. Так что — AS IS. И еще. Я использую KDE и поэтому взаимодействие с пользователем (тоесть со мной) скрипт осуществляет через программу kdialog. У вас ее может не быть и поэтому, можно использовать утилиты вроде dialog, ssh-askpass и другие сходные по назначению. Также, нужно помнить, что все выше и ниже написанное будет работать только в FreeBSD 5-й версии и выше.

#!/bin/sh

start_disk ()
{
        if [ -z "`mount | grep bde`" ]; then
                if [ ! -c /dev/md$UNIT ]; then
                        mdconfig -a -t vnode -u $UNIT -f /usr/home/asmi/.crypt
                fi
                if [ -c /dev/md$UNIT ]; then
                        gbde attach /dev/md$UNIT -p "`kdialog --password "Crypted disk"`"
                fi
                if [ -z "`mount | grep bde`" -a -c /dev/md$UNIT.bde ]; then
                        fsck -F -t ufs -p /dev/md0.bde
                        mount /dev/md$UNIT.bde /home/asmi/Crypt
                fi
        fi
}

stop_disk ()
{
        if [ ! -z "`mount | grep bde`" ]; then
                umount /dev/md$UNIT.bde
                if [ $? -eq 1 ]; then
                        kdialog --error "Can not umount crypt drive"
                        exit
                fi
        fi
        if [ -c /dev/md$UNIT.bde ]; then
                gbde detach /dev/md$UNIT
        fi
        if [ -c /dev/md$UNIT ]; then
                mdconfig -d -u $UNIT
        fi
}

UNIT=0
FLASH="/dev/ad4s1"
#Здесь у меня находится PCMCIA ATA FLASH

case $1 in
start)
        start_disk
        ;;
stop)
        stop_disk
        ;;
copy)
        if [ ! -c $FLASH ]; then
                kdialog --error "No flash device $FLASH"
                exit
        fi
        stop_disk
        MNT=`mount | grep $FLASH`
        if [ -z "$MNT" ]; then
                MDIR=`dd if=/dev/random count=1 2>/dev/null | md5`
                mkdir /tmp/$MDIR
                mount -t msdos $FLASH /tmp/$MDIR
                cp /home/asmi/.crypt /tmp/$MDIR
                umount $FLASH
                if [ -z `mount | grep /tmp/$MDIR` ]; then
                        rm -rf /tmp/$MDIR
                else
                        kdialog --error "Can not umount /tmp/$MDIR"
                fi
        else
                DIR=`echo "$MNT" | awk '{print $3}'`
                echo "DIR: $MNT [$DIR]"
                cp /home/asmi/.crypt $DIR
        fi

        ;;
*)
        echo "usage: $0 start|stop|copy"
esac

Все просто и изяшно! Пользуйтесь на здоровье!

Рубрика: ЧАВО | Добавить комментарий

Интергрируем GPG и VIM под win32

Ух, давно не давал я воли параное. Опять хочется поговорить про шифрование. Теперь про то, как редактировать зашифрованный файл с помошью vim, да так, чтобы на диске он в открытом виде не появлялся. Встречаем! gpg.vim. Плагин, который нужно класть в папку vim/plugins. Gpg должень быть доступен через %path%,

augroup gpg_encrypted
autocmd!
" don't use swap file or ~/.viminfo while editing
autocmd BufReadPre,FileReadPre     *.gpg set viminfo=
autocmd BufReadPre,FileReadPre     *.gpg set noswapfile
" filter the encrypted file through openssl after reading
autocmd BufReadPre,FileReadPre     *.gpg set bin
autocmd BufReadPre,FileReadPre     *.gpg set cmdheight=2
autocmd BufReadPost,FileReadPost   *.gpg 0,$!gpg -q 2> NUL:
" switch back to nobin mode for editing
autocmd BufReadPost,FileReadPost   *.gpg set nobin
autocmd BufReadPost,FileReadPost   *.gpg set cmdheight&
autocmd BufReadPost,FileReadPost   *.gpg set shell&
autocmd BufReadPost,FileReadPost   *.gpg execute ":doautocmd BufReadPost ".expand("%:r")
" filter plain text through gpg before writing
autocmd BufWritePre,FileWritePre   *.gpg set bin
autocmd BufWritePre,FileWritePre   *.gpg set cmdheight=2
autocmd BufWritePre,FileWritePre   *.gpg 0,$!gpg -e -q -r your_email_here
" undo the encrypt step so we can continue editing after writing
autocmd BufWritePost,FileWritePost *.gpg silent u
autocmd BufWritePost,FileWritePost *.gpg set nobin
autocmd BufWritePost,FileWritePost *.gpg set cmdheight&
autocmd BufWritePost,FileWritePost *.gpg set shell&
augroup END

Теперь, при открытии файлов *.gpg gpg будет спрашивать пароль ключа и только потом, показывать содержимое файла.

В _vimrc у меня включено set foldmethod=marker, значит все что внутри литералов {{{ … }}} будет фолдиться, тоесть скрываться с глаз долой.

Болванку плагина где то потырил! Где не помню.

Рубрика: ЧАВО | Добавить комментарий

Sendmail и разные хитрые фишки

Фишка номер 1

Как сделать так, чтобы почта шла на провайдерский SMTP а потом передаваласть на SMTP клиента, так, чтобы клиентский SMTP можно было держать ограниченным через TCP Wrappers на получение почты только от провайдера.

Конфигурация на стороне клиента сложностей не вызывает. Совершенно стандартная. Единственно, что в hosts.allow нужно написать:

sendmail : smtp.provider.ru : allow
sendmail : ALL : deny

Самое интересное нас ждет на нашем сервере. Сервере провайдера. Включаем фичи mailertable и accesstable и соответственно вставляем следующие строки в файлы

blabla.spb.ru          esmtp:[smtp.blabla.spb.ru]

Почта пришедшая на домен пересылается на нужный адрес. Квадрвтные скобки используются для того, чтобы sendmail не искал MX.

To:blabla.spb.ru       RELAY

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

Рубрика: ЧАВО | Добавить комментарий

SNMP traps и с чем их едят

В этой статье я хочу осветить вопрос работы с SNMP traps. В то время, когда я начинал разбираться с этой темой, при неплохом знании принципов работы протокола SNMP, я был удивительным образом перепутан результатами чтения документации по этому вопросу, всеми этими OID, которые нужно писать как параметры для команды snmptrap. Поиски внятной информации в интернет не дали результатов. Создавалось впечатление, что я один такой непонятливый среди тех, кто считает это элементарным.

В своей работе я использую пакет NetSNMP с открытым исходным кодом и поэтому, примеры относятся именно к этому пакету.

Я не буду останавливаться на описании дерева SNMP (считаю это действительно банальным), а начнем с пресловутого OID. OID это просто. OID, это Object ID, уникальный идентификатор объекта в дереве значений SNMP. OID может записываться в нескольких видах.

  1. Числовой. Например, 1.3.6.1.4.1.2021. Самый простой вид, по причине полного отсутствия каких либо трансформаций программным обеспечением. Именно в таком виде SNMP „думает“.
  2. Текстовый, с использованием MIB файлов. Понятно, что дикие цифры OID запомнить категорически невозможно, поэтому с помощью MIB можно вводить текстовые мнемонические имена для более простого вспоминания и использования идентификаторов. Кроме того, текстовая запись позволяет избежать написания OID от корня дерева SNMP. Уникальные мнемонические имена уже содержат путь до необходимого узла дерева. Отсюда возможны записи вида enterprises.ucdavis.

Так как уникальность мнемонического имени в пределах всех возможных MIB никто не гарантирует и не всегда сразу вспомнишь к чему относится имя (например prTable), существует следующая, на мой взгляд самая приятная форма записи: UCD-SNMP-MIB::prTable. В таком формате, кроме самого имени указывается имя MIB (можно сказать, это пространство имен)

Единственным ограничением использования MIB является то, что при использовании программного обеспечения SNMP от разных производителей и различного железа необходимо единое „понимание“ этих волшебных трансформаций. Поэтому на сайтах производителей управляемого оборудования есть файлы описания MIB для конкретных устройств.

С представлением OID разобрались. Теперь про трапы. Сразу оговорюсь, что все нижесказанное относится к версии 2с SNMP.

В протоколе SNMP есть трапы (traps) и есть информы (informs). Отличаются они тем, что трапы посылаются на станцию менеджера без гарантии их доставки, а информы гарантированно доставляются. Ну, или не доставляться, но тогда отправитель об этом узнает. Для простоты, я и то и другое называю трапом. Так нам будет прощеi.

Какая информация посылается менеджеру в трапе (информе)? А посылаются следующие данные:

  • Uptime устройства в виде пары: стандартный OID uptime, значение
  • OID, который говорит о том, что за событие приключилось. В MIB файлах есть специальные описания некоторого количества стандартных событий, вроде запуска или остановки агента. Также, мы можем определить собственные trap OIDs и даже описать их в собственном MIB файле.
  • Любые пары OID и его значение (там еще есть и третье поле „тип значения“, но это нам побоку), которые могут дать дополнительную информацию. Например, когда свитч посылает трап „Падение линка“, дополнительное поле будет содержать информацию OID интерфейса, с которым приключилась неприятность — IF-MIB:ifIndex.2.

Теперь, наше повествование разделяется на направления. Первое направление: „Как нам послать SNMP trap ручками из командной строки„. Второе направлении „Как нам заставить агента SNMP посылать трапы когда что то идет не по плану“.

Посылаем руками

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

snmpinform -c public -v 2c host.sample.com "" ucdavis.ucdTraps.ucdStart memTotalSwap i 1024000

Что здесь что ?

  • "" — брать uptime по дефолту
  • ucdavis.ucdTraps.ucdStart — послать этот трап
  • memTotalSwap i 1024000 — добавить в нагрузку OID memTotalSwap равное целому 1024000

И если на целевом хосте запущен демон snmptrapd, то в логе появится сообщение о приходе трапа.

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

snmptrap -c public -v 2c 127.0.0.1 "" 1.3.3.3.3.3.3.3 1.2.2.2.2.2.2 s "Aliens opened the door"

И что характерно, это будет работать. В логе появится такая бредятинка:

Nov 22 14:08:24 snmptrapd[465]: localhost [127.0.0.1]: Trap , DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (736247) 2:02:42.47, SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::org.3.3.3.3.3.3, iso.2.2.2.2.2.2 = STRING: " Aliens opened the door"

В то же время, крутые администраторы должны все делать правильно, самодокументируемо, в соответствии с требованиями IETF и других компетентных организаций. Поэтому, будем описывать наши новые OID в своем собственном MIB файле.

ALLIENSATTACK-MIB DEFINITIONS ::= BEGIN
IMPORTS
    OBJECT-TYPE, NOTIFICATION-TYPE, MODULE-IDENTITY,
    Integer32, Opaque, enterprises, Counter32
        FROM SNMPv2-SMI

alliensattack MODULE-IDENTITY
    LAST-UPDATED "200209050000Z"
    ORGANIZATION "XCom"
    CONTACT-INFO
        "Planet Earth
        "
    DESCRIPTION
        "MIB for preventing aliens to stole our SCSI disks"
    ::= { enterprises 10050 }

attackTraps OBJECT IDENTIFIER ::= { alliensattack 1 }

attackStartTrap NOTIFICATION-TYPE
    STATUS      current
    DESCRIPTION
        "Notify about start of attack"
    ::= { attackTraps 1 }

attackStopTrap  NOTIFICATION-TYPE
    STATUS current
    DESCRIPTION
        "Notify about time to leave our hideouts"
    ::= { attackTraps 2 }

attackSource OBJECT IDENTIFIER ::= { aliensattack 2 }

attackFromDoors  OBJECT-TYPE
    SYNTAX      DisplayString
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Sent to manager when attack starts from doors"
   ::= { attackSource 1 }

attackFromWindows  OBJECT-TYPE
    SYNTAX      DisplayString
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "May be alliens are innocent? And SCSI drives disappeared in the Gates?"
   ::= { attackSource 2 }

END

Здесь определяется enterptise с номером 10050 и ему даеся имя aliensattack. После этого вводятся две ветки: одна для трапов (начало и конец атаки), другая для OID дополнительной информации (атака через двери или это вовсе не инопланетяне).

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

Дальше! Укладываем этот файл с именем ALLIENSATTACK-MIB.txt в какой нибудь каталог поближе и запоминаем, что с этого момента все программы имеющие отношения к SNMP (snmpd, snmptrapd, snmpinform) мы запускаем с поддержкой этого MIB. Тоесть, к командной строке добавляем параметры

-М каталог/с_файлом -m +ALLIENSATTACK-MIB.

Знак „+“ перед именем MIB (не файла с MIB, а именно имя MIB), значит, что MIB будет добавлен к загружаемым по умолчанию.

Посылаем автоматически

Способ #2. Пишем скрипт, который проверяет системные параметры и посылает трап на станцию менеджера. Пишется на shell, perl или на любом известном языке.

Способ #1. Наиболее интересный. В 5-й версии net-snmp появиласть поддержка модуля DISMAN-EVENT-MIB котрый умеет отсылать сообщения при некоторых условиях. Но это уже другая история.

Рубрика: ЧАВО | Добавить комментарий

Подключаемся к Avaya Xterm-om

Ставить Avaya Site Administration на винду — это не по нашему, не по богатырски, поэтому пришлось крутить Xterm на предмет добавления функциональных клавиш, которые Avaya использует в своем терминале. В интернете нашлось два мануала, по одному из которых ничего не работало, а второй был под текстовую консоль.

Ножем и топором были вырублены следующие строки, которые в свою очередь были добавлены в ~/.Xresources:

*VT100.Translations: #override
 ~Shift F1:        string("^[[3~") n
 ~Shift F2:        string("^[[34~") n
 ~Shift F3:        string("^[[29~") n
 ~Shift F4:        string("^[[33~") n
 ~Shift F5:        string("^[[28~") n
 ~Shift F6:        string("^[[0r~") n
 ~Shift F7:        string("^[[6~") n
 ~Shift F8:        string("^[[5~") n
 ~Shift F9:        string("^[[31~")

В этом тексте символ ^[ должен быть реальным символом Escape (В vi стираем ^[ и в insert режиме нажимаем <Ctrl-V> и <Esc>).

Потом xrdb -merge ~/.Xresources и xterm -tn vt100, а там уже идем на Avaya telnet 192.11.13.6 5023. Важно! После подключения нужно выбрать из предложенных тип терминала VT220.

Эксперементальным путем выявлено, что:

  • Shift-F1 — Cancel
  • Shift-F3 — Save
  • Shift-F5 — Help
Рубрика: ЧАВО | Добавить комментарий