2007/10/21

Интеграция Samba-сервера с Windows AD Domain Controller

Данное оипсание применялось на дистрибутиве CentOS 5 в связке с Windows 2003 Server Enterprise.
Для начала установим необходимые для работы пакеты
# yum install samba samba-client ntp acl
(клиентская часть необходима, если необходимо монтировать шары виндоуза на линухе)
Подправим файл /etc/hosts, чтобы он имел примерно такой вид:
# vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
10.10.2.91 vm01.organization.local vm01

Добавим опцию acl при монтировании рабочего дискового раздела
# vi /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults,acl 1 1
# mount -o remount /
# mkdir /share
# setfacl -m u:"ORGANIZATION+romans":rwx /share

Теперь настроим Керберос для добавления linux-сервера в windows-домен
# yum install krb5-workstation
# vi /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
default_realm = ORGANIZATION.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes

[realms]
ORGANIZATION.LOCAL = {
kdc = windows.organization.local:88
admin_server = windows.organization.local:749
default_domain = organization.local
}

[domain_realm]
.organization.local = ORGANIZATION.LOCAL
organization.local = ORGANIZATION.LOCAL

[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}

# kinit administrator@ORGANIZATION.LOCAL
Password for administrator@ORGANIZATION.LOCAL:

Минимальная настройка samba
[root@vm01 ~]#vi /etc/samba/smb.conf
[global]
workgroup = ORGANIZATION
netbios name = VM01
server string = VM01 Samba Server
security = ads
encrypt passwords = yes
realm = ORGANIZATION.LOCAL
password server = windows.organization.local
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
winbind separator = +
load printers = no
printcap name = /etc/printcap
printing =
log file = /var/log/samba/%m.log
max log size = 50

[share]
comment = a comment
path = /share
browseable = yes
read only = no
inherit acls = yes
inherit permissions = yes
create mask = 700
directory mask = 700
valid users = "ORGANIZATION+romans"

Входим в домен
# net ads join -U administrator
administrator's password:
Using short domain name -- ORGANIZATION
Joined 'VM01' to realm 'ORGANIZATION.LOCAL'

Стартуем сервисы
# /etc/init.d/smb start
Starting SMB services: [ OK ]
Starting NMB services: [ OK ]

Настраиваем nsswitch, для того чтобы он мог использовать данные AD с помощью winbind-сервиса
# vi /etc/nsswitch.conf
passwd: files winbind
shadow: files
group: files winbind
# /etc/init.d/winbind start
Starting Winbind services: [ OK ]

Для проверки
#wbinfo -u
ORGANIZATION+administrator
ORGANIZATION+guest
ORGANIZATION+support_388945a0
ORGANIZATION+vartotojas
ORGANIZATION+cba_anonymous
ORGANIZATION+krbtgt
ORGANIZATION+for_test_1
ORGANIZATION+for_test_2
ORGANIZATION+for_admin
ORGANIZATION+romans


Ссылки:
  1. How To Integrate Samba (File Sharing) Using Active Directory For Authentication
  2. Samba as an Active Directory Domain Member
  3. Как подружить Samba 3 и контроллер домена Windows 2003 SP1
  4. RHEL5 Deployment Guide - Samba
  5. RHEL5 Deployment Guide - Kerberos

2007/10/10

GFS - Global File System

Данный лог действий описывает процесс установки и начальной конфигурации кластерной файловой системы GFS в CentOS5.

Перед началом установки необходимо убедиться, что отключен firewall и не действует SE Linux.

# chkconfig iptables off
# selinux disable

Установка включает в себя инсталяцию группы 'Cluster storage' и сервиса ntp для синхронизации времени на всех нодах кластера.

# yum groupinstall 'Cluster Storage'
# yum install ntp
# yum install kmod-gfs-xen (если используется Xen)
# chkconfig ntpd on
# service ntpd start
# Starting ntpd: [ OK ]
# reboot

Проверить перед запуском, что на всех нодах файлы /etc/hosts и /etc/cluster/cluster.conf одного содержания

# vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
10.10.2.91 vm01.organization.local vm01
10.10.2.92 vm02.organization.local vm02
# vi /etc/cluster/cluster.conf
<?xml version="1.0"?>
<cluster name="gfsc" config_version="1">
<cman two_node="1" expected_votes="1">
</cman>
<clusternodes>
<clusternode name="vm01" nodeid="1">
<fence>
<method name="human">
<device name="last_resort" ipaddr="vm01">
</device>
</method>
</fence>
<clusternode name="vm02" nodeid="2">
<fence>
<method name="human">
<device name="last_resort" ipaddr="vm02">
</device>
</method>
</fence>
</clusternode>
<fencedevices>
<fencedevice name="last_resort" agent="fence_manual">
</fencedevice>
</fencedevices>
</clusternode></clusternodes>
</cluster>

Для того, чтобы впоследствии копировать измененный файл конфигурации /etc/cluster/cluster.conf на все ноды можно воспользоваться утилитой ccs_tool:

# scp /etc/cluster/cluster.conf root@vm02:/etc/cluster/
# ccs_tool update /etc/cluster/cluster.conf

После того как все готово, можно запускать службу cman (поочередно на всех нодах)

# /etc/init.d/cman start
# cman_tool status

Подготовка диска (я использую lvm)

# vi /etc/lvm/lvm.conf
locking_type = 3
# pvcreate /dev/sdc
# vgcreate gfsc /dev/sdc
# lvcreate -l 100%FREE gfsc
# gfs_mkfs -p lock_dlm -t gfsc:gfs1 -j 2 /dev/gfsc/lvol0

Теперь можно примонтировать том с кластерной файловой системой и работать с ним как с обычным диском

# mount -t gfs /dev/gfsc/lvol0 /mnt

Ссылки:
  1. Cluster Project FAQ
  2. How to install and run clvm and gfs
  3. Enterprise data sharing with Red Hat Global File System

2007/08/21

OCFS - Oracle cluster file system

OCFS - кластерная файловая система, разработанная Oracle, с учетом кластеризации баз данных. Проста в установке и использовании - всё, что необходимо - модули для используемого ядра и набор утилит для работы с файловой системой.
Для установки в среде CentOS5 можно использовать бинарники, предназначенные для RHEL5:
ocfs2 modules - http://oss.oracle.com/projects/ocfs2/files/
ocfs2-tools - http://oss.oracle.com/projects/ocfs2-tools/files/
В Debian-репозитарии также имеется пакет ocfs2-tools с данными утилитами. А вот ядро, наверняка, придется пересобрать с включенными ocfs-модулями.

Лог действий достаточно прозрачен:
# wget http://oss.oracle.com/projects/ocfs2/dist/files/RedHat/RHEL5/x86_64/1.2.6-1/2.6.18-8.1.8.el5/ocfs2-2.6.18-8.1.8.el5-1.2.6-1.el5.x86_64.rpm
# wget http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/x86_64/1.2.6-1/ocfs2-tools-1.2.6-1.el5.x86_64.rpm
# rpm -Uvh ocfs2-2.6.18-8.1.8.el5-1.2.6-1.el5.x86_64.rpm ocfs2-tools-1.2.6-1.el5.x86_64.rpm


Теперь все необходимые модули должны появиться в каталоге /lib/modules/KERNEL_VERSION/kernel/fs/ocfs2. Осталось только подготовить конфигурационный файл для сервиса блокировок o2cb:

# mkdir /etc/ocfs2
# vi /etc/ocfs2/cluster.conf
cluster:
node_count = 2

name = fc

node:

ip_port = 7777

ip_address = 192.168.2.15

number = 1

name = centos1

cluster = fc

node:

ip_port = 7777

ip_address = 192.168.2.16
number = 22
name = centos2
cluster = fc


На данном этапе необходимо скопировать данный файл на все ноды и запустить сервис o2cb:
# /etc/init.d/o2cb start

Теперь можно форматировать доступное блочное устройство /dev/sdb в формат ocfs и монтировать ее для дальнейшей работы:
# mkfs.ocfs2 -b 4K -C 128K -N 2 -L ocfs1 /dev/sdb
# mount -t ocfs2 /dev/sdb /mnt


Ссылки:
  1. OCFS2 - FAQ
  2. Xen with DRBD, GNBD and OCFS2 HOWTO
  3. Install & Configure OCFS2 for Oracle RAC

Собираем кластер. Часть 2: Storage

Для функционирования кластерной системы, необходимо наличие единой дисковой подсистемы, доступной для всех серверов (node), работающих внутри кластера.

С дисковой подсистемой (storage) можно общаться на уровне:
- сервиса (примеры - NFS-директория, примонтированная на всех нодах, DNBD)
- блочного устройства, доступного всем нодам (SAN)
Самым простым решением является использование сетевой файловой системы - NFS. В данном случае все проблемы по обслуживанию блокировок при совместной работе с данными NFS-служба берет на себя. Статья [1] прекрасно описывает пример создания storage на основе NFS. Я попробовал на Debian 4.0 - все отлично работает. Но присутствие уровня сервиса накладывает некоторый отрицательный отпечаток на производительность.
Более низкий уровень общения с дисковой системой - уровень обычного блочного устройства (block device). В этом случае Вы имете в системе дополнительный диск (/dev/sdb, /dev/hdb), с которым работаете как с обычным жестким диском, но есть несколько "но":
  • если данный диск доступен нескольким нодам в режиме записи (RW), Вы должны обеспечить на нем функционирование кластерной файловой системы, которая позволит работать одновременно с одними и теми же данными с разных нодов.
  • Вам придется раскошелиться на приобретение SAN (на основе Fibre Channel или более дешевого - iSCSI. Точных цен я не знаю, но это недешевая покупка :)
Перед написанием этих строк я попробовал две кластерные файловые системы - GFS и OCFS2. Если сравнивать "на глаз" производительность, то можно сказать, что обе файловые системы работают более менее одинакого быстро. Но GFS по сравнению с OCFS на первых порах более сложен в запуске, так как требует установки и настройки Red Hat Cluster Suite. Данный Suite включает в себя все необходимые "примочки" для работы кластера, начиная от heartbeat'а, поддержки множества сетевых служб, заканчивая фенсингом кластерной файловой системы (fencing). Информации по GFS доступно достаточно, чего не скажешь об OCFS. Обе данные кластерные файловые системы опробованы на CentOS 5, все работает стабильно без каких-либо оговорок, лог действий скоро выложу.


