安全编程技术实验二

Windows系统中的访问控制

一、实验目的

该实验为验证性实验,实验目的如下:
1.掌握访问控制列表的基本原理。
2.学会通过编程实现更改Windows操作系统中文件或目录的访问控制列表。

二、实验内容及步骤

1.理解ACL的基本原理。
2.编程实现更改一个已存在的文件或目录的访问控制列表,具体如下:
(1)首先,利用File:GetAccessControl()从已存在的文件或目录中取得FileSecurity或DirectorySecurity对象。
(2)接着利用FileSystemAccessFule设置新的访问控制规则,并添加新规则至前面获取的FileSecurity或DirectorySecurity对象中。
(3)最后调用File:SetAccessControl()使添加的新规则生效。

三、实验要求

1.本实验一人一组,编程语言为C#。
2.要求学生掌握ACL的基本原理,并熟练掌握所选的编程语言。
3.要求学生在Windows操作系统下,设计一个访问控制列表的实例。
4.实验报告要求:实验报告要求包括实验目的、实验要求、实验内容、实验结果分析和实验体会等,重点在于实验内容和实验结果分析。实验报告要求上传和打印。写出实验过程中的心得和体会,并回答实验中的思考题。实验报告撰写规范请见附。

四、实验所涉及的知识点

本实验涉及的知识点包括访问控制的基本原理和实现方式、Windows系统中访问控制的实现原理等。

五、实验环境

计算机:Windows11、Java

六、实验验证原理

1.访问控制列表(AccessControlList,ACL):ACL是目前采用最多的一种访问控制实现方式,Windows系统中就主要是采用ACL实现访问控制。如下图所示,ACL在一个客体上附加一个主体明细表,来表示各个主体对这个客体的访问权限,明细表中的每一项都包括主体的身份和主体对客体的访问权限。利用ACL,能够很容易的判断出对于特定客体的授权访问,哪些主体可以访问并有哪些访问权限;同样也很容易撤消特定客体的授权访问,只要把该客体的访问控制表置为空。

2.在Windows操作系统中,可以利用.NETFramework2.0提供的两个类——FileSecurity和DirectorySecurity来实现更改文件或目录的访问控制列表,具体的访问控制规则是通过FileSystemAccessFule类来定义的。具体这些类的用法可以查阅MSDN或参考《编写安全的代码(第2版)》(MichaelHoward,DavidLeBlanc,机械工业出版社,2005年)

七、实验运行截图

改变前

改变后


八、实验代码

