2009-05-26

Настройка SQUID с авторизацией в домене Windows

От Филиппова А.С., скромного админа, на радость всем остальным скромным админам ;)

Настройка SQUID с авторизацией в домене Windows

Автор: Филиппов Алексей
Дата создания: 20 февраля 2007

Итак, необходимо настроить SQUID таким образом, чтобы он авторизовал пользователей через домен Windows.

Имеется домен mydomain.com.ua, работающий на Windows 2000 Server. В нем есть 2 сервера, alpha.mydomain.com.ua и centavr.mydomain.com.ua с адресами 192.168.1.3 и 192.168.1.2 соответственно.
SQUID будет крутится на операционной системе SLES9. На этом сервере должны быть установлены следующие пакеты:
samba-3.0.20b-3.4
samba-client-3.0.20b-3.4
samba-winbind-3.0.20b-3.4
heimdal-0.6.1rc3-55.18
sarg-2.1-10
squid-2.5.STABLE5-42.44
apache2-2.0.49-27.38

Итак, поехали.
Редактируем файл /etc/resolv.conf. Там должно быть прописано следующее:

nameserver 192.168.1.2
nameserver 192.168.1.3
search mydomain.com.ua

В итоге если мы запустим ping alpha, то обязательно должен быть ответ.
Настраиваем клиента Kerberos. Для этого редактируем файл /etc/krb5.conf. Содержание его должно быть следующим:

[libdefaults]
default_realm = mydomain.com.ua
clockskew = 300
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}

[realms]
mydomain.com.ua = {
kdc = alpha.mydomain.com.ua
admin_server = alpha.mydomain.com.ua
}

[domain_realm]
.mydomain.com.ua = mydomain.com.ua

Проверяем соединение с сервером Kerberos:

root> kinit -p philippoff
philippoff@mydomain.com.ua's Password: <тут вводим пароль пользователя philippoff>
kinit: NOTICE: ticket renewable lifetime is 1 week

Если ответ отличается от приведенного выше и говорит об ошибке – значит что-то не так настроили, или еще чего-нибудь...
Проверим состояние соединения:

root> klist
Credentials cache: FILE:/tmp/krb5cc_0
Principal: philippoff@mydomain.com.ua

Issued Expires Principal
Feb 20 11:37:08 Feb 20 21:37:02 krbtgt/mydomain.com.ua@mydomain.com.ua

Ну по крайней мере примерно так должен выглядеть результат работы команды. Опять же если ошибки видны, ищите провтыки, пляшите с бубном.

Настраиваем Samba. Для этого редактируем файл /etc/samba/smb.conf. Кроме всего, что в нем может находится, обязательно должно присутствовать следующее (или если ничего от самбы кроме авторизации сквида не надо, то достаточно быдет только этого):

[global]
workgroup = CO
server string = legion
netbios name = legion
security = ads
realm = mydomain.com.ua
password server = alpha.mydomain.com.ua
encrypt passwords = yes
winbind separator = +
winbind use default domain = yes
winbind uid = 10000-15000
winbind gid = 10000-15000
winbind enum users = yes
winbind enum groups = yes

После настройки самбы попробуем войти в домен:

root> net ads join -U admin_name%admin_password
Joined 'LEGION' to realm 'mydomain.com.ua'

Если ответ получен с ошибкой, что делать в таких случаях смотреть выше :)
После этого необходимо, чтобы запускался необходимый набор служб. Это smb, nmb, winbind. Самый простой вариант – это завалиться в YaST под root, зайти в «Runlevel Editor» и поставить сервисы nmd, smb, winbind в состояние «Включен», то есть на автостарт. Или можно руками:

root> ln -s /etc/init.d/nmb /etc/init.d/rc3.d/K15nmb
root> ln -s /etc/init.d/nmb /etc/init.d/rc3.d/S07nmb
root> ln -s /etc/init.d/smb /etc/init.d/rc3.d/K10smb
root> ln -s /etc/init.d/smb /etc/init.d/rc3.d/K12smb
root> ln -s /etc/init.d/winbind /etc/init.d/rc3.d/K14winbind
root> ln -s /etc/init.d/winbind /etc/init.d/rc3.d/S08winbind
root> ln -s /etc/init.d/nmb /etc/init.d/rc5.d/K15nmb
root> ln -s /etc/init.d/nmb /etc/init.d/rc5.d/S07nmb
root> ln -s /etc/init.d/smb /etc/init.d/rc5.d/K10smb
root> ln -s /etc/init.d/smb /etc/init.d/rc5.d/K12smb
root> ln -s /etc/init.d/winbind /etc/init.d/rc5.d/K14winbind
root> ln -s /etc/init.d/winbind /etc/init.d/rc5.d/S08winbind

Если вы включали сервисы через YaST, то они в процессе применения изменений запустятся, если нет, то есть делали руками, то и запускать из придется руками:

root> /etc/init.d/nmb start
root> /etc/init.d/smb start
root> /etc/init.d/winbind start

Проверяем работоспособность winbind:

root> wbinfo -t
checking the trust secret via RPC calls succeeded

Если появился такой ответ, значит учетная запись компьютера успешно зарегистрирована в домене Windows. Проверяем дальше:

root> wbinfo -u

Должен появится список пользователей и компьютеров домена. У меня он весьма немаленький, так что даже для примера приводить не буду, краска в принтере кончится :). Но что самое замечательное, в этом списке есть запись «legion$», что подтверждает то, что учетка нашего компьютера в домене зарегистрирована правильно. Если этой записи нет – смотрим внимательнее, она должна быть :), только у вас может называться по другому. Кстати сказать, у меня первый раз эта проверка не отработала, а свкид при этом уже всех во всю авторизовал. А потом вдруг заработала сама по себе.
Дальше проверяем:

root> wbinfo -g

В результате должны получить список групп домена.
Проверяем аутентификацию в домене:

root> wbinfo -a user_name%user_password
plaintext password authentication succeeded
challenge/response password authentication succeeded

Полученный ответ говорит о том, что все идет по плану :) Аутентификация прошла успешно.
Теперь настраиваем файл конфигурации Name Service Switch. Для этого в конец файла /etc/nsswitch.conf добавляем две строки (смотри внимательно, может они там уже есть):

passwd: files winbind
group: files winbind

Если вдруг окажется, что в данном файле уже присутствуют строки, которые начинаются на passwd или group и они отличны от тех, что мы добавляем, то просто комментируем их, если одинаковы, то можно наши строки не добавлять.
После этого:

root> /etc/init.d/nscd restart

После этого проверяем распознавание доменных пользователей линуксом (я проверяю на своей учетке):

root> id Philippoff
uid=10000(philippoff) gid=10001(Пользователи домена) группы=10001(Пользователи домена),10012(Programmers),10063(LowInternetAccess),10065(High Internet Access),10070(SitAccess),10074(RemoteAdmins),10109(Admin Internet Access)

Как видите, такой ответ подразумевает, что наш дорогой линукс знает о пользователе Philippoff если не все, то очень многое. И это хорошо, это то, что нам и нужно :) Опять же эта замечательная проверка с первого раза у меня не отработала. Только после перезапуска служб, а то и перезагрузке сервера. А может и после чего-то еще, только чего – не помню.

Ну вот, пришло время заняться собственно головоногими. SQUID у нас уже установлен. Настраиваем его. Нас интересует файл /etc/squid/squid.conf. Файл этот может быть весьма пухлым, сложным и неприятным на вид. По крайней мере у меня так и есть. В файле должны присутствовать следующие секции:

# Секция для аутентификации пользователей по NTLM
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 10
auth_param ntlm max_challenge_reuses 0

# Секция для базовой аутентификации пользователей
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

acl adusers proxy_auth REQUIRED LowInternetAccess
http_access allow adusers

ВНИМАНИЕ!!! В acl нельзя использовать доменные группы, только логины. По другому, хоть убейся, работать не будет! Хотя, может у вас получиться :)
Тут показан самый простой вариант. acl-ов с виндозными логинами можете наклепать хоть миллион – ваше право, squid выдержит (хотя с миллионом я не пробовал...).
На данный момент конфиг SQUID на legion выглядит так:

##############
### GLOBAL ###
##############

cache_peer 192.168.11.70 parent 3128 3130 no-query no-digest
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_dir ufs /var/cache/squid 5000 16 256
forwarded_for 10.77.11.70
cache_mgr legion@proxy.mydomain.com.ua
quick_abort_min 0 KB
quick_abort_max 0 KB
http_port 8080

