отчет по заданию информационной безопасности. Отчет по индивидуальной работе 1 Дисциплина Информационная безопасность Студентка 361 группы
Скачать 106.68 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего образования Кубанский государственный университет Кафедра вычислительных технологий ОТЧЕТ По индивидуальной работе №1 Дисциплина: Информационная безопасность Выполнила: Студентка 36/1 группы Халипенко А.А. Преподаватель: Жуков С. А. Краснодар 2018 Задача 6 Составить программу, реализующую политику Chinese Wall (Китайская стена). Входными данными для программы являются: n – количество субъектов s1, s2, … , sn доступа к объектам; m – количество объектов доступа o1, o2, … , om ; f – число фирм F1, F2, . . . , Ff , являющихся собственниками объектов. Каждая фирма представлена своим портфелем, в который входят какие-то из объектов, так, что каждый объект должен входить в портфель только одной фирмы. Фирмы могут быть конкурентами, CI1, CI2, . . . , CIs - классы конфликта интересов; в каждый класс CIj входят номера (или названия) тех фирм Fs , . . . , которые конфликтуют между собой. Какие-то фирмы могут быть членами разных классов CI, какие-то фирмы могут не членствовать ни в каких классах (они ни с кем не конфликтуют) . Программа должна выполнять директивы: start - очищает историю выполненных доступов субъектов к объектам; read si oj - выполнить чтение объекта oj субъектом si , чтение возможно, если объект oj принадлежит к такому классу CI, к которому si еще не обращался, или oj принадлежит портфелю данных той Ft , к которому si уже обращался; программа должна вывести: accepted - подтверждение выполнения refused - в случае отказа. write si oj - выполнить запись в объект oj субъектом si , запись возможна, если si может выполнить чтение oj согласно правилу чтения и si не читал никакого объекта из портфеля данных другой фирмы (отличной от собственника oj) , которая входит в некоторый в один класс CI с фирмой-собственником oj ; Программа должна вывести: accepted - подтверждение выполнения; refused - в случае отказа; report si - выдать отчет по выполненным операциям субъекта si с указанием объектов и фирм-собственников этих объектов; report oj - выдать отчет по операциям, выполненным с этим объектом разными субъектами; brief_case Fi - выдать список объектов, находящихся в портфеле фирмы Fi . Решение Для реализации программы использована среда разработки PyCharm 2017.2, язык программирования Python 3.6. Из файла input.txt считываются входные данные (количество субъектов, количество объектов, количество фирм, классы конфликтов интересов). После считывания входных данных пользователь вводит с клавиатуры директивы, описанные в условии задачи, до тех пор, пока не введет 0. В программе описаны функции, реализующие политику доступа Chinese Wall (Китайская стена). Функции read и write реализуют правила чтения и записи. Когда субъект впервые обращается к какому-либо объекту, то этот субъект записывается в словарь (субъект – ключ, все его операции – значение), где сохраняются все его действия с разными объектами. Функция report реализует выдачу отчета по выполненным операциям субъекта над объектами или выдачу отчета по выполненным операциям над объектом различными субъектами. Для вывода в отчет выполненных операций субъекта над объектами происходит поиск в словаре этого субъекта и извлекается значение, в котором хранятся все операции этого субъекта. Для вывода в отчет выполненных операций над объектом различными субъектами, происходит перебор каждого элемента в словаре, ищется заданный объект во всех выполненных операциях субъектов, и если находится совпадение с заданным объектом, то эта операция выводится в файл. Функция brief_case реализует вывод всех объектов, находящихся в портфеле заданной фирмы Fi. Для этого из списка, в каждом элементе которого находятся объекты, принадлежащие каждой из фирм, выбирается элемент с номером заданной фирмы и выводится на экран. Код программы на Python 3.6 with open("input.txt") as f: l = f.readlines() l = [line.rstrip() for line in l] n = int(l[0][2:]) m = int(l[1][2:]) f = int(l[2][2:]) subject = [f's{i + 1}' for i in range(n)] dataset = [l[i].split(' ') for i in range(3, 3 + f)] s = int(l[3 + f][2:]) CoI = [l[i].split(' ') for i in range(3 + f + 1, len(l))] operation_list = {} firm_list = [] for i in CoI: for j in i: if dataset[int(j[1:]) - 1] not in firm_list: firm_list.append(dataset[int(j[1:]) - 1]) for i in range(len(dataset)): if dataset[i] not in firm_list: CoI.append([f'F{i + 1}']) def write(r): if r[1] not in operation_list: for i in range(len(CoI)): for j in CoI[i]: if r[2] in dataset[int(j[1:]) - 1]: firm = j operation_list[r[1]] = [[r[0], r[1], r[2], firm]] return True else: for i in range(len(dataset)): if r[2] in dataset[i]: for j in operation_list[r[1]]: if j[0] == 'read' and int(j[3][1:]) - 1 != i: return False break subject_coi = [] for i in operation_list[r[1]]: if len(i) == 5: subject_coi.append(i[4] - 1) if i[0] == 'read' and r[2] in dataset[int(i[3][1:]) - 1]: operation_list[r[1]].append([r[0], r[1], r[2], i[3]]) return True for i in range(len(CoI)): if i not in subject_coi: for j in CoI[i]: if r[2] in dataset[int(j[1:]) - 1]: firm = j operation_list[r[1]].append([r[0], r[1], r[2], firm]) return True return False def read(r): if r[1] not in operation_list: for i in range(len(CoI)): for j in CoI[i]: if r[2] in dataset[int(j[1:]) - 1]: cl = i + 1 firm = j operation_list[r[1]] = [[r[0], r[1], r[2], firm, cl]] return True else: subject_coi = [] for i in operation_list[r[1]]: if len(i) == 5: subject_coi.append(i[4] - 1) if i[0] == 'read' and r[2] in dataset[int(i[3][1:]) - 1]: operation_list[r[1]].append([r[0], r[1], r[2], i[3]]) return True for i in range(len(CoI)): if i not in subject_coi: for j in CoI[i]: if r[2] in dataset[int(j[1:]) - 1]: cl = i + 1 firm = j operation_list[r[1]].append([r[0], r[1], r[2], firm, cl]) return True return False def report_s(r): with open('operation_s.txt', 'w') as f: if r[1] in operation_list: for i in operation_list[r[1]]: f.write(' '.join(i[:4]) + '\n') def report_o(r): with open('operation_o.txt', 'w') as f: for i in operation_list.keys(): for op in operation_list[i]: if r[1] in op[2]: f.write(' '.join(op[:4]) + '\n') def operation(command): global n, m, f, s r = command.split(' ') if command == 'start': operation_list.clear() elif command[:4] == 'read': if len(r) == 3: presence = False for i in dataset: if r[2] in i: presence = True if presence and r[1] in subject and read(r): print('accepted') else: print('refused') else: print('Неверный формат команды') elif command[:5] == 'write': if len(r) == 3: presence = False for i in dataset: if r[2] in i: presence = True if presence and r[1] in subject and write(r): print('accepted') else: print('refused') else: print('Неверный формат команды') elif command[:10] == 'brief_case': if len(r) == 2: presence = False for i in range(len(CoI)): if r[1] in CoI[i]: presence = True try: if presence and int(r[1][1:]) > 0: object_list = dataset[int(r[1][1:]) - 1] print(object_list) else: raise IndexError except ValueError: print('Неверный формат команды') except IndexError: print('Нет такой фирмы') else: print('Неверный формат команды') elif command[:6] == 'report': if len(r) == 2: presence = False for i in dataset: if r[1] in i: presence = True if presence: report_o(r) else: report_s(r) else: print('Неверный формат команды') else: print('Нет такой команды') while True: command = input("Для завершения введите 0.\nВведите команду:\n") if command == '0': break operation(command) print('\n') Тесты программы Входной файл input.txt Результаты: Директива report s1: Директива report o1: Входной файл input.txt: Результаты: Директива report s3: Директива report o6: |