Тема : Полезные решения на платформе FreeBSD.


Smithson  13-07-2004 11:42
Я конечно обещал статьи пока не писать :), но все равно пишу инструкцию, так что.

Архивирование unix по простому.

Итак, забудем пока про всякие ArcServe и прочие умные (дорогие) вещи с умением бакапить unix на ленты. Поговорим про родные, встроенные и бесплатные средства резервного копирования данных. Ессессенно, они поскромнее в возможностях, чем ArcServe, но порой дают вполне сопоставимые результаты.

Что на потребуется:
1. Знать пароли рута на бакапируемых машинах.
2. Машина, на которую будем сливать копии (у меня как правило стоит "лишний" unix, который способен быстро подменить любой из работающих. то есть на нем установлены все продукты, используемые на прочих unix, остается подложить настройки, данные и подменить ip). На этой машине должен быть ftp-сервер. Как правило, одной из функций unix и является ftp-сервер, так что на "лишней" машине он у меня установлен.
3. Стандартные утилиты unix - tar, gzip (или compress, по вкусу), ftp.

Ну, поехали.
Создаем каталог со скриптами копирования. Я предпочитаю использовать каталог типа /root/backup или /root/save. Пишем в него следующий скрипт (назовем его backup.sh):

#!/usr/local/bin/bash
# Определим имя машины
NAME=`uname -n`; export NAME

