Шукати в цьому блозі

понеділок, 16 липня 2012 р.

Debian: i386 параллельно с amd64

- Есть ли жизнь на Марсе?
- Тоже нет!

Добавить архитектуру i386 в дистрибутив amd64 в Debian'е сейчас не просто, а очень просто:
sudo dpkg --add-architecture i386
После чего наслаждаемся возможностью установки пакетов архитектуры i386.
Зачем это надо?
Ну, к примеру, совсем недавно в Debian Sid куда-то делся ia32-libs, а skype 64-й архитектуры отказался без него работать и рекомендовал себя удалить. Пришлось ставить skype архитектуры i386 и продолжить наслаждаться общением:
sudo dpkg -i ./skype-install-i386.deb
sudo apt-get install -f

субота, 7 липня 2012 р.

Использование разрешений POSIX в Linux

Томас Бёчлер (Tomas Bächler), перевод: attila
Оригинал http://archlinux.me/brain0/

В традиционных системах UNIX существовал единственный уровень привилегий: суперпользователь (root). Если вы root, вам позволено все. Но и простые пользователи иногда должны иметь возможность выполения привилегированных операций.

Есть два простых решения:
  1. временное получение прав суперпользователя, используя su или sudo;
  2. установка setuid бита на исполняемом файле.
В обоих случаях вы получаете привилегии суперпользователя целиком, и хотя таким образом обычно запустить только весьма ограниченное команд, ошибки в этих программах или библиотеках создают угрозу взлома. Злоумышленник может заставить делать программу то, для чего она изначально не предназначалась, вплоть до запуска командой оболочки root’а.

В 1997 году комитет по стандартам (POSIX 1003.1e) создал черновую версию стандарта расширений механизма защиты. Одно из таких расширений разбивает привилегии root на части, позволяя давать задача лишь часть его привилегий. Хотя этот стандарт так и остался черновиком, спецификация была завершена и фактически реализована в ядре Linux.

Начиная с версии 2.2, ядро Linux при выполнении системного вызова проверяет, есть ли у процесса необходимые разрешения, вместо проверки root ли вы. Процесс имеет три набора прав доступа: доступный (permitted), наследуемый (inheritable) и текущий (effective). Именно последний набор используется ядром при проверке, дозволяется ли процессу выполнение определенных операций. Наследуемые разрешения передаются новой программе при выполнении execve. Доступные же разрешения ограничивают множество всех возможных текущих разрешений, на которые только процесс может рассчитывать. Кроме того, процесс может добавлять в свой наследуемый набор только разрешения из доступного набора (если только у процесса не имеется разрешения CAP_SETPCAP в списке текущих, об этом позже).

Как процесс может управлять своими наборами разрешений, подробно описано в [4].

В ядре 2.6.24 был реализован механизм «файловых разрешений», позволяющий администратору присваивать разрешения определенным исполняемым файлам, которые получат пользователи, когда запустят их.

Полный список разрешений приведен в ман-странице capabilities (7) и в заголовочном файле /include/linux/capability.h. Примеры ниже будут касаться разрешения CAP_NET_RAW. Но прежде всего вы должны убедиться, что библиотека libcap 2.X установлена в системе. (Если вы используете Arch Linux, скорее всего, она уже установлена как зависимость coreutils).
$ pacman -Q libcap
libcap 2.19-1
$ pacman -Ql libcap | grep bin/
libcap /usr/sbin/
libcap /usr/sbin/capsh
libcap /usr/sbin/getcap
libcap /usr/sbin/getpcaps
libcap /usr/sbin/setcap
{
Для Debian'а:
$ aptitude show libcap2 libcap2-bin
$ apt-file show libcap2 | grep bin/ | grep -v doc
libcap2-bin: /sbin/capsh
libcap2-bin: /sbin/getcap
libcap2-bin: /sbin/getpcaps
libcap2-bin: /sbin/setcap
}

Мы будем использовать утилиту setcap для управления разрешениями файлов. Для этого файловая система должна поддерживать расширенные атрибуты файлов (это, например, ext2/ext3/ext4). Прежде чем мы, наконец, начнем действовать, рассмотрим, что означают термины доступный, наследуемый и текущий наборы в контексте файловых разрешений.

Доступные разрешения исполняемого файла становятся доступными разрешениями процесса после запуска файла, вне зависимости от наследуемых разрешений процесса. Наследуемые разрешения файла соотносятся с наследуемыми разрешениями процесса, и «пересечение» добавляется к доступным разрешениям процесса. Текущее разрешение файла — это даже не набор, а единственный бит. Если он установлен, после запуска файла все доступные разрешения процесса становятся его текущими разрешениям, если нет — ни одно из доступных разрешений не будет текущим.

