Добавление аудита к файлам в Win2K
От: DelpH  
Дата: 09.12.02 13:14
Оценка:
Какой функцией можно добавить аудит определенного события для файла? Я нашел функцию AddAuditAccessObjectAce, но не могу получить для нее правильный SID. Как это можно сделать и нужно формировать маску? Если кто использовал, подскажите плиз.
Re: Добавление аудита к файлам в Win2K
От: Алекс Россия http://wise-orm.com
Дата: 09.12.02 13:30
Оценка:
Здравствуйте, DelpH, Вы писали:

DH>Какой функцией можно добавить аудит определенного события для файла? Я нашел функцию AddAuditAccessObjectAce, но не могу получить для нее правильный SID. Как это можно сделать и нужно формировать маску? Если кто использовал, подскажите плиз.


Это делается очень просто с помощью функции AddAuditAccessAce.
Давай ее расмотрим подробно
BOOL AddAuditAccessAce(
  PACL pAcl,           // access-control list
  DWORD dwAceRevision, // ACL revision level
  DWORD dwAccessMask,  // access mask
  PSID pSid,           // security identifier
  BOOL bAuditSuccess,  // auditing successful access
  BOOL bAuditFailure   // auditing unsuccessful access 
);


Первый параметр — ACL твоего файлика. Т.е. ты считываешь ACL файла и создаешь новый большего размера. Вот его-то и передаешь в первый параметр. Как вычеслить размер ACL + ACE, если сам не разберешься — подскажу.
Вторым параметром всегда передаешь ACL_REVISION.
Третьим — доступ на который будет генерироваться событие аудита.
4 — Sid пользователя. Его можно получить с помощью функции LookupAccountName.
5 и 6 — понятно.

Самое трудное — подготовить ACL. Очень подробную информацию по этому поводу можно найти в этой книге
Автор(ы): Джеффри Рихтер, Джейсон Кларк
В книге Джеффри Рихтера и Джейсон Кларка исчерпывающе описаны функции новой операционной системы
Microsoft — Windows 2000, позволяющие создавать высокопроизводительные и
надежные серверные приложения. Менеджер управления службами, контроль
производительности и системных событий, асинхронный ввод-вывод, система
безопасности и защищенное взаимодействие приложений обеспечат надежную и
эффективную работу ваших приложений в качестве служб операционной системы 24
часа в сутки 7 дней в неделю. Все главы содержат примеры, написанные на C++,
демонстрирующие описываемые технологии. Вы можете использовать в своих
приложениях фрагменты этих программ и готовые классы C++, исходные тексты
которых содержатся на прилагаемом компакт-диске. Книга состоит из 12 глав, 2
приложений и предметного указателя. Прилагаемый к книге компакт-диск содержит
программное обеспечение, примеры приложений, документацию и электронную версию
книги.
.
Re: Добавление аудита к файлам в Win2K
От: Dima2  
Дата: 09.12.02 13:35
Оценка:
Здравствуйте, DelpH, Вы писали:

DH>Какой функцией можно добавить аудит определенного события для файла? Я нашел функцию AddAuditAccessObjectAce, но не могу получить для нее правильный SID.

Что значит правильный. Сюда ты должен запихнуть SID юзера или группы для которых будет происходить аудит. Если для "всех", то S-1-1-0, и т.п.

DH>Как это можно сделать и нужно формировать маску? Если кто использовал, подскажите плиз.

Для каждого типа объектов ядра есть свои флаги доступа, и для файлов тоже если не хочеш в них рыться то попробуй задать базовые GENERIC_READ, GENERIC_WRITE ... Они проецируются на соотв-е права конкретного типа объектов.
Re: Добавление аудита к файлам в Win2K
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 09.12.02 13:52
Оценка:
Здравствуйте, DelpH, Вы писали:

DH>Какой функцией можно добавить аудит определенного события для файла? Я нашел функцию AddAuditAccessObjectAce, но не могу получить для нее правильный SID. Как это можно сделать и нужно формировать маску? Если кто использовал, подскажите плиз.
Re[2]: Добавление аудита к файлам в Win2K
От: DelpH  
Дата: 09.12.02 15:50
Оценка:
Сид теперь вроде получается нормально, но при открытии свойств появляется сообщение, что весь ACL настроен неправильно и лучше его resetнуть. В чем ошибка? Делаю так:

