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

четвер, 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
Прелюбопытнейший результат. А с первого взгляда на изображения и не скажешь, что в них столько различий.

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

вівторок, 24 квітня 2012 р.

Ограничение доступа на Extreme Networks

Создаём полиси:

edit policy noc-telnet
(редактор а-ля vi, поэтому не составляет особого труда с ним освоиться)

Заполняем содержимым:
entry entry-10 {
 if match any {
    source-address xxx.xxx.xxx.xxx/32 ;
    source-address xxx.xxx.xxx.xxx/27 ;
 }
 then {
    permit;
 }
}
entry entry-20 {
  if {

 }
 then {
    deny;
 }
}
(В каком-то мануале читал, что в match any необходимо использовать вместо source-address nlry, но так policy не работало)
Подключаем полиси к сервису:
configure telnet access-profile noc-telnet

Посмотреть полиси можно так:
show policy noc-telnet

Если хотим что-то поменять в полиси то опять рисуем edit, а затем не забываем:
refresh policy noc-telnet

вівторок, 20 березня 2012 р.

Samba user account management tool (pdbedit)


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

В данной заметке хочу описать и привести примеры ее использования:
Просмотр перечня всех существующих груповых политик домена:
[root@router ~]# pdbedit -P ?
No account policy by that name!
Account policy names are:
min password length
password history
user must logon to change password
maximum password age
minimum password age
lockout duration
reset count minutes
bad lockout attempt
disconnect time
refuse machine password change
Samba политики домена NT4
NT4 policy Name Samba Policy Name NT4 Range Samba Range Samba Default
Maximum Password Age maximum password age 0 - 999 (days) 0 - 4294967295 (sec) 4294967295
Minimum Password Age minimum password age 0 - 999 (days) 0 - 4294967295 (sec) 0
Minimum Password Length min password length 1 - 14 (Chars) 0 - 4294967295 (Chars) 5
Password Uniqueness password history 0 - 23 (#) 0 - 4294967295 (#) 0
Account Lockout - Reset count after reset count minutes 1 - 99998 (min) 0 - 4294967295 (min) 30
Lockout after bad logon attempts bad lockout attempt 0 - 998 (#) 0 - 4294967295 (#) 0
*** Not Known *** disconnect time TBA 0 - 4294967295 0
Lockout Duration lockout duration 1 - 99998 (min) 0 - 4294967295 (min) 30
Users must log on in order to change password user must logon to change password 0/1 0 - 4294967295 0
*** Registry Setting *** refuse machine password change 0/1 0 - 4294967295 0

Просмотреть значение параметра политики, можно так:
[root@router ~]# pdbedit -P "НАЗВАНИЕ ПОЛИТИКИ"
min password length - минимальная длинна пароля, который можно задать. В данном случае пароль должен быть не меньше 8-ми символов.
[root@router ~]# pdbedit -P "min password length"
account policy "min password length" description: Minimal password length (default: 5)
account policy "min password length" value is: 8
password history - история пароля. Сохранять историю прежде вводимых паролей. Если указать, например значение "5", то старый пароль можно будет повтороно ввести только после 6-ти уникальных паролей.
[root@router ~]# pdbedit -P "password history"
account policy "password history" description: Length of Password History Entries (default: 0 => off)
account policy "password history" value is: 0
Пример, установим сохранение 3-х прежде введенных паролей:
[root@router ~]# pdbedit -P "password history" -C 3
account policy "password history" description: Length of Password History Entries (default: 0 => off)
account policy "password history" value was: 0
account policy "password history" value is now: 3
user must logon to change password - требовать смену пароля при следующем входе в систему.
[root@router ~]# pdbedit -P "user must logon to change password"
account policy "user must logon to change password" description: Force Users to logon for password change (default: 0 => off, 2 => on)
account policy "user must logon to change password" value is: 0
maximum password age - Запрос смены пароля пользователям. Тут указываем количество времени в секудах, на протяжении которого пароль можно не менять. С этого момента времени пароль будет меняться в соответствии с политикой.
[root@router ~]# pdbedit -P "maximum password age"
account policy "maximum password age" description: Maximum password age, in seconds (default: -1 => never expire passwords)
account policy "maximum password age" value is: 4294967295
Пример, установим максимальный срок действия пароля 90дней:
[root@router ~]# pdbedit -P "maximum password age" -C 777600
minimum password age - Минимальный срок действия пароля в секундах (по умолчанию: 0 => позволяют немедленного изменения пароля).
[root@router ~]# pdbedit -P "minimum password age"
account policy "minimum password age" description: Minimal password age, in seconds (default: 0 => allow immediate password change)
account policy "minimum password age" value is: 0
Пример, установим минимальный срок действия пароля 80дней:
[root@router ~]# pdbedit -P "minimum password age" -C 691200
lockout duration - время блокировки при неудачном входе. Устанавливаем в минутах, или ставим значение -1 - "на всегда" (учетная запись должна быть повторно включаться вручную).
[root@router ~]# pdbedit -P "lockout duration"
account policy "lockout duration" description: Lockout duration in minutes (default: 30, -1 => forever)
account policy "lockout duration" value is: 1
reset count minutes - сброс счетчика минут, блокировки учетной записи.
[root@router ~]# pdbedit -P "reset count minutes"
account policy "reset count minutes" description: Reset time after lockout in minutes (default: 30)
account policy "reset count minutes" value is: 30
bad lockout attempt - блокировка при неудачной попытке входа в домен.
[root@router ~]# pdbedit -P "bad lockout attempt"
account policy "bad lockout attempt" description: Lockout users after bad logon attempts (default: 0 => off)
account policy "bad lockout attempt" value is: 3
Пример, в данном случае после 3-х неудачных попыток ввода пароля пользователем, он блокируется.
[root@router ~]# pdbedit -P "bad lockout attempt" -C 3
account policy "bad lockout attempt" description: Lockout users after bad logon attempts (default: 0 => off)
account policy "bad lockout attempt" value was: 3
account policy "bad lockout attempt" value is now: 3
disconnect time - время до разъединения. Возможные значения: 0 - отключать пользователя, -1 - не отключать.
[root@router ~]# pdbedit -P "disconnect time"
account policy "disconnect time" description: Disconnect Users outside logon hours (default: -1 => off, 0 => on)
account policy "disconnect time" value is: 4294967295
refuse machine password change - отказываются менять пароль машины.
[root@router ~]# pdbedit -P "refuse machine password change"
account policy "refuse machine password change" description: Allow Machine Password changes (default: 0 => off)
account policy "refuse machine password change" value is: 0

понеділок, 19 березня 2012 р.

syslog-ng: принимаем сообщения syslog в сети

Для начала, поменяем rsyslog на syslog-ng, так как последним представляется более гибким и удобным (хотя на вкус, как и на цвет, все фломастеры разные).
$ sudo aptitude install syslog-ng
В принципе настройки по-умолчанию у него вполне вменяемые, но цель данной статьи показать возможность приёма сообщения syslog от устройств находящихся в сети.
Сама идеология syslog-ng достаточно простая. Главный конфигурационный файл логически разбит на секции:
  • опции запуска и работы демона (options);
  • источники сообщений syslog (source)
  • назначения для вывода журналов (destination);
  • описание фильтров (filter);
  • описание журналов (log).

С блоком options всё более-менее ясно, выглядит он примерно так:
options {
    long_hostnames(off);
    flush_lines(0);
    use_dns(no);
    use_fqdn(no);
    owner("root");
    group("adm");
    perm(0640);
    stats_freq(0);
    bad_hostname("^gconfd$");
    ts_format(rfc3164);
    create_dirs(yes);
    keep_hostname(yes);
};
В общем-то опции имеют вполне вменяемые названия и об их назначении можно легко догадаться. Скажем так, из опций которые я добавил к конфигурации по-умолчанию, идущей после установки пакета из репозитория, только три: ts_format, create_dirs и keep_hostname.

Двигаемся далее - source. Описание источника s_src оставляем как есть и добавляем слушатель к своему сетевому интерфейсу:
source s_net { udp(ip(172.16.0.1)); };
ip-адрес должен быть прописан на сетевом интерфейсе, s_net говорит о том,что слушать входящие сообщения необходимо на адресе 172.16.0.1 по порту udp/514.

Далее формируем фильтр для принимаемых syslog сообщений:
filter f_orion { netmask(10.254.103.38/32); };
Под действия этого фильтра попадают все сообщения пришедшие с ip-адреса 10.254.103.38. Маску сети можно задать как /30, /29 и т.д., таким образом можно расширить диапазон источников сообщений. Можно задать несколько сетей источников, например так:
filter f_orion { netmask(10.254.103.38/32) or netmask(172.16.0.0/27); };
Также можно отфильтровать некоторые нежелательные сообщения:
filter f_orion { netmask(10.254.103.38/32) and not match("%FAN-3-FAN_" value("MESSAGE")); };
Тут говорится о том, что все сообщения в которых будет встречено вхождение %FAN-3-FAN_ не будут включены в дальнейшую обработку (not).
Вместо netmask можно использовать host:
filter f_orion { host(10.254.103.38) and not match("%FAN-3-FAN_" value("MESSAGE")); };
но не каждому это подойдёт, например если источник из которого принимается syslog-сообщение не совпадает с устройством его генерирующим то в журнал, при использовании host, будет записан адрес устройства с которого принято сообщение, а не то устройство которое его сгенерировало. Это актуально при настройке syslog-сервера на пересылку сообщений на другой syslog-сервер. В случае когда источник syslog-сообщения и устройство на котором генерируется это сообщение совпадают то директивы netmask и host должны себя вести идентично.

Пришло время описать сам журнал, связав источник, фильтр и назначение в одно правило:
log { source(s_net); filter(f_orion); destination(d_orion); };

Отдельно хочется заметить, что в используемой сейчас нами версии Orion'а форвард syslog-сообщений работает несколько "криво", поэтом альтернативой был выбран не Forward, а Send, в котором и формируется более "вменяемое" сообщение, с нормально отрезолвленым названием узла сформировавшего исходное  сообщение, которое уже можно анализировать. Ну, а далее журналы по разным узлам разбираются примерно таким образом:
destination d_device_name { file("/var/log/noc-orion/orion.device_name.log"); };
filter f_device_name { netmask(10.254.103.38/32) and match("\\\[device_name\\\]" value("MESSAGE")) and not match("%FAN-3-FAN_" value("MESSAGE")); };
log { source(s_net); filter(f_device_name); destination(d_device_name); };

Syslog Server: поддерживаемые макросы

Нижеследующие макросы можно использовать при формировании сообщения к SysLog серверу, например, из монитора Solarwinds Orion:

  • ${HOSTNAME}
  • ${IP}
  • ${FACILITY}
  • ${FACILITYNAME}
  • ${SEVERITY}
  • ${SEVERITYNAME}
  • ${MESSAGETIME}
  • ${TAG} or ${SYSLOGTAG}
  • ${DISCARD}
  • ${MESSAGE}
  • ${MESSAGETYPE}
  • ${NOW}
  • ${UTC}
  • ${DATETIME}
  • ${DATE}
  • ${LONGDATE}
  • ${MEDIUMDATE}
  • ${TIME}
  • ${LONGTIME}
  • ${MEDIUMTIME}
  • ${DOW}
  • ${DAY} or ${D}
  • ${DD}
  • ${ABREVIATEDDOW}
  • ${LOCALDOW}
  • ${MONTH} or ${M}
  • ${MM}
  • ${MMM}
  • ${MONTHNAME} or ${MMMM}
  • ${LOCALMONTHNAME}
  • ${DAYOFYEAR}
  • ${YEAR2}
  • ${YEAR4} or ${YEAR}
  • ${HOUR} or ${H}
  • ${HH}
  • ${N} or ${MINUTE}
  • ${S} or ${SECOND}
  • ${AMPM}
Более подробно о макросах можно почитать, например, в руководстве syslog-ng v2.0 reference manual.

середа, 7 березня 2012 р.

Как конвертировать Debian Wheezy (или более новую) систему в btrfs


Новый GRUB может обрабатывать /boot раздел в формате btrfs, так что теперь не нужно иметь отдельный раздел отформатированный в ext2/3/4.

Далее предполагаем, что вся ваша файловая система представлена одной партицией. Если же у вас под каждый раздел /usr/, /var и т.д. создана отдельная партиция то модифицируйте их по отдельности, согласно приведённой ниже инструкции.

Итак, приступим…

1. Сделайте бэкап раздела. Никто не несёт ответственности за возможную утерю данных кроме вас самих!
2. Скачайте и запишите на CD или флешке Debian Wheezy (или более новый).
3. Загрузитесь с созданного загрузочного образа.
4. fsck -f /dev/sdaX (где /dev/sdaX это root-партиция)
5. Проверьте доступен ли ваш любимый текстовый редактор (vim, ed, mine и т.д.) и btrfs-tools, если нет то установите их.
6. btrfs-convert /dev/sdX
7. mount /dev/sdX /mnt
8. Подмонтируйте в /mnt разделы /proc, /dev, /sys:
mount -o bind /dev /mnt/dev
mount -o bind /sys /mnt/sys
mount -o bind /proc /mnt/proc
9. chroot /mnt
10. Отредактируйте /etc/fstab, найдите строку для root-раздела (/) и смените UUID на прямое описание /dev/sdX, смените тип файловой системы с ext3/ext4 на btrfs, уберите «лишние» опции оставив просто defaults, замените последнюю цифру 1 на 0.
11. ls -la /boot
Вы должны увидеть файл вроде: initrd.img-3.1.0-1-686-pae.
Строка после 'initrd.img-' это версия ядра которую необходимо использовать далее.
12. mkinitramfs 3.1.0-1-686-pae -o /boot/initrd.img-3.1.0-1-686-pae
13. grub-install /dev/sdX
14. update-grub
15. exit (выходим из chroot окружения)
16. Размонтируем в /mnt разделы /proc, /dev, /sys и сам /mnt:
umount /mnt/proc
umount /mnt/dev
umount /mnt/sys
umount /mnt
17. Перегружаемся и молимся.
18. Через некоторое время система должна загрузиться, вводим 'mount' и убеждаемся, что она работает на btrfs.
19. Выполните:
update-initramfs -u -t -kall

Если всё прошло успешно то можно смело удалять бэкап /ext2_saved который был создан в процессе преобразования файловой системы. Делаем это так:
btrfs subvolume delete /ext2_saved


ps: Вольный перевод статьи.

понеділок, 5 березня 2012 р.

Samsung AllShare и Linux

Купили телевизор Samsung и обнаружили на нём AllShare, но совершенно не хочется ставить ради использования этой функции Windows? Тогда читаем ниже.

Что такое AllShare, при более близком рассмотрении, и с чем её едят? Ну у корейцев видимо всё не как у людей и оттого они обозвали то, что все называют DLNA по своему - AllShare, ну чтобы враги не догадались, а может оттого, что поддерживают DLNA коряво и не получили соответствующей сертификации, а использовать ой как хочется.

А что такое DLNA? DLNA (Digital Living Network Alliance) — стандарт, позволяющий совместимым устройствам передавать и принимать по домашней сети различный медиа-контент (изображения, музыку, видео), а также отображать его в режиме реального времени. Это технология для соединения домашних компьютеров, мобильных телефонов, ноутбуков и бытовой электроники в единую цифровую сеть. Устройства, которые поддерживают спецификацию DLNA, по желанию пользователя могут настраиваться и объединяться в домашнюю сеть в автоматическом режиме.
Средой передачи медиаконтента обычно является домашняя локальная сеть (IP-сеть). Подключение DLNA-совместимых устройств к домашней сети может быть как проводным (Ethernet), так и беспроводным (Wi-Fi).

Выбор DLNA сервера может показаться не тривиальной задачей, тем более, что выбор достаточно велик. У себя дома, под домашним Debian'ом решил поднять minidlna.

Итак, с чего же начать? Ну как всегда, с установки зависимостей, скачки исходников и их компиляции.

$ sudo aptitude install libavcodec-dev libavformat-dev libavutil-dev libflac-dev libvorbis-dev libogg-dev libid3tag0-dev libexif-dev libjpeg-dev
$ wget "http://downloads.sourceforge.net/project/minidlna/minidlna/1.0.24/minidlna_1.0.24_src.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fminidlna%2Ffiles%2Fminidlna%2F1.0.24%2F&ts=1330931715&use_mirror=ignum" -O minidlna_1.0.24_src.tar.gz
$ tar xzf minidlna_1.0.24_src.tar.gz
$ cd minidlna-1.0.24/
$ make && sudo make install && sudo cp minidlna.conf /etc/

Теперь, когда сервер DLNA скомпилирован и установлен, приступим к его настройке. В этом, собственно, тоже не должно возникнуть никаких сложностей.

$ sudo vim /etc/minidlna.conf

В network_interface прописываем через запятую интерфейсы на которых будет жить сервер DLNA.
Настройка media_dir может не ограничиваться лишь одним ресурсом, этих строк может быть много. media_dir может включать либо просто имя каталога, либо начинаться с A, V или P, что означает, соответственно, назначение ресурса - аудио, видео, картинки.
friendly_name описывает имя которое будет светиться в списке источников для DLNA ресурсов.
notify_interval этот параметр описывает интервал через который происходит уведомление о вновь появившихся ресурсах на DLNA сервере. Значение по-умолчанию в 900 секунд наверное всё-таки слишком велико.
db_dir это директория где DLNA сервер будет хранить свой кеш о представляемых объектах.
log_dir - директория где будет вестись журнал DLNA сервера.

Теперь настало время произвести первый запуск нашего DLNA сервера и посмотреть, что при этом происходит:

minidlna -d -f /etc/minidlna.conf

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

На этом можно было бы и закончить, но ведь наверняка будет очень лениво каждый раз запускать сервер в ручную, а оттого создаём  стартап-скрипт и помещаем его в /etc/init.d:
#! /bin/sh
### BEGIN INIT INFO
# Provides: minidlna
# Required-Start: $local_fs $remote_fs $syslog $network
# Should-Start:
# Required-Stop: $local_fs $remote_fs $syslog $network
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Minidlna
# Description: DLNA Media Server
### END INIT INFO

## EDIT FROM HERE

# Installation details
MINIDLNA="/usr/sbin/minidlna"
ARGS="/etc/minidlna.conf"

# Where to keep a log file
MINIDLNA_LOG="/var/log/minidlna.log"

# Where the PID lives
PID_FILE="/var/run/minidlna.pid"

## STOP EDITING HERE

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

set -e

# Only start if we can find the minidlna.conf.
test -x $MINIDLNA || exit 0

# Parse command line parameters.
case $1 in
  start)
 echo -n "Starting MiniDLNA: "
 $MINIDLNA -f $ARGS -P $PID_FILE  >> $MINIDLNA_LOG 2>&1
 echo "ok"
 ;;
  stop) 
  echo -n "Stopping MiniDLNA: "
    for pidf in `/bin/ls $PID_FILE 2>/dev/null`; do
            if [ -s $pidf ]; then
                kill `cat $pidf` >/dev/null 2>&1
            fi
   rm -rf $PIF_FILE
    done 
 echo "ok"
 ;;
  restart|reload|force-reload)
 echo "Restarting MiniDLNA: "
 
        $0 stop
 sleep 2
 $0 start
 
 ;;
  *)
 # Print help
 echo "Usage: /etc/init.d/minidlna {start|stop|restart|reload|force-reload}"
 exit 1
 ;;
esac

exit 0

Содержимое скрипта было позаимствовано (зачем изобретать велосипед?), единственно, что были добавлены заголовки для нормального выполнения update-rc.d:

$ sudo update-rc.d minidlna defaults

Уровни выполнения актуальны для Debian, Ubuntu и, наверное, производных дистрибутивов. В принципе поменяв уровни выполнения этот скрипт можно использовать и в других дистрибутивах поддерживающих LSB заголовки.

Собственно на этом с настройкой сервера покончено. Ну, а на телевизоре сначала разрешаем AllShare, затем находим все DLNA сервера в широковещательном домене, добавляем их, видим их в Source и наслаждаемся их присутствием, и просмотром медиаконтента.

ps: Справедливости ради отмечу, что в репозитории Debian'а есть пакет mediatomb и тем кому лень возиться со сборкой minidlna могут установить и настроить его:

$ sudo aptitude install mediatomb