Итак, начнем. Файл /bin/ping традиционно имеет установленный setuid-бит для работы:
$ ls -l /bin/ping
-rwsr-xr-x 1 root root 30824 Фев 23 21:40 /bin/ping
Уберем его и установим текущий бит и CAP_NET_RAW разрешение:
$ chmod -s /bin/ping
$ setcap cap_net_raw=ep /bin/ping
$ getcap /bin/ping
/bin/ping = cap_net_raw+ep
ping продолжает работать! То же самое можно проделать и с traceroute. Но есть программы, с которыми это не проходит. Некоторые программисты считают нужным проверить, root ли вы, перед выполнение определенного системного вызова. Так, программа tcptraceroute содержит такой код:
if (getuid() & geteuid())
fatal("Got root?\n");
Эта программа не будет работать без прав суперпользователя, даже если разрешить CAP_NET_RAW.

Хорошо, но как сделать, чтобы привилегированные функции программы были доступны лишь некоторым пользователям? Чтобы решить эту проблему, Tomas Bächler написал небольшую утилиту, capsudo. Для работы этой утилиты необходмо наличие libcap и iniparser в системе. Сборка и установка выполняется командами make и make install. Исполняемый файл capsudo должен иметь установленное разрешение CAP_SETPCAP.  CAP_SETPCAP позволяет процессу добавлять в набор наследуемых любые разрешения, даже те, которые отсутствуют среди доступных, но не позволяют им быть доступными, пока не будет выполнена программа с установленным соотетсвтующим наследуемым разрешением файла.

Установим для /bin/ping CAP_NET_RAW в качестве наследуемого разрешения:
$ setcap cap_net_raw=ei /bin/ping
и добавим следующую секцию в /etc/capsudoers:
[ping]
caps = cap_net_raw
command = /bin/ping
users = user1 user2
allow_user_args = 1
Теперь пользователи user1 и user2 могут запускать ping без прав суперпользователя командой
capsudo ping 127.0.0.1
Просто команда `ping’ работать уже не будет, так как у файла /bin/ping есть только наследуемое разрешение, а не доступное. Процесс же capsudo, проверив права пользователя в /etc/capsudoers, добавляет CAP_NET_RAW-разрешение в список своих наследуемых разрешений (это ему позволено, так как у файла capsudo установлено разрешение CAP_SETPCAP). Когда capsudo запускает ping, наследуемое разрешение файла совпадает с наследуемым разрешением процесса и добавляется в список доступных (и, соответсвенно, текущих, так как у файла /bin/ping установлен текущий бит).

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

Итак, у файла /bin/ping разрешения остаются прежними
getcap /bin/ping
/bin/ping = cap_net_raw+ei
В /etc/pam.d/login добавляем строчку:
auth        required    pam_cap.so
Файл /etc/security/capability.conf приводим к виду:
cap_net_raw user1
none *
После входа в систему командная оболочка пользователя user1 будет иметь установленное наследуемое разрешение cap_net_raw. Действительно:
$ getpcaps $$
Capabilities for `3658': = cap_net_raw+i
Теперь пользователь user1 будет иметь возможность запускать программу ping, если заходит в систему обычным образом (и не будет иметь такой возможности, когда заходит, например, по ssh, так как использование модуля pam_cap прописано только в /etc/pam.d/login).

Ссылки:
[1] man 7 capabilities
http://www.kernel.org/doc/man-pages/online/pages/man7/capabilities.7.html
[2],[3] Tomas Bächler, его блог
http://archlinux.me/brain0/
http://archlinux.me/brain0/2009/07/28/using-posix-capabilities-in-linux-part-one/
http://archlinux.me/brain0/2010/01/05/using-posix-capabilities-in-linux-part-two/
[4] Серж Е. Халлин, «Разрешение POSIX для файлов: разделяем полномочия root»
http://www.ibm.com/developerworks/ru/library/l-posixcap/l-posixcap.html#
[5] Chris Friedhoff, POSIX Capabilities & File POSIX Capabilities
http://www.friedhoff.org/posixfilecaps.html

Примечение переводчика:
Слово ‘capability’ всюду переведено словом „разрешение“, как это сделано в [4].



Копипаст http://posix.ru/freenotes/linux/51, касательно Debian'а - отсебятина ;)

вівторок, 26 червня 2012 р.

Запрос к MSSQL на Perl из Linux

Собственно используем FreeTDS, /etc/freetds/freetds.conf:
[orion]
        host = 10.254.103.38
        port = 1433
        client charset = UTF-8
        tds version = 8.0
        text size = 20971520
