За пределами nss_ldap, или Еще о методах авторизации Рашид Ачилов # yum install nss-pam-ldapd uid nslcd gid ldap //Пользователь и группа пользователей, от имени которого //будет выполняться программа nslcd. Не думаю, что кому-то //еще нужно объяснять, что демон, работающий с правами root, – //это есть неправильно и допустимо только в отдельных, //самых крайних случаях uri ldap://10.54.200.234/ ldap://10.54.200.233/ //Адреса серверов, к которым нужно подключаться для получения //информации о пользователе. Серверов может быть несколько, //как в указанном примере, в таком случае они перечисляются //через пробел. В отличие от nss_ldap другой способ задать //сервер для подключения не предусмотрен base dc=nichego,dc=net //База для начала поиска. Обычно здесь задается корень AD, //но можно задать и частичное поддерево. Правда, при задании //частичного поддерева нужно помнить, что поиск никогда //не выйдет за пределы указанного корня binddn cn=LDAP reader,ou=Service Account,dc=nichego,dc=net //Полностью определенное Distinguished Name (DN) пользователя, //от имени которого будет выполняться подключение к AD. //Кавычки для экранирования пробелов не нужны. Единственным //ограничением является отсутствие не-ASCII символов в DN – //из-за разницы кодировок такой DN может быть и не найден bindpw SuperParol //Пароль пользователя, чей DN был указан выше scope sub base group dc=nichego,dc=net base passwd dc=nichego,dc=net //Диапазон поиска. Задает поиск по всем поддереву. Другие //варианты one и base задают, соответственно, поиск только //на одном уровне или только на базовом уровне base shadow dc=nichego,dc=net //Задание точек начала просмотра для поиска данных //о пользователях, группах и паролях. В зависимости //от структуры вашей AD может указывать либо на корень AD, //либо на какую-либо OU (если в ней сосредоточены все //объекты, которые нужно найти) timelimit 0 //Не ограничивать время поиска лимитом, искать до получения //результата deref always //Всегда разыменовывать псевдонимы. Другие варианты never, //searching, finding referrals off //Отключение реферальных ссылок. Этот параметр обязательно //должен быть установлен в off, иначе работать подключение //к AD не будет. Точнее, подключение будет, но не будет //получено никаких данных filter passwd (&(objectClass=user)(objectClass=person) (!(objectClass=computer))) //Задаем фильтр отбора для обращения при поиске данных //о пользователе. Построение фильтра для запроса к LDAP //рассматривалось в многочисленной документации, например, //в [2]. Данный фильтр отберет все объекты, которые //одновременно являются объектами класса user и person //и не являются объектами класса computer filter group (|(objectClass=group)(objectClass=person)) //Задает фильтр отбора для обращения при поиске данных //о группе. Данный фильтр отберет все объекты, которые //являются объектами класса group или person map passwd uid sAMAccountName map passwd uidNumber objectSid:S-1-5-21-921123456-3290711087-42551122 map passwd gidNumber objectSid:S-1-5-21-921123456-3290711087-42551122 map passwd homeDirectory "${homeDirectory:-/usr/share/smbusers/$sAMAccountName}" map passwd gecos displayName map passwd loginShell "${loginShell:-/sbin/nologin}" map group gidNumber objectSid:S-1-5-21-921123456-3290711087-42551122 dsquery * -filter "samaccountname=" -attr objectsid # yum list sssd # kinit administrator@DOMAIN.WINDOWS # net ads join -U administrator -w DOM # yum list adcli # adcli join -U administrator domain.name # kinit -k <имя-хоста-в-верхнем-регистре>\$@DOMAIN.WINDOWS # klist -ke # kvno <имя-хоста-в-верхнем-регистре>\$@DOMAIN.WINDOWS /usr/bin/ldapsearch -H ldap://adserver.nichego,net/ -Y GSSAPI -N -b "dc=nichego,dc=net" "(&(objectClass=user) (sAMAccountName=someuser))" [sssd] config_file_version = 2 domains = shelton.net services = nss, pam ;debug_level = 0x07770 [nss] filter_users = root shell_fallback = /sbin/nologin override_homedir = /usr/share/smbusers/%u default_shell = /bin/sh ;debug_level = 0x07770 [pam] ;debug_level = 0x07770 ;pam_verbosity = 3 [domain/shelton.net] ;debug_level = 0x07770 id_provider = ldap auth_provider = ad access_provider = ldap selinux_provider = none ldap_referrals = false ldap_uri = ldap://10.54.1.1/ ldap_backup_uri = ldap://10.54.1.2/ ad_server = dc1.shelton.net ad_backup_server = dc2.shelton.net ldap_sasl_mech = GSSAPI ldap_id_mapping = true ldap_schema = ad ldap_idmap_default_domain_sid = S-1-5-21-921123456-3290711087-42012345 case_sensitive = false ldap_user_search_base = dc=shelton,dc=net ldap_group_search_base = dc=shelton,dc=net ldap_access_order = expire ldap_account_expire_policy = ad ldap_force_upper_case_realm = true ldap_user_object_class = user ldap_user_name = sAMAccountName ldap_user_gecos = displayName ldap_user_principal = userPrincipalName ldap_user_modify_timestamp = whenChanged ldap_user_shadow_last_change = pwdLastSet ldap_user_shadow_expire = accountExpires ldap_group_object_class = group ldap_group_name = cn ----------------------------------------------------------------------------------------------------------------- Управление Windows Defender с помощью PowerShell Сергей Яремчук PS> Get-Command -Module Defender PS> $session = NewCimSession -ComputerName comp1 PS> Get-MpComputerStatus -CimSession $session PS> Set-MpPreference -DisableRemovableDriveScanning $false PS> Add-MpPreference -ExclusionPath C:\Temp PS> Set-MpPreference -SignatureDefinitionUpdateFileSharesSources \\server\update PS> Update-MpSignature -UpdateSource FileShares PS> Start-MpScan -ScanType FullScan PS> Get-MpThreat PS> Remove-MpThreat PS> Get-MpThreatCatalog | select SeverityID, ThreatName ----------------------------------------------------------------------------------------------------------------- Обзор сборок QEMU для Windows Игорь Орещенков {QEMU-DIR}\qemu-system-i386.exe -net nic -net user -m 256 -hda disk.img -cdrom cd.iso -display vnc=127.0.0.1:1 -L {QEMU-DIR}\BIOS ----------------------------------------------------------------------------------------------------------------- Стеганография: реализация и предотвращение Андрей Бирюков private void ZipFiles(string destinationFileName, string password) { FileStream outputFileStream = new FileStream(destinationFileName, FileMode.Create); ZipOutputStream zipStream = new ZipOutputStream(outputFileStream); bool isCrypted = false; if (password != null && password.Length > 0) { //encrypt the zip file, if password is given zipStream.Password = password; isCrypted = true; } foreach(ListViewItem viewItem in lvAll.Items) { inputStream = new FileStream(viewItem.Text, FileMode.Open); zipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(Path.GetFileName(viewItem.Text)); zipEntry.IsVisible = viewItem.Checked; zipEntry.IsCrypted = isCrypted; zipEntry.CompressionMethod = CompressionMethod.Deflated; zipStream.PutNextEntry(zipEntry); CopyStream(inputStream, zipStream); inputStream.Close(); zipStream.CloseEntry(); } zipStream.Finish(); zipStream.Close(); } ----------------------------------------------------------------------------------------------------------------- Мониторинг блокировок в Oracle. Методы предупреждения и автоматического устранения Валерий Михеичев SELECT --кого блокируем is_sql_start, is_sid, is_serial#,is_username, is_module, is_osuser, is_type,is_lmode, is_request, is_object_lock, is_seconds_in_wait, is_event, (Select p.object_type|| '->'||p.owner||'.'||p.object_name||'-> '||p.procedure_name from dba_procedures p where p.object_id=is_plsql_object_id and p.subprogram_id= is_plsql_subprogram_id) is_sql_object, (Select p.object_type||'->'||p.owner||'.'||p.object_name from dba_objects p where object_id=is_program_id ) is_xp_procedure, is_program_line#, is_sql_text, --кто блокирует who_sql_start, who_sid, who_serial#, who_username, who_osuser, who_module,who_type,who_lmode,who_request, who_object_lock, who_seconds_in_wait ,who_event, (Select p.object_type||'->'||p.owner||'.'||p.object_name|| '-> '||p.procedure_name from dba_procedures p where p.object_id=who_plsql_object_id and p.subprogram_id= who_plsql_subprogram_id) who_sql_object, (Select p.object_type||'->'||p.owner||'.'||p.object_name from dba_objects p where object_id=who_program_id) who_xp_procedure, who_program_line#, who_sql_text, (Select min(holding_session) from dba_blockers where holding_session in (who_sid,is_sid) ) holdinglock FROM (Select distinct s1.sql_exec_start is_sql_start,s1.sid is_sid, s1.serial# is_serial#, s1.username is_username, s1.osuser is_osuser, s1.module is_module,l1.type is_type,l1.lmode is_lmode, l1.request is_request, s1.event is_event, s1.seconds_in_wait is_seconds_in_wait, (select o.owner||'.'||object_name from dba_objects o where o.object_id=v1.object_id ) is_object_lock, (select v.sql_text from v$sql v where v.sql_id=s1.sql_id and rownum=1) is_sql_text, (select v.program_id from v$sql v where v.sql_id=s1.sql_id and rownum=1) is_program_id, (select v.program_line# from v$sql v where v.sql_id=s1.sql_id and rownum=1) is_program_line#, s1.plsql_object_id is_plsql_object_id, s1.plsql_subprogram_id is_plsql_subprogram_id, nvl(s2.sql_exec_start,s2.prev_exec_start) who_sql_start, s2.sid who_sid, s2.serial# who_serial#, s2.username who_username, s2.osuser who_osuser, s2.module who_module, l2.type who_type, l2.lmode who_lmode, l2.request who_request, s2.event who_event, s2.seconds_in_wait who_seconds_in_wait, (select o.owner||'.'||object_name from dba_objects o where o.object_id=v2.object_id ) who_object_lock, (select v.sql_text from v$sql v where v.sql_id=nvl(s2.sql_id,s2.prev_sql_id) and rownum=1) who_sql_text, (select v.program_id from v$sql v where v.sql_id=s2.sql_id and rownum=1) who_program_id, (select v.program_line# from v$sql v where v.sql_id=s2.sql_id and rownum=1) who_program_line#, s2.plsql_object_id who_plsql_object_id, s2.plsql_subprogram_id who_plsql_subprogram_id from v$session s1,v$lock l1,v$locked_object v1, v$session s2,v$lock l2,v$locked_object v2 where l2.block=1 and l1.request>0 and l1.id1=l2.id1 and l1.id2=l2.id2 and s2.sid=l2.sid and s1.sid=l1.sid and s1.blocking_session=s2.sid and v2.session_id =s2.sid and v1.session_id =s1.sid ) A WHERE is_object_lock=who_object_lock order by who_sid,who_serial#; Select * from v$open_cursor r where r.user_name<>'SYS' and r.sid=who_sid and r.user_name=who_username and upper(r.sql_text) like upper('%who_object_lock%') and regexp_like(trim(r.sql_text), '^(update|delete|insert| merge|for update)','i') Create or replace procedure test.p_trace_look(pfile in varchar2) is vf UTL_FILE.file_type;vBuf varchar2(32767); pDir varchar2(500);strBuf varchar2(2000); BEGIN begin select min(value) into pdir from v$parameter where name='user_dump_dest'; strBuf:='CREATE OR REPLACE DIRECTORY ALERTLOG_DIR AS '''||pdir||''''; execute immediate strbuf; exception when others then null; end; pDir:='ALERTLOG_DIR'; --1.Open File begin vf:= UTL_FILE.fopen(pdir,pfile,open_mode=>'r' max_linesize=>32767); exception when UTL_FILE.INVALID_PATH then raise_application_error(-20000, ' : invalid path'); when UTL_FILE.INVALID_OPERATION then raise_application_error(-20000, ' not file on server: '||pfile); end; --2.Read File for i in 1..1000 loop begin UTL_FILE.get_line(vf,vbuf,32767); exception when no_data_found then continue; when UTL_FILE.read_error then exit; end; strbuf:=substr(vbuf,1,2000); DBMS_OUTPUT.put_line(strbuf); end loop; --3.Close file begin if UTL_FILE.is_open(vf) then UTL_FILE.fclose(vf); end if;end; END; ----------------------------------------------------------------------------------------------------------------- Конвертация: правильная миграция данных в 1С Игорь Антонов Если НЕ Объект.ЭтоГруппа Тогда Объект.Организация = Константы.ТекущаяОрганизация.Получить(); КонецЕсли; ВыборкаДанных = Новый ТаблицаЗначений(); ВыборкаДанных.Колонки.Добавить("Клиент"); ВыборкаДанных.Колонки.Добавить("ТипКлиента"); ВыборкаДанныхИзСправочника = Справочники.Контрагенты.Выбрать(); Пока ВыборкаДанныхИзСправочника.Следующий() Цикл Если ВыборкаДанныхИзСправочника.ЭтоГруппа Тогда Продолжить; КонецЕсли; Если ВыборкаДанныхИзСправочника.Покупатель Тогда НоваяСтрока = ВыборкаДанных.Добавить(); НоваяСтрока.Клиент = ВыборкаДанныхИзСправочника.Ссылка; НоваяСтрока.ТипКлиента = "Покупатель"; КонецЕсли; Если ВыборкаДанныхИзСправочника.Поставщик Тогда НоваяСтрока = ВыборкаДанных.Добавить(); НоваяСтрока.Клиент = ВыборкаДанныхИзСправочника.Ссылка; НоваяСтрока.ТипКлиента = "Поставщик"; КонецЕсли; КонецЦикла; //Для свойства "Клиент" Значение = Источник.Клиент; //Для свойства "ТипКлиента" Если Источник.Клиент = "Покупатель" Тогда Выражение = "Перечисления.ТипыКлиентов.Покупатель" ИначеЕсли Источник.Клиент = "Поставщик" Тогда Выражение = "Перечисления.ТипыКлиентов.Поставщик"; КонецЕсли; ВыборкаДанных = Новый ТаблицаЗначений(); //Здесь будет еще одна табличная часть ВыборкаДанных.Колонки.Добавить("Товары"); //Здесь тоже будет табличная часть ВыборкаДанных.Колонки.Добавить("Услуги"); ВыборкаДанныз.Колонки.Добавить("Ссылка"); Если НомерВариантаПоиска = 1 тогда СтрокаИменСвойствПоиска = "ИНН, КПП"; ИначеЕсли НомерВариантаПоиска = 2 Тогда СтрокаИменСвойствПоиска = "Наименование"; КонецЕсли; ----------------------------------------------------------------------------------------------------------------- Практика использования WebKit Александр Календарев { "main": "index.html", "name": "nw-demo", } Hello World!