Ссылки:
  1. Setting Up A Highly Available NFS Server
  2. Distributed filesystem for Debian clusters? (discussion)
  3. DRBD/NFS: Linux HA
  4. Обзор сетевых и кластерных ФС: Lustre, GFS, AFS, GFarm

2007/06/27

Собираем кластер. Часть 1: Heartbeat

Кластер - это прежде всего система повышенной готовности (high availability - HA), построеная с учетом того, что она продолжает работать безотказно, даже если какая-то ее часть выходит из строя.
Heartbeat - продукт проекта Linux-HA, позволяющий реализовать механизм безотказной работы отдельных частей кластера. Первый, кому необходим этот механизм в кластере - это распределитель нагрузки (load balancer, или director).
Допустим, у нас есть два сервера (loadb1, loadb2), которые выделены для того, чтобы стать распределителями нагрузки в будущем кластере. Но прежде чем устанавливать на них программное обеспечение для управление кластером, необходимо настроить и оттестировать механим безотказной работы - когда какой-либо из серверов (loadb1 или loadb2) выходит из строя, второй, благодаря heartbeat, заменяет его. В данном случае условием того, что сервер вышел из строя будет считаться, что он не отвечает на broadcast запросы, т.е. проблемы в сетевом интерфейсе. Сервера loadb1 и loadb2 будут эмулировать ip-адрес кластера - 195.46.64.21, т.е. он будет "поднят" на сетевом интерфейсе как дополнительный (alias).

Настройка heartbeat в Debian 4.0 (Etch)
1. Установить пакет heartbeat-2 и все зависимости, которые он за собой тянет.
apt-get install heartbeat-2
В конце установки сервис heartbeat не сможет запуститься, потому как не созданы основные конфигурационные файлы - ha.cf, authkeys, haresources.
ha.cf - основной конфигурационный файл, содержащий массу различных параметров того, как будет осуществляться heartbeat-механизм. За основу можно взять файл, идущий в пакете (расположен в /usr/share/doc/heartbeat-2). Перед использованием достаточно установить 3 параметра (директивы):
bcast eth0
node loadb1
node loadb2
Указав таким образом использовать heartbeat-механизм через eth0 интерфейсы на основе broadcast-запросов. Имена loadb1, loadb2 должны быть hostname-именами серверов, команда uname -a должна возвращать такие же значения.
authkeys - файл для взаимной аутентификации серверов loadb1 и loadb2. Можно использовать sha, md5, но чтобы не расходовать ресурсы достаточно использовать crc. После создания файл, необходимо установить права доступа к нему только для root
# cat > authkeys
auth 1
1 crc
[Ctrl+C]
# chmod 600 authkeys
haresources - файл, описывающий ресурсы, контролируемые серверами loadb1 и loadb2. Ресурсы представляют собой обычные стоп/старт скрипты, похожие чем-то на сценарии из/etc/init.d. В директории /etc/ha.d/resource.d можно посмотреть доступные (уже готовые к использованию) сценарии. В данном примере будет использован ресурс IPaddr для активации дополнительного ip-адреса на интерфейсе eth0.
loadb1 IPaddr::195.46.64.21/24/eth0
Данные конфигурационные файлы должны быть помещены на обоих серверах в директорию /etc/ha.d и должны быть идентичны. После того, как все подготовлено, запустить heartbeat-сервис на обоих серверах:
# /etc/init.d/heartbeat start
Starting High-Availability services:
2007/06/28_10:14:21 INFO: IPaddr Resource is stopped
Done.
Спустя пару секунд на сервере loadb1 будет поднят дополнительный ip-адрес - 195.46.64.21.
loadb1# ifconfig
eth0 Link encap:Ethernet HWaddr 00:60:08:04:09:0D
inet addr:195.46.64.15 Bcast:195.46.64.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1119456 errors:0 dropped:0 overruns:0 frame:0
TX packets:96462 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:79824340 (76.1 MiB) TX bytes:18991729 (18.1 MiB)
Interrupt:10 Base address:0xe000

eth0:0 Link encap:Ethernet HWaddr 00:60:08:04:09:0D
inet addr:195.46.64.21 Bcast:195.46.64.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:10 Base address:0xe000
Если что-то случается с loadb1 (можно сэмулировать аварию, отправив его на перезагрузку), loadb2 поднимает данный ip-адрес на своем eth0 интерфейсе и принимает на себя основную роль.
loadb2# ifconfig
eth0 Link encap:Ethernet HWaddr 00:10:5A:BF:2B:8C
inet addr:195.46.64.16 Bcast:195.46.64.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1256304 errors:0 dropped:0 overruns:0 frame:0
TX packets:93726 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:99944699 (95.3 MiB) TX bytes:19336953 (18.4 MiB)
Interrupt:9 Base address:0xec00

eth0:0 Link encap:Ethernet HWaddr 00:10:5A:BF:2B:8C
inet addr:195.46.64.21 Bcast:195.46.64.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:9 Base address:0xec00
В /var/log/messages можно проследить происходящее - всё очень подробно и понятно.

Ссылки:
  1. Программное обеспечение повышенной готовности промежуточного уровня в Linux, часть 1: Heartbeat и Web-сервер Apache
  2. How To Set Up A Loadbalanced High-Availability Apache Cluster
  3. The High Availability Linux Project

2007/06/20

Индексы в OpenLDAP

Для увеличения производительности LDAP-сервиса на основе OpenLDAP, можно воспользоваться индексацией (index), которая помогает ускорить обработку поисковых запросов.
Для этого в основном конфигурационном файле (/etc/ldap.slapd.conf) предусмотрен параметр index. Формат следующий:
index {attrlist | default} [pres,eq,approx,sub,none]
где
  • attrlist - список атрибутов (через запятую), для которых будет включена индексация
  • default - используется для указания всех явно не указанных, но используемых в базе, атрибутов
  • pres (present) - индекс для более быстрого определения установлен ли указанный атрибут
  • eq (equality) - индекс для точного поиска указанного значения атрибута (cn=Roman Sozinov)
  • approx (approximate) - индексация для быстрого поиска созвучных (по фонетике) значений (cn=smith и cn=smit)
  • sub (substring) - индексация при поиске по неполным строкам (cn=Roma*)
Пример использования:
index cn
index sn,uid,mail eq,sub
index default none
В данном случае для cn-атрибута будут включены все методы индексации; для sn, uid и mail только eq и sub. Для всех остальных атрибутов индексация будет отключена (default none).

Чтобы внести изменения в индексы, необходимо остановить работающий ldap-сервис (чтобы получить rw-контроль над базой) и запустить утилиту slapindex, обновляющую индексы, установленные для базы. В некоторых источниках советуют перед переиндексацией сделать копию базы "на всякий пожарный".
# /etc/init.d/slapd stop
Stopping OpenLDAP: slapd.
# slapindex -v
...
# /etc/init.d/slapd start
Starting OpenLDAP: slapd.
Не стоит слишком увлекаться индексацией, так как она требует дополнительного использования памяти и ресурсов процессора.

