пятница, 12 сентября 2008 г.

Доступ к серверу, прикрытому неподконтрольным брандмауером.

Вызвался настроить школьный сервер своему другу. В сельскую школу, где он работает, в рамках общероссийской программы провели интернет и там встал вопрос, как проконтролировать сетевую активность новоявленных интернет-пользователей (в лице школьников). Заодно привести в порядок локальную сеть школы.
Под сервер оперативно выделили компьютер. В выборе операционной системы остановились на Ubuntu. Но я, так как находился в километрах двухстах, нуждался в удаленном доступе. Проконсультировал через аську установку ОС и настройку удаленного доступа по ssh. Дальше меня ждал неприятный сюрприз – невозможность прямого соединения с сервером.
Решение было найдено в man-странице ssh. Спасением стали ключ «-R», создающий туннель c порта удаленной машины на локальный порт, и подконтрольный мне сервер («MY»), доступный со школы («SCHOOL»).

  • На «MY» создаем пользователя «user_my» и задаем ему пароль.
На сервере «SCHOOL»
  • Создаем пользователя «user_school» и добавляем его в список пользователей sudo.
  • Устанавливаем openssh-server и screen
    $ sudo aptitude install openssh-server screen
  • Запускаем сервер SSH
    $ sudo /etc/init.d/ssh start
  • В домашней папке нового пользователя создаем скрипт «~/bin/remote-access.sh»
    #!/bin/sh
    screen -d -m -S remote-access -- \
    sh -c 'while true; \
    do ssh -R 2222:localhost:22 -C \
    user_my@my.server.ru; done'
    Сделаем скрипт исполняемым
    $ chmod +x ~/bin/remote-access.sh
    Данный скрипт создаёт фоновую сессию screen и устанавливает ssh-соединение с «MY».
  • Создаем ключ беспарольной аутентификации. Пароль (passphrase) для ключа не задается. Нужен для скрипта «remote-access.sh»
    $ ssh-keygen -b 2048
    Копируем ключ с «SCHOOL» на «MY»
    $ ssh-copy-id user_my@my.server.ru
  • Добавляем задание для cron, чтобы соединение с «MY» устанавливалось сразу после включения «SCHOOL»
    $ crontab -e
    @reboot /home/user_school/bin/remote-access.sh
  • Запустим наш скрипт на «SCHOOL»
    $ /home/user_school/bin/remote-access.sh
    $ screen -ls
    There are screens on:
    5140.remote-access (Detached)
    1 Socket in /var/run/screen/S-user_school.
  • На стороне «MY» должен появиться новый порт
    $ netstat -tln | grep :2222
    tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN
  • Теперь мы можем соединиться с сервером «SCHOOL» по созданному туннелю
    $ ssh -p 2222 user_school@localhost

Удаленное управление сервером имён BIND9

Управление сервером имён BIND9 производится с помощью команды rndc. С его помощью можно удаленно обновить (или принудительно перезагрузить) зоны, сбросить кеш сервера или заморозить обновление динамических зон.

Сперва настраиваем BIND9

  • Сгенерируем ключ «/etc/namedb/rndc.key»
    # rndc-confgen -u bind -a -b 256
  • Создадим конфигурационный файл «/etc/namedb/rndc.conf»
    include "/etc/namedb/rndc.key";

    options {
    default-key "rndc-key";
    default-server 127.0.0.1;
    default-port 953;
    };
  • Отредактируем файл «/etc/namedb/named.conf» и добавим
    include "/etc/namedb/rndc.key";
    controls {
    inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; };
    inet 192.168.0.xxx port 953 allow { 192.168.0.yyy; } keys { "rndc-key"; };
    };
    где «192.168.0.xxx» – ip-адрес сервера в сети, а «192.168.0.yyy» – ip-адрес компьютера администратора.
  • Перезагружаем сервер имён
    # /etc/rc.d/named restart
  • Проверяем
    # rndc reload
    server reload successful
Теперь настроим на стороне администратора
  • Копируем с сервера файлы для rndc
    $ sudo scp -p admin@192.168.0.xxx:/etc/namedb/rndc.'*' /etc/namedb/
  • Отредактируем файл «/etc/namedb/rndc.conf»
    include "/etc/namedb/rndc.key";

    options {
    default-key "rndc-key";
    # default-server 127.0.0.1;
    default-server 192.168.0.xxx;
    default-port 953;
    };
  • Проверяем
    # rndc reload
    server reload successful
