1
0
Просмотр исходного кода

Merge branch 'master' of u23-27guzeev/EASvZI into master

ypv 3 дней назад
Родитель
Сommit
e698f2b06e

+ 21 - 0
Лекции/2.5.800_Управление_доступом_и_контроль_печати_конфиденциальной_информации/Guzeev.md

@@ -0,0 +1,21 @@
+# Управление доступом и контроль печати конфиденциальной информации
+Конфиденциальная информация требует защиты на всех этапах обработки. Два ключевых механизма такой защиты — *управление доступом* (контроль того, кто и как может работать с данными) и *контроль печати* (предотвращение утечек через бумажные носители). В данной лекции рассмотрены модели разграничения доступа, угрозы, связанные с печатью, а также организационные и технические меры противодействия.
+
+Управление доступом базируется на трёх классических моделях. Дискреционная (DAC) позволяет владельцу ресурса самостоятельно назначать права — например, через списки управления доступом (ACL). Мандатная (MAC) присваивает каждому объекту и субъекту метку конфиденциальности, а доступ разрешается только при сравнении меток системой, без возможности изменить решение пользователем. Ролевая (RBAC) группирует права по должностным ролям — сотрудник получает доступ через свою роль, что упрощает администрирование в крупных организациях. На практике чаще всего используется комбинация RBAC и MAC для защиты гостайны.
+
+## Ключевые принципы управления доступом: 
+аутентификация (пароль, биометрия, смарт-карта), журналирование всех входов, принцип минимальных привилегий (дать только необходимый минимум), разделение обязанностей (один сотрудник не может и создать, и утвердить, и распечатать секретный документ). Без соблюдения этих правил любые системы контроля печати становятся неэффективными — злоумышленник скопирует файл на флешку или отправит по электронной почте.
+
+## Контроль печати решает специфические угрозы: 
+несанкционированная распечатка, оставленный на принтере лист (перехват другим сотрудником), массовая печать перед увольнением, подмена документа в выходном лотке. Для противодействия применяются два основных класса решений. Технология безопасной печати (Follow-me printing / SafePrint) отправляет задание не напрямую на принтер, а в виртуальную очередь. Пользователь подходит к любому защищённому устройству, аутентифицируется (картой, PIN-кодом или отпечатком пальца), и только тогда документ печатается. Невостребованные задания автоматически удаляются через заданное время.
+
+Второй класс — DLP-модули контроля печати. Они анализируют содержание документа по регулярным выражениям, словам-триггерам («секретно», «коммерческая тайна», «паспортные данные»), а также по меткам конфиденциальности. При попытке напечатать запрещённую информацию DLP блокирует задание, уведомляет службу безопасности и добавляет на распечатку невидимый или видимый водяной знак (имя пользователя, дата, время, ID документа). Обязательно ведётся подробный журнал: кто печатал, когда, какой файл, количество страниц, имя принтера.
+
+## Организационные меры дополняют технические: 
+выделенные принтеры для конфиденциальной печати (в отдельной комнате с замком), маркировка бумажных носителей штампом с номером экземпляра, обязательное уничтожение брака и черновиков через шредер не ниже 3-й степени защиты по DIN 66399, периодические проверки журналов печати службой безопасности. Взаимосвязь управления доступом и контроля печати проявляется в том, что при правильной настройке RBAC сотрудник без права «печать конфиденциально» даже не увидит кнопку печати в приложении. Журнал печати в сочетании с водяными знаками позволяет идентифицировать нарушителя, если документ был сфотографирован или вынесен.
+
+## Типичные ошибки: 
+разрешение печати всем на общем принтере (решение — разные очереди с разными правами); отсутствие отдельного учёта листов (нужна система с биллингом); игнорирование многофункциональных устройств (на них следует отключить сканирование на e-mail и USB, если нет контроля); доступ сотрудников к расходным материалам (картриджи и бумага должны выдаваться только ответственному). Пример фрагмента политики организации: «Печать документов с пометкой “Конфиденциально” разрешена только на принтерах SafePrint. Перед печатью пользователь указывает причину и количество экземпляров. Распечатанный документ забирается немедленно. Ежемесячно проводится сверка журналов с документами в сейфах».
+
+## Вывод
+Внедрение описанных мер требует не только технических средств, но и культуры безопасности персонала. Регулярные инструктажи, тестовые попытки печати запрещённых данных и анализ действий сотрудников помогают снизить риск утечек. Контрольные вопросы для аудитории: назовите три модели управления доступом; чем отличается простая регистрация печати от системы SafePrint; какие данные обязательно должны быть в журнале; что делать, если сотрудник оставил секретный документ на принтере.

+ 333 - 0
Лекции/2.5.800_Управление_доступом_и_контроль_печати_конфиденциальной_информации/Guzeev.py