Литература:
  1. LDAP Implementation Cookbook (IBM, 1999)
  2. LDAP System Administration (O'Reilly, 2003)

2007/06/12

Знакомство с Linux-VServer

Статья "Зонная Защита Solaris 10" замечательно описывает подход и возможности виртуализации на уровне операционной системы на примере зон в Solaris. Она также содержит ссылки на подобные решения в Linux-среде - Linux-Vserver, OpenVZ. Так как я использую преимущественно Debian (а он уже содержит в себе поддержку linux-vserver), то вопрос выбора для меня стоял недолго, хотя желание ознакомиться с OpenVZ не пропало.
Linux-vserver - это отличное решение для хостинга и тестирования в различных окружениях - на одном физическом сервере используется одно для нескольких виртуальных серверов Linux-ядро. Главный (MAIN) сервер используется для контроля за виртуальными серверами, каждый из которых находится в закрытой адресной среде, не видя остальных. Разработчики указывают около 3-4% падения производительности системы при использовании VServer, но это настолько маленькие цифры, что их можно не учитывать - система работает как обычно - шустро.
В репозитарии Debian 4.0 уже есть пропатченное linux-ядро, готовое к работе. Минусом является отсутствие отдельного патча linux-vserver, чтобы иметь возможность наложить его на собранное своими руками ядрышко.
Установка и использование linux-vserver очень проста.
# apt-get install linux-image-2.6-vserver-686 util-vserver vserver-debiantools debootstrap
Пример команды для создания виртуального сервера
# newvserver --vsroot /var/lib/vservers/ --hostname srv002 --domain domain.ru --ip 192.168.1.102/24 --dist etch --mirror http://ftp.at.debian.org/debian --interface eth0
# uname -a
Linux srvmain 2.6.18-4-vserver-686 #1 SMP Thu May 10 01:37:59 UTC 2007 i686 GNU/Linux
Стартуем виртуальный хост
# vserver srv002 start
Входим в виртуальный хост
# vserver srv002 enter
# uname -a
Linux srv002 2.6.18-4-vserver-686 #1 SMP Thu May 10 01:37:59 UTC 2007 i686 GNU/Linux
Сейчас можно настроить виртуальный хост для требуемых нужд, установить все необходимое/дополнительное. Всё, как на обычном хосте.
Выходим из виртуального хоста
# vserver srv002 stop
Возможные проблемы могут возникнуть с Apache, если на main-хосте уже запущен Apache и не привязан к конкретному ip-адресу. В этом случае, пытаясь запустить apache на виртуальном хосте, в error.log можно встреить ошибку:
[crit] (98)Address already in use: make_sock: could not bind to port 80
Решение: привязать main-сервер к конкретному ip-адресу.

Проблема с Bind 9 решается не так просто:
cd /usr/src
apt-get build-dep bind9
apt-get source bind9
cd bind9-x.x.x
vi debian/rules
...
--disable-linux-caps \
--disable-threads \
...
dpkg-buildpackage
...
cd ..
dpkg -i *.deb
echo "bind9 hold" | dpkg --set-selections # чтобы заморощить автоматическое обновление
На официальном сайте есть отдел, посвященный "проблемному" soft'у. Проблем с OpenLDAP, Exim, Proftpd не наблюдалось - всё работает как обычно - как часы.

Для автозапуска виртуального сервера при перезагрузке необходимо выполнить следующее:
echo "default" > /etc/vservers/SERVERNAME/apps/init/mark
Чтобы сделать копию уже сконфигурированного виртуального хоста srv002 (например web-сервера).
vserver srv003 build --hostname srv003 --interface eth0:192.168.1.103/24 -m rsync -- -s /var/lib/vservers/srv002/
Если необходимо ограничить ресурсы (процессор, память) виртуальных хостов, linux-vserver и тут не подведет.
Пример (взят из FAQ) того, как избежать ситуации "Out of memory"
1. Проверить размер страниц (pagesize) в памяти (обычно 4Кб)
2. Создать директорию rlimits
mkdir /etc/vservers/srv002/rlimits
3. Установить значения максимума для резидентной памяти (rss) и максимума для всего объема виртуальной памяти (as). Хранимые значения указывают на число страниц памяти - например, чтобы установить предел в 200Мб при размере страницы 4Кб, нужно указать значение 50000.
echo 50000 > /etc/vserver//rlimits/rss # 200Mb
echo 100000 > /etc/vserver//rlimits/as # 400Mb
4. Чтобы изменения вступили в силу, необходимо перезапустить виртуальный хост.

В комплекте пакета util-vserver идут замечательные утилиты для наблюдения за виртуальными хостами. Вот как это выглядит:
# vserver-stat
CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME
0 59 197.9M 43.7M 36m51s32 9m37s35 5d22h45 root server
49166 9 137M 20.2M 0m02s98 0m03s40 4d00h03 srv008
49169 9 137M 20.2M 0m39s41 0m06s62 3d23h59 srv009
49170 13 174.3M 102.6M 16m30s91 1m03s46 3d20h57 srv002
49171 3 21.1M 4.6M 0m00s40 0m00s10 3h22m13 srv001
49176 9 137M 20.2M 0m00s80 0m00s20 1h28m18 srv007
#
#
# vps ax
PID CONTEXT TTY STAT TIME COMMAND
1 0 MAIN ? Ss 0:01 init [2]
...
1045 0 MAIN ? S< 0:12 [md1_raid1]
1049 0 MAIN ? S< 0:00 [md2_raid1]
1126 0 MAIN ? S< 0:00 [kjournald]
1611 0 MAIN ? S< 0:00 [kedac]
1662 0 MAIN ? S< 0:00 [kpsmoused]
1922 0 MAIN ? S< 0:00 [kmirrord]
1970 0 MAIN ? S< 0:00 [kjournald]
1972 0 MAIN ? S< 0:15 [kjournald]
2259 0 MAIN ? Ss 0:02 /sbin/syslogd
2265 0 MAIN ? Ss 0:00 /sbin/klogd -x
2617 0 MAIN ? Ss 0:00 /usr/sbin/inetd
2632 0 MAIN ? Ss 0:00 /usr/sbin/sshd
2874 0 MAIN ? Ss 0:00 /sbin/mdadm
2905 0 MAIN ? Ss 0:00 /usr/sbin/cron
2922 0 MAIN ? Ss 0:00 /usr/sbin/apache
2949 0 MAIN tty1 Ss+ 0:00 /sbin/getty 38400 tty1
2950 0 MAIN tty2 Ss+ 0:00 /sbin/getty 38400 tty2
2951 0 MAIN tty3 Ss+ 0:00 /sbin/getty 38400 tty3
2952 0 MAIN tty4 Ss+ 0:00 /sbin/getty 38400 tty4
2953 0 MAIN tty5 Ss+ 0:00 /sbin/getty 38400 tty5
2954 0 MAIN tty6 Ss+ 0:00 /sbin/getty 38400 tty6
22845 0 MAIN ? Ss 0:00 /usr/sbin/exim4 -bd -q30m
26097 0 MAIN ? S 0:00 /usr/sbin/apache
26098 0 MAIN ? S 0:00 /usr/sbin/apache
26099 0 MAIN ? S 0:00 /usr/sbin/apache
26100 0 MAIN ? S 0:00 /usr/sbin/apache
26101 0 MAIN ? S 0:00 /usr/sbin/apache
15571 49166 srv008 ? Ss 0:00 /sbin/syslogd
15590 49166 srv008 ? Ss 0:00 proftpd: (accepting connections)
15596 49166 srv008 ? Ss 0:00 /usr/sbin/cron
15606 49166 srv008 ? Ss 0:00 /usr/sbin/apache
16397 49169 srv009 ? Ss 0:00 /sbin/syslogd
16416 49169 srv009 ? Ss 0:00 proftpd: (accepting connections)
16422 49169 srv009 ? Ss 0:00 /usr/sbin/cron
16432 49169 srv009 ? Ss 0:00 /usr/sbin/apache
17970 49170 srv002 ? Ss 0:08 /sbin/syslogd
17982 49170 srv002 ? Ss 0:00 /usr/sbin/named -u bind
17989 49170 srv002 ? Ss 0:00 /usr/sbin/lwresd
18005 49170 srv002 ? Ss 15:58 /usr/sbin/clamd
18088 49170 srv002 ? Ss 0:00 /usr/bin/freshclam -d --quiet
18233 49170 srv002 ? Ss 0:06 /usr/sbin/exim4 -bd -q30m
18259 49170 srv002 ? Ss 0:00 /usr/sbin/cron
6387 49169 srv009 ? S 0:00 /usr/sbin/apache
6388 49169 srv009 ? S 0:00 /usr/sbin/apache
6389 49169 srv009 ? S 0:00 /usr/sbin/apache
6390 49169 srv009 ? S 0:00 /usr/sbin/apache
17469 0 MAIN ? Ss 0:00 sshd: root@pts/0
17471 0 MAIN pts/0 Ss+ 0:00 -bash
18505 49171 srv001 ? Ss 0:00 /sbin/syslogd
18515 49171 srv001 ? Ssl 0:00 /usr/sbin/slapd -g openldap -u openldap
18531 49171 srv001 ? Ss 0:00 /usr/sbin/cron
19505 0 MAIN ? Ss 0:00 sshd: root@pts/2
19507 0 MAIN pts/2 Ss 0:00 -bash
20434 0 MAIN pts/2 S+ 0:00 mc
20436 0 MAIN pts/3 Ss 0:00 bash -rcfile .bashrc
21026 49176 srv007 ? Ss 0:00 /sbin/syslogd
21045 49176 srv007 ? Ss 0:00 proftpd: (accepting connections)
21051 49176 srv007 ? Ss 0:00 /usr/sbin/cron
21061 49176 srv007 ? Ss 0:00 /usr/sbin/apache
21083 49176 srv007 ? S 0:00 /usr/sbin/apache
21084 49176 srv007 ? S 0:00 /usr/sbin/apache
21846 49170 srv002 ? S 0:00 /usr/sbin/exim4 -bd -q30m
21847 1 ALL_PROC pts/3 S+ 0:00 vps ax
21848 1 ALL_PROC pts/3 R+ 0:00 ps ax
Ссылки:
  1. Installing Linux-VServer
  2. Howtos Linux-Vserver Debian Sarge
  3. Problematic Programs - Linux-VServer
  4. Vserver DRBD - Linux-VServer
  5. The /etc/vservers directory
  6. "Системный администратор" (октябрь 2006)

2007/06/11

SSL соединение при использовании LDAP-сервиса

Данная заметка вышла как дополнение к постам StartTLS - безопасный LDAP и cvs->ldif.
При использовании общей для всех сотрудников LDAP-адресной книги за пределами офиса, условия использования безопасного LDAP-соединения становятся обязательными. Но существующие на данный момент почтовые клиенты не умеют использовать функцию StartTLS, вместо этого они требуют отдельного SSL-соединения на отдельном порту (для ldaps это порт 636).
В этом случае в дополнение к уже определенным в конфигурационном файле опциям TLSCertificateFile, TLSCertificateKeyFile, TLSCACertificateFile, в запускном скрипте необходимо открыть дополнительный безопасный порт - ldaps. В Debian это делается просто - в начало скрипта /etc/init.d/slapd необходимо добавить строку:
SLAPD_SERVICES="ldap:/// ldaps:///"
После перезапуска сервиса, убедиться, что ldaps порт открыт:
# /etc/init.d/slapd restart
Stopping OpenLDAP: slapd.
Starting OpenLDAP: slapd.
# netstat -an | grep 636
tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN
tcp6 0 0 :::636 :::* LISTEN
Теперь остается только протестировать безопасное соединение из почтовой программы (галочка "secure connection (SSL)", порт 636). Thunderbird и Evolution прекрасно срабатывают сразу же. С Outlook'ом придется добавлять сертификат LDAP-сервера (или CA'я, который выдал данный сертификат) в Windows-хранилище сертификатов, иначе он будет отказываться работать, говоря при этом многозначительное "The specified directory service could not be reached".

2007/06/08

Solaris LDAP Authentication with OpenLDAP

Продолжая тему интеграции работающих сервисов с единой директорией каталогов (LDAP), реализовал аутентификацию пользователей в Solaris 10 через PAM-модуль pam_ldap.

План следующий:
  1. Подготовить LDAP-каталог для хранения данных о пользователях
  2. Подготовить систему для работы с LDAP-каталогом
  3. Настроить PAM-конфигурацию для работы с LDAP
  4. Протестировать работоспособность