Если у вас несколько серверов, то они настраиваются похожим образом.
  • На стороне администратора сохраняем ключи с именами вроде «/etc/namedb/server-name.key» и редактируем
    key "rndc-server-name-key" {
    algorithm hmac-md5;
    secret "super-secret-password-hash=";
    };
  • В файл «/etc/namedb/rndc.conf» добавим строки для каждого сервера
    include "/etc/namedb/server-name.key";
    server "server-name" {
    key "rndc-server-name-key";
    };
    «server-name» может быть именем сервера или его ip-адресом.
  • Проверяем
    # rndc -s server-name reload
    server reload successful
    Если опустить параметр «-s» то будем «рулить» сервером, заданным по умолчанию в секции «options»

среда, 10 сентября 2008 г.

Отключение предстартового отсчета в FreeBSD

В файл «/boot/loader.conf» добавляем строку

autoboot_delay="0"
После перезагрузки система больше не отвлекается на предстартовый отсчет.
Другой метод заключается в замене загрузчика на стандартный. Запускаем sysinstall
# sysinstall
В меню выбираем «Configure» → «Fdisk». Далее нажимаем «q» для выхода из программы разметки диска. В появившейся форме выбираем пункт «Standard — Install a standard MBR (no boot manager)» и выходим из программы.

суббота, 6 сентября 2008 г.

Skystar3: Спутниковый интернет в Ubuntu (hardy)

Описывается настройка спутникового интернета провайдера «Радуга Интернет» через openvpn.

  • После установки спутниковой карты в свободный слот PCI и загрузки ОС создаем файл «/etc/modprobe.d/dvb_core.modprobe»
    options dvb_core dvb_shutdown_timeout=915360000
    Этим мы препятствуем «засыпанию» карты. В новых ядрах, в отличие от старых, установка параметра «dvb_shutdown_timeout» в «0» не помогает и потому надо выставлять заведомо большое значение таймаута (в секундах).
  • Перезагружаем компьютер.
  • Устанавливаем требуемые утилиты
    $ sudo aptitude install dvb-utils
  • Создаем файл «/etc/channels.conf»
    Raduga:11671:v:0:18200:0:0:0
    Здесь:
    • Raduga – название канала. Может быть любым.
    • 11671 – частота
    • v – поляризация. Может быть H – горизонтальная и V – вертикальная
    • 0 – FEC: 0 – Авто, 33/4,...
    • 18200 – Величина потока (Symbol rate)
    • 0 – Видео PID
    • 0 – Аудио PID
    • 0 – Program id
  • Пробуем залочиться на сигнал
    $ szap -c /etc/channels.conf -x -n 1
    reading channels from file '/etc/channels.conf'
    zapping to 1 'Raduga':
    sat 0, frequency = 11671 MHz V, symbolrate 18200000, vpid = 0, apid = 0

    using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
    status 07 | signal 9797 | snr 3270 | ber 0000ff00 | unc 00000000 |
    status 1f | signal 9696 | snr d344 | ber 00001800 | unc 00000000 | FE_HAS_LOCK
    Ключевые значения: «status 1f» и «FE_HAS_LOCK». Остальные поля указывают уровень сигнала, количество ошибок и т.п. Когда устойчивый сигнал будет получен, szap завершит свою работу.
  • Теперь отключим rp_filter, фильтрующий пакеты которые не могут уйти через тот же интерфейс что и пришли. В нашем случае пакет приходит через один интерфейс, а уходит через другой
    $ sudo sh -c 'echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter'
  • Создаем сетевый интерфейс спутниковой карты
    $ sudo dvbnet -p 1234
    где «1234» - ваш PID. После выполнения команды должен появиться сетевой интерфейс «dvb0_0» (неактивный).
  • Настраиваем интерфейс
    $ sudo ifconfig dvb0_0 hw ether YOUR-MAC-ADDRESS YOUR-IP-ADDRESS netmask 255.255.255.0 up
    где «YOUR-MAC-ADDRESS» и «YOUR-IP-ADDRESS» соответственно MAC-адрес и IP-адрес вашей подписки.
  • Смотрим на наличие входящего трафика на интерфейсе «dvb0_0»
    $ sudo dvbtraffic
    -PID--FREQ-----BANDWIDTH-BANDWIDTH-
    0000 10 p/s 1 kb/s 15 kbit
    0010 0 p/s 0 kb/s 1 kbit
    0011 0 p/s 0 kb/s 1 kbit
    0014 0 p/s 0 kb/s 1 kbit
    0032 60 p/s 11 kb/s 90 kbit
    003c 10 p/s 1 kb/s 15 kbit
    003d 31 p/s 5 kb/s 47 kbit
    0064 13 p/s 2 kb/s 20 kbit
    Если программа ничего не выводит, то проблемы могут быть в неправильных параметрах или «заснула» спутниковая карта.
  • Правим конфигурационный файл «/etc/network/interfaces» и добавляем
    auto dvb0_0
    iface dvb0_0 inet manual
    pre-up sh -c '/usr/bin/dvbnet -a 0 -p 1234 > /dev/null'
    up ifconfig $IFACE hw ether YOUR-MAC-ADDRESS YOUR-IP-ADDRESS netmask 255.255.255.0 up
    up sh -c 'echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter'
    up sh -c '/usr/bin/szap -c /etc/channels.conf -n 1 -x'
    down ifconfig $IFACE down
    down /usr/bin/dvbnet -d 0
