 |  | |  | |
Пример использования Private Object Security в Delphi | Полный текст материала
Цитата или краткий комментарий: «... При создании серверных приложений зачастую встает вопрос разграничения доступа различных групп пользователей к функциям этого приложения. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 5 | 100% | | | | Ничего особенно нового и интересного | [2] | 0 | 0% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 5 | | | Все понятно, материал читается легко | [1] | 2 | 50% | | | | Есть неясности в изложении | [2] | 2 | 50% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 4 |
[Безопасность системы]
Отслеживать это обсуждение 
Всего сообщений: 817-04-2015 04:15Хорошая статья. Читается как продолжение "Защиты объектов в NT" Ins'а (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1322)
Ранее не приходилось сталкиваться с темой защиты. Но когда что-то понадобится, в Королевстве всегда найдется.
to voyager
Понятно, что приведенный Вами код небоевой, но создание объектов в обработчике нажатия кнопки (даже не в обработчике создания формы) без обязательного его уничтожения - сам по себе показателен. |
|
29-04-2011 06:03Прочитав статью решил попробовать сделать раздачу прав у себя в программе с помощью собственных средств безопасности Windows, но что-то не очень получается ((
Написал небольшую программку в которой хочу просто создать дескриптор безопасности, почему-то функция CreateDefaultSD(pSD) всегда возвращает false. При этом, если в вызове функции CreatePrivateObjectSecurity(nil, @SD, pSD, false, H, RightMapping) @SD заменить на nil то вроде как отрабатывает, т.е. получается что в оригинальном варианте CreatePrivateObjectSecurity не может скопировать CreatorDescriptor в NewDescriptor. Не могу разобраться в чем проблема. Код программы следующий...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, untSecUtils, untRightsMapping;
type
TSec = class
private
pSD: PSecurityDescriptor;
function CreateDefaultSD(out pSD: PSecurityDescriptor): boolean;
public
constructor Create();
end;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
constructor TSec.Create;
begin
if not CreateDefaultSD(pSD) then
ShowMessage('ERROR!!!');
end;
function TSec.CreateDefaultSD(out pSD: PSecurityDescriptor): boolean;
var
SD: TSecurityDescriptor;
Acl: PACL;
SzAcl: Cardinal;
SidAdmins, SidSystem: PSID;
H: THandle;
LastErr: Cardinal;
begin
Acl:= nil; SidAdmins:= nil; SidSystem:= nil; H:= 0;
try
Result:= AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, SidAdmins);
if not Result then Exit;
Result:= AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 1,
SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, SidSystem);
if not Result then Exit;
SzAcl:= sizeof(Acl^) + GetLengthSid(SidAdmins)
+ GetLengthSid(SidSystem) + 2 * ACE_ALLOWED_SIZE;
Acl:= Pointer(LocalAlloc(LMEM_FIXED, SzAcl));
Result:= Acl <> nil;
if not Result then Exit;
Result:= InitializeAcl(Acl^, SzAcl, ACL_REVISION);
if not Result then Exit;
Result:= AddAccessAllowedAce(Acl^,
ACL_REVISION, RightMapping.GenericAll, SidAdmins);
if not Result then Exit;
Result:= AddAccessAllowedAce(Acl^,
ACL_REVISION, RightMapping.GenericAll, SidSystem);
if not Result then Exit;
Result:= InitDescriptor(SD, [isdDacl, isdOwner, isdGroup],
Acl, nil, SidSystem, SidAdmins);
if not Result then Exit;
H:= GetCurrentToken(TOKEN_QUERY);
Result:= H <> 0;
if not Result then Exit;
Result:= CreatePrivateObjectSecurity(nil, @SD, pSD, false, H, RightMapping);
finally
LastErr:= GetLastError;
if H <> 0 then CloseHandle(H);
if Acl <> nil then LocalFree(Cardinal(Acl));
if SidAdmins <> nil then FreeSid(SidAdmins);
if SidSystem <> nil then FreeSid(SidSystem);
SetLastError(LastErr);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
FSec: TSec;
begin
FSec := TSec.Create;
end;
end. |
|
11-04-2008 02:152 Dioran
Вероятно, передать ей валидные владельца и группу? :) В общем случае это может быть связано с недостаточными правами у вызывающего кода или у переданного в функцию маркера. Опишите ситуацию более подробно, с кодом. |
|
09-04-2008 08:06А что делать, если функция CreatePrivateObjectSecurity выдаёт ошибку INVALID OWNER и INVALID GROUP, хотя остальное всё проходит нормально? |
|
30-03-2008 02:56Прошу извинить за задержку, только сегодня увидел, что статья опубликована.
2 Мухтар
>>>1. Как эта модель работает, если клиент и сервер находятся в разных адресных пространствах? Интуитивно понимаю, что делается это через маршаллинг SUID, но в статье информация об этом умалчивается.
Просто мне казалось это очевидным, но, как видно, я ошибся:) Клиент отправляет серверу посредством некоего транспортного протокола запрос на выполнение неких действий. В прилагаемом к статье примере для этого использован именованный канал (NamedPipe). Сервер извлекает из полученного пакета информацию о том, какие именно действия хочет выполнить клиент, затем проверяет, имеет ли клиент права на выполнение данных действий, и либо выполняет их, либо отклоняет запрос, возвращая клиенту код ERROR_ACCESS_DENIED. Сам же клиент идентифицируется средствами ОС, так как именованные каналу позволяют серверу получать необходимую информацию о клиенте. Реализуется это вызовом ImpersonateNamedPipeClient с последующим получением текущего маркера потока. Однако ничто не мешает передать от клиента серверу имени и пароля клиента, тогда сервер сможет идентифицировать клиента вызовом LogonUser.
>>>2. Работает ли эта модель, если сервер и клиент находятся в одном адресном пространстве? Я так понимаю, что работает, если мы разрабатываем защиту от ошибок. Но защиту от умышленных действий, в одном адресном пространстве по-моему не сделаешь.
Рассмотренный механизм предназначен для использования в клиент-серверных приложениях, когда клиент не имеет физического доступа к защищаемому объекту, и все действия над ним может выполнять только через запросы серверу. Кроме того, в статье рассматривается реализация механизма разграничения доступа, когда разные клиенты имеют разные права на выполнение действий с защищаемым объектом. Защита же от разного рода атак к данной теме не относится и выходит за рамки данной статьи.
>>>3. Не представлено никакой информации о том, как контроллировать использование данных и методов, если писать программу не на WinAPI а с использованием библиотек и VCL
Это потому, что нет никакой разницы, вызывать AccessCheck перед вызовом API функции или методов дельфийского класса. В примере, кстати, в качестве защищаемого используется объект класса TStringList - вполне себе VCL-ный:))
|
|
28-03-2008 14:44Пока автор не отозвался, предложу другой способ контроля умышленных ошибок в клиентских и серверных приложениях. Мысль пришла мне в голову после того, как я получил по почте спам на английском языке, с тяжелым для восприятия текстом.
Суть в том, чтобы использовать между недоверенным приложением (клиентом) и приложением, находящемся в нашем адресном пространстве (сервером), промежуточное звено в виде такого же сервера и типового клиента, реализующего эмулятор. Тогда ошибка сервера произойдет в эмуляторе, а а реальный сервер продолжит работу, с другими клиентами или после замены виртуального эмулятора. |
|
28-03-2008 02:07Век живи - век учись.
Правду говорят - чтобы задать вопрос нужно знать половину ответа. Теперь, спасибо автору, я знаю что есть возможность использовать штатные механизмы безопасности Win в своих приложениях. Раньше мне просто не приходило в голову что это возможно. Вот за эту информацию и спасибо.
А что касается кода реализации - ответ простой - "И да поможет Вам Google!" (и www.krugle.org) |
|
27-03-2008 13:09Есть неясности в изложении. Посему с Вашего позволения начнем обсуждение :-)
1. Как эта модель работает, если клиент и сервер находятся в разных адресных пространствах? Интуитивно понимаю, что делается это через маршаллинг SUID, но в статье информация об этом умалчивается.
2. Работает ли эта модель, если сервер и клиент находятся в одном адресном пространстве? Я так понимаю, что работает, если мы разрабатываем защиту от ошибок. Но защиту от умышленных действий, в одном адресном пространстве по-моему не сделаешь.
3. Не представлено никакой информации о том, как контроллировать использование данных и методов, если писать программу не на WinAPI а с использованием библиотек и VCL.
Хотелось бы услышать ответы на все 3 пункта.
Открыл для себя новое, но в статье не сказано о том, кому рекомендован путь использования механизма Private Object Security. А он чреват затруднениями и ошибками. |
|
|
|