23 дек. 2014 г.

Windows 8/8.1 PS/2 keyboard/mouse issue

Майкрософт не перестает удивлять. Внезапно выяснилось, что в Windows 8/8.1 есть такая фича (которую я назвал бы багом =) ): в ряде случаев после подключения usb-клавиатуры или usb-мыши отключается (и не включается заново) поддержка ps/2. Включить можно только правкой реестра с последующим ребутом (если есть более человечный способ, хотелось бы узнать):
в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt следует выставить в 1 параметр Start.
После перезагрузки PS/2-комплект должен начать работать.

13 нояб. 2014 г.

Proxy.pac in IE10/11 via GPO

Задача: автоматизировать добавление адреса файла автоконфигурации прокси-сервера (proxy.pac) в настройки Internet Explorer 10/11 на рабочих станциях в домене.
Проблема: Microsoft что-то там сломала для свежих IE (на 9-ой версии, говорят, еще работало) в групповых политиках, поэтому привычным образом - через конфигурирование параметров обозревателя - передать нужные данные не получилось.
Решение: добавить/обновить нужный ключик реестра: 
HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL

 

 Так как настройки браузера относятся к пользовательским, то и создавать параметр нужно в категории Конфигурация пользователя.

28 окт. 2014 г.

Передача статических маршрутов в pptp-туннеле

Думал я, что сабж при использовании pptp vpn невозможен. Оказалось, ошибался. Да, сам ppp-протокол не умеет передавать при соединении маршруты. Однако, при установлении соединения клиентом в туннель посылаются запросы DHCPINFORM, с помощью которых ему можно вернуть практически любой dhcp-option, включая информацию о маршрутах!
Для этого, во-первых, нам потребуется dhcp-сервер. В моем случае имеется уже работающая инфраструктура доступа к ресурсам локальной сети через pptp, поэтому pptpd и dnsmasq уже подняты и выполняют свои функции. В конфигурационный файл dnsmasq.conf добавился следующий блок:
##pptp-vpn
listen-address=192.168.30.1
dhcp-range=pptp,192.168.30.100,192.168.30.120,255.255.255.0,1h
dhcp-option=tag:pptp,vendor:MSFT,2,1i
dhcp-option=tag:pptp,6,192.168.30.1
dhcp-option=tag:pptp,249,192.168.11.0/24,192.168.30.1,192.168.13.0/24,192.168.30.1
где:
listen-address - локальный адрес серверного конца vpn-туннеля (localip в /etc/pptpd.conf)
dhcp-range=pptp,... - объявление нового диапазона с отдельным тегом, дабы не затрагивать настройки других dhcp-зон.
dhcp-option=tag:pptp,vendor:MSFT,2,1i - спецопция для MS dhcp-клиента, говорящая ему делать dhcp-lease при выключении
dhcp-option=tag:pptp,6,192.168.30.1 - указание DNS-сервера
dhcp-option=tag:pptp,249,... - спецопция для MS dhcp-клиента, передающая статические маршруты (если среди клиентов есть Linux\MacOS, следует добавить dhcp-option=121 с аналогичным содержанием)
Далее проверяем корректность внесенных изменений с помощью dnsmasq --test и если все хорошо, перезапускаем демона для применения настроек. DHCP готов к работе.
Чтобы до него долетели DHCPINFORM пакеты от клиентов, в /etc/ppp/pptpd-options добавляется (или раскомментируется) опция proxyarp. Никаких дополнительных настроек не требуется. После перезапуска pptpd можно проверять работоспособность.
В результате при поднятии vpn-туннеля в таблице маршрутизации клиента должны появиться дополнительные маршруты, а ifconfig покажет для соответствующего интерфейса отдельный dns-сервер. Примерно так:
IPv4 таблица маршрута
=========================================================
Активные маршруты:
Сетевой адрес           Маска сети      Адрес шлюза       Интерфейс  Метрика
   <.....skip......>
  192.168.30.0     255.255.255.0     192.168.30.1  192.168.30.111     21
  192.168.30.111 255.255.255.255  On-link           192.168.30.111    276
  192.168.11.0     255.255.255.0      On-link           192.168.30.111     21
  192.168.11.255 255.255.255.255  On-link           192.168.30.111    276
  192.168.13.0     255.255.255.0      On-link           192.168.30.111     21
  192.168.13.255 255.255.255.255  On-link           192.168.30.111    276