@@ -0,0 +1,333 @@
+import tkinter as tk
+from tkinter import ttk, messagebox
+import random
+import time
+try:
+    import winsound
+    SOUND_ENABLED = True
+except:
+    SOUND_ENABLED = False
+
+class SecurityGame:
+    def __init__(self, root):
+        self.root = root
+        self.root.title("Игра: Управление доступом и контроль печати")
+        self.root.geometry("900x700")
+        self.root.configure(bg="#2c3e50")
+        
+        # Стили
+        self.style = ttk.Style()
+        self.style.theme_use("clam")
+        self.style.configure("TLabel", background="#2c3e50", foreground="white", font=("Arial", 11))
+        self.style.configure("TButton", font=("Arial", 11, "bold"), background="#3498db")
+        self.style.configure("TFrame", background="#2c3e50")
+        
+        # Переменные
+        self.current_scene = 0
+        self.scenes = [self.scene1, self.scene2, self.scene3, self.scene4, self.scene5]
+        self.score = 0
+        
+        # Заголовок и прогресс
+        self.header_frame = tk.Frame(root, bg="#1a252f", height=80)
+        self.header_frame.pack(fill=tk.X)
+        self.title_label = tk.Label(self.header_frame, text="Управление доступом и контроль печати", font=("Arial", 18, "bold"), fg="#ecf0f1", bg="#1a252f")
+        self.title_label.pack(pady=10)
+        self.progress = ttk.Progressbar(self.header_frame, length=400, mode='determinate')
+        self.progress.pack(pady=5)
+        self.score_label = tk.Label(self.header_frame, text="Очки: 0", font=("Arial", 12), fg="#f1c40f", bg="#1a252f")
+        self.score_label.pack()
+        
+        # Основной фрейм для сцен
+        self.main_frame = tk.Frame(root, bg="#2c3e50")
+        self.main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
+        
+        # Фрейм для подсказок
+        self.hint_frame = tk.Frame(root, bg="#34495e", height=50)
+        self.hint_frame.pack(fill=tk.X, side=tk.BOTTOM)
+        self.hint_label = tk.Label(self.hint_frame, text="Нажми 'Подсказка' для помощи", font=("Arial", 10), fg="#bdc3c7", bg="#34495e")
+        self.hint_label.pack(pady=5)
+        
+        self.load_scene()
+    
+    def play_sound(self, success=True):
+        if SOUND_ENABLED:
+            if success:
+                winsound.Beep(1000, 200)
+            else:
+                winsound.Beep(400, 500)
+    
+    def update_progress(self):
+        value = (self.current_scene / len(self.scenes)) * 100
+        self.progress['value'] = value
+        self.score_label.config(text=f"Очки: {self.score}")
+    
+    def show_hint(self, hint_text):
+        self.hint_label.config(text=f"💡 Подсказка: {hint_text}", fg="#f1c40f")
+        self.hint_frame.configure(bg="#2c3e50")
+        self.root.after(5000, lambda: self.hint_label.config(text="Нажми 'Подсказка' для помощи", fg="#bdc3c7", bg="#34495e"))
+    
+    def clear_frame(self):
+        for widget in self.main_frame.winfo_children():
+            widget.destroy()
+    
+    def animate_widget(self, widget, color_from, color_to, steps=10):
+        """Простая анимация смены цвета фона виджета"""
+        r1, g1, b1 = self.hex_to_rgb(color_from)
+        r2, g2, b2 = self.hex_to_rgb(color_to)
+        for i in range(steps+1):
+            r = r1 + (r2 - r1) * i // steps
+            g = g1 + (g2 - g1) * i // steps
+            b = b1 + (b2 - b1) * i // steps
+            color = f"#{r:02x}{g:02x}{b:02x}"
+            widget.configure(bg=color)
+            self.root.update()
+            time.sleep(0.02)
+    
+    def hex_to_rgb(self, hex_color):
+        hex_color = hex_color.lstrip('#')
+        return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
+    
+    def load_scene(self):
+        self.clear_frame()
+        self.update_progress()
+        self.scenes[self.current_scene]()
+    
+    def next_scene(self):
+        self.current_scene += 1
+        self.score += 10
+        self.update_progress()
+        if self.current_scene < len(self.scenes):
+            self.load_scene()
+        else:
+            messagebox.showinfo("Поздравляем!", f"Вы успешно завершили игру!\nФинальный счёт: {self.score} очков.\nТеперь вы эксперт по безопасности!")
+            self.root.quit()
+    
+    # СЦЕНА 1: Выбор модели доступа с анимацией
+    def scene1(self):
+        tk.Label(self.main_frame, text="СЦЕНА 1: Модели управления доступом", font=("Arial", 16, "bold"), fg="#ecf0f1", bg="#2c3e50").pack(pady=10)
+        tk.Label(self.main_frame, text="Сопоставьте описание с правильной моделью (DAC, MAC, RBAC):", font=("Arial", 12), fg="#bdc3c7", bg="#2c3e50").pack(pady=5)
+        
+        questions = [
+            ("Владелец ресурса сам назначает права (например, через ACL).", "DAC"),
+            ("Объектам и субъектам присваиваются метки конфиденциальности, решение принимает система.", "MAC"),
+            ("Права группируются по должностным ролям, пользователь получает доступ через роль.", "RBAC")
+        ]
+        
+        self.answers = {}
+        self.vars = []
+        
+        for i, (desc, correct) in enumerate(questions):
+            frame_q = tk.Frame(self.main_frame, bg="#2c3e50")
+            frame_q.pack(fill=tk.X, padx=20, pady=5)
+            tk.Label(frame_q, text=desc, wraplength=600, anchor="w", justify=tk.LEFT, fg="white", bg="#2c3e50").pack(side=tk.LEFT, padx=5)
+            var = tk.StringVar(frame_q)
+            var.set("")
+            self.vars.append(var)
+            combo = ttk.Combobox(frame_q, textvariable=var, values=["DAC", "MAC", "RBAC"], state="readonly", width=10)
+            combo.pack(side=tk.RIGHT, padx=5)
+            self.answers[i] = correct
+        
+        def check():
+            correct_count = 0
+            for i, var in enumerate(self.vars):
+                if var.get() == self.answers[i]:
+                    correct_count += 1
+            if correct_count == 3:
+                self.play_sound(True)
+                self.animate_widget(self.main_frame, "#2c3e50", "#27ae60", steps=8)
+                messagebox.showinfo("Верно", "Все модели определены правильно!")
+                self.next_scene()
+            else:
+                self.play_sound(False)
+                self.animate_widget(self.main_frame, "#2c3e50", "#c0392b", steps=8)
+                messagebox.showerror("Ошибка", f"Правильно: {correct_count} из 3. Попробуйте ещё раз.")
+        
+        btn = tk.Button(self.main_frame, text="Проверить", command=check, bg="#3498db", fg="white", font=("Arial", 12, "bold"), relief=tk.RAISED, padx=20, pady=5)
+        btn.pack(pady=20)
+        
+        hint_btn = tk.Button(self.main_frame, text="Подсказка", command=lambda: self.show_hint("DAC — владелец решает, MAC — метки, RBAC — роли"), bg="#f39c12", fg="white")
+        hint_btn.pack(pady=5)
+    
+    # СЦЕНА 2: Назначение прав (используем Canvas для красивого отображения)
+    def scene2(self):
+        tk.Label(self.main_frame, text="СЦЕНА 2: Принцип минимальных привилегий", font=("Arial", 16, "bold"), fg="#ecf0f1", bg="#2c3e50").pack(pady=10)
+        tk.Label(self.main_frame, text="Для каждой роли отметьте разрешённые объекты (только необходимое):", font=("Arial", 12), fg="#bdc3c7", bg="#2c3e50").pack(pady=5)
+        
+        roles = ["Бухгалтер", "Кадровик", "Сисадмин", "Стажёр"]
+        objects = ["Зарплата", "Личные дела", "Журналы сервера", "Общие инструкции"]
+        correct = [
+            [True, False, False, False],
+            [False, True, False, False],
+            [False, False, True, False],
+            [False, False, False, True]
+        ]
+        
+        self.check_vars = []
+        # Создаём таблицу с цветными ячейками
+        canvas = tk.Canvas(self.main_frame, bg="#2c3e50", highlightthickness=0)
+        canvas.pack(fill=tk.BOTH, expand=True)
+        
+        # Заголовки
+        for j, obj in enumerate(objects):
+            canvas.create_text(200 + j*120, 50, text=obj, fill="white", font=("Arial", 10, "bold"))
+        for i, role in enumerate(roles):
+            canvas.create_text(80, 100 + i*60, text=role, fill="#f1c40f", font=("Arial", 11, "bold"), anchor="w")
+        
+        self.check_boxes = []
+        for i in range(len(roles)):
+            row = []
+            for j in range(len(objects)):
+                var = tk.BooleanVar(value=False)
+                chk = tk.Checkbutton(self.main_frame, variable=var, bg="#2c3e50", selectcolor="#2c3e50", activebackground="#2c3e50")
+                # размещаем через create_window
+                window_id = canvas.create_window(200 + j*120, 100 + i*60, window=chk, anchor=tk.CENTER)
+                row.append(var)
+            self.check_boxes.append(row)
+        
+        def check2():
+            ok = True
+            for i in range(len(roles)):
+                for j in range(len(objects)):
+                    if self.check_boxes[i][j].get() != correct[i][j]:
+                        ok = False
+                        break
+                if not ok:
+                    break
+            if ok:
+                self.play_sound(True)
+                self.animate_widget(self.main_frame, "#2c3e50", "#27ae60", steps=8)
+                messagebox.showinfo("Верно", "Права назначены правильно!")
+                self.next_scene()
+            else:
+                self.play_sound(False)
+                self.animate_widget(self.main_frame, "#2c3e50", "#c0392b", steps=8)
+                messagebox.showerror("Ошибка", "Нарушен принцип минимальных привилегий. Стажёр не должен видеть зарплату, а бухгалтер — журналы.")
+        
+        btn = tk.Button(self.main_frame, text="Проверить", command=check2, bg="#3498db", fg="white", font=("Arial", 12, "bold"))
+        btn.pack(pady=20)
+        hint_btn = tk.Button(self.main_frame, text="Подсказка", command=lambda: self.show_hint("Каждой роли — только её данные: бухгалтеру зарплата, кадровику личные дела и т.д."), bg="#f39c12", fg="white")
+        hint_btn.pack(pady=5)
+    
+    # СЦЕНА 3: Настройка безопасной печати (с анимацией кнопок)
+    def scene3(self):
+        tk.Label(self.main_frame, text="СЦЕНА 3: Безопасная печать", font=("Arial", 16, "bold"), fg="#ecf0f1", bg="#2c3e50").pack(pady=10)
+        tk.Label(self.main_frame, text="Выберите корректные параметры для печати конфиденциальных документов:", font=("Arial", 12), fg="#bdc3c7", bg="#2c3e50").pack(pady=5)
+        
+        # Принтер
+        tk.Label(self.main_frame, text="Принтер:", fg="white", bg="#2c3e50").pack(anchor=tk.W)
+        self.printer_var = tk.StringVar(value="Общий")
+        printers = ["Общий принтер в холле", "Принтер в переговорной", "Принтер в сейфовой комнате"]
+        for p in printers:
+            tk.Radiobutton(self.main_frame, text=p, variable=self.printer_var, value=p, bg="#2c3e50", fg="white", selectcolor="#2c3e50").pack(anchor=tk.W)
+        
+        # Время удаления
+        tk.Label(self.main_frame, text="Время автоудаления:", fg="white", bg="#2c3e50").pack(anchor=tk.W, pady=(10,0))
+        self.time_var = tk.IntVar(value=5)
+        times = [5, 15, 30]
+        for t in times:
+            tk.Radiobutton(self.main_frame, text=f"{t} мин", variable=self.time_var, value=t, bg="#2c3e50", fg="white", selectcolor="#2c3e50").pack(anchor=tk.W)
+        
+        # Аутентификация
+        self.auth_var = tk.BooleanVar(value=True)
+        tk.Checkbutton(self.main_frame, text="Требовать аутентификацию у принтера", variable=self.auth_var, bg="#2c3e50", fg="white", selectcolor="#2c3e50").pack(anchor=tk.W)
+        
+        def check3():
+            correct = (self.printer_var.get() == "Принтер в сейфовой комнате" and self.time_var.get() == 5 and self.auth_var.get() == True)
+            if correct:
+                self.play_sound(True)
+                self.animate_widget(self.main_frame, "#2c3e50", "#27ae60", steps=8)
+                messagebox.showinfo("Верно", "Настройки безопасной печати корректны!")
+                self.next_scene()
+            else:
+                self.play_sound(False)
+                self.animate_widget(self.main_frame, "#2c3e50", "#c0392b", steps=8)
+                messagebox.showerror("Ошибка", "Нужно выбрать принтер в сейфовой комнате, время 5 минут и обязательную аутентификацию.")
+        
+        btn = tk.Button(self.main_frame, text="Проверить", command=check3, bg="#3498db", fg="white", font=("Arial", 12, "bold"))
+        btn.pack(pady=20)
+        hint_btn = tk.Button(self.main_frame, text="Подсказка", command=lambda: self.show_hint("Конфиденциальная печать требует защищённого принтера, быстрого удаления и аутентификации."), bg="#f39c12", fg="white")
+        hint_btn.pack(pady=5)
+    
+    # СЦЕНА 4: Маркировка и уничтожение (с анимированными кнопками)
+    def scene4(self):
+        tk.Label(self.main_frame, text="СЦЕНА 4: Маркировка и уничтожение", font=("Arial", 16, "bold"), fg="#ecf0f1", bg="#2c3e50").pack(pady=10)
+        tk.Label(self.main_frame, text="Действия с конфиденциальными документами:", font=("Arial", 12), fg="#bdc3c7", bg="#2c3e50").pack(pady=5)
+        
+        tk.Label(self.main_frame, text="1. Как маркировать конфиденциальный документ?", fg="white", bg="#2c3e50").pack(anchor=tk.W)
+        self.mark_var = tk.StringVar(value="")
+        marks = ["Только гриф 'Конфиденциально'", "Штамп с номером экземпляра", "Без маркировки"]
+        for m in marks:
+            tk.Radiobutton(self.main_frame, text=m, variable=self.mark_var, value=m, bg="#2c3e50", fg="white").pack(anchor=tk.W)
+        
+        tk.Label(self.main_frame, text="2. Что сделать с бракованной распечаткой?", fg="white", bg="#2c3e50").pack(anchor=tk.W, pady=(10,0))
+        self.destroy_var = tk.StringVar(value="")
+        destroys = ["Выбросить в мусор", "Использовать как черновик", "Уничтожить в шредере 3-й степени", "Сжечь"]
+        for d in destroys:
+            tk.Radiobutton(self.main_frame, text=d, variable=self.destroy_var, value=d, bg="#2c3e50", fg="white").pack(anchor=tk.W)
+        
+        def check4():
+            mark_ok = (self.mark_var.get() == "Штамп с номером экземпляра")
+            destroy_ok = (self.destroy_var.get() == "Уничтожить в шредере 3-й степени")
+            if mark_ok and destroy_ok:
+                self.play_sound(True)
+                self.animate_widget(self.main_frame, "#2c3e50", "#27ae60", steps=8)
+                messagebox.showinfo("Верно", "Маркировка и уничтожение выполнены правильно!")
+                self.next_scene()
+            else:
+                self.play_sound(False)
+                self.animate_widget(self.main_frame, "#2c3e50", "#c0392b", steps=8)
+                messagebox.showerror("Ошибка", "Нужен штамп с номером экземпляра и уничтожение в шредере 3-й степени.")
+        
+        btn = tk.Button(self.main_frame, text="Проверить", command=check4, bg="#3498db", fg="white", font=("Arial", 12, "bold"))
+        btn.pack(pady=20)
+        hint_btn = tk.Button(self.main_frame, text="Подсказка", command=lambda: self.show_hint("Каждый конфиденциальный документ должен иметь уникальный номер экземпляра, брак уничтожается в шредере с высокой степенью защиты."), bg="#f39c12", fg="white")
+        hint_btn.pack(pady=5)
+    
+    # СЦЕНА 5: Расследование инцидента с таблицей и анимацией
+    def scene5(self):
+        tk.Label(self.main_frame, text="СЦЕНА 5: Расследование утечки", font=("Arial", 16, "bold"), fg="#ecf0f1", bg="#2c3e50").pack(pady=10)
+        tk.Label(self.main_frame, text="Инцидент: Петров распечатал 'Отчет_КТ.pdf' и забыл на принтере в холле. Через 10 минут документ исчез.\nЖурнал печати:", font=("Arial", 11), fg="#bdc3c7", bg="#2c3e50").pack(pady=5)
+        
+        # Таблица с данными
+        columns = ("Время", "Пользователь", "Документ", "Принтер", "Результат")
+        tree = ttk.Treeview(self.main_frame, columns=columns, show="headings", height=6)
+        for col in columns:
+            tree.heading(col, text=col)
+            tree.column(col, width=140)
+        data = [
+            ("09:05", "Петров", "Отчет_КТ.pdf", "Холл", "Напечатан"),
+            ("09:07", "Иванов", "Отчет_КТ.pdf", "Холл", "Напечатан"),
+            ("09:10", "Сидорова", "Приказ_общий.docx", "Холл", "Напечатан"),
+            ("09:12", "Иванов", "Список.xlsx", "Холл", "Отменено"),
+            ("09:15", "Петров", "Счет.pdf", "Сейфовая", "Напечатан")
+        ]
+        for row in data:
+            tree.insert("", tk.END, values=row)
+        tree.pack(pady=10)
+        
+        tk.Label(self.main_frame, text="Кто из сотрудников распечатал тот же конфиденциальный файл сразу после Петрова?", fg="white", bg="#2c3e50").pack()
+        self.suspect_var = tk.StringVar()
+        suspects = ["Петров", "Иванов", "Сидорова", "Неизвестный"]
+        for s in suspects:
+            tk.Radiobutton(self.main_frame, text=s, variable=self.suspect_var, value=s, bg="#2c3e50", fg="white").pack(anchor=tk.W)
+        
+        def check5():
+            if self.suspect_var.get() == "Иванов":
+                self.play_sound(True)
+                self.animate_widget(self.main_frame, "#2c3e50", "#27ae60", steps=8)
+                messagebox.showinfo("Верно", "Иванов распечатал тот же файл через 2 минуты, хотя его роль не позволяла печатать КТ. Нарушитель найден!")
+                self.next_scene()
+            else:
+                self.play_sound(False)
+                self.animate_widget(self.main_frame, "#2c3e50", "#c0392b", steps=8)
+                messagebox.showerror("Ошибка", "Неверно. Посмотрите внимательно на время и документ в журнале.")
+        
+        btn = tk.Button(self.main_frame, text="Проверить", command=check5, bg="#3498db", fg="white", font=("Arial", 12, "bold"))
+        btn.pack(pady=20)
+        hint_btn = tk.Button(self.main_frame, text="Подсказка", command=lambda: self.show_hint("Обратите внимание на строку 09:07 — тот же документ, другой пользователь."), bg="#f39c12", fg="white")
+        hint_btn.pack(pady=5)
+
+if __name__ == "__main__":
+    root = tk.Tk()
+    game = SecurityGame(root)
+    root.mainloop()