// получаем сид (собств. функция)
GetAccountSid(NULL, "delph", &user);
// Подсчет необх. размера — это правильно ?
aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) +
sizeof (SYSTEM_AUDIT_ACE) + GetLengthSid(user) — sizeof (DWORD);
newACL = (PACL) new BYTE [aclSize];
if (!InitializeAcl (newACL, aclSize, ACL_REVISION))
{ MessageBox(NULL, "Error4!", "Error", MB_OK); }
if(CopyACL(pacl, newACL) != ERROR_SUCCESS)
{ MessageBox(NULL, "Error5!", "Error", MB_OK); }
if(!AddAuditAccessAce(newACL, ACL_REVISION, GENERIC_WRITE, user, TRUE, FALSE))
{ DWORD er = GetLastError(); DisplayError(er); }


Получаю ACL так: разрешаю привилению SE_SECURITY_NAME, потом получаю дескриптор безопасности ф-ей GetFileSecurity и функцией GetSecurityDescriptorDacl получаю АЦЛ лист (вроде) так:
GetFileSecurity(DFILE, si, psd, dwSize, &dwSize);
где si = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;


Устанавливаю обратно ACL так: инициализирую деск. безопасности ф-ей InitializeSecurityDescriptor и далее так:
if(SetNamedSecurityInfo(DFILE, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, newACL, NULL) != ERROR_SUCCESS)
{ MessageBox(NULL, "SetNamedSecurityInfo Error!", "Error", MB_OK); }


CopyAcl представляет из себя следующее:
DWORD CopyACL(PACL OldACL, PACL NewACL)
{
ACL_SIZE_INFORMATION aclSizeInfo;
LPVOID ace;
ACE_HEADER *aceHeader;
ULONG i;
GetAclInformation (OldACL, (LPVOID) &aclSizeInfo, (DWORD) sizeof (aclSizeInfo), AclSizeInformation);
for (i = 0; i < aclSizeInfo.AceCount; i++)
{

if (!GetAce (OldACL, i, &ace))
return GetLastError();
aceHeader = (ACE_HEADER *) ace;
if (!AddAce (NewACL, ACL_REVISION, 0xffffffff, ace, aceHeader->AceSize))
return GetLastError();
}
return ERROR_SUCCESS;
}
Re[3]: Добавление аудита к файлам в Win2K
От: Алекс Россия http://wise-orm.com
Дата: 10.12.02 04:59
Оценка:
Здравствуйте, DelpH, Вы писали:

[]

Да вроде все нормально. Я бы посоветовал только сначала без добавления нового ACE установить скопированный. Если он будет нармальный, то ошибка при добавлении, если не нормальный — при копировании и/или вычислении размера.
Re[3]: Добавление аудита к файлам в Win2K
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 10.12.02 06:33
Оценка:
Во првых ошибка — DACL_SECURITY_INFORMATION надо заменить или про ORить с SACL_SECURITY_INFORMATION — так как вставляете Audit ACE

Я понимаю, что навязывать своё не стоит много раз, но всё же:

        sd sdFile;
        acl aclFile;
                sid yourUser("delph");
        aclFile.AddAce( (DWORD) -1, SYSTEM_AUDIT_ACE_TYPE, 0, OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE, GENERIC_ALL, yourUser)    
        
        aclFile.AddAce( (DWORD) -1, SYSTEM_AUDIT_ACE_TYPE, 0, OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE, GENERIC_READ | FILE_TRAVERSE , sid().sidWorld );
        aclFile.canonicalize();
        aclFile.normalize();
        
        sdFile.SetDacl(aclFile);
        SetFileSecurity(sPath, SACL_SECURITY_INFORMATION, sdFile);


это с помощью той библиотеки. почему я её советую — потому что в WinSecurity много тонких мест(таких как порядок ACE и много другое). Плюс библиотека написана одним из знающих людей и многократно после этого опробована. Есть конечно минус — она слегка устарела, но для Ваших нужд должно хватить. Попробуйте.
Re[4]: Добавление аудита к файлам в Win2K
От: Алекс Россия http://wise-orm.com
Дата: 10.12.02 07:04
Оценка:
Здравствуйте, Denis, Вы писали:

[]