#Упакуем нужные нам каталоги
# /etc
tar cvf /root/save/etc.tar /etc >/dev/null
# /chroot
tar cvf /root/save/chroot.tar /chroot >/dev/null
# Для BSD систем - /usr/local/etc
tar cvf /root/save/usr-local-etc.tar /usr/local/etc >/dev/null
# /var/log
tar cvf /root/save/var-log.tar /var/log >/dev/null
# настройки пользователей как правило лежат в файлах, начинающихся на точку
tar cvf /root/save/home.tar /home/*/.* >/dev/null
# ну и всякие специальные данные, типа данных ftp-сервера. Oracle так конечно не
# забакапишь, но мы же делаем простую дешевую систему :)
tar cvf /root/save/ftp.tar /data/ftp >/dev/null

# Сжимаем полученные архивы
gzip -f *.tar

# Собираем их в один файл с именем машины
tar cvf $NAME.tar *.tar.gz

# Освобождаем место :)
rm *.tar.gz

# Засылаем данные
ftp -i backup </root/save/cmd

# Чистим место
rm $NAME.tar


Сразу оговорки :). Необходимо достаточное количество места в том каталоге, куда будем бакапить. Минимум двойной запас по сравнению с объемом бакапа. Идеально использовать для этого отдельную файловую систему (у меня /root всегда отдельная FS), переполнение которой не повредит работе ОС. Если вы используете compress, то расширение файлов будем .Z. И zgip, и compress заменяют сжимаемый файл сжатым - то есть беспокоиться об удалении первых файлов .tar не надо.
Теперь про ftp. На целевой машине создаем пользователя с правами доступа только по ftp, именем и паролем. Даем ему права записи в какой-то каталог, куда мы собираемся бакапиться. Лучше сделать этот каталог его домашним и указать этого пользователя в /etc/ftpchroot.
На машине, копию которой будем делать, добавляем следующие настройки:
В /etc/hosts прописываем название машины backup и ее ip. Это для того, чтобы бакап не зависел от работы dns-сервера. А для того, чтобы ftp работал без вопросов и участия пользователя, в домашнем каталоге пользователя root создаем файлик .netrc с правами доступа к нему 600 или 400 (00 обязательно!) и примерно следующего содержания:

machine backup login логин password пароль

Ну и содержание файла /root/save/cmd:

lcd /root/save
bin
mput *.tar
quit


И добавляем в crontab (системный или рутовый) запуск /root/save/backup.sh. Периодичность этого запуска зависит от частоты изменения данных и от их важности. Например, dns сервер я сливаю каждые 20 минут, логи почты, cisco и web-сервера - каждый час, а всякие почтовые релеиб ftp-сервера и пр. - раз в сутки.
Все! Поскольку результирующих .tar содержит имя машины, то у нас в целевом каталоге на целевой машине лежит N .tar файлов, относящихся к разным машинам. Теперь мы можем сливать их на стриммер, подключенный к этой машине, или забирать в общий бакап arcserve, или просто там хранить - это же дополнительная, резервная машина!

Теперь ответ на вопрос "а нахрена?!".
Рассказываю - во-первых, дешево и сердито. Во-вторых, если у Вас по каким-то причинам завалиться система (RAID развалиться, motherboard сгорит, ...) , то и установленный в нее стриммер будем вам совсем без радости. Все равно нужна будет машина, на котрой можно временно, но быстро поднять функции умершей. А так все настроечки на ней уже лежат. А ежели на ней есть стриммер (или место позволяет и мы cron`ом переименовываем старые файлы), то лежат настроечки за неделю :)).

Ну вот так. Дополнения принимаются.

Macmep  20-07-2004 13:01
Smithson: спасибо :) А мне больше по душе конструкция вида:
tar cvfz /patch/to/arc/archive.tar.gz * :)

KillerLoo  20-07-2004 13:19
Smithson:Не, все нормально и имхо правильно, это МАСТЕР-бой перегибает уже -)) Вернее недогибает имхо :о))
[offtopic]
К ЛюдЯм надо относится лутше! А на вопросы смотреть ширше! -(с) [offtopic]
А Ораклы ты как бекапишь?
__________________

Macmep  20-07-2004 13:41
/me тщательно выцеливает гадкого Triiler'aQ из rail'a...

Smithson  20-07-2004 14:22
Macmep: Вообщем-то ты прав, просто та система, на которой я это рожал в первый раз, ключ z еще не поддерживала :))
KillerLoo: А ораклы я бакаплю либо стандбаем, либо арксервом :).

Macmep  20-07-2004 14:44
/me всегда прав :)
(шютка)
Smithson: предлагаю нещадно тереть мой флуд и грохать флеймы! =)

KillerLoo  20-07-2004 14:50
Ну тут дискутировать и обсуждать? Или маны и методы?
/me непрерывно качает маятник и фиг в него Мастер попадет!

Macmep  20-07-2004 15:19
KillerLoo:
Ну тут дискутировать и обсуждать? Или маны и методы?
А по-моему одно другому только на пользу? Я вот закончу ваять тут кой-чего и засяду статейки кропать :) А пока Mr. Smithson тут сам чудесно справляется, за что ему респект. :)

dwalexuk  18-08-2004 12:49
По сети гонять tar овые архивы неоптимально. гораздо удобнее использовать rsync и прочие программы использующие его алгоритм синхронизации. Например unison или duplicity.
Мне по душе связка duplicity + patch для MC.

Хотя я пока как раз пока пользуюсь таром. но как только придет новый сервер буду исправляться. патч (http://forum.dklab.ru/other/all/VstraivanieDuplicityVMidnightCommanderMc.html)

dwalexuk  18-08-2004 13:06
Продолжене темы:
А ежели у вас вмето ленты USB винты - наиболее практичное устройство. то при смене этих устройств вам нужно их монтировать размонтировать. чтобы не делать это руками добавим:

[CODE]

MOUNTPOINT=/mnt/usb
DEVLABEL=/sbin/devlabel
DEVLABELCONFIG=/etc/sysconfig/devlabel
IAM=$0

function allAttachedScsiUsb {
find /proc/scsi/ -path '/proc/scsi/usb-storage*' -type f | xargs grep -l 'Attached: Yes'
}
function scsiDevFromScsiUsb {
echo $1 | awk -F"[-/]" '{ n=$(NF-1); print "/dev/sd"substr("abcdefghijklmnopqrstuvwxyz", n+1, 1) }'
}

for procEntry in $(allAttachedScsiUsb); do
scsiDev=$(scsiDevFromScsiUsb $procEntry)
# Some bug with usb-storage?
# partitions are not in /proc/partitions until they are accessed
# somehow.
/sbin/fdisk -l $scsiDev >/dev/null
##
# Most devices have partitioning info, so the data would be on
# /dev/sd?1. However, some stupider ones don't have any partitioning
# and use the entire device for data storage. This tries to
# guess semi-intelligently if we have a /dev/sd?1 and if not, then
# it uses the entire device and hopes for the better.
#
if grep -q 'basename $scsiDev'1 /proc/partitions; then
part=$scsiDev
else
part="$scsiDev""1"
fi

echo $part
done
#check if we already mount it
if grep -q "$MOUNTPOINT" /etc/mtab; then
echo "usb already mounted"
else
mount -o noatime $part /mnt/usb/ >>/dev/null
fi

#------------shutdown-------------#
if grep -q "$MOUNTPOINT" /etc/mtab; then
# unmount cleanly
echo "umount "
umount -l $MOUNTPOINT
fi
#------------end_of_shutdown--------#

Smithson  06-12-2004 10:54
Статья про постоянный update FreeBSD. В общем-то, релизы FreeBSD достаточно стабильны, так что можно и рискнуть.


Читать (http://www.taosecurity.com/keeping_freebsd_up-to-date.html)
Скачать в виде pdf (http://www.taosecurity.com/keeping_freebsd_up-to-date.pdf)

Macmep  31-12-2004 22:23
Ну что еще делать человеку накануне НГ? :) Наверное задуматься о подведении итогов прошедшего года или, как вариант, задуматься о заделе на следующий. :) Я, собственно, давно собирался разродиться циклом статей по *nix'ам, но хронически не хватало времени. Может быть и опять не хватит, так как планов на праздники громадьё, как говориться, но однако попробую. Итак, лирическое отступление, оно же вступление, закончено и перехожу непосредственно к изложению материала. :)
Сперва задумки ака содержание или, как учили в славной советской средней школе, напишем план сочинения. У кого со словом план возникают другие ассоциации, тот может дальше не читать, а смело отправляться курить бамбук. :)

1. Почему именно FreeBSD?
2. Chroot vs jail достоинства и недостатки.
3. Stunnel, как оружие пролетариата.
4. 3proxy - джентльменский набор сервисов.
5. Итоги, дополнения, исправления, пожелания и планы на будущее.

Ну и приступим, пожалуй. :)

Глава 1. Почему именно FreeBSD?

Я уже как то высказывал свои соображения на эту тему но не побоюсь повториться. Группа разработчиков системы чрезвычайно внимательно следит за появлением новых уязвимостей в сервисах и старается максимально быстро выпускать к ним патчи. Коллекция портов содержит практически все необходимые утилиты, составляется специально с учетом особенностей системы, регулярно обновляется, при этом изменения вносятся в Makefile, как при появлении новых версий программ, так и при добавлении патчей к старым. Мощная утилита portaudit (/usr/port/security/portaudit) при установке добавляется в скрипты periodic daily и регулярно апдейтит базы уязвимостей с серверов проекта. В случае обнаружения уязвимого сервиса в системе сообщение об этом выдается в отчетах periodic daily, которые совсем не вредно регулярно просматривать. Установка portaudit абсолютно тривиальна. Сперва устанавливаем самое свежее дерево портов, что полезно производить перед каждой установкой утилит. Делается это с помощью CVSup, и этот процесс подробно описан во многих местах в рунете. Выглядит это, например, так:


vi /etc/cvsupfile

*default host=cvsup.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs
*default tag=RELENG_4_10
*default delete use-rel-suffix
*default compress
*default tag=.
ports-all

/usr/local/bin/cvsup -g -L 2 -P - /etc/cvsupfile


Подразумевается, что пакет CVSup уже установлен в системе, так как после установки фри на комп - он наш верный и надежный друг на весь период существования сервера под управлением FreeBSD. :)

Тепер ставим собственно portaudit.


cd /usr/ports/security/portaudit
make install clean


После успешной установки утилиты читаем добрый совет:


===> To check your installed ports for known vulnerabilities now, do:

/usr/local/sbin/portaudit -Fda


И делаем это незамедлительно с, например такими результатами:


/usr/local/sbin/portaudit -Fda
auditfile.tbz 100% of 16 kB 41 kBps
New database installed.
Database created: Fri Dec 31 21:40:17 MSK 2004
Affected package: wget-1.8.2_6
Type of problem: wget -- multiple vulnerabilities.
Reference: <http://www.FreeBSD.org/ports/portaudit/06f142ff-4df3-11d9-a9e7-0001020eed82.html>

Affected package: FreeBSD-491000
Type of problem: multiple vulnerabilities in the cvs server code.
Reference: <http://www.FreeBSD.org/ports/portaudit/d2102505-f03d-11d8-81b0-000347a4fa7d.html>
Note: To disable this check add the uuid to `portaudit_fixed' in /usr/local/etc/portaudit.conf

1 problem(s) in your installed packages found.

You are advised to update or deinstall the affected package(s) immediately.


Это уже информация к размышлению. :) Быстро бежим в каталог с wget


cd /usr/ports/ftp/wget
www-/usr/ports/ftp/wget# ls -lt
total 10
drwxr-xr-x 2 root wheel 512 Jul 5 09:02 files
-rw-r--r-- 1 root wheel 194 Mar 18 2004 distinfo
-rw-r--r-- 1 root wheel 1470 Feb 4 2004 Makefile
-rw-r--r-- 1 root wheel 1144 Oct 16 2003 pkg-plist
-rw-r--r-- 1 root wheel 510 Jan 15 2001 pkg-descr


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


www-/usr/ports/ftp/wget# vi distinfo
MD5 (wget-1.8.2.tar.gz) = a2473d7a53ebaf0a1bdb06f17059e8f1
SIZE (wget-1.8.2.tar.gz) = 1154648
MD5 (wget_1.8.2-12.diff.gz) = 6017ad7231afb85ac37a2b975203fc40
SIZE (wget_1.8.2-12.diff.gz) = 34921


Ну и вариантов два. Первый - оставить утилиту и использовать ее на свой страх и риск до момента выхода патча. Второй - снести ее к едрене Фене, подыскав недырявую альтернативу в тех же портах, например. http://freebsd.org/ports + search помогут нам в этом вопросе. :)

Macmep  01-01-2005 23:08
Глава 2. Chroot vs jail достоинства и недостатки.

Оговорюсь сразу, что данные статьи отнюдь не отменяют необходимость RTFM, как залога успеха. Внимательное прочтение man – это 90% успешного решения задачи. Я постараюсь максимально доступно изложить все на конкретных примерах, но сразу скажу, что эти решения возникли после длительного копания мануалов и гугля. Еще одно немаловажное замечание – все сказанное в этих статьях применено и работает на платформах 4 линейки FreeBSD. На пятой ветке у меня возникли с этим определенные затруднения и я подробно расскажу о них позже, после того, как найду решения задач.
Приступим наконец. :) Указанные в названии главы системные утилиты являются весьма мощным инструментом повышения уровня безопасности всей системы в целом. Смысл их работы заключается в том, что потенциально опасные процессы и сервисы можно запускать в отдельном от всей системы окружении со своими бинарниками, библиотеками и переменными окружения. В каком случае это решение оправдано? Во-первых, если необходимый сервис достаточно часто встречается в списках уязвимых, но при этом реальной альтернативы ему найти не представляется возможным. Так, например, сами разработчики фри рекомендуют запускать bind (пожалуй самый популярный на сегодняшний день сервер DNS) в chroot окружении и предоставляют, кстати, детальное описание настроек. Во-вторых, такая необходимость может возникнуть в случае предоставления хостинга с большим количеством сервисов и при этом разработчики скриптов сайта по вашему мнению не являются надежными или их скрипты просто вам не по душе :) И в этом случае весь проект, включая вьёб-сервер, базы данных и ftp-сервер, обеспечивающий доступ в докрут апача, можно изолировать от самой системы. Теперь скажу несколько слов о jail. На платформе FreeBSD, в отличие от Linux это две абсолютно разные утилиты. Установка и запуск jail достаточно просты и подробно описаны в манах (man jail). Jail считается более защищенным и функциональным, чем chroot, но при этом предъявляет более высокие требования к системе. В частности, jail – машина требует выделения отдельного IP – адреса, что не всегда возможно. Правда в случае нехватки реальных адресов можно попробовать использовать фейковые (192.168.0.0/24 etc.) и задействовать портмапперы – решение всегда зависит от конкретной задачи. Кроме этого, jail – машина, установленная по дефолту, как это описано в манах, достаточно громоздка и содержит в себе массу файлов, которые скорее всего не потребуются при дальнейшей работе. Избавиться от них можно путем длительной подгонки напильником файла Make.conf, но для этого уже потребуются экспертные знания. Еще одной удобной функцией jail являются весьма широкие возможности предоставления сервисов “на сторону”, фактически – это полноценная виртуальная машина, позволяющая заводить своего суперюзера root, имеющая свои собственные файлы групп и паролей и системные утилиты для управления ими. Как реальный пример – вы можете поднять ssh на jail – машине, создать запись root и юзерские аккаунты, разместить свое дерево портов и отдать в таком виде сторонним разработчикам. Проблемы возникающие при эксплуатации jail, в случаях запуска нескольких машин на одной системе – это проблема квотирования дискового пространства (решения существуют, но я не планирую на них останавливаться в этой статье) и запреты определенных системных вызовов к ядру, налагаемые разработчиками исходя из соображений безопасности и структуры самой утилиты (альтернативные решения также существуют и те, кто заинтересуется этим вопросом смогут найти их, попробовать использовать и поделиться опытом). Еще одно весьма важное замечание – любой апгрейд системы, влекущий за собой последующую ее пересборку, включая ядро, требует обновления файлов как в jail (путем новой сборки), так и в chroot (путем ручной замены файлов, претерпевших изменения). Об этом нельзя забывать никогда! И последнее, прежде, чем я перейду к детальному объяснению процесса создания chroot – окружения. В jail, chroot и chrootuid периодически обнаруживаются собственные уязвимости! Смысл их заключается в появлении у злоумышленника возможности подняться выше уровня “ракушки”, в которую мы утолкли сервис, и получить доступ к бинарникам и библиотекам основной системы со всеми вытекающими из этого последствиями! Поэтому нужно отдавать себе отчет в том, что настоящий системный инженер никогда не может спать спокойно, а если и спит, то ему снятся багтраки. :)) Единственное, чем можно себя тешить – это тем, что свежие ксплойты никогда не являются достоянием широкой ламерской общественности, поэтому “сломать” вас можно будет только в случае серьезного “заказа” со стороны доброжелателей с привлечением экспертов. Так что никогда не тешьте себя иллюзиями относительно крутизны и неуязвимости собственной системы. Описываемые решения только значительно повышают уровень ее безопасности, но достигнуть 100% уровня защищенности не позволяет ничего, включая самые супер-пупер дорогие решения на базе цисок и другого тяжеловесного оборудования.
Теперь перейдем к детальному рассмотрению решения задачи запуска процесса в chroot –окружении. Делать это будем на примере утилиты stunnel. Зачем она нам нужна, будет рассказано в следующей главе, согласно утвержденному плану работы (см. выше) :)
Тем же, кому на самом деле интересно то, что я излагаю :) могу предложить посетить сайт разработчика утилиты и попытаться самостоятельно разобраться в вопросе, как она функционирует и где её можно применить. ;)
Для начала определим в каком месте файловой системы мы разместим дерево создаваемого chroot’a. В конкретном примере это будет раздел /var. Руководствоваться при выборе нужно только размером свободного дискового пространства в разделе и возможным объемом файлов, возникающих в процессе работы конкретного сервиса, например log-файлов. Утилита df - наш главный помощник при решении этого вопроса.


www-/var# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ar0s1a 1008M 45M 882M 5% /
/dev/ar0s1f 40G 14G 22G 39% /usr
/dev/ar0s1e 15G 5.1G 8.5G 38% /var
procfs 4.0K 4.0K 0B 100% /proc


Создадим корневой каталог в котором в последующем мы сможем размещать и другие сервисы, помещенные в chroot.


www-/# cd /var/
www-/var# mkdir chroot
www-/var# chown -R root:sys chroot


Группу sys я использую исключительно для удобства дальнейшей работы. Идем дальше – создаем собственно корневой каталог для сервиса и структуру его системных каталогов.


www-/var# mkdir -p chroot/stunnel/dev
www-/var# mkdir -p chroot/stunnel/etc
www-/var# mkdir -p chroot/stunnel/tmp
www-/var# mkdir -p chroot/stunnel/usr/lib
www-/var# mkdir -p chroot/stunnel/usr/libexec
www-/var# mkdir -p chroot/stunnel/usr/local/etc
www-/var# mkdir -p chroot/stunnel/var/run
www-/var# mkdir -p chroot/stunnel/var/log


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


www-/var# cd chroot/stunnel/dev/
www-/var/chroot/stunnel/dev# mknod null c 2 2
www-/var/chroot/stunnel/dev# chmod 0666 null


Создается нода для дивайса null, без которого, как известно, в никсах жизни нет :)
Следующий шаг не менее важен.


www-/var/chroot/stunnel/dev# cp /usr/libexec/ld-elf.so.1 /var/chroot/stunnel/usr/libexec/
www-/var/chroot/stunnel/dev# cp /var/run/ld-elf.so.hints /var/chroot/stunnel/var/run/


Без них ни один процесс не запустится в chroot – окружении. Почему? Вот первый абзац мана:


www-/var/chroot/stunnel/dev# man ld-elf.so.1
Formatting page, please wait...Done.
RTLD(1) FreeBSD General Commands Manual RTLD(1)

NAME
ld-elf.so.1, rtld -- run-time link-editor

DESCRIPTION
ld-elf.so.1 is a self-contained shared object providing run-time support
for loading and link-editing shared objects into a process' address
space. It is also commonly known as the dynamic linker. It uses the
data structures contained within dynamically linked programs to determine
which shared libraries are needed and loads them using the mmap(2) system
call.


Теперь переходим непосредственно к установке порта.


www-/var/chroot/stunnel/dev# cd /usr/ports/security/stunnel/
www-/usr/ports/security/stunnel# ls -l
total 18
-rw-r--r-- 1 root wheel 4275 Dec 31 21:32 Makefile
-rw-r--r-- 1 root wheel 97 Dec 31 21:32 distinfo
drwxr-xr-x 2 root wheel 512 Dec 31 21:32 files
-rw-r--r-- 1 root wheel 1192 Sep 20 2002 pkg-deinstall
-rw-r--r-- 1 root wheel 491 Sep 20 2002 pkg-descr
-rw-r--r-- 1 root wheel 894 Sep 20 2002 pkg-install
-rw-r--r-- 1 root wheel 1186 Dec 31 21:32 pkg-plist
www-/usr/ports/security/stunnel# cd files/
www-/usr/ports/security/stunnel/files# ls -l
total 28
-rw-r--r-- 1 root wheel 18788 Apr 24 2004 connect-proxy.mwald.patch
-rw-r--r-- 1 root wheel 593 Dec 31 21:32 patch-Makefile.in
-rw-r--r-- 1 root wheel 1581 Dec 30 17:22 patch-src::network.c
-rw-r--r-- 1 root wheel 584 Dec 31 21:32 ssl-noengine.patch
-rw-r--r-- 1 root wheel 1058 Dec 31 21:32 stunnel.sh


Здесь я немного позволил себе пробежать впереди паровоза. =) В каталоге files любого порта FreeBSD находятся патчи, которые посчитали необходимым добавить разработчики системы. В следующей главе для нас ключевой интерес будет представлять connect-proxy.mwald.patch. Но это уже совсем другая история. :) Едем дальше. Стандартный набор команд устанавливает порт и очищает каталог порта от продуктов работы компилятора, иными словами удаляет каталог work. Это make install clean и я его приводил в предыдущей главе. Здесь мы воспользуемся несколько иной конструкцией:


www-/usr/ports/security/stunnel# make && make install


Почему так? Потому, что нам на данном этапе понадобится скрипт для генерации SSL – сертификата, без которого работа программы невозможна. Я не буду приводить громоздкий листинг работы компилятора и инсталлятора, но рекомендую их просматривать, так как там содержится много полезной информации. В частности, нам будет интересно следующее:


Libraries have been installed in:
/usr/local/lib

Added group "stunnel".
Added user "stunnel".


Первое – библиотеки программы помещены в /usr/local/lib, второе – разработчиками предусмотрен запуск программы от отдельных user/group, что есть очень хорошо с точки зрения безопасности всей системы.
Создадим SSL – сертификат.


www-/usr/local/share# cd /usr/ports/security/stunnel/work/stunnel-4.06/
www-/usr/ports/security/stunnel/work/stunnel-4.06# make cert
(cd tools; rm -f stunnel.pem; make stunnel.pem)
if test -r "/dev/urandom"; then dd if="/dev/urandom" of=stunnel.rnd bs=256 count=1; RND="-rand stunnel.rnd"; else RND=""; fi; /usr/bin/openssl req -new -x509 -days 365 -nodes $RND -config ./stunnel.cnf -out stunnel.pem -keyout stunnel.pem; test 0 -eq 0 || /usr/bin/openssl gendh $RND 512 >> stunnel.pem
1+0 records in
1+0 records out
256 bytes transferred in 0.000215 secs (1191722 bytes/sec)
Generating a 1024 bit RSA private key
.........................++++++
.........................................++++++
writing new private key to 'stunnel.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [PL]:RU
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Stunnel Developers Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (FQDN of your server) [localhost]:myhost.ru
/usr/bin/openssl x509 -subject -dates -fingerprint -noout -in stunnel.pem
subject= /C=RU/CN=myhost.ru
notBefore=Jan 1 18:01:48 2005 GMT
notAfter=Jan 1 18:01:48 2006 GMT
MD5 Fingerprint=F6:4D:C8:28:64:BF:FA:14:84:0A:02:6A:D7:BE:45:C3


Таким способом мы просто облегчили себе жизнь, так как воспользовались готовым скриптом от разработчиков утилиты для генерации сертификата используя пакет openssl. В следующей главе будет подробно описан процесс генерации сертификатов самостоятельно. На что следует обратить внимание в приведенном выше листинге.
1. Сгенеренный сертификат будет лежать в каталоге tools.
2. При генерации использовано устройство "/dev/urandom
3. Срок действия сертификата – 1 год (-days 365)
4. Приватный ключ создан с использованием алгоритма шифрования RSA
5. Длина ключа 1024 бита
6. При заполнении формы проставлены только страна и доменное имя – строки, заполненные мной точками проигнорировались. Минимально необходимо указать только Common Name
7. Common Name (FQDN of your server) в этом поле обязательно именно FQDN, в противном случае при коннекте по имени хоста вы получите отлуп от программы.

Продолжим работу. Скопируем сертификат в наше chroot –окружение.


www-/usr/ports/security/stunnel/work/stunnel-4.06# mkdir -p /var/chroot/stunnel/usr/local/etc/stunnel
www-/usr/ports/security/stunnel/work/stunnel-4.06# cp tools/stunnel.pem /var/chroot/stunnel/usr/local/etc/stunnel/
www-/usr/ports/security/stunnel/work/stunnel-4.06# chmod 0600 /var/chroot/stunnel/usr/local/etc/stunnel/stunnel.pem


О необходимости создать каталог stunnel в /usr/local/etc я узнал просмотрев пути установки программы. Следующий шаг – перейти в /usr/local и сделав


www-/usr/local# ls -lt
total 38
drwxr-xr-x 5 root wheel 2048 Jan 1 20:40 lib
drwxr-xr-x 10 root wheel 512 Jan 1 20:40 etc
drwxr-xr-x 2 root wheel 1536 Jan 1 20:40 sbin
drwxr-xr-x 22 root wheel 512 Jan 1 20:28 share
drwxr-xr-x 2 root wheel 512 Jan 1 20:28 info
drwxr-xr-x 4 root wheel 512 Jan 1 20:28 libexec


выяснить в каких каталогах произошли изменения после установки порта – эта информация чуть позже нам весьма пригодится. Теперь, внимание, очень важный шаг – выясним список библиотек, необходимых для работы программы! Здесь наш лучший друг - это системная утилита ldd. Смотрим


www-/usr/local# ldd sbin/stunnel
sbin/stunnel:
libutil.so.3 => /usr/lib/libutil.so.3 (0x28076000)
libssl.so.3 => /usr/lib/libssl.so.3 (0x2807f000)
libcrypto.so.3 => /usr/lib/libcrypto.so.3 (0x280ae000)
libwrap.so.3 => /usr/lib/libwrap.so.3 (0x281a5000)
libc_r.so.4 => /usr/lib/libc_r.so.4 (0x281ad000)


По результатам ее работы производим следующие очевидные манипуляции


www-/usr/local# cp /usr/lib/libutil.so.3 /var/chroot/stunnel/usr/lib/
www-/usr/local# cp /usr/lib/libssl.so.3 /var/chroot/stunnel/usr/lib/
www-/usr/local# cp /usr/lib/libcrypto.so.3 /var/chroot/stunnel/usr/lib/
www-/usr/local# cp /usr/lib/libwrap.so.3 /var/chroot/stunnel/usr/lib/
www-/usr/local# cp /usr/lib/libc_r.so.4 /var/chroot/stunnel/usr/lib/
www-/usr/local# mkdir -p /var/chroot/stunnel/usr/sbin
www-/usr/local# cp sbin/stunnel /var/chroot/stunnel/usr/sbin/
www-/usr/local# cp /usr/local/etc/stunnel/stunnel.conf-sample /var/chroot/stunnel/usr/local/etc/stunnel/stunnel.conf


Как видим, я скопировал все определенные через ldd библиотеки в chroot – окружение, ну и по ходу пьесы отправил туда собственно бинарник stunnel, создав для него каталог sbin, о котором я не знал еще в тот момент, когда строил структуру для chroot – окружения. Ну и отправил в chroot – окружение конфиг-файл, который, после внимательного изучения мануалов будем редактировать. Следующие действия направлены на заполнение каталога /etc в chroot – окружении


www-/var/chroot/stunnel/etc# cp /etc/hosts /var/chroot/stunnel/etc/
www-/var/chroot/stunnel/etc# cp /etc/host.conf /var/chroot/stunnel/etc/
www-/var/chroot/stunnel/etc# cp /etc/localtime /var/chroot/stunnel/etc/
www-/var/chroot/stunnel/etc# cp /etc/resolv.conf /var/chroot/stunnel/etc/
www-/var/chroot/stunnel/etc# cp /etc/services /var/chroot/stunnel/etc/
www-/var/chroot/stunnel/etc# cp /etc/protocols /var/chroot/stunnel/etc/
www-/var/chroot/stunnel/etc# cp /etc/master.passwd /var/chroot/stunnel/etc/PASSZ


Это тот малый джентльменский набор, без которого ну просто никуда. =) Теперь процесс будет знать конфигурацию хоста, откуда ресолвить имена хостов, корректно писать в логи локальное время, знать соответствие протоколов и сервисов и получит своего пользователя и группу, от которых и будет работать в системе. Редактируем файлы групп и паролей


www-/var/chroot/stunnel/etc# vi group
stunnel:*:7780:

www-/var/chroot/stunnel/etc# vi PASSZ
stunnel:*:7998:7780::0:0:stunnel Daemon:/dev/null:/dev/null

www-/var/chroot/stunnel/etc# pwd_mkdb -d /var/chroot/stunnel/etc PASSZ
www-/var/chroot/stunnel/etc# rm -rf master.passwd
www-/var/chroot/stunnel/etc# ls -lt
total 168
-rw------- 1 root sys 40960 Jan 1 21:54 spwd.db
-rw-r--r-- 1 root sys 40960 Jan 1 21:54 pwd.db
-rw-r--r-- 1 root sys 16 Jan 1 21:50 group
-rw-r--r-- 1 root sys 5752 Jan 1 21:45 protocols
-rw-r--r-- 1 root sys 73544 Jan 1 21:45 services
-rw-r--r-- 1 root sys 39 Jan 1 21:45 resolv.conf
-r--r--r-- 1 root sys 815 Jan 1 21:44 localtime
-rw-r--r-- 1 root sys 205 Jan 1 21:44 host.conf
-rw-r--r-- 1 root sys 150 Jan 1 21:44 hosts


Готово. Этого вполне достаточно, чтобы программа запустилась. В файлах групп и паролей оставлены только stunnel:stunnel, создана база и удалён сам файл master.password, содержащий хэши паролей. Теперь пора приниматься за конфиг. В данном примере сделаем его упрощенным, чтобы сервис стартовал – пока это наша конечная цель в данной главе.


cd www-/var/chroot/stunnel/usr/local/etc/stunnel
vi stunnel.conf

setuid = stunnel
setgid = stunnel
pid = /var/run/stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
output = /var/log/stunnel.log
[https]
accept = 10.0.0.1:443
connect = 127.0.0.1:1080
TIMEOUTclose = 0


Подготовим место для лога и pid- файла

www-/var/chroot/stunnel/usr/local/etc/stunnel# cd /var/chroot/stunnel/var/
www-/var/chroot/stunnel/var# chown stunnel:stunnel *
www-/var/chroot/stunnel/var# ls -l
total 4
drwxr-xr-x 2 stunnel stunnel 512 Jan 1 20:00 log
drwxr-xr-x 2 stunnel stunnel 512 Jan 1 20:08 run


Теперь у процесса заведомо есть права записи в эти каталоги. =)
Ну и пришло время пробного пуска двигателя. Здесь я остановлюсь еще на одном моменте. В портах присутствует утилита chrootuid позволяющая запускать процесс от имени конкретного пользователя. Однако использовать ее имеет смысл только в том случае, если процесс биндится на непривелегированный порт tcp (=>1024). Поехали. Работаем с системной утилитой truss которая поможет нам убрать камни с тернистого пути, ведущего к победе коммунизма :o))


www-/var/chroot/stunnel/var# truss chroot /var/chroot/stunnel /usr/local/sbin/stunnel
mmap(0x0,2048,0x3,0x1000,-1,0x0) = 671477760 (0x2805f000)
munmap(0x2805f000,0x800) = 0 (0x0)
__sysctl(0xbfbffa40,0x2,0x2805df88,0xbfbffa3c,0x0,0x0) = 0 (0x0)
mmap(0x0,32768,0x3,0x1002,-1,0x0) = 671477760 (0x2805f000)
geteuid() = 0 (0x0)
getuid() = 0 (0x0)
getegid() = 0 (0x0)
getgid() = 0 (0x0)
open("/etc/libmap.conf",0x0,0666) ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",0x0,00) = 3 (0x3)
read(0x3,0xbfbffa20,0x80) = 128 (0x80)
lseek(3,0x80,0) = 128 (0x80)
read(0x3,0x28063000,0x37) = 55 (0x37)
close(3) = 0 (0x0)
access("/usr/lib/libc.so.4",0) = 0 (0x0)
open("/usr/lib/libc.so.4",0x0,05001172053) = 3 (0x3)
fstat(3,0xbfbffa68) = 0 (0x0)
read(0x3,0xbfbfea38,0x1000) = 4096 (0x1000)
mmap(0x0,626688,0x5,0x20002,3,0x0) = 671510528 (0x28067000)
mprotect(0x280e8000,0x1000,0x7) = 0 (0x0)
mprotect(0x280e8000,0x1000,0x5) = 0 (0x0)
mmap(0x280e9000,20480,0x3,0x12,3,0x81000) = 672043008 (0x280e9000)
mmap(0x280ee000,73728,0x3,0x1012,-1,0x0) = 672063488 (0x280ee000)
close(3) = 0 (0x0)
mmap(0x0,280,0x3,0x1000,-1,0x0) = 672137216 (0x28100000)
munmap(0x28100000,0x118) = 0 (0x0)
mmap(0x0,13360,0x3,0x1000,-1,0x0) = 672137216 (0x28100000)
munmap(0x28100000,0x3430) = 0 (0x0)
sigaction(SIGILL,0xbfbffac0,0xbfbffaa8) = 0 (0x0)
sigprocmask(0x1,0x0,0x2805debc) = 0 (0x0)
sigaction(SIGILL,0xbfbffaa8,0x0) = 0 (0x0)
sigprocmask(0x1,0x2805de80,0xbfbffae8) = 0 (0x0)
sigprocmask(0x3,0x2805de90,0x0) = 0 (0x0)
chdir(0xbfbffc7b) = 0 (0x0)
chroot(0x8048cf9) = 0 (0x0)
execve(<missing argument>,<missing argument>,<missing argument>)execve(0xbfbffc8f,0xbfbffba0,0xbfbffba8) ERR#2 'No such file or directory'
chroot: write(2,0xbfbff358,8) = 8 (0x8)
/usr/local/sbin/stunnelwrite(2,0xbfbff388,23) = 23 (0x17)
: write(2,0xbfbff348,2) = 2 (0x2)
No such file or directory
write(2,0xbfbff348,26) = 26 (0x1a)
exit(0x1) process exit, rval = 256


Ай-ай-ай, какая глупая ошибка – по указанному пути chroot не нашел бинарник stunnel! :) Не расстраиваемся, а бежим исправляться.


www-/var/chroot/stunnel# cd usr/local/
www-/var/chroot/stunnel/usr/local# ls -l
total 2
drwxr-xr-x 3 root sys 512 Jan 1 22:05 etc
www-/var/chroot/stunnel/usr/local# cd ..
www-/var/chroot/stunnel/usr# ls -l
total 8
drwxr-xr-x 2 root sys 512 Jan 1 21:37 lib
drwxr-xr-x 2 root sys 512 Jan 1 20:08 libexec
drwxr-xr-x 3 root sys 512 Jan 1 19:59 local
drwxr-xr-x 2 root sys 512 Jan 1 21:37 sbin
www-/var/chroot/stunnel/usr# mv sbin local/


Да. Да и еще раз да. Ваш покорный слуга создал каталог /sbin выше, чем local. :o)) Починили? Ключ на старт.


www-/var/chroot/stunnel/usr# truss chroot /var/chroot/stunnel /usr/local/sbin/stunnel
mmap(0x0,2048,0x3,0x1000,-1,0x0) = 671477760 (0x2805f000)
munmap(0x2805f000,0x800) = 0 (0x0)
__sysctl(0xbfbffa4c,0x2,0x2805df88,0xbfbffa48,0x0,0x0) = 0 (0x0)
mmap(0x0,32768,0x3,0x1002,-1,0x0) = 671477760 (0x2805f000)
geteuid() = 0 (0x0)
getuid() = 0 (0x0)
getegid() = 0 (0x0)
getgid() = 0 (0x0)
open("/etc/libmap.conf",0x0,0666) ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",0x0,00) = 3 (0x3)
read(0x3,0xbfbffa2c,0x80) = 128 (0x80)
lseek(3,0x80,0) = 128 (0x80)
read(0x3,0x28063000,0x37) = 55 (0x37)
close(3) = 0 (0x0)
access("/usr/lib/libc.so.4",0) = 0 (0x0)
open("/usr/lib/libc.so.4",0x0,05001172053) = 3 (0x3)
fstat(3,0xbfbffa74) = 0 (0x0)
read(0x3,0xbfbfea44,0x1000) = 4096 (0x1000)
mmap(0x0,626688,0x5,0x20002,3,0x0) = 671510528 (0x28067000)
mprotect(0x280e8000,0x1000,0x7) = 0 (0x0)
mprotect(0x280e8000,0x1000,0x5) = 0 (0x0)
mmap(0x280e9000,20480,0x3,0x12,3,0x81000) = 672043008 (0x280e9000)
mmap(0x280ee000,73728,0x3,0x1012,-1,0x0) = 672063488 (0x280ee000)
close(3) = 0 (0x0)
mmap(0x0,280,0x3,0x1000,-1,0x0) = 672137216 (0x28100000)
munmap(0x28100000,0x118) = 0 (0x0)
mmap(0x0,13360,0x3,0x1000,-1,0x0) = 672137216 (0x28100000)
munmap(0x28100000,0x3430) = 0 (0x0)
sigaction(SIGILL,0xbfbffacc,0xbfbffab4) = 0 (0x0)
sigprocmask(0x1,0x0,0x2805debc) = 0 (0x0)
sigaction(SIGILL,0xbfbffab4,0x0) = 0 (0x0)
sigprocmask(0x1,0x2805de80,0xbfbffaf4) = 0 (0x0)
sigprocmask(0x3,0x2805de90,0x0) = 0 (0x0)
chdir(0xbfbffc87) = 0 (0x0)
chroot(0x8048cf9) = 0 (0x0)
execve(<missing argument>,<missing argument>,<missing argument>)mmap(0x0,2048,0x3,0x1000,-1,0x0) = 671539200 (0x2806e000)
munmap(0x2806e000,0x800) = 0 (0x0)
__sysctl(0xbfbffa70,0x2,0x2806cf88,0xbfbffa6c,0x0,0x0) = 0 (0x0)
mmap(0x0,32768,0x3,0x1002,-1,0x0) = 671539200 (0x2806e000)
geteuid() = 0 (0x0)
getuid() = 0 (0x0)
getegid() = 0 (0x0)
getgid() = 0 (0x0)
open("/etc/libmap.conf",0x0,0666) ERR#2 'No such file or directory'
access("/usr/lib/libutil.so.3",0) = 0 (0x0)
open("/usr/lib/libutil.so.3",0x0,05001362053) = 3 (0x3)
fstat(3,0xbfbffa98) = 0 (0x0)
read(0x3,0xbfbfea68,0x1000) = 4096 (0x1000)
mmap(0x0,36864,0x5,0x20002,3,0x0) = 671571968 (0x28076000)
mprotect(0x2807d000,0x1000,0x7) = 0 (0x0)
mprotect(0x2807d000,0x1000,0x5) = 0 (0x0)
mmap(0x2807e000,4096,0x3,0x12,3,0x7000) = 671604736 (0x2807e000)
close(3) = 0 (0x0)
access("/usr/lib/libssl.so.3",0) = 0 (0x0)
open("/usr/lib/libssl.so.3",0x0,05001362053) = 3 (0x3)
fstat(3,0xbfbffa98) = 0 (0x0)
read(0x3,0xbfbfea68,0x1000) = 4096 (0x1000)
mmap(0x0,192512,0x5,0x20002,3,0x0) = 671608832 (0x2807f000)
mprotect(0x280a9000,0x1000,0x7) = 0 (0x0)
mprotect(0x280a9000,0x1000,0x5) = 0 (0x0)
mmap(0x280aa000,12288,0x3,0x12,3,0x2a000) = 671784960 (0x280aa000)
mmap(0x280ad000,4096,0x3,0x1012,-1,0x0) = 671797248 (0x280ad000)
close(3) = 0 (0x0)
access("/usr/lib/libcrypto.so.3",0) = 0 (0x0)
open("/usr/lib/libcrypto.so.3",0x0,05001362053) = 3 (0x3)
fstat(3,0xbfbffa98) = 0 (0x0)
read(0x3,0xbfbfea68,0x1000) = 4096 (0x1000)
mmap(0x0,1011712,0x5,0x20002,3,0x0) = 671801344 (0x280ae000)
mprotect(0x2818f000,0x1000,0x7) = 0 (0x0)
mprotect(0x2818f000,0x1000,0x5) = 0 (0x0)
mmap(0x28190000,77824,0x3,0x12,3,0xe1000) = 672727040 (0x28190000)
mmap(0x281a3000,8192,0x3,0x1012,-1,0x0) = 672804864 (0x281a3000)
close(3) = 0 (0x0)
access("/usr/lib/libwrap.so.3",0) = 0 (0x0)
open("/usr/lib/libwrap.so.3",0x0,05001362053) = 3 (0x3)
fstat(3,0xbfbffa98) = 0 (0x0)
read(0x3,0xbfbfea68,0x1000) = 4096 (0x1000)
mmap(0x0,32768,0x5,0x20002,3,0x0) = 672813056 (0x281a5000)
mprotect(0x281aa000,0x1000,0x7) = 0 (0x0)
mprotect(0x281aa000,0x1000,0x5) = 0 (0x0)
mmap(0x281ab000,4096,0x3,0x12,3,0x5000) = 672837632 (0x281ab000)
mmap(0x281ac000,4096,0x3,0x1012,-1,0x0) = 672841728 (0x281ac000)
close(3) = 0 (0x0)
access("/usr/lib/libc_r.so.4",0) = 0 (0x0)
open("/usr/lib/libc_r.so.4",0x0,05001362053) = 3 (0x3)
fstat(3,0xbfbffa98) = 0 (0x0)
read(0x3,0xbfbfea68,0x1000) = 4096 (0x1000)
mmap(0x0,745472,0x5,0x20002,3,0x0) = 672845824 (0x281ad000)
mprotect(0x28244000,0x1000,0x7) = 0 (0x0)
mprotect(0x28244000,0x1000,0x5) = 0 (0x0)
mmap(0x28245000,20480,0x3,0x12,3,0x97000) = 673468416 (0x28245000)
mmap(0x2824a000,102400,0x3,0x1012,-1,0x0) = 673488896 (0x2824a000)
close(3) = 0 (0x0)
mmap(0x0,1696,0x3,0x1000,-1,0x0) = 673591296 (0x28263000)
munmap(0x28263000,0x6a0) = 0 (0x0)
mmap(0x0,1400,0x3,0x1000,-1,0x0) = 673591296 (0x28263000)
munmap(0x28263000,0x578) = 0 (0x0)
mmap(0x0,4448,0x3,0x1000,-1,0x0) = 673591296 (0x28263000)
munmap(0x28263000,0x1160) = 0 (0x0)
mmap(0x0,21864,0x3,0x1000,-1,0x0) = 673591296 (0x28263000)
munmap(0x28263000,0x5568) = 0 (0x0)
mmap(0x0,1136,0x3,0x1000,-1,0x0) = 673591296 (0x28263000)
munmap(0x28263000,0x470) = 0 (0x0)
mmap(0x0,16256,0x3,0x1000,-1,0x0) = 673591296 (0x28263000)
munmap(0x28263000,0x3f80) = 0 (0x0)
sigaction(SIGILL,0xbfbffaf0,0xbfbffad8) = 0 (0x0)
sigprocmask(0x1,0x0,0x2806cebc) = 0 (0x0)
sigaction(SIGILL,0xbfbffad8,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
fcntl(0x0,0x3,0x0) = 2 (0x2)
fcntl(0x1,0x3,0x0) = 2 (0x2)
fcntl(0x2,0x3,0x0) = 2 (0x2)
pipe() = 3 (0x3)
fcntl(0x3,0x3,0x0) = 2 (0x2)
fcntl(0x3,0x4,0x6) = 0 (0x0)
fcntl(0x4,0x3,0x0) = 2 (0x2)
fcntl(0x4,0x4,0x6) = 0 (0x0)
readlink("/etc/malloc.conf",0xbfbff944,63) ERR#2 'No such file or directory'
mmap(0x0,4096,0x3,0x1002,-1,0x0) = 673591296 (0x28263000)
break(0x805f000) = 0 (0x0)
break(0x8060000) = 0 (0x0)
break(0x8061000) = 0 (0x0)
break(0x8062000) = 0 (0x0)
__sysctl(0xbfbffa20,0x2,0x28246760,0xbfbffa1c,0x0,0x0) = 0 (0x0)
mmap(0xbfaff000,4096,0x0,0x1000,-1,0x0) = -1078988800 (0xbfaff000)
break(0x8063000) = 0 (0x0)
gettimeofday(0x28246788,0x0) = 0 (0x0)
sigaction(SIGHUP,0x0,0x2825d920) = 0 (0x0)
sigaction(SIGINT,0x0,0x2825d938) = 0 (0x0)
sigaction(SIGQUIT,0x0,0x2825d950) = 0 (0x0)
sigaction(SIGILL,0x0,0x2825d968) = 0 (0x0)
sigaction(SIGTRAP,0x0,0x2825d980) = 0 (0x0)
sigaction(SIGABRT,0x0,0x2825d998) = 0 (0x0)
sigaction(SIGEMT,0x0,0x2825d9b0) = 0 (0x0)
sigaction(SIGFPE,0x0,0x2825d9c8) = 0 (0x0)
sigaction(SIGBUS,0x0,0x2825d9f8) = 0 (0x0)
sigaction(SIGSEGV,0x0,0x2825da10) = 0 (0x0)
sigaction(SIGSYS,0x0,0x2825da28) = 0 (0x0)
sigaction(SIGPIPE,0x0,0x2825da40) = 0 (0x0)
sigaction(SIGALRM,0x0,0x2825da58) = 0 (0x0)
sigaction(SIGTERM,0x0,0x2825da70) = 0 (0x0)
sigaction(SIGURG,0x0,0x2825da88) = 0 (0x0)
sigaction(SIGTSTP,0x0,0x2825dab8) = 0 (0x0)
sigaction(SIGCONT,0x0,0x2825dad0) = 0 (0x0)
sigaction(SIGCHLD,0x0,0x2825dae8) = 0 (0x0)
sigaction(SIGTTIN,0x0,0x2825db00) = 0 (0x0)
sigaction(SIGTTOU,0x0,0x2825db18) = 0 (0x0)
sigaction(SIGIO,0x0,0x2825db30) = 0 (0x0)
sigaction(SIGXCPU,0x0,0x2825db48) = 0 (0x0)
sigaction(SIGXFSZ,0x0,0x2825db60) = 0 (0x0)
sigaction(SIGVTALRM,0x0,0x2825db78) = 0 (0x0)
sigaction(SIGPROF,0x0,0x2825db90) = 0 (0x0)
sigaction(SIGWINCH,0x0,0x2825dba8) = 0 (0x0)
sigaction(SIGINFO,0x0,0x2825dbc0) = 0 (0x0)
sigaction(SIGUSR1,0x0,0x2825dbd8) = 0 (0x0)
sigaction(SIGUSR2,0x0,0x2825dbf0) = 0 (0x0)
sigaction(SIGPROF,0xbfbffa28,0x0) = 0 (0x0)
sigaction(SIGINFO,0xbfbffa28,0x0) = 0 (0x0)
sigaction(SIGCHLD,0xbfbffa28,0x0) = 0 (0x0)
sigprocmask(0x3,0x0,0x282467f8) = 0 (0x0)
__sysctl(0xbfbffa20,0x2,0xbfbffa40,0xbfbffa1c,0x0,0x0) = 0 (0x0)
getdtablesize() = 14781 (0x39bd)
break(0x8072000) = 0 (0x0)
break(0x808f000) = 0 (0x0)
break(0x8090000) = 0 (0x0)
fcntl(0x0,0x4,0x6) = 0 (0x0)
fcntl(0x1,0x4,0x6) = 0 (0x0)
fcntl(0x2,0x4,0x6) = 0 (0x0)
break(0x8091000) = 0 (0x0)
sigprocmask(0x1,0x2806ce80,0xbfbffb18) = 0 (0x0)
sigprocmask(0x3,0x2806ce90,0x0) = 0 (0x0)
open("/usr/local/etc/stunnel/stunnel.conf",0x0,00) = 5 (0x5)
fcntl(0x5,0x3,0x0) = 0 (0x0)
fcntl(0x5,0x4,0x4) = 0 (0x0)
fstat(5,0xbfbff880) = 0 (0x0)
break(0x8095000) = 0 (0x0)
read(0x5,0x8091000,0x4000) = 229 (0xe5)
read(0x5,0x8091000,0x4000) = 0 (0x0)
fstat(5,0xbfbff8c0) = 0 (0x0)
fcntl(0x5,0x3,0x0) = 4 (0x4)
fcntl(0x5,0x4,0x0) = 0 (0x0)
close(5) = 0 (0x0)
open("/var/log/stunnel.log",0x209,0640) = 5 (0x5)
fcntl(0x5,0x3,0x0) = 9 (0x9)
fcntl(0x5,0x4,0xd) = 0 (0x0)
fcntl(0x5,0x2,0x1) = 0 (0x0)
getdtablesize() = 14781 (0x39bd)
gettimeofday(0xbfbff848,0x0) = 0 (0x0)
access("/etc/localtime",4) = 0 (0x0)
open("/etc/localtime",0x0,00) = 6 (0x6)
fcntl(0x6,0x3,0x0) = 0 (0x0)
fcntl(0x6,0x4,0x4) = 0 (0x0)
fstat(6,0xbfbff700) = 0 (0x0)
read(0x6,0xbfbfd3f4,0x1f08) = 815 (0x32f)
fstat(6,0xbfbfd340) = 0 (0x0)
fcntl(0x6,0x3,0x0) = 4 (0x4)
fcntl(0x6,0x4,0x0) = 0 (0x0)
close(6) = 0 (0x0)
getpid() = 25391 (0x632f)
fstat(5,0xbfbff4e0) = 0 (0x0)
write(5,0x8091000,137) = 137 (0x89)
stat("/usr/local/etc/stunnel/stunnel.pem",0xbfbffaf0) = 0 (0x0)
sigaction(SIGPIPE,0xbfbffac8,0x0) = 0 (0x0)
sigaction(SIGTERM,0xbfbffad8,0x0) = 0 (0x0)
sigaction(SIGQUIT,0xbfbffac8,0x0) = 0 (0x0)
sigaction(SIGINT,0xbfbffad8,0x0) = 0 (0x0)
sigaction(SIGHUP,0xbfbffac8,0x0) = 0 (0x0)
break(0x8096000) = 0 (0x0)
break(0x8097000) = 0 (0x0)
break(0x8098000) = 0 (0x0)
break(0x8099000) = 0 (0x0)
break(0x809a000) = 0 (0x0)
break(0x809b000) = 0 (0x0)
break(0x809c000) = 0 (0x0)
issetugid() = 0 (0x0)
issetugid() = 0 (0x0)
stat("/root/.rnd",0xbfbff9b0) ERR#2 'No such file or directory'
getpid() = 25391 (0x632f)
open("/dev/urandom",0x8104,00) ERR#2 'No such file or directory'
open("/dev/random",0x8104,00) ERR#2 'No such file or directory'
open("/dev/srandom",0x8104,00) ERR#2 'No such file or directory'
socket(0x1,0x1,0x0) = 6 (0x6)
fcntl(0x6,0x3,0x0) = 2 (0x2)
fcntl(0x6,0x4,0x6) = 0 (0x0)
connect(0x6,{ AF_UNIX "/var/run/egd-pool" },19) ERR#2 'No such file or directory'
fstat(6,0xbfbff670) = 0 (0x0)
close(6) = 0 (0x0)
socket(0x1,0x1,0x0) = 6 (0x6)
fcntl(0x6,0x3,0x0) = 2 (0x2)
fcntl(0x6,0x4,0x6) = 0 (0x0)
connect(0x6,{ AF_UNIX "/dev/egd-pool" },15) ERR#2 'No such file or directory'
fstat(6,0xbfbff670) = 0 (0x0)
close(6) = 0 (0x0)
socket(0x1,0x1,0x0) = 6 (0x6)
fcntl(0x6,0x3,0x0) = 2 (0x2)
fcntl(0x6,0x4,0x6) = 0 (0x0)
connect(0x6,{ AF_UNIX "/etc/egd-pool" },15) ERR#2 'No such file or directory'
fstat(6,0xbfbff670) = 0 (0x0)
close(6) = 0 (0x0)
socket(0x1,0x1,0x0) = 6 (0x6)
fcntl(0x6,0x3,0x0) = 2 (0x2)
fcntl(0x6,0x4,0x6) = 0 (0x0)
connect(0x6,{ AF_UNIX "/etc/entropy" },14) ERR#2 'No such file or directory'
fstat(6,0xbfbff670) = 0 (0x0)
close(6) = 0 (0x0)
getuid() = 0 (0x0)
gettimeofday(0xbfbff8a8,0x0) = 0 (0x0)
stat("/dev/urandom",0xbfbff9b0) ERR#2 'No such file or directory'
stat("/dev/urandom",0xbfbff9b0) ERR#2 'No such file or directory'
gettimeofday(0xbfbff7a8,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,74) = 74 (0x4a)
gettimeofday(0xbfbff798,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,98) = 98 (0x62)
break(0x809d000) = 0 (0x0)
break(0x809e000) = 0 (0x0)
break(0x809f000) = 0 (0x0)
open("/usr/local/etc/stunnel/stunnel.pem",0x0,00) = 6 (0x6)
fcntl(0x6,0x3,0x0) = 0 (0x0)
fcntl(0x6,0x4,0x4) = 0 (0x0)
fstat(6,0xbfbff6d0) = 0 (0x0)
break(0x80a3000) = 0 (0x0)
read(0x6,0x809f000,0x4000) = 1571 (0x623)
read(0x6,0x809f000,0x4000) = 0 (0x0)
fstat(6,0xbfbff9c0) = 0 (0x0)
fcntl(0x6,0x3,0x0) = 4 (0x4)
fcntl(0x6,0x4,0x0) = 0 (0x0)
close(6) = 0 (0x0)
gettimeofday(0xbfbff8b8,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,91) = 91 (0x5b)
gettimeofday(0xbfbff8a8,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,88) = 88 (0x58)
open("/usr/local/etc/stunnel/stunnel.pem",0x0,00) = 6 (0x6)
fcntl(0x6,0x3,0x0) = 0 (0x0)
fcntl(0x6,0x4,0x4) = 0 (0x0)
fstat(6,0xbfbff2e0) = 0 (0x0)
read(0x6,0x809e000,0x4000) = 1571 (0x623)
fstat(6,0xbfbff9c0) = 0 (0x0)
fcntl(0x6,0x3,0x0) = 4 (0x4)
fcntl(0x6,0x4,0x0) = 0 (0x0)
close(6) = 0 (0x0)
getrlimit(0x8,0xbfbff8f0) = 0 (0x0)
gettimeofday(0xbfbff698,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,97) = 97 (0x61)
gettimeofday(0xbfbff688,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,98) = 98 (0x62)
gettimeofday(0xbfbff698,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,64) = 64 (0x40)
pipe() = 6 (0x6)
fcntl(0x6,0x3,0x0) = 2 (0x2)
fcntl(0x6,0x4,0x6) = 0 (0x0)
fcntl(0x7,0x3,0x0) = 2 (0x2)
fcntl(0x7,0x4,0x6) = 0 (0x0)
fcntl(0x6,0x4,0x6) = 0 (0x0)
fcntl(0x6,0x3,0x0) = 6 (0x6)
gettimeofday(0xbfbff620,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,69) = 69 (0x45)
fcntl(0x7,0x4,0x6) = 0 (0x0)
fcntl(0x7,0x3,0x0) = 6 (0x6)
gettimeofday(0xbfbff610,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,69) = 69 (0x45)
fcntl(0x6,0x2,0x1) = 0 (0x0)
fcntl(0x7,0x2,0x1) = 0 (0x0)
socket(0x2,0x1,0x0) = 8 (0x8)
fcntl(0x8,0x3,0x0) = 2 (0x2)
fcntl(0x8,0x4,0x6) = 0 (0x0)
fcntl(0x8,0x4,0x6) = 0 (0x0)
fcntl(0x8,0x3,0x0) = 6 (0x6)
gettimeofday(0xbfbff648,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,69) = 69 (0x45)
setsockopt(0x8,0xffff,0x4,0x8058528,0x4) = 0 (0x0)
gettimeofday(0xbfbff678,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,84) = 84 (0x54)
bind(0x8,{ AF_INET 10.0.0.1:443 },16) = 0 (0x0)
gettimeofday(0xbfbff6a8,0x0) = 0 (0x0)
getpid() = 25391 (0x632f)
write(5,0x8091000,76) = 76 (0x4c)
listen(0x8,0x5) = 0 (0x0)
fcntl(0x8,0x2,0x1) = 0 (0x0)
fork() = 25392 (0x6330)
setitimer(0x2,0xbfbff8c0,0x0) = 0 (0x0)
close(3) = 0 (0x0)
close(4) = 0 (0x0)
fcntl(0x0,0x3,0x0) = 6 (0x6)
fcntl(0x0,0x4,0x2) = 0 (0x0)
fcntl(0x1,0x3,0x0) = 2 (0x2)
fcntl(0x1,0x4,0x2) = 0 (0x0)
fcntl(0x2,0x3,0x0) = 2 (0x2)
fcntl(0x2,0x4,0x2) = 0 (0x0)
fcntl(0x5,0x3,0x0) = 13 (0xd)
fcntl(0x5,0x4,0x9) = 0 (0x0)
exit(0x0) process exit, rval = 0


Страшно? Мне тоже. =) Но в конце листинга видим заветную фразу fork() = 25392 (0x6330) ! Неужто форкнулись?!! Проверяем, что счастье так близко


www-/var/chroot/stunnel/usr# netstat -na | grep LISTEN

tcp4 0 0 10.0.0.1.443 *.* LISTEN


Согласно нашему конфигу – стартовали и прибиндились к 443 tcp. Адрес только нужно ставить в конфиге реальный. В моем примере он заменен на “левый” 10.0.0.1. Глянем в лог для порядка.


www-/var/chroot/stunnel/var/log# vi stunnel.log
2005.01.01 22:17:07 LOG5[25391:134610944]: stunnel 4.06 on i386-unknown-freebsd4.10 PTHREAD+POLL+LIBWRAP with OpenSSL 0.9.7d 17 Mar 2004
2005.01.01 22:17:07 LOG6[25391:134610944]: PRNG seeded with 0 bytes total
2005.01.01 22:17:07 LOG4[25391:134610944]: PRNG may not have been seeded with enough random bytes
2005.01.01 22:17:07 LOG7[25391:134610944]: Certificate: /usr/local/etc/stunnel/stunnel.pem
2005.01.01 22:17:07 LOG7[25391:134610944]: Key file: /usr/local/etc/stunnel/stunnel.pem
2005.01.01 22:17:07 LOG6[25391:134610944]: file ulimit = 14781 (can be changed with 'ulimit -n')
2005.01.01 22:17:07 LOG6[25391:134610944]: poll() used - no FD_SETSIZE limit for file descriptors
2005.01.01 22:17:07 LOG5[25391:134610944]: 7217 clients allowed
2005.01.01 22:17:07 LOG7[25391:134610944]: FD 6 in non-blocking mode
2005.01.01 22:17:07 LOG7[25391:134610944]: FD 7 in non-blocking mode
2005.01.01 22:17:07 LOG7[25391:134610944]: FD 8 in non-blocking mode
2005.01.01 22:17:07 LOG7[25391:134610944]: SO_REUSEADDR option set on accept socket
2005.01.01 22:17:07 LOG7[25391:134610944]: https bound to 10.0.0.1:443
2005.01.01 22:17:07 LOG7[25392:134610944]: Created pid file /var/run/stunnel.pid


И правда работает! :)) Вопрос – а насколько корректно? Вникаем неспешно в результаты работы трейсера. Смотрим, какие были ошибки при запуске.


open("/etc/libmap.conf",0x0,0666) ERR#2 'No such file or directory'
readlink("/etc/malloc.conf",0xbfbff944,63) ERR#2 'No such file or directory'


Это не критично. Убедиться в этом можно, сделав трэйс программы вне chroot’a. Они и там будут – программа замечательно работает и без этих файлов.


stat("/root/.rnd",0xbfbff9b0) ERR#2 'No such file or directory'
getpid() = 25391 (0x632f)
open("/dev/urandom",0x8104,00) ERR#2 'No such file or directory'
[code]

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

[code]
www-/var/chroot/stunnel/var/log# cd ..
www-/var/chroot/stunnel/var# cd run/
www-/var/chroot/stunnel/var/run# kill `cat stunnel.pid`
www-/var/chroot/stunnel/var/run# ls -l
total 2
-r--r--r-- 1 root sys 183 Jan 1 20:08 ld-elf.so.hints


Грохнули процесс. Теперь добавляем недостающее.


www-/var/chroot/stunnel/var/log# cd ..
www-/var/chroot/stunnel/var# cd run/
www-/var/chroot/stunnel/var/run# kill `cat stunnel.pid`
www-/var/chroot/stunnel/var/run# ls -l
total 2
-r--r--r-- 1 root sys 183 Jan 1 20:08 ld-elf.so.hints
www-/var/chroot/stunnel/var/run# cd /root/
www-~# ls -l
total 50
-rw------- 1 root wheel 2232 Feb 26 2002 .bash_history
drwxr-xr-x 2 root wheel 512 Oct 22 11:48 .ccache
-rw-r--r-- 2 root wheel 802 Jan 28 2002 .cshrc
-rw------- 1 root wheel 388 Feb 12 2002 .history
-rw-r--r-- 1 root wheel 142 Jan 28 2002 .klogin
drwx------ 2 root wheel 512 Aug 2 10:10 .links
-rw-r--r-- 1 root wheel 297 Jan 28 2002 .login
drwxr-xr-x 3 root wheel 512 Sep 21 11:13 .mc
-rw------- 1 root wheel 25255 Dec 25 16:24 .mysql_history
-rw-r--r-- 2 root wheel 251 Jan 28 2002 .profile
-rw------- 1 root wheel 1024 Oct 28 20:34 .rnd
drwx------ 2 root wheel 512 Sep 9 2002 .ssh
www-~# mkdir -p /var/chroot/stunnel/root
www-~# cp .rnd /var/chroot/stunnel/root
www-~# ls -l /var/chroot/stunnel/root
total 2
-rw------- 1 root sys 1024 Jan 1 22:43 .rnd
www-~# ls -l /dev/urandom
crw-r--r-- 1 root wheel 2, 4 May 29 2004 /dev/urandom
www-~# cd /var/chroot/stunnel/dev/
www-/var/chroot/stunnel/dev# mknod urandom c 2 4
www-/var/chroot/stunnel/dev# ls -l
total 0
crw-rw-rw- 1 root sys 2, 2 Jan 1 20:05 null
crw-r--r-- 1 root sys 2, 4 Jan 1 22:45 urandom


Опять ключ на старт. И да поможет нам всевидящий truss! :))
Не буду снова приводить здесь листинг работы truss. Скажу только, что теперь ошибки исчезли. Заглянем для очистки совести в лог


2005.01.01 22:41:52 LOG5[25392:134610944]: Received signal 15; terminating
2005.01.01 22:41:52 LOG7[25392:134610944]: removing pid file /var/run/stunnel.pid


2005.01.01 22:46:54 LOG5[25425:134610944]: stunnel 4.06 on i386-unknown-freebsd4.10 PTHREAD+POLL+LIBWRAP with OpenSSL 0.9.7d 17 Mar 2004
2005.01.01 22:46:54 LOG7[25425:134610944]: Snagged 64 random bytes from /root/.rnd
2005.01.01 22:46:54 LOG7[25425:134610944]: Wrote 1024 new random bytes to /root/.rnd
2005.01.01 22:46:54 LOG7[25425:134610944]: RAND_status claims sufficient entropy for the PRNG
2005.01.01 22:46:54 LOG6[25425:134610944]: PRNG seeded successfully
2005.01.01 22:46:54 LOG7[25425:134610944]: Certificate: /usr/local/etc/stunnel/stunnel.pem
2005.01.01 22:46:54 LOG7[25425:134610944]: Key file: /usr/local/etc/stunnel/stunnel.pem
2005.01.01 22:46:54 LOG6[25425:134610944]: file ulimit = 14781 (can be changed with 'ulimit -n')
2005.01.01 22:46:54 LOG6[25425:134610944]: poll() used - no FD_SETSIZE limit for file descriptors
2005.01.01 22:46:54 LOG5[25425:134610944]: 7217 clients allowed
2005.01.01 22:46:54 LOG7[25425:134610944]: FD 6 in non-blocking mode
2005.01.01 22:46:54 LOG7[25425:134610944]: FD 7 in non-blocking mode
2005.01.01 22:46:54 LOG7[25425:134610944]: FD 8 in non-blocking mode
2005.01.01 22:46:54 LOG7[25425:134610944]: SO_REUSEADDR option set on accept socket
2005.01.01 22:46:54 LOG7[25425:134610944]: https bound to 10.0.0.1:443
2005.01.01 22:46:54 LOG7[25426:134610944]: Created pid file /var/run/stunnel.pid


На сей раз похоже, что всё – нирвана. Некорректностей не наблюдается. Немножко еще проверим себя, чтоб убедиться в окончательной победе =)


www-/var/chroot/stunnel/var/log# netstat -na | grep LISTEN
tcp4 0 0 10.0.0.1.443 *.* LISTEN

telnet 10.0.0.1 443
Trying 10.0.0.1...
Connected to myhost.ru.
Escape character is '^]'.
^]
telnet> q
Connection closed.

vi stunnel.log

2005.01.01 22:52:14 LOG7[25426:134610944]: https accepted FD=9 from 10.0.0.1:3216
2005.01.01 22:52:14 LOG7[25426:134610944]: FD 9 in non-blocking mode
2005.01.01 22:52:14 LOG7[25426:134614016]: https started
2005.01.01 22:52:14 LOG7[25426:134614016]: TCP_NODELAY option set on local socket
10.0.0.1:3216
2005.01.01 22:52:14 LOG7[25426:134614016]: SSL state (accept): before/accept initialization
2005.01.01 22:52:32 LOG3[25426:134614016]: SSL_accept: Peer suddenly disconnected
2005.01.01 22:52:32 LOG7[25426:134614016]: https finished (0 left)

www-/var/chroot/stunnel/var/log# ps axfu | grep stunnel
stunnel 25426 0.0 0.4 2776 1988 ?? Ss 10:46PM 0:00.01 /usr/local/sbin/stunnel


Ну чтож, можете обнять себя и расцеловать или даже перепрыгнуть на радостях через самого себя с разбегу! :)) Задача решена и конечная цель достигнута. Проанализируйте сделанное и определитесь – все ли понятно. Зачем нам это было нужно станет ясно в следующей главе (почему именно stunnel). В данном конкретном примере мной ставилась цель – детально и максимально подробно рассказать и показать, как создается chroot- окружение и как в нем запускаются сервисы.

И еще вот пожалуй что – вопросы, пожелания и предложения можно пока постить в этом треде. Потом, когда цикл статей будет мной закончен, я разделю треды на собственно статьи и возникшее в процессе работы FAQ (если конечно это кого-нибудь заинтересует) :lol:

Macmep  02-01-2005 15:31
Прежде чем перейти к изложению следующей части материала, хочу высказать еще несколько соображений относительно применения технологий chroot и jail. Очевидно, что использование их имеет смысл только в том случае, если изолированный процесс не может использовать файловую систему выше уровня своей “скорлупы”. Любые линки наружу категорически запрещены. Какие же существуют способы взаимодействия процессов, каждый из которых заключен в своё chroot – окружение? Первый и самый очевидный – это по TCP. Разместив, например, внутри корневого каталога /chroot два chroot – окружения, первый – apache, содержащий известный всем и горячо любимый народом веб-сервер, второй – mysql с не менее популярной БД, мы биндим мускул к локалхосту (ключ --bind-address=127.0.0.1 в строке запуска mysqld) и считаем вопрос решенным. Более красивое решение с точки зрения производительности связки апач+сиквель – это работа через unix-socket файл. При нагруженных сервисах работа через сокет-файл добавляет до 10% производительности этой конструкции. Решение вопроса не представляется мне сложным. Будем использовать хардлинк между двумя chroot-системами, который, как уже очевидно, создается на уровне каталога /chroot

cd /var/chroot
ln mysql/tmp/mysql.sock apache/tmp/mysql.sock

Нюансы такого решения следующие. При написании стартовых скриптов в /usr/local/etc/rc.d имена их следует создавать таким образом, чтобы сиквель всегда стартовал раньше апача

cd /usr/local/etc/rc.d
ls –l
001.mysql.sh
002.apache.sh

Останавливать процессы следует в обратной последовательности. В скрипте старта сиквеля следует предусмотреть команду, которая ремувит сокет-файлы сразу после остановки mysqld и, соответственно, создает хардлинк сразу после старта сиквеля, но до момента запуска апача.
Ну и последний, испробованный мной метод, это применить NFS. В четвертой линейке FreeBSD начиная кажется с 4.5 (могу ошибиться – поправьте) nfs абсолютно корректно работает на том хосте, где запущен nfs – сервер. Таким способом можно отдавать кусок файловой системы для совместного использования нескольким jail – машинам. В варианте chroot можно создавать nfs – шару на одном уровне со всеми chroot – окружениями.
В заключение этого лирического отступления, хочу сказать, что технология chroot является весьма гибкой и при наличии упорства и желания можно исполнять весьма оригинальные вещи. =) В частности, в процессе экспериментов, мне удалось собрать систему из трех postfix и трех courier-imap, которые обслуживали три разных почтовых домена, каждый со своим SSL –сертификатом, выдававшими корректные RFC-822 заголовки, использовавшие общий каталог для хранения сообщений, доступный как раз по NFS и проверяемый на вирусы drwebd. Однако задача написать тутор на эту тему у меня не стоит даже в самых отдаленных планах, так как способов разрулить мультидоменную почту существует масса, хотя в первом приближении, если на всех доменах должна быть корректная работа с SSL, то это поддерживается уже коммерческими продуктами типа Communigate Pro. Хотя, врать не буду, я никогда не пробовал в качестве MTA, скажем кумыл или экзим, возможно, что они это делают еще красивей, но, к сожалению в сутках всего лишь 24 часа из которых хочется хотя бы 5 отдавать сну. ;)

Macmep  03-01-2005 23:05
Глава 3. Stunnel, как оружие пролетариата.

Для начала небольшая предыстория проливающая свет на вопрос, по какой же все-таки причине я решил так плотно заняться юзаньем stunnel и во что это в конечном итоге вылилось. :o)) Однажды один очень хороший человек обратился ко мне с просьбой помочь другому очень хорошему человеку. Суть проблемы состояла в том, что злобный и гадкий админ (а другие в природе разве бывают, а?) заткнул на своей проксе ресурсы, чрезвычайно человеку нужные. Первое предложение звучала примерно так: “ Можешь у себя быстренько повесить socks и отдать его в работу?” А в чем проблема то? Конечно можно… Только вот неожиданно выяснилось, что в той сетке, откуда нужно попасть на socks, у юзеров (а может и во всей подсети) отрублен NAT. Значит путь наружу один – через проксю, а над ней то админ и колдует, рисуя злобные запреты на ресурсы. Стало ясно, что выход один – туннелирование трафика через прокси. Изучив достаточно много документации по этому вопросу, в том числе и весьма неплохой обзор http://www.wapbbs.com/bbs/showthread.php?t=29816&highlight=httport я пришел к выводу, что решения есть, но они меня не устраивают. Понятно, что коммерческая тулзень настоящему индейцу не помеха, но весь этот софт желал иметь серверную часть на виндовозе, что меня уже ну никак не устраивало. Для меня всегда был и остается одним из наиболее значимых, девиз – “выставить виндовый сервис в инет – это равносильно тому, что сесть голой жопой на раскаленную сковороду”. Почему? Да потому, что уровень моих знаний виндовоза не позволяет мне осуществлять такие решения. При этом мне известны люди, более того, мои хорошие друзья, которые работают с виндовыми серверами, но уровень их знаний в этом вопросе соответствует экспертному. =) Итак, я искал сервер, который будет работать на фре и вспомнил, как довольно давно наткнулся на stunnel, когда решал вопрос с pop3-ssl, но потом, перебравшись на courier-imap, его благополучно забросил. Посетив www.stunnel.org я выяснил, что существует патч, позволяющий пробрасывать ssl-туннель через прокси с включенной поддержкой CONNECT. Остановлюсь немного на этой функции proxy-сервера на примере популярного squid. Если заглянуть в конфиг сквида в его раздел # ACCESS CONTROLS, то можно подчерпнуть следующую полезную информацию


#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

# TAG: http_access
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports


Короче, лично мне еще не попадался до такой степени отмороженный админ, который закрывал на проксе CONNECT при соединении на внешний порт по https :)) В нашей ситуации все оказалось хорошо – соединения по https проходили без вопросов. Осталось решить последнюю задачу, которая оказалась для меня весьма нетривиальной. Все на том же www.stunnel.org доступна версия бинарника, скомпиленная под винду вместе dll – ками. Фактически – готовый клиент, но не умеющий ходить через прокс :( Итак, имеем сорцы плюс патч connect-proxy.mwald.patch и очень хочется собрать виндового клиента. Под фрей и для нее – минутное дело, а вот под виндовоз… Короче, после установки на фре mingw32 , который самими разработчиками stunnel позиционируется, как единственный компилятор, выдающий рабочие продукты и пары часов безуспешной битвы с сорцами, отчаяшись подоткнуть все необходимые инклуды, я обратился за помощью к Ноп’у aka 0x90, автору известного опуса http://www.wapbbs.com/bbs/showthread.php?t=66034, который со свойственным ему упорством, вооружившись напильником, пропатчил, выправил сорцы и собрал живую и рабочую версию! В-принципе, мои планы таковы, что я собираюсь предоставить здесь Нопу отдельную главу для написания тутора по созданию живой проги. =)) В этом он мне не откажет, но вот открытым остается вопрос свободного времени. Подождем автора и в любом случае, несколько позже, а дам линк для скачивания пропатченной версии, которой пользуется уже немалое количество народа. :)

Итак, что мы получаем в сухом остатке:

1. Готовое решение для создания туннеля через прокси с поддержкой CONNECT.
2. Соединение с достаточной степенью надежности защищено от сниффинга в локальной сети, читай от того же гадского админа. =)
3. Пароль на приватный ключ клиентского SSL – сертификата является дополнительным средством защиты от несанкционированного доступа к сервису.
4. Вход в туннель осуществляется по TCP на локалхосте со стороны клиентской машины, а выход на локалхосте сервера. Таким образом, прибиндив на серверной стороне на локалхосте требуемый клиенту сервис (proxy, socks) мы предоставляем клиенту широкие возможности для действий.
5. stunnel весьма удобное средство, если клиентская программа по каким-либо причинам не поддерживает SSL сервис, или работает с ним некорректно а на сервере эти функции реализованы ( например старые версии почтового клиента The Bat!)
6. При определенном полёте фантазии можно использовать stunnel, как достойную замену вечнодырявому модулю апача mod_ssl. Проверено – работает корректно.
7. Авторизация доверенных клиентских сертификатов – вполне надежное средство ограничения доступа к сервисам. Если при этом сам сервис имеет собственные средства авторизации, то можно рассматривать эту функцию, как дополнительный рубеж защиты.

Как грамотно поднять сервер stunnel на FreeBSD мы рассмотрели в предыдущей главе. Теперь я хочу подробно остановиться на вопросе использования механизма авторизации SSL с использованием списка доверенных клиентских сертификатов.

1. Создадим серверные сертификаты с использованием стандартного скрипта CA.sh из комплекта openssl. Можно конечно сделать все ручками, и диры для сертов и ключей создать и свой конфиг написать, но лениво. :o))


www-/var/chroot/stunnel/usr/local/etc/stunnel# cd /var/chroot/
www-/var/chroot# mkdir certs
www-/var/chroot# locate CA.sh

/usr/src/crypto/openssl/apps/CA.sh

www-/var/chroot# cp /usr/src/crypto/openssl/apps/CA.sh /var/chroot/certs/
www-/var/chroot# cd /var/chroot/certs
www-/var/chroot/certs# chmod 0700 CA.sh


Готово? Теперь слегка поправим скрипт CA.sh Дело в том, что по умолчанию собственный доверенный сертификат (Certificate Authority – он же CA), которым мы будем подписывать сертификат нашего сервера stunnel, равно как и серверный серт, будут созданы с зашифрованными закрытыми ключами. Это конечно супер - правильно с точки зрения безопасности, но вот сервис stunnel будет стартовать только при вводе пароля на закрытый ключ сертификата, таким образом мы лишимся автоматического запуска сервиса в случае перезагрузки сервера. Я предпочитаю, как это делалось выше, поставить на серт сервера права 0600, а не шифровать закрытый ключ. При этом вероятность компрометации сертификата возрастает, так что решать вам самим.
Итак, находим в скрипте CA.sh строки:
1. В секции -newca) в строке


$REQ -new -nodes -x509 -keyout ${CATOP}/private/$CAKEY \


2. В секции -newcert) в строке


$REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS


Опция -nodes - не шифровать закрытый ключ. Теперь генерим сертификат CA.


./CA.sh -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
.................................++++++
...++++++
writing new private key to './demoCA/private/./cakey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:Master
Email Address []:.


Особо любопытные личности могут исследовать результат работы скрипта =)


www-/var/chroot/certs# openssl rsa -noout -text -in demoCA/private/cakey.pem
Private-Key: (1024 bit)
modulus:
00:ab:95:01:cb:c2:1e:3f:7a:68:7b:93:72:21:e6:
2a:43:6f:a0:f7:d8:6a:11:3e:9f:3f:91:3d:c4:6f:
ce:ea:08:36:48:25:fa:4c:2e:7f:f6:03:c3:6f:8d:
56:a4:12:f0:0c:49:79:ca:75:01:f3:77:67:0a:f9:
28:1b:8d:4c:00:ca:c1:3f:6d:74:e4:07:21:dd:8c:
a4:36:bc:e3:90:3e:76:a4:68:22:35:ad:bb:c1:61:
bf:82:13:6b:e6:d0:97:8b:eb:f6:90:c6:ff:8f:f3:
51:47:a8:80:1a:05:b5:78:b1:ec:cb:47:6c:7e:e0:
5a:22:e8:58:04:ee:ad:6c:dd
publicExponent: 65537 (0x10001)
privateExponent:
56:7b:c7:a8:f5:52:1b:ba:ce:39:23:6b:8e:ac:9d:
b6:d9:e8:2f:a4:94:69:d6:bf:9b:e1:d0:59:57:e5:
da:4e:83:55:c0:56:b5:d9:66:44:11:47:8b:cd:98:
d3:20:7c:80:24:f4:cf:58:44:c0:7b:f9:a3:2d:4c:
ca:fe:60:44:de:a0:93:af:b2:e8:d6:8c:52:de:40:
62:6c:13:c8:8c:ac:15:24:de:8d:b9:54:c8:be:67:
80:14:8a:04:e4:7d:8e:05:85:71:87:8d:7e:bc:d4:
c6:d5:ff:1d:73:1c:fd:1a:8a:61:ec:58:78:6e:59:
c8:b9:90:ec:3f:3f:86:7d
prime1:
00:d4:b5:65:a5:5a:82:33:e2:36:32:c4:70:58:a2:
3c:5e:7d:e4:6a:62:62:ef:b3:24:8a:22:cc:82:ef:
56:1d:70:1b:84:59:59:a3:53:ba:ac:80:e9:3f:57:
17:6b:64:55:d5:64:8f:29:95:68:e7:25:d7:c5:7c:
7e:a8:70:2c:17
prime2:
00:ce:80:d2:fb:a0:85:0b:6b:0a:b1:0e:c5:be:ab:
ba:56:ed:36:3f:05:4b:b9:ca:61:88:06:fc:91:68:
75:76:86:11:78:02:57:ac:52:de:e0:49:9a:16:11:
23:22:82:4c:a4:f8:4b:31:2c:46:0e:04:c5:5f:17:
86:6d:94:43:2b
exponent1:
00:b8:cf:26:92:85:51:ed:1c:55:34:c4:c2:4b:f0:
21:7d:83:ea:2a:98:73:17:8a:51:6c:07:92:23:0d:
29:88:08:38:90:44:45:82:87:a4:00:6f:3c:b9:00:
c5:63:54:58:d3:40:3c:b6:c7:8e:ce:8e:6d:ab:b3:
60:24:9e:d9:5f
exponent2:
4a:d8:24:1f:f1:20:e7:6f:87:73:7e:e0:2a:e8:40:
e4:4a:9b:73:a1:ee:bd:4a:dd:a8:98:a7:a7:e8:0d:
52:c4:ea:c5:ed:4b:6b:78:a9:b0:ee:dc:3b:0d:41:
07:bb:e4:1d:92:a4:66:11:1e:de:eb:d9:c1:4a:5c:
7d:90:d3:fb
coefficient:
02:78:d2:15:55:ed:b1:24:67:16:38:a4:32:24:31:
f4:e4:1a:61:d0:26:bc:56:5e:77:b4:8a:7f:1e:14:
32:21:bb:df:bd:1f:cd:48:5c:8a:58:6e:78:4b:3d:
41:5a:e7:29:5c:1a:97:6b:88:1c:bb:6b:7c:02:19:
e5:25:cf:b7

www-/var/chroot/certs# openssl x509 -noout -text -in demoCA/cacert.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 0 (0x0)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=RU, CN=Master
Validity
Not Before: Jan 3 18:23:16 2005 GMT
Not After : Jan 3 18:23:16 2006 GMT
Subject: C=RU, CN=Master
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:ab:95:01:cb:c2:1e:3f:7a:68:7b:93:72:21:e6:
2a:43:6f:a0:f7:d8:6a:11:3e:9f:3f:91:3d:c4:6f:
ce:ea:08:36:48:25:fa:4c:2e:7f:f6:03:c3:6f:8d:
56:a4:12:f0:0c:49:79:ca:75:01:f3:77:67:0a:f9:
28:1b:8d:4c:00:ca:c1:3f:6d:74:e4:07:21:dd:8c:
a4:36:bc:e3:90:3e:76:a4:68:22:35:ad:bb:c1:61:
bf:82:13:6b:e6:d0:97:8b:eb:f6:90:c6:ff:8f:f3:
51:47:a8:80:1a:05:b5:78:b1:ec:cb:47:6c:7e:e0:
5a:22:e8:58:04:ee:ad:6c:dd
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
8B:C0:8D:5B:7C:79:9F:DC:59:50:19:A8:BA:50:1B:03:B5:C3:4F:E5
X509v3 Authority Key Identifier:
keyid:8B:C0:8D:5B:7C:79:9F:DC:59:50:19:A8:BA:50:1B:03:B5:C3:4F:E5
DirName:/C=RU/CN=Master
serial:00

X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: md5WithRSAEncryption
99:d3:11:35:23:69:bb:ee:99:3d:9a:a1:40:a1:2c:44:08:43:
b2:29:3d:2e:76:a5:f3:06:0f:90:39:16:30:07:e8:85:9f:c2:
dd:9c:76:61:44:d2:13:18:2e:79:77:4b:f5:9f:a1:0b:e5:ba:
5b:89:a0:0f:9a:d9:24:ed:36:61:8d:a8:7e:b0:b8:bf:63:cb:
0d:52:86:40:bc:3d:c9:96:5c:bc:e2:df:e3:88:45:77:51:07:
73:2a:17:3d:ac:e7:70:71:23:44:c2:ad:18:df:c7:1f:ed:9e:
e4:77:b9:79:fd:08:a6:e3:6d:eb:b8:03:68:44:94:67:e0:40:
25:d2


Готово? Теперь сгенерим сертификат нашего сервера stunnel. Первый этап – это создание запроса на сертификат (Certificate Signing Request):


www-/var/chroot/certs# ./CA.sh -newreq
Generating a 1024 bit RSA private key
..++++++
.++++++
writing new private key to 'newreq.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:myhost.ru
Email Address []:.

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:qwerty
An optional company name []:
Request (and private key) is in newreq.pem


Посмотреть содержание запроса в удобоваримой форме можно следующим образом:


www-/var/chroot/certs# openssl req -noout -text -in newreq.pem
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=RU, CN=myhost.ru
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:a0:16:34:18:7f:5e:b1:e5:11:2b:96:67:b3:ab:
62:58:30:0a:7b:98:fd:f8:34:5a:24:28:96:63:59:
1e:68:87:0d:5a:a6:6c:f5:60:5c:bf:22:d5:7f:3c:
ce:2a:fe:85:69:a2:bb:1d:82:f8:70:93:3b:93:9e:
e9:0c:53:47:e0:fa:83:32:af:44:57:f9:5d:36:09:
50:e7:4f:ce:6d:b5:7e:11:13:1b:e2:c0:f6:72:78:
41:1a:5d:8f:f1:42:cf:3a:b6:85:20:08:00:d8:f5:
9e:cf:5c:09:78:33:6d:8d:a4:ea:fe:f4:5c:4c:fd:
1c:d6:20:65:d6:78:19:61:31
Exponent: 65537 (0x10001)
Attributes:
challengePassword :qwerty
Signature Algorithm: md5WithRSAEncryption
06:a1:aa:73:68:f5:f4:63:84:4f:f0:a4:3a:60:b9:25:8e:11:
6c:bc:86:07:41:da:d4:95:63:3b:d6:a0:ed:a0:6f:69:6c:36:
ad:cc:d0:20:67:09:38:a8:e6:a8:35:7b:45:42:fb:9b:46:a3:
92:f7:26:b3:81:46:2a:ef:6f:fe:94:04:92:3c:e8:57:dd:43:
3b:da:4f:80:71:93:62:00:ab:9d:12:29:a9:e0:1f:f8:e7:9f:
49:29:9a:42:d7:ab:c7:26:da:86:73:d1:cf:34:55:6b:cc:6d:
8b:af:f9:d0:9e:4e:33:26:17:39:ff:af:b5:a0:25:fa:a1:51:
f8:7a


Теперь подписываем запрос нашим CA сертификатом:


www-/var/chroot/certs# ./CA.sh -sign
Using configuration from /etc/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jan 3 18:34:38 2005 GMT
Not After : Jan 3 18:34:38 2006 GMT
Subject:
countryName = RU
commonName = myhost.ru
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
7F:38:6A:58:3B:84:60:55:57:84:4E:03:7F:E9:79:D6:A5:46:80:36
X509v3 Authority Key Identifier:
keyid:8B:C0:8D:5B:7C:79:9F:DC:59:50:19:A8:BA:50:1B:03:B5:C3:4F:E5
DirName:/C=RU/CN=Master
serial:00

Certificate is to be certified until Jan 3 18:34:38 2006 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=RU, CN=Master
Validity
Not Before: Jan 3 18:34:38 2005 GMT
Not After : Jan 3 18:34:38 2006 GMT
Subject: C=RU, CN=myhost.ru
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:a0:16:34:18:7f:5e:b1:e5:11:2b:96:67:b3:ab:
62:58:30:0a:7b:98:fd:f8:34:5a:24:28:96:63:59:
1e:68:87:0d:5a:a6:6c:f5:60:5c:bf:22:d5:7f:3c:
ce:2a:fe:85:69:a2:bb:1d:82:f8:70:93:3b:93:9e:
e9:0c:53:47:e0:fa:83:32:af:44:57:f9:5d:36:09:
50:e7:4f:ce:6d:b5:7e:11:13:1b:e2:c0:f6:72:78:
41:1a:5d:8f:f1:42:cf:3a:b6:85:20:08:00:d8:f5:
9e:cf:5c:09:78:33:6d:8d:a4:ea:fe:f4:5c:4c:fd:
1c:d6:20:65:d6:78:19:61:31
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
7F:38:6A:58:3B:84:60:55:57:84:4E:03:7F:E9:79:D6:A5:46:80:36
X509v3 Authority Key Identifier:
keyid:8B:C0:8D:5B:7C:79:9F:DC:59:50:19:A8:BA:50:1B:03:B5:C3:4F:E5
DirName:/C=RU/CN=Master
serial:00

Signature Algorithm: md5WithRSAEncryption
34:20:71:8c:9b:8b:20:ca:93:cb:95:34:f0:70:ba:35:d1:1a:
60:22:60:ee:16:5e:93:30:d6:22:a5:60:7e:fe:85:a4:fe:77:
bc:ab:a3:fa:a7:ad:b5:84:6a:29:eb:b5:30:ea:37:15:6b:39:
f1:db:d3:22:68:ca:0c:e1:02:3a:5e:af:a7:06:1a:53:6e:35:
99:6a:f0:ce:be:f8:d2:6f:22:35:1b:c0:1d:d1:b1:a8:b3:f7:
fc:10:6d:2e:b7:90:54:bf:e5:62:c2:e6:a6:6f:e7:a6:74:40:
a2:39:c3:bb:ca:38:73:f5:79:71:17:9a:79:f7:a2:2d:97:e7:
bc:c0
-----BEGIN CERTIFICATE-----
MIICWTCCAcKgAwIBAgIBATANBgkqhkiG9w0BAQQFADAeMQswCQYDVQQGEwJSVTEP
MA0GA1UEAxMGTWFzdGVyMB4XDTA1MDEwMzE4MzQzOFoXDTA2MDEwMzE4MzQzOFow
ITELMAkGA1UEBhMCUlUxEjAQBgNVBAMTCW15aG9zdC5ydTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAoBY0GH9eseURK5Zns6tiWDAKe5j9+DRaJCiWY1keaIcN
WqZs9WBcvyLVfzzOKv6FaaK7HYL4cJM7k57pDFNH4PqDMq9EV/ldNglQ50/ObbV+
ERMb4sD2cnhBGl2P8ULPOraFIAgA2PWez1wJeDNtjaTq/vRcTP0c1iBl1ngZYTEC
AwEAAaOBozCBoDAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdl
bmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUfzhqWDuEYFVXhE4Df+l51qVG
gDYwRgYDVR0jBD8wPYAUi8CNW3x5n9xZUBmoulAbA7XDT+WhIqQgMB4xCzAJBgNV
BAYTAlJVMQ8wDQYDVQQDEwZNYXN0ZXKCAQAwDQYJKoZIhvcNAQEEBQADgYEANCBx
jJuLIMqTy5U08HC6NdEaYCJg7hZekzDWIqVgfv6FpP53vKuj+qettYRqKeu1MOo3
FWs58dvTImjKDOECOl6vpwYaU241mWrwzr740m8iNRvAHdGxqLP3/BBtLreQVL/l
YsLmpm/npnRAojnDu8o4c/V5cReaefeiLZfnvMA=
-----END CERTIFICATE-----
Signed certificate is in newcert.pem


Объединяя файлы приватного ключа и сертификата получаем заветный сертификат для работы сервера stunnel. Затем складываем его и cacert.pem в chroot-окружение stunnel следующим образом:


www-/var/chroot/certs# cat newreq.pem newcert.pem > stunnel.pem
www-/var/chroot/certs# chmod 0600 stunnel.pem
www-/var/chroot/certs# cp stunnel.pem /var/chroot/stunnel/usr/local/etc/stunnel/
www-/var/chroot/certs# cp demoCA/cacert.pem /var/chroot/stunnel/usr/local/etc/stunnel/


Изменяем конфиг сервера следующим образом:


www-/var/chroot/certs# cd /var/chroot/stunnel/usr/local/etc/stunnel/
www-/var/chroot/stunnel/usr/local/etc/stunnel# mkdir -p /var/chroot/stunnel/cert/trusted
www-/var/chroot/stunnel/usr/local/etc/stunnel# vi stunnel.conf

setuid = stunnel
setgid = stunnel
verify = 3
CApath = /cert/trusted
pid = /var/run/stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
output = /var/log/stunnel.log
[https]
accept = 10.0.0.1:443
connect = 127.0.0.1:80
TIMEOUTclose = 0


Теперь поясню что есть что. Всё детально описано с документации по stunnel, кстати =))
verify = 3 – проверка клиентского сертификата на наличие его в списке доверенных.
CApath = /cert/trusted – путь, где программа ищет доверенные сертификаты, точней, если удосужитесь прочесть маны, слинкованные хэши клиентских серификатов.
debug = 7 – максимально подробные логи отладчика, после того, как все заработает эту опцию следует убрать из конфига, иначе лог будет гигантских размеров.
[https] – собственно секция сервера, указывается на каком внешнем порту и адресе stunnel принимает соединения и к какому порту на локалхосте биндится выход из туннеля (в моем примере это эмуляция работы https).

Теперь мы вплотную приблизились к вопросу создания клиентского сертификата. Оговорюсь сразу, что самый грамотный вариант – это когда клиент генерит приватный ключ, зашифрованный паролем, самостоятельно, а вам для авторизации присылает только сертификат. На виндовозе для этого придется установить пакет OpenSSL для Win (без труда ищется в гугле). Я же свой пример приведу на никсах, так как процесс абсолютно одинаков.


www-/var/chroot/stunnel/usr/local/etc/stunnel# openssl req -x509 -newkey rsa -keyout masterkey.pem -out mastercert.pem -days 365
Generating a 1024 bit RSA private key
........++++++
.........++++++
writing new private key to 'masterkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:-=Macmep=-
Email Address []:.
www-/var/chroot/stunnel/usr/local/etc/stunnel# cat masterkey.pem mastercert.pem > master.pem
www-/var/chroot/stunnel/usr/local/etc/stunnel# vi master.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,92B6CCC97ACC6BF6

eQHq1DEauWS4flv6M3Xlm0k90WlRCCZwysX9OlkJMHvQE2zjNrbG+4zm2P9wTb03
K6gkF3BmZbpWbS91CoJ/04wDysgqS9rldNQR104YhVf/oNZxsrWNqJzNyffmYtpH
WoeR2qmI2wFmHTbmepEVKTYYMU4a6foYh5/vhfgYyc7k1hZ0dLCVqLlY0XFZrkKe
HPwysx6EvXWmzy/DMW1M37wM3VWcgRwKzwATvUPWc4+Olo3qOG6t9pQgEl09hstR
lOXOiPAS5KAKeg8mvJ0cDgIllhOJmLyHD9IUHaIg0WJvPIe81bIsMafsL+z3yEMm
3BHcwsT1LSFOX3Xc+oldO8PDPnbpLbBsqWOnE232M2vETTXfW3RHiDf5TeLoyLh7
hDrNZgBI0why3zke85PzKikgAU8e1JlOtc5bvPI3+3hFLOkev2iVmLFNLP2TkHUY
YNSv59zpE6N5tTai0042DtRGq1lyd9ECjm5WYnE/PBv6q07hbsYWNVO1woYNSuhU
XY94N1k6+piyZtXxYB7BLO7E3OEx/DJMPtuNMoFLqYdkAh6XH+1xgH9ThXflr2bJ
xRCdTN9iSwfElfn1z0bhTJr9reWaGyGwdQZMm7bnSUKj+sgfEG5C8oUW5WIpzMrC
9q/fx2iHS9wp/FXyhYOlAwTmZmq0qy3hVLPzb0SREFn+yPIII9Kg/JtqzwY5+8Hu
d7xtdV1RjmjY5gQqSc6bGSazft3bknhg9EN9g/WhfEVVSDNr4G54mVVdGXlYs7I5
x7jp46BA0VLx1WM4xAcAnJ5BugKmsQRQIGbEFzv0N4TAQEELLiq9rQ==
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICNTCCAZ6gAwIBAgIBADANBgkqhkiG9w0BAQQFADAiMQswCQYDVQQGEwJSVTET
MBEGA1UEAxMKLT1NYWNtZXA9LTAeFw0wNTAxMDMxOTAyMDNaFw0wNjAxMDMxOTAy
MDNaMCIxCzAJBgNVBAYTAlJVMRMwEQYDVQQDEwotPU1hY21lcD0tMIGfMA0GCSqG
SIb3DQEBAQUAA4GNADCBiQKBgQC+4tQ6mcC5vafFGJ3TOr32rhzE4fuh0D4BlJYG
TgovVI0EBa/yU9yAsnCJqoGoyRyyxQ04inHOjsGzq5rhCxsklFQ8T3YoQg4341K3
L/uQ9OApJEN4HhK3gg1pzziotDVjsV0qeHZjDX2B+MntP9AMwoINnWpmioXwBv2R
uczGHQIDAQABo3sweTAdBgNVHQ4EFgQUQCkCxs/YyHU3KT3U8/WMzzM1cWgwSgYD
VR0jBEMwQYAUQCkCxs/YyHU3KT3U8/WMzzM1cWihJqQkMCIxCzAJBgNVBAYTAlJV
MRMwEQYDVQQDEwotPU1hY21lcD0tggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN
AQEEBQADgYEAIZjXZNNeRlNkCd4d4jJPHpmrSvbUqjXV6RfDS6iukxfH1PSBcYOY
FefPVZGsKQtoyCcw8xjW1PSXfmEWURwpQWv0dKhEMYJAk2dVh3c1b2bcwExMOTwC
8Yp0GkgE0jMZNcrWr01nUeKxzqYahdA+4XBTOgFDK54kUICYoRaR//k=
-----END CERTIFICATE-----


Теперь расскажу, что должно быть на стороне виндового клиента. Во-первых это набор скомпиленных под Win бинарника и dll-лек:
1. stunnel-4.06.exe
2. libssl32.dll
3. libeay32.dll
Для тестирования работы системы можно взять эти, не патченные, если конечно вы не заперты наглухо проксом =))
4. cacert.pem – берется с сервера (см. выше) и отдается клиенту.
5. master.pem – клиентские ключ + сертификат (см. выше)
6. stunnel.conf – собственно конфиг клиента
Все эти файлы должны лежать в одном каталоге. Рассмотрим содержимое конфигурационного файла клиента:

CAfile=cacert.pem
cert=master.pem
client=yes
debug=7
verify=2
[https]
accept=127.0.0.1:443
connect=10.0.0.1:443

Здесь добавились следующие параметры:
client=yes – режим клиента
verify=2 – предоставлять серверу клиентский сертификат

Всё. Можно приступать к испытаниям. Сперва не авторизуя клиентский сертификат.
Запускаем сервер stunnel на фре.


www-/var/chroot/stunnel# chroot /var/chroot/stunnel /usr/local/sbin/stunnel
www-/var/chroot/stunnel# tail -f var/log/stunnel.log
2005.01.03 22:24:26 LOG5[36999:134610944]: Peer certificate location /cert/trusted
2005.01.03 22:24:26 LOG6[36999:134610944]: file ulimit = 14781 (can be changed with 'ulimit -n')
2005.01.03 22:24:26 LOG6[36999:134610944]: poll() used - no FD_SETSIZE limit for file descriptors
2005.01.03 22:24:26 LOG5[36999:134610944]: 7217 clients allowed
2005.01.03 22:24:26 LOG7[36999:134610944]: FD 6 in non-blocking mode
2005.01.03 22:24:26 LOG7[36999:134610944]: FD 7 in non-blocking mode
2005.01.03 22:24:26 LOG7[36999:134610944]: FD 8 in non-blocking mode
2005.01.03 22:24:26 LOG7[36999:134610944]: SO_REUSEADDR option set on accept socket
2005.01.03 22:24:26 LOG7[36999:134610944]: https bound to 10.0.0.1:443
2005.01.03 22:24:26 LOG7[37000:134610944]: Created pid file /var/run/stunnel.pid


Всё замечательно. Теперь стартуем клиента на винде. Если все сделано без ошибок, то он запросит пасс к ключу и упадет после запуска в трей. Пнув значок в трее можно читать логи клиента. Вернемся к серверу и посмотрим, как он отреагирует на попытку к нему подключиться. Набираем в браузере клиента https://localhost/ и смотрим логи на сервере (можно и на клиенте глянуть – тоже очень информативно).


2005.01.03 22:28:59 LOG7[37000:134610944]: https accepted FD=9 from 192.168.0.1:1487
2005.01.03 22:28:59 LOG7[37000:134610944]: FD 9 in non-blocking mode
2005.01.03 22:28:59 LOG7[37000:134614016]: https started
2005.01.03 22:28:59 LOG7[37000:134614016]: TCP_NODELAY option set on local socket
2005.01.03 22:28:59 LOG5[37000:134614016]: https connected from 192.168.0.1:1487
2005.01.03 22:28:59 LOG7[37000:134614016]: SSL state (accept): before/accept initialization
2005.01.03 22:28:59 LOG7[37000:134614016]: SSL state (accept): SSLv3 read client hello A
2005.01.03 22:28:59 LOG7[37000:134614016]: SSL state (accept): SSLv3 write server hello A
2005.01.03 22:28:59 LOG7[37000:134614016]: SSL state (accept): SSLv3 write certificate A
2005.01.03 22:28:59 LOG7[37000:134614016]: SSL state (accept): SSLv3 write certificate request A
2005.01.03 22:28:59 LOG7[37000:134614016]: SSL state (accept): SSLv3 flush data
2005.01.03 22:29:01 LOG4[37000:134614016]: VERIFY ERROR: depth=0, error=self signed certificate: /C=RU/CN=-=Macmep=-
2005.01.03 22:29:01 LOG7[37000:134614016]: SSL alert (write): fatal: bad certificate
2005.01.03 22:29:01 LOG3[37000:134614016]: SSL_accept: 140890B2: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
2005.01.03 22:29:01 LOG7[37000:134614016]: https finished (0 left)


Все прекрасно – клиентский серт не авторизован и клиент отправлен к маме. :o)))
Последний шаг – авторизация клиентского сертификата.


www-/var/chroot/certs# locate c_hash
/usr/ports/games/zoom/files/patch-src_hash.c
/usr/src/crypto/openssl/tools/c_hash
www-/var/chroot/certs# cp /usr/src/crypto/openssl/tools/c_hash /var/chroot/certs/
www-/var/chroot/certs# chmod 0700 c_hash
www-/var/chroot/certs# ./c_hash /var/chroot/stunnel/usr/local/etc/stunnel/mastercert.pem
358e4942.0 => /var/chroot/stunnel/usr/local/etc/stunnel/mastercert.pem
www-/var/chroot/certs# cd /var/chroot/stunnel/usr/local/etc/stunnel/
www-/var/chroot/stunnel/usr/local/etc/stunnel# mv mastercert.pem /var/chroot/stunnel/cert/trusted/master.pem
www-/var/chroot/stunnel/usr/local/etc/stunnel# rm -rf master*
www-/var/chroot/stunnel/usr/local/etc/stunnel# cd /var/chroot/stunnel/cert/trusted/
www-/var/chroot/stunnel/cert/trusted# ls -l
total 2
-rw-r--r-- 1 root sys 826 Jan 3 22:02 master.pem
www-/var/chroot/stunnel/cert/trusted# ln -s master.pem 358e4942.0
www-/var/chroot/stunnel/cert/trusted# ls -l
total 2
lrwxr-xr-x 1 root sys 10 Jan 3 22:37 358e4942.0 -> master.pem


И бегом опять смотреть в stunnel.log


2005.01.03 22:39:47 LOG7[37000:134610944]: https accepted FD=9 from 192.168.0.1:1492
2005.01.03 22:39:47 LOG7[37000:134610944]: FD 9 in non-blocking mode
2005.01.03 22:39:47 LOG7[37000:134614016]: https started
2005.01.03 22:39:47 LOG7[37000:134614016]: TCP_NODELAY option set on local socket
2005.01.03 22:39:47 LOG5[37000:134614016]: https connected from 192.168.0.1:1492
2005.01.03 22:39:47 LOG7[37000:134614016]: SSL state (accept): before/accept initialization
2005.01.03 22:39:47 LOG7[37000:134614016]: SSL state (accept): SSLv3 read client hello A
2005.01.03 22:39:47 LOG7[37000:134614016]: SSL state (accept): SSLv3 write server hello A
2005.01.03 22:39:47 LOG7[37000:134614016]: SSL state (accept): SSLv3 write certificate A
2005.01.03 22:39:47 LOG7[37000:134614016]: SSL state (accept): SSLv3 write certificate request A
2005.01.03 22:39:47 LOG7[37000:134614016]: SSL state (accept): SSLv3 flush data
2005.01.03 22:39:49 LOG5[37000:134614016]: VERIFY OK: depth=0, /C=RU/CN=-=Macmep=-
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL state (accept): SSLv3 read client certificate A
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL state (accept): SSLv3 read client key exchange A
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL state (accept): SSLv3 read certificate verify A
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL state (accept): SSLv3 read finished A
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL state (accept): SSLv3 write change cipher spec A
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL state (accept): SSLv3 write finished A
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL state (accept): SSLv3 flush data
2005.01.03 22:39:49 LOG7[37000:134614016]: 1 items in the session cache
2005.01.03 22:39:49 LOG7[37000:134614016]: 0 client connects (SSL_connect())
2005.01.03 22:39:49 LOG7[37000:134614016]: 0 client connects that finished
2005.01.03 22:39:49 LOG7[37000:134614016]: 0 client renegotiatations requested
2005.01.03 22:39:49 LOG7[37000:134614016]: 3 server connects (SSL_accept())
2005.01.03 22:39:49 LOG7[37000:134614016]: 1 server connects that finished
2005.01.03 22:39:49 LOG7[37000:134614016]: 0 server renegotiatiations requested
2005.01.03 22:39:49 LOG7[37000:134614016]: 0 session cache hits
2005.01.03 22:39:49 LOG7[37000:134614016]: 0 session cache misses
2005.01.03 22:39:49 LOG7[37000:134614016]: 0 session cache timeouts
2005.01.03 22:39:49 LOG6[37000:134614016]: SSL accepted: new session negotiated
2005.01.03 22:39:49 LOG6[37000:134614016]: Negotiated ciphers: AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
2005.01.03 22:39:49 LOG7[37000:134614016]: FD 10 in non-blocking mode
2005.01.03 22:39:49 LOG7[37000:134614016]: https connecting 127.0.0.1:80
2005.01.03 22:39:49 LOG7[37000:134614016]: Remote FD=10 initialized
2005.01.03 22:39:49 LOG7[37000:134614016]: TCP_NODELAY option set on remote socket
2005.01.03 22:39:49 LOG7[37000:134614016]: Socket closed on read
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL write shutdown (output buffer empty)
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL alert (write): warning: close notify
2005.01.03 22:39:49 LOG7[37000:134614016]: SSL_shutdown retrying
2005.01.03 22:39:49 LOG7[37000:134614016]: s_poll_wait timeout waiting for SSL close_notify
2005.01.03 22:39:49 LOG5[37000:134614016]: Connection closed: 267 bytes sent to SSL, 78 bytes sent to socket
2005.01.03 22:39:49 LOG7[37000:134614016]: https finished (0 left)


Всё! Проверено – мин нет. :o))
Итак на этой стадии мы научились:
1. Запускать процессы в chroot – окружение.
2. Кофигурировать клиентскую и серверную части stunnel
3. Получили представление и освоили некоторые аспекты работы с пакетом openssl.

N.B. В процессе подготовки материала я выяснил, что вышел релиз stunnel-4.07. Попрошу 0x90 собрать его из патченных сорцев с последней версией openssl и подробно осветить этот нелегкий труд в рамках данной статьи.

Ну и в завершение опуса постараюсь завтра доделать последнюю главу, которая, по логике, должна получиться совсем небольшой. :))

Macmep  04-01-2005 15:39
Глава 4. 3proxy - джентльменский набор сервисов.

Итак, внимательно изучив содержание предыдущих глав, мы научились создавать chroot-окружение и запускать в нем процессы и овладели механизмом авторизации клиентских сертификатов в openssl. Stunnel позиционируется самими разработчиками, как универсальный ssl-wrapper и теперь я хочу остановиться на некоторых аспектах его применения. Как я уже упоминал ранее, заняться этой тулзой меня подтолкнула необходимость найти красивое решение и помочь очень хорошему человеку проскочить через прокси. Имея в руках уже отлаженный ssl-wrapper с настроенной авторизацией и пропатченным виндовым клиентом, я занялся поиском необходимых мне сервисов. Верней не совсем так. :) Сперва я быстренько собрал пресловутый squid в другом chroot-окружении и прибиндил его к локалхосту на той же машине, где уже был поднят сервер stunnel. Таким образом, мой приятель, проскакивая через свой прокси туннелем, выныривал из него уже на мой прокс, естественно не содержащий никаких рестриктов, и благополучно пользовался ресурсами, заткнутыми на его локальной проксе. Но мне хотелось большего =)) Поэтому я занялся поиском socks-сервера. Бесплатных соксов немало в портах FreeBSD, оставалось только на каком-либо из них остановиться. И тут, все в тех же портах, я наткнулся на просто великолепный, с моей точки зрения, набор программ, которому решил выделить, пусть маленькую, но целую главу в этом туторе. :))
В портах это чудо живет здесь: /usr/ports/net/3proxy. Вот комментарий к порту:

COMMENT= Proxy servers set (support HTTP(S), FTP, SOCKS, POP3, TCP & UDP)

Догадались? :o)) Так-то! Далее – вот линк на страницу разработчика: http://www.security.nnov.ru/soft/3proxy/ . Товарищ 3APA3A, написавший это чудо природы, заслуживает массу респектов и всяческих других знаков признания и уважения. :)) Сам автор позиционирует свое творение в первую очередь, как законченный продукт 3proxy, включающий в себя систему авторизации, ведения подробных логов и сервисы PROXY, SOCKS и POP3proxy (подробности настроек здесь http://www.security.nnov.ru/soft/3proxy/howtor.asp ). Но лично меня привлекли отдельные бинарники каждой службы. Пусть я не кодер, но в первом приближении – это качественно написанные и оптимизированные продукты, которые прекрасно себя зарекомендовали в процессе эксплуатации. Достоинства:
1. Чрезвычайно легкая компиляция, как на никсе, так и на винде
2. Простота настройки и запуска
3. Великолепная функциональность (ни одна из программ, желающих, то SOCKS4, то SOCKS4.5, то SOCKS5, ни разу не ругнулась)
4. Простота запуска в chroot-окружении.
5. Универсальность комплекта.
Я не собираюсь в рамках данной статьи подробно останавливаться на настройках этих программ, запуске их в chroot и т.д. Изложенного материала более чем достаточно для самостоятельного решения этих задач. Заинтересовавшиеся могут сами все это проделать и поделиться опытом с остальными в разделе. =))

Ниже приведу список испытанных лично мной сервисов с кратким описанием достоинств решений:
1. stunnel --> squid (полноценный удаленный прокси-сервер с ssl-авторизацией и шифрованием трафика меджу сервером и клиентом)
2. stunnel --> socks (сокс-сервер со всеми достоинствами предыдущего)
3. mysql-client --> stunnel --> mysql-server (удаленное управление сервером MySQL , здесь туннель обеспечивает дополнительный уровень авторизации и закрывает аккаунт юзера MySQL от возможного утягивания шнифером)
4. stunnel --> tcppm --> MS SQL Server (удаленное администрирование MS SQL Server, расположенного в локальной сети, в которой в качестве рутера работает FreeBSD (router, NAT, firewall), через туннель и TCP портмаппер)
5. stunnel --> pSyBNC --> stunnel --> IRC Server (SSL) (полностью шифрованный канал между клиентом и IRC-сервером через IRC-баунсер)
6. stunnel --> tcppm --> MS Terminal Server (аналогично MS SQL Server, как дополнительное средство защиты удаленных клиентов и самого терминал-сервера)
7. stunnel --> httpd (авторизация пользователей веб-ресурса под управлением apache)

Полагаю, что список можно будет продолжить и расширить, все зависит от поставленной задачи. Например, без проблем можно таким макаром настроить почтовые сервисы. :o))

На этом я пожалуй заканчиваю изложения материала. Глава 5, что стоит в планах, будет написана только в случае проявления интереса к изложенным решениям, обсуждений различных вопросов по темам статьи, описания новых красивых решений.

Материалы, использованные в процессе подготовки статьи:

1. manual pages :))
2. http://www.securitylab.ru/?ID=39981
3. http://www.securitylab.ru/?ID=38966
4. http://www.jestrix.net/tuts/sslsocks.html
5. www.stunnel.org
6. http://www.webscript.ru/stories/04/05/29/2604693
7. http://www.security.nnov.ru/soft/3proxy
8, 9, 10… голова, руки, напильник, паяльник, etc…

Благодарности:

Всеразличные гритсы, прянички и леденцы в пакетиках получают:

Во-первых, мой друг 0x90 за беззаветную помощь в процессе борьбы с виндовозом и исходниками на С.
Во-вторых, администрация форума W&PBBS, предоставившая специальный раздел для публикации такого рода материалов.
В-третьих, Государственная Дума РФ и лично Президент РФ, давшие мне в начале года то количество свободного времени, которое потребовалось на написание этой статьи.

Еще раз Всех с Наступившим Новым Годом!!! :)))

Искренне Ваш, Macmep ;)

KillerLoo  11-01-2005 10:06
Это же надо ... Все таки клево что есть время собрать плоды работы продолжительностью в целый год и описать. Гранд респект мессир :о))

cmapuk  12-01-2005 01:45
хороший даджест.
Надо прилепить, чтобы народ чюда отсылать, когда одни и те же faq-овые вопросы задают

0x90  23-01-2005 22:49
Ну вот решил я собственно с подачи Мастера написать незатейливую статеку по мэйканию соответствующей модернизации такой программы как stunnel, а точнее его виндовой версии. Сразу скажу возможны ошибки и неточности, но у автора все сработало, так что вот так.. 8). Итак приступим.
Что нам нужно:
- stunnel версии 4.05 - последняя на данный момент.
- OpenSSL в принципе любой версии.
Автор не нашел неподходящий версии.
- Патч для пооддержи CONNECT Proxy с оффсайта стуннела.
- Компилятор ANSI C. Варианты: MinGW, Visual C, CYGWIN.
Я рекомендую вынужден был юзать VC. Но об этом ниже..
- Перл интерпретатор. Например Active Perl.
- MASM32 версия восемь подойдет.
- MSYS для утилиты patch. Ну и вообще. Никсовый шелл никогда
не помешает.

1. Мэйкаем OpenSSL.
Сразу скажу о ньюансах. Эта часть не столь обязательна.
Ибо в нете можно найти и биннарный версии дллок OpenSSL,
которые еще поставляются и в инсталяторе!! Посмотрев, на
это безобразие, я все же решил, что собрать самому приятние.
Хотя если у вас нет времени или желания, то вперед за
биннарниками. Мы же продолжим. Я слил с www.openssl.org
версию 0.9.7.е - последняя версия естественно с исправлеными
багами.. Распаковал я его на диск C:\, почитал ридмис
(INSTALL.W32) и понял,что ОпенССЛ можно мэйкать оффициально
c помощью вот этого:
- Visual C++
- Borland C
- GNU C (Cygwin or MinGW).
Я выбрал MinGW, как пресдставителя GCC под винды.. Cygwin
отброшен был сразу из-за того что пришлось бы таскать его
библиотеки. А длл юзпющаю еще одну длл к меня в памяти не
помещается. 8) Борланд Си - морально устарел и был препровожден
в дом для престарелых компиляторов вместе с его соседом
Фортраном77. Визуал Си - имеет баги (автор убедился лично),
и был отправлен в желтый дом на последующее имправление.
Оставшийся же целым MinGW был усажен на винт для последующих
разгоров в коммандной обстановке, забудьте о графическом
интерфейсе здесь он не понадобится.. Так вот почитал я ман по
мэйканию ОпенССЛ с помощью MinGW. Хрен получилось - виснет...
Ладно пойдем стандарным методом

./Configure mingw
make depend
make

Опять таки на этапе конфигурации виснет.. 8(
Вообщем в кратце в течении нескольких часов опытов у меня получилось
смэйкать неоптимизированную и безасмовую версиию OpenSSL...
Нам этого мало. Мы будем мэйкать полноценную версию, но
к сожалению лишь в Visual C.. Как говорится пржняя версия была
лучше в плане сборки.
Итак у меня стоит VC 6.0 - вам желаю примерно того же.
МАСМ у меня тоже стоит. Теперь народ напомню насчет PATH.
МАСМ ДОЛЖЕН БЫТЬ ПРОПИСАН В PATH!! Чтобы его можно было найти.
Вот мой PATH:

C:\Documents and Settings\Администратор>echo %PATH%
c:\masm32\bin;c:\msys\1.0\bin;c:\mingw\bin;C:\Perl\bin\;C:\WINNT\system32;C:\WIN
NT;C:\WINNT\System32\Wbem;C:\PROGRA~1\Borland\Delphi6\Bin;C:\PROGRA~1\Borland\De
lphi6\Projects\Bpl;c:\masm32\bin;c:\msys\1.0\bin;c:\mingw\bin;C:\Program Files\M
icrosoft Visual Studio\Common\Tools\WinNT;C:\Program Files\Microsoft Visual Stud
io\Common\MSDev98\Bin;C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\P
rogram Files\Microsoft Visual Studio\VC98\bin

Теперь приступим к сборке. У меня OpenSSL валяется на c:\openssl

cd \openssl

//Конфигурируем.
perl Configure VC-WIN32

//Ассемблируем модули.
ms\do_masm.bat

//Собираем все вместе.
nmake -f ms\ntdll.mak

//Переходим в папку с результатами.
cd out32dll

//Проводим тесты.
..\ms\test


Если тесты у вас прошли успешно, то переходим на следущую стадию.
Иначе у вас есть два варианта: копаться самому или скачать бинарники
библиотек. А нам вперед и вниз. Не забудьте скинуть динамические
библиотеки в %windir%\system32, а статические в директорию к прочим
либам вашего компилятора. При этом переименуйте библиотеки вида
ssleay32.lib в libssl32.a и libeay32.lib -> libeay32.a
Это надо для формата MinGW библиотек.


2. Патчим stunnel.
Как обычно все на самом деле не так просто: стуннел хоть и вещь
классная, но работу с CONNECT proxy не поддерживает. Так что придется
править. На данный момент на сайте валялось 2 патча, которые
добавляли столь нужную нам опцию. Вы спросите какой я взял -
конечно же оба - все равно МАСТЕРу тестить недолго 8).
Патчи:
connect-proxy.mwald.patch
connect-proxy_dunbar.patch
Патчи как известно ставятся коммандой patch 8).
Чтобы не мучатся я распаковал стуннел в две разные папки на диске c:\

C:\>dir stu*
Том в устройстве C не имеет метки.
Серийный номер тома: 18DF-2BE5

Содержимое папки C:\

14.02.2004 05:26 341x191 stunnel-4.05.tar.gz
23.01.2005 21:23 <DIR> stunnel.dunbar.patch
23.01.2005 21:22 <DIR> stunnel.mwald.patch
1 файлов 341x191 байт
2 папок 1x132x142x592 байт свободно

И раскидал сответствующие патчи по папкам в подпапку src.
Передем собственно к патчингу
Патч нумер 1.

C:\>cd stunnel.dunbar.patch

C:\stunnel.dunbar.patch>cd src

C:\stunnel.dunbar.patch\src>dir *.patch
Том в устройстве C не имеет метки.
Серийный номер тома: 18DF-2BE5

Содержимое папки C:\stunnel.dunbar.patch\src

21.04.2004 09:46 13x973 connect-proxy_dunbar.patch
1 файлов 13x973 байт
0 папок 1x132x142x592 байт свободно

C:\stunnel.dunbar.patch\src>patch < connect-proxy_dunbar.patch
patching file `client.c'
patching file `options.c'
Hunk #1 succeeded at 746 (offset -24 lines).
patching file `prototypes.h'
Hunk #1 succeeded at 158 (offset -3 lines).


Патч удался - идем дальше

C:\stunnel.dunbar.patch\src>cd \

C:\>cd stunnel.mwald.patch

C:\stunnel.mwald.patch>cd src

C:\stunnel.mwald.patch\src>dir *.patch
Том в устройстве C не имеет метки.
Серийный номер тома: 18DF-2BE5

Содержимое папки C:\stunnel.mwald.patch\src

24.04.2004 02:36 18x788 connect-proxy.mwald.patch
1 файлов 18x788 байт
0 папок 1x132x077x056 байт свободно

C:\stunnel.mwald.patch\src>patch < connect-proxy.mwald.patch
patching file `Makefile.w32'
patching file `client.c'
patching file `options.c'
patching file `prototypes.h'

Ну вот теперь у нас есть две готовые для экспериментов версии.
Приступим к сборке.

3. Сборка и разбор полетов.
Перед тем как начать сборку нам надо подправить конфигурацию
stunnel. А именно нам надо прописать путь к OpenSSL в Makefile.w32,
который лежит в папочке src. Что мы и сделаем - поправим.
Вот кусок из конфига.

SSLDIR=/c/openssl/include
DEFINES=-DUSE_WIN32 -DHAVE_OPENSSL

# CC=gcc
CFLAGS=-g -O2 -Wall $(DEFINES) -I$(SSLDIR)
LDFLAGS=-s

# LIBS=-L$(SSLDIR)/out -lssl -lcrypto -lwsock32 -lgdi32

LIBS=-L$(SSLDIR)/out -leay32 -lssl32 -lwsock32 -lgdi32

Теперь собственно и будем собирать.

C:\stunnel.dunbar.patch\src>make
gcc -s -o stunnel.exe stunnel.o ssl.o client.o protocol.o sthreads.o log.o optio
ns.o sselect.o gui.o resources.o -L/c/openssl/include/out -leay32 -lssl32 -lwsoc
k32 -lgdi32 -mwindows

C:\stunnel.dunbar.patch\src>

Если у вас линкер раугается, что нет библиотек - дайте их ему.
Других ошиьок быть не должно. Запускаем stunnel.exe - запускается,
иначе у вас не лежат нужные дллки в system32, а именно
libeay32.dll //Это то, во что что мы смэйкали
ssleay32.dll //Openssl.

Со вторым патчем поступим аналогично.

C:\stunnel.dunbar.patch\src>cp Makefile.w32 ..\..\stunnel.mwald.patch\src

C:\stunnel.dunbar.patch\src>cd ..\..\stunnel.mwald.patch\src

C:\stunnel.mwald.patch\src>make -f Makefile.w32

Тестируем - опять все работает. Вот в принципе и все.
Пойду отдам завтра МАСТЕРу на тестирование.

Линки на все 8):
1) MinGW и MSYS www.mingw.org
2) OpenSSL www.openssl.org
3) MASM32 www.wasm.ru РЕКЛАМА 8)
4) stunnel и патчиwww.stunnel.org
5) Active Perl www.activestate.com

Если что бинарная версия OpenSSL есть на оффсайте, не ленитесь
посмотреть.

За сим прощаюсь, искренне ваш
0x90

Macmep  13-06-2005 21:10
Для начала предлагаю посмотреть, что изменилось в процессе развития системы FreeBSD за прошедшие пол года с момента написания мной первого цикла статей. Ветка 4 закончила свое развитие в стадии 4.11 и сообщество разработчиков официально объявило о прекращении разработок в этом направлении. Это означает, что поддержка будет осуществляться только в виде патчей к последнему релизу. На данный момент мы имеем стабильную версию 5.4 новой, пятой ветви развития системы и не за горами появление первых стабильных релизов шестой, которая сейчас находится в стадии CURRENT. Уже официально заявлено, что 5.X-STABLE получится короткой и своего рода переходной, но на текущий период имеет прямой резон ей заниматься, осваивая новые фичи. На этой мажорной ноте вступление заканчиваю и перехожу к изложению задумок на второй цикл статей. ;)
Итак, что хочется изложить. Программа минимум рассмотреть идеологию jail, обсудить некоторые примеры построения jail-окружения, выделить явные различия технологий для 4 и 5 ветвей FreeBSD, чтобы облегчить немного жизнь тем, кто планирует переходить на “пятерку” фри с низших ветвей системы. Туторы планируется делать менее подробными, но при этом всячески поощрять изложение материала другими участниками регаты :))
Сразу оговорюсь, что попытки ремотных апдейтов с 4.X на 5.X обречена на неудачу! Поэтому машины, к которым нет консольного доступа, имеет прямой резон оставлять под управлением старой системы. Те же, которые “под рукой”, лучше не адейтить, а поднять систему “с нуля” и развернуть на ней все требуемые сервисы. Сбэкапить конфиги живых приложений не составит труда.
Оглянувшись на предыдущий цикл статей, считаю необходимым довести до сведения общественности, что технологии chroot и chrootuid прекрасно функционируют и на 5.X версиях, но их настройка связана с определенными сложностями. Основные подводные камни я опишу. Во-первых, вместо огромного набора устройств, подключаемых в дефолтной конфигурации и обновляемых при необходимости скриптом MKDEV, в пятерке появилась файловая система devfs, радикально отличающаяся от предыдущей концепции. Теперь большая часть устройств подключается “по требованию”, что само по себе неплохо, но вот создание chroot-систем, использующих “неосновные” устройства, заметно усложняется. Если обратиться к моим предыдущим выкладкам, тот там мы создаем ноды, например, всегда жизненно необходимого устройства null. :)) С этим проблем не возникает и на “пятерке”. Впервые я наступил на эти грабли, когда определял в chroot два жизненно необходимых мне сервиса одного разработчика, которые весьма опасны постоянным раскапыванием в них новых и новых дыр. Для тех, кто не догадался, скажу, что это named и dhcpd. У первого, для корректной работы rndc, задействуется /dev/random, у второго /dev/bpf, без которого он вообще не жилец в системе. :)) Все собирается и работает на ура до первого рибута системы. Вот тут то и наступают чудеса. :o))) После рибута фря заново инициализирует устройства на devfs и вполне реально попасть в ситуацию, когда номер основного устройства в /dev и его ноды в chroot-окружении будут различными. Аллес капут – сервис в chroot’e не стартует! Можно ли с этим бороться? Очевидно, что да, но с оговоркой. Решение вроде как лежит на поверхности – в стартовом скрипте, положенном в usr/local/etc/rc.d, перед стартом сервиса, удалять старую ноду из chroot-окружения и создавать новую. Осталось решить задачу определения номера новой ноды. С помощью чего это сделать для меня было очевидно – “пятерка” изначально собирается с последней версией perl, который в ней весьма активно используется, а вот написать регулярное выражение мне помог Paul (респект, дружище!), потративший на него не больше минуты:

ls -l /dev/bpf0 | perl -pe 's/[\w\-]+\s+\d+\s+\w+\s+\w+\s+(\d+),\s+(\d+).*/\1 \2/'