Перед тем как приступать к сборке всего этого "конструктора", советую ознакомиться (освежить в памяти) с документацией по PAM-модулям.
1. Подготовка LDAP-каталога
В LDAP-директории должны существовать записи о пользователях, которые будут иметь доступ к системе. Пример записи:
dn: uid=user3,ou=People,o=Organization,c=lt
uid: user3
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
gecos: Ivan Ivanov
sn: Ivanov
telephoneNumber: 37070022722
mail: user3@organization.lt
homeDirectory: /export/home/user3
loginShell: /usr/bin/bash
uidNumber: 1010
cn: user3
userPassword: {CRYPT}$1$Gw4bZGoA$cv7sLoqjquhfZiHIx5Hwi0
gidNumber: 1100
Также в LDAP-директории должен быть определен пользователь, имеющий доступ к "ветке" со всеми пользователями (доступ к паролям пользователей ему необязателен) - он будет использоваться для доступа к LDAP от имени системы. В рассматриваемом примере такой пользователь - cn=manager, o=Organization,c=lt (с паролем 'neskazu').
2. Подготовка операционной системы для работы с LDAP-директорией
В Solaris 10 (и прежних, как оказалось, версиях) есть команда ldapclient, которая все сделает сама - нужно только правильно сформировать запрос. Если указываемые значения содержат пробелы, их необходимо обрамлять одинарными скобками. Например, на моей системе это выглядело так:
ldapclient manual -v -a credentialLevel=proxy -a authenticationMethod=simple -a 'proxyDN=cn=manager,o=My Organization,c=lt' -a proxyPassword=neskazu -a 'defaultsearchbase=o=My Organization,c=lt '195.44.44.3
Команда создаст в системе необходимые для работы с LDAP файлы и кое-что изменит не совсем верно - это касается файла /etc/nsswitch.conf. В данном файле нужно будет поправить строку, добавив запись возможность использовать dns для преобразования dns-имен хостов (resolving)
hosts: dns ldap [NOTFOUND=return] files
Если все прошло без ошибок, то по команде getent passwd
# getent passwd
root:x:0:0:Super-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
lp:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
smmsp:x:25:25:SendMail Message Submission Program:/:
listen:x:37:4:Network Admin:/usr/net/nls:
gdm:x:50:50:GDM Reserved UID:/:
webservd:x:80:80:WebServer Reserved UID:/:
nobody:x:60001:60001:NFS Anonymous Access User:/:
noaccess:x:60002:60002:No Access User:/:
nobody4:x:65534:65534:SunOS 4.x NFS Anonymous Access User:/:
user3:x:1010:1100:Ivan Ivanov:/export/home/user3:/usr/bin/bash
...
Не забыть создать в системе домашние директории для пользователей из LDAP-директории
mkdir /export/home/user3
chown 1010:1100
/export/home/user3
3. Настроить PAM-модуль pam_ldap
В файле /etc/pam.conf внести следующие изменения:
other auth requisite pam_authtok_get.so.1
# other auth required pam_dhkeys.so.1
other auth required pam_unix_cred.so.1
other auth sufficient pam_unix_auth.so.1
other auth required pam_ldap.so.1

other account requisite pam_roles.so.1
other account sufficient pam_unix_account.so.1
other account required pam_ldap.so.1
С включенным модулем pam_dhkeys система отказывалась аутентифицировать LDAP-пользователей. Поинтересовавшись, что это за модуль и поняв, что я его не использую, закомментировал зверя.
Если в pam.conf какая-то служба описана отдельно (например xscreensaver), то для нее необходимо также указать использование модуля pam_ldap как и для 'other'.

После проделывания вышеприведенных процедур все должно заработать. Если что-то не так, то на помощь приходит Syslog-система, правда прежде чем ею воспользоваться, её конфигурационный файл (/etc/syslog.conf) тоже требует доработки - например, такой:
auth.debug /var/log/authlog
причем, если файл /var/log/authlog не создан, создать пустышку и заставить syslog перечиать свой файл конфигурации
# touch /var/log/authlog
# svcadm enable svc:/system/system-log:default

Ссылки:
  1. LDAP Authentication in Solaris 10
  2. Solaris 10 and Active Directory Integration
  3. Подключаемые Модули Аутентификации (PAM)
  4. PAM Administration (pdf)
  5. Manual Page for ldapclient

2007/06/01

Установка Dovecot IMAP сервиса с поддержкой LDAP в FreeBSD 5.4

Что есть: внутренний IMAP-сервер для переписки между сотрудниками (локальная сеть)
Что необходимо сделать: научить IMAP-сервер аутентифицировать пользователей через единую LDAP-директорию.
# cd /usr/ports
# make update
# cd /usr/ports/mail/dovecot
# make

make (выбрать LDAP)
make install
echo dovecot_enable="YES" >> /etc/rc.conf
Если при сборке вываливается ошибка
On FreeBSD before 6.2 ports system unfortunately can not set default X11BASE by itself so please help it a bit by setting X11BASE=${LOCALBASE} in make.conf.
On the other hand, if you do wish to use non-default X11BASE, please set variable USE_NONDEFAULT_X11BASE
В /etc/make.conf нужно добавить строку X11BASE=${LOCALBASE} и повторить сборку.

Приведенная ниже конфигурация позволяет использовать в качестве аутентификационной базы пользователей - LDAP-директорию, а данные о пользователях (uid, gid, homedir) достаточно статичны, поэтому они формируются средствами внутренних переменных (%u).
Приведены только те строки, которые требуют изменения.
# cd /usr/local/etc
# cp dovecot-example.conf dovecot.conf
dovecot.conf
# сеть локальная, поэтому можно разрешить plaintext-аутентификацию
disable_plaintext_auth = no
# иерархия папок очень важна, поэтому mbox'а не хватает
mail_location = maildir:~/Maildir
# данная схема аутентификации не нужна
#passdb pam {
#}
passdb ldap {
args = /usr/local/etc/dovecot-ldap.conf
}
userdb static {
# пользователя с uid=500 нужно создать, если его нет
args = uid=500 gid=mail home=/var/mail/myorganization/%u
}
# cp dovecot-ldap-example.conf dovecot-ldap.conf

dovecot-ldap.conf
# вместо глобального использования логина администратора для "привязки"
# (bind) к ldap-серверу будет использоваться логин и пароль
# аутентифицирующегося пользователя
auth_bind = yes
auth_bind_userdn = uid=%u,ou=People,o=myorganization,c=ru

Ссылки:
  1. AuthDatabase/LDAP

2007/05/30

Инструкция по восстановлению Software RAID 1

В процессе установки Debian 4.0 (Etch) возможно создать Software (программный) RAID, повысив тем самым надежность хранения Ваших данных. Статья Install Debian Etch on a Software Raid 1 with S-ATA disks подробно описывает как это сделать в процессе инсталляции на примере создания RAID 1 (зеркальное копирование).
Советую протестировать "живучесть" работающего массива, сэмитировав возникновение проблемы с каким-либо диском в массиве. Приведенная ниже инструкция описывает как действовать в таких случаях на примере RAID 1 с двумя SCSI-дисками (/dev/sda, /dev/sdb) на Debian 4.0 (Etch).

Этап 1

Если проблемы с каким либо разделом в RAID (например, /dev/sdb2)
# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md1 : active raid1 sda2[0] sdb2[2](F)
63472704 blocks [2/1] [U_]
md2 : active raid1 sda3[0] sdb3[1]
3903680 blocks [2/1] [UU]
md0 : active raid1 sda1[0] sdb1[1]
3317312 blocks [2/1] [UU]
Необходимо удалить поврежденный раздел (прежде пометив его как fail), а потом его же добавить:
# mdadm /dev/md1 –f /dev/sdb2
# mdadm /dev/md1 -r /dev/sdb2
# mdadm /dev/md1 -a /dev/sdb2
После проделанных операций проверить его статус, как показано выше. Если проблема устранена, все md-разделы будут помечены как [UU].
Если это не помогает и массив по прежнему не восстанавливается, следует удалить все разделы испорченного диска (/dev/sdb1, /dev/sdb2), пометив прежде их как fail, и перейти к Этапу 2:
# mdadm /dev/md1 -f /dev/sdb1
# mdadm /dev/md1 -r /dev/sdb1
# mdadm /dev/md1 -f /dev/sdb2
# mdadm /dev/md1 -r /dev/sdb2
Этап 2

1. Выключить сервер
# shutdown -h now
2. Если проблема с вторичным диском - вставить новый диск на место старого, повторив установку перемычек (jumpers). Если проблема с первичным диском - вставить на место первичного диска (/dev/sda) вторичный диск (рабочий, /dev/sdb), повторив установку перемычек (jumpers), а на место вторичного установить новый диск.
3. Загрузить сервер.
4. Из под root выполнить комманды:
# sfdisk -d /dev/sda | sfdisk /dev/sdb # копирование таблицы разделов с /dev/sda на /dev/sdb
# fdisk -l # проверить, что оба диска имеют одинаковую разметку
# mdadm --add /dev/md0 /dev/sdb1 # добавление устройств в RAID
# mdadm --add /dev/md1 /dev/sdb2
# mdadm --add /dev/md2 /dev/sdb3
# grub
grub> root (hd1,0) # указать, где находится каталог /boot/grub на вторичном диске
grub> setup (hd1) # установить GRUB-загрузчик в MBR вторичного диска
grub> quit
5. Проверить состояние RAID устройств можно коммандой cat /proc/mdstat
Если всё, прошло успешно, вывод будет похож на:
# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid1 sda1[0] sdb1[1]
24418688 blocks [2/2] [UU]
md2 : active raid1 sda3[0] sdb3[1]
3903680 blocks [2/1] [UU]
md1 : active raid1 sda2[0] sdb2[1]
24418688 blocks [2/2] [UU]

6.Как только RAID восстановится, перегрузить сервер для проверки работоспособности.

Ссылки:
  1. GRUB - GRand мира загрузчиков
  2. How to boot Linux from RAID-1 with GRUB

2007/05/11

NRPE - мониторинг удаленных (недоступных извне) серверов средствами Nagios

NRPE - модуль для системы мониторинга Nagios, позволяющий запускать plugin'ы на удаленных серверах. Основная задача данного модуля - получить информацию о локальных данных удаленных серверов (check_load, check_users). Но с таким же успехом его можно использовать для мониторинга недоступных серверов, например, находящихся в локальной сети и не имеющих внешних адресов. Для этого достаточно установить на промежуточном сервере (195.43.68.11), имеющим доступ к локальной сети (192.168.1.0), nrpe-службу и на сервере мониторинга (195.43.68.2) установить nrpe-plugin.
Все описанные ниже действия были проделанны на серверах с Linux Debian 4.0 (Etch).