######################
##### AUTH_PARAM #####
######################

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 10
auth_param ntlm max_challenge_reuses 0

auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

#################
###### ACL ######
#################

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_objects
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563 5190
acl Safe_ports port 21 70 80 210 280 443 488 563 591 777 901 1025-65535 90
acl purge method PURGE
acl CONNECT method CONNECT

acl bad_url url_regex "/etc/squid/bad_url"
acl microsoft url_regex "/etc/squid/microsoft"
acl bad_files urlpath_regex .wav$ .avi$ .wmv$ .mpg$ .mp3$ .mov$ .wmf$ .3gp$ .mpeg$ .mpeg4$

acl adFull proxy_auth Philippoff
acl adHighSpeed proxy_auth setter Dyadyov Chebukin Salygin Belyaev
acl adMediumSpeed proxy_auth Solovyov Shevchuk Levin Linik Badenko
acl adLowSpeed proxy_auth Goncharov Taran Dispetcher Boyko Borisuk
acl adICQRes proxy_auth nkrash1 nkrash2 nkrash3 crrash1 crrash2 crrash3 gsrash1 gsrash2 gsrash3 kvrash1

#########################
###### HTTP_ACCESS ######
#########################

never_direct allow all

http_access allow manager localhost
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost

http_access allow adFull !microsoft
http_access allow adHighSpeed !bad_url !bad_files !microsoft
http_access allow adMediumSpeed !bad_url !bad_files !microsoft
http_access allow adLowSpeed !bad_url !bad_files !microsoft
http_access allow adICQRes !bad_url !bad_files !microsoft

http_access deny all

#########################
###### DELAY_POOLS ######
#########################

delay_pools 3

delay_class 1 1
delay_parameters 1 8000/8000
delay_access 1 allow adLowSpeed
delay_access 1 deny all

delay_class 2 1
delay_parameters 2 15000/15000
delay_access 2 allow adMediumSpeed
delay_access 2 deny all

delay_class 3 1
delay_parameters 3 500/500
delay_access 3 allow adICQRes
delay_access 3 deny all


Файлы bad_url и microsoft занимаются тем, что рубят доступ к порнухе (и другим ненужным, но интересным для работников любой конторы темам) и к серверам Майкрософта. Вот листинг (bad_url приведен не полностью, т.к. ну очень большой).

/etc/squid/bad_url:

mp3
c-e-k-c
cekc
dildo
porevo
porno
porn
sex
xxx
lesbi
adult
erotic
glamur
prastitutki
prostitutki
prastitutky
prostitutky

Ну в общем бешеное буйство фантазии :)

/etc/squid/bad_url:

microsoft

Теперь ставим squid на автозагрузку так, как делали со службами самбы. То есть либо через YaST, либо руками:


root> ln -s /etc/init.d/squid /etc/init.d/rc3.d/K07squid
root> ln -s /etc/init.d/squid /etc/init.d/rc3.d/S15squid
root> ln -s /etc/init.d/squid /etc/init.d/rc5.d/K07squid
root> ln -s /etc/init.d/squid /etc/init.d/rc5.d/S15squid

Ну и если вы делали линки для автостарта руками, то и запускаем руками:

root> /etc/init.d/squid start

Ну и маленькая мелочь – меняем права доступа на один системный каталог:

root> chmod 750 /var/lib/samba/winbindd_privileged

Ну вот и все – закончен сей великий труд, все настроено правильно и по правилам. Казалось бы, можно радоваться! Но...
Аутентификация по NTLM НЕРАБОТАЕТ!!! Базовая, понимаешь, работает, а NTLM нет. И нахрена, спрашивается мы всем этим занимались??? Что поделать, без костылей никуда. Путем мучительных проб и ошибок (хорошо, что не моих, кто-то до меня успел головой о стенку побиться) было выяснено, если провести определенный ряд последовательных действий, то заставить работать осьминога можно. Итак. Создаем файлик /etc/init.d/squid_winbind и заполняем его следующим содержимым:

#!/bin/bash
echo " ###############################################"
echo " ### START Shamanstvo wokrug SAMBA & WINBIND ###"
echo " ###############################################"
echo "chmod 750 /var/lib/samba/winbindd_privileged -R"
chmod 750 /var/lib/samba/winbindd_privileged -R
/etc/init.d/winbind stop
/etc/init.d/squid stop
/etc/init.d/winbind start
echo "chmod 777 /var/lib/samba/winbindd_privileged -R"
chmod 777 /var/lib/samba/winbindd_privileged -R
/etc/init.d/squid start
echo " ################################################"
echo " ### FINISH Shamanstvo wokrug SAMBA & WINBIND ###"
echo " ################################################"

Вот этот файлик будет правильно все запускать. Теперь ставим его на автозагрузку:

root> ln -s /etc/init.d/squid_winbind /etc/init.d/rc3.d/S99squid_winbind
root> ln -s /etc/init.d/squid_winbind /etc/init.d/rc5.d/S99squid_winbind

Внимательные люди уже заметили, что я ставлю линки только на запуск. И это правильно. А почему – догадайтесь сами :). Хотя вообще ситуация несколько неправильная (причем вдвойне), ну да ладно. Ну и собственно проверяем:

root> /etc/init.d/squid_winbind

Проверяйте, теперь все должно работать.
Ну и напоследок настроим хоть какой-нибудь мониторинг нашего головоногого. Устанавливаем sarg. Где вы его возьмете – ваши проблемы. Я утянул откуда-то из инета, так как в SLES9 его нет. Постарался найти самую последнюю версию для SLES9, нашел sarg-2.1-10. Настраиваем sarg. Предполагается, что логи sarg будет хранить в каталоге /var/log/sarg. Редактируем файлик /etc/sarg.conf. Нафиг все оттуда выкидываем, оставляем только следующее:

access_log /var/log/squid/access.log
output_dir /var/log/sarg
max_elapsed 28800000

Настраиваем расписание работы sarg. Делается это по следующей причине – sarg не является монитором реального времени, он работает только после того, как его пнешь командой (еж птица гордая, пока не пнешь – не полетит). Поэтому:

root> export EDITOR=mcedit
root> crontab -e

В открывшемся расписании cron-а добавляем следующие строки:

30 7 * * * sarg
12 12 * * * sarg
00 13 * * * sarg
30 16 * * * sarg

Вы можете настроить расписание так, как вам удобнее – ваше право. Мне удобно так.
Кроме того, при ротации логов тоже будет выполняться sarg. Об этом ниже.

Теперь настроим мониторинг реального времени. Для этого нам понадобится такая классная штука, как sqstat. Стянуть можно с http://samm.kiev.ua/sqstat/. Содержимое архива распаковываем в папку /var/log/sqstat. И настраиваем. Файлик config.inc.php.defaults копируем в эту же папку с именем config.inc.php. После редактирования у меня он выглядит следующим образом:



Кроме того для apache2 необходимо проставить php. Кстати, обратите внимание, что у меня sqstat занимается мониторингом двух хостов :)
Ну и теперь настраиваем apache2, чтоб можно было на sarg и sqstat смотреть по человечески. Редактируем файл /etc/apache2/httpd.conf, в самый конец дописываем:


ServerAdmin legion@proxy.mydomain.com.ua
ServerName legion.mydomain.com.ua
Alias /sarg "/var/log/sarg"

Order Deny,Allow
Allow from all
Options -Indexes

Alias /sqstat "/var/log/sqstat"

Order Deny,Allow
Allow from all
Options -Indexes



Запускаем апач и делаем первый сбор sarg:

root> /etc/init.d/apache2 start
root> sarg

После этого через любой обозреватель (IE, FireFox, Mozilla, Opera, NetScape, linx, Konqueror, SeaMonkey...) открываем ссылку: http://legion/sarg и смотрим содержимое. Если видим фигу – RTFM.
Кроме того открываем ссылку http://legion/sqstat/sqstat.php и смотрим на активные сессии. Опять же, если видим фигу – RTFM. Ну а че тут еще посоветовать???
Ну и занимаемся любимым делом – ставим apache2 в автозагрузку. Если руками, то так:

