Service Discovery для распределенных систем Сергей Яремчук $ sudo consul agent -server -bootstrap-expect 5 -data-dir /var/consul -config-dir /etc/consul.d $ nano /etc/consul.d/web.json { "service": { "name": "web", "tags": ["apache"], "port": 80} } $ sudo consul agent -config-dir /etc/consul.d $ curl -X PUT -d -d '{"Datacenter":"dc1","ID":"redis1","Name":"redis","Port":8000}' http://127.0.0.1:8500/v1/catalog/register $ curl http://127.0.0.1:8500/v1/catalog/services $ curl http://127.0.0.1:8500/v1/catalog/service/redis $ dig @127.0.0.1 -p 8600 web.service.consul $ dig @127.0.0.1 -p 8600 apache.web.service.consul $ dig @127.0.0.1 +short redis.service.consul A ----------------------------------------------------------------------------------------- Защита от DDoS подручными средствами. Часть 2. NTP Amplification Андрей Дугин # ntpd –version ntpdc -c monlist ntpdc -c monlist disable monitor $ ntpdc -c monlist 192.168.10.128 # Если NTP-сервер обслуживает клиентов – разрешаем запрос времени, но не изменение. restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery # Указываем доверенные IP-адреса restrict 127.0.0.1 restrict 192.51.100.1 restrict 192.51.100.2 restrict 192.51.100.3 net.ipv6.conf.all.disable_ipv6 = 1 $ sudo sysctl -p /etc/sysctl.conf iptables -v -A INPUT -s 192.0.2.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT iptables -v -A OUTPUT -m iprange --dst-range 192.51.100.1-192.51.100.3 -m state --state NEW -p udp --dport 123 -j ACCEPT iptables -v -A INPUT -p udp --dport 123 -m string --from 44 --to 46 --algo bm --hex-string '|2A|' -j DROP ios_router# show subsys name ntp ios_router(config)# ip access-list standard DENY ios_router(config-std-nacl)# deny any ios_router(config)#ntp access-group query-only DENY ios_router(config)#ntp access-group serve DENY ios_router(config)#ip access-list standard PERMIT_NTP_CLIENTS ios_router(config-std-nacl)#permit 192.0.2.0 0.0.0.255 ios_router(config-std-nacl)#deny any ios_router(config)#ntp access-group serve-only PERMIT_NTP_CLIENTS ios_router(config-std-nacl)#permit 198.51.100.1 ios_router(config-std-nacl)#permit 198.51.100.2 ios_router(config-std-nacl)#permit 198.51.100.3 ios_router(config-std-nacl)#deny any ios_router(config)#ntp access-group peer PERMIT_NTP_PEER CE(config-if)# ip verify unicast source reachable-via rx ----------------------------------------------------------------------------------------- Проводим пентест. Часть 3. Ищем уязвимости Андрей Бирюков #include int main(int argc, char *argv[]) { char c[12]; // для переменной c зарезервировано 12 байт strcpy(c, argv[1]); // копируем переданные из командной строки данные в переменную c return 0; } #include int main(int argc, char *argv[]) { char buf[12]; strncpy(c, argv[1], sizeof(c)); return 0; } root@kali:/root# dpkg –i "Nessus-6.6.2-debian6_amd64.deb" root@kali:/root# /etc/init.d/nessusd start root@kali:~# apt-get update root@kali:~# apt-get dist-upgrade root@kali:~# apt-get install openvas root@kali:~# openvas-setup ----------------------------------------------------------------------------------------- Работаем по-стахановски Рашид Ачилов Alias /stkh/ "C:/ProgramData/PBL/Stkh/Server/Web/" Alias /stkh "C:/ProgramData/PBL/Stkh/Server/Web/" AllowOverride None Options FollowSymLinks ExecCGI SSLRequireSSL Require all granted ----------------------------------------------------------------------------------------- Роль статистики таблиц и индексов в производительности SQL-запросов в Oracle Валерий Михеичев Select global_stats from all_tables f where owner='HIS' and table_name = 'AGREEMENT'; Select m.timestamp lasttime, u.name owner, o.name table_name, m.inserts, m.updates, m.deletes from sys.mon_mods$ m, sys.obj$ o, sys.user$ u where o.owner#=u.user# and o.obj#=m.obj# and u.name='HIS' and o.name='AGREEMENT'; Select owner, table_name, round(sample_size/decode(num_rows,0,100000000000,num_rows)*100,2) percent, last_analyzed, global_stats from all_tables where owner='HIS' and table_name = 'AGREEMENT'; Select owner, table_name, index_name, round(sample_size*100/nvl(decode(num_rows, 0, 100000, num_rows), 1000000), 2) percent, last_analyzed, global_stats from all_ind_statistics where owner='HIS' and table_name = 'AGREEMENT' order by 3; Execute dbms_stats.lock_table_stats('имя схемы', 'имя таблицы'); Execute dbms_stats.unlock_table_stats('имя схемы', 'имя таблицы'); Execute dbms_stats.gather_table_stats ('his', 'agreement', null, N, null, 'for all indexed columns size auto'); Execute dbms_stats.gather_index_stats ('his', 'x_agreement', null, N); Execute dbms_stats.gather_table_stats ('his', 'agreement', null, 100, null, 'for all indexed columns size auto'); Execute dbms_stats.gather_table_stats ('his', 'agreement', null, dbms_stats.auto_sample_size); Execute dbms_stats.gather_table_stats ('his','agreement', null,20,null,'for all indexed columns size auto’, degree=>32); Execute dbms_stats.gather_table_stats ('his','agreement', null,20,null,'for all indexed columns size auto’,32); Execute dbms_stats.gather_index_stats ('his', 'x_agreement, null,20, degree=>32); Execute dbms_stats.gather_index_stats ('his', 'x_agreement', null,20, null, null, null, 32); Create index his.x_agreement…parallel 32; Alter index his.x_agreement parallel 32; Create global temporary table his.account_tmp (isn number, parentisn number, datebeg date) on commit preserve rows; Create index his.x_acccount_tmp on his.account_tmp(isn); Alter session set optimizer_dynamic_sampling =11; dbms_stats.set_table_stats('his', 'account_tmp', numrows => '1000', numblks => 55, avgrlen => 22); Select /*+ cardinality (t 10000) */ from his.account_tmp; Alter session set "_optimizer_random_plan"=5; Alter session set "_optimizer_random_plan"=0; Select owner, table_name, last_analyzed, global_stats, num_rows, blocks, avg_row_len /*, scope*/ from all_tab_statistics where owner='HIS' and table_name= 'ACCOUNT_TMP'; Select owner, table_name, last_analyzed, global_stats, num_rows /*, scope from all_ind_statistics where owner='HIS' and table_name= 'ACCOUNT_TMP'; ----------------------------------------------------------------------------------------- Использование SQL Profiler для поиска и исправления медленных запросов в 1С Тимур Шамиладзе Листинг 1. Нахождение неоптимального запроса в коде конфигурации 1С Запрос.Текст = " |ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, | СУММА(НеобходимыеТовары.Количество) КАК Необходимо, | СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Остаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | , | (Склад, Номенклатура) В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | Документ.Реализация.Товары.Склад, | Документ.Реализация.Товары.Номенклатура | ИЗ | Документ.Реализация.Товары | ГДЕ | Документ.Реализация.Товары.Ссылка = &Документ)) КАК ТоварыНаСкладахОстатки | | ЛЕВОЕ СОЕДИНЕНИЕ Документ.Реализация.Товары КАК НеобходимыеТовары | ПО НеобходимыеТовары.Ссылка = &Документ | И НеобходимыеТовары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладахОстатки.Номенклатура"; Листинг 2. Получение списка самых медленных запросов SELECT [RowNumber] ,[Duration]/1000 AS Duration ,[Reads] ,[TextData] FROM [master].[dbo].[PF2016] Order by [Duration] desc ----------------------------------------------------------------------------------------- Под капотом платформы 1С 8.3. Часть 2. Работа с СУБД Олег Филиппов SELECT T1._Fld6435, T1._Fld6436_TYPE, T1._Fld6436_L, T1._Fld6436_N, SELECT TOP 1 T1._Fld366 FROM dbo._InfoRg6434 T1 DELETE FROM T1 FROM dbo._InfoRg6434 T1 SELECT Creation,Modified,Attributes,DataSize,BinaryData FROM Params INSERT INTO #tt2 (_Fld6435,_Fld6436_TYPE,_Fld6436_L SELECT T1._Fld6435, T1._Fld6436_TYPE, T1._Fld6436_L, T1._Fld6436_N, T1._Fld6436_T, T1._Fld6436_S, T1._Fld6436_RTRef, T1._Fld6436_RRRef, T1._Fld366 FROM #tt2 INSERT INTO dbo._InfoRg6434 (_Fld6435, _Fld6436_TYPE, _Fld6436_L From #tt2 SELECT MIN(T1._Period) FROM #tt12 T1 WITH(NOLOCK) …FROM #tt12 T1 WITH(NOLOCK) INNER JOIN #tt13 T2 WITH(NOLOCK) ON T1._Period < T2._Period UPDATE T2 SET _Fld5957 = T2._Fld5957 + T1._Fld5957 FROM #tt14 T1 WITH(NOLOCK) INNER JOIN dbo._AccumRgT5958 T2 ON T1._Period = T2._Period AND T1._Fld5951_TYPE = T2._Fld5951_TYPE… ----------------------------------------------------------------------------------------- 1С в контейнере. Быстро и недорого Александр Тетюшев # yum install docker docker-registry –y # systemctl enable docker; systemctl start docker [Service] Environment="HTTP_PROXY=http://proxy.local.ru:3128/" "NO_PROXY=localhost,127.0.0.1" [Service] Environment="HTTPS_PROXY=http://proxy.local.ru:3128/" "NO_PROXY=localhost,127.0.0.1" # systemctl daemon-reload # docker search 1с //база данных PostgreSQL для 1С # docker pull temrdm/1c_postgres //сервер 1с v8.3 # docker pull temrdm/1c_server # docker images # docker run -d --name 1c_postgres -p 5432:5432 --restart=always -v /var/lib/postgres/data: /var/lib/postgresql/data -e POSTGRES_PASSWORD=postgres -h data.local.ru temrdm/1c_postgres # docker port 1c_postgres # psql -h localhost -U postgres -d postgres -c "CREATE TABLE tmp (some_id serial PRIMARY KEY, some_text text);" //интерактивный вход в базу данных #psql -h localhost -U postgres // просмотр таблиц Psql> \l # mkdir /home/usr1cv8; mkdir /var/log/1c # docker create --name=1c_server_data -v /var/log/1c -v /home/usr1cv8/ temrdm/1c_server # docker run --name=1c_server --restart=always -d --volumes-from 1c_server_data -v /etc/localtime:/etc/localtime:ro -p 1540-1541:1540-1541 -p 1560-1591:1560-1591 -h srv.local.ru --link=1c_postgres temrdm/1c_server # docker ps # docker exec -it 1c_server /bin/bash ----------------------------------------------------------------------------------------- AMP от Google. Ускоряемся и взлетаем в выдаче Александр Майоров