1. На стороне remote-сервера установить nrpe-сервис и базовый набор nagios-plugin'ов
# apt-get install nagios-nrpe-server nagios-plugins-basic
...
Setting up nagios-nrpe-server (2.5.1-3) ...
Starting nagios-nrpe: nagios-nrpe.

# netstat -an | grep 5666
tcp 0 0 0.0.0.0:5666 0.0.0.0:* LISTEN
2. Изменить конфигурационный файл /etc/nagios/nrpe.cfg и перезапустить сервис с новыми параметрами
allowed_hosts=127.0.0.1,195.43.68.2
# разрешить использование аргументов при выхове plugin'ов
dont_blame_nrpe=1
# пример описания plugin'а
command[check_ftp]=/usr/lib/nagios/plugins/check_ftp -H $ARG1$

# /etc/init.d/nagios-nrpe-server restart
Stopping nagios-nrpe: nagios-nrpe.
Starting nagios-nrpe: nagios-nrpe.

3. На стороне мониторинг-сервера установить nrpe-plugin, протестировать его функциональность и добавить описания требуемых для мониторинга локальных сервисов. В приведенном ниже примере используется plugin check_ftp, для проверки работоспособности ftp-сервиса на локальном сервере 192.168.1.111.
# apt-get install nagios-nrpe-plugin
...
Setting up nagios-nrpe-plugin (2.5.1-3) ...

# /usr/lib/nagios/plugins/check_nrpe -H
195.43.68.11
NRPE v2.5.1
# /usr/lib/nagios/plugins/check_nrpe -H 195.43.68.11 -c check_users
USERS OK - 1 users currently logged in |users=1;5;10;0
# /usr/lib/nagios/plugins/check_nrpe -H 195.43.68.11 -c check_load
OK - load average: 0.21, 0.16, 0.11|load1=0.210;15.000;30.000;0; load5=0.160;10.000;25.000;0; load15=0.110;5.000;20.000;0;
# /usr/lib/nagios/plugins/check_nrpe -H 195.43.68.11 -c check_total_procs
PROCS OK: 60 processes
# /usr/lib/nagios/plugins/check_nrpe -H 195.43.68.11 -c check_zombie_procs
PROCS OK: 0 processes with STATE = Z
# /usr/lib/nagios/plugins/check_nrpe -H 195.43.64.11 -c check_ftp -a 192.168.1.111
FTP OK - 0.024 second response time on port 21 [220 saule FTP server ready.]|time=0.024221s;0.000000;0.000000;0.000000;10.000000
Пример описания данного сервиса в конфигурации Nagios:
define service{
use generic-service
host_name remote
service_description NRPE_FTP
check_command check_nrpe!check_ftp!192.168.1.111
Ссылки:
  1. NRPE Documentation

2007/05/07

Exilog - инструмент для анализа логов MTA Exim

В Linux Debian в качестве default MTA используется Exim. Данный агент очень мощный в настройке и в отличие от sendmail более стабилен и безопасен. В комплекте с ним идут различные утилиты для работы с почтовой очередью, вывода статистики (existats), просмотра того, что в данный момент происходит (exiwhat) и т.п. Но у него есть один недостаток - для него не существует на данный момент активно разрабатываемого анализатора логов.
Exilog - продукт не имеющий релиза, застрявший в разработке (последняя версия 0.5 от 2005.10.23), но он вполне мог бы стать полноценным инструментом для работы с логами Exim'а. Сам активно использую уже больше года и могу только поблагодарить разработчиков.
Exilog - это перл-демон, который в реальном времени сканирует логи, результаты сбрасывает в MySQL базу и имеет приятный web-интерфейc.
Весь процесс установки подробно описан в README (необходимо устранить все зависимости (для Debian-системы это пакеты libdbd-mysql-perl и libnet-netmask-perl) и подправить конфигурационный файл). От себя же добавлю, что для окончательной интеграции в Debian-систему в /etc/init.d/exim4 необходимо внести следующие изменения:
...
start_exim()
{
/var/spool/exim4/exilog/exilog_agent.pl >> /var/log/exilog_agent.log 2>&1
...
}

stop_exim()
{
...
kill -s 15 `cat /var/run/exilog-agent.pid`
}
...

Ссылки:
Exilog - homepage

2007/05/03

The GNU Accounting Utilities - стандартный инструментарий для анализа произошедшего

The GNU Accounting Utilities (acct) - набор из нескольких утилит, помогающих проанализировать произошедшие инциденты и обнаружить слабые места в работе сервера.
Смысл простой - вы включаете запись всего происходящего, а потом анализируете накопленные данные (файлы /var/log/pacct и /var/log/wtmp). Слежение происходит на уровне ядра, поэтому ядро должно иметь соответствующую опцию (BSD-style process accounting) при сборке (мною опробованы стандартные ядра Debian 3.1, 4.0, Slackware 10 - с ними все в порядке). В Debian и Slackware - все элементарно ставится из репозитария - пакет acct.
В данный набор входят следующие утилиты:
Лучший способ рассказа об этих утилитах - пример ситуации. Итак, представьте себе, вы хорошо осведомлены о том, что происходит на ваших серверах, накапливаете статистику (например, по snmp с помощью Cacti) о загрузке, использовании памяти и процессорного времени, приходите утром смотрите на графики и видите дикую нагрузку на вашем веб-сервере ночью, когда обычно всё тихо. Естественно, первым делом идут в ход обычные логи (/var/log/messages, /var/log/auth.log, /var/log/syslog и .т.д.), но ситуация несколько осложняется - дело в том, что на веб-сервере запущен не только веб-сервис, но и с десяток других (mail, ftp, ldap, dns и т.д.). Если обычные логи ничего толкогого не говорят и вы не можете точно сказать, что за сервис вызвал такую нагрузку (да и сервис ли это был?), тогда в дело вступают Accounting Utilities (естественно, если вы прежде включили накопление результатов :) )
# lastcomm -f /var/log/pacct.1 > ~/lastcomm.log
Вывод будет примерно следующий:
...
apachectl root ?? 0.01 secs Tue May 1 18:50
lynx root ?? 0.01 secs Tue May 1 18:50
awk root ?? 0.01 secs Tue May 1 18:50
lynx root ?? 0.00 secs Tue May 1 18:50
cat root ?? 0.00 secs Tue May 1 18:50
httpd www ?? 0.13 secs Tue May 1 18:49
httpd www ?? 0.12 secs Tue May 1 18:49
httpd www ?? 0.15 secs Tue May 1 18:49
httpd www ?? 0.17 secs Tue May 1 18:49
httpd www ?? 0.25 secs Tue May 1 18:49
httpd www ?? 0.14 secs Tue May 1 18:49
httpd www ?? 0.14 secs Tue May 1 18:49
httpd www ?? 0.25 secs Tue May 1 18:49
httpd www ?? 1.56 secs Tue May 1 18:39
httpd www ?? 0.13 secs Tue May 1 18:49
httpd www ?? 0.14 secs Tue May 1 18:49
httpd www ?? 0.23 secs Tue May 1 18:49
httpd www ?? 1.92 secs Tue May 1 18:39
proftpd root ?? 0.01 secs Tue May 1 18:49
httpd www ?? 0.14 secs Tue May 1 18:49
httpd www ?? 0.14 secs Tue May 1 18:49
httpd www ?? 0.13 secs Tue May 1 18:48
httpd www ?? 0.15 secs Tue May 1 18:48
httpd www ?? 1.42 secs Tue May 1 18:39
httpd www ?? 361.29 secs Tue May 1 18:30
httpd www ?? 0.32 secs Tue May 1 18:45
httpd www ?? 0.75 secs Tue May 1 18:45
httpd www ?? 0.80 secs Tue May 1 18:45
httpd www ?? 0.19 secs Tue May 1 18:47
...
Колонки: команда, пользователь, терминал, время выполнения, время старта данной команды (еще могут быть различные флаги, о которых написано в документации)
Из приведенного выше лога видно, что веб-сервер что-то выполнял 360 секунд (видимо это был какой-то скрипт). Плюс число 360 - это явно какой-то лимит, видимо веб-сервер остановил выполнение скрипта по истечению timeout'а в 360 секунд. Ну а дальше - дело техники - в лог файлах выших сайтов найти что за скрипт был остановлен (и не раз) за то, что повисал.

Ссылки:
  1. Accounting Utilities Manual
  2. Как отследить запущенные пользователями программы

ProFTPd + LDAP - пользователи и их квоты

Беря пример с Microsoft Active Directory, можно интегрировать LDAP-директорию пользователей с FTP-сервисом на основе ProFTPd. Кроме того, что в качестве аутентификационной базы пользователей можно использовать LDAP, в нем можно хранить и дополнительные средства авторизации - такие как данные о лимитах для пользователей (quota). ProFTPd должен быть собран с поддержкой LDAP (В Debian 4.0 Etch с этим всё в порядке). В качестве LDAP-сервиса использовался OpenLDAP 2.3.30 (тоже из Debian-репозитария пакетов).
Первым делом следует добавить описание атрибута ftpQuota в nis-схему (файл /etc/ldap/schema/nis.schema).
attributetype ( 1.3.6.1.1.1.1.28 NAME 'ftpQuota'
DESC 'Quota FTP'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
SINGLE-VALUE )

objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
DESC 'Abstraction of an account with POSIX attributes'
SUP top AUXILIARY
MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )

