【无标题】

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
QtUI截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值