//main.java
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.*;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import static java.nio.file.attribute.AclEntryPermission.READ_DATA;
import static java.nio.file.attribute.AclEntryPermission.WRITE_DATA;
public class main {
    public static void main(String[] args) {   
        Path path = Paths.get("C:\\Users\\86159\\OneDrive\\桌面\\test.txt");
        AclFileAttributeView aclView = Files.getFileAttributeView(path,
                AclFileAttributeView.class);
        if (aclView == null) {
            System.out.format("ACL view  is not  supported.%n");
            return;
        }
        try {
            UserPrincipal bRiceUser = FileSystems.getDefault()
                    .getUserPrincipalLookupService().lookupPrincipalByName("LAPTOP-58GGTS3L\\86159");

            Set<AclEntryPermission> permissions = EnumSet.of(READ_DATA, WRITE_DATA);

            AclEntry.Builder builder = AclEntry.newBuilder();
            builder.setPrincipal(bRiceUser);
            builder.setType(AclEntryType.ALLOW);
            builder.setPermissions(permissions);
            AclEntry newEntry = builder.build();

            List<AclEntry> aclEntries = aclView.getAcl();

            aclEntries.add(newEntry);

            aclView.setAcl(aclEntries);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
//ACL_change.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclEntryPermission;
import java.nio.file.attribute.AclFileAttributeView;
import java.util.List;
import java.util.Set;

public class ACL_change {
    public static void main(String[] args) {
       
        Path path = Paths.get("C:\\Users\\86159\\OneDrive\\桌面\\test.txt");
        AclFileAttributeView aclView = Files.getFileAttributeView(path,
                AclFileAttributeView.class);
        if (aclView == null) {
            System.out.format("ACL view  is not  supported.%n");
            return;
        }
        try {
            List<AclEntry> aclEntries = aclView.getAcl();
            for (AclEntry entry : aclEntries) {
                System.out.format("Principal: %s%n", entry.principal());
                System.out.format("Type: %s%n", entry.type());
                System.out.format("Permissions are:%n");

                Set<AclEntryPermission> permissions = entry.permissions();
                for (AclEntryPermission p : permissions) {
                    System.out.format("%s %n", p);
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

九、实验总结

通过本次实验我基本掌握了访问控制列表的基本原理、并自己动手编写代码实现了对用户权限的更改。同时也通过学习对实现访问控制的各种方式都有所了解。

十、思考题

访问控制都有哪些实现方式,各自有什么优缺点?

  • 1.入网访问控制
    入网访问控制为网络访问提供了第一层访问控制。它控制哪些用户能够登录到服务器并获取网络资源,控制准许用户入网的时间和准许他们在哪台工作站入网。 用户的入网访问控制可分为三个步骤:用户名的识别与验证、用户口令的识别与验证、用户账号的缺省限制检查。三道关卡中只要任何一关未过,该用户便不能进入该网络。 对网络用户的用户名和口令进行验证是防止非法访问的第一道防线。为保证口令的安全性,用户口令不能显示在显示屏上,口令长度应不少于6个字符,口令字符最好是数字、字母和其他字符的混合,用户口令必须经过加密。用户还可采用一次性用户口令,也可用便携式验证器(如智能卡)来验证用户的身份。 网络管理员可以控制和限制普通用户的账号使用、访问网络的时间和方式。用户账号应只有系统管理员才能建立。用户口令应是每用户访问网络所必须提交的“证件”、用户可以修改自己的口令,但系统管理员应该可以控制口令的以下几个方面的限制:最小口令长度、强制修改口令的时间间隔、口令的唯一性、口令过期失效后允许入网的宽限次数。 用户名和口令验证有效之后,再进一步履行用户账号的缺省限制检查。网络应能控制用户登录入网的站点、限制用户入网的时间、限制用户入网的工作站数量。当用户对交费网络的访问“资费”用尽时,网络还应能对用户的账号加以限制,用户此时应无法进入网络访问网络资源。网络应对所有用户的访问进行审计。如果多次输入口令不正确,则认为是非法用户的入侵,应给出报警信息。
  • 2.权限控制
    网络的权限控制是针对网络非法操作所提出的一种安全保护措施。用户和用户组被赋予一定的权限。网络控制用户和用户组可以访问哪些目录、子目录、文件和其他资源。可以指定用户对这些文件、目录、设备能够执行哪些操作。受托者指派和继承权限屏蔽(irm)可作为两种实现方式。受托者指派控制用户和用户组如何使用网络服务器的目录、文件和设备。继承权限屏蔽相当于一个过滤器,可以限制子目录从父目录那里继承哪些权限。我们可以根据访问权限将用户分为以下几类:特殊用户(即系统管理员);一般用户,系统管理员根据他们的实际需要为他们分配操作权限;审计用户,负责网络的安全控制与资源使用情况的审计。用户对网络资源的访问权限可以用访问控制表来描述。
  • 3.目录级安全控制
    网络应允许控制用户对目录、文件、设备的访问。用户在目录一级指定的权限对所有文件和子目录有效,用户还可进一步指定对目录下的子目录和文件的权限。对目录和文件的访问权限一般有八种:系统管理员权限、读权限、写权限、创建权限、删除权限、修改权限、文件查找权限、访问控制权限。用户对文件或目标的有效权限取决于以下两个因素:用户的受托者指派、用户所在组的受托者指派、继承权限屏蔽取消的用户权限。一个网络管理员应当为用户指定适当的访问权限,这些访问权限控制着用户对服务器的访问。八种访问权限的有效组合可以让用户有效地完成工作,同时又能有效地控制用户对服务器资源的访问 ,从而加强了网络和服务器的安全性。
  • 4.属性安全控制
    当用文件、目录和网络设备时,网络系统管理员应给文件、目录等指定访问属性。属性安全在权限安全的基础上提供更进一步的安全性。网络上的资源都应预先标出一组安全属性。用户对网络资源的访问权限对应一张访问控制表,用以表明用户对网络资源的访问能力。属性设置可以覆盖已经指定的任何受托者指派和有效权限。属性往往能控制以下几个方面的权限:向某个文件写数据、拷贝一个文件、删除目录或文件、查看目录和文件、执行文件、隐含文件、共享、系统属性等。
  • 5.服务器安全控制
    网络允许在服务器控制台上执行一系列操作。用户使用控制台可以装载和卸载模块,可以安装和删除软件等操作。网络服务器的安全控制包括可以设置口令锁定服务器控制台,以防止非法用户修改、删除重要信息或破坏数据;可以设定服务器登录时间限制、非法访问者检测和关闭的时间间隔。
posted @ 2022-11-26 17:01  戴骏  阅读(87)  评论(0编辑  收藏  举报