MAY ( userPassword $ loginShell $ gecos $ description $ ftpQuota ) )
После этого перезапустить LDAP-сервис и удостовериться, что он нормально принял внесенные изменения
# /etc/init.d/slapd restart
Stopping OpenLDAP: slapd.
Starting OpenLDAP: slapd.
Если всё нормально, создать в LDAP-директории пользовательскую запись для ftp-доступа. Как пример:
dn: cn=ftpuser,ou=Users,o=My Company,c=LT
cn: ftpuser
ipNetworkNumber: 12
uid: ftpuser
objectClass: ipNetwork
objectClass: posixAccount
objectClass: top
userPassword: {MD5}ce4O7AJ89gFcMRd7PVaE7Q==
gidNumber: 65534
uidNumber: 106
homeDirectory: /var/home/ftpuser
ftpQuota: false,hard,10485760,0,0,0,0,0
Отредактировать основной конфигурационный файл ftp-сервиса - /etc/proftpd/proftpd.conf. Добавить строки
LDAPServer localhost
LDAPDNInfo "cn=searcher,o=My Company,c=LT" password
LDAPDoAuth on "ou=Sites,o=
My Company,c=LT" "(&(uid=%v) (objectclass=posixAccount))"
LDAPDefaultGID 106
LDAPDefaultUID 65534
LDAPForceDefaultGID off
LDAPForceDefaultUID off
LDAPDoQuotaLookups on "ou=Users,o=
My Company,c=LT" "(&(uid=%v)(objectclass=posixAccount))"
QuotaLimitTable ldap:
QuotaLock /tmp/quota
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaLog "/var/log/proftpd/quota.log"
QuotaShowQuotas on
QuotaTallyTable file:/var/log/ftpquota.tally
LDAPDNInfo - необходим, если у вас закрыт доступ для анонимного пользователя
LDAPDoAuth - аутентификация, база для поиска пользователя (по uid)
LDAPDoQuotaLookups - включить поиск квот, база для поиска

Перед перезапуском ftp-сервиса, чтобы изменения вступили в силу, необходимо создать файл /var/log/ftpquota.tally, который будет меняться, храня информацию об использовании лимитов ftp-пользователями.
# ftpquota --create-table --type=tally --units=Mb --table-path=/var/log/ftpquota.tally
# /etc/init.d/proftpd restart
Stopping ftp server: proftpd.
Starting ftp server: proftpd.
После перезапуска можно проверить
# ftp localhost
Connected to localhost.
220 ProFTPD 1.3.0 Server (Debian) [127.0.0.1]
Name (localhost:root): ftpuser
331 Password required for ftpuser.
Password:
230 User ftpuser logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quote SITE QUOTA
200-The current quota for this session are [current/limit]:
200-Name: ftpuser
200-Quota Type: User
200-Per Session: False
200-Limit Type: Soft
200- Uploaded Mb: 4.08/10.00
200- Downloaded Mb: unlimited
200- Transferred Mb: unlimited
200- Uploaded files: unlimited
200- Downloaded files: unlimited
200- Transferred files: unlimited
200 Please contact root@server if these entries are inaccurate

Ссылки:
  1. ProFTPd + OpenLDAP + quota
  2. ProFTPD module mod_quotatab_ldap
  3. ProFTPd - List of Directives

2007/04/26

Перенос системы с одного диска на другой

1. Скопировать разметку диска с первого (рабочего) на второй (новый), если диски идентичные:
sfdisk -d /dev/hda | sfdisk /dev/hdb

если разные - вручную с помощью утилиты cfdisk разбить второй диск в соответствии с разметкой рабочего

cfdisk /dev/hdb

2. Отформатировать созданные разделы в желаемом формате

mkfs.ext3 /dev/hdb1
mkswap /dev/hda5

3. Перегрузиться в singleuser-режиме, смонтировать требуемые разделы и выполнить клонирование

mount /dev/hdb1 /mnt
cd /mnt
dump 0af - / | restore xf -
...
set owner/mode for '.'? [yn] y

4. Если необходимо, грузиться с нового диска, необходимо переписать mbr (используется grub загрузчик)

# grub
grub> device (hd0) /dev/hdb
grub> root (hd0,0)
grub> setup (hd0)
grub> quit

Ссылки:

  1. Часто задаваемые вопросы по FreeBSD 4.X, 5.X и 6.X
  2. http://www.opennet.ru/base/sys/freebsd_dup.txt.html
  3. Boot with GRUB

2007/04/20

Clamav + Squid

Данное описание применимо к Debian 4.0 (Etch). Все сервисы, кроме squidclamav, установлены из доступных в репозитарии, пакетов. Перед началом необходимо убедиться в наличии и рабочем состоянии следующих сервисов (пакетов):
  • Squid (2.6.5)
  • Apache (1.3.34)
  • ClamAv (0.90.1)
  • libcurl3-dev (7.15.5)
  • libcurl3 (7.15.5)

Apache и ClamAv не требуют дополнительной настройки после установки через apt-get. Описание "Установка Debian-маршрутизатора с возможностями прозрачного proxy-сервера" содержит подборную установку и настройку Squid.

Связующим звеном между Squid и ClamAv является редиректор squidclamav (написан на С, на момент написания этих строк последней версией была версия 3.0). Существует еще один редиректор squidclamav, но он написан на python и мною не тестировался.

Перед тем, как остановить свой выбор на squidclamav, я рассмотрел еще 3 реализации антивирусной проверки на базе Squid + Clamav:

  • i-cap - так как хотелось использовать Squid из Debian репозитария, пришлось отбросить данный вариант, так как в дебиановской сборке отсутствует поддержка i-cap, и мне не удалось найти i-cap патча для ручной пересборки.
  • squidclam - очень сырой, так и не удалось добиться работоспособности
  • viralator - требует наличия squidGuard, но заставить работать мне его так и не удалось. Запрашиваемые файлы передаются на обработку этому скрипту, но он только показывает popup, а сам ничего не выполняет. Да и popup - для каждого скачиваемого файла - очень неудобно.
Лог действий:

1. Собрать из исходников данный редиректор
tar zxf squidclamav-x.x.tar.gz
cd squidclamav
./configure --prefix=/usr/local/squidclamav
make
make install

2. Отредактировать конфигурационный файл, взяв за основу идущий в дистрибутиве

cp squidclamav.conf.dist /etc/squidclamav.conf

Пример рабочего конфигурационного файла (проверяет все файлы c mime-type application и с расширениями .dll):

logfile /var/log/squid/squidclamav.log
redirect http://192.168.1.254/cgi-bin/clwarn.cgi
debug 0
force 1
stat 1
clamd_local /var/run/clamav/clamd.ctl
timeout 60
abort ^.*\.php$
abort ^.*\.gz$
abort ^.*\.bz2$
abort ^.*\.pdf$
abort ^.*\.js$
abort ^.*\.html$
abort ^.*\.css$
abort ^.*\.xml$
abort ^.*\.xsl$
abort ^.*\.js$
abort ^.*\.ico$
aborti ^.*\.gif$
aborti ^.*\.png$
aborti ^.*\.jpg$
aborti ^.*\.swf$
content ^.*application\/.*$
regexi ^.*\.dll$

3. Добавить описание редиректора в основной конфигурационный файл Squid'a - /etc/squid/squid.conf

redirect_program /usr/local/squidclamav/bin/squidclamav
redirect_children 15

4. Разместить в cgi-bin директории файл clwarn.cgi, на который будет пересылаться запрос в случае обнаружения вируса

cp clwarn.cgi /usr/lib/cgi-bin/clwarn.cgi

5. Перезапустить Squid, проверить в логах Squid'а запустились ли процессы squidclamav-редиректора. Если всё ок, попробовать скачать файл, содержащий вирус. Тестовые вирусы можно найти здесь.

Ссылки:

  1. Squidclamav
  2. eicar THE ANTI-VIRUS OR ANTI-MALWARE TEST FILE

2007/04/18

Установка Debian-маршрутизатора с возможностями прозрачного proxy-сервера

1. Установить Debian 4.0 (Etch). Описание тестировалось на netinstall-дистрибутиве, eth0 - локальная сеть 192.168.1.0/24, eth1 - внешний интерфейс. Данная версия Debian содержит Squid 2.6.5, а для этой версии несколько изменились настройки для прозрачного proxy.

2. Создать скрипт /etc/network/if-up.d/00-firewall следущего содержания:

#!/bin/sh

PATH=/usr/sbin:/sbin:/bin:/usr/bin

#
# удалить все действующие правила
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Всегда принимать трафик на loopback-интерфейсе
iptables -A INPUT -i lo -j ACCEPT

# Разрешить соединения, которые инициированы изнутри (eth0)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешить доступ из LAN-сети к внешним сетям
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# Запретить forward извне во внутреннюю сеть
iptables -A FORWARD -i eth1 -o eth1 -j REJECT

# Включить forward
echo 1 > /proc/sys/net/ipv4/ip_forward

3. Установить proxy-сервис squid, перед этим удостоверившись, что в файле /etc/hosts указан fqdn-имя для данного сервера, иначе squid будет ругаться.

apt-get install squid

4. Поправить конфигурационный файл squid'а - /etc/squid/squid.conf

http_port 127.0.0.1:3128
http_port 192.168.1.254:3128 transparent
cache_mgr admin@example.com
acl office src 192.168.1.0/24

5. Добавить в /etc/network/if-up.d/00-firewall строки для того, чтобы была возможность использовать squid прозрачно (transparent)

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 3128

После этого перегрузить для чистоты эксперимента сервер и попробовать обратиться с внутренней сети к какому-нибудь внешнему сайту. Если всё хорошо, то сайт должен открыться как и прежде, а в логах squid (/var/log/squid/access.log) должны появиться соответствующие записи.

Ссылки:

  1. Setting up a simple Debian gateway
  2. Transparent proxies via Squid
  3. Accelerator Mode - Squid User's Guide

2007/04/17

Настройка разрешения по-умолчанию для терминала SunRay 2

По-умолчанию терминал SunRay 2 использует разрешение 1280х1024, что не всегда удобно, так как многие мониторы не поддерживают таких цифр. Решается проблема одной командой, для этого необходимо войти любым пользователем с данного терминала и в консоли набрать
/opt/SUNWut/bin/utxconfig -r 1024x768

Теперь на данном терминале будет установлено разрешение по-умолчанию 1024х768. Чтобы изменения вступили в силу, достаточно сделать Log Out.

Остается вопрос - где система сохраняет внесенные изменения?