D>это с помощью той библиотеки. почему я её советую — потому что в WinSecurity много тонких мест(таких как порядок ACE и много другое). Плюс библиотека написана одним из знающих людей и многократно после этого опробована. Есть конечно минус — она слегка устарела, но для Ваших нужд должно хватить. Попробуйте.


А что за библиотека?
Re[5]: Добавление аудита к файлам в Win2K
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 10.12.02 07:17
Оценка:
Здравствуйте, Алекс, Вы писали:

А>Здравствуйте, Denis, Вы писали:


А>[]


D>>это с помощью той библиотеки. почему я её советую — потому что в WinSecurity много тонких мест(таких как порядок ACE и много другое). Плюс библиотека написана одним из знающих людей и многократно после этого опробована. Есть конечно минус — она слегка устарела, но для Ваших нужд должно хватить. Попробуйте.


А>А что за библиотека?



Ой! а я и не глянул что пост почему пустой был... =(
вот она
приношу извинения.(но я честно писал адрес)
Re[6]: Добавление аудита к файлам в Win2K
От: DelpH  
Дата: 11.12.02 11:52
Оценка:
За либу спасибо. Но до нее руки еще не дошли. В общем теперь такая проблема: если в списке пользователей стоит Everyone, то любой аудит добавляется нормально. Но если же там прописан хотя бы еще один пользователь, то добавляется и ему Read&Execute аудит с типом Unknown, а сам внутри пустой ...
Re[7]: Добавление аудита к файлам в Win2K
От: Алекс Россия http://wise-orm.com
Дата: 11.12.02 11:54
Оценка:
Здравствуйте, DelpH, Вы писали:

хъ

Не понял. Приведи код.
Re[8]: Добавление аудита к файлам в Win2K
От: DelpH  
Дата: 11.12.02 12:36
Оценка:
Вот код:

GetNamedSecurityInfo( DFILE, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION
| SACL_SECURITY_INFORMATION, NULL, NULL, &pAclDacl, &pAclSacl, &psd );
GetAclInformation (pAclDacl, (LPVOID) &aclSizeInfo, (DWORD) sizeof (ACL_SIZE_INFORMATION), AclSizeInformation);
GetAccountSid(NULL, "Everyone", &user);
aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) + sizeof (SYSTEM_AUDIT_ACE) + GetLengthSid(user) — sizeof (DWORD);
newACL = (PACL) new BYTE [aclSize];
InitializeAcl (newACL, aclSize, ACL_REVISION);
CopyACL(pAclDacl, newACL);
if(!AddAuditAccessAce(newACL, ACL_REVISION, FILE_GENERIC_WRITE, user, TRUE, TRUE))
{ DWORD er = GetLastError(); DisplayError(er); }
SetNamedSecurityInfo(DFILE, SE_FILE_OBJECT, SACL_SECURITY_INFORMATION, NULL, NULL, NULL, newACL);

В списке "субъектов" доступа к файлу стоят "Everyone" и "delph" например. На данный момент нет ни одного аудита, при выполнении в аудите появляются 2 (!) записи (а должна быть только одна для Everyone). Т.е. появился "лишний" аудит на delph, который имеет хитрый тип Unknown. Как сделать, чтоб появлялся только один ?
Re[9]: Добавление аудита к файлам в Win2K
От: Алекс Россия http://wise-orm.com
Дата: 11.12.02 12:47
Оценка:
Здравствуйте, DelpH, Вы писали:

[]

DH>В списке "субъектов" доступа к файлу стоят "Everyone" и "delph" например. На данный момент нет ни одного аудита, при выполнении в аудите появляются 2 (!) записи (а должна быть только одна для Everyone). Т.е. появился "лишний" аудит на delph, который имеет хитрый тип Unknown. Как сделать, чтоб появлялся только один ?


Для форматирования кода имеются специальные теги. Очень рекомендую использовать.
По существу: будь внимательнее!

GetAclInformation(pAclDacl, (LPVOID) &aclSizeInfo, (DWORD) sizeof (ACL_SIZE_INFORMATION), AclSizeInformation); 
...
CopyACL(pAclDacl, newACL);


Должно быть pAclSacl.
Re[10]: Добавление аудита к файлам в Win2K
От: DelpH  
Дата: 11.12.02 13:15
Оценка:
Угу, я так тоже делал — тот же результат! Появляется лишний аудит млин ...
Re[11]: Добавление аудита к файлам в Win2K
От: Алекс Россия http://wise-orm.com
Дата: 11.12.02 13:20
Оценка:
Здравствуйте, DelpH, Вы писали:

DH>Угу, я так тоже делал — тот же результат! Появляется лишний аудит млин ...


Выделяй минимальный код и приводи. Так чтобы я мог его с минимальными изменениями проверить.
Re[12]: Добавление аудита к файлам в Win2K
От: DelpH  
Дата: 11.12.02 14:06
Оценка:
Эээ ... а мыла у тя нету ? Или все сюда пихать — там много ...
Re[13]: Добавление аудита к файлам в Win2K
От: Алекс Россия http://wise-orm.com
Дата: 13.12.02 08:22
Оценка:
Здравствуйте, DelpH, Вы писали:

DH>Эээ ... а мыла у тя нету ? Или все сюда пихать — там много ...


Мыло есть, но если кода много, то лучше пихай сюда.

З.Ы. Вообще чем меньше кода ты "напихаешь", тем быстрее мы тебе поможем.
Re[14]: Добавление аудита к файлам в Win2K
От: DelpH  
Дата: 17.12.02 13:08
Оценка:
Привожу main() ...

int main()
{

DWORD dwSize;
SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION;
PSECURITY_DESCRIPTOR psd;
PACL pAclDacl, pAclSacl;
PTRUSTEE pOwner = NULL, pGroup = NULL;
ULONG cDaclLen, cSaclLen;
PEXPLICIT_ACCESS pDacl = NULL, pSacl = NULL;
BOOL bP, bD;
ACL_SIZE_INFORMATION aclSizeInfo;
int aclSize;
PACL newACL;
BOOL bRes;
PSID user = NULL;
DWORD result;

if(!SetPriv(SE_SECURITY_NAME, true))
{
MessageBox(NULL, "Can't set privilege\n.", "Error", MB_OK);
}

dwSize=0;
psd = 0;

result = GetNamedSecurityInfo( DFILE, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION
| SACL_SECURITY_INFORMATION, NULL, NULL, &pAclDacl, &pAclSacl, &psd );

if(!SetPriv(SE_SECURITY_NAME, false))
{
MessageBox(NULL, "Can't set privilege\n.", "Error", MB_OK);
}

if(!GetAclInformation (pAclSacl, (LPVOID) &aclSizeInfo, (DWORD) sizeof (ACL_SIZE_INFORMATION),
AclSizeInformation))
{
MessageBox(NULL, "Error3!", "Error", MB_OK);
}

GetAccountSid(NULL, "Everyone", &user);

aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) +
sizeof (SYSTEM_AUDIT_ACE) + GetLengthSid(user) —
sizeof (DWORD);

newACL = (PACL) new BYTE [aclSize];

if (!InitializeAcl (newACL, aclSize, ACL_REVISION))
{
DWORD er = GetLastError();
DisplayError(er);
}

result = CopyACL(pAclSacl, newACL);

if(result)
{
DisplayError(result);
}

if(!AddAuditAccessAce(newACL, ACL_REVISION, FILE_GENERIC_WRITE, user, TRUE, TRUE))
{
DWORD er = GetLastError();
DisplayError(er);
}

if(!SetPriv(SE_SECURITY_NAME, true))
{
MessageBox(NULL, "Can't set privilege\n.", "Error", MB_OK);
}

if(SetNamedSecurityInfo(DFILE, SE_FILE_OBJECT, SACL_SECURITY_INFORMATION, NULL, NULL, NULL, newACL) != ERROR_SUCCESS)
{
MessageBox(NULL, "SetNamedSecurityInfo Error!", "Error", MB_OK);
}

if(!SetPriv(SE_SECURITY_NAME, false))
{
MessageBox(NULL, "Can't set privilege\n.", "Error", MB_OK);
}

return 0;

}
Re[15]: Добавление аудита к файлам в Win2K
От: Алекс Россия http://wise-orm.com
Дата: 17.12.02 13:26
Оценка:
Здравствуйте, DelpH, Вы писали:

И каков результат выполнения программы?

З.Ы. Пользуйся тегами форматирования.
Re[16]: Добавление аудита к файлам в Win2K
От: DelpH  
Дата: 17.12.02 14:45
Оценка:
Всем спасибо большое! Теперь работает ... (млин)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.