Устанавливаем tdsodbc, unixodbc и libdbd-odbc-perl:
$ sudo aptitude install tdsodbc libdbd-odbc-perl unixodbc
Настраиваем UnixODBC, /etc/odbcinst.ini:
[FreeTDS]
Description = FreeTDS
Driver      = /usr/lib/odbc/libtdsodbc.so
Setup       = /usr/lib/odbc/libtdsS.so
UsageCount  = 1
Ну вот, теперь пишем запрос в Perl'е:
#!/usr/bin/perl -w

use strict;
use DBI;

my $dbh = DBI->connect('dbi:ODBC:server=orion;port=1433;driver=FreeTDS;tds_version=8.0', 'username', 'password', {PrintError => 0});
die "Unable for connect to server $DBI::errstr" unless $dbh;

my $rc;
my $sth;
    
#$sth = $dbh->prepare('select @@servername');
$sth = $dbh->prepare('SELECT [Caption] AS conn_details, 0 AS cnt_conn_details FROM [OrionDB].[dbo].[Nodes] GROUP BY [Caption] ORDER BY conn_details');
if($sth->execute) {
    while(my $dat = $sth->fetchrow_hashref) {
        foreach my $k (sort keys %{ $dat }) {
            print $k,"=>",${ $dat }{$k},"\n";
        }
    }
}

Чтение UTF16 в Perl

Попалась чудная программа, которая разработана под Windows и хранит свои данные хоть и в текстовом формате, но не в UTF8, который является привычным для Linux, а в UTF16.
Встала задача прочитать этот чудный файл в Perl'е, да так чтобы его содержимое было корректно воспринято.
Оказалось всё не просто, а очень просто:
foreach my $orionmap ( sort @orionmap ) {
    open my $FMAP, "<:encoding(utf16)", "$orionmap" || die "Can't open $orionmap for read: $!\n";
    while (<$FMAP>) {
        chomp;
        chop if /\r$/;
        print;
        print "\n";
    }
    close $FMAP;
}
Потом уже нашёл статью на Хабре где народ говорит о возможных граблях. Что-ж, как говорил один знакомый людоед: "Пожуём - увидим!".

середа, 6 червня 2012 р.

Сброс пароля учётной записи в Windows7


Случается, что пароль или забылся(особенно если он был сложный), или потерялся. В данном примере мы не будем пытаться узнать забытый пароль, мы его просто сбросим или поменяем.
Нам понадобится установочный диск Windows7 для активации скрытой учетной записи Администратора. Способ активации заключается в правке реестра из установочной среды.
Загружаемся с диска и нажимаем Shift+F10 для запуска командной строки. Вбиваем regedit и запускаем редактор реестра. Выделяем раздел HKEY_LOCAL_MACHINE и в меню выбираем Файл -> Загрузить куст.. (File -> Load hive..). Нам нужен будет файл с именем SAM, который находится в каталоге \Windows\System32\config на диске, где установлена Windows7. В запросе ввода имени куста — пишите что угодно. Теперь выбираем раздел HKEY_LOCAL_MACHINE\имя_куста\SAM\Domains\Account\Users\0001F4 и дважды кликаем по ключу F. Откроется редактор, в котором нужно перейти к первому числу в строке с номером 0038, это будет число 11. Меняем его на 10. На этом моменте осторожнее — поменять надо только это число, ничего не добавляя и не удаляя. Теперь выделяем загруженный куст HKEY_LOCAL_MACHINE\имя_куста\ и в меню выбираем Файл -> Выгрузить куст… (File -> Unload hive…), подтверждаем выгрузку куста.
Всё. Вынимаем диск и перезагружаемся. Теперь можно зайти под учетной записью Администратора(по умолчанию без пароля) и в панели управления пользователями поменять забытый пароль.

ps: Мопедик не мой, я только объявку дал ;)

вівторок, 5 червня 2012 р.

Skype + PulseAudio

С переходом на KDE как-то незаметно в жизнь вошёл PulseAudio. Недавно заметил, что в Skype перестал работать микрофон, хотя пока под Gnome использовался ALSA такой проблемы не существовало.
Решение достаточно простое - установить пакет pavucontrol и настроить с его помощью ввод с микрофона
aptitude install pavucontrol
Всё дело в том, что при первоначальной установке PulseAudio пакет pavucontrol не устанавливался автоматически, хотя именно с его помощью и настраивается PulseAudio.
А так всё достаточно просто и понятно.

четвер, 31 травня 2012 р.

Шифруемся и прячемся: стеганография

Кратко о предметной области.
Стеганография - в переводе с греческого дословно означает «тайнопись». Это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. В отличие от криптографии, которая скрывает содержимое секретного сообщения, стеганография скрывает само его существование.
Для достижения преследуемых в этой заметке целей в Debian GNU/Linux есть замечательный пакет - steghide:
A steganography hiding tool
Steghide is steganography program which hides bits of a data file in some of the least significant bits of another file in such a way that the existence of the data file is not visible and cannot be proven.