root> ln -s /etc/init.d/apache2 /etc/init.d/rc3.d/K08squid
root> ln -s /etc/init.d/apache2 /etc/init.d/rc3.d/S14apache2
root> ln -s /etc/init.d/apache2 /etc/init.d/rc5.d/K08apache2
root> ln -s /etc/init.d/apache2 /etc/init.d/rc5.d/S14apache2

Теперь настраиваем ротацию логов сквида, а заодно добавляем еще один сбор sarg. Для этого создаем каталог /var/log/arhiv/squid, и после этого редактируем /etc/logrotate.d/squid. Должно выглядеть так:

/var/log/squid/cache.log {
compress
dateext
maxage 365
rotate 99
size=+1024k
notifempty
missingok
create 640 squid root
postrotate
/etc/init.d/squid reload
endscript
olddir /var/log/arhiv/squid
}

/var/log/squid/access.log {
compress
dateext
maxage 365
rotate 100
daily
notifempty
missingok
create 640 squid root
prerotate
sarg
endscript
postrotate
/etc/init.d/squid reload
endscript
olddir /var/log/arhiv/squid
}

/var/log/squid/store.log {
compress
dateext
maxage 365
rotate 99
daily
notifempty
missingok
create 640 squid root
postrotate
/etc/init.d/squid reload
endscript
olddir /var/log/arhiv/squid
}

Пока все...

20 февраля 2007

Читать далее

2009-05-20

Печать с Windows на Linux

Значит так. Нужно с Windows XP или Windows 2000 печатать на принтера, установленные локально на линуксовой машине. Линукс у нас openSUSE 11.1.

1. Ну первым делом на линухе ставим cups, и samba, все что есть, не считая исходников и develop.
2. В YaST2 настраиваем принтер на общий доступ. Если все правильно настроено, то все окружающие тачки с линухой практически сразу его увидят и смогут на него печатать.


3. В YaST2 настраиваем samba. Там визард простой, разберетесь...
4. Потом в конфигах xinetd разрешаем работу SWAT.
5. Запускаем и ставим на автозапуск cups, smb, nmb, xinetd, winbind.
6. Заходим в SWAT (http://hostname_or_ip:901) и настраиваем там принтер.
7. Обращаем внимание на то, что имя принтера в CUPS и SAMBA д.б. одинаковое.
8. Ну и в консоли под root выполняем: cupsaddsmb -U root HP_LaserJet_P3005_LPT_1
9. Настраиваем принтер на масдайном клиенте.
10. Радуемся :)

Вот конфиг самбы на всякий случай(/etc/samba/smb.conf):

[global]
workgroup = NKRES
netbios name = URSEKT44
security = SHARE
map to guest = Bad User
printcap name = cups
printing = cups
printcap cache time = 750
cups options = raw
load printers = yes
use client driver = yes
add machine script = /usr/sbin/useradd -c Machine -d /var/lib/nobody -s /bin/false %m$
logon path = \\%L\profiles\.msprofile
logon drive = P:
logon home = \\%L\%U\.9xprofile
domain master = No
wins support = Yes
usershare allow guests = Yes

[homes]
comment = Home Directories
valid users = %S, %D%w%S
read only = No
inherit acls = Yes
browseable = No

[profiles]
comment = Network Profiles Service
path = %H
read only = No
create mask = 0600
directory mask = 0700
store dos attributes = Yes

[users]
comment = All users
path = /home
read only = No
inherit acls = Yes
veto files = /aquota.user/groups/shares/

[groups]
comment = All groups
path = /home/groups
read only = No
inherit acls = Yes

[printers]
comment = All Printers
path = /var/tmp
guest ok = Yes
read only = No
create mask = 0700
printable = Yes
browseable = Yes

[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @ntadmin, root
force group = ntadmin
create mask = 0664
directory mask = 0775

[HP_LaserJet_P3005_LPT_1]
comment = HP LaserJet P3005
path = /var/tmp
read only = No
create mask = 0600
administrative share = Yes
guest ok = Yes
printable = Yes
printer name = HP_LaserJet_P3005_LPT_1
use client driver = Yes
force printername = Yes
oplocks = No
share modes = No

Вот что я подпилил в конфигах CUPS, в /etc/cups/mime.convs:

application/octet-stream application/vnd.cups-raw 0 -

Ну и в принципе все :)



Читать далее

2009-05-19

Фишечки FireFox

Люблю, хороший огнелис. Только с первого пинка тормозной (на винде редко пользуюсь, так что все написанное касается linux). По крайней мере на версии 3.0.10 и ниже. Вот как исправляем тормоза:

1. В настройках снимаем галки с обоих "Информировать, не подозревается ли посещаемый веб-сайт в ...".
2. Меняем дефолтную тему например на "Chromifox Basic"
3. Ставим обязательные расширения: "Adblock Plus", "Flashblock".


А огнелис, который не тормозит мне нравится еще больше :)

Теперь исправляем хреновое и непредсказуемое поведение правой кнопки мышки:

1. Устанавливаем расширение "Mouse Gestures Redox" и нахрен в нем все отключаем.
2. Для удобства контекстных меню ставим расширение "Menu Editor", и настраиваем меню так, как нам по вкусу.
3. Запоминаем, что первые два действия можно було и не делать, если вы будете правую кнопку мышки всегда держать долго, до появления нужного меню. Я не так терпелив, поэтому и наваял первые два пункта.

Кстати, очень рекомендую установить еще такое расширения: "Google Toolbar for Firefox", "Extended Statusbar".

Читать далее

2009-04-16

Конвертирование wmv в avi в linux через bash

avidemux2_cli --nogui --audio-codec MP3 --video-codec Xvid4 --output-format AVI --load test.wmv --save test.avi
Читать далее

2009-03-22

Кардинально решаем с вирусами в Новотроицке


План работ в Новотроицке по удалению вирусов, окончательному и бесповоротному

  1. Отдергиваем ЛВС от компьютера.

  2. С LiveCD полностью сканируем компьютер при помощи cureit DrWEB.

  3. Загружаем компьютер, обновляем windows до SP3+SecurityPacks. Где невозможно — переустанавливаем windows.


  4. Обновляем NOD32, настраиваем его на автоматическую чистку, настраиваем отчеты по почте, сканируем полностью компьютер нодом, защищаем конфигурацию паролем.

  5. Импортируем ветки реестра, отключающие работу USB, CD, Floppy.

  6. Удаляем не связанное с рабочим процессом ПО.

  7. Устанавливаем и настраиваем VNC.

  8. Устанавливаем новый IP, переписываем в журнал всю информацию по компьютеру(IP, место установки, ФИО пользователя).

  9. Выкашиваем пользователя из локальных администраторов, меняем пароль на Администратора.

  10. Паролим BIOS, отключаем в BIOS USB, CD, Floppy (кроме компов с подключенными USB устройствами типа принтеров, мышей и клавиатур).

  11. Отключаем с материнской платы приводы и Floppy.

Вот более точно (взято из написанной после поездки служебной записки):

Были предприняты следующие шаги по устранению проблемы:

      1. Все компьютера РЭС были отключены от ЛВС.

      2. Все компьютера РЭС были просканированы при помощи LiveCD CureIT от DrWEB.

      3. Было установлено 3-е кумулятивное обновление на Windows, набор критичных обновлений, закрывающих уязвимости Windows от вирусов, везде, где возможно были установлены обновления безопасности, выпущенные после выхода 3-го кумулятивного обновления Windows.

      4. Обновлены антивирусные базы NOD32.

      5. Все компьютера просканированы при помощи NOD32.

      6. Конфигурация NOD32 на всех компьютерах была защищена паролем.

      7. На всех компьютерах РЭС NOD32 был сконфигурирован на тихую работу(отключен интерактив с пользователем компьютера), была настроена отчетность работы NOD32 при наступлении критических событий на электронный адрес nod32@sss.com.ua.

      8. Все пользователи на всех компьютерах были исключены из группы локальных администраторов.

      9. В реестре Windows была отключена возможность использования подключаемых USB, CD/DVD, Floppy устройств хранения информации, кроме компьютера зам. начальника РЭС Колосова А.В.

      10. На всех компьютерах РЭС была проверена и унифицирована работа удаленного средства администрирования RealVNC.

      11. На всех компьютерах был установлен новый пароль на локального администратора.

      12. На всех компьютерах был установлен новый пароль на доступ в BIOS.

      13. На всех компьютерах через BIOS была отключена работа CD/DVD, USB, Floppy. Исключения: компьютер зам. начальника РЭС Колосова А.В., не отключалась поддержка USB на компьютерах с подключенной USB периферией(принтера, клавиатуры, манипуляторы мышь).

      14. С материнских плат всех компьютеров были отключены шлейфы и кабели питания Floppy, CD/DVD.

      15. Были просканированы серверные файловые ресурсы при помощи CureIT от DrWEB, при помощи NOD32.

      16. Была настроена автоматическая синхронизация сервера обновлений NOD32 с сервером центрального офиса.

      17. Система электронной почты РЭС была переведена на Linux.

      18. Только после всех действий компьютера РЭС были вновь подключены к ЛВС.