Hello World!

/usr/bin/nw app.nw cat /usr/bin/nw app.nw > app && chmod +x app ./app #!/bin/bash cd package zip app * mv app.zip ../app.nw cd .. cat /usr/bin/nw app.nw > app chmod +x app ./app src="./jquery.min.js" win.hide(); win.close(); console.log("Hello World!"); phantom.exit(); phantomjs helloWorld.js; // подключаем библиотеку WebPage var page = require('webpage').create(); var address = "http://yandex.ru/yandsearch?text=php"; page.open(address, function(status) { console.log("Status: " + status); if(status === "success") { // создаем графический файл page.render('yandex.png'); phantom.exit(); } }); /^(\+7|8)?\d{10}$/ function tel_test(num) { var tel = /^(\+7|8)?\d{10}$/; console.log(num, tel.test(num)); } tel_test('123456'); // false tel_test('9119331212'); // true tel_test('89119331212'); // true tel_test('+79119331212'); // true tel_test('+89119331212'); // false phantom.exit(); var page = require('webpage').create(), server = require('webserver').create(); var port = 8080; // запускаем сервер на 8080 порту var service = server.listen(port, function(request, response) { // получаем url var url = request.post.url; if (url) { page.open( url, function (status) { var res; if (status !== 'success') { // ошибка при загрузке страницы, отдаем ошибку. console.log('Unable page'); res = 'error load page '+ url; response.statusCode = 400; // Bad Request } else { // получаем картинку страницы в base64 представлении res = page.renderBase64('PNG'); // устанавливаем необходимые заголовки ответа response.statusCode = 200; response.headers = { 'Cache': 'no-cache', 'Content-Type': 'text/plain; charset=utf-8' }; } // отдаем данные на запрос response.write(res); response.close(); }); } }); luakit http://ya.ru -- End user script loading -- -- End user script loading –------------------------------ uri = 'http://yandex.ru/yandsearch?text=php'; w = window.new( {uri} ) // создание окна w.view:eval_js("window.onload = function(){alert('ok');}") // внедрение скрипта $ luakit -c rc.lua exec xinit /path/to/nw.js /path/to/app -- `which Xvnc`:1 -ac -nolisten tcp -geometry 1024x768 -depth 24 ----------------------------------------------------------------------------------------------------------------- Язык программирования Go. Подготовка среды для разработки под Windows Игорь Орещенков /*=================================*/ /* Культура планеты "Кин-дза-дза". */ /*=================================*/ package main import "fmt" /*=============================*/ /* Базовый класс "Артист". */ /* У всех артистов есть штаны. */ /*=============================*/ type Артист struct { штаны string // цвет штанов } func (артист *Артист) ВотШтаны (цвет string) { артист.штаны = цвет } func (артист Артист) Штаны () string { return артист.штаны } /*==================================*/ /* Класс "Пацак" -- артист с цаком. */ /*==================================*/ type Пацак struct { Артист цак bool } func (певец Пацак) Пой () { fmt.Println ("- Ку!") } /*=======================================*/ /* Класс "Чатланин" -- артист с чатлами. */ /*=======================================*/ type Чатланин struct { Артист чатлы int } func (певец Чатланин) Пой () { fmt.Println ("- Ы!") } /*=========================*/ /* Интерфейс "Исполнение". */ /*=========================*/ type Исполнение interface { Штаны () string Пой () } /*====================================*/ /* Венец творения -- функция концерт. */ /*====================================*/ func Концерт (исполнители ...Исполнение) { for _, исполнитель := range исполнители { fmt.Println ("Исполнитель в", исполнитель.Штаны (), "штанах поёт:") исполнитель.Пой () } } /*======================*/ /* Завершение концерта. */ /*======================*/ func Занавес () { fmt.Println ("*** Занавес ***") } /*====================================*/ /* Невозможность проведения концерта. */ /*====================================*/ func Эцых (причина string) { panic (причина) } /*=====================*/ /* Основная программа. */ /*=====================*/ func main() { var Скрипач = Пацак {цак: true} Скрипач.ВотШтаны ("жёлт.") fmt.Println ("Скрипач перед концертом: ", Скрипач) var Уэф = Чатланин {чатлы: 20} Уэф.ВотШтаны ("красн.") fmt.Println ("Уэф перед концертом: ", Уэф) fmt.Println ("*** Начало концерта ***") defer Занавес () // не забыть закрыть занавес! if Скрипач.цак { Концерт (Уэф, Скрипач) } else { Эцых ("Пацак должен носить цак!") } } /*==========================================*/ /* Результат работы программы: */ /* Скрипач перед концертом: {{жёлт.} true} */ /* Уэф перед концертом: {{красн.} 20} */ /* *** Начало концерта *** */ /* Исполнитель в красн. штанах поёт: */ /* - Ы! */ /* Исполнитель в жёлт. штанах поёт: */ /* - Ку! */ /* *** Занавес *** */ /*==========================================*/ /*====================================*/ /* демонстрация использования функции */ /* с переменным числом аргументов. */ /*====================================*/ package main import "fmt" var x = []int{1, 2, 3, 4, 5} func myfunc(v ...int) { fmt.Println("Numbers as slice of array:") for i, n := range v { fmt.Println("v[", i, "] =", n) } x = append(x, v...) } func main() { fmt.Println("X before:", x) myfunc(41, 25, 18, 64, 32) fmt.Println("X after:", x) } godoc -http :6060 http://localhost:6060 go install hello @echo off set GOROOT=C:\TOOLS\GO set GOPATH=D:\WORK\GO set GOBIN=%GOPATH%\BIN PATH %PATH%;%GOROOT%\BIN %comspec% /k C:\TOOLS\GO\goenv.bat ----------------------------------------------------------------------------------------------------------------- Создание контейнера IoC под себя Андрей Ушаков public interface ISomeInnerService { ... } public interface ISomeOtherInnerService { ... } public interface ISomeService { ... } public class SomeInnerService : ISomeInnerService { ... } public class SomeOtherInnerService : ISomeOtherInnerService { ... } public class SomeService : ISomeService { public SomeService(ISomeInnerService inner) { ... } ... } public class SomeServiceOther : ISomeService { public SomeServiceOther(ISomeOtherInnerService inner) { } ... } IWindsorContainer container = new WindsorContainer(); container.Register(Component.For().ImplementedBy()); container.Register(Component.For().ImplementedBy()); ISomeService service = container.Resolve(); IWindsorContainer container = new WindsorContainer(); container.Register(Component.For().ImplementedBy()); container.Register(Component.For().ImplementedBy()); ISomeService service = container.Resolve(); public class SomeService { public SomeService(ISomeInnerService inner) { } } public interface IFactory { Object Create(IServiceContainer container); } public class SomeServiceFactory : IFactory { public Object Create(IServiceContainer cont) { return new SomeService(cont.Resolve ()); } } container.Add(cont => new SomeService(cont.Resolve()); public interface IContainerEntry { Object GetValue(IServiceContainer container); } public class SimpleContainerEntry : IContainerEntry { public SimpleContainerEntry(Object value) { _value = value; } public Object GetValue(IServiceContainer container) { return _value; } private readonly Object _value; } public class GeneratorContainerEntry : IContainerEntry { public GeneratorContainerEntry(Func generator) { _generator = generator; } public Object GetValue(IServiceContainer container) { return _generator(container); } private readonly Func _generator; } public class LazyContainerEntry : IContainerEntry { public LazyContainerEntry(Func initializer) { _initializer = initializer; _initialized = false; _value = null; } public Object GetValue(IServiceContainer container) { if (!_initialized) { _value = _initializer(container); _initialized = true; } return _value; } private readonly Func _initializer; private Boolean _initialized; private Object _value; } public interface IServiceContainer { // resolve Object Resolve(Object key); Object Resolve(String name); T Resolve(); T Resolve(String name); // resolve by condition IList Resolve(Func keyPredicate); IList Resolve(Func keyPredicate); // has Boolean HasComponent(Object key); ... // add void AddComponent(Object key, IContainerEntry entry); void AddComponent(String name, IContainerEntry entry); void AddComponent(IContainerEntry entry); void AddComponent(String name, IContainerEntry entry); // remove void RemoveComponent(Object key); ... // add/remove subcontainers void AddSubContainer(IServiceContainer container); void RemoveSubContainer(IServiceContainer container); // clear void Clear(); } private readonly IDictionary _containerEntries; private readonly IList _subContainers; public void AddComponent(Object key, IContainerEntry entry) { if (HasComponent(key)) throw new ServiceAlreadyRegisteredException(); _containerEntries.Add(key, entry); } public void RemoveComponent(Object key) { if (_containerEntries.Remove(key)) return; foreach (IServiceContainer container in _subContainers) if (container.HasComponent(key)) { container.RemoveComponent(key); return; } } public Object Resolve(Object key) { IContainerEntry entry; if (_containerEntries.TryGetValue(key, out entry)) return entry.GetValue(this); foreach (IServiceContainer container in _subContainers) if (container.HasComponent(key)) return container.Resolve(key); throw new ServiceNotFoundException(); } public Boolean HasComponent(Object key) { if (_containerEntries.ContainsKey(key)) return true; foreach (IServiceContainer container in _subContainers) if (container.HasComponent(key)) return true; return false; } IServiceContainer container = new ServiceContainer(); container.Add(new LazyContainerEntry( cont => SomeService( cont.Resolve()))); container.Add( new LazyContainerEntry(_ =>new SomeInnerService())); ISomeService service = container.Resolve(); -----------------------------------------------------------------------------------------------------------------