Как это работает можете посмотреть сами :)) Возможно, что существует более красивое решение, но я его не знаю =) Я полностью удовлетворен результатом.

Какие еще засады поджидают усталых путников в пятой ветви FreeBSD на пути к нирване chroot-систем? ;) С появлением devfs превратилась в аттавизм procfs, которая теперь по дефолту в системе не монтируется. А без нее не работает горячо любимая мной утилита truss – лучший помощник настройщика роялей ;)) Так что, перед отладкой сервиса смонтируйте ее ручками и не пугайтесь того, что один фик она работает кривенько (процесс, запущенный из нее не форкается). Информативность ее, как и ранее, трудно переоценить и я предлагаю вам самим в очередной раз в этом убедиться.
На сегодня у меня все. Продолжение последует по мере появления свободного времени у автора цикла =))

FreeBSD – это готично! © Sp/\wN :lol:

s1lv3r  26-06-2005 12:37
Хочется немного поговорить на эту тему. Комментарии и критика только приветствуются. ;)

Часть I.
Обновление пакетов FreeBSD с помощью Portupgrade без использования CVSup
Перевод http://taosecurity.blogspot.com/2004_11_01_taosecurity_archive.html#110093091499914264

Насколько я люблю систему портов FreeBSD, настолько же мне не нравравится поддерживать дерево портов в актуальном состоянии используя CVSup. Мне не удалось еще попробовать утилиту portsnap Colin'а Percival'а, которая использует HTTP протокол для распространения сжатых и криптографически подписанных снимков дерева портов. Это хорошая альтернатива, но я стараюсь по возможности избегать процесса компиляции из исходных текстов, т.к. использую не совсем современные и очень медленные системы. В этом случае наиболее подходящим способом является установка и обновление программного обеспечения (ПО) используя заранее скомпилированные пакеты.