<.....skip......>
=========================================================
Постоянные маршруты:
  Отсутствует


7 окт. 2014 г.

sendemail ssl error

Продолжая ворошить старые скрипты, уже в другом месте и по другому поводу столкнулся с проблемой следующего плана: для отправки email-сообщений с вложениями из тела скрипта используется функция, вызывающая sendеmail с нужными параметрами:
function file2email        {
     if [ -e $FILE ]; then
          echo "Sending..." >> /var/log/send.log
           /usr/bin/sendemail -f script@example.org -t admin@example.org \
                -m "You received file $FILE from $USER"  \
                 -a $FILE -o tls=yes -s smtp.example.org \
                 -xu script@example.org -xp secretpass \
                 -u "File from $USER" -l /var/log/sendemail.log
     fi
      }
 И при переносе функция сломалась:
invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332
На просторах Сети нашлась таблетка: в строке 1490 вышеуказанного файла заменить строчку

m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i
на строчку
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i 
Благодарность неизвестному мне товарищу =)

23 сент. 2014 г.

samba4 DC password complexity

Отключение политики сложности паролей в Samba 4 DC:
samba-tool domain passwordsettings set --complexity=off --history-length=0 --min-pwd-length=3 --min-pwd-age=15 --max-pwd-age=40

 Через оснастку групповых политик настройка на контроллере домена не срабатывает.

22 сент. 2014 г.

bash + pop3s connection

Когда-то давно потребовалось мне автоматизировать сбор почты из ящика на mail.ru через pop3. Решение получилось примерно таким:
function getmail_mailru {
expect -c '
        log_file -noappend /tmp/mail.log
        spawn /bin/nc pop.mail.ru 110
        set timeout 3
        expect "+OK"  {send "USER username\r" ; send_user "user sent\n"}
        expect "+OK"  {send "PASS password\r" ; send_user "pass sent\n"}
        expect "+OK Welcome!"   {send "RETR 1\r"}
        expect -regexp {^.}   {send "DELE 1\r"}
        expect "+OK message 1 deleted"   {send "QUIT\r"}
        expect "*maildrop empty" {send "QUIT\r" ; send_user "empty mailbox\n"}
        '
}
Однако сегодня команда mail.ru прислала сообщение, что
После 22 сентября на POP3 и SMTP-серверах останется только безопасная
авторизация через протокол SSL
Возможно, они и раньше предупреждали, но до моего сведения сия идея дошла только сегодня, когда уже полдня почта не забиралась.
Решение: заменить строчку
spawn /bin/nc pop.mail.ru 110
на
spawn /usr/bin/openssl s_client -connect pop3.mail.ru:995
Таким образом, соединение с сервером снова будет установлено.
Однако тестирование выявило еще одну проблему: при посылке команды RETR 1 соединение с почтовым сервером подвисало с сообщением RENEGOTIATING.
Выяснилось, что такое поведение вызвано тем, что заглавная R воспринимается утилитой s_client как команда переподключения к серверу.
CONNECTED COMMANDS
       If a connection is established with an SSL server then any data received from the server is displayed and any key presses will be sent to the server. When used interactively (which means neither -quiet nor -ign_eof have been given), the session will be renegotiated if the line begins with an R, and if the line begins with a Q or if end of file is reached, the connection will be closed down.
Решение: не использовать верхний регистр, так как для общения с почтовым сервером он не обязателен.
function getmail_mailru {
expect -c '
        log_file -noappend /tmp/mail.log
        spawn /usr/bin/openssl s_client -connect pop3.mail.ru:995
        set timeout 3
        expect "+OK"   {send "user username\r" ; send_user "user sent\n"}
        expect "+OK"    {send "pass password\r" ; send_user "pass sent\n"}
        expect "+OK Welcome!"  {send "retr 1\r"}
        expect -regexp {^.}  {send "dele 1\r"}
        expect "+OK message 1 deleted"  {send "quit\r"}
        expect "*maildrop empty"   {send "quit\r" ; send_user "empty mailbox\n"}
        '
}

