NFS: из прошлого в будущее Сергей Супрунов mount_nfs 10.0.0.254:/var/downloads /mnt # sysctl -w vfs.nfs.iodmin=2 # nfsiod # ps ax | grep nfsiod rpcbind_enable=YES nfs_server_enable=YES <ресурсы> <опции> <клиенты> $ cat /etc/exports # Доступ к домашнему каталогу и всем подкаталогам с двух указанных машин /usr/home/serg -alldirs 10.0.0.203 10.0.0.254 # Доступ на чтение со всей подсети 10.0.0.0/24 /var/downloads -ro -network 10.0.0.0 -mask 255.255.255.0 # Доступ с указанного хоста, причём пользователь с идентификатором 0 получит права пользователя admin /usr/src -maproot=admin admin.domain.ru /usr/src /usr/ports admin $ sudo /etc/rc.d/mountd onereload rpc_lockd_enable="YES" rpc_statd_enable="YES" # showmount $ showmount -a $ showmount -e rpcbind_enable="YES" nfs_server_enable="YES" mountd_flags="-r -p 700" rpc_lockd_enable="YES" rpc_statd_enable="YES" /var/www -alldirs,mapall=webmaster admin webmaster designer /var/www -ro backup rpcbind : admin webmaster designer : allow rpcbind : backup : allow rpcbind : ALL : deny # /etc/rc.d/nfsd start # showmount -e # mount -t nfs webserver:/var/www /mnt/www <ресурс> <клиент>(<опции>) <клиент>(<опции>) . . . $ cat /etc/exports $ sudo exportfs -ua $ sudo exportfs -a $ time cp /var/downloads/7.0-CURRENT-200703-i386-docs.iso /tmp/ $ time cp /mnt/7.0-CURRENT-200703-i386-docs.iso /tmp/ $ ftp localhost /home/amsand 172.20.0.23(rw) 172.20.0.0/255.255.255.0 $ cd /net/localhost $ ls var/www/*.s ----------------------------------------------------------------------------------------------------------------- VPN на основе протокола PPTP: как повысить безопасность? Дмитрий Рощин vpn_s="192.0.2.34" vpnnet="172.17.0.0/24" rdpterm="192.168.0.10" intranetweb="192.168.0.11" table const { 192.168.0.12, 192.168.0.13, 192.168.0.14, 192.168.0.15 } block log all pass quick on { inet0, dmz0 } inet proto gre from any to $vpn_s pass quick on { inet0, dmz0 } inet proto gre from $vpn_s to any pass in quick on inet0 proto tcp from any to $vpn_s port pptp keep state tag INET_DMZ pass in quick on dmz0 proto tcp from $vpnnet to $rdpterm port rdp keep state tag DMZ_LAN pass in quick on dmz0 proto tcp from $vpnnet to $intranetweb port http keep state tag DMZ_LAN pass in quick on dmz0 proto tcp from $vpnnet to port ica keep state tag DMZ_LAN pass out quick on dmz0 all keep state tagged INET_DMZ pass out quick on local0 all keep state tagged DMZ_LAN fire1# route add 172.17.0.0/16 192.0.2.34 firewall_enable="YES" firewall_type="VPN" firewall_enable="YES" firewall_type="VPN" Тип VPN необходимо определить в файле /etc/rc.firewall следующим образом: [Vv][Pp][Nn]) # Диапазон адресов, которые будут выдаваться клиентам VPN, не должен пересекаться с адресами # локальной сети клиента, поэтому не рекомендуется использовать диапазон 192.168 vpnnet="172.17.0.0/24" setup_loopback # Блокировать любой трафик от VPN-клиентов ${fwcmd} add 64000 deny all from $vpnnet to any # Нет необходимости фильтровать другой трафик, так как VPN-шлюз находится в DMZ ${fwcmd} add 65000 pass all from any to any ;; vpn-s# /etc/rc.d/ipfw start vpn-s# cd /usr/ports/net/mpd vpn-s# make install clean vpn-s# echo 'mpd_enable="YES"' >> /etc/rc.conf default: # Создаем 50 netgraph интерфейсов load pptp0 # Загрузка разделов конфига load pptp1 load pptp2 ... load pptp49 pptp0: # Создать новый интерфейс new -i ng00 pptp0 pptp0 # Назначить клиенту IP-адрес, первый параметр – IP-адрес конца туннеля со стороны сервера, # 2-й – IP-адрес клиента (маской задается диапазон сети из которого будет назначен адрес) set ipcp ranges 172.18.0.1/32 172.18.1.1/32 # Загрузить общие для всех интерфейсов параметры конфигурации load pptp_standart pptp1: new -i ng01 pptp1 pptp1 set ipcp ranges 172.18.0.1/32 172.18.1.2/32 load pptp_standart pptp2: new -i ng02 pptp2 pptp2 set ipcp ranges 172.18.0.1/32 172.18.1.3/32 load pptp_standart pptp99: new -i ng49 pptp49 pptp49 set ipcp ranges 172.18.0.1/32 172.18.1.50/32 load pptp_standart pptp_standart: # Отключить режим работы интерфейса «по требованию» set iface disable on-demand # Установить тип канала (описание типов смотрите в файле mpd.links) set link type pptp # Мы не будем выдавать адрес DNS-сервера, так как теоретически есть возможность подменить # выдаваемый сервером адрес, сессия IPCP не шифруется и не производится аутентификация пакетов # set ipcp dns 127.0.0.1 set iface enable proxy-arp # Включить сжатие данных set bundle enable compression set ccp yes mppc # Включить 128-битное шифрование mppe set ccp yes mpp-e128 # Требовать шифрование set bundle yes crypt-reqd # IP-адрес сервера vpn-s.testco.ru (необходимо заменить на реальный IP VPN-шлюза set pptp self 192.0.2.34 # Принимать входящие соединения по протоколу pptp set pptp enable incoming # Не инициировать соединения по протоколу pptp set pptp disable originate # Отключить механизм «windowing» определенный протоколом. Этот механизм является # дизайнерской ошибкой. Его отключение улучшает производительность, однако не все клиенты # будут нормально работать без этого механизма (Windows XP SP2 работает без проблем) set pptp disable windowing # Устанавливаем MTU и MRU для канала PPP. Очень важно установить эти значения меньше, # чем по умолчанию (1500), для того, чтобы избежать фрагментации пакетов GRE. # Особенно это важно при использовании eap-tls, так как сертификат с ключем длиной # в 2048 бит, не получится уместить в одном пакете set link mtu 1420 set link mru 1420 # Включаем механизм mssfix для TCP. Этот механизм заботится о том, чтобы максимальный размер # сегмента TCP, не превышал размер, заданный параметром MTU set iface enable tcpmssfix # Данный для доступа к серверу RADIUS (IP, логин, пароль, порт для авторизации, порт для учета) set radius server 127.0.0.1 mpd Super!P33a 1812 1813 # Таймаут для RADIUS set radius timeout 10 # Дополнительный конфигурационный файл для RADIUS set radius config /usr/local/etc/mpd4/radius.conf # Количество попыток соединения с сервером RADIUS set radius retries 3 # Включить учет RADIUS set auth enable radius-acct # Включить авторизацию RADIUS set auth enable radius-auth # Включить eap set link enable eap # Проксировать eap-запросы set eap enable radius-proxy pptp0: set link type pptp pptp1: set link type pptp pptp2: set link type pptp … pptp49: set link type pptp # Данные для соединения с сервером учета acct 127.0.0.1 Super!P33a # Данные для соединения с сервером авторизации и аутентификации auth 127.0.0.1 Super!P33a # Определение путей, необходимых для работы сервера prefix = /usr/local exec_prefix = ${prefix} sysconfdir = ${prefix}/etc localstatedir = /var sbindir = ${exec_prefix}/sbin logdir = /var/log raddbdir = ${sysconfdir}/raddb radacctdir = ${logdir}/radacct confdir = ${raddbdir} run_dir = ${localstatedir}/run/radiusd log_file = ${logdir}/radius.log libdir = ${exec_prefix}/lib pidfile = ${run_dir}/radiusd.pid checkrad = ${sbindir}/checkrad max_requests = 512 # Максимальное количество запросов # Слушать только на локальном интерфейсе bind_address = 127.0.0.1 hostname_lookups = no # Не разрешать имена хостов # Не убирать пробелы из имен пользователей nospace_user = no security { # Настройки безопасности # Ограничение максимального количества принимаемых атрибутов до 200 max_attributes = 200 reject_delay = 1 # Задержка после отказа в доступе 1с # Сервер не будет отвечать на запросы типа Status-Server status_server = no } # Подключить файл с конфигурацией клиентов NAS $INCLUDE ${confdir}/clients.conf snmp = no # Не использовать SNMP thread pool { # Конфигурация потоков start_servers = 5 # Начальное количество потоков 5 # Максимальное количество потоков 32 max_servers = 32 # Минимум свободных потоков 3 min_spare_servers = 3 # Максимум свободных потоков 10 max_spare_servers = 10 max_requests_per_server = 0 # Предельное значение выполненных запросов после которого поток останавливается #(необходимо использовать при утечках ресурсов; нет необходимости задавать # это значение при нормальной работе сервера) } modules { # Конфигурация модулей # Подключаем отдельный конфигурационный файл для EAP $INCLUDE ${confdir}/eap.conf mschap { # Разрешаем использовать MSCHAP } # Модуль создает уникальный идентификатор сессии на основе # нижеследующих атрибутов и добавляет его в учетные пакеты acct_unique { key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port" } # Подключаем отдельный конфигурационный файл для работы с БД $INCLUDE ${confdir}/sql.conf # Модуль создает файл типа utmp с информацией кто и откуда в данный момент работает radutmp { # Путь к файлу utmp filename = ${logdir}/radutmp # Атрибут, из которого берем имя пользователя username = %{User-Name} case_sensitive = yes # Думаю, понятно # Запрашивать информацию у NAS check_with_nas = yes perm = 0600 # Файл доступен только callerid = "yes" # Записывать IP } } authorize { # Модуль авторизации sql # Использовать SQL } authenticate { # Модуль аутентификации # использовать MSCHAP (запасной вариант) Auth-Type MS-CHAP { mschap } eap # Использовать EAP } preacct { # Предучетный модуль # Создать уникальный идентификатор сессии перед началом учета acct_unique } accounting { # Учетный модуль # Писать соответствующую информацию файл utmp radutmp sql # Учет работы пользователей в БД } session { # База данных сессий, используется для проверки одновременного использования sql # Для этих целей использовать mysql } client 127.0.0.1 { secret = Super!P33a shortname= MPD nastype = other } vpn-s# rm –r /usr/local/etc/raddb/certs/* vpn-s# cd /usr/local/etc/raddb/certs/ vpn-s#openssl dhparam -check -text -5 2048 -out dh vpn-s# ln -s /dev/urandom /usr/local/etc/raddb/certs/random #!/bin/sh # Начнем с чистого листа rm -rf demoCA # Создаем новый самоподписанный сертификат и закрытый ключ к нему. # После запроса файл newreq.pem будет содержать закрытый ключ и сертификат openssl req -new -x509 -keyout newreq.pem -out newreq.pem -days 730 -passin pass:My3ecret -passout pass:My3ecret -subj '/C=RU/ST=Russia/L=Moscow/O=Testco/OU=IT/CN=Testco CA/emailAddress=admin@testco.ru' # Создаем новый центр сертификации, корневым сертификатом которого будет сертификат из файла newreq.pem echo "newreq.pem" | CA.pl -newca >/dev/null # Создадим файл в формате PKCS#12, используя, созданные ранее закрытый ключ и сертификат. # Сертификат в файле demoCA/cacert.pem тот же, что и в файле newreq.pem. # Вместо использования ключа «-in #demoCA/cacert.pem» мы могли бы использовать ключ «-in newreq.pem» # и тогда можно было бы опустить ключ «-inkey newreq.pem», потому как файл newreq.pem содержит в себе # и закрытый ключ и сертификат openssl pkcs12 -export -in demoCA/cacert.pem -inkey newreq.pem -out root.p12 -cacerts -passin pass:My3ecret -passout pass:My3ecret # Извлекаем из созданного файла в формате PKCS#12 сертификат и закрытый ключ и записываем их # в новый файл PEM-формата root.pem openssl pkcs12 -in root.p12 -out root.pem -passin pass:My3ecret -passout pass:My3ecret # Зачистка rm newreq.pem vpn-s# ./root.sh #!/bin/sh # Делаем запрос на новый сертификат в формате PKCS#10 openssl req -new -newkey rsa:2048 -keyout server.key -out newreq.pem -days 730 -passin pass:My3ecret -passout pass:My3ecret -subj '/C=RU/ST=Russia/L=Moscow/O=Testco/OU=IT/CN=vpn-s.testco.ru/emailAddress=admin@testco.ru' # Подписываем запрос на сертификат. Ключ -infiles указывает на запрос созданный предыдущей командой, # вывод идет в файл #newcert.pem. Ключ -extensions необходим для добавления OID-проверки подлинности сервера openssl ca -policy policy_anything -out server.crt -passin pass:My3ecret -key My3ecret –extensions xpserver_ext -extfile xpextensions -infiles newreq.pem # Зачистка rm newreq.pem vpn-s# ./server.sh #!/bin/sh # Делаем запрос на новый сертификат в формате PKCS#10 openssl req -new -keyout newreq.pem -out newreq.pem -days 730 -passin pass:My3ecret -passout pass:My3ecret -subj '/C=RU/ST=Russia/L=Moscow/O=Testco/OU=IT/CN=Igor Ivanov/emailAddress=ivanov.i@testco.ru' # Подписываем запрос на сертификат # Ключ -infiles указывает на запрос созданный предыдущей командой, вывод идет в файл newcert.pem. # Ключ -extensions необходим для добавления OID-проверки подлинности сервера openssl ca -policy policy_anything -out newcert.pem –passin pass:My3ecret -key My3ecret --extensions xpclient_ext -extfile xpextensions -infiles newreq.pem # Создадим файл cert-srv.p12 формата PKCS#12 из находящихся в файле newreq.pem, # нового сертификата и его закрытого ключа openssl pkcs12 -export -in newcert.pem -inkey newreq.pem –out ivanov_igor.p12 -clcerts -passin pass:My3ecret -passout pass:My3ecret # Зачистка vpn-s# ./client.sh # Расширяемый Протокол Аутентификации # # Для всех видов EAP-аутентификации eap { # Какой тип EAP-аутентификации применить, когда получен EAP-идентификатор default_eap_type = tls # Таймер по умолчанию для очистки списка EAP # Он служит для сопоставления полученных EAP-ответов с отправленными EAP-запросами timer_expire = 60 # Поддерживаемые типы EAP # md5 { # } # Секция EAP-TLS tls { private_key_password = whatever private_key_file = /usr/local/etc/raddb/certs/server.key # Иногда закрытый ключ и сертификат расположены в одном файле, тогда директивы private_key_file # и certificate_file должны иметь одно и то же значение certificate_file = /usr/local/etc/raddb/certs/server.pem # Список корневых центров сертификации CA_file = /usr/local/etc/raddb/certs/root.pem # Файлы, необходимые для работы протокола TLS dh_file = /usr/local/etc/raddb/certs/DH random_file = /dev/urandom # Это значение никогда не должно превышать MAX_RADIUS_LEN (4096), предпочтительно должно # составлять половину значения MAX_RADIUS_LEN, для того чтобы другие атрибуты # могли поместиться в радиус-пакет. На большинстве точек доступа значение максимальной # длины пакета сконфигурировано между 1500-1600. В таком случае, размер фрагмента # должен быть <=1024 fragment_size = 1024 # include_length – это флаг, который по умолчанию установлен в значение «да». Если он установлен # в значение «да», общая длина сообщения включается в каждый отправляемый пакет. Если он установлен # в значение «нет», полная длина сообщения включается только в первый пакет серии фрагментов include_length = yes # В данном случае нет необходимости делать проверку по спискам отозванных сертификатов, потому что # удалить пользователя из базы проще, чем генерировать новый crl #check_crl = no } } sql { driver = "rlm_sql_mysql" # Тип SQL-базы MySQL # Имя хоста или IP-адрес сервера MySQL, в нашем случае это localhost server = "localhost" # Логин пользователя MySQL созданного специально для работы с базой RADIUS login = "freeradius" password = "d1ametR" # Eго пароль radius_db = "radius" # Название базы acct_table1 = "radacct" # Первая таблица учета acct_table2 = "radacct" # Вторая таблица учета # Таблица проверяемых атрибутов authcheck_table = "radcheck" # Таблица выдаваемых атрибутов authreply_table = "radreply" # Таблица проверяемых атрибутов для групп groupcheck_table = "radgroupcheck" # Таблица выдаваемых атрибутов для групп groupreply_table = "radgroupreply" # Таблица соответствия пользователей и групп usergroup_table = "usergroup" # Удалять подвисшие сессии deletestalesessions = "yes" sqltrace = "no" # Не писать в файл SQL-запросы sqltracefile = "${logdir}/sqltrace.sql" # Количество одновременно открытых SQL-соединений num_sql_socks = 5 # Задержка перед повторной попыткой, после неудачного соединения connect_failure_retry_delay = 60 # Получить значение атрибута %{SQL-User-Name} из атрибута %{User-Name} sql_user_name = "%{User-Name}" # Проверка атрибутов во время авторизации authorize_check_query = "SELECT id, UserName, Attribute, Value, op FROM ${authcheck_table} WHERE Username = '%{SQL-User-Name}' ORDER BY id" # Выдача атрибутов во время авторизации authorize_reply_query = "SELECT id, UserName, Attribute, Value, op FROM ${authreply_table} WHERE Username = '%{SQL-User-Name}' ORDER BY id" # Проверка атрибутов для групп во время авторизации authorize_group_check_query = "SELECT ${groupcheck_table}.id, ${groupcheck_table}.GroupName, ${groupcheck_table}.Attribute, ${groupcheck_table}.Value, ${groupcheck_table}.op FROM ${groupcheck_table}, ${usergroup_table} WHERE ${usergroup_table}.Username = '%{SQL-User-Name}' AND ${usergroup_table}.GroupName = ${groupcheck_table}.GroupName ORDER BY ${groupcheck_table}.id" # Выдача атрибутов для групп во время авторизации authorize_group_reply_query = "SELECT ${groupreply_table}.id, ${groupreply_table}.GroupName, ${groupreply_table}.Attribute, ${groupreply_table}.Value, ${groupreply_table}.op FROM ${groupreply_table}, ${usergroup_table} WHERE ${usergroup_table}.Username = '%{SQL-User-Name}' AND ${usergroup_table}.GroupName = ${groupreply_table}.GroupName ORDER BY ${groupreply_table}.id" # Запрос управления учетом accounting_onoff_query = "UPDATE ${acct_table1} SET AcctStopTime='%S', AcctSessionTime=unix_timestamp('%S') - unix_timestamp(AcctStartTime), AcctTerminateCause= '%{Acct-Terminate-Cause}', AcctStopDelay = '%{Acct-Delay-Time}' WHERE AcctSessionTime=0 AND AcctStopTime=0 AND NASIPAddress= '%{NAS-IP-Address}' AND AcctStartTime <= '%S'" # Запрос обновления данных учета accounting_update_query = "UPDATE ${acct_table1} SET FramedIPAddress = '%{Framed-IP-Address}', AcctSessionTime = '%{Acct-Session-Time}', AcctInputOctets = '%{Acct-Input-Octets}', AcctOutputOctets = '%{Acct-Output-Octets}' WHERE AcctSessionId = '%{Acct-Session-Id}' AND UserName = '%{SQL-User-Name}' AND NASIPAddress= '%{NAS-IP-Address}'" # Запрос начала учета accounting_start_query = "INSERT into ${acct_table1} (AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, FramedProtocol, FramedIPAddress, AcctStartDelay, AcctStopDelay) values('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{NAS-Port}', '%{NAS-Port-Type}', '%S', '0', '0', '%{Acct-Authentic}', '%{Connect-Info}', '', '0', '0', '%{Called-Station-Id}', '%{Calling-Station-Id}', '', '%{Service-Type}', '%{Framed-Protocol}', '%{Framed-IP-Address}', '%{Acct-Delay-Time}', '0')" # Запрос окончания учета accounting_stop_query = "UPDATE ${acct_table2} SET AcctStopTime = '%S', AcctSessionTime = '%{Acct-Session-Time}', AcctInputOctets = '%{Acct-Input-Octets}', AcctOutputOctets = '%{Acct-Output-Octets}', AcctTerminateCause = '%{Acct-Terminate-Cause}', AcctStopDelay = '%{Acct-Delay-Time}', ConnectInfo_stop = '%{Connect-Info}' WHERE AcctSessionId = '%{Acct-Session-Id}' AND UserName = '%{SQL-User-Name}' AND NASIPAddress = '%{NAS-IP-Address}'" # Проверка одновременных соединений simul_verify_query = "SELECT RadAcctId, AcctSessionId, UserName, NASIPAddress, NASPortId, FramedIPAddress, CallingStationId, FramedProtocol FROM ${acct_table1} WHERE UserName='%{SQL-User-Name}' AND AcctStopTime = 0" # Запрос информации о членстве пользователей в группах group_membership_query = "SELECT GroupName FROM ${usergroup_table} WHERE UserName='%{SQL-User-Name}'" } vpn-s# cp /usr/local/etc/raddb/dictionary.sample /usr/local/etc/raddb/dictionary $INCLUDE /usr/local/share/freeradius/dictionary.mpd #---------------------------------------------------------- # dictionary.mpd VENDOR mpd 12341 ATTRIBUTE mpd-rule 1 string mpd ATTRIBUTE mpd-pipe 2 string mpd ATTRIBUTE mpd-queue 3 string mpd #---------------------------------------------------------- vpn-s# cp /usr/local/etc/raddb/huntgroups.sample /usr/local/etc/raddb/huntgroups vpn-s# /usr/local/etc/raddb/hints.sample /usr/local/etc/raddb/hints vpn-s# cd /usr/ports/databases/mysql50-server vpn-s# make install clean vpn-s# echo 'mysql_enable="YES"' >> /etc/rc.conf vpn-s# mysql mysql> CREATE DATABASE radius; mysql> use radius mysql> SOURCE /usr/local/share/doc/freeradius/examples/mysql.sql mysql> GRANT ALL PRIVILEGES ON radius.* to 'freeradius'@'localhost' IDENTIFIED BY 'd1ametR'; mysql> FLUSH PRIVILEGES; mysql>exit vpn-s# mysql –e ‘ INSERT INTO usergroup (UserName, GroupName, priority) VALUES ("Igor Ivanov", " RDP_USERS",1)’ radius vpn-s# mysql –e ‘ INSERT INTO usergroup (UserName, GroupName, priority) VALUES ("Olga Petrova", " HTTP_USERS",1)’ radius vpn-s# mysql –e ‘ INSERT INTO usergroup (UserName, GroupName, priority) VALUES ("Vladimir Sidorov", " ICA_USERS",1)’ radius vpn-s# mysql –e ‘INSERT INTO radgroupcheck (id, GroupName, Attribute, op, Value) VALUES (10, "RDP_USERS", "Auth-Type", ":=", "EAP")’ radius vpn-s# mysql –e ‘INSERT INTO radgroupcheck (id, GroupName, Attribute, op, Value) VALUES (20, "HTTP_USERS", "Auth-Type", ":=", "EAP") ’ radius vpn-s# mysql –e ‘INSERT INTO radgroupcheck (id, GroupName, Attribute, op, Value) VALUES (30, "ICA_USERS", "Auth-Type", ":=", "EAP") ’ radius vpn-s# mysql –e ‘INSERT INTO radgroupreply (id, GroupName, Attribute, op, Value) VALUES (10, "RDP_USERS", "mpd-rule","+="," 100=allow tcp from any to 192.168.0.10/24 3389 keep-state")’ radius vpn-s# mysql –e ‘INSERT INTO radgroupreply (id, GroupName, Attribute, op, Value) VALUES (20, "HTTP_USERS", "mpd-rule","+="," 100=allow tcp from any to 192.168.0.11/24 80,443 keep-state")’ radius vpn-s# mysql –e ‘INSERT INTO radgroupreply (id, GroupName, Attribute, op, Value) VALUES (30, "RDP_USERS", "mpd-rule","+="," 100=allow tcp from any to 192.168.0.0/24{12-15} 1494 keep-state")’ radius startup: log +radius2 +ipcp2 +iface2 ----------------------------------------------------------------------------------------------------------------- Cacti – простой и удобный инструмент для мониторинга и анализа сети Сергей Яремчук $ sudo apt-cache search cacti $ sudo apt-cache depends cacti $ sudo apt-get -d install cacti $ wget -c http://www.cacti.net/downloads/cacti-0.8.6j.tar.gz $ cd /var/www $ tar -xzvf /tmp/cacti-0.8.6j.tar.gz $ sudo cd cacti-0.8.6j $ sudo wget http://www.cacti.net/downloads/patches/0.8.6j/ping_php_version4_snmpgetnext.patch $ sudo wget http://www.cacti.net/downloads/patches/0.8.6j/tree_console_missing_hosts.patch $ sudo wget http://www.cacti.net/downloads/patches/0.8.6j/thumbnail_graphs_not_working.patch $ sudo wget http://www.cacti.net/downloads/patches/0.8.6j/graph_debug_lockup_fix.patch $ sudo patch -p1 -N < ping_php_version4_snmpgetnext.patch $ sudo patch -p1 -N < tree_console_missing_hosts.patch $ sudo patch -p1 -N < thumbnail_graphs_not_working.patch $ sudo patch -p1 -N < graph_debug_lockup_fix.patch $ cat /etc/cacti/apache.conf Alias /cacti /usr/share/cacti/site Options +FollowSymLinks AllowOverride None order allow,deny allow from all $ sudo mv cacti-0.8.6j cacti $ sudo /etc/init.d/mysql start $ mysqladmin --user=root create cacti $ mysql -u root cacti < cacti.sql $ mysql -u root cacti < cacti.sql $ mysql -u root cacti mysql> GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'cactipassword'; $ sudo apt-cache search cacti $ mcedit ./include/config.php /* make sure these values refect your actual database/host/user/password */ $database_type = "mysql"; $database_default = "cacti"; $database_hostname = "localhost"; $database_username = "cactiuser"; $database_password = "cactipassword"; $database_port = "3306"; $ sudo adduser --no-create-home --disabled-password --disabled-login cactiuser $ sudo chown -R www-data:www-data cacti/ $ sudo chown -R cactiuser cacti/rra/ cacti/log/ $ sudo mcedit /etc/crontab */5 * * * * cactiuser php /var/www/cacti/poller.php >/dev/null 2>/var/log/cacti/poller-error.log $ sudo php /var/www/cacti/poller.php $ cd cacti; sudo tar -xzvf /home/grinder/source/cacti/cacti-plugin-arch.tar.gz $ sudo patch -p1 -N < cacti-plugin-arch/cacti-plugin-0.8.6j.diff $config['url_path'] = "/"; $config['url_path'] = "/cacti/"; $ cd cacti/plugins $ tar xzvf discovery-0.7.tar.gz $ mysql -u root -p cacti < discovery/discover.sql $plugins = array(); $plugins[] = 'discovery'; ----------------------------------------------------------------------------------------------------------------- Как проводить сбор системных сообщений в гетерогенной сети Андрей Бирюков <Приоритет>Дата -время ИМЯ_УЗЛА Метка:Сообщение. SELECT * FROM Application LogParser "SELECT * FROM Application" LogParser file:query.sql SELECT STRCAT( EXTRACT_TOKEN( Strings, 1, '|'), STRCAT( '\\', EXTRACT_TOKEN( Strings, 0, '|' ) ) ) AS User, COUNT(*) AS Total FROM Security WHERE EventType = 16 AND EventCategory = 2 GROUP BY User ORDER BY Total DESC SELECT COUNT(EventID) AS TotalLogonFailures, TO_LOWERCASE(EXTRACT_TOKEN(Strings,0,'|')) AS User, TO_LOWERCASE(EXTRACT_TOKEN(Strings,1,'|')) AS Domain, TO_LOWERCASE(EXTRACT_TOKEN(Strings,5,'|')) AS WorkStation, CASE TO_INT(EXTRACT_TOKEN(Strings,2,'|')) WHEN 2 THEN 'Interactive ' WHEN 3 THEN 'Network' WHEN 4 THEN 'Batch' WHEN 5 THEN 'Service' WHEN 6 THEN 'Proxy ' WHEN 7 THEN 'Unlock ' WHEN 8 THEN 'NetworkCleartext' WHEN 9 THEN 'NewCredentials ' WHEN 10 THEN 'RemoteInteractive ' WHEN 11 THEN 'CachedInteractive' WHEN 12 THEN 'CachedRemoteInteractive' WHEN 13 THEN 'CachedUnlock' ELSE EXTRACT_TOKEN(Strings,2,'|') END AS Type INTO DATAGRID FROM \\%machine%\security WHERE EventID IN (529) GROUP BY User,Domain,WorkStation,Type ORDER BY TotalLogonFailures DESC Logparser file:query.sql?machine=Имя_машины SELECT Text FROM ERRORLOG WHERE Text LIKE '%master%' GROUP BY Text Option Explicit Dim objShell, stroka // Объявляем переменные stroka="LogParser ""SELECT Text FROM ERRORLOG WHERE (Text LIKE '%" & Date() &" " & Time() &"%') AND (Text LIKE '%master%') GROUP BY Text""" // В данном случае удобнее передать запросы LogParser в командной строке, а не в отдельном файле // ищем строку, содержащую текущую дату и время (без секунд), и название базы master // Объект командная строка Set objShell = CreateObject("WScript.Shell") // Выполняем строку с переданным запросом objShell.run (stroka) WScript.Quit // Завершаем работу сценария // Адрес URI SELECT EXTRACT_TOKEN(FullUri, 0, '|') AS Uri, // Сообщение об ошибке EXTRACT_TOKEN(cs-uri-query, -1, '|') AS ErrorMsg, // Номер строки EXTRACT_TOKEN(cs-uri-query, 1, '|') AS LineNo, COUNT(*) AS Total // Количество строк USING STRCAT( cs-uri-stem, REPLACE_IF_NOT_NULL(cs-uri-query, STRCAT('?', cs-uri-query))) AS FullUri FROM ex*.log // Файлы, из которых делать выборку // Условие выборки WHERE (sc-status = 500) AND (cs-uri-stem LIKE '%.asp') GROUP BY Uri, ErrorMsg, LineNo ORDER BY Total DESC SELECT cs-username, sc-status, COUNT(*) AS Total FROM ex*.log // Коды ошибок WHERE cs-username IS NOT NULL AND sc-status BETWEEN 401 AND 403 GROUP BY cs-username,sc-status // Имя пользователя ORDER BY Total DESC LogParser file:query.sql -o:SYSLOG SELECT TimeGenerated, // Время создания CASE SourceName // Смотрим источник сообщения // В зависимости от источника события в формате // EventLog, создаем источник в формате SYSLOG WHEN 'EventLog' THEN 'mark' WHEN 'Service Control Manager' THEN 'daemon' WHEN 'Print' THEN 'lpr' WHEN 'Kerberos' THEN 'auth' WHEN 'NETLOGON' THEN 'logaudit' WHEN 'Application Popup' THEN 'local7' ELSE 'local0' END AS MyFacility, // Здесь в зависимости от типа события // определяем важность SYSLOG CASE EventTypeName WHEN 'Error event' THEN 'err' WHEN 'Warning event' THEN 'warning' WHEN 'Information event' THEN 'info' ELSE 'info' END AS MySeverity, ComputerName, // Имя машины отправителя STRCAT(SourceName, ':'), // Имя в формате SYSLOG Message // Сообщение // Сообщения отправляются на сервер SYSLOG и в локальный файл INTO @MYSERVER04,Log.txt FROM System // Журнал System SELECT TO_TIMESTAMP(date, time), CASE sc-status WHEN 500 THEN 'emerg' // Определяем тип события ELSE 'err' END AS MySeverity, s-computername AS MyHostname, // Имя машины cs-uri-stem, sc-status INTO @MYSERVER04 // Источник передается как параметр в командной строке FROM <1> WHERE sc-status >= 400 // Номер ошибки 400 и более SELECT CASE SourceName // Смотрим источник сообщения // В зависимости от источника события в формате // EventLog, создаем источник в формате SYSLOG WHEN 'EventLog' THEN 'mark' WHEN 'Service Control Manager' THEN 'daemon' WHEN 'Print' THEN 'lpr' WHEN 'Kerberos' THEN 'auth' WHEN 'NETLOGON' THEN 'logaudit' WHEN 'Application Popup' THEN 'local7' ELSE 'local0' END AS MyFacility, // Здесь в зависимости от типа события определяем // важность SYSLOG CASE EventTypeName WHEN 'Error event' THEN 'err' WHEN 'Warning event' THEN 'warning' WHEN 'Information event' THEN 'info' ELSE 'info' END AS MySeverity, ComputerName, // Имя машины отправителя // Имя в формате SYSLOG STRCAT(SourceName, ':'), // Сообщение COUNT(EventID) AS TotalLogonFailures, TO_LOWERCASE(EXTRACT_TOKEN(Strings,0,'|')) AS User, TO_LOWERCASE(EXTRACT_TOKEN(Strings,1,'|')) AS Domain, TO_LOWERCASE(EXTRACT_TOKEN(Strings,5,'|')) AS WorkStation, CASE TO_INT(EXTRACT_TOKEN(Strings,2,'|')) WHEN 2 THEN 'Interactive ' WHEN 3 THEN 'Network' WHEN 4 THEN 'Batch' WHEN 5 THEN 'Service' WHEN 6 THEN 'Proxy ' WHEN 7 THEN 'Unlock ' WHEN 8 THEN 'NetworkCleartext' WHEN 9 THEN 'NewCredentials ' WHEN 10 THEN 'RemoteInteractive ' WHEN 11 THEN 'CachedInteractive' WHEN 12 THEN 'CachedRemoteInteractive' WHEN 13 THEN 'CachedUnlock' ELSE EXTRACT_TOKEN(Strings,2,'|') END AS Type, message INTO @MYSERVER04 FROM \\%machine%\security WHERE EventID IN (529) GROUP BY User,Domain,WorkStation,Type ORDER BY TotalLogonFailures DESC Option Explicit Dim objShell, stroka // Объявляем переменные stroka="LogParser ""SELECT Text INTO @MYSERVER04 FROM ERRORLOG WHERE (Text LIKE '%" & Date() &" " & Time() &"%') AND (Text LIKE '%master%') GROUP BY Text""" // В данном случае удобнее передать запросы LogParser в командной строке, а не в отдельном файле. // Ищем строку, содержащую текущую дату и время (без секунд), и название базы master // Объект командная строка Set objShell = CreateObject("WScript.Shell") // Выполняем строку с переданным запросом objShell.run (stroka) WScript.Quit // Завершаем работу сценария ----------------------------------------------------------------------------------------------------------------- Sender Policy Framework как средство борьбы со спамом Сергей Яремчук example.com. IN TXT "v=spf1 +mx ip4:192.168.0.0/24 a:mail.example.com -all" example.com. IN SPF "v=spf1 +mx ip4:192.168.0.0/24 a:mail.example.com -all" example.com. IN TXT "v=spf1 +mx include: example.net include:example.org -all" $ spfqtool -i 194.144.197.145 -s grinder@ua.fm -h ua.fm $ perl -MCPAN -e shell cpan> install Mail::SPF cpan> install NetAddr::IP cpan> q $ wget –c http://www.openspf.org/blobs/postfix-policyd-spf-perl-2.002.tar.gz $ tar xzvf postfix-policyd-spf-perl-2.002.tar.gz $ sudo cp postfix-policyd-spf-perl/postfix-policyd-spf-perl/uar/lib/perl/ $ perl /usr/lib/perl/policyd-spf-perl policy unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/lib/perl/policyd-spf-perl smtpd_recipient_restrictions = ... reject_unauth_destination check_policy_service unix:private/policy ... $ sudo /etc/init.d/postfix restart $ perl /usr/lib/perl/policyd-spf-perl ----------------------------------------------------------------------------------------------------------------- Администрирование учетных записей в домене Active Directory Александр Емельянов cn="Иван Иванов", cn="Users", dc="hq", dc="local" ----------------------------------------------------------------------------------------------------------------- Создаём собственный хостинг, или Сам себе ISP Андрей Шетухин include GENERIC ident SMP-GENERIC-STELLAR options SMP options SUIDDIR options SYSVSHM options SYSVSEM options SYSVMSG options SHMMAXPGS=65536 options SEMMNI=40 options SEMMNS=240 options SEMUME=40 options SEMMNU=120 options MAXDSIZ=(1024UL*1024*1024) options MAXSSIZ=(128UL*1024*1024) options DFLDSIZ=(1024UL*1024*1024) cd /usr/src make buildkernel KERNCONF=SMP-stellar make installkernel KERNCONF=SMP-stellar shutdown -r now /dev/ar0s1g /home ufs rw,suiddir,noatime 2 2 umount /home mount /home mount | grep /home cd /usr/ports/databases/mysql51-server export WITH_CHARSET=cp1251 export WITH_XCHARSET=all export BUILD_OPTIMIZED=yes make install clean # # MySQL for virtual hosts # mysql_enable="YES" [client] port = 3306 socket = /tmp/mysql.sock default-character-set=cp1251 [mysqld] bind-address = 127.0.0.1 port = 3306 socket = /tmp/mysql.sock skip-character-set-client-handshake default-character-set=cp1251 skip-locking key_buffer = 32M max_allowed_packet = 16M table_cache = 256 sort_buffer_size = 1M read_buffer_size = 1M read_rnd_buffer_size = 4M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size = 16M thread_concurrency = 8 max_connections = 128 max_user_connections = 126 log-slow-queries log binlog_ignore_db = mysql expire_logs_days = 5 max_binlog_size = 400M # Если нет необходимости в работе по сети, включаем опцию skip-networking #skip-networking log-bin = mysql-bin server-id = 1 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [isamchk] key_buffer = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [myisamchk] key_buffer = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout /usr/local/etc/rc.d/mysql-server start ps axw | grep mysql mysq -uroot cd /usr/ports/www/nginx make install clean cd /usr/ports/www/apache13 export WITH_APACHE_SUEXEC=yes export APACHE_SUEXEC_LOG=/var/log/apache/suexec_log export APACHE_SUEXEC_USERDIR=www make install clean cd /usr/ports/www/mod_realip make install clean cd /usr/ports/lang/php5 fetch http://www.reki.ru/hosting/patch-main::open_temporary_file.c.5 mv patch-main::open_temporary_file.c.5 files/ make install clean echo "" | php cd /usr/ports/lang/php5-extensions make install clean cd /usr/ports/www/php5-session make install clean cd /usr/ports/graphics/php5-gd make install clean ... # # Nginx Accelerator # nginx_enable="YES" # # Apache Backend # apache_enable="YES" user www; worker_processes 2; pid /var/run/nginx.pid events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log off; sendfile on; keepalive_timeout 65; gzip on; server { listen XXX.YYY.ZZZ.DDD:80; server_name localhost; location / { # Максимальный размер отдаваемого файла client_max_body_size 20M; # Адрес, на который будем проксировать proxy_pass http://127.0.0.1:80; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_send_lowat 12000; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_temp_path /var/tmp/nginx; } } } LoadModule realip_module libexec/apache/mod_realip.so ServerName 127.0.0.1 Listen 127.0.0.1:80 RealIP localhost on AllowOverride All Options +Indexes +ExecCGI FollowSymLinks DirectoryIndex index.php index.html index.htm AllowOverride All Options -Indexes +ExecCGI FollowSymLinks DirectoryIndex index.cgi index.html index.htm index.cgi NameVirtualHost 127.0.0.1:80 /usr/local/etc/rc.d/nginx start /usr/local/etc/rc.d/apache.sh start ps axw | grep nginx ps axw | grep httpd cd /usr/ports/ftp/pure-ftpd make install clean # # BILLING DATABASE # postgresql_enable="YES" mkdir /var/db/pgsql chown pgsql:pgsql /var/db/pgsql chmod 0700 /var/db/pgsql pw usermod pgsql -d /var/db/pgsql su - pgsql initdb --encoding=UTF8 --locale=ru_RU.UTF-8 --pgdata=/var/db/pgsql/data max_connections = 150 shared_buffers = 40MB max_fsm_pages = 76800 log_destination = 'syslog' silent_mode = on autovacuum = on 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' # TYPE DATABASE USER CIDR-ADDRESS METHOD # "local" is for Unix domain socket connections only local all all md5 # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5 /usr/local/etc/rc.d/postgresql start ps axw | grep postgres ChrootEveryone yes BrokenClientsCompatibility no MaxClientsNumber 50 Daemonize yes MaxClientsPerIP 8 VerboseLog no DisplayDotFiles yes AnonymousOnly no NoAnonymous yes SyslogFacility ftp DontResolve yes MaxIdleTime 15 PGSQLConfigFile /usr/local/etc/pureftpd-pgsql.conf LimitRecursion 2000 8 AnonymousCanCreateDirs no MaxLoad 4 AntiWarez yes Umask 110:007 MinUID 100 AllowUserFXP no AllowAnonymousFXP no ProhibitDotFilesWrite no ProhibitDotFilesRead no AutoRename no AnonymousCantUpload no MaxDiskUsage 99 CustomerProof yes PGSQLServer 127.0.0.1 PGSQLPort 5432 PGSQLUser pureftpd PGSQLPassword topsecret PGSQLDatabase billing PGSQLCrypt cleartext PGSQLGetPW SELECT passwd FROM ftp.ftpusers WHERE ftpuser='\L' AND enabled = 1 PGSQLGetUID SELECT user_id FROM ftp.ftpusers WHERE ftpuser='\L' AND enabled = 1 PGSQLGetGID SELECT group_id FROM ftp.ftpusers WHERE ftpuser='\L' AND enabled = 1 PGSQLGetDir SELECT homedir FROM ftp.ftpusers WHERE ftpuser='\L' AND enabled = 1 psql -U pgsql CREATE USER billing WITH PASSWORD='supersecret' NOCREATEDB NOCREATEUSER; CREATE DATABASE billing WITH ENCODING='UTF8' OWNER=billing; CREATE SCHEMA ftp; CREATE TABLE ftp.ftpusers ( ftpuser VARCHAR(255) NOT NULL CHECK (LENGTH(ftpuser) > 0), passwd VARCHAR(255) NOT NULL CHECK (LENGTH(passwd) > 0), user_id INT NOT NULL DEFAULT '-1', group_id INT NOT NULL DEFAULT '-1', homedir VARCHAR(255) NOT NULL CHECK (LENGTH(homedir) > 0), expires bigint not null default '-1', enabled bigint not null default '0', descr text, CONSTRAINT ftpusers_pk PRIMARY KEY (ftpuser) ) WITHOUT OIDS; CREATE USER pureftpd WITH PASSWORD 'topsecret' NOCREATEDB NOCREATEUSER; GRANT SELECT ON ftp.ftpusers TO pureftpd; ----------------------------------------------------------------------------------------------------------------- xAjax – простой путь создания асинхронных веб-приложений Виктор Ермолаев Листинг 1 01 02 03 test 04 05 printJavascript(""); 07 ?> 08 09 23 24
25

