пятница, 28 декабря 2007 г.

Пиарю Firefox :)

Добавил в блог кнопку со ссылкой на новый сайт www.spreadfirefox.com. Пиарю свой любимый браузер Firefox :)

четверг, 20 декабря 2007 г.

Монтирование разделов при запуске Jail

В rc.conf есть два интересных параметра, позволяющих при запуске jail монтировать необходимые разделы:
jail_<jail_name>_mount_enable="YES"
jail_<jail_name>_fstab="/path/to/fstab/file"

jail_<jail_name>_mount_enable разрешает монтировать разделы по списку в файле, указанного в jail_<jail_name>_fstab.
Формат файла идентичен формату /etc/fstab. Все пути к монтируемым точкам внутри jail задаются относительно корня основной системы.

Монтирование можно применить для усиления защиты jail при их взломе. Например, в случае если система в jail будет скомпрометирована, то злоумышленник не сможет подменить системные утилиты т.к. папки /usr/bin или /usr/lib примонтированы только чтения и не могут быть изменены.

Для этого нужно:
1. Создать папки:
▪ для jail-машин /opt/jail
▪ папку для конфигурационных файлов /opt/jail/conf
▪ папку Base для базового jail /opt/jail/Base

2. В папке Base создать базовый jail и настроить его (Например установить дополнительные и настроить пакеты perl5/sudo/etc, прописать DNS сервер).

3. Потом воспользоваться приведенным ниже скриптом new-jail.conf, предварительно изменив переменные J и JAIL_EXAMPLE (если у вас другое размещение jail).
Запуск скрипта от имени пользователя root:
# JAIL=New-jail-name ./new-jail.sh
Скрипт создает точки монтирования папок и копирует etc, var и usr/local из базового скрипта в новый jail. Потом в /opt/jail/conf создается файл в формате fstab и производится попытка записи параметров jail в /etc/rc.conf. Если /etc/rc.conf недоступен для записи, скрипт выводит список параметров.

Скрипт new-jail.conf:

#!/bin/sh
J="/opt/jail"
JAIL=${JAIL:?'$JAIL is not set'}
JAIL_LOWER="`echo $JAIL | /usr/bin/tr A-Z a-z`"
JAILDIR="$J/$JAIL"
JAIL_EXAMPLE="$J/Base"
DIR_EMPTY="dev proc media cdrom mnt boot rescue root usr usr/home usr/src usr/ports"
DIR_MOUNT="bin lib libexec sbin usr/bin usr/include usr/lib usr/libdata usr/libexec usr/sbin usr/share"
#Jail directory
echo -n "Checking $JAILDIR directory... "
if [ ! -e $JAILDIR ];
then {
/bin/mkdir -p $JAILDIR;
echo "created.";
}
else echo "already exists.";
fi;
# Empty directories
echo -n "Creating empty directories: $DIR_EMPTY... "
for dir in $DIR_EMPTY; do /bin/mkdir -p $JAILDIR/$dir; done;
echo "ok.";
# Mount points
echo -n "Creating mount points: $DIR_MOUNT... "
/usr/bin/touch $J/conf/$JAIL.fstab
echo "# Generated on `/bin/date`" >> $J/conf/$JAIL.fstab
for dir in $DIR_MOUNT;
do {
/bin/mkdir -p $JAILDIR/$dir;
printf "$JAIL_EXAMPLE/$dir\t$JAILDIR/$dir\tnullfs\tro\t0\t0\n" >> $J/conf/$JAIL.fstab;
} done;
echo "ok.";
echo "The fstab file created: $J/conf/$JAIL.fstab"
# Symbolic links
/bin/ln -s usr/home $JAILDIR/home
# Temporary directory
echo -n "Creating tmp... "
/bin/mkdir $JAILDIR/tmp
/bin/chmod ugo=rwx $JAILDIR/tmp
echo "ok.";
# Directories from $JAIL_EXAMPLE
echo -n "Copying files... "
/bin/cp -pR $JAIL_EXAMPLE/etc $JAILDIR/
/bin/cp -pR $JAIL_EXAMPLE/var $JAILDIR/
/bin/cp -pR $JAIL_EXAMPLE/usr/local $JAILDIR/usr/

