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

вівторок, 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