Теперь приступим к установке и настройке openvpn
  • Установим openvpn
    $ sudo aptitude install openvpn
  • Скачаем из личного кабинета архив с ключами для openvpn. Из архива распакуем файлы ca.crt, client.ovpn, i0xxxxxx.csr, i0xxxxxx.crt, i0xxxxxx.key.
  • Скопируем все эти файлы в директорию «/etc/openvpn».
  • Сменим права доступа к файлу «i0xxxxxx.key»
    $ sudo chmod 0400 /etc/openvpn/i0xxxxxx.key

  • Переименуем файл «client.ovpn» в «raduga.conf» и отредактируем его. В итоге должно получиться примерно такое содержание
    client
    dev tap
    # dev-node Raduga
    proto udp

    remote 80.81.208.66 55032

    resolv-retry infinite
    nobind
    persist-key
    persist-tun

    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/i0xxxxxx.crt
    key /etc/openvpn/i0xxxxxx.key

    ns-cert-type server
    verb 3
    comp-lzo
    comp-noadapt

    auth-user-pass /etc/openvpn/password.txt
    route-up /etc/openvpn/tap0-route.sh
    Создаем файл «/etc/openvpn/password.txt» с именем и паролем подписки
    user
    password
    и делаем его доступным на чтение только владельцу
    $ sudo chmod 0400 /etc/openvpn/password.txt
  • Создаем скрипт «/etc/openvpn/tap0-route.sh», выполняемый после поднятия роутов.
    netstat -rn | \
    sed '1,2d' | \
    awk '{ \
    if ($1 == "0.0.0.0" \
    && $2 == "10.251.32.1" \
    && $3 == "0.0.0.0" \
    && $8 != "tap0") { \
    EX=sprintf("/sbin/route del -net 0.0.0.0/0 gw %s dev %s && /sbin/route add -net 0.0.0.0/0 gw %s dev tap0\n", $2, $8, $2); system(EX); } }'
    В моем случае openvpn дефолтовый маршрут постоянно вешал на интерфейс «dvb0_0» и пришлось прибегнуть к принудительной привязке скриптом роута к «tap0». Делаем скрипт исполняемым
    $ sudo chmod +x /etc/openvpn/tap0-route.sh

  • Редактируем файл «/etc/default/openvpn» и добавляем строку
    AUTOSTART="raduga"
  • Пробуем соединиться к провайдеру из консоли
    $ sudo openvpn /etc/openvpn/raduga.conf
    Если успешно соединились с сервером, закрываем соединение нажатием «ctrl+c».
  • Перезапускаем даемон
    $ sudo /etc/init.d/openvpn restart
Статья писалась по памяти и возможны неточности в описании. Буду признателен если сообщите мне о них.

четверг, 4 сентября 2008 г.

Три опасные уязвимости во FreeBSD