/bin/rm -f $JAILDIR/var/{tmp,run}/*
for i in `/usr/bin/find -E $JAILDIR/var/log -type f \
-and -regex ".*\.[0-9]+(\..*|$)" -print`;
do /bin/rm -f $i; done;
for i in `/usr/bin/find $JAILDIR/var/log -type f -print`;
do /usr/bin/touch /dev/null > $i; done;

echo "ok.";
echo
echo The jail \'$JAIL\' created.
echo
if [ -w /etc/rc.conf ];
then {
/usr/bin/sed -Ei .bck '/^[\s]*jail_list=/s#jail_list="([^"]*)"#jail_list="\1 '${JAIL_LOWER}'"#g' /etc/rc.conf
echo >> /etc/rc.conf
echo \#\# ${JAIL} >> /etc/rc.conf
echo jail_${JAIL_LOWER}_rootdir=\"$J/${JAIL}\" \
>> /etc/rc.conf
echo jail_${JAIL_LOWER}_hostname=\"${JAIL}.local\" \
>> /etc/rc.conf
echo \# Don\'t forget add ip-address in \'.local\' domain zone \
>> /etc/rc.conf
echo jail_${JAIL_LOWER}_ip=\"127.0.0.xxx\" \
>> /etc/rc.conf
echo jail_${JAIL_LOWER}_interface=\"lo0\" \
>> /etc/rc.conf
echo jail_${JAIL_LOWER}_devfs_enable=\"YES\" \
>> /etc/rc.conf
echo jail_${JAIL_LOWER}_exec_start=\"/bin/sh /etc/rc\" \
>> /etc/rc.conf
echo jail_${JAIL_LOWER}_exec_stop=\"/bin/sh /etc/rc.shutdown\" \
>> /etc/rc.conf
echo jail_${JAIL_LOWER}_mount_enable=\"YES\" \
>> /etc/rc.conf
echo jail_${JAIL_LOWER}_fstab=\"$J/conf/${JAIL}.fstab\" \
>> /etc/rc.conf
}
else echo "Put in /etc/rc.conf:";
fi;
echo jail_${JAIL_LOWER}_rootdir=\"$J/${JAIL}\"
echo jail_${JAIL_LOWER}_hostname=\"${JAIL}.local\"
echo \# Don\'t forget add ip-address of jail in \'.local\' domain zone
echo jail_${JAIL_LOWER}_ip=\"127.0.0.xxx\"
echo jail_${JAIL_LOWER}_interface=\"lo0\"
echo jail_${JAIL_LOWER}_devfs_enable=\"YES\"
echo jail_${JAIL_LOWER}_exec_start=\"/bin/sh /etc/rc\"
echo jail_${JAIL_LOWER}_exec_stop=\"/bin/sh /etc/rc.shutdown\"
echo jail_${JAIL_LOWER}_mount_enable=\"YES\"
echo jail_${JAIL_LOWER}_fstab=\"$J/conf/${JAIL}.fstab\"

вторник, 18 декабря 2007 г.

CURL: Хитрости нашего пруда

< поскипан нудный и долгий рассказ про взаимоотношения провайдеров нашего городка >

У локальных (городских) хранилищ файлов все несколько попроще, чем например в http://www.depositfiles.com, и их вполне можно заюзать в несложных shell-скриптах. Например чтобы одной командой кинуть файл в хранилище я сделал такой алиас (shell: tcsh):

$ cat >> ~/.tcshrc
alias lg_up sh -c "'"'file="\!*"; \
[ -z "$file" ] && exit; \
/usr/local/bin/curl -F userfile=@$file -F action=1 -F \
agreelicense=checkbox http://share.service.ru/upload.php | \
grep -oE "http://share\.service\.ru/[0-9]+" | head -n 1'"'"

Если файл успешно закачался - выдается ссылка на него.
Пример использования: lg_up <имя_файла>

Можно пойти еще дальше и написать скрипт, который по заранее созданному списку выкачивает файлы с интернета и кидает их в хранилище. А пользователю отправляется письмо со ссылками на файлы в хранилище. Примерно так (download.sh)


#!/bin/bash

wget=$(which wget);
curl=$(which curl);
if [ -z "$wget" ] || [ -z "$curl" ]; then exit 1; fi;

curl_path='http://share.server.ru/upload.php'

if [ -f "$1" ];
then {
if [ ! -z "$2" ];
then {
limit="--limit-rate=$2";
} fi;
list=$(< $1);
pwd=$(pwd);
IFS="
";

for i in $list;
do {
echo "Качаем файл по адресу: $i";
file="$(echo -n "$i" | grep -oE '[^/]+$')";
if [ ! -z "$file" ];
then {
$wget --tries=3 -nv $limit -O $pwd/"$file" "$i"
if [ -f "$pwd/$file" ] && [ -s "$pwd/$file" ];
then {
url=`$curl -F userfile=@$pwd/$file -F action=1 \
-F agreelicense=checkbox $curl_path | \
grep -oE 'http://share\.server\.ru/[0-9]+' | \
head -n 1`;

echo "Файл $file доступен по адресу: $url";
};
else {
echo "Файл $file не существует или пуст";
} fi;
};
else {
echo "Неверное имя файла";
} fi;
echo;
} done;
};
else {
echo "Не задан файл со списком";
} fi;


А используется так: ./download.sh <файл со списком> | mail -s 'Downloaded files' my@mail.ru

среда, 12 декабря 2007 г.

Как распрощаться с Windows?

Все гениальное - просто. Как именно? Смотрите тут :)

1 января 2008 года вступит в силу часть IV Гражданского кодекса Российской Федерации

С 1 января 2008 года, все архивы музыки, фильмов и другого медийного контента на который распространяется «Закон об авторских и смежных правах», будут вне закона - если только их владельцы не купят специальную лицензию. Подробнее тут и тут.

Что народ думает по этому поводу? Мне лично пока фиолетово: фильмы не смотрю и музыку не слушаю.

понедельник, 10 декабря 2007 г.

Статья про софтварные патенты

Написано на простом и понятном языке. Смотреть тут: http://docs.google.com/View?docid=df35c2hq_18cp4d53dq (автор: Зуев Федор Леонидович)

суббота, 8 декабря 2007 г.

Российская система распознавания текстов CuneiForm станет открытой

Хочется чтобы нас всегда с утра так радовали. В www.cybersecurity.ru опубликована новость о грядущем открытии компанией Cognitive Technologies исходных кодов своей некогда популярной программы CuneiForm. Становится вдвойне радостно если учесть, что сейчас практически нет опенсурцной альтернативы проприетарным программам для распознавания текстов (с поддержкой русского языка).
Хочется надеяться, что 12 декабря новость подтвердится и нам больше не придется пользоваться варезной и падучей в Wine программой FineReader.

Не допустим позора! Скажем нет OOXML!

6 декабря сего года на один из моих почтовых ящиков пришло письмо такого содержания
«Dear Petr Sleptsov,
You signed the <no>OOXML petition, a movement backed now by more than 70.000 supporters worldwide. Our effort to influence the OOXML (Office Open XML) standardization process has been an astonishing success so far. We aim for at least 100.000 signatures in February when the Geneva Ballot Resolution Meeting (BRM) will convene with the aim to resolve comments.

Microsoft is trying by all means to get its "standard" adopted without substantial changes despite of its thousands of officially reported technical flaws and the pre-existence of ISO 26300:2006 (OpenDocument, ODF) as the most appropriate international standard for the representation of office documents.

By next Tuesday Dec 11 2007 delegates from your National Standards Body GOST who will participate in the BRM have to be announced to ISO. At least Portugal and Ireland will be represented by Microsoft. In many other countries, we know that Microsoft gold partners are proposing themselves as heads of national delegations. Many of them will prevail if we do not take action.

Will you let Microsoft represent your country at Geneva and decide the future of OOXML?

You can make a difference and call now GOST at +7-495-2364044 and help us to find out:

a. Who will represent GOST on DIS 29500 at the Ballot Resolution Meeting in Geneva?
b. When will the decision on delegates be made and if GOST is aware of the Dec 11 deadline?
c. Does your national delegates for the BRM are independent enough from Microsoft?
d. Does the responsible Committee of GOST for DIS 29500 work on resolution proposals for all the 3500 comments tabled or - if at all - only for the national comments that they submitted?

Please report your findings by replying to this email, we will update this page with the members of each national delegation:

http://www.noooxml.org/brm

More things that you can do to help our effort against this broken standard proposal:

1. Join our mailing list and get in touch with many other activists: http://lists.ffii.org/mailman/listinfo/noooxml-club
2. Become a member of FFII, the worldwide association leading the <no>OOXML campaign: http://action.ffii.org/member_application
3. Become a member of DIGISTAN, the organization for the promotion of true digital open standards worldwide; please indicate your interests to: members@digistan.org
4. Blog about OOXML which shapes the public debate; blogging has been instrumental to our success in Sweden for example;
5. support our campaign work with financial means:
http://www.noooxml.org/donations

Best regards,

--
Benjamin Henrion <bhenrion@ffii.org>
<no>OOXML Campaign leader»

что можно перевести так:
«
С двадцать пятое по двадцать девятое декабря в Женеве будет проходить "BRM" - Ballot Resolution Meeting, встреча делегаций восьмидесяти семи стран, которые принимали участие в голосовании об OOXML второго сентября 2007 года. До одиннадцатого декабря страны должны представить информацию о составе своих делегаций: имена главы делегации и двух его помощников.

Сегодня письмо с риторическим вопросом "Можете ли вы позволить Microsoft представлять Россию на голосовании о будущем OOXML?" получили те, кто подписывал петицию против OOXML. Бенджамин Хэнрион (Benjamin Henrion), чьим именем подписана рассылка, призывает небезразличных не допустить повторения сентябрьского позора, позвонить в Российское Федеральное агенство по техническому урегулированию и метрологии (в письме даже указан номер: +7-495-2364044), с тем, чтобы уточнить следующие моменты:
• Кто будет представлять Россию на февральском BRM в Женеве?
• Когда будет вынесено решение о составе делегации, не обеспокоено ли ФАТУиМ близостью дэдлайна для этого решения - одиннадцатого декабря?
• В достаточной ли мере делегация окажется независимой от Microsoft?
• Отвечает ли ФАТУиМ за то, что им были рассмотрены все три с половиной тысячи комментариев к формату, написанных другими странами при первом голосовании?
» (текст перевода: http://www.linux.org.ru/view-message.jsp?msgid=2323188)

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

суббота, 1 декабря 2007 г.

Samba внутри jail + MS AD

На сервере был поднят веб-сервер с сайтом компании и поддерживать его поручили мне. Так как мне очень не хотелось перегонять файлы по FTP туда и обратно, решил поднять сервер Samba и через его шары рулить файлами сайта. И дизайнерам будет проще править дизайн. Чтобы не засорять систему поднял jail для Samba.

Порядок действий внутри созданного jail:
1. cd /usr/ports/net/samba3
2. в make config отметил:

[X] LDAP         With LDAP support
[X] ADS With Active Directory support
[X] WINBIND With WinBIND support
[X] UTMP With UTMP accounting support
[X] MSDFS With MSDFS support
[X] POPT With system-wide POPT library

3. И далее установил командой make install.
4. Настроил Kerberos5:
# cat > /etc/krb5.conf
[libdefaults]
default_realm = MY-DOMAIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false

[realms]
MY-DOMAIN.LOCAL = {
kdc = MY-DOMAIN.LOCAL
admin_server = MY-DOMAIN.LOCAL
kpasswd_server = 192.168.0.1
default_domain = my-domain.local
}

[domain_realm]
.my-domain.local = MY-DOMAIN.LOCAL

[logging]
default = FILE:/var/log/kerberos/krb5libs.log
kdc = FILE:/var/log/kerberos/krb5kdc.log
admin_server = FILE:/var/log/kerberos/kadmind.log
Где my-domain.local домен MS Active Directory.
Проверяем:
# kinit root
root@MY-DOMAIN.LOCAL's Password:
kinit: NOTICE: ticket renewable lifetime is 1 week

Если выходит другое сообщение - проверяем файл конфигурации.

4. Файл конфигурации Samba:
# cat > /usr/local/etc/smb.conf
[global]
# Имя домена
workgroup = MY-DOMAIN
realm = MY-DOMAIN.LOCAL
server string = Samba Server

# Машина в Active Directory
security = ads
hosts allow = 192.168.0.
# Принтеры нам не нужны
load printers = no
show add printer wizard = no

log file = /var/log/samba/log.%m
# Контроллеры домена
password server = pdc.my-domain.local bdc.my-domain.local

# Имя samba сервера
netbios name = FILESRV

# IP-адрес jail
bind interfaces only = yes
interfaces = 192.168.0.23/24

auth methods = winbind
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
winbind refresh tickets = Yes
case sensitive = No
hide unreadable = Yes
socket options = TCP_NODELAY
dns proxy = no
display charset = koi8-r
unix charset = koi8-r
dos charset = cp866
[homes]
comment = Home Directories
browseable = no
writable = yes
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes

4. Правим /etc/hosts:
192.168.0.23 FILESRV FILESRV.MY-DOMAIN.LOCAL
Иначе машина не войдет в домен.

5. Правим /etc/resolv.conf:
search my-domain.local
nameserver 192.168.0.xxx

Где 192.168.0.xxx ip-адрес DNS Active Directory.

6. Правим /etc/nsswitch.conf:
« ... skip ... »
group: files winbind
passwd: files winbind

« ... skip ... »

7. Вгоняем машину в домен:
# net ads join -U root
Если машина вошла в домен, на всякий случай проверяем:
# wbinfo -u
« ... Список пользователей домена ... »
# wbinfo -g
« ... Список групп домена ... »

8. Запускаем Samba:
# /usr/local/etc/rc.d/samba start