Данные

26 // Введите id // 27
28 33
34 // Загрузка... // 35
36
37
38

Редактирование

39 41 Field-1  42
43 Field-2  44
45 46 47
48
49
50 51 Листинг 2 поле1 - ".$data["field1"]." поле2 - ".$data["field2"]; 17 $objResponse->assign("data","innerHTML",$response); 18 $script = "document.getElementById('editF1').value=".$data["field1"]."; document.getElementById('editF2').value='".$data["field2"]."';"; 19 $objResponse->script($script); 20 return $objResponse; 21 } 22 function updateData($frmData) 23 { 24 $query = "UPDATE mytable SET field2='".$frmData["editF2"]."' WHERE field1=".$frmData["editF1"]; 25 $result = mysql_query($query) or die("Query failed : ". mysql_error()); 26 mysql_free_result($result); 27 } 28 $xajax = new xajax(); 29 $xajax->setFlag('DecodeUTF8Input', true); 30 //$xajax->setFlag('debug', true); 31 $xajax->registerFunction("getData"); 32 $xajax->registerFunction("updateData"); 33 $xajax->processRequest(); 34 ?> ----------------------------------------------------------------------------------------------------------------- Защита веб-служб. РНР-реализация Александр Календарев Листинг 1. Место WS-Security в SOAP-сообщении
. . .
...
Листинг 2. Криптозащита SOAP-сообщения
< en:Encryption Method … /> … <\dsKeyInfo> < en:CipherData> < en CipherValue>SFD0BZGwZY8KTbL... < en:CipherData> Листинг 3. Криптошаблон защищенного SOAP-сообщения
...
Листинг 4. Результат цифровой подписи XML-Документа (спецификация XML-Signature)
... HjY8ilZAIEM2tBbPn5mYO1ieIX4= SIaj/6KY3C1SmDXU2++Gm31U1xTadFp04WhJ/ajq8/l4ncAi2 BgfsJFbxrL+q7GKSKN9kfQ+UpN9+iD5fWmuavXEHe4Gw6R ... .................................................. ... hWYJ4ewZJ4hM4JjbFqZO+OEzDRSbw3DkmuBA/mtlx+3t13 5hqoMdVmtth/eTb64dsPdl9r 3k1ACVX9f8aHfQQdJOmLFQ== MIIE3zCCBEigAwIBAgIBBTANBgkqhkiG9w0BAQQ owgb8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEw ... ........................................... ... Zm9ybmlhMT0wOwYDVQQKEzRYTUwgU2VjdXJp dHkgTGlicmFyeSAoaHR0cDovL3d3dy5hbGVrc2V5L==
...
Листинг 5. Приведение XML-Signature к WS-Security
gPC6vbTV50fxaXO/ZvOb6osvWmJpQBlJIOxRBcs2nS Y8MTqPgAa02gtaLQ6Thmpx1rc6VHuraLuIcsQ2BLu9 ............................................ REYvU2LtjCZfnBntDgvygJ1bzHCR8SxjzIAfHRsxpv== . . . . . . gPC6vbTV50fxaXO/ZvOb6osvWmJpQBlJIOxRBcs2nS Y8MTqPgAa02gtaLQ6Thmpx1rc6VHuraLuIcsQ2BLu9 ............................................ REYvU2LtjCZfnBntDgvygJ1bzHCR8SxjzIAfHRsxpv==
Листинг 6. Пример кода формирования шаблона с подписываемым XML-документом 01 $doc = new DOMDocument(); 02 $doc->loadXML( $dataTxt); 03 04 $tpl = new DOMDocument(); 05 $tpl->loadXML( $xml); 06 07 $root = $doc->documentElement; 08 $data =$tpl->importNode($root, true); 09 10 $body0 = $tpl->getElementsByTagName("Body"); 11 $body = $body0->item(0); 12 $body->appendChild( $data ); Листинг 7. Пример кода формирования подготовки данных для их цифровой подписи (XML-Signature) 01 $temp_path = "/home/akalend/tmp"; 02 $prefix = "in"; 03 $tmpfname = tempnam($temp_path , $prefix ); 04 $tpl->save($tmpfname); 05 06 $key="/home/akalend/xmlsec/rsakey.pem"; 07 $certFile="/home/akalend/xmlsec/rsacert.pem"; 08 09 $cmd="xmlsec1 --sign --privkey-pem $key,$certFile --id-attr:id body $tmpfname 2>&1"; Листинг 8. Пример кода формирования цифровой подписи XML-документа (XML-Signature) 01 $p = popen( $cmd, 'r'); 02 $readStream = ""; 03 while( !feof($p) ) 04 $readStream .= fread($p , 8192); 05 pclose($p); 06 07 if( strpos($readStream, "loadXML( $ readStream ); Листинг 9. Пример кода переноса данных из узла в узел 01 $x509cert = $doc-> getElementsByTagName("X509Certificate") -> item(0); 02 $bst = $doc -> getElementsByTagName("BinarySecurityToken") -> item(0); 03 $bst ->NodeValue = $ x509cert-> NodeValue; 04 05 $KeyInfo = $x509cert -> parentNode -> parentNode; 06 $KeyInfo->removeChild($x509cert -> parentNode ); $cmd="xmlsec1 --verify --trusted-pem $certFile --id-attr:id body $tmpfname 2>&1"; $cmd = "xmlsec1 encrypt --binary-data $tmpfnameDoc --privkey-pem $key,$certFile --session-key des-192 $tmpfnameTpl 2>&1" $cmd = "xmlsec1 dencrypt --pubkey-cert-pem $certFile $tmpfnameDoc 2>&1"; ----------------------------------------------------------------------------------------------------------------- bugtraq, стр. 67 GET /cgi-bin/AAAAAAAAAAAAA.... ----------------------------------------------------------------------------------------------------------------- Gnuplot. Графики заказывали? Евгений Балдин > sudo apt-get install gnuplot > tar xvfj gnuplot-4.2.0.tar.gz > cd gnuplot-4.2.0/ > ./configure --prefix=/usr/local --with-kpsexpand > make > make install > sudo apt-get install gnuplot gnuplot> cd "demo/" gnuplot> load "all.dem" gnuplot> help help gnuplot> ! ls *.tex gnuplot> set terminal png gnuplot> set output "myexample.png" gnuplot> help set terminal png gnuplot> set terminal dumb 50 20 gnuplot> set encoding koi8r gnuplot> plot [-3:3][-1:1.2] sin(x) t 'синус' # считаем число процессов каждые 5 минут */5 * * * * echo `date -R` `ps aux | grep ^postgres| wc -l` >> /home/baldin/connectcount.txt # Ось X – это время set xdata time # Формат временных данных. Описывается только структура вида # 28 Mar 2007 02:55:01, а день недели и зона игнорируются set timefmt "%d %b %Y %H:%M:%S" # Подпись для оси X set xlabel "Time" # Формат меток для оси Х set format x "%d/%m\n%H:%M" # Подпись для оси Y set ylabel "Connections" # Отрисовка решётки на графике set grid # Заголовок для графика set title "PostgreSQL activity" plot "connectcount.txt" using 2:7 title "" plot "connectcount.txt" using 2:($7-4) title "" plot [][-3:35] 32 with lines linewidth 3 title "Alert", 0 with lines linewidth 3 title "No User", "connectcount.txt" using 2:($7-4) title "" with lines gnuplot> help plot set encoding koi8r # Указываем Unicode-шрифт для png-терминала. # Для работы со шрифтом используется библиотека libgd set terminal png font "/home/baldin/text/gnuplot/cmunorm.pfb" 12 set output "pgconn-cyr.png" # теперь выводим кириллические надписи set title "PostgreSQL" set xlabel "Время" set ylabel "Пользовательская активность" plot [][-3:37] 32 with lines linewidth 3 title "Опасно", 0 with lines linewidth 3 title "Никого нет", "connectcount.txt" using 2:($7-4) title "" with lines gnuplot> load "myexample.gnuplot" pause -1 "Для продолжения нажмите Enter" > gnuplot myexample.gnuplot #!/usr/local/bin/gnuplot -persist ----------------------------------------------------------------------------------------------------------------- Программисты, программы и искусственный интеллект Алексей Мичурин (X ;) -> (; R T) (X #) -> (# R X) (X .) -> (. R X) (X a) -> (a R X) (X b) -> (. L Y) (Y ;) -> (; R F) (Y #) -> (# R F) (Y .) -> (. L Y) (Y a) -> (. R X) (Y b) -> (b L Y) Листинг 1. Запись алгоритма на языке С #include int MT (char *d) { char s, *p; p=d; /* магнитная головка */ s='X'; /* стояние */ for (;;) { printf("d=%s s=%c p=%c\n", d, s, *p); if (s == 'X') { if (*p == ';') return 1; if (*p == '#') p++; if (*p == '.') p++; if (*p == 'a') p++; if (*p == 'b') *p='.', p--, s='Y'; } if (s == 'Y') { if (*p == ';') return -1; if (*p == '#') return -1; if (*p == '.') p--; if (*p == 'a') *p='.', p++, s='X'; if (*p == 'b') p--; } } return 0; } int main (void) { int r; char data[]="#aaaaabbb;"; r=MT(data); printf("\n result=%d\n data=%s\n", r, data); return 0; } ax := ax + dx F(x) { if (S(x,x)) for(;;) } БББ -> Б ЧББ -> Ч БЧБ -> Ч ЧЧБ -> Ч ББЧ -> Ч ЧБЧ -> Б БЧЧ -> Б ЧЧЧ -> Б -----------------------------------------------------------------------------------------------------------------