Steghide is designed to be portable and configurable and features hiding data in bmp, wav and au files, blowfish encryption, MD5 hashing of passphrases to blowfish keys, and pseudo-random distribution of hidden bits in the container data.
установим его:
$ aptitude install steghide
Теперь можем попробовать спрятать любой текст в изображении. Спрячем текст взяв его со стандартного ввода:
$ echo "Текст спрятанного сообщения" | steghide embed -cf image.jpg -p passw0rd -ef -
"Текст спрятанного сообщения" будет имплементирован в файл image.jpg поэтому если оригинал изображения дорог вам как память то предварительно создайте его копию.
Чтобы увидеть спрятанный текст проделаем обратную операцию:
$ steghide extract -sf image.jpg -p passw0rd -xf -
Ничего сложного! Можно посмотреть информацию о спрятанных данных:
$ steghide info image.jpg
"image.jpg":
  format: jpeg
  capacity: 4,9 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase: 
  embedded data:
    size: 53,0 Byte
    encrypted: rijndael-128, cbc
    compressed: yes
А также получить список всех поддерживаемых алгоритмах шифрования, которые можно использовать совместно с опцией -e (--encryption):
$ steghide encinfo
encryption algorithms:
<algorithm>: <supported modes>...
cast-128: cbc cfb ctr ecb ncfb nofb ofb
gost: cbc cfb ctr ecb ncfb nofb ofb
rijndael-128: cbc cfb ctr ecb ncfb nofb ofb
twofish: cbc cfb ctr ecb ncfb nofb ofb
arcfour: stream
cast-256: cbc cfb ctr ecb ncfb nofb ofb
loki97: cbc cfb ctr ecb ncfb nofb ofb
rijndael-192: cbc cfb ctr ecb ncfb nofb ofb
saferplus: cbc cfb ctr ecb ncfb nofb ofb
wake: stream
des: cbc cfb ctr ecb ncfb nofb ofb
rijndael-256: cbc cfb ctr ecb ncfb nofb ofb
serpent: cbc cfb ctr ecb ncfb nofb ofb
xtea: cbc cfb ctr ecb ncfb nofb ofb
blowfish: cbc cfb ctr ecb ncfb nofb ofb
enigma: stream
rc2: cbc cfb ctr ecb ncfb nofb ofb
tripledes: cbc cfb ctr ecb ncfb nofb ofb
Спрятанный текст можно брать не только из стандартного ввода, но и из заранее подготовленного файла:
$ steghide embed -cf image.jpg -p passw0rd -ef secretfile.txt
Равно как и восстанавливать его из картинки:
$ steghide extract -cf image.jpg -p passw0rd -ef secretfile.txt
Кстати, интересный момент, можно прятать не только текст, но и изображение в изображении, главное чтобы размер того в чём прячем изначально был больше того, что прячем (не знаю на сколько - не проверял), а иначе рискуем получить ошибку следующего вида:
steghide: the cover file is too short to embed the data.
Для примера "спрячем" мой аватар в другой красивой картинке:
$ steghide embed -cf image.jpg -p passw0rd -ef gremlin-gizmo.jpg
Оригинал от полученного изображения по размеру не сильно отличается, равно как и по качеству:
$ ls -l image.*
-rw-r--r-- 1 olden olden 260660 Май 31 15:55 image.jpg
-rw-r--r-- 1 olden olden 250538 Май 31 15:55 image.orig.jpg
$ md5sum image.*
5c3dfbd17d4e8bfbe15006e2282e17c2  image.jpg
b2d51cdf620b9180daebb5a2dad4a186  image.orig.jpg
Аватарка:

Оригинал:

А вот тут спрятана аватарка:

Всё тайное рано или поздно становится явным!
$ steghide extract -sf image.jpg -p passw0rd -xf avatar.jpg
Сравним результаты:
$ md5sum gremlin-gizmo.jpg avatar.jpg 
4c9106a839c2e0c6d7e4ccd8b095ff6e  gremlin-gizmo.jpg
4c9106a839c2e0c6d7e4ccd8b095ff6e  avatar.jpg
и визуально:

Кстати, помимо сравнения размеров и md5sum для оригинального изображения и изображения со стеганограммой, интересно сравнить их ещё и визуально:
$ compare -verbose image.orig.jpg image.jpg diff.png
Прелюбопытнейший результат. А с первого взгляда на изображения и не скажешь, что в них столько различий.

У вас до сих пор не было паранойи?! Тогда мы идём к вам!!!