Во FreeBSD обнаружены три новые уязвимости:

  • "amd64 swapgs local privilege escalation " - локальный злоумышленник может выполнить код в системе с привилегиями ядра (root), изменив состояние стека пользовательского приложения и инициировав GPF (General Protection Fault) в момент передачи управления приложению, после обработки ядром прерывания, trap или системного вызова. Уязвимости подвержена только amd64 сборка всех поддерживаемых версий FreeBSD. Проблема устранена в 7.0-RELEASE-p4 и 6.3-RELEASE-p4.
  • "nmount(2) local arbitrary code execution" - возможность выполнения кода локального злоумышленника в контексте ядра, в случае когда непривилегированным пользователям предоставлена возможность монтирования файловых систем. Уязвимость вызвана ошибкой в системном вызове nmount, передающем пользовательские данные ядру без надлежащей проверки границ. Проблеме подвержена только ветка FreeBSD 7, исправление внесено в 7.0-RELEASE-p4. В качестве временного решения можно запретить операции монтирования пользователям: "sysctl vfs.usermount=0".
  • "Remote kernel panics on IPv6 connections " - удаленный злоумышленник может вызвать крах ядра (kernel panic), отправив по сети специальным образом модифицированный IPv6 (ICMPv6) пакет. Обязательным условием проявления уязвимости является необходимость наличия в системе IPv6 TCP сокетов, принимающих внешние соединения. Уязвимости подвержены все поддерживаемых версий FreeBSD, проблема устранена в 7.0-RELEASE-p4 и 6.3-RELEASE-p4.
Источник: www.opennet.ru

среда, 3 сентября 2008 г.

Устранение проблем с локалью в консоли Ubuntu

Если в консоли постоянно донимают подобные предупреждения

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "ru_RU.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
справится с ними можно, сгенерировав отсутствующую локаль
$ sudo locale-gen ru_RU.UTF-8
Generating locales...
ru_RU.UTF-8... done
Generation complete.
Смотрим на список доступных локалей
$ locale -a
C
en_GB.utf8
en_US.utf8
POSIX
ru_RU.utf8

Как отключить автоопределение типа сетевого подключения в Ubuntu

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

  1. Узнаем подробности про сетевой интерфейс etho
    $ sudo ethtool eth0
    Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 100Mb/s
    Duplex: Half
    Port: MII
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: pumbg
    Wake-on: d
    Current message level: 0x00000001 (1)
    Link detected: yes
  2. Теперь меняем скорость, дуплекс и автоопределение
    $ sudo ethtool -s eth0 speed 10 duplex full autoneg off
  3. Смотрим еще раз состояние eth0
    $ sudo ethtool eth0
    Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 10Mb/s
    Duplex: Full
    Port: MII
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: off
    Supports Wake-on: pumbg
    Wake-on: d
    Current message level: 0x00000001 (1)
    Link detected: yes
  4. Если все устраивает редактируем файл конфигурации «/etc/network/interfaces»
    auto eth0
    iface eth0 inet static
    address 192.168.0.7
    netmask 255.255.255.0
    gateway 192.168.0.1
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off
    В случае, если адрес берется по dhcp
    auto eth0
    iface eth0 inet dhcp
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off
  5. Когда на машине используется Xen, сетевые интерфейсы «ethX» становятся виртуальными. Сами физические интерфейсы обозначаются как «pethX».
    Действия, описанные в пунктах 1-3, выполняем с интерфейсом peth0.

    В «/etc/network/interfaces» добавляем
    auto peth0
    iface peth0 inet manual
    up ifconfig $IFACE up
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off

понедельник, 1 сентября 2008 г.

Exim & ldaps://

  • Редактируем файл конфигурации Exim «etc/exim/configure»
    Строку
    ldap_default_servers = ldap.server.ru
    меняем на
    ldap_default_servers = ldap.server.ru:636
    Редактируем все запросы к LDAP.
    Пример правки:
    • старый
      domainlist local_domains = ${lookup ldap {LDAP_AUTH \
      ldap:///ou=Domains,dc=ldap-server,dc=intranet?dc?sub?\
      (&(objectClass=dNSDomain)(dc=$domain))}\
      {$value}}
    • новый
      domainlist local_domains = ${lookup ldap {LDAP_AUTH \
      ldaps:///ou=Domains,dc=ldap-server,dc=intranet?dc?sub?\
      (&(objectClass=dNSDomain)(dc=$domain))}\
      {$value}}
  • В файл «etc/openldap/ldap.conf», чтобы разрешить самоподписанные сертификаты, добавляем строку
    TLS_REQCERT     allow
  • После внесения изменений перезапускаем Exim
    # /usr/local/etc/rc.d/exim restart