Hello World!

Hello World!

----------------------------------------------------------------------------------------- Широковещательные сообщения в Android Андрей Пахомов android.intent.action.BOOT_COMPLETED public class MyBroadcastReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) {…}… String SOME_ACTION = "broadcast.id"; IntentFilter intentFilter = new IntentFilter(SOME_ACTION); MyBroadcastReciever myReciever = new MyBroadcastReciever(); registerReceiver(myReciever, intentFilter); unregisterReceiver(myReciever); public class MyService extends Service { public MyService() {super();} public int onStartCommand(Intent intent, int flags, int startId) { new NewThread(); Toast.makeText(getApplicationContext(),"service started!",Toast.LENGTH_LONG).show(); stopSelf(startId); return super.onStartCommand(intent, flags, startId);} private class NewThread implements Runnable{ Thread t; public NewThread() {t=new Thread(this, "new thread"); t.start();} public void run() { loadData();} private void lo adData() { try {Thread.sleep(5000); Log.e("Service", "service was started!");...} Intent intent = new Intent(); intent.setAction("com.sample.custom.broadcast"); intent.putExtra("Data", "string_from_broadcast"); sendBroadcast(intent); sendOrderedBroadcast(intent, "ordered_broadcast_permission"); String number =getResultData(); String newNumber="88005555550"; setResultData(newNumber); Bundle resultExtras = intent.getExtras(); if (resultExtras != null) { for (String key : resultExtras.keySet()) { Log.i("OrdBrdc", "Result Extra key=" + key + ":" + resultExtras.get(key));}} Intent intent2 = new Intent("broadcast.id"); intent2.putExtra("data", "test message"); intent2.setPackage("package.name"); sendBroadcast(intent2); sendBroadcast(intent, "permission_name"); sendOrderedBroadcast(intent, "permission name"); sendBroadcast(intent); LocalBroadcastManager public class LocalReceiver extends BroadcastReceiver LocalReceiver localReceiver = new LocalReceiver(); LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, new IntentFilter("com.example.localmessage")); Intent intent = new Intent("com.example.localmessage"); intent.putExtra("data", "local message"); LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); ----------------------------------------------------------------------------------------- Переменные в CSS без препроцессоров Александр Майоров --my-custom-property: #ff0a0c; :root { --main-color: #ffa500; } #foo h1 { color: var(--main-color); } --some-condition: if(x > 8) this.width = 100; var( [, ]? ) p { padding: var(--main-padding, 20px 25px 30px); } .foo { --custom-margin: 20; margin-top: calc(var(--custom-margin) * 10px); }

Hello world!

----------------------------------------------------------------------------------------- Lisp: маленький гигант Алексей Вторников (У ПОПА БЫЛА СОБАКА) (У (ПОПА (БЫЛА (СОБАКА))) (ПАПА ВАСЯ 35 МАМА Лена 30 СЫН МИША 8) ((ПАПА ВАСЯ 35)(МАМА ЛЕНА 30)(СЫН МИША 8)) () (<имя функции> <список аргументов, возможно, пустой>) (обработать 1 2 3 QWERTY) (CAR '(A B C)) = A (CAR '((A B 5)(C D 15)(E F 15))) = (A B 5) (CDR '(A B C)) = (B C) (CDR '((A B 5)(C D 15)(E F 15))) = ((C D 15)(E F 15)) (CDR ‘(A)) = NIL (CONS 'A '(B C)) = (A B C) (CONS '(A B 5)'((C D 10)(E F 15))) = ((A B 5)(C D 10)(E F 15)) (CONS 'A ()) = (A) (ATOM 'A) = T (ATOM 3.1415926) = T (ATOM '(A B C)) = NIL (ATOM NIL) = T (EQL 1 1) = T (EQL 'A (CAR '(A B C))) = T (EQL 1 1.0) = NIL (COND (<условие1> действие1) (<условие2> действиеN) ... (<условиеN> действиеN)) (DEFUN <имя функции> (<список аргументов>) (<тело функции>) ) (DEFUN square (x) (* x x) ) (square 15) (square 1.41) (DEFUN fact (n) (IF (= n 0) 1 (* (fact (- n 1)) n))) (fact 5) (fact 10) ----------------------------------------------------------------------------------------- Лабораторная работа. Исследуем сокеты. Часть 3 (окончание) Владимир Закляков #include #include #include #include #include #include #include #include // номер порта для приёма входящих соединений сервером #define PORTNUM 1234 int main(void) { int listen_s, connected_s, nbytes; struct sockaddr_in serv_addr, clnt_addr; char buf[256]; // буфер для приёма сообщения unsigned long addr; if ( (listen_s=socket(PF_INET, SOCK_STREAM, 0) ) == -1 ) { perror("Ошибка вызова socket()"); exit(1); } /* Заполняем, предварительно обнулив, структуру serv_addr для описания «своего» конца коммуникационного канала: указываем семейство адресов AF_INET (то есть IP-адреса); входящий адрес сокета INADDR_ANY (0.0.0.0) означает принимать соединения на всех имеющихся у хоста адресах. */ bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=INADDR_ANY; serv_addr.sin_port=htons((u_short)PORTNUM); /* Связываем сокет listen_s с адресом и портом, содержащимися в serv_addr, определяя локальную часть коммуникационного канала. */ if ( bind(listen_s, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1 ) { perror("Ошибка вызова bind()"); exit(2); } /* Переводим сокет в режим ожидания соединений – фактически в модуль TCP передаётся вызов PASSIVE_OPEN. Второй параметр задаёт максимальный размер, до которого может расти очередь ожидающих соединений у listen_s. */ if ( listen(listen_s,10)==-1 ) { perror("Ошибка вызова listen()"); exit(3); } printf("Сервер готов принимать соединения\n"); /* Обнуляем структуру clnt_addr, в которую будут записаны адрес и порт подсоединившегося клиента. */ int addrlen; bzero(&clnt_addr, sizeof(clnt_addr)); addrlen=sizeof(clnt_addr); /* Принимаем запрос. Возврат из функции accept() производится только после поступления запроса и установления соединения с клиентом. При этом на базе старого сокета listen_s создаётся новый сокет connected_s, у которого определены уже обе части соединения – локальная и удалённая. Таким образом, сокет connected_s уже может использоваться для передачи данных. Адрес и порт подсоединившегося клиента возвращаются в структуре clnt_addr. */ if ( (connected_s=accept(listen_s, (struct sockaddr *)&clnt_addr, &addrlen) ) == -1 ) { perror("Ошибка вызова accept()"); exit(4); } printf("Соединение от %s\n", inet_ntoa(clnt_addr.sin_addr)); nbytes=recv(connected_s, buf, sizeof(buf)-1, 0); if (nbytes>0) { buf[nbytes]='\0'; printf("Получено сообщение: %s\n", buf); } printf("Завершаем работу, закрываем сокет.\n"); close(connected_s); close(listen_s); exit(0); } $ nc -l 1234 $ netstat -t -a -n $ ss -t -a -n $ lsof $ lsof -i $ lsof -i TCP -n -P $ ps aux $ su - # tcpdump -i lo -n $ nc 127.0.0.1 1234 $ lsof -i TCP -n -P $ lsof -i TCP -n -P | grep 1234 $ ss -t -a -n $ ss -t -a -n | grep 1234 $ netstat -t -a -n $ netstat -t -a -n | grep 1234 $ nc 127.0.0.1 1234 $ lsof -i TCP -n -P | grep 1234 # tcpdump -i lo -n -nn -X -s 200 $ nc -l 1234 -v $ lynx 127.0.0.1:1234 $ wget 127.0.0.1:1234 $ telnet 127.0.0.1 80 $ nc 127.0.0.1 80 $ gcc tcp_client1.c -o tcp_client1 $ ./tcp_client1 # tshark -i lo -n -x $ gcc tcp_server1.c -o tcp_server1 $./tcp_server1 $ nc 127.0.0.1 1234 // избавляемся от ошибки bind(): Address already in use int opt = 1; if (setsockopt(listen_s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) == -1) { perror("Ошибка вызова setsockopt()"); exit(5); } # tshark -i lo -n -x $ nc -l 1234 -u $ nc 127.0.0.1 1234 -u $ nc 127.0.0.1 1234 -u $ gcc udp_client1.c -o udp_client1 $ nc -l 1234 -u $ ./udp_client1 $ ./udp_client1 $ gcc udp_server1.c -o udp_server1 $ ./udp_server1 $ ./udp_client1 # iptables -L -v -x -n # iptables -I INPUT -p udp -s 127.0.0.1 ----------------------------------------------------------------------