Portupgrade - наиболее подходящая утилита для обновления ПО под FreeBSD. Она обладает мощным потенциалом, т.к. способна разрешать зависимости во время массового обновления ПО. Не имеет значения каким образом были установлены приложения: используя порты или заранее скомпилированные пакеты, т.к. с сомента установки FreeBSD расценивает их как пакеты используя в работе с ними такие утилиты как например pkg_info. Использование в качестве аргумента для portupgrade ключа -PP позволит провести обновление ПО используя исключительно заранее скомпилированные пакеты. Это позволит избежать процесса компиляции перед непосредственно установкой.

Большинство людей до сих пор уверены, что дерево портов должно быть актуальным, дабы позволить portupgrade распознавать доступны ли более свежие версии портов. Таким образом в том числе и для обновления используя пакеты требуется CVSup дерева портов либо аналогичный процесс. Так ли это?

Я часто думал над альтернативными методами обновления дерева портов целиком. По этому поводу в рассылке freebsd-ports проходит множество дискуссий. Они обьявляют удаление файлов INDEX и INDEX-5 из CVS хранилища. Эти файлы (INDEX для ветви 4.х и INDEX-5 для ветви 5.х) содержат информацию о ПО, например для nmap:

nmap-3.75|/usr/ports/security/nmap|/usr/local|Port scanning utility for large
networks|/usr/ports/security/nmap/pkg-descr|eik@FreeBSD.org|security ipv6|openssl-
0.9.7e_1 pcre-5.0|openssl-0.9.7e_1 pcre-5.0|http://www.insecure.org/nmap/|||