Читать далее

Сервер обновлений NOD32 на linux

Задача проста. В головной конторе есть сервер обновлений NOD32. Крутится на винде, раздает базы всем через простую виндозную шару. Засада в том, что в районах все сервера на linux, на них сервер обновлений по простому не поставишь. Поэтому по простому отделываемся от проблемы таким скриптом:


#!/bin/bash
# upload nod32 bases from persey
cd /u02/scheduler/nod32
umount nod32
umount nod32
umount nod32
umount nod32
mkdir nod32
#smbmount \\\\10.77.11.226\\nod32 rnod -o username=,password=$REMOTEPWD,ro
smbmount \\\\10.77.11.226\\nod32 nod32 -o password=
#cp -u -v rnod/* /files/nod32/
rsync -av nod32 /files
umount nod32
umount nod32
umount nod32
umount nod32

Каталог /files/nod32 шарим через самбу, скрипт пихаем в cron, всех клиентов в рэсе обновляем из пошареной папки. Вот так.

А вообще по хорошему надо разбираться с RemoteAdministrator от NOD32.

Читать далее

2009-02-20

vsftpd

Итак, нужен ftp сервер. Вариантов много есть: pureFTP, proFTPd, vsftpd и т.д. Я остановил свой выбор на vsftpd по простой причине - он есть во всех дистрибутивах suse. Правда в sles9, opensuse10 нет файла в init.d, приходилось руками делать, но в более поздних версиях ситуация исправилась.

Значит, что мне от vsftpd нужно на данный момент:
1. Доспуп для анонимных пользователей на чтение.
2. Использование виртуальных пользователей.

Поехали:


mkdir /etc/vsftpd
touch /etc/vsftpd/logins.txt
echo fu >> /etc/vsftpd/logins.txt
echo fp >> /etc/vsftpd/logins.txt
echo alexsf >> /etc/vsftpd/logins.txt
echo aparolnada >> /etc/vsftpd/logins.txt
echo sit >> /etc/vsftpd/logins.txt
echo avapcheparolnada >> /etc/vsftpd/logins.txt
db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db
chmod 600 /etc/vsftpd/vsftpd_login.db
echo "auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login" > /etc/pam.d/vsftpd
echo "account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login" >> /etc/pam.d/vsftpd
useradd -d /zzz/ftp -c "Virtual FTP User" -s /bublik/kruglik virtual
mkdir /zzz/ftp
chown virtual /zzz/ftp -R
mkdir /etc/vsftpd/user_conf
touch /etc/vsftpd/user_conf/sit
echo "anon_mkdir_write_enable=YES" > /etc/vsftpd/user_conf/sit
echo "anon_other_write_enable=YES" >> /etc/vsftpd/user_conf/sit
echo "anon_upload_enable=YES" >> /etc/vsftpd/user_conf/sit
echo "write_enable=YES" >> /etc/vsftpd/user_conf/sit
touch /etc/vsftpd/user_conf/alexsf
echo "anon_mkdir_write_enable=YES" > /etc/vsftpd/user_conf/alexsf
echo "anon_other_write_enable=YES" >> /etc/vsftpd/user_conf/alexsf
echo "anon_upload_enable=YES" >> /etc/vsftpd/user_conf/alexsf
echo "write_enable=YES" >> /etc/vsftpd/user_conf/alexsf
echo "local_root=/" >> /etc/vsftpd/user_conf/alexsf

#########################################################
### /etc/vsftpd.conf
#########################################################

anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_root=/zzz/ftp
anon_umask=022
anon_upload_enable=NO
anonymous_enable=YES
chroot_local_user=YES
dirmessage_enable=YES
dual_log_enable=YES
guest_enable=YES
guest_username=virtual
listen_port=21
listen=YES
local_enable=YES
local_umask=022
log_ftp_protocol=YES
ls_recurse_enable=YES
pam_service_name=vsftpd
pasv_max_port=30999
pasv_min_port=30000
user_config_dir=/etc/vsftpd/user_conf
write_enable=NO


Читать далее

2009-01-12

Дублирование репозитариев openSUSE на локальном сервере

Итак, коттора начала массово спрыгивать на openSUSE. Естественно, нужно иметь локальные копии репозитариев. Этим и займемся...

Для настройки используем статью:

http://en.opensuse.org/Mirror_Setup_Howto

Первым делом настраиваем xntp. Как это сделать, у меня уже описывалось ранее в других статьях, терять время не буду.


Затем в каталоге /etc/apache2/vhosts.d создаем файл update.repo.conf со следующим содержимым:

ServerAdmin sit@co.ksoe.com.ua
ServerName repo.ksoe.com.ua
DocumentRoot "/u02/repo/opensuse"

Options FollowSymLinks Indexes
IndexOptions FancyIndexing VersionSort NameWidth=* Charset=UTF-8 TrackModified FoldersFirst XHTML
AllowOverride None
Order allow,deny
Allow from all

Alias /robots.txt /u02/repo/repo.ksoe.com.ua/robots.txt

Options None
Order allow,deny
Allow from all

После этого под root:

mkdir /u02/repo/repo.ksoe.com.ua
mkdir /u02/repo/opensuse
echo 'User-agent: *' > /u02/repo/repo.ksoe.com.ua/robot.txt
echo 'Disallow: *' >> /u02/repo/repo.ksoe.com.ua/robot.txt
echo ' ' >> /u02/repo/repo.ksoe.com.ua/robot.txt
rcapache2 restart
chkconfig -a apache2
groupadd mirror
useradd -m -g mirror -c "Mirror User" -s /bin/bash mirror
mkdir /u02/repo/opensuse
mkdir /u02/repo/opensuse/updates
chown -R mirror:mirror /u02/repo/opensuse
rcrsyncd start; chkconfig -a rsyncd

Редактируем файл /etc/rsyncd.conf. Добавляем в конец:

[opensuse]
path = /u02/repo/opensuse
comment = rsync access for openSUSE scanner
uid = nobody
# if you want to limit access to the openSUSE mirror scanner:
#hosts allow = 195.135.220.0/22

На проксе, через которую будет бегать rsync разрешаем порт 873

Проверяем

su - mirror
export RSYNC_PROXY=10.77.11.70:3128
rsync -rlpt rsync.opensuse.org::opensuse-hotstuff-160gb /u02/repo/opensuse/ --delete-after --delete-excluded --max-delete=4000 --timeout=1800 -hi

Не. Такой вариант для таких каналов связи как у нас не подходит...

Попробую при помощи wget:

wget -o packman.log -t 0 -c -k -p -mc http://ftp.skynet.be/pub/packman/suse/11.1/

Нет, так тоже не канает. wget не следит за изменениями пакетов, тупо качает все что находит...

Попробую при помощи w3mir:

w3mir -r http://ftp.skynet.be/pub/packman/suse/11.1/

Так работает, просто и ясно. Так и делаем...


Читать далее

Обновление openSUSE 11.1 при помощи zypper

Цитирую переписку на linuxforum:

alexsf:

Доброе время суток. У меня не работают обновления при помощи апплета kupdateapplet. Репозитарии настроены, штук 20 наверное. Когда в yast2 смотрю на тот же wine, показывает, что доступна свежая версия. Но при этом kupdateapplet говорит, что новых обновлений нет, и yast2 online_update тоже их не находит... Мне мало верится, что с момента выхода 11.1 небыло никаких обновлений, значит у меня что-то не так... Подскажите, может я что-то не так делаю???

alexsf:

zypper -v up - молодец, сделал то, что не смог kupdateapplet. Обновился smile.gif
Читать далее

2009-01-06

Подсказки по postgres

Восстановление схемы из бэкапа:

/usr/bin/pg_restore -h 10.77.11.200 -p 5432 -U postgres -d "UTF8_sk" -v "/zzz/work/bucardo/pgsql.UTF8_sk"
Читать далее

