Box Backup – горячие резервные копии Алексей Коршунов #emerge -av boxbackup #cd /usr/portage/app-backup/boxbackup #emerge -av boxbackup-0.10.ebuild #raidfile-config /etc/boxbackup 2048 /raid/0.0 /raid/0.1 /raid/0.2 #raidfile-config /etc/boxbackup 2048 /raid/0.0 #useradd _bbstored #bbstored-config /etc/boxbackup hostname _bbstored #chown -R _bbstored /etc/boxbackup/bbstored #chmod -R go-rwx /etc/boxbackup/bbstored #emerge -av boxbackup-0.10.ebuild #cd /usr/portage/app-backup/boxbackup #USE='client-only' emerge boxbackup-0.10.ebuild #bbackupd-config /etc/boxbackup lazy account_name hostname /var/bbackupd /home BackupLocations { home-directory { Path = /home ExcludeDir = /home/ftp ExcludeFilesRegex = *.(avi|AVI)$ } etc { Path = /etc } } AutomaticBackup = no UpdateStoreInterval = 0 MinimumFileAge = 0 MaxUploadWait = 0 #bbstored-certs ca init #bbstored-certs ca sign-server hostname-csr.pem #bbstored-certs /ca sign /etc/boxbackup/bbackupd/account_name-csr.pem #bbstoreaccounts create account_name 0 10000M 15000M #bbstoreaccounts info account_name #bbstoreaccounts setlimit account_name 30000M 35000M #bbstoreaccounts check account_name #bbstoreaccount check account_name fix #bbstoreaccounts delete account_name bbackupd -i ----------------------------------------------------------------------------------------------------------------- Как работает Sendmail? Полезные подробности Сергей Супрунов serg$ ls -l /usr/sbin | grep mailwrapper serg$ ls -l /usr/bin | grep mailwrapper serg$ ps awxo pid,user,command | grep sendmail | grep -v grep serg$ sockstat | grep 596 root# sendmail -bv postmaster serg$ echo '' | /usr/sbin/sendmail -bt -d0 | grep Version account.myserver.ru uucp-dom : account mailq /usr/libexec/sendmail/sendmail root# cd /etc/mail root# make root# make aliases root# make restart-mspq root# make stop-mta mta_start_script="/etc/rc.sendmail" divert(-1)dnl . . . . . divert(0)dnl OSTYPE(freebsd6)dnl DOMAIN(generic)dnl dnl DAEMON_OPTIONS('Name=IPv4, Family=inet')dnl DAEMON_OPTIONS('Port=smtp,Addr=1.2.3.4,Name=MTA')dnl DAEMON_OPTIONS('Port=smtp,Addr=127.0.0.1,Name=MTA')dnl DAEMON_OPTIONS('Port=smtp,Addr=10.0.0.254,Name=MTA')dnl FEATURE(use_cw_file)dnl define('confCW_FILE', '-o /etc/mail/local-host-names')dnl dnl FEATURE('accept_unqualified_senders')dnl dnl FEATURE('accept_unresolvable_domains')dnl FEATURE(mailertable, 'hash -o /etc/mail/mailertable')dnl FEATURE(access_db, 'hash -o -T /etc/mail/access')dnl FEATURE(virtusertable, 'hash -o /etc/mail/virtusertable')dnl FEATURE(blacklist_recipients)dnl dnl FEATURE('dnsbl', 'sbl.spamhaus.org')dnl FEATURE('dnsbl', 'relays.ordb.org')dnl FEATURE('dnsbl', 'dul.ru')dnl FEATURE('dnsbl', 'bl.spamcop.net')dnl define('confMAX_MESSAGE_SIZE', '12500000')dnl define('confMAX_DAEMON_CHILDREN','45')dnl define('confPRIVACY_FLAGS', 'noexpn,novrfy')dnl MAILER(local)dnl MAILER(smtp)dnl dnl MAILER(uucp) root# cd /etc/mail root# make root# make install root# make restart ----------------------------------------------------------------------------------------------------------------- Возможности технологии MS Windows SharePoint Services Иван Хрипунов, Артем Черневский =СЦЕПИТЬ("http://server01/phones/photos/";ЛЕВСИМВ([Адрес электронной почты];НАЙТИ("@";[Адрес электронной почты])-1);".jpg") ----------------------------------------------------------------------------------------------------------------- Узнай секреты WMI: события и провайдеры Часть II: ключ к управлению системой и приложениями Константин Леонтьев Листинг 1. Работа с датой и временем в WMI-сценариях. Работает на всех версиях ОС strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objOS = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") For Each strOS in objOS dtmInstallDate = strOS.InstallDate Wscript.Echo WMIDateStringToDate(dtmInstallDate) Next Function WMIDateStringToDate(dtmInstallDate) WMIDateStringToDate = CDate(Mid(dtmInstallDate, 5, 2) & "/" & Mid(dtmInstallDate, 7, 2) & "/" & Left(dtmInstallDate, 4) & " " & Mid (dtmInstallDate, 9, 2) & ":" & Mid(dtmInstallDate, 11, 2) & ":" & Mid(dtmInstallDate, 13, 2)) End Function Листинг 2. Использование объекта SWbemDateTime. Работает только на Windows XP и новее. Set dtmInstallDate = CreateObject("WbemScripting.SWbemDateTime") strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objOS = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") For Each strOS in objOS dtmInstallDate.Value = strOS.InstallDate Wscript.Echo dtmInstallDate.GetVarDate Next Листинг 3. Старый способ, разбирающий вывод на STDOUT команды ping strComputer = "www.ya.ru" Set objShell = CreateObject("WScript.Shell") Set objScriptExec = objShell.Exec("ping -n 1 -w 700 –f –l 8 " & strComputer) strPingResults = LCase(objScriptExec.StdOut.ReadAll) If InStr(strPingResults, "reply from") Then If InStr(strPingResults, "destination net unreachable") Then WScript.Echo strComputer & " не отвечает на ping." Else WScript.Echo strComputer & " отвечает на ping." End If Else WScript.Echo strComputer & " не отвечает на ping." End If Листинг 4. Определение максимального размера фрейма (MTU) трассы strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") strDestAddress = "www.ya.ru" If WScript.Arguments.Count > 0 Then strDestAddress = WScript.Arguments(0) End If WScript.Echo "Посылаем ICMP-пакеты хосту: " & strDestAddress & " различного размера..." varMaxPacket = 0 For varBuffSize = 8 to 1472 step 8 Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PingStatus where Address='" & strDestAddress & "' and BufferSize=" & varBuffSize & " and NoFragmentation=true and TimeOut=700" ,,48) For Each objItem in colItems Select Case objItem.StatusCode Case 0 WScript.Echo "Ответ на ping-запрос за " & objItem.ResponseTime & " миллисекунд, TTL = " & objItem.ResponseTimeToLive & ", размер пакета ответа " & objItem.ReplySize Case 11001 WScript.Echo "Слишком маленький буфер" & ". Buffer Size is: " & varBuffSize Case 11002 WScript.Echo "Конечная сеть не доступна" & ". Buffer Size is: " & varBuffSize Case 11003 WScript.Echo "Конечный хост не доступен" & ". Buffer Size is: " & varBuffSize Case 11004 WScript.Echo "Протокол не доступен" & ". Buffer Size is: " & varBuffSize Case 11005 WScript.Echo "Конечный порт не доступен" & ". Buffer Size is: " & varBuffSize Case 11006 WScript.Echo "Недостаточно ресурсов" & ". Buffer Size is: " & varBuffSize Case 11007 WScript.Echo "Неверная опция IP" & ". Buffer Size is: " & varBuffSize Case 11008 WScript.Echo "Аппаратная ошибка" & ". Buffer Size is: " & varBuffSize Case 11009 If varMaxPacket = 0 Then varMaxPacket = varBuffSize - 8 WScript.Echo "Пакет превышает предельный размер трассы" & ". Buffer Size is: " & varBuffSize Case 11010 WScript.Echo "Превышен интервал ожидания" & ". Buffer Size is: " & varBuffSize varBuffSize = varBuffSize - 8 Case 11011 WScript.Echo "Неверный запрос" & ". Buffer Size is: " & varBuffSize Case 11012 WScript.Echo "Неверный маршрут" & ". Buffer Size is: " & varBuffSize Case 11013 WScript.Echo "Достигнут максимальный TimeToLive" & ". Buffer Size is: " & varBuffSize Case 11014 WScript.Echo "Достигнут максимальный TimeToLive при сборке" & ". Buffer Size is: " & varBuffSize Case 11015 WScript.Echo "Ошибка параметра" & ". Buffer Size is: " & varBuffSize Case 11016 WScript.Echo "Требование снизить скорость передачи" & ". Buffer Size is: " & varBuffSize Case 11017 WScript.Echo "Переполнение опции IP" & ". Buffer Size is: " & varBuffSize Case 11018 WScript.Echo "Неверное назначение" & ". Buffer Size is: " & varBuffSize Case 11032 WScript.Echo "Установление соединения по IPSEC" & ". Buffer Size is: " & varBuffSize Case 11050 WScript.Echo "Общий сбой" & ". Buffer Size is: " & varBuffSize End Select Next Next WScript.Echo "Удалось определить MTU трассы: " & CStr(varMaxPacket + 28) Листинг 5. Отслеживание событий в системных журналах аудита strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate,(security)}!\\" & strComputer & "\root\CIMV2") Set objEvents = objWMIService.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent'") Wscript.Echo "Ожидаем записи в системные журналы событий ..." Do While(True) Set objReceivedEvent = objEvents.NextEvent Select Case CInt(objReceivedEvent.TargetInstance.EventType) Case 1 strType = "Ошибка" case 2 strType = "Предупреждение" case 3 strType = "Информация" case 4 strType = "Успешный аудит" case 5 strType = "Аудит отказа" End Select WScript.Echo "----- Новое Событие -----" Wscript.Echo "Event ID: " & objReceivedEvent.TargetInstance.EventCode & " Значимость: " & strType & " Log: " & objReceivedEvent.TargetInstance.LogFile WScript.Echo "Сообщение: " & objReceivedEvent.TargetInstance.Message Loop Листинг 6. Очистка системного журнала приложений (Application Event Log) strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate,(security)}!\\" & strComputer & "\root\CIMV2") Set objNTEventLog = objWMIService.Get("Win32_NTEventlogFile.Name='C:\WINDOWS\system32\config\AppEvent.Evt'") objNTEventLog.ClearEventlog("c:\app.evt") Листинг 7. Работа с реестром через WMI Sub REG_OnObjectReady(objObject, objAsyncContext) Wscript.Echo "Изменение в реестре: " & objObject.GetObjectText_() End Sub '-------------------------------------------------------- strComputer = "." Const HKEY_LOCAL_MACHINE = &H80000002 strKeyName = "SOFTWARE\aRegKey" strValName = "MyValue" Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\DEFAULT") Set objReg = objWMIService.Get("StdRegProv") objReg.CreateKey HKEY_LOCAL_MACHINE, strKeyName objReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyName, strValName, "test0" Set MySink = WScript.CreateObject( _ "WbemScripting.SWbemSink","REG_") objWMIservice.ExecNotificationQueryAsync MySink, "SELECT * FROM RegistryValueChangeEvent WHERE " & "Hive = 'HKEY_LOCAL_MACHINE'" &_" AND KeyPath = ‘" & Join(Split(strKeyName, "\"), "\\") & "'" & " AND ValueName = '" & strValName &"'" WScript.Echo "Ожидаем события..." i = 0 While (i < 20) Wscript.Sleep(1000) i = i + 1 objReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyName, strValName, «test» & i Wend MySink.Cancel objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyName Листинг 8. Изменение свойств пользователя в Active Directory через WMI strComputer = "." strUserID = "MyNew_WMI_User" Set objWMIService = GetObject("Winmgmts:\\" & strComputer & "\root\directory\ldap") Set objValSet = CreateObject("wbemscripting.swbemnamedvalueset") objValSet.add "__PUT_EXT_PROPERTIES", array("ds_displayname") objValSet.add "__PUT_EXTENSIONS", true objValSet.add "__PUT_EXT_CLIENT_REQUEST", true Set objEnum = objWMIService.ExecQuery("select * from ds_user where ds_cn = '" & strUserID & "'", "WQL", 32) For each objUser in objEnum objUser.ds_DisplayName = "Обновленноое поле DisplayName" objUser.put_ 1, objValSet Next WScript.Echo "Свойства прользователя Active Directory обновлены" Листинг 9. Использование неформатированных счетчиков(более быстрый доступ к данным) strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfRawData_PerfOS_Processor",,48) For Each objItem in colItems Wscript.Echo "-----------------------------------" Wscript.Echo "Win32_PerfRawData_PerfOS_Processor instance" Wscript.Echo "-----------------------------------" Wscript.Echo "C1TransitionsPersec: " & objItem.C1TransitionsPersec Wscript.Echo "C2TransitionsPersec: " & objItem.C2TransitionsPersec Wscript.Echo "C3TransitionsPersec: " & objItem.C3TransitionsPersec Wscript.Echo "DPCRate: " & objItem.DPCRate Wscript.Echo "DPCsQueuedPersec: " & objItem.DPCsQueuedPersec Wscript.Echo "Frequency_Object: " & objItem.Frequency_Object Wscript.Echo "Frequency_PerfTime: " & objItem.Frequency_PerfTime Wscript.Echo "Frequency_Sys100NS: " & objItem.Frequency_Sys100NS Wscript.Echo "InterruptsPersec: " & objItem.InterruptsPersec Wscript.Echo "Name: " & objItem.Name Wscript.Echo "PercentC1Time: " & objItem.PercentC1Time Wscript.Echo "PercentC2Time: " & objItem.PercentC2Time Wscript.Echo "PercentC3Time: " & objItem.PercentC3Time Wscript.Echo "PercentDPCTime: " & objItem.PercentDPCTime Wscript.Echo "PercentIdleTime: " & objItem.PercentIdleTime Wscript.Echo "PercentInterruptTime: " & objItem.PercentInterruptTime Wscript.Echo "PercentPrivilegedTime: " & objItem.PercentPrivilegedTime Wscript.Echo "PercentProcessorTime: " & objItem.PercentProcessorTime Wscript.Echo "PercentUserTime: " & objItem.PercentUserTime Wscript.Echo "Timestamp_Object: " & objItem.Timestamp_Object Wscript.Echo "Timestamp_PerfTime: " & objItem.Timestamp_PerfTime Wscript.Echo "Timestamp_Sys100NS: " & objItem.Timestamp_Sys100NS Next Листинг 10. Использование форматированных и нормированных счетчиков (все значения соответствуют System Monitor) strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor",,48) For Each objItem in colItems Wscript.Echo "-----------------------------------" Wscript.Echo "Win32_PerfFormattedData_PerfOS_Processor instance" Wscript.Echo "-----------------------------------" Wscript.Echo "C1TransitionsPersec: " & objItem.C1TransitionsPersec Wscript.Echo "C2TransitionsPersec: " & objItem.C2TransitionsPersec Wscript.Echo "C3TransitionsPersec: " & objItem.C3TransitionsPersec Wscript.Echo "DPCRate: " & objItem.DPCRate Wscript.Echo "DPCsQueuedPersec: " & objItem.DPCsQueuedPersec Wscript.Echo "Frequency_Object: " & objItem.Frequency_Object Wscript.Echo "Frequency_PerfTime: " & objItem.Frequency_PerfTime Wscript.Echo "Frequency_Sys100NS: " & objItem.Frequency_Sys100NS Wscript.Echo "InterruptsPersec: " & objItem.InterruptsPersec Wscript.Echo "Name: " & objItem.Name Wscript.Echo "PercentC1Time: " & objItem.PercentC1Time Wscript.Echo "PercentC2Time: " & objItem.PercentC2Time Wscript.Echo "PercentC3Time: " & objItem.PercentC3Time Wscript.Echo "PercentDPCTime: " & objItem.PercentDPCTime Wscript.Echo "PercentIdleTime: " & objItem.PercentIdleTime Wscript.Echo "PercentInterruptTime: " & objItem.PercentInterruptTime Wscript.Echo "PercentPrivilegedTime: " & objItem.PercentPrivilegedTime Wscript.Echo "PercentProcessorTime: " & objItem.PercentProcessorTime Wscript.Echo "PercentUserTime: " & objItem.PercentUserTime Wscript.Echo "Timestamp_Object: " & objItem.Timestamp_Object Wscript.Echo "Timestamp_PerfTime: " & objItem.Timestamp_PerfTime Wscript.Echo "Timestamp_Sys100NS: " & objItem.Timestamp_Sys100NS Next SELECT * FROM SNMP_DEVICE_ADDRESS WHERE SNMP_PROPERTY_NAME > 100 mofcomp –AUTORECOVER ----------------------------------------------------------------------------------------------------------------- Отказоустойчивый кластер с минимальным бюджетом Сергей Довганюк altora1#> groupadd –g 789 oracle altora1#> useradd –g oracle –u 1234 oracle altora2#> groupadd –g 789 oracle altora2#> useradd –g oracle –u 1234 oracle #>chown –R oracle:oracle /Disk1/…/jre/linux … connect internal shutdown … #> cp /boot/config-2.4.26-std-smp-alt6 /usr/src/linux/.config #> cd /usr/src/drbd-0.7.17 #> make clean all #> make install #> chkconfig --add drbd #> drbdadm up all #> drbdadm -- --do-what-I-say primary all #> cat /proc/drbd #> mkreiserfs /dev/drbd0 #> mv /D01/Ora /root/Oracle #> mount -t reiserfs /dev/drbd0 /D01 #> cd /usr/src/heartbeat-2.0.4 #> ./ConfigureMe configure #> ./ConfigureMe make #> ./ConfigureMe install #> chkconfig --add heartbeat ----------------------------------------------------------------------------------------------------------------- bugtraq, стр. 41 ----------------------------------------------------------------------------------------------------------------- Arch Linux: руководство к быстрому старту Валентин Синицын [current] # Список «настоящих» интернет-серверов Include=/etc/pacman.d/current Server= Ошибка! Недопустимый объект гиперссылки. Server=file://<путь к локальному репозитарию> makepkg -g >>PKGBUILD makepkg makepkg -i ----------------------------------------------------------------------------------------------------------------- Настраиваем эффективную систему сетевой защиты Zorp Сергей Яремчук deb http://apt.balabit.hu/zorp-gpl-os/zorp-os-3.0/3.0 security zorp-os common-gpl zorp-gpl deb http://apt.balabit.hu/zorp-gpl-os/zorp-os-3.0/3.0 zorp-os common-gpl zorp-gpl # apt-get -u upgrade # tar xzvf cttproxy-2.6.15-2.0.4.tar.gz # tar xjvf linux-2.6.15.tar.bz2 # cd linux-2.6.15 # for i in ../cttproxy-2.6.15-2.0.4/patch_tree/0{1,2,3}*.diff; do cat $i | patch -p1; done CONFIG_NETFILTER=m CONFIG_IP_NF_TPROXY=m CONFIG_IP_NF_MATCH_TPROXY=m CONFIG_IP_NF_TARGET_TPROXY=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_NAT=m #ifdef CONFIG_NETFILTER_DEBUG #define DEBUGP printk #if 1 # modprobe iptable_tproxy.o # lsmod | grep -i tproxy # tar xzvf iptables-1.3.3.tar.gz # cd iptables-1.3.X # cat ../cttproxy-2.6.15-2.0.4/iptables/iptables-1.3-cttproxy.diff | patch -p1 # chmod +x extensions/.tproxy-test # make KERNELDIR=/usr/src/linux-2.6.15 auto dummy0 iface dummy0 inet static address 10.2.3.4 netmask 255.255.255.255 BOOTPROTO='static' IPADDR='10.2.3.4' NETMASK='255.255.255.255' STARTMODE='onboot' # ifup dummy0 #!/bin/sh DEVICE='dummy0' DHCP='no' IPADDR='10.2.3.4' NETMASK='255.255.255.255' PROBE='no' . /etc/rc.d/functions-network "$@" # /etc/rc.d/rc.inet4 start CHECK_PERMS="1" CONFIG_DIR=/etc/zorp CONFIG_DIR_OWNER=root CONFIG_DIR_GROUP=zorp CONFIG_DIR_MODE=0750 # zorpctl start # groupadd zorp # chown root:zorp /etc/zorp # chmod 0750 /etc/zorp/ # zorpctl start local -v3 -p /etc/zorp/policy.py --autobind-ip 10.2.3.4 dmz -v3 -p /etc/zorp/policy.py --autobind-ip 10.2.3.4 internet --verbose=5 --policy /etc/zorp/policy.py --autobind-ip 10.2.3.4 zorp_ftp -v4 -p /etc/zorp/policy.py --threads 500 -- --no-auto-restart --fd-limit 1024 --process-limit 512 Zorp.firewall_name = 'zorp.domain.com' from Zorp.Core import * from Zorp.Plug import * from Zorp.Http import * from Zorp.Ftp import * from Zorp.Pssl import * InetZone('local', '192.168.0.0/24' " ## здесь через запятую можно указать несколько адресов outbound_services=["local_http", "local_ssh"]], inbound_services=[]) InetZone('dmz', '10.0.0.0/24', inbound_services=["local_http", "local_ssh", "internet_http"] ) InetZone('internet', '0.0.0.0/0', outbound_services=["internet_http"], inbound_services=["*"]) InetZone("localzone", "127.0.0.0/8", inbound_services=["*"]) def local(): Service("local_http", HttpProxy, router=TransparentRouter()) Service("local_ssh", PlugProxy, router=TransparentRouter()) # вместо PlugProxy можно использовать PsslProxy Listener(SockAddrInet('192.168.0.1', 50080), "local_http") Listener(SockAddrInet('192.168.0.1', 50022), "local_ssh") def dmz(): pass def internet(): Service("internet_http", HttpProxy, router=DirectedRouter(SockAddrInet('10.0.0.2',80), forge_addr=TRUE)) Listener(SockAddrInet('111.222.333.444 ', 50080), "internet_http") from Zorp.Matcher import * class IDHttp(HttpProxyURIFilter): matcher=RegexpFileMatcher('/etc/zorp/http.black', '/etc/zorp/http.white') def config(self): HttpProxyURIFilter.config(self) self.transparent_mode = 1 def regexp(): Service("local_internet_http", IDHttp) Listener(SockAddrInet("192.168.0.1", 50090), " local_internet_http ") NATPolicy("local-internet", cacheable=TRUE, nat=GeneralNAT([(InetDomain(111.222.333.444/24'), InetDomain('192.168.0.0/24'))])) NATPolicy("internet-local", cacheable=TRUE, nat=GeneralNAT([(InetDomain('192.168.0.0/24'), InetDomain('111.222.333.444/24'))])) class DmzHTTP(HttpProxy): def config(self): HttpProxy.config(self) self.response["GET", "404"] = (HTTP_RSP_POLICY, self.filter404) def filter404(self, method, url, version, response): self.error_status = 404 self.error_info = "Requested page was not accessible." return HTTP_RSP_REJECT # iptables -t tproxy -A PREROUTING -j TPROXY --on-port 50080 # iptables -t tproxy -P PREROUTING ACCEPT # iptables -t tproxy -P OUTPUT ACCEPT # iptables -t tproxy -N PRlocal # iptables -t tproxy -N PRdmz # iptables -t tproxy -N PRinternet # iptables -t tproxy -A PREROUTING -i eth0 -j PRinternet # iptables -t tproxy -A PREROUTING -i eth1 -j PRlocal # iptables -t tproxy -A PREROUTING -i eth2 -j PRdmz # iptables -t tproxy -A PRlocal -p tcp --dport 80 -j TPROXY --on-port 50080 # iptables -t tproxy -A PRlocal -p tcp --dport 22 ! -d zorp.domain.com -j TPROXY --on-port 50022 # iptables -t tproxy -A PRintenet -p tcp --dport 80 -j TPROXY --on-port 50080 # iptables -P INPUT DROP # iptables -A INPUT -m tproxy -j ACCEPT # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -i lo -j ACCEPT # iptables -N LOlocal # iptables -A INPUT -i eth1 -j LOlocal # iptables -A LOlocal -p tcp --dport 22 --syn -j ACCEPT # iptables -A LOlocal -p udp --dport 53 -j ACCEPT # iptables -A LOlocal -p tcp --dport 25 --syn -j ACCEPT # iptables -A LOlocal -j LOG --log-prefix "LOblue DROP: " # iptables -A LOlocal -j DROP # iptables -N LOdmz # iptables -A INPUT -i eth2 -j LOdmz # iptables -A LOdmz -p udp --dport 53 -j ACCEPT # iptables -A LOdmz -j DROP # iptables -N LOinternet # iptables -A INPUT -i eth0 -j LOinternet # iptables -A LOinternet -p udp -sport 53 -j ACCEPT # iptables -A LOinternet -p tcp --dport 25 --syn -j ACCEPT # iptables -A LOinternet -j DROP ----------------------------------------------------------------------------------------------------------------- Arch Linux: руководство к быстрому старту Валентин Синицын Листинг 1. Пример бессмысленного (зашифрованного/упакованного) кода 01010072h imul esi, [edx+74h], 416C6175h 01010079h ins byte ptr es:[edi], dx 0101007Ah ins byte ptr es:[edi], dx 0101007Bh outsd 0101007Ch arpl [eax], ax 0101007Eh push esi 0101007Fh imul esi, [edx+74h], 466C6175h 01010086h jb short loc_10100ED 01010088h add gs:[ebx+5319Dh], cl 0101008Fh add [ebx], cl Листинг 2. Хитро оптимизированный цикл чтения строковых ресурсов 01004825h mov ebp, ds:LoadStringW ; ebp - указатель на LoadStringW 01004830h ; указатель на таблицу ресурсов 0100482Bh mov edi, offst off_10080C0 01004830h loc_1004830: ; CODE XREF: sub_10047EE+65?j 01004830h mov eax, [edi] ; грузим очередной указатель на uID в eax 01004832h push ebx ; nBufferMax (максимальная длина буфера) 01004833h push esi ; lpBuffer (указатель на буфер) 01004834h push dword ptr [eax] ; передаем извлеченный uID функции 01004836h push [esp+0Ch+hInstance] ; hInstance 0100483Ah call ebp ; LoadStringW ; считываем очередную строку из ресурса 0100483Ch mov ecx, [edi] ; грузим тот же самый uID в ecx 0100483Eh inc eax ; увеличиваем длину считанной строки на 1 0100483Fh cmp eax, ebx ; строка влезает в буфер? 01004841h mov [ecx], esi ; сохраняем указатель на буфер поверх старого uID (он больше не понадобится) 01004841h 01004841h 01004843h lea esi, [esi+eax*2] ; позиция для следующей строки в буфере 01004846h jg short loc_100488B ; если буфер кончился, то это облом 01004848h add edi, 4 ; переходим к следующему uID 0100484Bh sub ebx, eax ; уменьшаем свободное место в буфере 0100484Dh cmp edi, offst off_1008150 ; конец таблицы ресурсов? 01004853h jl short loc_1004830 ; мотаем цикл пока не конец ресурсов Листинг 3. «Защита» от дампинга живых программ // глобальная инициализированная переменная (на самом деле присваивать нуль необязательно // поскольку все глобальные переменные «сами» обнуляются при запуске программы) void *p = 0; // выделить память, если она еще не выделена if (!p) p = malloc(BUF_SIZE); Листинг 4. Пример стартового кода на DELPHI CODE:00401EE8 start proc near CODE:00401EE8 push ebp CODE:00401EE9 mov ebp, esp CODE:00401EEB add esp, 0FFFFFFF0h CODE:00401EEE mov eax, offset dword_401EB8 CODE:00401EF3 call @Sysinit@@InitExe$qqrpv ; Sysinit::InitExe() CODE:00401EF8 push 0 … CODE:00401D9C @Sysinit@@InitExe$qqrpv proc near ; CODE XREF: start+B?p CODE:00401D9C push ebx CODE:00401D9D mov ebx, eax CODE:00401D9F xor eax, eax CODE:00401DA1 mov ds:TlsIndex, eax CODE:00401DA6 push 0 ; lpModuleName CODE:00401DA8 call GetModuleHandleA CODE:00401DAD mov ds:dword_4036D8, eax CODE:00401DB2 mov eax, ds:dword_4036D8 CODE:00401DB7 mov ds:dword_40207C, eax CODE:00401DBC xor eax, eax CODE:00401DBE mov ds:dword_402080, eax CODE:00401DC3 xor eax, eax CODE:00401DC5 mov ds:dword_402084, eax CODE:00401DCA call @SysInit@_16395 ; SysInit::_16395 CODE:00401DCF mov edx, offset unk_402078 CODE:00401DD4 mov eax, ebx CODE:00401DD6 call sub_4018A4 Листинг 5. Состояние стека на момент вызова файла :d esp :u *esp :u 77EB834F :d fs:0 Листинг 6. Установка нового фильтра структурных исключений в стартовым коде .text:01006420 55 push ebp ; исходная точка входа .text:01006421 8B EC mov ebp, esp .text:01006423 6A FF push 0FFFFFFFFh .text:01006425 68 88 18 00 01 push dword_1001888 .text:0100642A 68 D0 65 00 01 push loc_10065D0 ; «наш» обработчик .text:0100642F 64 A1 00 00 00 00 mov eax, fs:0 ; берем старый фильтр .text:01006435 50 push eax .text:01006436 64 89 25 00 00 00+ mov fs:0, esp ; ставим новый фильтр Листинг 7. Точка входа в распаковщик ASPack :u eip 001B:01010001 60 PUSHAD ; сохранить все регистры в стеке 001B:01010002 E803000000 CALL 0101000A ; определить текущий EIP 001B:01010007 E9EB045D45 JMP 465E04F7 ; спрятанные JMPS/POP EBP/INC EBP 001B:0101000C 55 PUSH EBP ; следующие 2 строчки «эмуляция» команды jmp 01010008h 001B:0101000D C3 RET Листинг 8. Передача управления на OEP 001B:010103AF 61 POPAD ; ? на этой команде отладчик всплывает 001B:010103B0 7508 JNZ 010103BA (JUMP?) 001B:010103B2 B801000000 MOV EAX,00000001 001B:010103B7 C20C00 RET 000C 001B:010103BA 6820640001 PUSH 1006420 ; адрес OEP 001B:010103BF C3 RET ; передача управления на OEP Листинг 9. Так начинается UPX 001B:01011710 60 PUSHAD ; сохранить все регистры в стеке 001B:01011711 BE00D00001 MOV ESI,0100D000 001B:01011716 8DBE0040FFFF LEA EDI,[ESI+FFFF4000] 001B:0101171C 57 PUSH EDI Листинг 10. Так UPX передает управление на OEP 001B:0101185E 61 POPAD 001B:0101185F E9BC4BFFFF JMP 01006420 (JUMP ?) Листинг 11. Точка входа в файл, упакованный PE-compact 001B:01001000 B874190101 MOV EAX,01011974 001B:01001005 50 PUSH EAX 001B:01001006 64FF3500000000 PUSH DWORD PTR FS:[00000000] 001B:0100100D 64892500000000 MOV FS:[00000000],ESP Листинг 12. Первое срабатывание точки останова на esp-4 001B:77F8AF78 FF7304 PUSH DWORD PTR [EBX+04] 001B:77F8AF7B 8D45F0 LEA EAX,[EBP-10] 001B:77F8AF7E 50 PUSH EAX Листинг 13. Кузьмич?! Где это я? 001B:010119A6 55 PUSH EBP ; эта команда вызывает всплытие 001B:010119A7 53 PUSH EBX 001B:010119A8 51 PUSH ECX 001B:010119A9 57 PUSH EDI Листинг 14. Переход на OEP :u eip-1 001B:01011A35 5D POP EBP 001B:01011A36 FFE0 JMP EAX (01006420h) Листинг 15. Многообещающая точка входа в упаковщик FSG 001B:01000154 8725B4850101 XCHG ESP,[010185B4] 001B:0100015A 61 POPAD 001B:0100015B 94 XCHG EAX,ESP 001B:0100015C 55 PUSH EBP 001B:0100015D A4 MOVSB Листинг 16. Фрагмент кода, генерирующий ложные срабатывания точки останова 001B:010001C1 5E POP ESI 001B:010001C2 AD LODSD 001B:010001C3 97 XCHG EAX,EDI 001B:010001C4 AD LODSD 001B:010001C5 50 PUSH EAX 001B:010001C6 FF5310 CALL [EBX+10] Листинг 17. Две секции упакованной программы MAP32 NOTEPAD-fsg 0001 001B:01001000 00010000 CODE RW NOTEPAD-fsg 0002 001B:01011000 00008000 CODE RW Листинг 18. «Магическая» последовательность, приводящаяся нас к OEP BPM ESP-4 IF EIP > 0X1001000 && EIP < 0X1011000 Листинг 19. Отсюда начинается распакованный код исходной программы 001B:01006420 55 PUSH EBP 001B:01006421 8BEC MOV EBP,ESP 001B:01006423 6AFF PUSH FF 001B:01006425 6888180001 PUSH 01001888 001B:0100642A 68D0650001 PUSH 010065D0 001B:0100642F 64A100000000 MOV EAX,FS:[00000000] 001B:01006435 50 PUSH EAX 001B:01006436 64892500000000 MOV FS:[00000000],ESP ----------------------------------------------------------------------------------------------------------------- bugtraq, стр. 69 ----------------------------------------------------------------------------------------------------------------- Используем средства библиотеки OpenSSL для криптографической защиты данных Часть 2 Владимир Мешков #define BN_ULONG unsigned char typedef struct bignum_st { /* Pointer to an array of 'BN_BITS2' bit chunks. */ BN_ULONG *d; int top; /* Index of last used d +1. */ /* The next are internal book keeping for bn_expand. */ int dmax; /* Size of the d array. */ int neg; /* one if the number is negative */ int flags; } BIGNUM; RSA *RSA_generate_key(int num, unsigned long e, void (*callback)(int,int,void *), void *cb_arg); openssl genrsa –out outfile 2048 rsa=RSA_generate_key(num,f4,genrsa_cb,bio_err); static void MS_CALLBACK genrsa_cb(int p, int n, void *arg) { char c='*'; if (p == 0) c='.'; if (p == 1) c='+'; if (p == 2) c='*'; if (p == 3) c='\n'; BIO_write((BIO *)arg,&c,1); (void)BIO_flush((BIO *)arg); #ifdef LINT p=n; #endif } int PEM_write_RSAPublicKey(FILE *fp, RSA *x); int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u); Листинг 1. Генерация ключей алгоритма RSA #include #include #include /* Имена ключевых файлов */ #define PRIVAT "./privat.key" #define PUBLIC "./public.key" void main() { /* указатель на структуру для хранения ключей */ RSA * rsa = NULL; unsigned long bits = 2048; /* длина ключа в битах */ FILE *priv_key_file = NULL, *pub_key_file = NULL; /* контекст алгоритма шифрования */ const EVP_CIPHER *cipher = NULL; priv_key_file = fopen(PRIVAT, "wb"); pub_key_file = fopen(PUBLIC, "wb"); /* Генерируем ключи */ rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL); /* Формируем контекст алгоритма шифрования */ OpenSSL_add_all_ciphers(); cipher = EVP_get_cipherbyname("bf-ofb"); /* Получаем из структуры rsa открытый и секретный ключи и сохраняем в файлах. * Секретный ключ шифруем с помощью парольной фразы «hello» */ PEM_write_RSAPrivateKey(priv_key_file, rsa, cipher, NULL, 0, NULL, "hello"); PEM_write_RSAPublicKey(pub_key_file, rsa); /* Освобождаем память, выделенную под структуру rsa */ RSA_free(rsa); } int RSA_public_encrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding); Листинг 2. Шифрование данных по алгоритму RSA #include #include void main(int argc, char **argv) { /* структура для хранения открытого ключа */ RSA * pubKey = NULL; unsigned char *ptext, *ctext; FILE * pub_key_file = NULL; /* Открываем входной и создаем выходной файлы */ int inf = open(argv[1], O_RDWR); int outf = open("./rsa.file", O_CREAT|O_TRUNC|O_RDWR, 0600); /* Считываем открытый ключ */ pub_key_file = fopen(PUBLIC, "rb"); pubKey = PEM_read_RSAPublicKey(pub_key_file, NULL, NULL, NULL); /* Определяем длину ключа */ int key_size = RSA_size(pubKey); ptext = malloc(key_size); ctext = malloc(key_size); /* Шифруем содержимое входного файла */ while(1) { inlen = read(inf, ptext, key_size - 11); if(inlen <= 0) break; outlen = RSA_public_encrypt(inlen, ptext, ctext, pubKey, RSA_PKCS1_PADDING); if(outlen != RSA_size(pubKey)) exit(-1); write(outf, ctext, outlen); } } int RSA_private_decrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding); Листинг 3. Дешифрование файла, зашифрованного по RSA-алгоритму #include #include void main(int argc, char **argv) { RSA *privKey = NULL; FILE *priv_key_file; unsigned char *ptext, *ctext; /* Открываем входной и создаем выходной файл */ inf = open(argv[1], O_RDWR); outf = open("./test.rsa", O_CREAT|O_TRUNC|O_RDWR, 0600); /* Открываем ключевой файл и считываем секретный ключ */ priv_key_file = fopen(PRIVAT, "rb"); privKey = PEM_read_RSAPrivateKey(priv_key_file, NULL, NULL, NULL); /* Определяем размер ключа */ key_size = RSA_size(privKey); ctext = malloc(key_size); ptext = malloc(key_size); /* Дешифруем файл */ while(1) { inlen = read(inf, ctext, key_size); if(inlen <= 0) break; outlen = RSA_private_decrypt(inlen, ctext, ptext, privKey, RSA_PKCS1_PADDING); if(outlen < 0) exit(0); write(outf, ptext, outlen); } } ----------------------------------------------------------------------------------------------------------------- Возможности поискового движка DataparkSearch Иван Максимов sh$ mysqladmin create search sh#mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO пользователь@localhost IDENTIFIED BY 'пароль' WITH GRANT OPTION; exit
Mime application/vnd.ms-excel text/plain "xls2csv $1" AddType application/vnd.ms-excel *.xls *.XLS Mime application/msword text/plain "catdoc $1" AddType application/vnd.ms-excel *.doc *.DOC AddType text/rtf* *.rtf *.RTF AddType application/rtf *.rtf *.RTF Mime text/rtf* text/html "/usr/local/bin/unrtf --text $1" Mime application/rtf text/html "/usr/local/bin/unrtf --text $1" DBAddr mysql://searcher:qwerty/search/?dbmode=cache indexer.conf DBAddr mysql://searcher:qwerty@localhost/search/?dbmode=cache&cached=localhost:7000 search.htm DBAddr mysql://searcher:qwerty/search/?dbmode=cache cached & 2> cached.out run-splitter -k -----------------------------------------------------------------------------------------------------------------