Эта запись описывает порт nmap, его майнтайнера, зависимости, и прочее: НО вы не найдете ни одного INDEX файла в CVS, например на cvsweb.freebsd.org (см. запись в CHANGES, в которой говорится об удалении INDEX). Майнтайнеры считают что INDEX файлы в CVS сильно устарели и необходимость в их хранении отпала. Но все же INDEX файлы все еще доступны, их можно сформировать запустив 'make index' находясь в /usr/ports или скачать их. Последний способ
наиболее подходит, т.к. формирование с использование традиционных методов занимает большое количество времени.
Это позволит полностью исключить CVSup и обновление дерева портов если вы желаете работать только с заранее скомпилированными пакетами. Дальнейшее повествование описывает как это сделать на FreeBSD 5.3 RELEASE с несколькими приложениями установленными с помощью заранее скомпилированных пакетов.

Вначале у меня под рукой был только файл INDEX-5, который идет стандартной поставке коллекции портов устанавливаемой с FreeBSD 5.3 RELEASE:

janney:/root# ls -al /usr/ports/IND*
-rw-r--r-- 1 root wheel 5798559 Nov 4 18:27 /usr/ports/INDEX-5


Сперва я установил portupgrade:

janney:/root# pkg_add -vr portupgrade
looking up ftp.freebsd.org
connecting to ftp.freebsd.org:21
setting passive mode
opening data connection
initiating transfer
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5.3-release/Lates
t/portupgrade.tbz...x +CONTENTS
x +COMMENT
x +DESC
x +MTREE_DIRS
x man/man1/pkg_deinstall.1.gz
...truncated...