Простое логирование PostgreSQL 8.3

Настройка логирования в версиях 8.2 и 8.3 отличается. В 8.3 в postgresql.conf самая простая настройка будет выглядеть так:

#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------
logging_collector = on
log_directory = pg_log

Как аналогичная секция выглядит в 8.2 смотрите в ранее опубликованных постах...
Читать далее

2008-12-03

Репликация PostgreSQL+Bucardo. Рабочий вариант №1

Итак, после трех черновиков наступило время промышленной эксплуатации.

Описание задачи

Херсонская область. 19 структурных подразделений энергосбыта. Биллинг бытовых и промышленных потребителей. БД крутится в каждом филиале на SLES9 + PostgreSQL 8.2.5. Структура БД везде одинакова. Первичные ключи организованы таким образом, что уникальны не только в пределах филиала, но и области в целом. Каналы связи хреновые. 2 района с более-менее человеческой связью, 5 вообще только дозвон, остальные одно название. Есть головная контора, Херсоноблэнерго. Задача в том, чтоб филиалы, имеющие связь, реплицировались в головную контору с целью собрать общую БД быта и прома по области. Районы с дозвоном в данном мероприятии не участвуют, естественно.


Выбор компонентов

ОС центральной БД - SLES10 SP2 (SuSE Linux Enterprise Server 10 Service Pack 2)
БД - PostgreSQL 8.2.5 (так как во всех районах используется именно эта версия)
Репликация - Bucardo 3.0.9

Конфигурация сервера

IP-адрес сервера 10.77.11.71

Аппаратную часть не описываю - не актуально. Со временем сервер поменяем на более мощный.
Большую часть ПО ставил по умолчанию.

1. Доставил пакеты orarun, gtk-devel
2. Ни один из компонентов postgresql не устанавливал - версия не устраивает. Будем ставить нужную руками.
3. Целиком установил группу "C/C++ Compiler and Tools"
4. Что касается perl и его модулей... Вот листинг команды "rpm -qa | grep perl | sort"

limal-ca-mgm-perl-1.1.74-0.3
limal-nfs-server-perl-1.1.72-0.3
limal-perl-1.1.72-0.3
perl-5.8.8-14.7
perl-Bit-Vector-6.4-13.5
perl-Bootloader-0.4.19.12-0.3
perl-Carp-Clan-5.3-13.5
perl-Compress-Zlib-1.35-14.2
perl-Config-Crontab-1.11-12.2
perl-Config-IniFiles-2.39-13.4
perl-Crypt-SmbHash-0.12-13.2
perl-Date-Calc-5.4-14.5
perl-Digest-MD4-1.5-13.2
perl-Digest-SHA1-2.10-15.2
perl-PDA-Pilot-0.11.8-138.2
perl-Parse-RecDescent-1.80-259.2
perl-TermReadKey-2.30-13.2
perl-TimeDate-1.16-136.2
perl-URI-1.35-15.2
perl-X500-DN-0.28-133.2
perl-XML-Parser-2.34-43.2
perl-XML-Writer-0.600-13.2
perl-gettext-1.05-13.2
sax2-libsax-perl-7.1-125.54
yast2-perl-bindings-2.13.11-0.22

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

Предвариловка

В каталоге /files/install находится все, необходимое для установки и настройки.

/files/install/bucardo/perl_modules - набор perl-овских модулей, необходимых для установки и работы bucardo
/files/install/bucardo/Bucardo-3.0.9.tar.gz - собственно сам bucardo
/files/install/postgresql - rpm пакеты с postgresql 8.2.5. Вот их листинг:

postgresql-8.2.5-4.1.i586.rpm
postgresql-contrib-8.2.5-4.1.i586.rpm
postgresql-debuginfo-8.2.5-4.1.i586.rpm
postgresql-devel-8.2.5-4.1.i586.rpm
postgresql-docs-8.2.5-4.1.i586.rpm
postgresql-libs-8.2.5-4.1.i586.rpm
postgresql-pl-8.2.4-2.nosrc.rpm
postgresql-plperl-8.2.4-2.i586.rpm

Принятые условные обозначения

/dir/anotherdir/filename.fff - обозначение файлов и каталогов, листинг файлов
root#
- обозначение консоли, открытой под root
postgres>
- обозначение консоли, открытой под непривилегированным пользователем (в данном случае postgres)
rpm -qa | grep perl | sort
- команда, выполняемая в каком-либо интерпретаторе (bash, psql...), результаты, возвращенные работой команды...

PostgreSQL


Устанавливаем PostgreSQL:

root# cd /files/install/postgresql
root# rpm -ivh *

Устанавливаем необходимые параметры ядра:

root# echo "kernel.shmmax = 1000000000" >> /etc/sysctl.conf
root# sysctl kernel.shmmax=1000000000

Делаем первый запуск PostgreSQL:

root# /etc/init.d/postgresql start

Редактируем конфиги postgresql:

Листинг /var/lib/pgsql/data/pg_hba.conf:

local all all ident sameuser
host all all 127.0.0.1/32 ident sameuser
host all all 0.0.0.0/0 password

Листинг /var/lib/pgsql/data/postgresql.conf:

#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
listen_addresses = '*'
max_connections = 100
superuser_reserved_connections = 5
#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------
max_fsm_pages = 153600
max_stack_depth = 2MB
shared_buffers = 500MB
temp_buffers = 30MB
work_mem = 5MB
#------------------------------------------------------------------------------
# WRITE AHEAD LOG
#------------------------------------------------------------------------------
fsync = off
#------------------------------------------------------------------------------
# QUERY TUNING
#------------------------------------------------------------------------------
constraint_exclusion = on
#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------
log_line_prefix = '%s %h %u '
log_min_duration_statement = 60000
log_min_error_statement = warning
redirect_stderr = on
#------------------------------------------------------------------------------
# RUNTIME STATISTICS
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#------------------------------------------------------------------------------
autovacuum = off
#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------
datestyle = 'iso, dmy'
lc_messages = 'ru_RU.UTF-8'
lc_monetary = 'ru_RU.UTF-8'
lc_numeric = 'ru_RU.UTF-8'
lc_time = 'ru_RU.UTF-8'
#------------------------------------------------------------------------------
# LOCK MANAGEMENT
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VERSION/PLATFORM COMPATIBILITY
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------

Перезапускаем PostgreSQL с новыми параметрами:

root# /etc/init.d/postgresql restart

После этого ставим PostgreSQL на автозапуск в YaST.
Меняем пароль пользователя postgres в БД:

root# su - postgres
postgres> psql
postgres=# ALTER ROLE postgres PASSWORD 'postgres';
postgres=# \q
postgres> exit

Создаем БД, в которую будут реплицироваться районы

root# mkdir /u02/pgdata/res -p
root# chown postgres:postgres /u02/pgdata -R
root# su - postgres
postgres> psql
postgres=# CREATE ROLE res LOGIN PASSWORD 'respasswd';
postgres=# ALTER ROLE res SUPERUSER;
postgres=# CREATE TABLESPACE res OWNER res LOCATION '/u02/pgdata/res';
postgres=# CREATE DATABASE res WITH ENCODING='UTF8' OWNER=res TABLESPACE=res;
postgres=# \q
postgres> psql -h 10.77.11.71 -U res -W 'res'
res=# CREATE SCHEMA res AUTHORIZATION res;
res=# CREATE LANGUAGE plpgsql;
res=# CREATE LANGUAGE plperlu;
res=# \q
postgres> exit

Bucardo

Модули ставим в следующей последовательности:

