Кластеризация + виртуализация: Linux HA + OpenVZ Часть 1: кластеризация на практике Евгений Прокопьев [root@m1 ~]# apt-cache search drbd [root@m1 ~]# uname -a [root@m1 ~]# apt-get install kernel-modules-drbd-std26-up drbd-tools resource r0 { # протокол передачи # C: запись считается завершенной, если данные записаны на локальный и удаленный диск, подходит # для критически важных транзакций и в большинстве остальных случаев # B: запись считается завершенной, если данные записаны на локальный диск и удаленный буферный кэш # A: запись считается завершенной, если данные записаны на локальный диск и локальный буфер tcp # для отправки подходит для для сетей с высокой задержкой protocol C; # описание узла m1 on m1.mydomain.com { device /dev/drbd0; # имя drbd-устройства disk /dev/hda3; # раздел диска, поверх которого оно работает address 192.168.200.1:7788; # адрес и порт демона drbd meta-disk internal; # хранить метаданные drbd на том же разделе диска } # описание узла m2 on m2.mydomain.com { device /dev/drbd0; # имя drbd-устройства disk /dev/hda3; # раздел диска, поверх которого оно работает address 192.168.200.2:7788; # адрес и порт демона drbd meta-disk internal; # хранить метаданные drbd на том же разделе диска } } [root@m1 ~]# mknod /dev/drbd0 b 147 0 [root@m1 ~]# chkconfig --level 2345 drbd on [root@m1 ~]# uname -a [root@m1 ~]# service drbd status [root@m1 ~]# drbdadm -- --do-what-I-say primary all [root@m1 ~]# service drbd status [root@m1 ~]# service drbd status root@m1 ~]# mkfs.ext3 /dev/drbd0 [root@m1 ~]# mkdir /d0 [root@m1 ~]# mount /dev/drbd0 /d0 [root@m2 ~]# mkdir /d0 [root@m2 ~]# mount /dev/drbd0 /d0 [root@m1 ~]# umount /d0 [root@m1 ~]# drbdadm disconnect all [root@m2 ~]# drbdadm disconnect all [root@m1 ~]# drbdadm secondary all [root@m2 ~]# drbdadm -- --human primary all [root@m1 ~]# drbdadm connect all [root@m2 ~]# drbdadm connect all [root@m2 ~]# mount /dev/drbd0 /d0 [root@m1 heartbeat]# apt-get install heartbeat auth 1 1 sha1 RcBkJzU8ClnrjWVRLv5EDsdRFQP1j1C Logfacility local0 ucast eth2 192.168.200.2 auto_failback on node m1.mydomain.com m2.mydomain.com Logfacility local0 ucast eth2 192.168.200.1 auto_failback on node m1.mydomain.com m2.mydomain.com m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3 [root@m1 ~]# service heartbeat start ----------------------------------------------------------------------------------------------------------------- MS Windows XP SP3, или Много шума из ничего Алексей Барабанов # ./mkwinxp cd_sp2_only # grep localCabPool sus_consts.py # cd /srv/winupdate/www/autoupdate # python sus_sync.py >net stop wuauserv >net start wuauserv # find . -name "*.exe" | awk -F/ '{print $3}' | awk -F. '{print $1}' >real-updates.txt # for i in $(cat real-updates.txt) ; do find . -name "$i.exe" -exec cp -v '{}' $i.exe \; ; done `./com_microsoft.WindowsXP-KB925486-x86-189032/WindowsXP-KB925486-x86-RUS.exe' -> `WindowsXP-KB925486-x86-RUS.exe' `./com_microsoft.873333_XP_SP3_WinSE_143087/WindowsXP-KB873333-x86-RUS.exe' -> `WindowsXP-KB873333-x86-RUS.exe' ... пропущено ... `./com_microsoft.WindowsXP-KB922616-x86-185856/WindowsXP-KB922616-x86-RUS.exe' -> `WindowsXP-KB922616-x86-RUS.exe' # du -c *.exe | grep "total\$" # wc -l real-updates.txt # du -c ../IMG | grep "total\$" # diff -Naur admin.py.orig admin.py --- admin.py.orig 2006-08-21 13:57:32.000000000 +0400 +++ admin.py 2006-08-21 16:04:24.000000000 +0400 @@ -155,7 +155,10 @@ else: dtstr = dts[0] + ' - ' + dts[len(dts)-1] print ''%(rowcolor,sPublisherPlusName,cstr) - req.write('
%s, %s
'%(sPublisherPlusName, vItemDetails[conFieldItemStringsTitle].encode('utf8'), dtstr)) +### req.write('
%s, %s
'%(sPublisherPlusName, vItemDetails[conFieldItemStringsTitle].encode('utf8'), dtstr)) + req.write('
'%(sPublisherPlusName)) + print row+1, ' ' + req.write('%s, %s
'%(vItemDetails[conFieldItemStringsTitle].encode('utf8'), dtstr)) # req.write(' ('+repr(approved[sPublisherPlusName])+')') print '
' req.write(vItemDetails[conFieldItemStringsDescription].encode('utf8')) @@ -169,7 +172,7 @@ req.write(' Eula'%urle) print '
' - req.write('Applies to: ' +string.join(applies, ',').encode('utf8')) + req.write('Applies to: ' +string.join(applies, ',\n').encode('utf8')) print '' row = row + 1 # wget http://winupdate.office.localnet/autoupdate/admin.py -O all-updates-from-sus.html # grep XP SP2 all-updates-from-sus.html | awk 'BEGIN{FS="href=\""}{print $2}' >all-updates.txt #!/bin/sh SUSLIST=all-updates-from-sus.html REAL=real-updates.txt # создадим командные файлы для обновления и интеграции U=update.cmd UO=update-only.cmd I=integrate.cmd for i in $U $UO $I ; do echo -e "@echo off\r" >$i done P="G:\IMG" RP="/srv/smb/public/IMG" mkdir -p $RP chmod ugo+w -R $RP UOP="$RP/\$OEM\$/\$1/InstData" mkdir -p $UOP # список известных исключений EL="WindowsXP-KB885250-x86-RUS.exe WindowsXP-KB885835-x86-RUS.exe \ WindowsXP-KB887742-x86-RUS.exe WindowsXP-KB888113-x86-RUS.exe \ WindowsXP-KB890047-x86-RUS.exe WindowsXP-KB890175-x86-RUS.exe \ WindowsXP-KB867282-x86-RUS.exe Windows-KB913433-x86-RUS" n=1 for i in $(cat $REAL) ; do echo -----$n-------$i--------------- T=$(grep "$i" $SUSLIST | grep "SP2") n=$((n+1)) if [ "1$T" == "1" ] ; then echo ====================ERROR!!!!================= else T=$(echo "$T" | awk 'BEGIN{FS="switches: "}{print $2}' | awk -F, '{print $1}') echo -e "echo integration $i running...\r\n$i.exe ? $T\r\necho done\r" >>$U # проверим на совместимость j=$(find . -name "$i.exe" | head -n 1) k=$(strings "$j" | grep "SFX_CAB_EXE") # удалим исключения m=$(echo $EL | grep "$i") [ "1$m" == "1" ] || k="" if [ "1$k" == "1" ] ; then echo -e "echo integration $i running...\r\n$i.exe $T\r\necho done\r" >>$UO cp -v $i.exe $UOP else echo -e "echo integration $i running...\r\n$i.exe /q /integrate:$P\r\necho done\r" >>$I #echo "pause" >>$I fi fi done for i in $U $I ; do echo -e "pause\r" >>$i done cp -v $UO $UOP exit # head -n 7 integrate.cmd # du -c ../IMG | grep "total\$" # cat winreg2txt #!/usr/bin/perl # преобразование winregistry в ascii файл $i=1; $n=0; while(read(STDIN,$j,1)) { if( $n > 1 ){ if( $i == 1){ $i=0; print $j; }else{ $i=1; } } $n++; } # ./winreg2txt SP3-from-win.reg.txt # ./winreg2txt SP3-integrated.reg.txt # diff -s SP3-integrated.reg.txt SP3-from-win.reg.txt ----------------------------------------------------------------------------------------------------------------- Разрабатываем пакет управления для МОМ Андрей Бирюков Net start [Имя_сервиса] select * from __InstanceModificationEvent WITHIN 89 Where TargetInstance ClamAV'Win32_Service' AND TargetInstance.State = 'Stopped' Листинг 1. Поиск вхождений в файле журнала ‘ путь к файлу журнала strFile="c:\clamav-devel\log\clamd.log" Set objFSO = CreateObject("Scripting.FileSystemObject") ‘ открываем файл на чтение Set readPCFile = objFSO.OpenTextFile(strFile, ForReading) search="FOUND" искомая подстрока ‘ цикл по всему файлу журнала Do Until readPCFile.AtEndOfStream strNextLine = readPCFile.Readline ‘ считываем построчно ‘ вхождение найдено If Instr(InStr(1,strNextLine,search)) then ‘ присваиваем соответствующее значение переменной result= strNextLine … ‘ далее действия с этой переменной End If Loop ‘ завершение цикла readPCFile.Close ‘ закрываем файл Листинг 2. Общий вид сценария ‘ блок инициализации Option Explicit Const PROBLEMSTATE_NOTSET = 0 Const PROBLEMSTATE_GREEN = 1 Const PROBLEMSTATE_YELLOW = 3 ' Yellow = Red+(Warning|Error) Const PROBLEMSTATE_RED = 3 Const ALERT_SUCCESS = 10 Const ALERT_INFORMATION = 20 Const ALERT_WARNING = 30 Const ALERT_ERROR = 40 Const ALERT_CRITICAL_ERROR = 50 Const ALERT_SECURITY_BREACH = 60 Const ALERT_SERVICE_UNAVAILABLE = 70 Dim oEvent Set oEvent = ScriptContext.CreateEvent() ‘ основной блок Sub Main() ‘ здесь производится вызов процедур, используемых для сбора и обработки необходимой информации End Sub ‘ Function ThrowScriptError(sMessage, oErr) ' ' ThrowScriptError :: Creates an event and sends it back to the mom server ' ' процедура возвращает сообщение об ошибке, в случае некорректного завершения сценария ScriptContext.Quit() End Function ' VBScript source code ScriptContext.Submit oEvent Листинг 2. Общий вид сценария ‘ блок инициализации Option Explicit Const PROBLEMSTATE_NOTSET = 0 Const PROBLEMSTATE_GREEN = 1 Const PROBLEMSTATE_YELLOW = 3 ' Yellow = Red+(Warning|Error) Const PROBLEMSTATE_RED = 3 Const ALERT_SUCCESS = 10 Const ALERT_INFORMATION = 20 Const ALERT_WARNING = 30 Const ALERT_ERROR = 40 Const ALERT_CRITICAL_ERROR = 50 Const ALERT_SECURITY_BREACH = 60 Const ALERT_SERVICE_UNAVAILABLE = 70 Dim oEvent Set oEvent = ScriptContext.CreateEvent() ‘ основной блок Sub Main() ‘ здесь производится вызов процедур, используемых для сбора и обработки необходимой информации End Sub ‘ Function ThrowScriptError(sMessage, oErr) ' ' ThrowScriptError :: Creates an event and sends it back to the mom server ' ' процедура возвращает сообщение об ошибке, в случае некорректного завершения сценария ScriptContext.Quit() End Function ' VBScript source code ScriptContext.Submit oEvent Напишем сценарий, который будет отслеживать появление в журналах событий антивирусной системы сообщения о зараженных файлах (напротив имен таких файлов должно быть написано FOUND). Далее сценарий будет передавать МОМ сообщение в специальном формате, на основании которого будет создан Alert, сообщающий оператору системы о заражении файла. Листинг 3. Сценарий, сообщающий об обнаружении зараженного файла Option Explicit Const PROBLEMSTATE_NOTSET = 0 ‘ состояние проблемы Const PROBLEMSTATE_GREEN = 1 ‘ цветовая маркировка Const PROBLEMSTATE_YELLOW = 3 ‘ Yellow = Red+(Warning|Error) Const PROBLEMSTATE_RED = 3 Const ALERT_SUCCESS = 10 Const ALERT_INFORMATION = 20 ‘ различные виды уведомлений Alert Const ALERT_WARNING = 30 Const ALERT_ERROR = 40 Const ALERT_CRITICAL_ERROR = 50 Const ALERT_SECURITY_BREACH = 60 Const ALERT_SERVICE_UNAVAILABLE = 70 Dim oAlertHandle ‘ Объект для создаваемого события Set oAlertHandle = ScriptContext.CreateAlert() ‘ основной блок Sub Main() ‘ здесь производится вызов процедур, используемых для сбора и обработки необходимой информации virusfind() End Sub Sub virusfind() ‘ путь к файлу журнала strFile=”c:\clamav-devel\log\clamd.log” Set objFSO = CreateObject(“Scripting.FileSystemObject”) ‘ открываем файл на чтение Set readPCFile = objFSO.OpenTextFile(strFile, ForReading) search=”FOUND” искомая подстрока ‘ цикл по всему файлу журнала Do Until readPCFile.AtEndOfStream ‘ считываем построчно strNextLine = readPCFile.Readline ‘ вхождение найдено If Instr(InStr(1,strNextLine,search)) then ‘ присваиваем соответствующее значение переменной result= strNextLine ‘ далее приводятся свойства уведомления oAlertHandle.Name = “ Virus found!!!” ‘ описание события oAlertHandle.Description = “Virus found in file” & result ‘ Какая роль (диск так как вирус найден на файловом уровне, а например, не в памяти) oAlertHandle.ServerRole = “Disk” ‘ компонента – файловая система oAlertHandle.Component = “File System” ‘ цвет уведомления желтый oAlertHandle.ProblemState = PROBLEMSTATE_YELLOW ‘ вид уведомления – предупреждение oAlertHandle.AlertLevel = ALERT_WARNING End If Loop ‘ завершение цикла readPCFile.Close ‘ закрываем файл End sub ‘ Function ThrowScriptError(sMessage, oErr) ‘ ‘ ThrowScriptError :: Creates an event and sends it back to the mom server ' ' процедура возвращает сообщение об ошибке, в случае некорректного завершения сценария On Error Resume Next Dim oScriptErrorEvent Set oScriptErrorEvent = ScriptContext.CreateEvent() With oScriptErrorEvent .EventNumber = 40000 ‘EventLogEntryType Enumeration .EventType = 1 .Message = sMessage .SetEventParameter “Microsoft Windows Servers Base Operating System” .SetEventParameter sMessage .SetEventParameter oErr.Description .SetEventParameter oErr.Number End With ScriptContext.Submit oScriptErrorEvent ScriptContext.Echo ? “ThrowScriptError(‘” & sMessage & “’)” ScriptContext.Quit() End Function ‘ VBScript source code ScriptContext.Submit oEvent ----------------------------------------------------------------------------------------------------------------- Полезные советы по PostgreSQL Сергей Супрунов CREATE TABLE mytable (id serial, ware varchar, price numeric(10,2)); CREATE TABLE withdesc (description text) INHERITS mytable; admin=# BEGIN; admin=# DECLARE mycursor CURSOR FOR admin-# SELECT * FROM mytable; admin=# FETCH NEXT FROM mycursor; admin=# FETCH NEXT FROM mycursor; admin=# MOVE BACKWARD ALL IN mycursor; admin=# FETCH NEXT FROM mycursor; admin=# COMMIT; ----------------------------------------------------------------------------------------------------------------- На что способен дистрибутив SystemRescueCd Linux Иван Максимов mount /dev/hda1 /mnt/temp1 dd if=/dev/zero of=/mnt/temp1/fs.iso bs=1M count=1200 mkfs.ext2 /mnt/temp1/fd.iso mount -o loop /mnt/temp1/fd.iso /mnt/custom sysrescue-custom extract sysrescue-costom cloop 300 20000 #!/bin/bash ifconfig eth0 192.168.1.200 netmask 255.255.255.0 route add default gw 192.168.1.1 mount -t nfs 192.168.1.10:/home/users /mnt/temp1/ sysresccd-custom setkmap ru sysresccd-custom isogen mysyscd #!/bin/bash # Установка параметров сети ifconfig eth0 192.168.1.200 netmask 255.255.255.0 route add default gw 192.168.1.1 # Монтирование сетевой папки mount.smb //192.168.1.10:/Files/ /mnt/temp1/ # Определение MAC-адреса MACADDRES="`strings /sys/class/net/eth0/address`" echo "Mac addres is ${MACADDRES}" # Определение файловых систем # FAT dd if=/dev/hda1 bs=512 count=1 | strings | grep FAT if [ $? -eq 0 ]; then FS="1" fi # NTFS dd if=/dev/hda1 bs=512 count=1 | strings | grep NTFS if [ $? -eq 0 ]; then FS="2" fi # Процедура сохранения образа do_save() { # Сохранение FAT-образа if [ $FS -eq 1 ]; then partimage -z1 -o -b -d save /dev/hda1 /mnt/temp1/arhiv/${MACADDRES} exit 1 fi # Сохранение NTFS-образа if [ $FS -eq 2 ]; then ntfsclone --save-image /dev/hda1 -o /mnt/temp1/arhiv/${MACADDRES} exit 1 fi } # Процедура загрузки образа do_load() { # Загрузка FAT-образа if [ $FS -eq 1 ]; then partimage -b restore /dev/hda1 /mnt/temp1/arhiv/${MACADDRES}.000 exit 1 fi # Загрузка NTFS-образа if [ $FS -eq 2 ]; then ntfsclone --restore-image -O /dev/hda1 /mnt/temp1/arhiv/${MACADDRES} exit 1 fi } # Основная функция case "$1" in save) do_save;; load) do_load;; esac partimage -z1 -o -b -d save /dev/hda1 /mnt/temp1/arhiv/${MACADDRES} ntfsclone --save-image /dev/hda1 -o /mnt/temp1/arhiv/${MACADDRES} partimage -b restore /dev/hda1 /mnt/temp1/arhiv/${MACADDRES}.000 ntfsclone --restore-image -O /dev/hda1 /mnt/temp1/arhiv/${MACADDRES} case "$1" in [Ss][Aa][Vv][Ee]) do_save;; [Ll][Oo][Aa][Dd]) do_load;; esac ----------------------------------------------------------------------------------------------------------------- Выявление угроз информационной безопасности внутри компании Никита Дуров > ping microsoft.com # nmap -sS target.example.com/24 # hping2 --traceroute -t 1 -2 --baseport 53 -keep -V -p 5023 gw.target.com # nmap -O targethost.com # telnet target.com 80 # nslookup ----------------------------------------------------------------------------------------------------------------- FreeBSD jail: зона строгого режима Сергей Супрунов # mkdir -p /var/jails/system # cd /usr/src # make world DESTDIR=/var/jails/system # make distribution DESTDIR=/var/jails/system # mount_devfs devfs /var/jails/system/dev # make installworld DESTDIR=/var/jails/system # ifconfig lo0 alias 10.30.0.100 netmask 255.255.255.255 # jail /var/jails/system jail.host 10.30.0.100 /bin/csh jail# passwd root jail# adduser jail# echo "sshd_enable=YES" >> /etc/rc.conf jail_enable="YES" jail_list="system" jail_system_rootdir="/var/jails/system" jail_system_hostname="jail.host" jail_system_ip="10.30.0.100" jail_system_interface="lo0" jail_system_devfs_enable="YES" jail_system_exec_start="/bin/sh /etc/rc" jail_system_exec_stop="/bin/sh /etc/rc.shutdown" $ ssh -l admin 10.30.0.100 # mount_nullfs /usr/ports /var/jails/outers/usr/ports # cd /var/jails/outers # find / -type d -maxdepth 1 | sed 's/^\///' | xargs mkdir # find /etc -type d -maxdepth 1 | sed 's/^\///' | xargs mkdir # find /usr -type d -maxdepth 1 | sed 's/^\///' | xargs mkdir # find /etc/periodic -type d -maxdepth 1 | sed 's/^\///' | xargs mkdir # find /var -type d -maxdepth 1 | sed 's/^\///' | xargs mkdir # find /var/named -type d -maxdepth 3 | sed 's/^\///' | xargs mkdir # cd /usr/src # make distribution DESTDIR=/var/jails/outers # mv /var/jails/outers/etc /var/jails/_4mount/outers/etc # mkdir /var/jails/outers/etc # For jail /bin /var/jails/outers/bin nullfs ro 0 0 /sbin /var/jails/outers/sbin nullfs ro 0 0 /lib /var/jails/outers/lib nullfs ro 0 0 /libexec /var/jails/outers/libexec nullfs ro 0 0 /usr/bin /var/jails/outers/usr/bin nullfs ro 0 0 /usr/sbin /var/jails/outers/usr/sbin nullfs ro 0 0 /usr/lib /var/jails/outers/usr/lib nullfs ro 0 0 /usr/libexec /var/jails/outers/usr/libexec nullfs ro 0 0 /usr/libdata /var/jails/outers/usr/libdata nullfs ro 0 0 /usr/include /var/jails/outers/usr/include nullfs ro 0 0 /usr/share /var/jails/outers/usr/share nullfs ro 0 0 /var/jails/_4mount/outers/etc /var/jails/outers/etc nullfs ro 0 0 # echo "password" | pw -V /var/jails/_4mount/outers/etc useradd me -h 0 -g wheel default:\ :cputime=1h:\ :memoryuse=50M:\ ... пропущено ... :maxproc=35:\ :coredumpsize=0: root:\ :tc=default: # mkdir -p /var/jails/wuftpd # cd /usr/ports/ftp/wuftpd # make PREFIX=/var/jails/wuftpd/ install # ldd /var/jails/wuftpd/libexec/ftpd # cp /lib/libcrypt.so.3 /var/jails/wuftpd/lib/ # cp /lib/libmd.so.3 /var/jails/wuftpd/lib # cp /lib/libc.so.6 /var/jails/wuftpd/lib # mkdir -p /var/jails/wuftpd/usr/lib # cp /usr/lib/libopie.so.4 /var/jails/wuftpd/usr/lib # mkdir -p /var/jails/wuftpd/var/log/ # mkdir -p /var/jails/wuftpd/var/run/ # cd /var/jails/wuftpd/etc # cp ftpaccess.example ftpaccess # cp ftpgroups.example ftpgroups # cp ftpusers.example ftpusers # cp ftpconversions.example ftpconversions # head -3 /etc/master.passwd > master.passwd # vipw -d # jail /var/jails/wuftpd wuftpd 10.30.0.121 /libexec/ftpd -S # cp /libexec/ld-elf.so.1 /var/jails/wuftpd/libexec/ # jail /var/jails/wuftpd wuftpd 10.30.0.121 /libexec/ftpd -S # jls # sockstat | grep 10.30.0.121 # ps ax | grep J # killall -j 24 ----------------------------------------------------------------------------------------------------------------- Полезные советы по Bacula Сергей Яремчук $ mkdir /etc/ssl/bacula $ cd /etc/ssl/bacula # openssl req -new -x509 -config /opt/ssl/openssl.cnf -keyout bacula.pem -out bacula.pem -days 365 # /opt/bin/openssl rsa -in bacula.pem -out bacula_server.key # /opt/bin/openssl x509 -in bacula.pem -out bacula_server.crt TLS Enable = yes # включение TLS TLS Require = yes TLS Verify Peer = yes # включение проверки сертификата клиента (используется только на сервере) TLS Allowed CN = "bacula@example.com" TLS Allowed CN = "administrator@example.com" TLS CA Certificate File = /etc/ssl/bacula/bacula_server.crt TLS Certificate = /etc/ssl/bacula/bacula_server.crt TLS Key = /etc/ssl/bacula/bacula_server.key -A INPUT -p tcp --dport 9101:9103 -s 192.168.0.0/24 -j ACCEPT -A INPUT -p tcp --dport 9102 –s 192.168.0.0/24 -j ACCEPT $ tcpdmatch main-fd example.com ----------------------------------------------------------------------------------------------------------------- Ошибки синхронизации открывают большие возможности для хакеров. Каковы механизмы защиты? Крис Касперски Листинг 1. Командная строка для загрузки дампа в отладчик i386kd -z C:\WINNT\memory.dmp y SRV*D:\sym* http://msdl.microsoft.com/download/symbols Листинг 2. В загруженном дампе памяти регистр EIP указывает не на место сбоя, а на адрес, лежащий внутри обработчика исключения kd> u eip Листинг 3. Анализ дампа памяти, вызвавшего BSOD, но не оказавшего воздействия на регистр EIP kd> !analyze -v Листинг 4. Окрестности команды, вызывавшей «голубой экран смерти» из-за ошибки синхронизации kd>u f7433678-10 Листинг 5. Анализ дампа памяти, оказавшего воздействие на регистр EIP kd> !analyze -v Листинг 6. Дизассемблерный листинг окрестностей места сбоя kb>u cccccccc ----------------------------------------------------------------------------------------------------------------- Kerberos и электронная почта Михаил Кондрин $ tar xzvf postfix-2.2.8.tar.gz $ cd postfix-2.2. $ make tidy $ make makefiles -i Makefile.in "CCARGS=-DUSE_SASL_AUTH -I/usr/include/sasl" 'AUXLIBS=-L/usr/lib -R/usr/lib -lsasl2' $ make $ make update $ ./postfix-install -non-interactive tar xzvf cyrus-imapd-2.3.1.tar.gz cd cyrus-imapd-2.3.1 ./configure \ --prefix=/usr \ --sysconfdir=/etc \ --localstatedir=/var \ --disable-static \ --with-cyrus-prefix=/usr/cyrus \ --with-sasl \ --enable-gssapi=no make make install # getent passwd | grep “^\(postfix\|cyrus\)” # getent group | grep “^\(mail\|postdrop\)” queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix sendmail_path = /usr/sbin/sendmail newaliases_path = /usr/bin/newaliases mailq_path = /usr/bin/mailq alias_maps=hash:$config_directory/aliases alias_database=hash:$config_directory/aliases local_recipient_maps= qmail_owner = postfix setgid_group = postdrop myhostname = kdc.myrealm.ru mydomain = myrealm.ru myorigin = $mydomain mydestination = $mydomain, $myhostname, localhost inet_interfaces = all mynetworks_style = subnet mailbox_transport = lmtp:unix:/var/imap/socket/lmtp smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = MYREALM.RU broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination # cat /usr/lib/sasl2/smtpd.conf $ postalias /etc/postfix/aliases $ /usr/sbin/postfix start $ mkdir –p /var/imap/{proc,db,log,msg,socket,ptclient} $ chown -R cyrus.mail /var/imap $ chmod -R 755 /var/imap $ mkdir –p /var/spool/imap $ chown cyrus.mail /var/spool/imap $ chmod 750 /var/spool/imap configdirectory: /var/imap partition-default: /var/spool/imap admins: cyradmin altnamespace: yes sasl_pwcheck_method: saslauthd sasl_mech_list: gssapi plain $ /usr/cyrus/bin/master & # kinit admin/admin # kadmin >add cyradmin >add --random-key imap/kdc.myrealm.ru >add --random-key smtp/kdc.myrealm.ru >ext imap/kdc.myrealm.ru >ext smtp/kdc.myrealm.ru kerberos::1000:root,postfix,cyrus # chown root.kerberos /etc/krb5.keytab # chmod 640 /etc/krb5.keytab $ cyradm kdc.myrealm.ru kdc.myrealm.ru> cm user.mike kdc.myrealm.ru> setquota user.mike 10000 $ cyradm -u cyradmin -p kdc.myrealm.ru ... $ kinit mike $ smtptest -m PLAIN -u mike kdc.myrealm.ru $ imtest -m GSSAPI kdc.myrealm.ru user_pref("network.auth.use-sspi", false); user_pref("network.negotiate-auth.using-native-gsslib", true) user_pref("network.negotiate-auth.gsslib", "") allowplaintext: 0 smtpd_sasl_security_options=noplaintext,noanonymous smtpd_sasl_tls_security_options=noanonymous #/bin/bash for i in $@ ; do kinit -A --renewable --forwardable --start-time=$i -r 7d -l 1d -c $HOME/krb5cc_$i kgetcred -c ~/krb5cc_$i smtp/kdc.myrealm.ru kgetcred -c ~/krb5cc_$i imap/kdc.myrealm.ru done user_pref("network.auth.use-sspi", false); user_pref("network.negotiate-auth.using-native-gsslib", false) user_pref("network.negotiate-auth.gsslib", "gssapi32.dll") $ thunderbird.exe -profile roaming.def ----------------------------------------------------------------------------------------------------------------- Работаем с NTLM-авторизацией Apache в домене MS Windows 2003 Владимир Василькин # for i in *gz do /usr/bin/gunzip $i done # for i in *local do pkgadd –d $i all done # crle -l /usr/lib:/usr/local/lib $ tar xf krb5-1.5-signed.tar $ /usr/sfw/bin/gtar xzf krb5-1.5.tar.gz $ cd krb5-1.5/src $ more ../README $ ./configure --prefix=/usr/local/mit-krb5 --enable-shared --without-krb4 $ make # make install $ echo $PATH $ /usr/sfw/bin/gtar xzf samba-3.0.23a.tar.gz $ cd samba-3.0.23a/source $ ./configure --prefix=/usr/local/samba --with-ldap --with-ads --with-krb5=/usr/local/mit-krb5 $ make # make install > ipconfig /all $ grep MAXNS /usr/include/resolv.h | grep define #define MAXNS 3 /* max # name servers we'll track */ nameserver 192.168.0.1 nameserver 192.168.1.1 nameserver 192.168.2.1 domain w2003.domain.inside hosts: files dns > nslookup w2003 $ more /etc/krb5.conf [libdefaults] default_realm = W2003.DOMAIN.INSIDE udp_preference_limit = 1 [realms] W2003.DOMAIN.INSIDE = { kdc = pdc1.w2003.domain.inside admin_server = pdc1.w2003.domain.inside } [domain_realms] .pdc1.w2003.domain.inside = W2003.DOMAIN.INSIDE udp_preference_limit =1 $ /usr/local/mit-krb5/bin/kinit -p domainuser $ /usr/local/mit-krb5/bin/klist [global] workgroup = W2003 # имя домена server string = samba for ntlm netbios name = pebs903x # это имя машине дали администраторы домена netbios aliases = argo # hostname, нам так проще обращаться к машине interfaces = eri0 bind interfaces only = yes # параметры необязательные, просто в момент # настройки на сервере уже работала стандартная # Samba Version 2.2.12, поэтому выбор интерфейса # был критичен domain master = No wins server = 192.168.0.2 # смотрим вывод команды "ipconfiog /all" # в MS Windows на машине из домена name resolve order = wins host realm = W2003.DOMAIN.INSIDE security = ads password server = pdc1.w2003.domain.inside encrypt passwords = yes log level = 0 # возможно, в процессе настройки придется увеличить idmap uid = 10000-20000 idmap gid = 10000-20000 winbind separator = + $ /usr/local/samba/bin/testparm # /usr/local/samba/bin/net ads join -U domainlogin # /usr/local/samba/bin/net ads group -U domainlogin $ net ads search sAMAccountName=Administrator -U adusername #!/sbin/sh case "$1" in start) [ -f /usr/local/samba/lib/smb.conf ] || exit 0 /usr/local/samba/sbin/smbd -D /usr/local/samba/sbin/nmbd -D sleep 30 /usr/local/samba/sbin/winbindd ;; stop) for i in `/usr/bin/ls ? /usr/local/samba/var/locks/*pid 2>/dev/null` do echo killed pid from file:$i /usr/bin/kill `/usr/bin/cat $i` /usr/bin/rm $i done ;; *) echo "Usage: $0 { start | stop }" exit 1 ;; esac exit 0 $ cc -DSOLARIS2=290 -DMOD_PERL -DEAPI -DUSE_EXPAT -I../lib/expat-lite \ -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 \ -DUSE_SO_LINGER -DHARD_SERVER_LIMIT=2048 \ -I/usr/apache/include -Wall -o mod_ntlm_winbind.o -c mod_ntlm_winbind.c $ ld -G -o mod_auth_ntlm_winbind.so mod_ntlm_winbind.o # cp mod_auth_ntlm_winbind.so /usr/apache/libexec/ LoadModule ntlm_winbind_module libexec/mod_auth_ntlm_winbind.so AddModule mod_ntlm_winbind.c $ /usr/apache/bin/httpd –t # /etc/init.d/apache restart # mkdir /var/apache/htdocs/test-ntlm AuthName "NTLM Authentication AD" NTLMAuth on NTLMAuthHelper "/usr/local/samba/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp" NTLMBasicAuthoritative on AuthType NTLM require valid-user ----------------------------------------------------------------------------------------------------------------- Защищаем PHP-приложения с помощью Suhosin Сергей Яремчук $ tar -xvjf php-5.1.6.tar.bz2 $ gunzip suhosin-patch-5.1.6-0.9.5.patch.gz $ cd php-5.1.6 $ patch -p 1 -i ../suhosin-patch-5.1.6-0.9.5.patch $ make $ make test $ sudo make install $ sudo apt-get build-dep php5 $ sudo apt-get install bison flex libxml2 libxml2-dev $ cd suhosin-0.9.5 $ phpize $ ./configure $ make $ sudo make install extension=suhosin.so ----------------------------------------------------------------------------------------------------------------- Чего ждать от Perl 6 Андрей Шитов perl Makefile.PL make make install > pugs programme.p6 > pugs –e'print "This is Perl 6"' # !/usr/local/bin/pugs > chmod 0755 programme.p6 > ./programme.p6 # say.p6 say "This is Perl 6"; say 123; say(8 * 9); # say-method.p6 "This is Perl 6".say; 123.say; (8 * 9).say(); 'error'.say (); $ p6 say-method.p6 # unicode.p6 say "Превед!"; say "?-sitosterol"; say "鍵 盤 迷 你 大 革 命!" # variables.p6 my $string = 'abcde'; my @array = ('alpha', 'beta', 'gamma'); my %hash = {'alpha' => 'A', 'beta' => 'B', 'gamma' => 'C'}; say $string; # abcde say @array[1]; # beta say %hash{'gamma'}; # C # binding.p6 my $a = 123; my $b := $a; $b = 456; say $a; # 456 # concatenation.p6 my $before = 'This is'; my $after = 'Perl 6.'; say $before ~ ' ' ~ $after; # double-slash.p6 my $a = "a"; my $b = "b"; my $c; say $b // $a; # b say $c // $a; # a # interval.p6 my $x = 5; say "yes" if 0 < $x < 10; if 0 < $x < 10 {say "yes"} # contexts.p6 my @array = (5..10); # Строковый контекст say ~@array; # 5 6 7 8 9 10 # Числовой контекст (возвращается размер массива) say int @array; # 6 say +@array; # 6 # Два модификатора контекста say ~ hash @array; # напечатает содержимое в два столбца my $value = 100; # Булевый контекст say ?$value; # 1 (то есть истина) # sub-args.p6 callme(10, 20); callme(second => 7, first => 8); sub callme ($first, $second) { say "\$first = $first, \$second = $second"; } # sub-rw.p6 my $string = "before"; callme($string); say $string; # after sub callme ($value is rw) { $value = "after"; } # sub-slurp.p6 my @odd = (1, 3, 5); my @even = (2, 4, 6); view(@odd, @even); sub view (@a, @b) { say @a; say "&"; say @b; } # sub-optional.p6 callme(1, 2); # 1, 2 callme(3); # 3, 4 sub callme ($a, $b? = 4) { say "$a, $b"; } # sub-anonymous.p6 my $anonymous = -> ($value) { say $value * 2; } $anonymous(10); # 20 # sub-reload.p6 multi sub action ($scalar) { say "scalar"; } multi sub action ($scalar, $scalar) { say "two scalars"; } multi sub action (@array) { say "array"; } action(10); # scalar action(10, 11); # two scalars my @arr = (1, 2); action(@arr); # array # xfix.p6 multi infix:<+> ($a, $b) { return $a - $b; } say 10 + 20; # -10 sub postfix:<@> ($power) { 2 ** $power; } say 8@; # 256 # gather.p6 say gather { for 1..5 -> $c { take $c; } } # given.p6 my $x = 'y'; given ($x) { when "a" {say 'First letter'} when "b" {say 'Second letter'} default {say "Is '$x'"} } given ($x) { when /<[a-z]>/ {say 'isalpha'} } # class.p6 class Alphabet { } my $abc = new Alphabet; class Alphabet { has $.Name; has $Length; } my $abc = new Alphabet; $abc.Name = 'Latin'; # синтаксически верно #$abc.Length = 26; # ошибка my $abc = Alphabet.new(Name => 'Latin', length => 26); say $abc.Name; class Alphabet { has $Name; has $Length; method Info { return "Aplhabet '$.Name' contains ? $.Length letters."; } } class Characters is Alphabet { } my $chars = new Characters; say $chars.Info(); class Unique; class Characters is Alphabet is Unique { } role HaveName { has $.Name; method GetName { return $.Name; } } class NamedAplhabet does HaveName { } my $abc = NamedAplhabet.new(Name => 'English'); say $abc.GetName(); -----------------------------------------------------------------------------------------------------------------