После того как portupgrade был установлен я запустил portversion чтобы понаблюдать обнаружит ли portupgrade уже установленные пакеты. Во время запуска portversion происходит создание базы данных пакетов, расположенной в /var/db/pkg/pkgdb.db.

janney:/root# portversion -v
[Updating the pkgdb in /var/db/pkg ... - 48 packages found (
-0 +1) . done]
[Updating the portsdb in /usr/ports ... - 11735 port entries
found .........1000.........2000.........3000.........4000.........5000........
.6000.........7000.........8000.........9000.........10000.........11000.......
..... done]
bash-3.0_5 = up-to-date with port
bitstream-vera-1.10 = up-to-date with port
boxtools-0.65.0 = up-to-date with port
cdrtools-2.0.3_4 = up-to-date with port
cmdwatch-0.2.0 = up-to-date with port
...truncated...

После окончания процесса в /usr/ports создается новый файл INDEX.db наравне с оригинальным INDEX-5:

janney:/root# ls -al /usr/ports/IND*
-rw-r--r-- 1 root wheel 5798559 Nov 4 18:27 /usr/ports/INDEX-5
-rw-r--r-- 1 root wheel 11915264 Nov 19 23:16 /usr/ports/INDEX.db


Теперь мне потребуется обновить оригинальный фал INDEX-5. Судя выводу portupgrade, все мои пакеты находятся в актуальном состоянии. На самом деле это не так. Например,взглянув на ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/ можно увидеть что доступен пакет /shells/bash-3.0.15.tbz. Я же использую bash-3.0_5, таким образом для обновления доступен более свежий прекомпилированный пакет.

Данный процесс проходит в два шага. Во-первых, требуется получить новый INDEX-5, например скачав его следующим способом:

janney:/usr/ports# make fetchindex
INDEX-5 0% of 5877 kB 0 Bps

После завершения работы 'make fetchindex' получаем обновленный файл INDEX-5:

janney:/usr/ports# ls -al IND*
-rw-r--r-- 1 root wheel 6018417 Nov 19 23:05 INDEX-5
-rw-r--r-- 1 root wheel 11915264 Nov 19 23:16 INDEX.db

Во-вторых, потребуется обновить файл INDEX.db:

janney:/usr/ports# portsdb -uf
[Updating the portsdb in /usr/ports ... - 11972 port entries
found .........1000.........2000.........3000.........4000.........5000........
.6000.........7000.........8000.........9000.........10000.........11000........
. ..... done]

Теперь посмотрим на файл INDEX.db:

janney:/usr/ports# ls -al IND*
-rw-r--r-- 1 root wheel 6018417 Nov 19 23:05 INDEX-5
-rw-r--r-- 1 root wheel 12334080 Nov 19 23:54 INDEX.db


Повторный запуск portversion показал что некоторые порты требуют обновления. Например bash:

janney:/usr/ports# portversion -v
bash-3.0_5 < needs updating (port has 3.0.16_1)
bitstream-vera-1.10 = up-to-date with port
boxtools-0.65.0 = up-to-date with port
cdrtools-2.0.3_4 = up-to-date with port
...truncated...


Теперь файл INDEX-5 содержит информацию о том, что доступная версия bash в дереве портов 3.0.16_1, но ведь прекомпилированый пакет имеет версию 3.0.15. На самом деле это допустимо (если не учитывать аспект безопасности), и позволит произвести обновление bash с 3.0_5 до 3.0.15. Следующим шагом нужно сообщить portupgrade где искать заранее скомпилированные пакеты:

janney:/usr/ports# setenv PACKAGESITE ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/

Теперь мы готовы к обновлению пакетов с помощью portupgrade:

janney:/usr/ports# portupgrade -varRPP
---> Session started at: Fri, 19 Nov 2004 23:55:03 -0500
** No need to upgrade 'python-2.3.4_2' (>= python-2.3.4_2). (specify -f to force)
...edited...
---> Checking for the latest package of 'shells/bash'
---> Fetching the package(s) for 'bash-3.0.16' (shells/bash)
---> Fetching bash-3.0.16
++ Will try the following sites in the order named:
ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/
---> Invoking a command: /usr/bin/fetch -o '/var/tmp/bash-3.0.16.tbz' 'ftp://ft
p2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tbz'
fetch: ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tbz: File unavailable (e.g., file not found, no access)
** The command returned a non-zero exit status: 1
** Failed to fetch ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tbz
---> Invoking a command: /usr/bin/fetch -o '/var/tmp/bash-3.0.16.tgz' 'ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tgz'
fetch: ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/bash-3.0.16.tgz: File unavailable (e.g., file not found, no access)
** The command returned a non-zero exit status: 1
** Failed to fetch ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stab
le/All/bash-3.0.16.tgz
** Failed to fetch bash-3.0.16
---> Listing the results (+:done / -:ignored / *:skipped / !:failed)
! bash-3.0.16 (fetch error)
---> Packages processed: 0 done, 0 ignored, 0 skipped and 1 failed
---> Fetching the latest package(s) for 'bash' (shells/bash)
---> Fetching bash
++ Will try the following sites in the order named:
ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/
---> Invoking a command: /usr/bin/fetch -o '/var/tmp/bash.tbz' 'ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest/bash.tbz'
/var/tmp/bash.tbz 0% of 532 kB
---> Downloaded as bash.tbz
---> Identifying the package /var/tmp/bash.tbz
---> Saved as /usr/ports/packages/All/bash-3.0.15.tbz
---> Skipping libiconv-1.9.2_1 (already installed)
---> Skipping gettext-0.13.1_1 (already installed)
---> Listing the results (+:done / -:ignored / *:skipped / !:failed)
+ bash@
- libiconv-1.9.2_1
- gettext-0.13.1_1
---> Packages processed: 1 done, 2 ignored, 0 skipped and 0 failed
---> Found a package of 'shells/bash': bash-3.0.15.tbz (bash-3.0.15)
---> Located a package version 3.0.15 (bash-3.0.15.tbz)
---> Using it anyway although it is not the latest version (3.0.16), since -PP/
--use-packages-only is specified
---> Upgrade of shells/bash started at: Sat, 20 Nov 2004 00:00:52 -0500
---> Upgrading 'bash-3.0_5' to 'bash-3.0.15' (shells/bash) using a package
---> Updating dependency info
---> Uninstallation of bash-3.0_5 started at: Sat, 20 Nov 2004 00:00:53 -0500
---> Fixing up dependencies before creating a package
---> Backing up the old version
---> Uninstalling the old version
---> Deinstalling 'bash-3.0_5'
[Updating the pkgdb in /var/db/pkg ... - 47 packages found (
-1 +0) (...) done]
---> Uninstallation of bash-3.0_5 ended at: Sat, 20 Nov 2004 00:01:01 -0500 (consumed 00:00:07)
pkg_info: can't find package 'bash-3.0.15.tbz' installed or in a file!
---> Installation of bash-3.0.15 started at: Sat, 20 Nov 2004 00:01:01
-0500
---> Installing the new version via the package
---> Removing temporary backup files
---> Installation of bash-3.0.15 ended at: Sat, 20 Nov 2004 00:01:06 -0500 (consumed 00:00:04)
---> Cleaning out obsolete shared libraries
[Updating the pkgdb in /var/db/pkg ... - 48 packages found (-0 +1) . done]
---> Upgrade of shells/bash ended at: Sat, 20 Nov 2004 00:01:08 -0500 (consumed 00:00:15)
** No need to upgrade 'xorg-fonts-miscbitmaps-6.7.0' (>=xorg-fonts-miscbitmaps-6.7.0). (specify -f to force)
...truncated...

Приведенный выше листинг показывает что происходит когда portupgrade не может обнаружить требуемую версию пакета bash-3.0.16 на ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All.
Происходит поиск bash.tbz на ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest. На самом деле это символическая ссылка на доступный пакет:

lrwxr-xr-x 1 110 0 22 Nov 15 08:09 bash.tbz -> ../All/bash-3.0.15.tbz

На будущее, я определю переменную PACKAGESITE таким образом:

janney:/usr/ports# setenv PACKAGESITE ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/

В итоге все порты, которые могли быть обновлены с помощью прекомпилированых пакетов, были действительно обновлены. Например, bash:

janney:/root# portversion -v bash
bash-3.0.15 < needs updating (port has 3.0.16_1)

Прекомпилированные пакеты закачиваются на FTP сервера еженедельно, я буду проводить этот процесс каждый раз после появление более новых версий.

Я также намереваюсь проследить за новой утилитой Мэтью Симана portindex.Portindex Matthew позволяет намного быстрее сгенерировать INDEX и INDEX-5, а также заменяет медленные процессы 'make index' и 'portsb -uU'. Использование системы портов в комбинации с portindex и portsnap позволит раскрыть облее мощный потенциал данного способа установки ПО. Описаный же выше способ должен понравиться людям, использующим медленные системы или обновляющих ПО с помощью пакетов.

Macmep  24-07-2005 13:52
Блин, ларчик просто открывался :) В "пятерке" про mknod можно смело забыть, монтировать devfs в каждое из chroot-окружений и будет нам счастье :)) man mount_devfs + в качестве шпаргалки vi /etc/rc.d/named. При таком подходе сокет для лога следует создавать в /patch_to_chroot_dir/var/run/log].

cyberb  29-07-2005 17:54
Просто монстр :D это лучшее, что видел по теме поддержки портов в актуале

s1lv3r  30-07-2005 16:48
cyberb : засмущал совсем ;)

cyberb  04-08-2005 15:52
Хотя все-таки косячок есть :D сервы все-таки лучше указывать среди российских мирроров :uu: тут и скорость повыше и трафик подешевле.
даже без трейса скажу, что все так. В setenv нада пофиксить ftp на