Pod-Escapes-1.04
Pod-Simple-2.06
Test-Pod-1.00
Net-Daemon-0.27
PlRPC-0.2020
DBI-1.51
ExtUtils-CBuilder-0.24
ExtUtils::MakeMaker 6.32
IO-1.2301
Storable-2.16
POE-Test-Loops-1.002
Curses-1.13
Event-1.10
Gtk-Perl-0.7009 (perl Makefile.PL --without-guessing). Модуль загадочный... Дохрена всего нужно проставить из Gnome. В принципе пакет опциональный, так что с ним не заморачиваемся, ставим с указанной опцией. Но в уме держим, что модуль установили ненастроенный.)
IO-Tty-1.02
Test-Pod-1.14
HTML-Tagset-3.20
HTML-Parser-3.56
libwww-perl-5.800 (на все вопросы отвечаем утвердительно)
Socket6-0.15
Tk-804.027 (make test нужно делать в X-ах, я например открыл VNC соединение, и тесты делал в нем, иначе все тесты провалятся)
Devel-Symdump-2.08
Pod-Coverage-0.19
Test-Pod-Coverage-1.06
POE-1.003 (make test нужно делать в X-ах, я например открыл VNC соединение, и тесты делал в нем, иначе все тесты провалятся)
Number-Compare-0.01
Text-Glob-0.08
File-Find-Rule-0.30
PathTools-3.2701
Test-Pod-Coverage-1.08
Test-Simple-0.80
Module-CoreList-2.15
Digest-SHA-5.47
Module-Signature-0.55
ExtUtils-ParseXS-2.19
version-0.76
Compress-Raw-Zlib-2.012
IO-Compress-Base-2.012
Compress-Raw-Bzip2-2.012
IO-Compress-Bzip2-2.012
IO-Compress-Zlib-2.012
Compress-Zlib-2.012 (make install UNINST=1 - так как у нас этот модуль уже установлен, но версия не та, то ставим именно так)
IO-Zlib-1.09
Package-Constants-0.01
Archive-Tar-1.40
Pod-Simple-3.07
podlators-2.2.0
Regexp-Common-2.122
Pod-Readme-0.09
Test-Harness-2.62
PAR-Dist-0.40
Archive-Zip-1.26
Module-Build-0.30 (t/use_tap_harness.....skipped all skipped: TAP::Parser not installed говорит, хотя он есть в установленном модуле Test-Harness. Проигнорируем...)
Test-Distribution-1.24
Test-Portability-Files-0.05
Test-Taint-1.04
Readonly-1.03
Readonly-XS-1.04
Params-Validate-0.91
Time-modules-2006.0814
File-MMagic-1.27
MIME-Types-1.24
Module-Find-0.05
Sub-Uplevel-0.18
Array-Compare-1.16
Test-Exception-0.27
Tree-DAG_Node-1.06
Test-Warn-0.11
Archive-Any-0.0932
Class-Accessor-0.31
Algorithm-Diff-1.1902
Array-Diff-0.04
CPAN-DistnameInfo-0.06
File-Slurp-9999.13
IO-Capture-0.05
List-MoreUtils-0.22 (при установке ругнулся, что Test::Pod not installed, но я его ставил. Игнорируем, но держим в уме, что модуль проблемный)
Test-Tester-0.103
Test-NoWarnings-0.084
Test-Deep-0.103
UNIVERSAL-require-0.11
Pod-Strip-1.02
Parse-RecDescent-1.94
Module-ExtractUse-0.23
Module-Pluggable-2.96
Params-Util-0.33
Sub-Install-0.924
Data-OptList-0.103
Sub-Exporter-0.980
Data-Section-0.005 (распаковывать обязательно при помощи tar -xvzf)
Text-Template-1.45
Software-License-0.008
YAML-0.62
Devel-Leak-0.03
YAML-Syck-0.95
Test-YAML-Valid-0.03
Test-YAML-Meta-0.11
Text-CSV_XS-0.57
Module-CPANTS-Analyse-0.82 (make test работает очень долго. Это нормально)
Test-Kwalitee-1.01 (Как его проставить - ХЕЗ. makefile.PL отсутствует как класс. Делаем так. Сначала под alexsf выполняем perl Build.PL, потом Build, потом под root копируем содержимое blib/lib в /usr/lib/perl5/site_perl/5.8.8, и Test::Kwalitee.3pm в /usr/share/man/man3)
POE-Component-Server-Syslog-1.16 (t/99_test_kwalitee....ok, значит предыдущий пакет поставлен правильно :) )
Sys-Syslog-0.27
Sub-Name-0.02
Sub-Identify-0.03
SUPER-1.16
Algorithm-C3-0.07
Class-C3-XS-0.07
Class-C3-0.19
Class-MOP-0.37
Test-LongString-0.11
Locale-US-1.2
Params-Coerce-0.14
Business-ISBN-Data-20081020
GD-Barcode-1.15
Business-ISBN-2.04 (сказал, что GD::Font не загружен. Такого не нашел. Игнорируем и ставим)
URI-1.37
IO-String-1.08
IO-stringy-2.110
DBM-Deep-1.0013 (ругнулся на несколько тестов, но игнорируем и ставим)
Test-Output-0.12 (ошибки игнорируем)
DateTime-Locale-0.41
Class-Singleton-1.03
DateTime-TimeZone-0.83 (Ругается, но ставим)
DateTime-0.4305 (некоторые тесты не прошли из-за отсутствия пакетов, которые проставлю дальше. Эти пакеты требуют, чтоб DateTime уже был установлен)
Set-Infinite-0.63
DateTime-Set-0.25
DateTime-Event-Recurrence-0.16
DateTime-Event-ICal-0.09
DateTime-Format-ICal-0.09
DateTime-Format-Strptime-1.0800
Class-Factory-Util-1.7
Task-Weaken-1.02
Test-Signature-1.10
DateTime-Format-HTTP-0.37
DateTime-Format-Mail-0.3001
DateTime-Format-IBeat-0.161
PadWalker-1.7
Devel-Cycle-1.10
Test-Memory-Cycle-1.04
DateTime-Format-Builder-0.7901
DateTime-Format-MySQL-0.04
Class-Inspector-1.23
aliased-0.22
Declare-Constraints-Simple-0.03
Moose-0.18
Mail-Sendmail-0.79 (ругается при тесте, что не может соединиться с сервером, но это нормально, игнорируем и ставим)
B-Keywords-1.08
Config-Tiny-2.12
Class-Data-Inheritable-0.08
Devel-StackTrace-1.12
Exception-Class-1.23
Module-Pluggable-3.1
Taint-Runtime-0.03
Clone-0.25
Scalar-List-Utils-1.19
Test-Object-0.07
PPI-1.203
String-Format-1.14
File-HomeDir-0.82
File-Which-0.05
Perl-Tidy-20071205
Pod-Spell-1.01
Regexp-Parser-0.20
Perl-Critic-1.092
Perl-Critic-Bangs-1.00 (на тесте ругается на некоторые вещи, но ставим все равно)
Perl-Critic-Lax-0.007
Test-Dynamic-1.3.3

DBD-Pg-1.49

Как этот модуль проверяется:

В pg_hba.conf меняем на:

local all all password
host all all 127.0.0.1/32 password
host all all 0.0.0.0/0 password

Устанавливаем переменные окружения:

user> export DBI_PASS=postgres
user> export TEST_VERBOSE=1
user> export DBI_USER=postgres
user> export DBI_DSN='dbi:Pg:dbname=postgres'

Перезапускаем PostgreSQL и только после этого делаем make test. Потом возвращаем pg_hba.conf на место.

Конфигурируем PostgreSQL под bucardo:

root# su - postgres
postgres> mkdir /u02/pgdata/bucardo -p
postgres> psql
postgres=# CREATE USER bucardo SUPERUSER;
postgres=# ALTER ROLE bucardo password 'bucardo';
postgres=# CREATE TABLESPACE bucardo OWNER bucardo LOCATION '/u02/pgdata/bucardo';
postgres=# CREATE DATABASE bucardo WITH ENCODING='UTF8' OWNER=bucardo TABLESPACE=bucardo;
postgres=# CREATE LANGUAGE plperlu;
postgres=# \q
postgres> exit
root# cd /files/install/bucardo
root# tar -xvzf Bucardo-3.0.9.tar.gz
root# su - postgres
postgres> cd /files/install/bucardo/Bucardo/Bucardo-3.0.9/
postgres> psql -h 10.77.11.71 -U bucardo bucardo
bucardo=# CREATE LANGUAGE plpgsql;
bucardo=# CREATE LANGUAGE plperlu;
bucardo=# \q
postgres> psql -f bucardo.schema -h 10.77.11.71 -U bucardo bucardo
postgres> exit

Внимательно смотрим, чтобы скрипт bucardo.schema выполнился без ошибок, и только после этого идем дальше.

В каталоге /files/install/bucardo/Bucardo/Bucardo-3.0.9 есть модуль DBIx-Safe-1.2.4. Устанавливаем его. make test не делаем.

Затем из этого же каталога устанавливаем модуль Bucardo-3.0.9. Перед установкой делаем следующее:

