30.09.2008, 10:23 | #1 |
Участник
|
ошибка обращения к .NET сборке в режиме Server
Здравтвуйте коллеги!
Написал X++ код (DAX 4.0), который обращается к прокси-сборке web-сервиса узла SharePoint. Если данный код работает со свойством RunOn == 'Called from' - то всё ок! Если данное свойство поменять на Server, то выдаются вот такие страшные ошибки: Сбой запроса на разрешение типа "InteropPermission". (S)\Classes\InteropPermission\demand (S)\Classes\CLRObject\new (S)\Classes\ImportContractApprovalInfo_NV\new - line 24 (S)\Classes\ImportContractApprovalInfo_NV\main - line 38 Объект "CLRObject" не может быть создан Вот эти самые line 24: X++: //внешняя прокси-сборка, позволяющая работать с web-сервисом ImortApprovalInfo.ApprovalDocuments_ListService.Lists _listService; ; _listService = new ImortApprovalInfo.ApprovalDocuments_ListService.Lists(); 2) как исправить? |
|
30.09.2008, 10:44 | #3 |
Участник
|
Ошибки не странные. Почитайте про Code Access Security, к примеру здесь:
http://msdn.microsoft.com/en-us/library/bb190039.aspx О. Точно такая же ссылка выше |
|
30.09.2008, 12:26 | #4 |
Участник
|
Спасибо за ссылку!
Вставил пермишны: X++: //проверяем возможность доступа к сборке perm = new InteropPermission(InteropKind::ClrInterop); if (perm == null) { return; } perm.assert(); Однако обнаружил следующее некорректное поведение компонента ClrInterOp Метод ClrInterop::isNull в режиме "Server" выдаёт стабильно true! Хотя, как видно из кода ниже, строка strOuterXml ВСЕГДА имеет осмысленные данные (ID="{BB80822A-7849-416B-9BF4-ECD83999F867}). В режиме "Client" метод ClrInterop::isNull работает нормально, и выдаёт true или false в зависимости от реального сотояния объекта. X++: System.Xml.XmlAttributeCollection xacAttributes; System.Xml.XmlAttribute xaAttribute; str strOuterXml; anytype ant; ; xacAttributes = ndListDefinition.get_Attributes(); xaAttribute = xacAttributes.get_ItemOf("ID"); strOuterXml = ClrInterOp::getAnyTypeForObject(xaAttribute.get_OuterXml()); ant = ClrInterop::isNull(xaAttribute); if(!ClrInterop::isNull(xaAttribute)) { _listID = xaAttribute.get_Value(); } else { _listID = "-1"; } Последний раз редактировалось GromRom; 30.09.2008 в 12:28. |
|
30.09.2008, 14:43 | #5 |
Administrator
|
Вот у меня та же проблема возникла, только при использовании ADO. (там использовался класс InteropPermission с типом InteropKind::ComInterop). Т.е. хоть тресни - не выдается разрешение при работе на сервере. Я не знаю - баг это или фича или я просто "не умею готовить", однако - этого поведения достаточно - чтобы я для себя сказал - мне эти разрешения не нужны - и хорошо - что есть возможность их отключить на уровне АОСа... и вообще - эти разрешения - есть вредная и дурацкая приблуда (совершенно не вижу логики в их наличии - только дополнительный код писать приходится).
Может конечно я и резко высказался - но пока я как-то не осознал их полезность и не понял - какой плюс - хотя бы с маркетинговой т.з. они привносят Для отключения этих разрешений на уровне АОСа в реестре (конфигурации) нужно указать у параметра caslevel значение disable PS. В приведенной ссылке выше написано "Code Access Security (CAS) helps protect APIs that have potential security risks ", т.е. как бы разрешения позволяют какие-то риски снизить. Вопрос. Какие риски можно снизить - если все равно все вызовы обрамляются в разрешения???. Т.е. теперь типа если увидел разрешения - значит есть некий потенциально рисковый вызов?. Если не обрамить вызов в разрешение - то вызова не произойдет. Вот я не понимаю этого искусственно выдуманного кода. Код-то не машина пишет - а человек
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 30.09.2008 в 14:48. |
|
30.09.2008, 15:37 | #6 |
Злыдни
|
Цитата:
Microsoft Dynamics AX code access security allows developers to protect dangerous APIs from being invoked by untrusted code (code that does not originate from the Application Object Tree (AOT)). Code access security does this by performing the following actions:
1. It verifies that the code asserted the appropriate permission on the call stack to use the dangerous API. 2. It verifies that the assert (the request to use the dangerous API) was executed in trusted code and saved in the AOT. 3. It verifies that the assert was executed on the same tier as the dangerous API. For Dynamics AX version 4.0, code access security covers the use of dangerous APIs on the server tier only. You do not need to modify or mitigate client-only invocations of dangerous APIs. Цитата:
To help protect computer systems from malicious mobile code, to allow code from unknown origins to run with protection, and to help prevent trusted code from intentionally or accidentally compromising security, the .NET Framework provides a security mechanism called code access security. Code access security allows code to be trusted to varying degrees depending on where the code originates and on other aspects of the code's identity. Code access security also enforces the varying levels of trust on code, which minimizes the amount of code that must be fully trusted in order to run. Using code access security can reduce the likelihood that your code can be misused by malicious or error-filled code. It can reduce your liability because you can specify the set of operations your code should be allowed to perform as well as the operations your code should never be allowed to perform. Code access security can also help minimize the damage that can result from security vulnerabilities in your code.
|
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
30.09.2008, 16:19 | #7 |
Участник
|
Цитата:
Сообщение от Yprit
см. также http://msdn.microsoft.com/en-us/library/930b76w0.aspx - ноги растут оттуда
|
|
30.09.2008, 16:31 | #8 |
Участник
|
Цитата:
Сообщение от sukhanchik
В приведенной ссылке выше написано "Code Access Security (CAS) helps protect APIs that have potential security risks ", т.е. как бы разрешения позволяют какие-то риски снизить. Вопрос. Какие риски можно снизить - если все равно все вызовы обрамляются в разрешения???. Т.е. теперь типа если увидел разрешения - значит есть некий потенциально рисковый вызов?. Если не обрамить вызов в разрешение - то вызова не произойдет. Вот я не понимаю этого искусственно выдуманного кода. Код-то не машина пишет - а человек
|
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
30.09.2008, 16:35 | #9 |
Участник
|
Цитата:
Цитата:
For Dynamics AX version 4.0, code access security covers the use of dangerous APIs on the server tier only. You do not need to modify or mitigate client-only invocations of dangerous APIs.
|
|
30.09.2008, 16:38 | #10 |
Злыдни
|
|
|
30.09.2008, 17:52 | #11 |
Administrator
|
Цитата:
Сообщение от gl00mie
Смысл, я так понимаю, в вызове InteropPermission.assert() - это позволяет разработчику "опасного API" осуществить проверку того, можно ли его API использовать в тех или иных условиях и, в случае чего, выкинуть какое-нить исключение типа "фигу вам, а не моё опасное API"... Плюс, разработчиков это заставляет лишний раз подумать, прежде чем что-то использовать. Мне это напоминает поведение Висты: если пользователь собрался сделать что-то эдакое, то его надо двадцать раз переспросить, точно ли он уверен, что хочет это сделать, в трезвом ли он уме и твердой ли памяти
А потом - что значит "лишний раз подумать"? Если мне надо вызвать какую-то WinAPI-функцию или функцию из dll - что я сделаю? Ctrl+C, Ctrl+V из того места, где она работает и исправлю имя функции. Ну еще проверю - что все вызывается. Ну и какая разница сколько строчек кода я скопирую не глядя? Единственное - что меня смущает - это Ваш ответ про метод assert. Т.е. каким образом предполагается (предполагалось) контролировать - в каких условиях используется "опасное" API? Т.е. Windows будет контролировать - где можно вызывать функцию к примеру WinAPI::findWindow, а где нельзя - так что ли? Чего-то не врубаюсь. И интересно еще как это все ложится на Аксапту - где метод assert() ядерный...
__________________
Возможно сделать все. Вопрос времени |
|
30.09.2008, 18:07 | #12 |
Administrator
|
Цитата:
Сообщение от Yprit
1. It verifies that the code asserted the appropriate permission on the call stack to use the dangerous API.
2. It verifies that the assert (the request to use the dangerous API) was executed in trusted code and saved in the AOT. 3. It verifies that the assert was executed on the same tier as the dangerous API. Но получается (если я правильно понял по аглицки): 1. Проверка, что код имеет соответствующее разрешение по стеку вызовов (интересно - какой стек вызовов должен быть, чтобы он не прошел проверку - просто без этого кода?) 2. Проверка, что вызов опасного API был вызван из "доверенного" кода, сохраненного в АОТ. А какой код не доверенный? Не сохраненный в АОТ?. Интересно - во-первых - как такой код исполняется (в Аксапте) и даже не столько это, а сколько то, что в Аксапте так просто создать код, сохраненный в АОТ и вызвать "опасный" код оттуда - что при желании так сделать - это сделать все равно можно. 3. Проверка, что код, вызывающий опасное API - вызывается это на той же стороне (клиент/сервер), что и само API. Вот это совсем непонятно.. Во первых вызвать код там где надо не составляет труда, а во-вторых - да какая разница? Т.е. как бы получается - что эта проверка в общем-то ничего не дает. Только если самому что-то писать (какие-то свои проверки) - тогда проверка нужна... Но тут и вопрос - если самому писать - то зачем тогда поддержка на уровне ядра? Или я что-то не так понял? Попутно присоединяюсь к вопросу автора ветки - почему запрещено-таки вызывать такие вещи, как сборка .NET, как ADO с сервера?
__________________
Возможно сделать все. Вопрос времени |
|
30.09.2008, 20:12 | #13 |
Участник
|
Цитата:
Цитата:
Сообщение от sukhanchik
2. Проверка, что вызов опасного API был вызван из "доверенного" кода, сохраненного в АОТ. А какой код не доверенный? Не сохраненный в АОТ?. Интересно - во-первых - как такой код исполняется (в Аксапте) и даже не столько это, а сколько то, что в Аксапте так просто создать код, сохраненный в АОТ и вызвать "опасный" код оттуда - что при желании так сделать - это сделать все равно можно.
Цитата:
|
|
|
За это сообщение автора поблагодарили: alex55 (1), player (1). |
30.09.2008, 21:57 | #14 |
Administrator
|
Для начала спасибо за столь развернутый ответ. Повторно репутацию увы поднять не могу, поэтому говорю просто спасибо .
Цитата:
Цитата:
Цитата:
Вот формы на сервере - не отобразишь. Но с другой стороны - это и никому не нужно - а если было бы нужно - то тоже я думаю - что можно было бы сделать. .NET - рулит и все такое... Понятно... В общем - резюмируя могу сказать - что пока по крайней мере можно предположить защиту от повторных вызовов X++ - .NET - X++. Хотя фантазии пока хватает на пределе. Т.е. конкретно для этого случая - можно заложить разрешения. Во всем остальном, особенно с ограничениями на серверный/клиентский вызов - не очень понятно. Не всегда ж "опасные" функции вызываются через .NET - иногда и сами по себе .
__________________
Возможно сделать все. Вопрос времени |
|
30.09.2008, 23:59 | #15 |
Участник
|
Цитата:
Сообщение от sukhanchik
пока не могу в голове смоделировать контрпример, в каких случаях этот механизм разрешений именно защитит пользователя от исполнения "опасного" кода. Т.е. представим себе - что все вызовы "опасных" функций обрамляются в разрешения. Чем такой "обрамленный" код отличается от "необрамленного"? Только кол-вом кода, генерацией security cookie и т.д. Т.е. все равно кол-во "опасных" вызовов при этом не уменьшится.
Цитата:
Цитата:
Последний раз редактировалось gl00mie; 01.10.2008 в 00:40. Причина: дополнение |
|
01.10.2008, 10:03 | #16 |
Administrator
|
Цитата:
Сообщение от gl00mie
Здесь принципиально то, что контроль над использованием опасных API выносится с уровня приложения на уровень ядра и становится, таким образом, доступен пользователю (администратору). Так, к примеру, на уровень "ядра" вынесены различные настройки параметров безопасности MSIE, и можно вручную или групповыми политиками настроить, что делать можно, а чего нельзя, не ковыряясь в каждом отдельном сайте, страничке или Java-скрипте. Аналогично, может быть, в будущих версиях Аксапты можно будет настраивать на уровне конфигурационной утилиты, какие именно "опасные API" можно использовать, к каким ресурсам и какого рода доступ можно предоставлять с их помощью.
Цитата:
Сообщение от gl00mie
Я тут подумал, что все же разница есть - именно применительно к разрешениям Предположим, что код приложения должен обратиться к какому-то файлу - для этого он запрашивает FileIOPermission с указанием, к какому именно файлу и в каком режиме (чтение, запись, добавление) код хочет обратиться. Если бы можно было получить разрешение на клиенте, а использовать его на сервере, то получилось бы, что проверка прошла бы для одного объекта (файла по тому пути, как он видится с машины клиента), а реальный доступ был бы осуществлен в общем случае к совершенно другому объекту (файлу по тому пути, как он видится на сервере, даже если это в точности такой же путь, что и на клиенте). Очевидно, такой ситуации допускать нельзя: к какому объекту запросили (и получили) разрешение на доступ, к тому и применяйте это разрешение. Отсюда, видимо, и ограничение, касающееся использования разрешения на том же уровне (на клиенте либо на сервере), на каком оно было получено. Цитата:
Просто у меня отношение к защите и безопасности - такое: Защита некоего действия не должна это действие отменять или запрещать. Т.е. бессмысленно в рамках охраны человека его убивать, дабы это не сделали другие. Бессмысленно в рамках защиты сервера полностью отключать к нему доступ. Бессмысленно в рамках поддержки делать такую бюрократическую проволочку - что от момента заявки пользователя (в случае, если это останавливает его работу) до момента устранения заявки проходит такое кол-во времени, что ставит под сомнение необходимость его работы в системе. Применительно к Аксапте - могу сказать - что каковы бы не были благородные намерения защищающих - но если в результате защиты нарушается принцип работы "вся работа с БД осуществляется на сервере" и работа сервера переносится на клиента - то в этом случае либо не нужна такая система, либо не нужна такая защита (в определенном смысле это же увеличивает стоимость владения системой - нужен новый комп, возможно и требуется обновление сетевого оборудования).
__________________
Возможно сделать все. Вопрос времени |
|
01.10.2008, 10:04 | #17 |
Administrator
|
В любом случае - очередной раз спасибо, gl00mie за потраченное время на разъяснение этого монстрового механизма.
__________________
Возможно сделать все. Вопрос времени |
|
01.10.2008, 11:59 | #18 |
Участник
|
Цитата:
Сообщение от sukhanchik
я тяжело себе представляю ограничение по использованию тех же WinAPI-функций - ибо среди них есть весьма мирные (типа вернуть текущее имя пользователя), а есть более опасные (типа завершения работы системы). Конечно я немного утрирую - но вряд ли будет в конфигурации всех API-функций. Максимум - сам факт их вызова. Ну если только на уровне самих функций будет определен уровень разрешения, который должен быть для возможности их запуска (аналогично свойству пункта меню NeedAccessLevel).
Цитата:
Сообщение от sukhanchik
"красивые и чистые" мысли разбиваются о "грязную" необходимость сокращения нагрузки на клиента (да и вообще на сетевой траффик). Т.е. в то время когда все учат выносить всю работу с БД на сервер (что логично) - мы с т.з. безопасности делаем это на клиенте, т.к. именно клиент выбирает файл для импорта.
Цитата:
Цитата:
Цитата:
The developers who put a lot of effort into optimizing things and making them tight and fast will wake up to discover that effort was, more or less, wasted, or, at the very least, you could say that it “conferred no long term competitive advantage,” if you’re the kind of person who talks like an economist.
The developers who ignored performance and blasted ahead adding cool features to their applications will, in the long run, have better applications. Цитата:
Сообщение от sukhanchik
Применительно к Аксапте - могу сказать - что каковы бы не были благородные намерения защищающих - но если в результате защиты нарушается принцип работы "вся работа с БД осуществляется на сервере" и работа сервера переносится на клиента - то в этом случае либо не нужна такая система, либо не нужна такая защита (в определенном смысле это же увеличивает стоимость владения системой - нужен новый комп, возможно и требуется обновление сетевого оборудования).
Последний раз редактировалось gl00mie; 01.10.2008 в 12:49. Причина: typo |
|
01.10.2008, 13:12 | #19 |
Administrator
|
Цитата:
Сообщение от gl00mie
Логика разработчиков и вообще "политика партии" может быть такая: зачем вам использовать WinAPI, если есть .NET? А в .NET вполне даже можно повесить разного рода ограничения и на каждый отдельный класс, и на каждый отдельный конструктор класса, и на каждый отдельный метод класса и рулить этим всем, опять же, через какие-нить групповые политики .... А использование WinAPI может со временем стать не соответствующим "политике партии" подходом, расцениваемым как потенциально опасный и рекомендуемым к отключению в настройках безопасности (если потом можно будет рулить настройками, какие CodeAccessPermission разрешать, а какие - нет).
В этом ключе вспоминается переход между DOS и Windows. Как было просто в DOSе и как сразу стали запрещены резидентные DOS-программы в Windows. В общем-то да - при эволюции всегда новое кажется ненужным, лишним и мешающим,однако - сейчас уже многие забыли или не знают как писать резидентные программы под DOS. И вроде как все без этого научились жить - в смысле приспособились к Windows. Значит и .NET приспособимся. Это понятно - что всегда можно обойти... Просто всегда напрягает - что знакомая и уже давно привычная конструкция перестает работать, из-за непонятного тебе нового механизма. Но как выше уже было сказано - в этом и состоит эволюционирование. Одни (МС) эволюционируют, другие (программисты) - приспосабливаются. Цитата:
Сообщение от gl00mie
тенденции развития той же Аксапты таковы, что значительная часть взаимодействия с конечными пользователями выносится на корпоративный портал. Это, с одной стороны, позволяет упростить доступ к системе ..., с другой, сэкономить на лицензиях, поскольку лицензии на Business Connector на порядок дешевле "обычных" пользовательских лицензий. В то же время переход на Web-интерфейс означает значительное ослабление контроля за тем, что может и чего не может делать клиент
В принципе - понятно - что все развивается - и 4-ка - это некий полуфабрикат той же 5-ки (2009), которая в свою очередь будет бета-версией для 6-рки и только где-то к 7-й версии все боле менее устаканится. Просто по сравнению с 4-ркой - 3-шка выглядела условно-законченным продуктом, в котором технологии были развиты до некоего потолка и закончены. И упор делался на функционал. А 4-рка - это первые предпосылки к 7-й версии . В общем-то понятно. Надо просто на 4-ку смотреть не столько как на развитие 3-шки, сколько на новую систему, смоделированную на базе 3-шки. А у новой системы и другая тенденция развития (на портал). Что ж - бум пересматривать взгляды и ломать стереотипы
__________________
Возможно сделать все. Вопрос времени |
|
02.12.2009, 15:56 | #20 |
Участник
|
Вопрос: а perm.assert(); должен стоять перед каждым обращением к COM? Или хватает 1 раз в начале?
|
|
Теги |
.net, cas, code access security, fileiopermission, interoppermission, security, безопасность |
|
|