如何设置内核对象的访问控制列表
发布网友
发布时间:2022-04-12 12:43
我来回答
共2个回答
懂视网
时间:2022-04-12 17:05
一、ACL在应用时遵循的规则: 1.按顺序比较 列表 的每一行 2.按顺序比较ACL的各行,直到找到匹配的一行,一旦数据包匹配上ACL的某一 行,将遵照规定行事,不在进行后续比较(意味著 列表 应按使用频率来排列) 3. 在每个ACL的最后一行隐含了“deny”语句。 4.
一、ACL在应用时遵循的规则:
1.按顺序比较列表的每一行
2.按顺序比较ACL的各行,直到找到匹配的一行,一旦数据包匹配上ACL的某一
行,将遵照规定行事,不在进行后续比较(意味著列表应按使用频率来排列)
3. 在每个ACL的最后一行隐含了“deny”语句。
4.把ACL应用到端口的命令:
A.R1#ip access-group 10 in
B.R1#access-list 10 in(在vty模式下的acl应用默认就只针对telnet)
二、ACL的两大类型:
1.standard ACL:只使用源IP地址作为条件(放在离目的的最近的接口out)
R1#access-list 10 deny 192.168.0.128 0.0.0.127
注:每个块的大小必须从0或一个快大小的倍数开始
2.extend ACL:条件可以是3层的协议、4层的端口号以及源、目标IP地址(放在
离源地址最近的接口in)
3.domain ACL:以上两种的不同表示,但功能是一样的
注:每接口、每协议、每方向只能分配一个ACL
只有domain ACL可以从列表中删除一行或者在列表中插入一行
三、ACL的各种应用:
1、交换机端口ACL:只支持第2层物理层接口,并且只能把它们应用在接口的
入口列表上,只能使用命名访问控制列表
2、ACL可用于虚拟局域网的流量控制,这需要ACL应用到中继端口
3、对于基于IP和MAC的ACL,单独的接口上,只能应用其中的一个,后者会覆
盖前者
eg:S1#mac access-list extended Blocksales
S1#deny any host 000d.29bd.4b85
S1#permit any any
S1#interface fa 0/1
S1#mac access-group Blocksales in
4、锁和钥匙(动态ACL)?
5、自反ACL?
6、基于时间的ACL:
eg:R1#time-range worktime
R1#periodic weekend 09:00 to 18:00
R1#exit
R1#time-range freetime
R1#periodic weekend 18:00 to 22:00
R1#exit
R1#ip access-list extended time
R1#deny tcp any any eq www time-range worktime
R1#permit tcp any any time-range freetime
R1#interface fa0/0
R1#ip access-group time in
R1#exit
注释:R1#ip access-list extended time
R1#remark leash the action of internet on worktime
R1#deny tcp any any eq www time-range worktime
午夜游
热心网友
时间:2022-04-12 14:13
这个你可以参考两本资料,一本是windows internasl ,一本是windows安全编程(目前有中文版了) ,这两本书详细描述了内核对象的访问控制。然后,下面是一个win2000上的例子,虽然代码老了,但是思路还是有的:实例是创建一个在Windows2000下不会被杀死的计事本程序
void Test()
{
printf("本程序将创建一个不可被杀死的记事本!\n");
PSID pEveryoneSID = NULL; // everyone群组SID
PSID pAdminSID = NULL; // 本机系统管理员群组SID
EXPLICIT_ACCESS ea[3]; // ACE内容
PACL pProcessACL = NULL; // 进程的DACL
PSECURITY_DESCRIPTOR pSD = NULL; // 进程的SD
SECURITY_ATTRIBUTES saProcess; // 进程SA
DWORD dwRet;
// 以下创建SID
// S-1-1-0
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0, &pEveryoneSID))
{
printf("AllocateAndInitializeSid failed! EveryoneSID\n");
goto Err;
}
// S-1-5-32-0x220
if (!AllocateAndInitializeSid(&SIDAuthNT, 1, SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSID))
{
printf("AllocateAndInitializeSid failed! AdminSID\n");
goto Err;
}
// S-1-5-32-0x1F4
PSID pAdminuUserSID;
if (!AllocateAndInitializeSid(&SIDAuthNT, 1, SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_USER_RID_ADMIN, 0, 0, 0, 0, 0, 0, &pAdminuUserSID))
{
printf("AllocateAndInitializeSid failed! pAdminuUserSID\n");
goto Err;
}
// 填充外部访问组
ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
// S-1-1-0,禁止关闭进程和修改参数
ea[0].grfAccessPermissions = PROCESS_TERMINATE|PROCESS_SET_INFORMATION;
ea[0].grfAccessMode = GRANT_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
// S-1-5-32-0x220,禁止关闭进程和修改参数
ea[1].grfAccessPermissions = PROCESS_TERMINATE|PROCESS_SET_INFORMATION;
ea[1].grfAccessMode = GRANT_ACCESS;
ea[1].grfInheritance= NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName = (LPTSTR) pAdminSID;
// S-1-5-32-0x1F4,禁止关闭进程和修改参数
ea[2].grfAccessPermissions = PROCESS_TERMINATE|PROCESS_SET_INFORMATION;
ea[2].grfAccessMode = GRANT_ACCESS;
ea[2].grfInheritance= NO_INHERITANCE;
ea[2].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[2].Trustee.TrusteeType = TRUSTEE_IS_USER;
ea[2].Trustee.ptstrName = (LPTSTR) pAdminuUserSID;
// 创建并填充ACL
dwRet = SetEntriesInAcl(3, ea, NULL, &pProcessACL);
if (dwRet != ERROR_SUCCESS)
{
printf("SetEntriesInAcl failed!\nCode = %d", dwRet);
goto CleanUp;
}
// 创建并初始化SD
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH);
if (pSD == NULL)
{
printf( "LocalAlloc failed!\n");
goto Err;
}
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
{
printf( "InitializeSecurityDescriptor failed!\n");
goto Err;
}
// 添加ACL到SD中去
if (!SetSecurityDescriptorDacl(pSD,
TRUE, // fDaclPresent flag
pProcessACL,
FALSE)) // not a default DACL
{
printf( "SetSecurityDescriptorDacl failed!");
goto Err;
}
// 设置SA
saProcess.nLength = sizeof(SECURITY_ATTRIBUTES);
saProcess.lpSecurityDescriptor = pSD;
saProcess.bInheritHandle = FALSE;
// 运行进程并等待其正常结束
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo);
if (CreateProcess("c:\\winnt\\notepad.exe", NULL,
&saProcess, NULL, FALSE, 0, NULL,
NULL, &StartupInfo, &ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
printf("CreateProcess failed!\n");
goto Err;
}
// Clean up
CleanUp:
printf("Exiting...\n");
if (pEveryoneSID != NULL)
{
FreeSid(pEveryoneSID);
}
if (pAdminSID != NULL)
{
FreeSid(pAdminSID);
}
if (pProcessACL != NULL)
{
LocalFree(pProcessACL);
}
if (pSD != NULL)
{
LocalFree(pSD);
}
printf("Success!\n");
return;
// Error process
Err:
DWORD dwErr;
dwErr = GetLastError();
printf("Code = %d \n", dwErr);
goto CleanUp;
}