2007/04/13

c:\mysql\share\charsets\?.conf' not found (Errcode: 2)

При использовании Windows + MySQL 4.1 (установлен в каталог c:\Program Files\MySQL) + PHP 4.x + Webserver (любой) при обработке php-скриптов наверняка столкнетесь с ошибкой
File 'c:\mysql\share\charsets\?.conf' not found (Errcode: 2)
Character set '#33' is not a compiled character set and is not specified in the 'c:\mysql\share\charsets\Index' filee

Появляется она из-за того, что PHP 4 имеет встроенную поддержку MySQL версии только 3.23.49 (а используется 4.1.x). Используемая старая версия не имела Index-файлов для кодировки UTF-8.

Решение:

В my.cnf вместо default-character-set=utf-8 указать default-character-set=latin1

2007/04/12

Экспорт/импорт DNS-службы в Windows 2000/2003

Dumpdns - отличный скрипт [16Kb], помогающий выполнить экспорт/импорт существующего DNS-сервиса (всей конфигурации, всех существующих зон, даже тех, что Active Directory-Integrated), функционирующего в Windows 2000/2003. Отлично помогает при переносе сервера на другое железо.
SYNTAX - DNSdump [IMPORT|EXPORT] [data directory] [optional install root]

* [IMPORT] imports a previously dumped DNS service configuration
* [EXPORT] exports the current DNS service configuration
* [data directory] is a local, writable directory path
* [install root] is the local absolute path used by the DNS service

* DNSdump requires -
- administrative permission
- local execution on the DNS server
- Windows 2000 or an uplevel operating system

* DNSdump provides import and export of -
- DNS service configuration
- Active Directory integrated zones
- standard zone files

* IMPORTANT NOTES -
- existing Active Directory zone content will NOT be overwritten during IMPORT
- DNS service and zone configuration WILL be overwritten during IMPORT
- zone files WILL be overwritten during IMPORT
- registry keys are purged prior to IMPORT

DNSdump - Ready to proceed, configuration as follows -

* Security context is "JSIINC\Jerry"
* Active Directory distinguished name is "DC=JSIINC,DC=COM"
* Mode of operation is "EXPORT"
* DNS installation root is "C:\WINDOWS\System32\DNS"
* Data directory is "d:\dnsdump"

STATUS - Processing the following tasks ...

- exporting registry keys
- backing up DNS files from "C:\WINDOWS\System32\DNS"
- exporting Active Directory integrated Zones
- preparing exported data for future import

2007/04/04

log4j.properties

Пример использования mysql-аппендера для сбора логов в базу
log4j.logger.edu.internet2.middleware.shibboleth=INFO,idp
log4j.appender.idp=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.idp.driver=com.mysql.jdbc.Driver
log4j.appender.idp.URL=jdbc:mysql://192.168.1.1:3306/log_db?autoReconnect=true
log4j.appender.idp.user=log_user
log4j.appender.idp.password=log_pass
log4j.appender.idp.sql=INSERT INTO logging_event (time, level, class, message) VALUES ('%d', '%p', '%c', '%m')
log4j.appender.idp.layout=org.apache.log4j.PatternLayout

Ссылки:

  1. Гибкое журналирование с помощью log4j
  2. Short introduction to log4j

2007/03/26

Создание локального зеркала debian-репозитария пакетов

1. Установить утилиту apt-mirror. В процессе установки будет создан новый пользователь apt-mirror с домашней директорией /var/spool/apt-mirror
apt-get install apt-mirror

2. Сконфигурировать apt-mirror, конфигурационный файл /etc/apt/mirror.list. Пример конфигурационного файла:

##
## The default configuration options (uncomment and change to override)
##
#
# set base_path /var/spool/apt-mirror
# set mirror_path $base_path/mirror
# set skel_path $base_path/skel
# set var_path $base_path/var
#
# set defaultarch
# set nthreads 20
#
set _tilde 0

###
### sarge's section
###
deb http://ftp.at.debian.org/debian sarge main contrib non-free
deb-src http://ftp.at.debian.org/debian sarge main contrib non-free

deb http://security.debian.org/debian-security sarge/updates main contrib non-free
deb-src http://security.debian.org/debian-security sarge/updates main contrib non-free

deb http://ftp.at.debian.org/debian sarge main/debian-installer

# sarge-proposed-updates's section
deb http://ftp.at.debian.org/debian sarge-proposed-updates main contrib non-free
deb-src http://ftp.at.debian.org/debian sarge-proposed-updates main contrib non-free

###
### etch
###
deb http://ftp.at.debian.org/debian/ etch main contrib non-free
deb-src http://ftp.at.debian.org/debian/ etch main contrib non-free

deb http://security.debian.org/debian-security etch/updates main contrib non-free
deb-src http://security.debian.org/debian-security etch/updates main contrib non-free

deb http://ftp.at.debian.org/debian/ etch main/debian-installer

# etch-proposed-updates's section
deb http://ftp.at.debian.org/debian sarge-proposed-updates main contrib non-free
deb-src http://ftp.at.debian.org/debian sarge-proposed-updates main contrib non-free

# sid's section
#deb http://ftp.fi.debian.org/debian sid main contrib non-free
#deb-src http://ftp.fi.debian.org/debian sid main contrib non-free
#deb http://ftp.fi.debian.org/debian sid main/debian-installer

##
## Cleaner configuration example
##
#
# set cleanscript $var_path/clean.sh
#

# Cleaning section
clean http://security.debian.org/
clean http://ftp.at.debian.org/

skip-clean http://ftp.fi.debian.org/doc/

3. Создать локальное зеркало. Операция может занять много времени, всё зависит от того сколько дистрибутивов вы собираетесь "зеркалировать". Например, у меня выбрано sarge и etch - они занимают около 45 Гб. После того как всё будет скачано, операция автоматического обновления зеркала будет проходить в соответствии с файлом /etc/cron.d/apt-mirror. Ежедневные обновления содержат около 100 Мб.

su - apt-mirror -c apt-mirror

4. Автоматизировать очистку локального зеркала - необходимо регулярно запускать на выполнение /var/spool/apt-mirror/var/clean.sh, можно через cron.

5. Сделать локальный репозитарий доступным для локальных серверов, с помощью уже установленного и настроенного Apache - необходимо только создать символьные ссылки для доступа к репозитарию.

ln -s /var/spool/apt-mirror/mirror/security.debian.org/debian /var/www/debian
ln -s /var/spool/apt-mirror/mirror/security.debian.org/debian-security /var/www/debian-security

6. После этого локальное зеркало доступно по адресу http://mirrorserver/debian, http://mirrorserver/debian-security. А файл /etc/apt/sources.list для локальных серверов будет выглядеть примерно так:

deb http://mirrorserver/debian/ etch main
deb-src http://mirrorserver/debian/ etch main
deb http://mirrorserver/debian-security/ etch/updates main


Ссылки:

  1. How To Create A Local Debian/Ubuntu Mirror With apt-mirror

2007/03/16

Как изменить приветствие SSH-сервиса

Если сервис был самостоятельно собран из исходников, то достаточно отредактировать файл version.h и пересобрать сервис по-новому.

Всё немного сложнее, если используется уже кем-то собранный пакет. Например, Debian-система при попытке подсоединения к ней говорит:
# telnet localhost 22
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
SSH-2.0-OpenSSH_3.8.1p1 Debian-8.sarge.6

Злоумышленнику сразу выдаётся масса информации о системе.

Debian позволяет пересобрать пакет по своим потребностям и нуждам.

1. Необходимо убедиться, что файл /etc/apt/sources.list содержит хотя бы один deb-src-источник. Если не содержит - добавить. Также установить, если не установлены утилиты для сборки debian-пакетов

# cat >> /etc/apt/sourсes.list
deb-src http://ftp.at.debian.org/debian/ stable main
Ctrl + C
# apt-get update
# apt-get install dpkg-dev debhelper devscripts
...

2. Скачать и распаковать в текущую директорию debian-исходники пакета ssh

apt-get source ssh

3. Скачать и установить все необходимые для сборки пакеты (будет установлено достаточно большое количество пакетов - около 100)

apt-get build-dep ssh

4. В директории ./openssh-x.x.x/debian будет файл rules, в нем строка

SSH_VERSION := $(shell sed -e '/define/!d; s/.*\"\(.*\)\".*/\1/; q' <version.h) ... и т.д.

Можно отредактировать её по желанию, только не забыть, что она в свою очередь тоже зависит от содержимого файла version.h

5. Чтобы дальнейшие update'ы пакетов не затерли внесенные изменения, необходимо добавить в ./openssh-x.x.x/debian/changelog описание самостоятельно собранной версии. Номер версии должен отличаться, например вместо 1:3.8.1p1-8.sarge.6 укажите 1:3.8.1p1-8.sarge.6without_banner. Если что-то будет не так в данном файле сборка пакета не начнется.

6. Собрать самостоятельно сконфигурированный пакет

cd ./openssh-x.x.x
debuild -us -uc
...

7. Если процесс сборки прошёл успешно, установить собранный пакет

# cd ..
# dpkg -i ssh_x.x.x_i386.deb
(Reading database ... 33306 files and directories currently installed.)
Preparing to replace ssh x.x.x (using ssh_x.x.xwithout_banner_i386.deb) ...
Unpacking replacement ssh ...
Setting up ssh (x.x.xwithout_banner) ...
Restarting OpenBSD Secure Shell server: sshd.

Ссылки:

  1. How to make a small change to a Debian tool and repackage it?
  2. Rebuilding Debian packages
  3. HOWTO: Service banner faking

2007/03/14

Fail2Ban

Fail2Ban - простой локальный сервис, который просматривает логи на предмет попытки подоброать пароли к ssh, ftp, http-сервисам. Если такие попытки найдены, fail2ban блокирует ip-адрес источника. Сервис очень гибко настраивается - возможна блокировка через iptables или /etc/hosts.allow (deny), способен оповещать по email, писать лог, сбрасывать блокировку через заданное время и прочее.
В Debian 4.0 Fail2ban доступен в репозитарии пакетов, но и из исходников он просто разворачивается, только требует наличия python 2.4.
tar xvfj fail2ban-0.6.2.tar.bz2
cd fail2ban-0.6.2
python setup.py install
...
cd config
cp debian-initd /etc/init.d/fail2ban
cd /etc/init.d
chmod +x fail2ban
update-rc.d fail2ban defaults
cp fail2ban.conf.iptables /etc/fail2ban.conf