1. В скриптах bucardo-report, bucardo_ctl.rc, bucardo_rrd, check_bucardo_sync, Bucardo.pm, bucardo_ctl меняем в самом начале файла строку

#!/usr/localbin/perl -- -*-cperl-*-

на строку

#!/usr/bin/perl -- -*-cperl-*-

2. Экспортируем нелобходимые для теста переменные окружения:

user> export DBI_DSN='dbi:Pg:dbname=bucardo'
user> export DBI_USER=bucardo
user> export DBI_PASS=bucardo
user> export TEST_VERBOSE=1

3. PostgreSQL должен быть настроен на время теста на коннект к базе локальных соединений через пароль. То есть в pg_hba.conf первыми строками д.б.:

local all all password
host all all 127.0.0.1/32 password

4.
Редактируем файл Bucardo-3.0.9/t/bucardo.test.data. Следующие строки должны быть такими:

DBNAME: bucardo
DBUSER: bucardo
DBHOST: 10.77.11.71

Только после этого ставим модуль:

perl Makefile.PL
make
make test
TEST_VERBOSE=1

Во время теста могут быть некоторые ошибки связанные с тестовыми базами, которые мы не настраивали. Игнорируем. Во время таста были созданы тестовые базы bucardo_test, bucardo_test1, bucardo_test2, bucardo_test3. После установки модуля их можно удалить.

Поднастраиваем postgres. Файл pg_hba.conf должен выглядеть так:

#local all all ident sameuser
#host all all 127.0.0.1/32 ident sameuser
#host all all 0.0.0.0/0 password
local all all password
host all all 127.0.0.1/32 password
host all all 0.0.0.0/0 password

Если нужно будет локально подключиться под postgres без ввода пароля, то закоментированные строки разкомментируем, незакомментированные комментируем, перезапускаем postgresql, и логинимся. Но потом возвращаем все на место, иначе bucardo работать не будет!

Ставим bucardo на место:

root# cp /files/install/bucardo/Bucardo/Bucardo-3.0.9 /opt -R

Редактируем файл /opt/Bucardo-3.0.9/bucardo_ctl. Устанавливаем в секции my $bcargs следующие значения:

my $bcargs = {
ctlquiet => 0,
ctlverbose => 0,
dbname => 'bucardo',
dbuser => 'bucardo',
dbpass => 'bucardo',
verbose => 1, ## Highly recommended to leave this on
sendmail => 0,
extraname => '',
debugfilesep => 0,
debugname => '',
debugstderr => 0,
debugstdout => 0,
debugsyslog => 1,
debugdir => '',
debugfile => 0,
cleandebugs => 1,
};

Создаем локального пользователя bucardo и настраиваем:

root# useradd -c "Bucardo Replication" -d /home/bucardo -p bucardo_bucardo -s /bin/bash bucardo
root# mkdir /home/bucardo
root# chown bucardo /home/bucardo
root# mkdir /var/run/bucardo
root# chown bucardo /var/run/bucardo
root# mkdir /var/log/bucardo
root# chown bucardo /var/log/bucardo

Создаем скрипты для запуска и останова bucardo:

root# echo '#!/bin/bash' >> /etc/init.d/bucardo_start
root# echo '/opt/Bucardo-3.0.9/bucardo_ctl start "Start $(date +%Y-%m-%d.%H.%M.%S)"' >> /etc/init.d/bucardo_start
root# echo '#!/bin/bash' >> /etc/init.d/bucardo_stop
root# echo '/opt/Bucardo-3.0.9/bucardo_ctl stop "Stop $(date +%Y-%m-%d.%H.%M.%S)"' >> /etc/init.d/bucardo_stop
root# chmod oug+x /etc/init.d/bucardo_start
root# chmod oug+x /etc/init.d/bucardo_stop
root# ln -s /etc/init.d/bucardo_stop /etc/init.d/rc3.d/K10bucardo
root# ln -s /etc/init.d/bucardo_stop /etc/init.d/rc5.d/K10bucardo

Так как нам не нужно, чтобы bucardo стартовал при запуске системы, линки на автозапуск не делаем. Только на останов.

Настраиваем syslog-ng (у нас не используется старый syslog) на логирование bucardo. Редактируем файл /etc/syslog-ng/syslog-ng.conf.in.

В секцию # Filter definition добавляем:

filter f_bucardo {match('ucardo');};

Этот фильтр обязательно должен быть установлен до определения фильтра f_messages, который мы меняем следующим образом:

filter f_messages { not facility(news, mail) and not filter(f_iptables) and not filter(f_bucardo); };

В самый конец добавляем:

destination d_bucardo {file(var/log/bucardo/bucardo.log);};
log {source(src);filter(f_bucardo);destination(d_bucardo);};

Потом в консоли:

root# SuSEconfig
root# /etc/init.d/syslog reload
root# mkdir /var/log/arhiv/bucardo -p

Настраиваем ротацию логов. Создаем файл /etc/logrotate.d/bucardo со следующим содержимым:

/var/log/bucardo/* {
dateext
compress
copytruncate
daily
missingok
notifempty
olddir /var/log/arhiv/bucardo
rotate 100
}

Так, с установкой bucardo вроде все. Теперь настраиваем собственно репликацию.

Настройка репликации. Добавление первой подчиненной БД.

Для начала, нам нужно на центральном сервере в ранее созданой БД сделать схему, аналогичную той, что будет реплицироваться из районов. Bucardo, к сожалению, не умеет реплицировать DDL, так что схему придется сделать руками. Выливаем ее из БД одного из районов, который имеет честь быть первым :). По логике вещей, схема во всех районах идентичная. Если нет, будет терзать программистов :). Ну и заливаем ее в БД res на хосте, где будет крутиться bucardo. Ну и малеко конфигурируем подчиненную БД. Все действия выполняются на том хосте, где будет крутиться bucardo.

root# su - postgres
postgres> mkdir ~/work
postgres> cd ~/work
postgres> pg_dump -h 10.77.25.3 -p 5432 -U postgres -F p -s -s -v -f "skres_schema.sql" -n 'res' "UTF8_sk"

postgres> psql -f skres_schema.sql -h 10.77.11.71 -U postgres res
postgres> psql -h 10.77.25.3 -U postgres UTF8_sk
UTF8_sk=# ALTER ROLE res SUPERUSER;
UTF8_sk=# CREATE LANGUAGE plperlu;
UTF8_sk=# CREATE LANGUAGE plpgsql;
UTF8_sk=# \q
postgres> exit

Теперь нам необходимо оптимизировать схему для заливки всех возможных районов. Что значит оптимизировать — удалить constraints и rules, свойственные каждому конкретному РЭСу. Иначе у нас в такие таблицы кроме одного конкретного РЭСа ни один не сможет данные записать, так как они не будут проходить проверку. На головной базе res выполняем запросы, а потом выполняем результаты этих запросов.

SELECT 'ALTER TABLE res.'||t.tablename||' DROP CONSTRAINT '||con.conname||';'
FROM pg_constraint con, pg_class cl, pg_tables t, information_schema.constraint_column_usage cc
WHERE t.schemaname = 'res'
AND t.tablename = cl.relname
AND con.contype = 'c'
AND con.conrelid = cl.oid
AND cc.constraint_name = con.conname
AND cl.relname not in ('billsqlreport','dual','rp_abon')
ORDER BY con.conname;

SELECT 'DROP RULE '||rulename||' ON '||tablename||';'

FROM pg_rules
WHERE schemaname = 'res'
ORDER BY tablename, rulename;


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

Сливаем дамп базы на сервере в районе и вытягиваем его на сервер с bucardo:

root# ssh root@10.77.25.3
root@remote# su - postgres -c "cd /files/ftp; pg_dump -C -F c -b -f pgsql.UTF8_sk "UTF8_sk""
root@remote# exit
root# wget -c --ftp-user=sit --ftp-password=shdgasd ftp://10.77.25.3/pgsql.UTF8_sk

Естественно, здесь подразумевается, что на РЭСовском сервере поднят FTP.

Ну а теперь непосредственно bucardo. Вносим информацию в БД bucardo. Для этого при помощи любого доступного SQL менеджера для PostgreSQL подключаемся к базе bucardo под пользователем bucardo и выполняем:

Описание всех участвующих в процессе репликации БД. Сюда вносятся как подчиненные БД, так и главная БД.

INSERT INTO bucardo.db (name, dbhost, dbname, dbuser, dbpass)
VALUES ('skres','10.77.25.3','UTF8_sk','res','supersecretpasswordofresinskres');

INSERT INTO bucardo.db (name, dbhost, dbname, dbuser, dbpass)
VALUES ('allres','10.77.11.71','res','res','respasswd');

Описание групп БД. Группы БД позволят управлять репликацией не отдельно каждой БД, а наборами БД, объединенными в группы. В принципе, логично было бы все подчиненные БД кинуть в отдельную группу, главную БД в отдельную группу. Так как я пока не знаю, что будет лучше, то так и сделаю.

INSERT INTO bucardo.dbgroup(name) VALUES('slave');
INSERT INTO bucardo.dbgroup(name) VALUES('master');

Привязываем БД к группам БД.

INSERT INTO bucardo.dbmap(db, dbgroup) VALUES('skres','slave');
INSERT INTO bucardo.dbmap(db, dbgroup) VALUES('allres','master');

Вносим объекты, которые будут участвовать в репликации. К таким объектам относятся только таблицы. Так как таблиц у нас очень много, больше 400 штук на данный момент, то вставку будем осуществлять массировано при помощи скрипта. Выполняем его на подчиненной БД, а результаты в подключенной ранее БД bucardo. Обратите внимание, что часть таблиц из запроса исключаются. Это те, которые не участвуют в процессе репликации.

SELECT 'INSERT INTO bucardo.goat (db,schemaname,tablename,pkey,pkeytype,analyze_after_copy) VALUES (''skres'',''res'','''||cl.relname||''','''||cc.column_name||''',''bigint'',''false'');'
FROM pg_constraint con, pg_class cl, pg_tables t, information_schema.constraint_column_usage cc
WHERE t.schemaname = 'res'
AND t.tablename = cl.relname
AND con.contype = 'p'
AND con.conrelid = cl.oid
AND cc.constraint_name = con.conname
AND cl.relname not in ('billsqlreport','dual','rp_abon')
ORDER BY cl.relname;

ВНИМАНИЕ!!! Возможны составные первичные ключи на таблицах, чего для работы репликации быть не должно. Поэтому перед выполнением вышеуказанного запроса ищем все таблицы, PK в которые состоит более чем из одного поля и что-то с ними решаем!!! Ищем эти таблицы следующим образом:

SELECT cl.relname, count(*)
FROM pg_constraint con, pg_class cl, pg_tables t, information_schema.constraint_column_usage cc
WHERE t.schemaname = 'res'
AND t.tablename = cl.relname
AND con.contype = 'p'
AND con.conrelid = cl.oid
AND cc.constraint_name = con.conname
AND cl.relname not in ('billsqlreport','dual','rp_abon')
GROUP BY cl.relname
HAVING count(*) > 1;

Создаем так называемый herd для Скадовской БД. Для каждой последующей необходимо будет создавать свой. Herd — это группа объектов(goat), которые мы вносили в bucardo в предыдущем запросе.

INSERT INTO bucardo.herd(name) VALUES('herd_skres');

Сопоставляем существующие goat созданному herd.

INSERT INTO bucardo.herdmap (herd, goat)
SELECT 'herd_skres', id
FROM goat WHERE db = 'skres';

Ну и напоследок создаем правила синхронизации:

INSERT INTO bucardo.sync (name,source,targetdb,synctype,stayalive,checktime,analyze_after_copy)
VALUES('sync_skres','herd_skres','allres','pushdelta','false','60 minutes','false');

Во-о-о-от...
А потом оказалось, что таблицу log из процесса репликации необходимо исключить... Делаем это так:

DELETE FROM goat WHERE db='skres' AND tablename = 'log';

Но при этом остаются триггера и ссылки на таблицу в районской схеме bucardo... Смотрим в схеме bucardo в РЭСе созданные индексы на таблице bucardo_delta. Ищем среди них те, что созданы для таблицы log. Определяем, что tablename = 24926

DROP TRIGGER bucardo_add_delta_d ON res.log;
DROP TRIGGER bucardo_add_delta_i ON res.log;
DROP TRIGGER bucardo_add_delta_u ON res.log;
DROP TRIGGER bucardo_triggerkick_sync_skres ON res.log;

DELETE FROM bucardo.bucardo_delta
WHERE tablename = 24926;

DELETE FROM bucardo.bucardo_delta_targets
WHERE tablename = 24926;

DROP INDEX bucardo.bucardo_delta_res_log_rowid;
DROP INDEX bucardo.bucardo_delta_res_log_txn;

Исключили. Если еще какую-нибудь таблицу придется исключать, действуем по такому же принципу.

Всё, bucardo практически настроен. Теперь нам нужно залить бэкап РЭСа, только данные. После этого мы запустим bucardo и он начнет на них наворачивать изменения, произошедшие в удаленной базе после добавления правила синхронизации. Для того, чтоб залить из бэкапа только данные, нам нужно удалить все FK, залить бэкап, и восстановить все FK. Все просто.

Для удаления FK воспользуемся следующим запросом, результаты которого выполним в БД res на центральном сервере:

SELECT 'ALTER TABLE res.'||t.tablename||' DROP CONSTRAINT '||con.conname||';'
FROM pg_constraint con, pg_class cl, pg_tables t, information_schema.constraint_column_usage cc
WHERE t.schemaname = 'res'
AND t.tablename = cl.relname
AND con.contype = 'f'
AND con.conrelid = cl.oid
AND cc.constraint_name = con.conname
ORDER BY con.conname;

Теперь заливаем из бэкапа только данные (я не помню, в каком каталоге находится pgsql.UTF8_sk, будем считать, что в ~/work относительно домашнего каталога пользователя postgres):

root# su - postgres
postgres> cd ~/work
postgres> /usr/bin/pg_restore -h 10.77.11.71 -p 5432 -U res -d res -a -v "pgsql.UTF8_sk"

Ну и восстанавливаем FK:

postgres> grep FOREIGN -B 1 skres_schema.sql > restore_fk.sql
postgres> psql -f restore_fk.sql -h 10.77.11.71 -U postgres res

Если необходимо все нахрен вычистить!!!

DELETE FROM
bucardo.sync;
DELETE FROM bucardo.herdmap;
DELETE FROM bucardo.herd;
DELETE FROM bucardo.goat;
DELETE FROM bucardo.dbmap;
DELETE FROM bucardo.dbgroup;
DELETE FROM bucardo.db;

А потом тупо выносим в подчиненной БД схему bucardo, вместе с ней уйдут все созданные bucardo объекты.

Изменения в структуре БД

И вот то, чего я ждал, наконец произошло... Структура БД поменялась. Как назло я был в отпуске, программисты мне об этом сказали уже постфактум...

Продолбался долго, в итоге наваял 2 поста:

Тестирование
Правила


Читать далее

2008-11-19

Жопа :)

Взято со странички моего племянника, Сереги Закоры на http://vkontakte.ru

(_!_)-жопа обыкновенная
(__!__) - жирная жопа
(_._) - жопа плоская

(!) - тощая жопа
{_!_} - шикарная жопа
(_*_) - геморройная жопа
(_zzz_) - жопа усталая
(_?_) - жопа безмозглая
(_о_) - жопа пользованная
(_О_) - много раз пользованная
(_$_) - новорусская жопа
(_x_) - поцелуй меня в жопу!
(_Х_) - оставь мою жопу в покое!
(_^_) - заносчивая жопа.
("|") - волосатая жопа
. - жопа, вид из космоса
(_~_) - хитрая жопа
(_ _) - очень хитрая жопа
(_e=mc^2_) - умная жопа
(_Ъ_) - твердая жопа
(_Ь_) - мягкая жопа
(_GO_) - иди в жопу
->(_!_) пошел в жопу
(_SOS_) - жопа в беде
(_#_) - жопа зека
{________O________} очень большая жопа
(_100%_) - полная жопа (крылатая фраза)
(_!_)] - жопа с ручкой
(_!_)S - жопа с ручкой
->(_!_)-> через жопу (делать что-либо)
(_=_) какая, в жопу, разница?
(_Я_) - Я в жопе...
(__Я__) - Я в полной жопе...
(_Мы_) - Мы в жопе:
(_->._) - Иди в жопу!
Є(_!_)Э - жопа с ушами
c(_o_) - использованная жопа с ручкой
(_!_)(___!___)(_!_)(__!__) -Кинотеатор

Читать далее