ftp1.ru.freebsd.org
ftp2.ru.freebsd.org
ftp3.ru.freebsd.org

Я предпочитаю 3, т.к. он наименее загружен из всех, хотя имхо у вас все может быть иначе :uu:

Во еще вспомнил на своес примере, а если у вас не релиз, ну или скажем frozen - не последний релиз.... то тут уже нада систему обновлять

s1lv3r  04-08-2005 16:14
выше приведенная статья - перевод, о чем сказано вначале. таким образом косячков в переводе (не считая орфографию и корявость самого перевода ;)) нет, а вот как комментарий-дополнение твои доводы действительно правильны, зеркала нужно выбирать ближайшие по пингу и трейсроуту... =)

cyberb  04-08-2005 16:44
Ну при переводе все-таки специфику учитывать стоит :uu:

aspen  15-03-2006 15:21
О, а можно я разбавлю высокотехничные идеи более приземленными и близкими к народу вещами?

Например, система управления проектами, файловая свалка и иже. Можно конечно пойти по пути IIS+SharePoint+ProjectServer, заплатив за это несколько десятков тысяч президентов (случаи использования вареза рассматривать не будет). А можно воспользоваться офигительными и не менее функциональными вещами, такими как dotprpject и opensharepoint - работают офигительно. Возможно, нет того богатства функционала, но, к счастью, все нужные вещи есть.

Ну, такие вещи как NАGIOS всем известны. Особо останавливаться не буду.

Система для обмена файлом с внешними юзверями -- мы начали использовать Efisto и очень довольны.

Управляем Cisco -- я пока присматриваюсь к Cisco Hammer и нахожу его полезным для управления кучуей роутеров.

Собственно, листая freshmeat я нахожу, что очень много всего полезного, не только для ИТшников, но и для тупых юзверей может быть организовано на базе FreeBSD.

s1lv3r  15-03-2006 15:50
aspen ты хочешь поговорить об этом? ;)
Я не прочь сделать примерно такой же обзор по установке настройке и эксплуатации (хе-хе... термин как то не приклеивается уже ;) теряется смысловая нагрузка ;) ) чего либо при условии что данное достижение IT сферы надлежащим образом документировано и имеет место быть в современных системах... =)
Но как правило все интересующие продукты уже максимально подробно отражены в повествованиях на том же www.opennet.ru...

aspen  16-03-2006 08:59
Проблема, как обычно, -- во времени. Хотя, по некоторым продуктам и писать особо нечего -- например Efisto -- скомплилили Jakrata-Tomcat, поставили Apache Ant, скомпилили jar'ы да поправили xml немного. Все по документации -- очень понятно. Расписывать как-то и нечего. Другое дело, что большинство проектов проходят стороной, и народ о них просто не знает. Вот в чем проблема. А OpenNet -- опять же, не на пользователей он расчитан.

Полезные решения, насколько я это понимаю, это решения приносящие пользу нашим пользователям, повышающие эффективность работы этих самых "тупорылых юзверей", которые, в принципе и являются генераторами прибыли наших контор (говорю не за ИТ конторы).

cyberb  21-06-2006 15:19
Это пост-критика Мастера на мой пост, который был выше. Считаю своим долгом перенести чтобы не кануло в лету. Собстна пост ->

++++++++++++++ Cut here +++++++++++++++++++++++

Настало время для суровой критики нашего кибернетического парня вот за это "полезное" решение -*Полезные решения на платформе FreeBSD.*- :) Выглядит все суперкрасиво на первый взгляд (ведь сам орла за это дело ему поставил). :)) На практике дела обстоят несколько иначе... Сейчас я предоставлю всем самим в этом убедиться. :)
Первое, на что следует обратить внимание - это последовательность установки пакетов, перечисленных киберб. Все три перечисленные утилиты используют криптобиблиотеки. Убедиться в этом легко и просто, вспомнив про ldd.


# ldd /usr/bin/openssl
/usr/bin/openssl:
libssl.so.4 => /usr/lib/libssl.so.4 (0x280b9000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x280e7000)
libc.so.6 => /lib/libc.so.6 (0x281d9000)

# ldd /usr/sbin/sshd
/usr/sbin/sshd:
libssh.so.3 => /usr/lib/libssh.so.3 (0x2809a000)
libutil.so.5 => /lib/libutil.so.5 (0x280cc000)
libz.so.3 => /lib/libz.so.3 (0x280d8000)
libwrap.so.4 => /usr/lib/libwrap.so.4 (0x280e8000)
libpam.so.3 => /usr/lib/libpam.so.3 (0x280ee000)
libgssapi.so.8 => /usr/lib/libgssapi.so.8 (0x280f5000)
libkrb5.so.8 => /usr/lib/libkrb5.so.8 (0x28103000)
libasn1.so.8 => /usr/lib/libasn1.so.8 (0x28137000)
libcom_err.so.3 => /usr/lib/libcom_err.so.3 (0x28158000)
libroken.so.8 => /usr/lib/libroken.so.8 (0x2815a000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x28166000)
libcrypt.so.3 => /lib/libcrypt.so.3 (0x28258000)
libc.so.6 => /lib/libc.so.6 (0x28270000)
libmd.so.3 => /lib/libmd.so.3 (0x28348000)

# ldd /usr/sbin/named
/usr/sbin/named:
libcrypto.so.4 => /lib/libcrypto.so.4 (0x281b8000)
libc.so.6 => /lib/libc.so.6 (0x282aa000)


Понимаете куда клоню? :) Правильно. Начинаем с установки пакета openssl из портов. Тут все, как описал киберб.


# cd /usr/ports/security/openssl/
# make OPENSSL_OVERWRITE_BASE=yes install clean


Собралось? Смотрим, что за зверь получился. :)


# ldd /usr/local/bin/openssl
/usr/bin/openssl:
libssl.so.5 => /usr/local/lib/libssl.so.5 (0x280c7000)
libcrypto.so.5 => /usr/local/lib/libcrypto.so.5 (0x280ff000)
libpthread.so.2 => /usr/lib/libpthread.so.2 (0x2820e000)
libc.so.6 => /lib/libc.so.6 (0x28233000)


Правильной дорогой идем, товарищи юниксоиды. :)

Переходим к openssh-portable. Тут все без вопросов, читайте оригинал и не ошибетесь. Процитирую:
Код:

# cd /usr/ports/security/openssh-portable/
# make OPENSSH_OVERWRITE_BASE=yes install clean


Получилось? Проверим, что мы не фантики. :)
Код:


# ldd /usr/sbin/sshd
/usr/sbin/sshd:
libwrap.so.4 => /usr/lib/libwrap.so.4 (0x280b4000)
libpam.so.3 => /usr/lib/libpam.so.3 (0x280ba000)
libcrypto.so.5 => /usr/local/lib/libcrypto.so.5 (0x280c1000)
libutil.so.5 => /lib/libutil.so.5 (0x281d0000)
libz.so.3 => /lib/libz.so.3 (0x281dc000)
libcrypt.so.3 => /lib/libcrypt.so.3 (0x281ec000)
libgssapi.so.8 => /usr/lib/libgssapi.so.8 (0x28204000)
libkrb5.so.8 => /usr/lib/libkrb5.so.8 (0x28212000)
libcom_err.so.3 => /usr/lib/libcom_err.so.3 (0x28246000)
libasn1.so.8 => /usr/lib/libasn1.so.8 (0x28248000)
libroken.so.8 => /usr/lib/libroken.so.8 (0x28269000)
libc.so.6 => /lib/libc.so.6 (0x28275000)


Зачет! :) Переходим к намеду. Тут ключики слегка дополним.
Код:


# cd /usr/ports/dns/bind9/
# make WITH_PORT_REPLACES_BASE_BIND9=yes WITH_OPENSSL_PORT=yes install clean


Проверяем результаты и чувствуем себя уже продвинутыми спецами по настройке FreeBSD! :)
Код:


# ldd /usr/sbin/named
/usr/sbin/named:
libcrypto.so.5 => /usr/local/lib/libcrypto.so.5 (0x281b6000)
libc.so.6 => /lib/libc.so.6 (0x282c5000)


Можно выкурить вкусную сигарету и расслабиться, пытаясь сфокусировать взгляд на звездах в ночном небе, ибо все теперь правильно и грамотно, ключевые сервисы самые свежие и плюс к этому проверяются portaudit'ом. Любимый город может спать спокойно? А вот фига там. :) За чем неусыпно следят настоящие парни, работающие с фрей? Правильно, за секьюрными патчами системы. Получаем анонс о свежей дырке, достаем cvsup'ом патчи, билдим с ними систему, как положено и... Вся проделанная и описаная работа отправляется... да-да, именно туда, куда вы подумали, дорогие мои. :)

По этой причине финалом эпопеи для вас должно стать изменение make.conf
Код:


# vi /etc/make.conf
NO_OPENSSH=
NO_OPENSSL=
NO_BIND=


Вот теперь уже точно всё. :) Замена на версии, идущие в поставке системы, нам уже не грозит.

Плавно переходим в состояние полной нирваны, мы его заслужили.

P.S. Пример рассмотрен на FreeBSD 6.1-RELEASE-p1. Для 4-ой и 5-ой веток меняются лишь номера либок и синтаксис make.conf

++++++++++++++ Cut here +++++++++++++++++++++++

cyberb  21-06-2006 15:24
бредисловие.
както давно мне сказали что win-говно, я почему-то не поверил и оказался прав... просто люди не умеют его готовить =) но ведь здесь есть оборотная сторона - я видал просто горы горе-админов, которые установив се BSD/Linux думают что терь мона сесть и расслабиться, но установить это только половина дела, в эти системы(как впрочем и в винды) вложен огромный
потенциал по тонкому реконфигурированию и ваша цена, как спеца растет пропорционально количеству ответов на вопрос - а что можно еще выжать из это конфигурации... упс, что-то я бредни развел, к делу(все на примере FreeBSD)...

в BSD есть тонкий механизм настройки - sysctl называется. попробуем разобраться что это и откуда оно берется.


sysctl(8) -- это интерфейс, позволяющий вам вносить изменения в работающую систему FreeBSD. эти изменения касаются многих опций стека TCP/IP и виртуальной памяти; опытный системный администратор может использовать их для существенного увеличения производительности. более пяти тысяч системных переменных могут быть прочитаны и записаны с помощью sysctl(8).

ну кто скажет лучше чем handbook что такое sysctl?... с понятиями разобрались, пора окунуться в практику.
изменение sysctl переменных может происхожить 2 способами - на "лету" или из файлов loader.conf & /etc/sysctl.conf.
на лету смотрим переменные примерно так примерно так:
запрос


# sysctl net.link.ether.inet.max_age
net.link.ether.inet.max_age: 1200

для просмотра всех доступных для чтения переменных:


# sysctl -a

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

kern.polling.enable=1
связано с опцией ядра "options DEVICE_POLLING"(там есть траблы с конфигурацией SMP смотрите, поддерживается только такими сетевыми картами dc,em,fxp,nge,rl,sis)
помогает немного скомпенсировать атаки дос, но это завязано с опциями ядра, так что сами(или я как-нить в следующий раз)
если сами то воть - http://silverwraith.com/papers/freebsd-tuning.php
http://info.iet.unipi.it/~luigi/polling/

net.inet.tcp.msl=7500
определяет максимальное время жизни сегмента в милисекундах (Maximum Segment Life - MSL). это максимальное количество времени ожидания ACK в ответ на SYN-ACK или FIN-ACK в миллисекундах. если в течение этого времени компьютер не получает ACK, то он считает, что сегмент потерян и освобождает сетевое подключение.(из опеннета)
экспериментируем и пробуем, ни в коем случае не делаем необдуманных решений и действий, т.к. можем "отрубить" часть своих клиентов. подберитя для ся оптимальное значение.
по RFC 1979 установлено 120 сек, но скока времени прошло, скока злодеев прибавилось. по дефолту 30000. помогает от дос.

net.inet.tcp.blackhole=2
net.inet.tcp.blackhole определяет, что должно происходить, когда система получает TCP пакет на закрытый порт. когда эта переменная установлена в 1, SYN пакеты на закрытый порт будут отклоняться без отсылки отправителю RST пакета. когда она установлена в 2, все пакеты на закрытый порт отбрасываются без отсылки RST. это бережет время цпу, потому что пакеты практически не требуют обработки, а также освобождает исходящий канал, потому ответные пакеты не отсылаются.(из опеннет)
от себя добавлю, тормозит сканирование портов - т.к. сканирующий ждет ответа, а вы типа молчите, немного затрудняет fingerprint OS так как ся ведет "нестандартно" для данной OS.

net.inet.udp.blackhole=1
net.inet.udp.blackhole схоже с net.inet.tcp.blackhole по своей функциональности. так как протокол UDP не устанавливает соединение, как TCP, то при сбросе UDP пакетов есть только одна опция. когда эта переменная установлена в 1, система отбрасывает все UDP пакеты, которые адресованы закрытым портам.(из опеннет)
от себя, как и в прошлый раз.

net.inet.icmp.icmplim=50
название это переменной вводит в заблуждение. она контролирует максимальное количество пакетов ICMP <<недостижимо>>, а также количество отсылок TCP RST пакетов в секунду. она помогает уменьшить урон от атак, при которых генерируется большое количество ответных пакетов.(из опеннет)
ну от себя добавить нечего, скажу только пробуйте и подбирайте параметры.

kern.ipc.somaxconn=32768
kern.ipc.somaxconn ограничивает максимальное количество одновременно открытых сокетов. значение по умолчанию - 128. если атакующий сможет завалить вас достаточно большим количеством SYN пакетов за короткий период времени, то он может задействовать все возможные сетевые соединения, успешно ограничив ваших пользователей в доступе к сервисам.(из опеннета)
ваще злой параметр, показывает(и достаточно очевидно) как просто завалить систему установленную по дефолту(несмотря что грозно называется она FreeBSD). с другой стороны много откроете тоже могут вас "поиметь", так что опять же работайте-тестируйте.

hw.ata.wc=0
во FreeBSD 4.3 кэширование записи на IDE диски было отключено. это понижало производительность IDE дисков в тестах, но было необходимо для лучшей сохранности данных. проблема состоит в том, что IDE диски неправильно указывают время завершения записи на диск. при включенном кэшировании IDE диски могут не только записать данные в неправильном порядке -- при большой нагрузке на диск некоторые блоки могут задержаться до бесконечности. сбой, или отключение питания могут могут стать причиной серьёзных повреждений в файловой системе. поэтому для безопасности системы значение по умолчанию этого параметра было изменено. к сожалению, результатом этого стало столь значительная потеря производительности, что после выхода релиза значение этого параметра было возвращено в первоначальное состояние. вам следует проверить значение переменной sysctl hw.ata.wc на вашей машине. если кэширование выключено -- вы можете включить его, установив значение переменной ядра, равное 1. это должно быть сделано при помощи загрузчика при за
грузке. если вы сделаете это позже -- изменения не будут иметь силы.(man)
могу сказать вот что(ну кроме того что написано) - функция это открывает опережеющую запись. скажем при чтении с диска читаются не только те дрожки которые вы запросили, но и несколько после(в кэш) в надежде того, что они вам еще понадобятся. в записи это значит, что ваши данные ставятся в кэш, а только потом записываются(тоесть без механики все происходит моментально), а данные после записываются на диск(как он освободится), в следствии вы не ждете ответа диска и экономите время программы(термин такой в оптимизации есть), но если у вас прозошел сбой/перезагрузка сами понимаете что данные тю-тю, так что смотрите и соизмеряйте риск/скорость, покупайте UPS и живите спокойно.

vm.swap_idle_enabled=0 (по дефолту)
переменная sysctl vm.swap_idle_enabled полезна в больших многопользовательских системах, где есть много пользователей, входящих и выходящих из системы, и множество ожидающих процессов. такие системы обычно генерируют большое количество запросов на выделение памяти. включение этой переменной и настройка задержки выгрузки (swapout hysteresis, в секундах) установкой переменных vm.swap_idle_threshold1 и vm.swap_idle_threshold2 позволит освобождать страницы памяти, занятые ожидающими процессами, более быстро, чем при нормальном алгоритме выгрузки. это помогает даемону выгрузки страниц. не включайте этот параметр, пока он на самом деле вам не понадобится, поскольку его действие в сущности заключается в более ранней выгрузке страниц из памяти; это повышает нагрузку на подкачку и диск. в малых системах эффект от включения этого параметра предсказуем, но в больших системах нагруженной на подкачкой этот параметр позволяет системе VM проще загружать и выгружать процессы из памяти.(из man)
от себя, в BSD есть "менеджер"(ну не помню как он называется, он часть менеджера памяти) замещения неиспользуемых страниц(он вроде устроен по принципы часов с 2 стрелками - еще посмотрю и отвечу тем кому будет интересно). в сущности(видимо) он преобразует это алгоритм в 1 стрелку(после 1 прохода идет в виртуальные страницы). так что смотрите на загрузку страниц/их замещение/использование swap. в этом может помочь vmstat, как и что я может быть опишу чуточку позже - как с инстом и работой(смешно сказать кем работаю=) ) разберусь. ваще на загруженных системах(ввод-вывод) должно помочь.

vfs.hirunningspace

переменная sysctl vfs.hirunningspace определяет число запросов записи на диск, которые могут быть поставлены в очередь. значение по умолчанию обычно подходит, но на компьютерах с большим количеством дисков вы можете увеличить его до четырех или пяти мегабайт. учтите, что установка слишком большого значения (превышающего размер буфера записи) может привести к очень значительному падению общей производительности. не делайте это значение произвольно большим! большие значения могут привести к задержкам чтения, выполняемого в то же время. есть много других переменных sysctl, относящихся к кэшированию в буфер и страничному кэшированию VM. мы не рекомендуем изменять эти значения. начиная FreeBSD 4.3, система VM делает отличную работу по автоматической самонастройке.(из man)
=) его можно(и иногда даже нужно) менять, но тут нужно проводить тонкую настройку/тестирование. так что если не уверены не трогайте.

vfs.write_behind
переменная sysctl vfs.write_behind по умолчанию установлена в 1 (включено). она указывает системе выполнять запись на носитель по кластерам, что обычно делается для больших файлов. идея в том, чтобы избежать заполнения кэша неполными буферами, когда это не увеличивает производительность. однако, это может заблокировать процессы и в некоторых случаях вам может понадобиться отключить этот параметр.(из man)
не будем вдаваться в подробности работы дисков, могу сказать тока одно - если оперируете большими файлами должно снизить нагрузку на диск.

vfs.vmiodirenable
значением переменной vfs.vmiodirenable может быть установлено в 0 (выключено) или 1 (включено); по умолчанию 1. эта переменная отвечает за метод кэширования каталогов. размер большинства каталогов невелик. они могут поместиться в одном фрагменте (обычно 1K), и могут занимать ещё меньше места (обычно 512 байт) в кэше буфера. при отключении этой переменной (при установке значения 0) буфер прокэширует только заданное число каталогов даже если у вас много памяти. при включении (при установке значения 1) эта переменная sysctl позволит использовать страничное кэширование VM, делая доступным для кэширования каталогов весь объём памяти. однако, минимальный объём памяти, используемой для кэширования каталогов стал равен объёму страницы (обычно 4 K) вместо 512 байт. мы рекомендуем оставлять эту опцию включенной, если ваш компьютер исполняет программы, манипулирующие значительным количеством файлов. примером таких программ могут быть кэширующие прокси-серверы, большие почтовые серверы и серверы новостей. обычно включение этой опции не понижает производительности, однако лучше поэкспериментировать, чтобы узнать оптимальное значение для вашей машины.(из man).
да тут вроде все сказано, от себя добавлю посмотрите на ваши приложени и какими порциями они пишут/читают данные. еще вам может помочь vmstat для анализа загруженности диска.

kern.maxfiles
я флудить небуду - просто почитайте man. немного тока напишу.
значение kern.maxfiles может быть увеличено или уменьшено в зависимости от потребностей вашей системы. эта переменная определяет максимальное число дескрипторов файлов. когда таблица дескрипторов файлов полна, в очереди системных сообщений появится сообщение “file: table is full”. это сообщение может быть прочитано с помощью команды dmesg.
даже есть такая атака - переполнение дескрипторов в /var и система встает =)) с ошибкой(Out of inode =) я уже вставал на днях ), так что читайте.

остально писать не буду - просто почитайте http://www.freebsd.org/doc/ru_RU.KO...nel-limits.html - там есть многое.

вот привожу часть(описанную sysctl), взято со ссылки http://people.freebsd.org/~adrian/sysctl.descriptions


