Кластеризация + виртуализация: 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();
-----------------------------------------------------------------------------------------------------------------