ACL访问控制模拟实验
计算机系统安全实验-------模拟ACL
实验要求
模拟实现ACL访问控制机制,设计这样的ACL表,并实现以下功能:当进程试图访问一个对象时,系统中该对象的管理程序从访问令牌中读取SID,然后扫描该对象的 DACL,并进行一下三个判断:
- 如果目录对象中没有访问控制表(DACL),则系统允许所有进程访问该对象。
- 如果目录对象中有访问控制表(DACL),但访问控制条目 ACE 为空,则系统允许所有进程都拒绝访问该对象。
- 如果目录对象中有访问控制表(DACL),且访问控制条目 ACE 不为空,那么如果找到一个访问控制项,它的 SID 与访问令牌中的一个 SID 匹配,那么该进程具有访问控制箱的访问掩码所确定的访问权限。
代码运性系统:windows 10
代码编辑器:Qt 2.12.4
语言:C++
给出纯C++的程序
``#include
#include
using namespace std;
typedef struct{
string SID;
string NAME;//内容和access一样,作为链接物
}access;
typedef struct{
string SID;
string ACE_empty;
string access_mask;//访问掩码
}ACL;
typedef struct{
ACL ACLM[2];//ACLM作为ACL的对象,存储SID ACE access_mask
string empty;
string ACL_title;//和DACL名字一样—string类的
}DACL;
access a[2];
void Init_access(){
a[0].SID=string(“001”);
a[0].NAME=string(“liu”);
a[1].SID=string(“002”);
a[1].NAME=string(“zhang”);
};
DACL b[3];
void Init_object(){//被访问对象
b[0].empty=string(“NO”);//A有访问控制列表DACL
b[0].ACL_title=string(“A”);
b[0].ACLM[0].ACE_empty=string(“NO”); //liu文件A–有访问控制项ACE
b[0].ACLM[0].SID=string(“001”);
b[0].ACLM[0].access_mask=string(“O,W,R”);
b[0].ACLM[1].ACE_empty=string(“NO”);//zhang 文件A
b[0].ACLM[1].SID=string(“002”);
b[0].ACLM[1].access_mask=string(“O”);
cout<<b[0].ACL_title<<endl;
b[1].empty=string("NO");
b[1].ACL_title=string("B");
b[1].ACLM[0].ACE_empty=string("NO");
b[1].ACLM[0].SID=string("001");
b[1].ACLM[0].access_mask=string("W,R");
b[1].ACLM[1].ACE_empty=string("YES");//ACE为空,待会拒绝所有访问
b[1].ACLM[1].SID=string("002");
b[2].empty=string("YES");
b[2].ACL_title=string("C");
};
access major;
DACL document;
int flag1=0,flag2=0;
void use(string X,string Y,string Z){
for(int i=0;i<2;i++){
if(X==a[i].NAME){
major=a[i];//主体
flag1=1;
break;
}
}
if(flag1==0)
cout<<"ssssssssssssssss1";
for(int i=0;i<3;i++){
if(Y==b[i].ACL_title){
document=b[i];//客体
flag2=1;
break;
}
}
if(flag2==0)
cout<<"ssssssssssssssss2";
if(document.empty=="YES"){
cout<<"此文件没有访问控制表DACL,允许访问"<<endl;
}
else{
string sid=major.SID;
for(int i=0;i<2;i++){
if(sid==document.ACLM[i].SID){
if(document.ACLM[i].ACE_empty=="YES")
{
cout<<"访问控制条目ACE为空,拒绝一切访问"<<endl;
break;
}
else{
string access_mask=document.ACLM[i].access_mask;
if(access_mask.find(Z)==string::npos)//Z在access_mask里吗?
{
cout<<"不具有该权限"<<endl;
}
else{
cout<<"具有该权限"<<endl;
}
}
break;
}
}
}
}
int main()
{
Init_access();
Init_object();
cout<<b[1].ACL_title<<endl;
string X,Y,Z;
cout<<"请输入访问主体"<<endl;
cin>>X;
cout<<"请输入访问客体"<<endl;
cin>>Y;
cout<<"请输入访问访问方式"<<endl;
cin>>Z;
use(X,Y,Z);
}
然后给出QT界面截图(增加了修改权限和多个权限同时访问的功能)
代码上传到这里了,设置的免费、免积分下载,应该可以下载。(最近墙高了,节点不好用,github不上去了)
https://download.csdn.net/download/qq_45772960/85820976