* kern.ostype: Operating system type
* kern.osrelease: Operating system release
* kern.osrevision: Operating system revision
* kern.version: Kernel version
* kern.maxvnodes: Maximum number of vnodes
* kern.maxproc: Maximum number of processes
* kern.maxfiles: Maximum number of files
* kern.argmax: Maximum bytes of arguement to execve(2)
* kern.securelevel: Current secure level
* kern.hostname: Hostname
* kern.hostid: Host ID
* kern.proc.all: Return entire process table
* kern.file: Return file table
* kern.posix1version: Version of POSIX attempting to comply to
* kern.ngroups: Maximum number of groups a user can belong to
* kern.job_control: Whether job control is avaliable
* kern.saved_ids: Whether saved set-group/user ID is avaliable
* kern.boottime: System boottime
* kern.domainname: Name of the current YP/NIS domain
* kern.osreldate: Operating system release date
* kern.bootfile: Name of kernel file booted
* kern.maxfilesperproc: Maximum files allowed open per process
* kern.maxprocperuid: Maximum processes allowed per userid
* kern.ipc.maxsockbuf: Maximum socket buffer size
* kern.ipc.somaxconn: Maximum pending socket connection queue size
* kern.ipc.nmbclusters: Maximum number of mbuf clusters avaliable for network IO
* kern.ipc.maxsockets: Maximum number of sockets avaliable
kern.dummy: XXX This should be yanked from the source, its the old kern.maxsockbuf, wollman decided to keep the SYSCTL OID valid (but returning nothing, as kern.dummy does.)
* kern.logsigexit: Log processes quitting on abnormal signals to syslog(3)
* kern.module_path: module load search path
* kern.fast_vfork: Enable fast vfork() by using RFMEM to share address space instead of copying it
* kern.sugid_coredump: Enable coredumping set user/group ID processes
* kern.corefile: process corefile name format string
* kern.devstat.all: All devices in the devstat list
* kern.devstat.numdevs: Number of devices in the devstat list
* kern.devstat.generation: Devstat list generation
* kern.devstat.version: Devstat list version number
* vm.vmmeter: System virtual memory statistics
* vm.loadavg: Machine loadaverage history
* vm.stats.sys.v_swtch: Context switches
* vm.stats.sys.v_trap: Traps
* vm.stats.sys.v_syscall: Syscalls
* vm.stats.sys.v_intr: Hardware Interrupts
* vm.stats.sys.v_soft: Software Interrupts
* vm.stats.vm.v_vm_faults: VM faults
* vm.stats.vm.v_cow_faults: COW faults
* vm.stats.vm.v_cow_optim: Optimized COW faults
* vm.stats.vm.v_zfod: Zero fill
* vm.stats.vm.v_ozfod: Optimized zero fill
* vm.stats.vm.v_swapin: Swapin operations
* vm.stats.vm.v_swapout: Swapout operations
* vm.stats.vm.v_swappgsin: Swapin pages
* vm.stats.vm.v_swappgsout: Swapout pages
* vm.stats.vm.v_vnodein: Vnodein operations
* vm.stats.vm.v_vnodeout: Vnodeout operations
* vm.stats.vm.v_vnodepgsin: Vnodein pages
* vm.stats.vm.v_vnodepgsout: Vnodeout pages
* vm.stats.vm.v_intrans: In transit page blocking
* vm.stats.vm.v_reactivated: Reactivated pages
* vm.stats.vm.v_pdwakeups: Pagedaemon wakeups
* vm.stats.vm.v_pdpages: Pagedaemon page scans
net.inet.ip.portrange.lowfirst: First port for 'trusted' socket binds
net.inet.ip.portrange.lowlast: Last port for 'trusted' socket binds
net.inet.ip.portrange.first: First port for normal socket binds
net.inet.ip.portrange.last: Last port for normal socket binds
net.inet.ip.portrange.hifirst: First port for 'high' socket binds ( XXX huh? :)
net.inet.ip.portrange.hilast: Last port for 'high' socket binds
* net.inet.ip.forwarding: Enable IP forwarding between interfaces
* net.inet.ip.redirect: Enable sending IP redirects
* net.inet.ip.ttl: Maximum TTL on IP packets
* net.inet.ip.rtexpire: Default expiry time on dynamically learnt routes
* net.inet.ip.rtminexpire: Minimum time to attempt to hold onto dynamically learnt routes
* net.inet.ip.rtmaxcache: Upper limit on dynamically learnt routes
* net.inet.ip.sourceroute: Enable forwarding source routed IP packets
* net.inet.ip.intr_queue_maxlen: Maximum size of the IP input queue
* net.inet.ip.intr_queue_drops: Number of packets dropped from the IP input queue
* net.inet.ip.stats: IP statistics (struct ipstat, netinet/ip_var.h)
* net.inet.ip.accept_sourceroute: Enable accepting source routed IP packets
* net.inet.ip.fastforwarding: Enable flow-based IP forwarding
* net.inet.ip.mtu: Default MTU
* net.inet.ip.fw.debug: Enable printing of debug ip_fw statements
* net.inet.ip.fw.one_pass: Only do a single pass through ipfw rules when using divert(4)
* net.inet.ip.fw.verbose: Log matches to ipfw rules
* net.inet.ip.fw.verbose_limit: Set upper limit of matches of ipfw rules logged
* net.inet.tcp.rfc1323: Enable rfc1323 (high performance TCP) extensions
* net.inet.tcp.rfc1644: Enable rfc1644 (TTCP) extensions
* net.inet.tcp.mssdflt: Default TCP Maximum Segment Size
* net.inet.tcp.stats: TCP statistics (struct tcpstat, netinet/tcp_var.h)
* net.inet.tcp.rttdflt: Default maximum TCP Round Trip Time
* net.inet.tcp.sendspace: Maximum outgoing TCP datagram size (frag or total pkt?)
* net.inet.tcp.recvspace: Maximum incoming TCP datagram size (frag or total pkt?)
* net.inet.tcp.pcblist: List of active TCP connections
* net.inet.tcp.log_in_vain: Log all incoming TCP connections
* net.inet.tcp.delayed_ack: Delay ACK to try and piggyback it onto a data packet
* net.inet.tcp.pcbcount: Number of active PCBs
* net.inet.tcp.always_keepalive: Assume SO_KEEPALIVE on all TCP connections
* net.inet.udp.stats: UDP statistics (struct udpstat, netinet/udp_var.h)
* net.inet.udp.maxdgram: Maximum outgoing UDP datagram size
* net.inet.udp.recvspace: Maximum incoming UDP datagram size
* net.inet.udp.pcblist: List of active UDP sockets
* net.inet.udp.log_in_vain: Log all incoming UDP packets
* net.inet.raw.maxdgram: Maximum outgoing raw IP datagram size
* net.inet.raw.recvspace: Maximum incoming raw IP datagram size
* net.inet.raw.pcblist: List of active raw IP sockets
* debug.debugger_on_panic: Run debugger on kernel panic
hw.machine: Machine class
hw.model: Machine model
* hw.ncpu: Number of active CPUs
* hw.byteorder: System byte order
hw.physmem: Physical memory in system
hw.usermem: Physical memory avaliable to user processes
* hw.pagesize: System memory page size
hw.floatingpoint: Hardware floating point support present
hw.machine_arch: System architecture
* machdep.do_dump: Do coredump on kernel panic
* user.cs_path: PATH that finds all the standard utilities
* user.bc_base_max: Max ibase/obase values in bc(1)
* user.bc_dim_max: Max array size in bc(1)
* user.bc_scale_max: Max scale value in bc(1)
* user.bc_string_max: Max string length in bc(1)
* user.coll_weights_max: Maximum number of weights assigned to an LC_COLLATE locale entry
* user.line_max: Max length (bytes) of a text-processing utility's input line
* user.re_dup_max: Maximum number of repeats of a regexp permitted when using interval notation
* user.posix2_version: The version of POSIX 1003.2 with which the system attempts to comply
* user.posix2_c_bind: Whether C development supports the C bindings option
* user.posix2_c_dev: Whether system supports the C development utilities option
* user.posix2_fort_dev: Whether system supports FORTRAN development utilities
* user.posix2_fort_run: Whether system supports FORTRAN runtime utilities
* user.posix2_localedef: Whether system supports creation of locales
* user.posix2_sw_dev: Whether system supports software development utilities
* user.posix2_upe: Whether system supports the user portability utilities
* user.stream_max: Min Maximum number of streams a process may have open at one time
* user.tzname_max: Min Maximum number of types supported for timezone names


фух, бля-дописал. это было не просто, надеюсь вам поможет.

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

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

пысысы линка в тему http://www.opennet.ru/tips/info/847.shtml

cyberb  06-07-2006 23:28
Вот решил воспользоваться свободным вечерком и написать данный тутор о несомненно полезной и нужной в хозяйстве вещи - sudo. Это программа часть портов и находится по адресу /usr/ports/security/sudo. Если вы внимательно читали этот тред, то у вас уже должен быть опыт в установке программ из портов, обновлении жизненно важных портов: ssh, named и openssl, а так же
юзании portaudit для целей проверки вашего дерева портов(о кста ща сам проверюсь... проблем не найдено). Все это несомненно
важно и нужно, но не стоит останавливаться на достигнутом и почевать на лаврах - идем дальше. При правильно настройке групп пользователей вы можете забыть пароль администратора и вспоминать его только при обновлении системы или портов(если они у вас не по крону обновляются), сделаем еще один шаг в освоении нужного дела-забытия рутового пасса. Зачем мне все это, спросите вы себя... ответ очень простой - что может сделать враждебный код из под рута, а что из под совершенно бесправного
пользователя? разница налицо? (ой бл* случайно закрыл окно - придется переписывать =/ ) Sudo является своебразным посредником между пользователем и правами root - вы можете разрешить пользователю выполнять любую команду от любого имени в системе, при этом все логгируется и если что, всегда можно вычислить накосячевшего злодея. Вы можете тонко назначить определенные доступные команды для пользователя... блин-отвлккают... причем выполняемые не только от root, но и от любого другого пользоватлея в системе. оК - хватит теории, попробуем продукт на зуб
1) Установка sudo
Даже не смешно =]
2) Настройка(рассматриваем на примере FreeBSD)
в папке /usr/local/etc лежит файл sudoers, который отвечает за разрешенные команды всем пользователям, НИКОГДА не редактируйте его руками, ибо как мона что-то там вписать неправильно и вы потеряете доступ к системе(ессно если у вас нету доступа к su - т.е. вы не в группе wheel) саму структуру sudoers можно посмотреть в
#man sudoers
Для его редактирования используется visudo.
#visudo -c -чекнуть на правильность ваш sudoers, остальные ключи по
#man visudo
У visudo в интерактивном режиме доступны клавиши:

visudo анализирует sudoers-файл после редактирования и не сохранит изменения если допущены ошибки. Найдя ошибку, visudo напечатает сообщение содержащие номер строки, в которой допущена ошибка и пользователь увилит "What now?"(что дальше?) запрос. В этот момент пользователь может нажать "e" для правки sudoers, "x" для выхода без сохранения или "Q"-опция - выход и сохранение."Q"-опция используемая с особой осторожностью, потому что если допущена ошибка, вы ниполучите доступ к sudo, пока ошибка не будет поправлена(ИМХО, глупо - можно просто иметь запасной акаует из группы wheel чтобы сначала su к нему, а потом su на root и все поправить). Если "e" введено для редактирования sudoers-файла после анализа ошибок курсор установится на строку, в которой была допущена ошибка(если редактор поддерживает эту опцию).

Вот собстна краткий перевод функционала sudoers, кстати редактор берется из $EDITOR, т.е. по умолчанию vi(а вы еще не в курсе, что команды этого
редактора НАДА знать всем). Редактор по умолчанию можно посмотреть так:
#echo $EDITOR
Базовый синтаксис примерно таков
username host=command
username - имя пользователя который может выполнять command(кстати необходимо указывать полный путь до команды ибо как любой смышленный прользователь сможет изменить свой $PATH и выполнять совсем не то, что вы ему прописали с провами даже root) на host Существует абстракция ALL, соответствующая всем пользователям/хостам/командам
wapa ALL=/usr/bin/something
Скажем ваш пользователь wapa на serv1 может выполнять command1 и command2, а на serv2 он имеет полный доступ, а на serv3 от имени пользователя user1 он может запустить command3 и command1(это тажа команда НО НА ДРУГОМ СЕРВЕРЕ) пишем:
wapa serv1=/usr/sbin/command1, /usr/bin/command1
wapa serv2=ALL
wapa serv3=(user1) /usr/local/bin/command3, /usr/sbin/command1
Если ваша строка слишком длинна используйте символ "|"
user serv=/path/command1 |
/path/command2
Помните, что неправильная настройка sudo может открыть дырочку в вашей системе безопастности, в то время как граматная настройка может серьезно поднять шансы вашей системы в противостоянии злоумышленникам. Сделаем себе аккаунт без привелегий, а через visudo сделаем примерно вот что
wapa ALL=ALL
пользователю wapa разрешили делать все на всех машинах. При первом использрвании sudo попросит ввести ВАШ(а не root) пароль, далее в течении 5 мин вы будете работать с sudo без пароля. по истечении 5 мин его придется ввести заново. Введем

#sudo -l
Password:
User wapa may run the following commands on this host:
(root) ALL

Наш wapa может выполнять все комманды =] посмотрим, как мы укрепили безопастность

#su
su: Sorry
sudo su
laptop#

Не буду приводить того, что wapa не в группе wheel
Так же возможны команды

#sudo -u user1 command1

Выполнять от user1 команду command1
А теперь посмотрим, как контролировать действия пользователей

#sudo tail -n 10 /var/log/messages
Jul 6 13:42:46 laptop sudo: wapa : TTY=ttyp2 ; PWD=/usr/home/wapa/.fluxbox ; USER=root ; COMMAND=/usr/local/sbin/portaudit Fda
Jul 6 13:43:00 laptop sudo: wapa : TTY=ttyp2 ; PWD=/usr/home/wapa/.fluxbox ; USER=root ; COMMAND=/usr/sbin/portsnap fetch update
Jul 6 13:45:14 laptop sudo: wapa : TTY=ttyp2 ; PWD=/usr/local/bin ; USER=root ; COMMAND=/usr/bin/ldd sudo
Jul 6 14:48:04 laptop su: BAD SU wapa to root on /dev/ttyp1
Jul 6 14:48:17 laptop sudo: wapa : 3 incorrect password attempts ; TTY=ttyp1 ; PWD=/usr/home/wapa ; USER=root ; COMMAND=/usr/bin/su
Jul 6 14:48:27 laptop sudo: wapa : TTY=ttyp1 ; PWD=/usr/home/wapa ; USER=root ; COMMAND=/usr/bin/su
Jul 6 15:34:44 laptop sudo: wapa : TTY=ttyp2 ; PWD=/usr/bin ; USER=root ; COMMAND=list
Jul 6 15:37:32 laptop su: BAD SU wapa to root on /dev/ttyp2
Jul 6 15:37:40 laptop su: BAD SU wapa to root on /dev/ttyp2
Jul 6 15:38:29 laptop sudo: wapa : TTY=ttyp2 ; PWD=/usr/home/wapa ; USER=root ; COMMAND=/usr/bin/su

Вот и все, мы научились примитивно настраивать sudo и контролировать какая редиска нам испортила что-то. Теперь можно просто забыть пароль root =)
И спокойно жить))

s1lv3r  07-07-2006 12:34
по поводу забыть root passwd ;) немного humor :lol:

никогда не заходил root'ом
правлю все конфиги в /etc и даже мастер-пассворд из под юзера не пользуясь всякими там su и прочими sudo
также пересобираю и меняю ядро

метод прост
когда система вдруг начинает требовать какой то дурацкий пароль какого то root'а (который я забыл сразу после установки )
- наносишь два мощных удара рукой по системнику сверху - и после паузы - мощный пинок ногой сбоку - система пугается и пускает тебя дальше
очевидно ИИ заложенный втихаря разработчиками понимает что дальше будет хуже...
P.S. ИИ - Искуственный Интеллект для тех кто в танке

cyberb  26-09-2006 22:36
Не использовать cvsup - в пень его, на 333 "пне" он компилился со всеми пакетами более 3 часов. В место этого "чуда" используем компоненты в поставке системы

1) Порты
Утилита portsnap. Работает примерон так
1й раз

#portsnap fetch
#portsnap extract
#portsnap update

Все остальные

#portsnap fetch update


2) Система
Утилита csup. Сиснтаксис конфига как у cvsup-supfile(если честно я этот же файл и использую), так что смотрите, отдельную тему про обновление системы может напишу позже, ибо как уже грабли съел на этой капусте.

ПыСы
Справедливо для 7-current ветки, тоесть в 6.1 p0 я этого не нашел

s1lv3r  27-09-2006 11:24
плотно юзаю portsnap уже пару лет, очень удобная вещь...
автор portsnap так же разработал freebsd-update систему бинарного обновления
работающую по тому же принципу... данная тулза равно как и portsnap уже содержится в base system, в ближайшее время попробую начать использовать...

Macmep  27-09-2006 14:15
portsnap в 5.5 и 6.х уже живет в стандартном билде с конфигом /etc/portsnap.conf
По сему с дисков установочных уже давно никакие пакаджи не ставлю. cvsup-without-gui тежеленный из-за ezm. Есть правда старенький cvsup-lite, крохотный, но он скомпилен с либами от 4.х и не стартует. Можно правда compat4х для него прикрутить и тогда все оки-доки :)

cyberb  09-12-2006 01:30
Эмм, даже не знаю как начать. Как-то на десктопе плотно перешел на BSD и не жалею, а када жалею конекчусь к терминалу w2k3 и ни в чем се не отказываю. И так набор портов, который я юзаю для рутины:

1) Читем chm файлы - книги, etc
Port: xchm-1.9
Path: /usr/ports/deskutils/xchm
Info: Windows HTML Help (.chm) viewer for UNIX

2) Читаем pdf - книги, etc
Port: acroread7-7.0.8,1
Path: /usr/ports/print/acroread7
Info: Adobe Reader for view, print, and search PDF documents (ENU)

3) Слушаем mp3 в стиле Winamp
Port: xmms-1.2.10_6
Path: /usr/ports/multimedia/xmms
Info: X Multimedia System --- An audio player with a Winamp GUI

4) Готовим схемы/графики
Port: dia-0.95,1
Path: /usr/ports/graphics/dia
Info: Diagram creation program, similar to Visio
Maint: gnome@FreeBSD.org

5) Смотрим фильмы(и двд тоже)
Port: mplayer-0.99.8_5
Path: /usr/ports/multimedia/mplayer
Info: High performance media player/encoder supporting many formats
Maint: riggs@rrr.de

6) Готовим документы - текстовый процессор(мона использовать и OpenOffice)
Port: abiword-2.4.5_2
Path: /usr/ports/editors/abiword
Info: An open-source, cross-platform WYSIWYG word processor


остальное потом))

s1lv3r  09-12-2006 14:26
В дополнение к сказанному...
Любителям десктопов под FreeBSD + KDE посвящается продолжение. ;)

Смотрим мультимедиа файлы (фото видео) в стиле ACDSee
Port: gwenview-1.4.0
Path: /usr/ports/graphics/gwenview
Info: An image viewer and browser for the KDE environment
WWW: http://gwenview.sourceforge.net

Бродим по системе в стиле Total Commander
Port: krusader-1.70.1
Path: /usr/ports/x11-fm/krusader
Info: A two window file-manager for KDE, like midnight or norton commander
WWW: http://krusader.sourceforge.net

Пишем диски в стиле Nero
Port: k3b-0.12.17
Path: /usr/ports/sysutils/k3b
Info: A CD/DVD recording GUI for KDE
WWW: http://www.k3b.org/

Просто аська
Port: sim-im-devel-0.9.5.1538
Path: /usr/ports/net-im/sim-im-devel
Info: Plugin-based instant messenger
WWW: http://sim-im.org/

В качестве офисного пакета все же OpenOffice
Port: openoffice.org-2.2.20061124
Path: /usr/ports/editors/openoffice.org-2-devel
Info: Integrated wordprocessor/dbase/spreadsheet/drawing/chart/browser(developer version)
WWW: http://www.openoffice.org/

Вот пока так ;)

s1lv3r  21-12-2006 10:08
А с недавнего времени в качестве десктопа используем 7-CURRENT ;)
[silver@FreeBSD] /usr/home/silver# uname -a
FreeBSD FreeBSD.domain.local 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Tue Dec 19 09:45:38 EET 2006 root@FreeBSD.domain.local:/usr/obj/usr/src/sys/SILVER i386

cyberb  18-01-2007 01:09
С весны на карент))

Есть очень интересный вопросец - управление виндовыми серверами с FreeBSD. Как то Мастер привел это как отмазку тому факту, что у него на Лапте стоит XP, что-то вроде не рулитсо винда, но она-то на самом деле рулитсо rdesktop-ом ;) Была там проблемка - русский шрифт вот НИКАК не врубалсо у меня. Седня в 1.06 ночи встал вопрос подрубления русской раскладки ребром в шею - выполнение ДЗ по дискретной мате, а на винды я садитсо не хочу - там неудобное место и ваще моник голяк. Углубившись в маны нашел таки решение, публикую для широкой общественности


> cd /usr/ports/net/rdesktop/work/rdesktop-1.5.0/keymaps/
> cp "en-us" /usr/home/user/.rdesktop/keymaps/
> cp ru /usr/home/user/.rdesktop/keymaps
> rdesktop -k ru -k en-us 192.168.1.2


И рулите)))) Би-бииии =))

Переключение у мя работает только када я щелкну внизу и выберу ручками RU, т.к. на данной комбинации в FreeBSD висит переключение

cyberb  18-01-2007 01:19
Када я русифицировал свой environment системные шрифты(это менюшки всех программ, скажем XMMS) стали просто микроскопическими. Полечилось вот так:


> cd /usr/local/share/themes/Default/gtk/
> cat gtkrc.ru
style "gtk-default-ru" {
fontset = "-*-helvetica-medium-r-normal--14-*-*-*-*-*-koi8-r,\
-*-arial-medium-r-normal--14-*-*-*-*-*-koi8-r,\
-*-terminus-medium-r-normal-*-12-*-*-*-*-*-koi8-r"
}
class "GtkWidget" style "gtk-default-ru"
include "/usr/local/share/themes/Default/gtk/gtkrc"
>


Я просто добавил в конец реальный шрифт(terminus), который выбрал с помощью программы xfontsel(в стандартной поставке). Кста, остальные шрифты мона удалить.

Рулите дальше)))

cyberb  25-01-2007 20:38
Никто наш раздел не читает =(( Ну и фиг с ним, если у самого памят отшибнет - будет где посмотреть.

Надоело мне как-то давно ситуация, когда устанавливаешь порт, а он тянет за собой еще тучу всякого барахла и научился я немного этим процессом управлять - часта man-знания.

Итак из того что все известно:

# make install
# make deinstall
# make clean

Установить, удалить, почистить после сборки(место освобождает удаляя всякий шлак)
А теперь не совсем известные директивы(ну которыми я пользуюсь):

# make depends
# make missing
# make config
# make rmconfig
# make patch
# make fetch

Собрать зависимости(скомпилировать), вывести порты, которых нехватает для сборки данного порта(я особенно в X смотрю - а то некоторые прикалываются списоками в 2 экрана), сконфигурировать сборку(при установке доступны некоторые манипуляции с тем, каким вы хотите выдеть порт, если вы устанавливали порт и сейчас хотите его переустановить с другими флагами вам это поможет), удалить соотв конциг сборки порта, применить патчи к исходнику, выкачать порт, но не компилить

Вот вроде все чем я пользуюсь в работе с портами.

s1lv3r  25-01-2007 22:03
cyberb я читаю... ;)
вот мои 5 копеек на счет портов...
полезные переменные окружения
например MASTER_SITE_OVERRIDE позволяет в первую очередь загружать distfiles с указанного источника, по умолчанию используется содержжимое переменной MASTER_SITES из Makefile порта
для меня ближе ftp2.ru.FreeBSD.org поэтому в профайле шелла есть следующая запись

MASTER_SITE_OVERRIDE=http://ftp2.ru.FreeBSD.org/pub/FreeBSD/ports/distfiles/; export MASTER_SITE_OVERRIDE

а вообще очень много полезного можно подчеркнуть их /usr/ports/Mk
например все список переменных и таргетов для make содержится в bsd.port.mk
IMHO очень полезно для ознакомления ;)

cyberb  25-01-2007 22:16
Ну я тя в рассчет не беру))) я в плане притока новых мозгов - я оверайд не использую(пока), т.к. стоимость траффика равная, а с РУС сервером я разок накололся - у него старый апдейт лежал, который не компилилсо.

Раз такая пьянка)) то поехали по make.conf. Для начала есть азбука, вызываетсо командой

hosteg# vi /usr/share/examples/etc/make.conf

Там читаетсо нечто умное, вот мой пример:

hosteg# cat /etc/make.conf
WITHOUT_X11= yes
CFLAGS=-O2 -pipe

SUP_UPDATE= yes
SUP= /usr/local/bin/cvsup
SUPFLAGS= -g -L 2
SUPHOST= cvsup4.ru.FreeBSD.org
SUPFILE= /root/cvsup/cvs-supfile
# added by use.perl 2007-01-25 17:46:21
PERL_VER=5.8.8
PERL_VERSION=5.8.8


Там еще мона вкрутить вот это:

#PORTSSUPFILE= /usr/share/examples/cvsup/ports-supfile
#DOCSUPFILE= /usr/share/examples/cvsup/doc-supfile


но мне это не нада: порты идут через portsnap, а доки через:

hosteg# cat /root/cvsup/cvs-supfile
*default host=cvsup4.FreeBSD.org
*default base=/usr
*default release=cvs tag=RELENG_6_1
*default delete use-rel-suffix

*default compress
src-all
doc-all
hosteg#


ПЫСЫ :lol: БГГ, даже не спросили зачем это все делаем - БГГГ
А вот примерно зачем:

hosteg# cd /usr/src/
hosteg# make update
--------------------------------------------------------------
>>> Running /usr/local/bin/cvsup
--------------------------------------------------------------
ПОНЕСЛАСЬ


удобнее, не правда ли?))

Рулим дальше :whist:

ПыСыСы
Пример сильвера

# Start by downloading from a Danish mirror
MASTER_SITE_BACKUP?= \
ftp://ftp.dk.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/

# Make FreeBSD start getting distfiles (source for ports) from local
# freebsd mirror
MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}

# Try mirrors close to Denmark first.
MASTER_SORT?= .dk sunet.se .se dk.php.net .no .de mirrorservice.org \
.uk .at heanet.dl.sourceforge.net .nl


Это с дневника админа freebsd.org =))

ПыСыСыСы Ща Мастер напишет, что я кругом напортачил)))
И то что написано ниже сильвером, есть выше и подробнее by cyberb feat Мастер

s1lv3r  25-01-2007 22:28
а еще обязательно в make.conf добавляем
NO_OPENSSH= # do not build OpenSSH
NO_OPENSSL= # do not build OpenSSL (implies NO_KERBEROS/NO_OPENSSH)
чтобы после пересборки мира не портить малину
и ставим из портов security/openssh-portable и security/openssl ибо в портах это счастье обновляется чаще, продакшн становится чуток секурнее и на душе приятно ;)

s1lv3r  26-01-2007 23:53
в 7-CURRENT для того чтобы заработала линукс эмуляция не забываем использовать в sysctl.conf compat.linux.osrelease=2.6.16