Остаётся только подправить файл конфигурации /etc/fail2ban.conf под свои нужды.

Ссылки:
  1. Fail2Ban Homepage

2007/03/13

csv -> ldif

Что имеется - список адресатов с различными данными (номера телефонов, адреса, email и т.п.) в формате csv. Если есть xls (spreadsheet), его можно сохранить в csv.

Задача - создать адресную LDAP-книгу.

Чтобы занести уже имеющиеся данные в LDAP-диреторию, их необходимо представить в LDIF-формате. Ниже представлен простейший perl-скрипт, позволяющий выполнить данную операцию.

#!/usr/bin/perl
#
# This is an example of using the Text::ParseWords module to convert
# a comma-delimited file to LDIF. Requires Perl 5.005 or higher. Just
# pipe the CSV file to this script and redirect the output to a file:
#
# cat FILENAME.csv | csv2ldif.pl > FILENAME.ldif
#
# Anthony Greene
#
# Load the required module.
use Text::ParseWords;

# Set a default objectclass and suffix.
$objectclass = 'inetOrgperson';
$dnsuffix = 'ou=addressbook,o=SSC,c=LT';

# Read lines from STDIN.
while ($line = ) {
@fields = "ewords(',',0,$line);

# Output the values.
print "dn: cn=$fields[0], $dnsuffix\n";
print "cn: $fields[0]\n";
print "givenname: $fields[1]\n";
print "sn: $fields[2]\n";
print "objectclass: $objectclass\n";
print "objectclass: top\n";
print "mail: $fields[3]\n";
if ($fields[4]) { print "telephonenumber: $fields[4]\n"; }
if ($fields[5]) { print "facsimiletelephonenumber: $fields[5]\n";}
if ($fields[6]) { print "mobile: $fields[6]\n";}
if ($fields[7]) { print "street: $fields[7]\n";}
if ($fields[8]) { print "l: $fields[8]\n";}
if ($fields[9]) { print "postalcode: $fields[9]\n";}
if ($fields[10]) { print "o: $fields[10]\n";}
print "\n";
}
exit;

2007/03/07

Сборка ядра Linux

Статья "Некоторые замечания о сборке ядер Линукс" заставила в очередной раз обратить внимание на Linux ядро, его сборку, конфигурирование и для меня, наконец, этот процесс стал более прозрачным и понятным.

Если используется Debian-ориентированная система, то для установки всего необходимого можно воспользоваться менеджером пакетов, он установит все необходимые промежуточные зависимости:

# apt-get install linux-source-2.x.x libncurses5-dev kernel-package
# cd /usr/src
# tar xfj kernel-source-2.x.x.tar.bz2
# cd kernel-source-2.x.x
# make menuconfig
...
(конфигурирование параметров ядра)
...
# make-kpkg --append-to-version=.cramfsasmodule --revision=1.0 kernel_image
dpkg -i kernel-image-(2.x.x)(--append-to-version)_(--revision)_(architecture).deb
  • append-to-version - опция для указания версии ядра (можно использовать символы '+' и '.', нельзя использовать '_')
  • revision - опция для указания версии пакета в Debian-репозитарии (можно использовать символы '+' и '.', нельзя использовать '_'). По умолчанию используется "10.00.Custom"
  • kernel_image - сделать debian-пакет ядра

Либо всё делать вручную: скачать ядро с сайта www.kernel.org в /usr/src

# cd /usr/src
# tar xfj kernel-source-2.x.x.tar.bz2
# cd kernel-source-2.x.x
# make clean
# make menuconfig
...
(конфигурирование параметров ядра)
...
# make bzImage modules # Сборка ядра и модулей
# make modules_install install # установка модулей и ядра
# update-grub # Обновление меню загрузчика GRUB

Чтобы установить версию ядра в ручном методе, в файл /usr/src/Makefile необходимо внести поправку:

EXTRAVERSION = 20070304withusb

Статья "Ставим ядро 2.6, или Ядерная физика для домохозяйки" очень может помочь в процессе выбора необходимых опций на этапе конфигурации.

Чтобы не использовать initrd должны быть монолитно собраны драйвера корневой файловой системы (например ext3) и следущие опции:

Device Drivers -> Block devices

[*] RAM disk support
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

Также должен присутствовать в виде модуля (или монолитно)

File systems -> Miscellaneous filesystems

[*/M] Compressed ROM file system support (cramfs)

Ссылки:

  1. Некоторые замечания о сборке ядер Линукс.
  2. Ставим ядро 2.6, или Ядерная физика для домохозяйки.
  3. How To Roll A Kernel the Ubuntu/Debian Way
  4. Creating custom kernels with Debian's kernel-package system

2007/02/22

Печать средствами CUPS в Solaris 10

Установить CUPS с blastwave.org
pkg-get -i cups

Остановить старые сервисы

svcadm disable application/print/ipp-listener
svcadm disable application/print/server
svcadm disable application/print/rfc1179

Заменить утилиты печати версией от CUPS

mv /usr/bin/lp /usr/bin/lp.solaris
ln -s /opt/csw/bin/lp /usr/bin/lp
mv /usr/bin/lpstat /usr/bin/lpstat.solaris
ln -s /opt/csw/bin/lpstat /usr/bin/lpstat
mv /usr/sbin/lpadmin /usr/sbin/lpadmin.solaris
ln -s /opt/csw/sbin/lpadmin /usr/sbin/ldadmin

Запустить cups-сервис

svcadm enable svc:/application/print/cswcups:default

После успешного запуска cups-службы по адресу http://localhost:631 можно добавить необходимые принтера (потребуется доступ root-пользователя). Сетевой принтер, имеющий свой собственный ip-адрес наверняка будет находиться по адресу socket://ip:9100. PPD-файл для Samsung 2551ML доступен здесь.

2007/02/21

Обновление портов в FreeBSD

Прежде чем что-либо делать с портами в FreeBSD их необходимо обновить:
# cat >> /etc/make.conf
SUP_UPDATE=yes
SUP=/usr/local/bin/cvsup
SUPFLAGS=-g -L 2
SUPHOST=cvsup.uk.FreeBSD.org
SUPFILE=/usr/share/examples/cvsup/standard-supfile
PORTSSUPFILE=/usr/share/examples/cvsup/ports-supfile
DOCSUPFILE=/usr/share/examples/cvsup/doc-supfile
Ctrl + C
# cd /usr/ports
# make update

Найти в портах (/usr/ports) порт portupgrade (/usr/ports/ports-mgmt/portupgrade), установить его

cd /usr/ports/ports-mgmt/portupgrade
make && make install

После этого можно с помощью утилиты portupgrade уже возможно обновлять установленные порты (ключ -R говорит о том, что нужно обновить не только порт, но и все его зависимости)

portupgrade -R имя_порта

Чтобы узнать список портов, нуждающихся в обновлении, существует команда

pkg_version -v

Для наведения порядка (удаление неиспользуемых портов, дубликатов версий) в реестре установленных портов (/var/db/pkg) можно воспользоваться командой

pkgdb -F


Ссылки:

  1. "Системный администратор" (2007.01)
  2. Очистка портов во FreeBSD
  3. portupgrade - `обновлялка` установленных портов

2007/02/09

Evince pdf-viewer for Solaris

По непонятным причинам GNOME Pdf Viewer при просмотре документов, содержащих национальные символы (проверялось с русскими и литовскими документами), вместо таких символов выводит либо квадратики, либо ничего не выводит. Попробовав добавить в систему ttf-шрифты, я понял, что это не меняет его поведения. Тогда попробовал найти замену и посмотреть, как будет себя вести другой pdf-reader.

На сайте Blastwave.org есть собрана достаточно хорошая база пакетов для Solaris 10, а в качестве замены gpdf - там лежит Evince. На момент написания этих строк версия данной программы - 0.6.1,REV=2006.11.28.

Установка проще некуда, если уже имеется утилита pkg-get (на сайте Blastwave.org описан процесс ее установки):

/opt/csw/bin/pkg-get -i evince

После этого необходимо "научить" GNOME использовать только что установленную апликацию. Чтобы добавить пункт "Evince PDF Document Viewer" в стартовое меню:

# cd /usr/share/applications
# cat > evince.desktop
[Desktop Entry]
Encoding=UTF-8
Name=Evince PDF Document Viewer
Exec=/opt/csw/bin/evince
Icon=/opt/csw/share/icons/hicolor/48x48/apps/evince.png
Terminal=false
Type=Application
Categories=GNOME;Application;Graphics;VectorGraphics;Viewer;
StartupNotify=true
Ctrl + C

Чтобы у всех пользователей в меню "open with" появился evince, необходимо внести поправки в файл /usr/share/mime-info/gnome-vfs.keys. Если хочется вовсе забыть о существовании gpdf (о чем я советую), необходимо в этом файле удалить всякое упоминание о gpdf. Если всё-таки оставить gpdf, то мне не удалось понять каким образом устроена иерархия между указанными апликациями.

...
short_list_application_ids_for_novice_user_level=acroread,evince,xpdf,gv
short_list_application_ids_for_intermediate_user_level=acroread,evince,xpdf,gv
short_list_application_ids_for_advanced_user_level=acroread,evince,xpdf,gv
...

И создать запить об evince в реестре программ

cd /usr/share/application-registry
cp gpdf.applications evince.applications
vi evince.applications
evince
command=/opt/csw/bin/evince
name=PDF Viewer
can_open_multiple_files=true
startup_notify=true
expects_uris=false
requires_terminal=false
mime_types=application/pdf

После этого достаточно перелогиниться и изменения вступят в силу.

Evince прекрасно отображает все национальные симолы и сам по себе более приятен в работе.

Ссылки:

  1. GNOME 2.6 System Administration Guide