+ 51 - 0
Лекции/2.5.800_Управление_доступом_и_контроль_печати_конфиденциальной_информации/Guzeev_czen.md

@@ -0,0 +1,51 @@
+## Сцена 1: Выбор модели доступа
+
+Элементы: три карточки с описанием моделей (DAC, MAC, RBAC), кнопка «Применить».
+
+Действия: пользователь перетаскивает каждую модель к соответствующему описанию (например, «Госорганы с гостайной» → MAC, «Рабочая группа из 5 человек» → DAC, «Корпорация с 5000 сотрудников» → RBAC).
+
+Условие продолжения: все три пары собраны правильно. После этого появляется текст: «Отлично! Вы выбрали RBAC для компании. Переходим к настройке ролей».
+
+## Сцена 2: Назначение прав доступа на основе ролей
+
+Элементы: список ролей (Бухгалтер, Кадровик, Системный администратор, Стажёр) и список объектов (папка «Зарплата», папка «Личные дела», сервер журналов, общая папка инструкций).
+
+Действия: пользователь для каждой роли отмечает галочками разрешённые объекты (чтение/запись/печать). Для стажёра доступ только к общей папке, для бухгалтера — к зарплате, для кадровика — к личным делам, для сисадмина — к журналам.
+
+Условие: все назначения должны соответствовать принципу минимальных привилегий. Если пользователь дал стажёру доступ к зарплате — ошибка, нужно исправить. При верном назначении переход к сцене 3.
+
+## Сцена 3: Настройка безопасной печати
+
+Элементы: панель управления виртуальным принтером SafePrint, ползунки времени автоматического удаления заданий (5, 15, 30 минут), список принтеров (общий холл, комната переговоров, сейфовая комната), чекбокс «Требовать аутентификацию перед печатью».
+
+Действия: пользователь выбирает для конфиденциальных документов принтер в сейфовой комнате, устанавливает время удаления 5 минут, включает аутентификацию по PIN-коду.
+
+Условие: если пользователь выбрал общий принтер в холле или отключил аутентификацию — система выдаёт предупреждение и не пускает дальше. При корректных настройках переход к сцене 4.
+
+## Сцена 4: Обработка инцидента — оставленный документ
+
+Элементы: видеосводка с камеры: сотрудник Петров распечатал документ с грифом «Коммерческая тайна» и забыл его в лотке принтера в холле. Через 10 минут документ забрал неизвестный. Кнопки действий: «Ничего не делать», «Позвонить Петрову и забыть», «Запустить расследование по журналам и камерам», «Уволить Петрова сразу».
+
+Действия: пользователь выбирает вариант.
+
+Условие: правильный ответ — «Запустить расследование…». При выборе другого варианта появляется сообщение об ошибке и предлагается вернуться к выбору. При правильном выборе переход к сцене 5.
+
+## Сцена 5: Расследование по журналам
+
+Элементы: таблица журнала печати за день: строки с пользователями, временем, именем файла, принтером. Также журнал доступа к принтеру (аутентификации). Документ Петрова имеет метку «КТ». В журнале видно, что сразу после него печатал Иванов, который не имел прав на КТ.
+
+Действия: пользователь должен найти несоответствие (Иванов распечатал тот же файл через 2 минуты после Петрова, хотя его роль не позволяет печатать КТ). Пользователь кликает на подозрительную строку и выбирает действие «Запросить объяснительную у Иванова».
+
+Условие: если пользователь кликнул на правильную строку — финальный экран «Расследование завершено. Нарушитель найден. Меры: увольнение Иванова, пересмотр политики печати для всех. Вы справились!» Если ошибся — сообщение «Не тот сотрудник, попробуйте ещё раз» и возврат к таблице.
+
+*Сцена 6 (дополнительная, но для уверенности в 5+ можно считать её пятой, а пятую шестой — уточню. Сделаем ровно 5 сцен: объединим 4 и 5 логически, но чтобы было 5, добавлю сцену «Маркировка и уничтожение» между 3 и 4. Тогда итог: сцена1, сцена2, сцена3, сцена4 (маркировка), сцена5 (инцидент+расследование).
+
+Элементы: изображения шредера (степени защиты 1, 3, 5), штампов «Конфиденциально», «Экз. №», «Уничтожить». Также документ с пометкой «КТ» и бракованная распечатка.
+
+Действия: пользователь должен для конфиденциального документа выбрать правильную маркировку (штамп с номером экземпляра) и для брака — правильную степень уничтожения (не ниже 3). Есть также кнопка «Выбросить в мусор» — она неверна.
+
+Условие: выбор правильных действий (штамп + шредер степени 3). Если выбран мусор — ошибка с пояснением. При верном решении переход к сцене 5.
+
+Сцена 5: Инцидент и расследование
+
+Объединяет предыдущие 4-ю и 5-ю: сначала пользователь видит описание инцидента с Петровым, выбирает «Запустить расследование», затем анализирует таблицу журналов и находит Иванова. Условие завершения игры — правильное выявление нарушителя.

+ 210 - 0
Лекции/2.5.800_Управление_доступом_и_контроль_печати_конфиденциальной_информации/Guzeev_tex_zd.md

@@ -0,0 +1,210 @@
+# ТЕХНИЧЕСКОЕ ЗАДАНИЕ
+на разработку программного продукта
+«Интерактивная игра: Управление доступом и контроль печати конфиденциальной информации»
+
+## 1. Общие сведения
+### 1.1. Наименование продукта
+«Интерактивная игра: Управление доступом и контроль печати конфиденциальной информации» (далее — Игра).
+
+### 1.2. Назначение
+Игра предназначена для обучения сотрудников организаций, студентов и специалистов в области информационной безопасности основам:
+
+моделей управления доступом (DAC, MAC, RBAC);
+
+принципа минимальных привилегий;
+
+безопасной печати конфиденциальных документов;
+
+маркировки и уничтожения бумажных носителей;
+
+расследования инцидентов, связанных с утечкой через печать.
+
+Цель — закрепление теоретических знаний в интерактивной форме, проверка правильности принятия решений в симулированных ситуациях.
+
+### 1.3. Заказчик и исполнитель
+Заказчик: (указывается по требованию).
+Исполнитель: разработчик (физическое или юридическое лицо).
+
+### 1.4. Основания для разработки
+Настоящее ТЗ составлено на основании требований к обучающим системам по курсу «Информационная безопасность» и необходимости автоматизированной проверки знаний по теме контроля печати и управления доступом.
+
+## 2. Требования к функциональности
+### 2.1. Общая структура
+Игра должна состоять из последовательных сцен (этапов). Количество сцен — 5 (пять). Каждая сцена представляет собой интерактивное задание с проверкой правильности ответа. Переход к следующей сцене возможен только после успешного выполнения текущей.
+
+### 2.2. Перечень сцен и их функциональные требования
+Сцена 1: Выбор модели доступа
+
+Описание: Пользователю предъявляются 3 описания моделей DAC, MAC, RBAC и выпадающие списки для выбора правильной модели.
+
+Критерий успеха: Все 3 соответствия верны.
+
+Сцена 2: Принцип минимальных привилегий
+
+Описание: Пользователь назначает права доступа (чтение/печать) для ролей: Бухгалтер, Кадровик, Сисадмин, Стажёр к объектам: «Зарплата», «Личные дела», «Журналы сервера», «Общие инструкции».
+
+Критерий успеха: Выбор должен в точности соответствовать матрице: Бухгалтер → только «Зарплата»; Кадровик → только «Личные дела»; Сисадмин → только «Журналы»; Стажёр → только «Инструкции».
+
+Сцена 3: Настройка безопасной печати
+
+Описание: Пользователь выбирает принтер (из трёх вариантов), время автоматического удаления невостребованного задания (5, 15, 30 минут), необходимость аутентификации.
+
+Критерий успеха: Принтер — «Принтер в сейфовой комнате», время = 5 минут, аутентификация = Да.
+
+Сцена 4: Маркировка и уничтожение
+
+Описание: Два вопроса:
+
+Как промаркировать конфиденциальный документ (варианты: только гриф, штамп с номером экземпляра, без маркировки).
+
+Что сделать с бракованной распечаткой (мусор, черновик, шредер 3-й степени, сжечь).
+
+Критерий успеха: Штамп с номером экземпляра + шредер 3-й степени.
+
+Сцена 5: Расследование инцидента
+
+Описание: Представлен журнал печати (таблица). Пользователь должен указать, кто из сотрудников распечатал тот же конфиденциальный файл сразу после Петрова и не имел прав.
+
+Критерий успеха: Ответ — Иванов.
+
+### 2.3. Дополнительные функциональные требования
+Прогресс и очки: отображение текущего этапа (счётчик или прогресс-бар) и накопленных баллов (по +10 баллов за каждый успешно пройденный этап).
+
+Звуковое сопровождение: короткий звуковой сигнал при правильном ответе (1000 Гц, 200 мс) и при ошибке (400 Гц, 500 мс). Возможность отключения звука не требуется.
+
+Анимация: при проверке ответа фон основного рабочего фрейма должен плавно менять цвет на зелёный (успех) или красный (ошибка) с последующим возвратом к исходному цвету. Длительность анимации не более 0,5 секунды.
+
+Подсказки: на каждой сцене должна быть кнопка «Подсказка». При нажатии в нижней части окна на 5 секунд отображается текст с полезным советом по текущему заданию.
+
+Завершение игры: после успешного прохождения всех 5 сцен выводится финальное сообщение с итоговым количеством очков. Приложение закрывается по желанию пользователя (кнопка OK в сообщении или крестик окна).
+
+### 2.4. Обработка ошибок
+При неправильном ответе на любом этапе игра не переходит к следующей сцене, выдаёт сообщение об ошибке с пояснением и остаётся на текущей сцене для повторной попытки.
+
+Количество попыток не ограничено.
+
+Пользователь может менять свои ответы до момента нажатия кнопки «Проверить».
+
+## 3. Требования к пользовательскому интерфейсу
+### 3.1. Окно приложения
+Размер окна: не менее 900×700 пикселей (рекомендуется 900×700).
+
+Заголовок окна: «Игра: Управление доступом и контроль печати».
+
+Цветовая схема: тёмный фон (основной #2c3e50, заголовок #1a252f), светлый текст (#ecf0f1, #bdc3c7), акцентные кнопки (#3498db, #f39c12).
+
+### 3.2. Элементы интерфейса (постоянные)
+Верхняя панель (header): название игры, прогресс-бар (ttk.Progressbar), индикатор очков.
+
+Основная область (content): сменяемый контент в зависимости от сцены.
+
+Нижняя панель (footer): поле для отображения подсказок (изначально нейтральный текст).
+
+### 3.3. Элементы управления на сценах
+Кнопка «Проверить» (или аналогичная) — запускает проверку ответов.
+
+Кнопка «Подсказка» — отображает подсказку.
+
+На сцене 1 — выпадающие списки (Combobox) для выбора модели.
+
+На сцене 2 — чекбоксы в виде таблицы.
+
+На сцене 3 — радиокнопки и чекбокс.
+
+На сцене 4 — радиокнопки.
+
+На сцене 5 — радиокнопки и таблица (Treeview).
+
+Все элементы должны быть читаемыми, с достаточными отступами.
+
+## 4. Технические требования
+### 4.1. Платформа и язык реализации
+Язык программирования: Python версии 3.7 и выше.
+
+Графическая библиотека: tkinter (входит в стандартную поставку Python).
+
+Дополнительные библиотеки: не требуются (кроме стандартных: tkinter, random, time, winsound — опционально).
+
+### 4.2. Требования к коду
+Код должен быть самодостаточным, не требовать установки дополнительных пакетов.
+
+Структура: класс SecurityGame, методы для каждой сцены, методы анимации, звука, перехода между сценами.
+
+Использовать объектно-ориентированный подход.
+
+Код должен быть документирован (комментарии на русском или английском языке, поясняющие ключевые моменты).
+
+### 4.3. Обработка исключений
+При отсутствии звуковой поддержки (например, на Linux/macOS) программа не должна завершаться с ошибкой; функция звука должна корректно обрабатывать исключения (try/except).
+
+### 4.4. Производительность
+Интерфейс должен откликаться мгновенно на действия пользователя. Анимация не должна вызывать заметных задержек.
+
+## 5. Состав и содержание работ по разработке
+Разработка архитектуры приложения (класс, методы, хранение состояния).
+
+Реализация главного окна и постоянных элементов (прогресс, очки, подсказки).
+
+Реализация каждой из 5 сцен в соответствии с функциональными требованиями.
+
+Реализация звуковых эффектов и анимации.
+
+Интеграция подсказок и логики проверки ответов.
+
+Тестирование на корректность работы всех сценариев (правильные и неправильные ответы).
+
+Написание инструкции по запуску (в виде комментариев в коде или отдельного файла README).
+
+## 6. Требования к документации
+Документация должна включать:
+
+Краткое описание игры и её целей.
+
+Инструкцию по запуску (команда python filename.py).
+
+Краткое описание сцен и правильных ответов.
+
+Перечень использованных библиотек.
+
+Документация может быть оформлена в виде отдельного файла README.md или в виде комментариев в начале исходного кода.
+
+## 7. Порядок сдачи и приёмки
+Результатом работы является один файл с исходным кодом на Python (расширение .py), который при запуске открывает окно игры.
+
+Приёмка осуществляется по критериям:
+
+работа всех 5 сцен без ошибок;
+
+корректная обработка правильных и неправильных ответов;
+
+наличие прогресс-бара и счёта очков;
+
+наличие анимации и звуковых сигналов (или их корректное отключение при отсутствии поддержки);
+
+удобство интерфейса.
+
+Тестирование проводится на операционной системе Windows 10/11 (приоритет) и, опционально, на Linux/macOS.
+
+## 8. Сроки разработки
+(Указываются при необходимости, например: 5 рабочих дней с момента утверждения ТЗ.)
+
+## 9. Предполагаемые риски и их минимизация
+Риск: Отсутствие звука на платформах, отличных от Windows
+Минимизация: Использовать try/except, при отсутствии winsound просто не воспроизводить звук, не выдавая ошибку.
+
+Риск: Некорректное отображение анимации при медленной системе
+Минимизация: Установить минимальную задержку между шагами анимации (0.02 с) и ограничить число шагов (10).
+
+Риск: Сложность размещения чекбоксов на сцене 2
+Минимизация: Использовать Canvas.create_window для точного позиционирования.
+
+## 10. Приложение: эталонные правильные ответы
+Сцена 1: (1) DAC, (2) MAC, (3) RBAC
+
+Сцена 2: Бухгалтер → Зарплата; Кадровик → Личные дела; Сисадмин → Журналы; Стажёр → Инструкции
+
+Сцена 3: Принтер в сейфовой комнате, 5 минут, аутентификация Да
+
+Сцена 4: Штамп с номером экземпляра; шредер 3-й степени
+
+Сцена 5: Иванов

+ 35 - 0
Лекции/2.5.800_Управление_доступом_и_контроль_печати_конфиденциальной_информации/Guzeev_voprosi.md

@@ -0,0 +1,35 @@
+Какая модель управления доступом предполагает присвоение меток конфиденциальности объектам и субъектам, причём решение о доступе принимается системой, а не владельцем ресурса?
+1. Дискреционная (DAC)
+2. Мандатная (MAC)
+3. Ролевая (RBAC)
+4. Атрибутная (ABAC)
+
+Что такое технология SafePrint (Follow-me printing)?
+1. Печать напрямую на сетевой принтер без очереди
+2. Отправка задания в виртуальную очередь с последующей аутентификацией у принтера
+3. Шифрование документа перед отправкой на печать
+4. Автоматическая рассылка распечатанных документов по email
+
+Какая информация в обязательном порядке должна фиксироваться в журнале контроля печати конфиденциальных документов?
+1. Только количество страниц и имя принтера
+2. Только имя пользователя и дата
+3. Имя пользователя, дата и время, имя файла, количество страниц, имя принтера
+4. Только содержание документа полностью
+
+Что из перечисленного является организационной, а не технической мерой контроля печати?
+1. Водяной знак на распечатке
+2. Блокировка задания DLP-системой
+3. Маркировка бумажного носителя штампом с номером экземпляра
+4. Аутентификация по смарт-карте у принтера
+
+Какой принцип управления доступом означает, что пользователю даются только те права, которые минимально необходимы для выполнения его должностных обязанностей?
+1. Разделение обязанностей
+2. Принцип минимальных привилегий
+3. Принцип эскалации привилегий
+4. Принцип единого входа (SSO)
+
+Что делать, если сотрудник обнаружил на принтере оставленный кем-то конфиденциальный документ?
+1. Выбросить его в мусорную корзину
+2. Прочитать и положить обратно
+3. Немедленно сообщить службе безопасности и передать документ ответственному
+4. Распечатать дополнительные копии для всех