26 авг. 2014 г.

Debian 7 multiarch

Добавление i386-архитектуры к x64-битному Debian (включение multi-arch):
dpkg --add-architecture i386
apt-get update apt-get install
libc6:i386 

Штука полезна для настройки haspd, который "Этерсофт"-ом хоть и пакуется для 64-битных систем, но по сути остается все равно 32-битным.

6 июл. 2014 г.

GRUB2 на MDRAID+LVM разделе

И снова пара слов о GPT и Linux. Как оказалось, по-прежнему не все так просто с этой парочкой, особенно в случае не самой стандартной установки ОС (с другой стороны, далеко и не самой нестандартной =) ). Думаю, большинство свежих инсталляторов (за все не поручусь, но дебиановский точно) уже научилось правильно размечать жесткие диски размером более 2 Tb как с точки зрения Advanced Format (aka 4k-cluster), так и со стороны создания GPT-таблицы разделов вместо MBR. 
В моем случае установщик Debian Wheezy не смог справиться с установкой GRUB2 на диск, размеченный под LVM поверх MD RAID. Мне не нравится создавать несколько md-устройств при установке под разные цели (/boot, /, etc), поэтому более красивым и гибким решением видится создание одного раздела размером с диск на каждом из устройств и объединение их в md-устройство, поверх которого уже нарезать тома для операционной системы.
Так вот, оказалось, что создать все это безобразие (корректно создать sda1 и sdb1; объединить их в md0_mdraid1; создать lvm vg на md0; создать lv внутри vg; отформатировать созданные тома в нужную fs и установить туда debian) установщику по силам, а финальный аккорд - установка grub2 - нет. Текст ошибки уже забылся, но общая идея недовольства загрузчика была в том, что в предложенной конфигурации (загрузка с md-устройства и lvm-тома) необходимо встраивание загрузчика (установка в sda1 а не в sda), что в случае с GPT-таблицей разделов невозможно. Как-то так.
Пока я искал решение этой проблемы, несостоявшуюся установку я затер, поэтому процесс далее включает в себя разметку диска и создание md-устройства. Однако предполагаю, что можно было бы обойтись и без этого, оставив-таки большую часть ручной работы инсталлятору.
Итак, во-первых, спасибо автору этого материала за вдохновение (а именно, за четкое представление того, что нужно сделать) .
Общая идея - с помощью умеющих работать с gpt-таблицей утилит (gdisk, sfdisk, parted) нужно создать маленький раздел (1Mb за глаза, и примерно столько остается неразмеченного пространства при создании первого раздела установщиком дебиана, поэтому я выше упоминал об упрощении ручной работы), который должен иметь тип BIOS boot partition (Code: EF02). При создании помним об Advanced Format (кратко: раздел должен начинаться с номера сектора, кратного 8). Далее размечаем диск согласно желаниям (все еще помня про 4k-кластеры). 
Полезная команда: разметив один диск (sda), можно полностью скопировать таблицу разделов на другой такой же(sdb):
sgdisk -R=/dev/sdb /dev/sda 
Чтобы после этого идентификаторы диска не оказались идентичными, еще одно действие:

sgdisk -G /dev/sdb
Собственно, и все. При такой разметке GRUB2 сможет установиться в этот boot-partition и оттуда загрузить себя и все остальное. Далее в статье идут примеры создания md-устройства и разметка lvm-томов. Можно сделать, а можно топать в инсталлятор (ибо вышеописанные действия скорее всего придется делать до момента начала установки с live-cd, например, GParted или CloneZilla). 
Если же предложенные действия делаются после свалившегося на установке загрузчика инсталлятора (с того же live-cd), то, полагаю, можно попробовать сразу установить GRUB2 на диски:
grub-install /dev/sda
grub-install /dev/sdb
Ставим на оба, так как в случае mirror при выпадении одного из дисков (обычно установщик ставит GRUB2 только на первый диск), на котором GRUB2 был установлен, мы не сможем загрузиться.