From 8aeb9a4244c18e08365673491f1cf09e6bef323c Mon Sep 17 00:00:00 2001 From: Arity-T Date: Mon, 16 Mar 2026 14:43:38 +0300 Subject: [PATCH] lab3 --- lab2/.python-version | 1 - lab2/pyproject.toml | 19 -- lab2/uv.lock | 8 - lab3/.gitignore | 2 + lab3/README.md | 94 ++++++ lab3/bruteforce.py | 138 ++++++++ lab3/confaccess.py | 518 +++++++++++++++++++++++++++++++ lab3/config.py | 15 + lab3/lab3.md | 108 +++++++ lab3/setup.sh | 43 +++ lab3/usermgr.py | 378 ++++++++++++++++++++++ report/img/lab3-acl.png | Bin 0 -> 8187 bytes report/img/lab3-confaccess.png | Bin 0 -> 48410 bytes report/img/lab3-labels.png | Bin 0 -> 14448 bytes report/img/lab3-setup.png | Bin 0 -> 69464 bytes report/img/lab3-usermgr-mode.png | Bin 0 -> 39754 bytes report/report.tex | 155 +++++++++ 17 files changed, 1451 insertions(+), 28 deletions(-) delete mode 100644 lab2/.python-version delete mode 100644 lab2/pyproject.toml delete mode 100644 lab2/uv.lock create mode 100644 lab3/.gitignore create mode 100644 lab3/README.md create mode 100644 lab3/bruteforce.py create mode 100644 lab3/confaccess.py create mode 100644 lab3/config.py create mode 100644 lab3/lab3.md create mode 100755 lab3/setup.sh create mode 100644 lab3/usermgr.py create mode 100644 report/img/lab3-acl.png create mode 100644 report/img/lab3-confaccess.png create mode 100644 report/img/lab3-labels.png create mode 100644 report/img/lab3-setup.png create mode 100644 report/img/lab3-usermgr-mode.png diff --git a/lab2/.python-version b/lab2/.python-version deleted file mode 100644 index 6324d40..0000000 --- a/lab2/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.14 diff --git a/lab2/pyproject.toml b/lab2/pyproject.toml deleted file mode 100644 index fa3cc51..0000000 --- a/lab2/pyproject.toml +++ /dev/null @@ -1,19 +0,0 @@ -[project] -name = "lab2" -version = "0.1.0" -description = "Authentication, authorization and brute force research system" -readme = "README.md" -requires-python = ">=3.14" -dependencies = [] - -[project.scripts] -usermgr = "usermgr:main" -access = "access:main" -bruteforce = "bruteforce:main" - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build.targets.wheel] -include = ["*.py"] diff --git a/lab2/uv.lock b/lab2/uv.lock deleted file mode 100644 index dca6f44..0000000 --- a/lab2/uv.lock +++ /dev/null @@ -1,8 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.14" - -[[package]] -name = "lab2" -version = "0.1.0" -source = { editable = "." } diff --git a/lab3/.gitignore b/lab3/.gitignore new file mode 100644 index 0000000..3f4a8fb --- /dev/null +++ b/lab3/.gitignore @@ -0,0 +1,2 @@ +*.pyc +*.pdf \ No newline at end of file diff --git a/lab3/README.md b/lab3/README.md new file mode 100644 index 0000000..95743b8 --- /dev/null +++ b/lab3/README.md @@ -0,0 +1,94 @@ +# Lab 3 — DAC + MAC + +Система доступа к конфиденциальным данным с дискреционным (DAC) и мандатным (MAC) управлением доступом. Основана на Lab 2. + +## Структура каталогов + +``` +$PRACTICE3_DIR/ # по умолчанию /usr/local/practice3 +├── etc/ +│ ├── passwd # логин:sha256:id:права:ФИО +│ ├── access_mode # BOTH | DAC_ONLY | MAC_ONLY +│ ├── acl # матрица доступа (DAC) +│ ├── subject_labels # метки субъектов (MAC) +│ └── object_labels # метки объектов (MAC) +├── confdata/ # конфиденциальные файлы +├── bin/ # usermgr, confaccess, bruteforce +└── log/ # usermgr.log, access.log +``` + +## Режимы проверки доступа + +| Режим | DAC | MAC | +|-------|-----|-----| +| BOTH (по умолчанию) | да | да | +| DAC_ONLY | да | нет | +| MAC_ONLY | нет | да | + +Режим задаётся через `usermgr set-mode` (только root). + +## Установка + +```bash +chmod +x setup.sh + +# для пути по умолчанию нужен root: +sudo ./setup.sh + +# для тестирования без root: +PRACTICE3_DIR=/tmp/practice3 ./setup.sh +``` + +## Использование + +### usermgr — управление пользователями + +```bash +usermgr add alice +usermgr list +usermgr edit alice --full-name "Иванов Иван" --permissions rw +usermgr edit alice --label 1 # метка субъекта (root only) +usermgr set-label report.txt 2 # метка объекта (root only) +usermgr set-mode DAC_ONLY # режим проверки (root only) +usermgr show-mode # текущий режим (root only) +usermgr passwd alice +usermgr delete alice +``` + +### confaccess — доступ к данным + +```bash +confaccess +PRACTICE3_DIR=/tmp/practice3 confaccess +``` + +Команды после аутентификации: + +``` +create создать файл (владелец = текущий пользователь) +read прочитать файл +append дописать в файл +copy скопировать в confdata +remove удалить файл +grant выдать права (только владелец) +help / exit +``` + +### DAC (дискреционный доступ) + +- Каждый объект имеет владельца (создатель) +- Владелец может выдавать права через `grant ` +- Права: r (чтение), w (запись), d (удаление) + +### MAC (мандатный доступ, Белл–Лападула) + +- Метки: 0 — несекретно, 1 — ДСП, 2 — секретно +- Нет чтения сверху: субъект читает только объекты с уровнем ≤ своего +- Нет записи вниз: субъект пишет только в объекты с уровнем ≥ своего + +### bruteforce + +```bash +bruteforce alice +bruteforce alice --max-length 4 +``` diff --git a/lab3/bruteforce.py b/lab3/bruteforce.py new file mode 100644 index 0000000..1f6e1d6 --- /dev/null +++ b/lab3/bruteforce.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python3 +import argparse +import itertools +import shutil +import string +import subprocess +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) + +from config import BIN_DIR + +CHARSET = string.ascii_letters + string.digits + "!@#$%^&*()" +FIRST_CHARS = string.ascii_letters + +MAX_HOURS = 8 + + +def get_access_cmd() -> list[str]: + """Resolve path to confaccess utility.""" + for name in ("confaccess", "access"): + path = shutil.which(name) + if path: + return [path] + script_dir = Path(__file__).resolve().parent + confaccess_script = script_dir / "confaccess.py" + if confaccess_script.exists(): + return [sys.executable, str(confaccess_script)] + for name in ("confaccess", "access"): + bin_cmd = BIN_DIR / name + if bin_cmd.exists(): + return [str(bin_cmd)] + return ["confaccess"] + + +def max_combinations(length: int) -> int: + if length == 1: + return len(FIRST_CHARS) + return len(FIRST_CHARS) * (len(CHARSET) ** (length - 1)) + + +def brute_force_length( + login: str, length: int, proc: subprocess.Popen[str] +) -> tuple[str, int, float] | None: + """Try all passwords of given length via batch process. proc = confaccess --check.""" + count = 0 + start = time.perf_counter() + stdin = proc.stdin + stdout = proc.stdout + assert stdin is not None and stdout is not None + + def check(password: str) -> bool: + nonlocal count + count += 1 + stdin.write(password + "\n") + stdin.flush() + line = stdout.readline() + if not line: + return False + return line.strip() == "1" + + if length == 1: + for first in FIRST_CHARS: + if time.perf_counter() - start > MAX_HOURS * 3600: + return None + if check(first): + return first, count, time.perf_counter() - start + return None + + for first in FIRST_CHARS: + for rest in itertools.product(CHARSET, repeat=length - 1): + if time.perf_counter() - start > MAX_HOURS * 3600: + return None + password = first + "".join(rest) + if check(password): + return password, count, time.perf_counter() - start + + return None + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Brute force password cracker (via confaccess utility)" + ) + parser.add_argument("login", help="Target username") + parser.add_argument( + "--max-length", + type=int, + default=6, + help="Maximum password length to try (default: 6)", + ) + args = parser.parse_args() + + cmd = get_access_cmd() + ["--check", args.login] + proc = subprocess.Popen( + cmd, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + text=True, + bufsize=1, + ) + try: + print(f"Target: {args.login}") + print(f"Charset size: {len(CHARSET)} ({len(FIRST_CHARS)} valid for first char)") + print() + + total_start = time.perf_counter() + for length in range(1, args.max_length + 1): + total = max_combinations(length) + print(f"Length {length}: max {total:>15,} combinations") + + result = brute_force_length(args.login, length, proc) + + if result is not None: + password, count, elapsed = result + total_elapsed = time.perf_counter() - total_start + print(f" >>> FOUND: '{password}'") + print(f" Iterations: {count:,}") + print(f" Time (len): {elapsed:.4f}s") + print(f" Time (total): {total_elapsed:.4f}s") + print(f" Speed: {count / elapsed:,.0f} attempts/s") + return + else: + print(f" Not found at length {length} (timeout or exhausted)") + + print(f"\nPassword not found within length {args.max_length}.") + finally: + if proc.stdin: + proc.stdin.close() + if proc.poll() is None: + proc.terminate() + proc.wait() + + +if __name__ == "__main__": + main() diff --git a/lab3/confaccess.py b/lab3/confaccess.py new file mode 100644 index 0000000..878a983 --- /dev/null +++ b/lab3/confaccess.py @@ -0,0 +1,518 @@ +#!/usr/bin/env python3 +"""Access to confidential data with DAC and MAC.""" + +import argparse +import getpass +import hashlib +import shutil +import signal +import sys +from datetime import datetime +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) + +from config import ( + ACL_FILE, + ACCESS_MODE_FILE, + CONFDATA_DIR, + LOG_DIR, + OBJECT_LABELS_FILE, + PASSWD_FILE, + SUBJECT_LABELS_FILE, +) + +HELP_TEXT = """\ +Commands: + create create new empty file + read print file contents + append append text line to file + copy copy file into confdata + remove delete file from confdata + grant grant access (owner only) + help show this help + exit exit""" + + +def hash_password(password: str) -> str: + return hashlib.sha256(password.encode("ascii")).hexdigest() + + +def log_action(login: str, action: str) -> None: + LOG_DIR.mkdir(parents=True, exist_ok=True) + timestamp = datetime.now().isoformat(sep=" ", timespec="seconds") + with open(LOG_DIR / "access.log", "a") as f: + f.write(f"{timestamp} [{login}] {action}\n") + + +def read_users() -> dict[str, dict]: + users: dict[str, dict] = {} + if not PASSWD_FILE.exists(): + return users + with open(PASSWD_FILE) as f: + for line in f: + line = line.strip() + if not line: + continue + parts = line.split(":", 4) + if len(parts) != 5: + continue + users[parts[0]] = { + "password_hash": parts[1], + "id": parts[2], + "permissions": parts[3], + "full_name": parts[4], + } + return users + + +def read_access_mode() -> str: + if not ACCESS_MODE_FILE.exists(): + return "BOTH" + raw = ACCESS_MODE_FILE.read_text().strip().upper() + if raw in ("BOTH", "DAC_ONLY", "MAC_ONLY"): + return raw + return "BOTH" + + +def normalize_path(path: str) -> str: + """Normalize path relative to confdata (no ./, no trailing /).""" + p = path.strip().lstrip("./") + parts = [x for x in p.split("/") if x] + return "/".join(parts) if parts else "" + + +def read_acl() -> dict[str, dict]: + """Read ACL: path -> {owner, perms: {user: perms_str}}.""" + acl: dict[str, dict] = {} + if not ACL_FILE.exists(): + return acl + for line in ACL_FILE.read_text().splitlines(): + line = line.strip() + if not line: + continue + parts = line.split(":", 2) + if len(parts) < 3: + continue + path, owner, assignments = parts[0], parts[1], parts[2] + path = normalize_path(path) + perms: dict[str, str] = {} + for ass in assignments.split(","): + if ":" in ass: + u, p = ass.split(":", 1) + perms[u.strip()] = p.strip() + acl[path] = {"owner": owner, "perms": perms} + return acl + + +def write_acl(acl: dict[str, dict]) -> None: + ACL_FILE.parent.mkdir(parents=True, exist_ok=True) + lines = [] + for path in sorted(acl.keys()): + entry = acl[path] + owner = entry["owner"] + perms = entry["perms"] + ass = ",".join(f"{u}:{p}" for u, p in sorted(perms.items())) + lines.append(f"{path}:{owner}:{ass}") + ACL_FILE.write_text("\n".join(lines) + "\n") + + +def read_subject_labels() -> dict[str, int]: + labels: dict[str, int] = {} + if not SUBJECT_LABELS_FILE.exists(): + return labels + for line in SUBJECT_LABELS_FILE.read_text().splitlines(): + line = line.strip() + if not line: + continue + parts = line.split(":", 1) + if len(parts) == 2 and parts[1] in ("0", "1", "2"): + labels[parts[0]] = int(parts[1]) + return labels + + +def read_object_labels() -> dict[str, int]: + labels: dict[str, int] = {} + if not OBJECT_LABELS_FILE.exists(): + return labels + for line in OBJECT_LABELS_FILE.read_text().splitlines(): + line = line.strip() + if not line: + continue + parts = line.split(":", 1) + if len(parts) == 2 and parts[1] in ("0", "1", "2"): + labels[parts[0]] = int(parts[1]) + return labels + + +def write_object_labels(labels: dict[str, int]) -> None: + OBJECT_LABELS_FILE.parent.mkdir(parents=True, exist_ok=True) + lines = [f"{path}:{level}" for path, level in sorted(labels.items())] + OBJECT_LABELS_FILE.write_text("\n".join(lines) + "\n") + + +def dac_allows(login: str, action: str, rel_path: str) -> bool: + """Check DAC: does login have required permission on object?""" + rel_path = normalize_path(rel_path) + acl = read_acl() + if action in ("create", "create_dst"): + # New object: not in ACL yet, any authenticated user can create + if rel_path not in acl: + return True + entry = acl.get(rel_path) + if not entry: + return False + perms = entry["perms"].get(login, "") + if action == "read": + return "r" in perms + if action in ("write", "append", "create_dst"): + return "w" in perms + if action == "remove": + return "d" in perms + if action == "grant": + return entry["owner"] == login + return False + + +def dac_owner(rel_path: str) -> str | None: + """Return owner of path or None.""" + rel_path = normalize_path(rel_path) + acl = read_acl() + entry = acl.get(rel_path) + return entry["owner"] if entry else None + + +def mac_allows(login: str, action: str, rel_path: str, obj_level: int | None = None) -> bool: + """Check MAC (Bell-LaPadula).""" + labels = read_subject_labels() + subj_level = labels.get(login, 0) + obj_labels = read_object_labels() + norm_path = normalize_path(rel_path) + if obj_level is None: + obj_level = obj_labels.get(norm_path) + if action == "read": + # No read up: subject_level >= object_level + obj_lev = obj_level if obj_level is not None else 0 + return subj_level >= obj_lev + if action in ("write", "append", "remove"): + obj_lev = obj_level if obj_level is not None else 0 + return subj_level <= obj_lev + if action == "create_dst": + # New object gets subject's label; subject can write to same level + return True + return True + + +def check_access(login: str, action: str, rel_path: str, mode: str) -> bool: + if mode in ("BOTH", "DAC_ONLY"): + if not dac_allows(login, action, rel_path): + return False + if mode in ("BOTH", "MAC_ONLY"): + if not mac_allows(login, action, rel_path): + return False + return True + + +def authenticate() -> tuple[str, dict]: + users = read_users() + while True: + try: + login = input("Login: ").strip() + password = getpass.getpass("Password: ") + except (EOFError, KeyboardInterrupt): + print("\nBye.") + sys.exit(0) + + user = users.get(login) + if user and user["password_hash"] == hash_password(password): + return login, user + log_action(login if login else "-", "LOGIN_FAILED") + print("Invalid credentials. Try again.") + + +def confdata_path(arg: str) -> Path: + p = Path(arg) + if not p.is_absolute(): + p = CONFDATA_DIR / p + return p.resolve() + + +def rel_path_from_confdata(path: Path) -> str: + try: + rel = path.relative_to(CONFDATA_DIR.resolve()) + return "/".join(rel.parts) + except ValueError: + return "" + + +def is_in_confdata(path: Path) -> bool: + try: + path.relative_to(CONFDATA_DIR.resolve()) + return True + except ValueError: + return False + + +def cmd_read(args: list[str], login: str, mode: str) -> None: + if len(args) != 1: + print("Usage: read ") + return + path = confdata_path(args[0]) + if not is_in_confdata(path): + print("Access denied: file must be inside confdata") + return + if not path.exists(): + print(f"File not found: {path.name}") + return + rel = rel_path_from_confdata(path) + if not check_access(login, "read", rel, mode): + print("Permission denied") + return + print(path.read_text(), end="") + log_action(login, f"READ {path}") + + +def cmd_create(args: list[str], login: str, mode: str) -> None: + if len(args) != 1: + print("Usage: create ") + return + path = confdata_path(args[0]) + if not is_in_confdata(path): + print("Access denied: file must be inside confdata") + return + if path.exists(): + print(f"File already exists: {path.name}") + return + rel = rel_path_from_confdata(path) + # DAC: new object, add to ACL with owner=login + # MAC: new object gets subject's label + if mode in ("BOTH", "DAC_ONLY"): + acl = read_acl() + acl[rel] = {"owner": login, "perms": {login: "rwd"}} + write_acl(acl) + if mode in ("BOTH", "MAC_ONLY"): + labels = read_subject_labels() + subj_level = labels.get(login, 0) + obj_labels = read_object_labels() + obj_labels[rel] = subj_level + write_object_labels(obj_labels) + path.parent.mkdir(parents=True, exist_ok=True) + path.touch() + log_action(login, f"CREATE {path}") + print("Done.") + + +def cmd_append(args: list[str], login: str, mode: str) -> None: + if len(args) < 2: + print("Usage: append ") + return + path = confdata_path(args[0]) + if not is_in_confdata(path): + print("Access denied: file must be inside confdata") + return + if not path.exists(): + print(f"File not found: {path.name}. Use 'create' first.") + return + rel = rel_path_from_confdata(path) + if not check_access(login, "append", rel, mode): + print("Permission denied") + return + text = " ".join(args[1:]) + with open(path, "a") as f: + f.write(text + "\n") + log_action(login, f"APPEND {path}") + print("Done.") + + +def cmd_copy(args: list[str], login: str, mode: str) -> None: + if len(args) != 2: + print("Usage: copy ") + return + + src = Path(args[0]).resolve() + dst = confdata_path(args[1]) + + if not is_in_confdata(dst): + print("Access denied: destination must be inside confdata") + return + if dst.is_dir(): + dst = dst / src.name + if dst.exists(): + print(f"Destination already exists: {dst.name}") + return + if not src.exists(): + print(f"Source not found: {args[0]}") + return + if src.is_dir(): + print("Copying directories is not supported") + return + + dst_rel = rel_path_from_confdata(dst) + src_rel = rel_path_from_confdata(src) if is_in_confdata(src) else None + + if src_rel is not None: + if not check_access(login, "read", src_rel, mode): + print("Permission denied (read source)") + return + if not check_access(login, "create_dst", dst_rel, mode): + print("Permission denied (create destination)") + return + + shutil.copy2(src, dst) + if mode in ("BOTH", "DAC_ONLY"): + acl = read_acl() + acl[dst_rel] = {"owner": login, "perms": {login: "rwd"}} + write_acl(acl) + if mode in ("BOTH", "MAC_ONLY"): + labels = read_subject_labels() + subj_level = labels.get(login, 0) + obj_labels = read_object_labels() + obj_labels[dst_rel] = subj_level + write_object_labels(obj_labels) + log_action(login, f"COPY {src} -> {dst}") + print("Done.") + + +def cmd_remove(args: list[str], login: str, mode: str) -> None: + if len(args) != 1: + print("Usage: remove ") + return + path = confdata_path(args[0]) + if not is_in_confdata(path): + print("Access denied: file must be inside confdata") + return + if not path.exists(): + print(f"File not found: {path.name}") + return + rel = rel_path_from_confdata(path) + if not check_access(login, "remove", rel, mode): + print("Permission denied") + return + path.unlink() + if mode in ("BOTH", "DAC_ONLY"): + acl = read_acl() + acl.pop(rel, None) + write_acl(acl) + if mode in ("BOTH", "MAC_ONLY"): + obj_labels = read_object_labels() + obj_labels.pop(rel, None) + write_object_labels(obj_labels) + log_action(login, f"REMOVE {path}") + print("Done.") + + +def cmd_grant(args: list[str], login: str, mode: str) -> None: + if mode not in ("BOTH", "DAC_ONLY"): + print("grant is only available in DAC or BOTH mode") + return + if len(args) != 3: + print("Usage: grant ") + return + target_user, path_arg, perms = args[0], args[1], args[2] + for ch in perms: + if ch not in "rwd": + print(f"Invalid permission {ch!r}; allowed: r, w, d") + return + path = confdata_path(path_arg) + if not is_in_confdata(path): + print("Access denied: path must be inside confdata") + return + if not path.exists(): + print(f"File not found: {path_arg}") + return + rel = rel_path_from_confdata(path) + if not dac_allows(login, "grant", rel): + print("Permission denied (only owner can grant)") + return + acl = read_acl() + entry = acl.get(rel) + if not entry: + print("ACL entry not found") + return + entry["perms"][target_user] = perms + write_acl(acl) + log_action(login, f"GRANT {target_user} {rel} {perms}") + print("Done.") + + +def check_credentials(login: str, password: str) -> bool: + """Check login+password against passwd. Used by --check mode.""" + users = read_users() + user = users.get(login) + if user and user["password_hash"] == hash_password(password): + return True + return False + + +def main() -> None: + parser = argparse.ArgumentParser(description="Access confidential data") + parser.add_argument( + "--check", + metavar="LOGIN", + help="Batch mode: read passwords line-by-line from stdin, output 0 or 1 per line; exit 0 on first match", + ) + args, _ = parser.parse_known_args() + + if args.check is not None: + users = read_users() + user = users.get(args.check) + target_hash = user["password_hash"] if user else None + + for line in sys.stdin: + password = line.rstrip("\n") + if target_hash and hash_password(password) == target_hash: + sys.stdout.write("1\n") + sys.stdout.flush() + sys.exit(0) + sys.stdout.write("0\n") + sys.stdout.flush() + sys.exit(1) + + signal.signal(signal.SIGINT, lambda _s, _f: (print("\nBye."), sys.exit(0))) + + login, user = authenticate() + full_name = user["full_name"] + mode = read_access_mode() + + log_action(login, "LOGIN") + print(f"\nПривет, {full_name}") + print(HELP_TEXT) + + while True: + try: + line = input(f"\n{login}> ").strip() + except (EOFError, KeyboardInterrupt): + log_action(login, "EXIT") + print("\nBye.") + break + + if not line: + continue + + parts = line.split() + command, cmd_args = parts[0], parts[1:] + + if command == "exit": + log_action(login, "EXIT") + print("Bye.") + break + elif command == "help": + print(HELP_TEXT) + elif command == "create": + cmd_create(cmd_args, login, mode) + elif command == "read": + cmd_read(cmd_args, login, mode) + elif command == "append": + cmd_append(cmd_args, login, mode) + elif command == "copy": + cmd_copy(cmd_args, login, mode) + elif command == "remove": + cmd_remove(cmd_args, login, mode) + elif command == "grant": + cmd_grant(cmd_args, login, mode) + else: + print(f"Unknown command: {command!r}. Type 'help' for available commands.") + + +if __name__ == "__main__": + main() diff --git a/lab3/config.py b/lab3/config.py new file mode 100644 index 0000000..537042c --- /dev/null +++ b/lab3/config.py @@ -0,0 +1,15 @@ +import os +from pathlib import Path + +BASE_DIR = Path(os.environ.get("PRACTICE3_DIR", "/usr/local/practice3")) + +ETC_DIR = BASE_DIR / "etc" +CONFDATA_DIR = BASE_DIR / "confdata" +BIN_DIR = BASE_DIR / "bin" +LOG_DIR = BASE_DIR / "log" + +PASSWD_FILE = ETC_DIR / "passwd" +ACCESS_MODE_FILE = ETC_DIR / "access_mode" +ACL_FILE = ETC_DIR / "acl" +SUBJECT_LABELS_FILE = ETC_DIR / "subject_labels" +OBJECT_LABELS_FILE = ETC_DIR / "object_labels" diff --git a/lab3/lab3.md b/lab3/lab3.md new file mode 100644 index 0000000..6ea3430 --- /dev/null +++ b/lab3/lab3.md @@ -0,0 +1,108 @@ + +# Практическая работа №3 +**Дисциплина:** Защита информации +**Тема:** Реализация моделей дискреционного и мандатного управления доступом + +**Преподаватель:** Силиненко А.В. +**Email:** a_silinenko@mail.ru + +--- + +## 1. Цели работы + +- Изучить особенности моделей дискреционного (DAC) и мандатного (MAC) управления доступом. +- На базе разработанной в практической работе 2 системы аутентификации и авторизации реализовать DAC и MAC. + +--- + +## 2. Задачи работы + +### 2.1 +Изучить особенности дискреционного (произвольного) управления доступом, а также модель Харрисона–Руззо–Ульмана, основанную на DAC. + +### 2.2 +На базе разработанной в практической работе 2 системы аутентификации и авторизации разработать систему, реализующую DAC, включая: + +- владение объектами; +- произвольное назначение прав доступа к объектам; +- контроль на основе матрицы или списка доступа. + +### 2.3 +Изучить особенности мандатного (принудительного) управления доступом, а также модель Белла–Лападулы, основанную на MAC. + +### 2.4 +На базе разработанной в практической работе 2 системы аутентификации и авторизации разработать систему, реализующую MAC, включая: + +- метки безопасности для субъектов и объектов; +- свойства безопасности модели Белла–Лападулы. + +--- + +## 3. Требования к работе + +### 3.1 +Работа выполняется в ОС **Linux** или **MacOS**. + +### 3.2 +Для выполнения работы необходимо создать отдельное дерево каталогов, например: + +``` +/usr/local/practice3/etc – файлы настроек +/usr/local/practice3/confdata – файлы с конфиденциальной информацией +/usr/local/practice3/bin – исполняемые файлы +/usr/local/practice3/log – файлы регистрации +``` + +Права доступа к созданным каталогам: **чтение, запись и выполнение только для пользователя root**. + +При необходимости возможно создание дополнительных каталогов. + +--- + +### 3.3 Требования к системе DAC + +- у каждого объекта должен быть владелец, который может произвольно назначать и передавать права доступа к этому объекту; +- контроль доступа к объектам должен осуществляться на основе **матрицы или списка доступа**, где хранится информация о правах доступа субъектов к объектам. + +--- + +### 3.4 Требования к системе MAC + +- каждому субъекту и объекту должна присваиваться **метка безопасности суперпользователем**; +- предусмотреть **не менее трех уровней меток безопасности**, например: + - несекретно + - для служебного пользования (ДСП) + - секретно +- субъекты не могут менять метки безопасности; +- контроль доступа должен осуществляться на основе свойств безопасности **модели Белла–Лападулы**: + - «нет чтения сверху» + - «нет записи вниз» + - дискреционное свойство + +--- + +## 4. Требования к отчету + +В разделе отчета должны быть приведены: + +- актуальность темы работы в контексте дисциплины; +- цель и задачи работы; +- требования к разрабатываемым системам; +- краткие сведения о DAC и MAC; +- примеры компиляции и сборки приложений (если используется компилируемый язык); +- примеры запуска и работы утилит доступа к конфиденциальной информации; +- примеры содержимого служебных файлов: + - матрицы (или списка) доступа для DAC + - меток конфиденциальности для MAC; +- выводы по проделанной работе. + +--- + +Примечание + +Та система котрая нами уже разработана в lab2 +1. Необходимо выпустить ее реинкарнацию с учетом требований к тому что это должен быть дискреционный подход к управлению доступа +Свойства системы которые необходимо будет реализовать будет в задании +2. Необходимо реализовать мандатный подход к управлению доступом + +Структура остается прежней нам просто нужно добавить компоненты для первого и второго подходов \ No newline at end of file diff --git a/lab3/setup.sh b/lab3/setup.sh new file mode 100755 index 0000000..dd84ad4 --- /dev/null +++ b/lab3/setup.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BASE_DIR="${PRACTICE3_DIR:-/usr/local/practice3}" + +echo "Setting up directory structure at: $BASE_DIR" + +mkdir -p "$BASE_DIR/etc" "$BASE_DIR/confdata" "$BASE_DIR/bin" "$BASE_DIR/log" + +touch "$BASE_DIR/etc/passwd" +echo "BOTH" > "$BASE_DIR/etc/access_mode" +touch "$BASE_DIR/etc/acl" +touch "$BASE_DIR/etc/subject_labels" +touch "$BASE_DIR/etc/object_labels" + +cp "$SCRIPT_DIR/config.py" "$BASE_DIR/bin/config.py" +cp "$SCRIPT_DIR/usermgr.py" "$BASE_DIR/bin/usermgr" +cp "$SCRIPT_DIR/confaccess.py" "$BASE_DIR/bin/confaccess" +cp "$SCRIPT_DIR/bruteforce.py" "$BASE_DIR/bin/bruteforce" + +chmod +x "$BASE_DIR/bin/usermgr" "$BASE_DIR/bin/confaccess" "$BASE_DIR/bin/bruteforce" + +if [ "$(id -u)" -eq 0 ]; then + chmod 700 "$BASE_DIR" "$BASE_DIR/etc" "$BASE_DIR/confdata" "$BASE_DIR/bin" "$BASE_DIR/log" + chmod 600 "$BASE_DIR/etc/passwd" "$BASE_DIR/etc/access_mode" \ + "$BASE_DIR/etc/acl" "$BASE_DIR/etc/subject_labels" "$BASE_DIR/etc/object_labels" + echo "Permissions set (root-only)." +else + echo "Warning: not running as root; skipping permission hardening." +fi + +echo "" +echo "Done. Directory layout:" +ls -la "$BASE_DIR" +echo "" +echo "Next steps:" +echo " $BASE_DIR/bin/usermgr add " +echo " $BASE_DIR/bin/confaccess" +echo " $BASE_DIR/bin/bruteforce " +echo "" +echo "To add bin to PATH temporarily:" +echo " export PATH=\"$BASE_DIR/bin:\$PATH\"" diff --git a/lab3/usermgr.py b/lab3/usermgr.py new file mode 100644 index 0000000..7c88373 --- /dev/null +++ b/lab3/usermgr.py @@ -0,0 +1,378 @@ +#!/usr/bin/env python3 +import argparse +import getpass +import hashlib +import os +import sys +from datetime import datetime +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) + +from config import ( + ACCESS_MODE_FILE, + ETC_DIR, + LOG_DIR, + OBJECT_LABELS_FILE, + PASSWD_FILE, + SUBJECT_LABELS_FILE, +) + +ALLOWED_CHARS = set( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()" +) +FIRST_CHAR_ALLOWED = set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") +VALID_PERM_CHARS = set("rwd") +VALID_LABELS = frozenset({"0", "1", "2"}) + + +def require_root() -> None: + """Exit if not running as root.""" + if os.geteuid() != 0: + print("Must run as root", file=sys.stderr) + sys.exit(1) + + +def hash_password(password: str) -> str: + return hashlib.sha256(password.encode("ascii")).hexdigest() + + +def validate_password(password: str) -> str | None: + if not password: + return "password cannot be empty" + if password[0] not in FIRST_CHAR_ALLOWED: + return "first character must be a letter (A-Z, a-z)" + invalid = [ch for ch in password if ch not in ALLOWED_CHARS] + if invalid: + return f"invalid characters: {''.join(set(invalid))!r}" + return None + + +def validate_permissions(perms: str) -> str | None: + if not perms: + return "permissions cannot be empty" + for ch in perms: + if ch not in VALID_PERM_CHARS: + return f"invalid permission {ch!r}; allowed: r, w, d" + if len(set(perms)) != len(perms): + return "duplicate permissions" + return None + + +def log_action(action: str) -> None: + LOG_DIR.mkdir(parents=True, exist_ok=True) + timestamp = datetime.now().isoformat(sep=" ", timespec="seconds") + with open(LOG_DIR / "usermgr.log", "a") as f: + f.write(f"{timestamp} {action}\n") + + +def read_users() -> list[dict]: + if not PASSWD_FILE.exists(): + return [] + users = [] + with open(PASSWD_FILE) as f: + for line in f: + line = line.strip() + if not line: + continue + parts = line.split(":", 4) + if len(parts) != 5: + continue + users.append( + { + "login": parts[0], + "password_hash": parts[1], + "id": parts[2], + "permissions": parts[3], + "full_name": parts[4], + } + ) + return users + + +def write_users(users: list[dict]) -> None: + PASSWD_FILE.parent.mkdir(parents=True, exist_ok=True) + with open(PASSWD_FILE, "w") as f: + for u in users: + f.write( + f"{u['login']}:{u['password_hash']}:{u['id']}:{u['permissions']}:{u['full_name']}\n" + ) + + +def find_user(users: list[dict], login: str) -> dict | None: + return next((u for u in users if u["login"] == login), None) + + +def next_uid(users: list[dict]) -> str: + if not users: + return "1" + return str(max(int(u["id"]) for u in users) + 1) + + +def prompt_password() -> str: + while True: + password = getpass.getpass("Password: ") + err = validate_password(password) + if err: + print(f"Invalid password: {err}") + continue + confirm = getpass.getpass("Confirm password: ") + if password != confirm: + print("Passwords do not match.") + continue + return password + + +def read_access_mode() -> str: + """Read access mode; default BOTH if file missing.""" + if not ACCESS_MODE_FILE.exists(): + return "BOTH" + raw = ACCESS_MODE_FILE.read_text().strip().upper() + if raw in ("BOTH", "DAC_ONLY", "MAC_ONLY"): + return raw + return "BOTH" + + +def write_access_mode(mode: str) -> None: + ETC_DIR.mkdir(parents=True, exist_ok=True) + ACCESS_MODE_FILE.write_text(mode + "\n") + + +def read_subject_labels() -> dict[str, int]: + """Read subject labels; login -> level (0, 1, 2).""" + labels: dict[str, int] = {} + if not SUBJECT_LABELS_FILE.exists(): + return labels + for line in SUBJECT_LABELS_FILE.read_text().splitlines(): + line = line.strip() + if not line: + continue + parts = line.split(":", 1) + if len(parts) == 2 and parts[1] in VALID_LABELS: + labels[parts[0]] = int(parts[1]) + return labels + + +def write_subject_labels(labels: dict[str, int]) -> None: + ETC_DIR.mkdir(parents=True, exist_ok=True) + lines = [f"{login}:{level}" for login, level in sorted(labels.items())] + SUBJECT_LABELS_FILE.write_text("\n".join(lines) + "\n") + + +def read_object_labels() -> dict[str, int]: + """Read object labels; path (relative to confdata) -> level.""" + labels: dict[str, int] = {} + if not OBJECT_LABELS_FILE.exists(): + return labels + for line in OBJECT_LABELS_FILE.read_text().splitlines(): + line = line.strip() + if not line: + continue + parts = line.split(":", 1) + if len(parts) == 2 and parts[1] in VALID_LABELS: + labels[parts[0]] = int(parts[1]) + return labels + + +def write_object_labels(labels: dict[str, int]) -> None: + ETC_DIR.mkdir(parents=True, exist_ok=True) + lines = [f"{path}:{level}" for path, level in sorted(labels.items())] + OBJECT_LABELS_FILE.write_text("\n".join(lines) + "\n") + + +def cmd_add(args: argparse.Namespace) -> None: + users = read_users() + login = args.login + + if find_user(users, login): + print(f"User '{login}' already exists.") + sys.exit(1) + + full_name = input("Full name: ").strip() + if not full_name: + print("Full name cannot be empty.") + sys.exit(1) + + perms = input("Permissions (any combination of r, w, d): ").strip() + err = validate_permissions(perms) + if err: + print(f"Invalid permissions: {err}") + sys.exit(1) + + password = prompt_password() + + uid = next_uid(users) + users.append( + { + "login": login, + "password_hash": hash_password(password), + "id": uid, + "permissions": perms, + "full_name": full_name, + } + ) + write_users(users) + log_action(f"ADD login={login} id={uid} permissions={perms} full_name='{full_name}'") + print(f"User '{login}' added (id={uid}).") + + +def cmd_edit(args: argparse.Namespace) -> None: + if args.label is not None: + require_root() + + users = read_users() + user = find_user(users, args.login) + if not user: + print(f"User '{args.login}' not found.") + sys.exit(1) + + changed: list[str] = [] + + if args.full_name is not None: + if not args.full_name: + print("Full name cannot be empty.") + sys.exit(1) + user["full_name"] = args.full_name + changed.append("full_name") + + if args.permissions is not None: + err = validate_permissions(args.permissions) + if err: + print(f"Invalid permissions: {err}") + sys.exit(1) + user["permissions"] = args.permissions + changed.append("permissions") + + if args.label is not None: + if args.label not in VALID_LABELS: + print(f"Invalid label {args.label!r}; allowed: 0, 1, 2") + sys.exit(1) + labels = read_subject_labels() + labels[args.login] = int(args.label) + write_subject_labels(labels) + changed.append("label") + + if not changed: + print("Nothing to change. Use --full-name, --permissions, and/or --label.") + sys.exit(0) + + if "full_name" in changed or "permissions" in changed: + write_users(users) + log_action(f"EDIT login={args.login} changed={','.join(changed)}") + print(f"User '{args.login}' updated: {', '.join(changed)}.") + + +def cmd_passwd(args: argparse.Namespace) -> None: + users = read_users() + user = find_user(users, args.login) + if not user: + print(f"User '{args.login}' not found.") + sys.exit(1) + + password = prompt_password() + user["password_hash"] = hash_password(password) + write_users(users) + log_action(f"PASSWD login={args.login}") + print(f"Password for '{args.login}' updated.") + + +def cmd_delete(args: argparse.Namespace) -> None: + users = read_users() + if not find_user(users, args.login): + print(f"User '{args.login}' not found.") + sys.exit(1) + + users = [u for u in users if u["login"] != args.login] + write_users(users) + log_action(f"DELETE login={args.login}") + print(f"User '{args.login}' deleted.") + + +def cmd_list(_args: argparse.Namespace) -> None: + users = read_users() + if not users: + print("No users.") + return + print(f"{'Login':<16} {'ID':<4} {'Perms':<6} Full Name") + print("-" * 52) + for u in users: + print(f"{u['login']:<16} {u['id']:<4} {u['permissions']:<6} {u['full_name']}") + + +def cmd_set_mode(args: argparse.Namespace) -> None: + require_root() + mode = args.mode.upper() + if mode not in ("BOTH", "DAC_ONLY", "MAC_ONLY"): + print(f"Invalid mode {args.mode!r}; allowed: BOTH, DAC_ONLY, MAC_ONLY") + sys.exit(1) + write_access_mode(mode) + log_action(f"SET_MODE mode={mode}") + print(f"Access mode set to {mode}.") + + +def cmd_show_mode(_args: argparse.Namespace) -> None: + require_root() + mode = read_access_mode() + print(f"Current access mode: {mode}") + + +def cmd_set_label(args: argparse.Namespace) -> None: + require_root() + if args.label not in VALID_LABELS: + print(f"Invalid label {args.label!r}; allowed: 0, 1, 2") + sys.exit(1) + path = args.path + if path.startswith("./"): + path = path[2:] + path = "/".join(p for p in path.split("/") if p) + labels = read_object_labels() + labels[path] = int(args.label) + write_object_labels(labels) + log_action(f"SET_LABEL path={path} label={args.label}") + print(f"Object label for '{path}' set to {args.label}.") + + +def main() -> None: + parser = argparse.ArgumentParser(description="User management utility for practice3") + sub = parser.add_subparsers(dest="command", required=True) + + p_add = sub.add_parser("add", help="Add a new user") + p_add.add_argument("login", help="Username (login)") + p_add.set_defaults(func=cmd_add) + + p_edit = sub.add_parser("edit", help="Edit an existing user") + p_edit.add_argument("login", help="Username to edit") + p_edit.add_argument("--full-name", dest="full_name", help="New full name") + p_edit.add_argument("--permissions", help="New permissions (e.g. rwd)") + p_edit.add_argument("--label", help="Security label (0, 1, 2) - root only") + p_edit.set_defaults(func=cmd_edit) + + p_passwd = sub.add_parser("passwd", help="Change user password") + p_passwd.add_argument("login", help="Username") + p_passwd.set_defaults(func=cmd_passwd) + + p_del = sub.add_parser("delete", help="Delete a user") + p_del.add_argument("login", help="Username to delete") + p_del.set_defaults(func=cmd_delete) + + p_list = sub.add_parser("list", help="List all users") + p_list.set_defaults(func=cmd_list) + + p_set_mode = sub.add_parser("set-mode", help="Set access mode (BOTH/DAC_ONLY/MAC_ONLY) - root only") + p_set_mode.add_argument("mode", help="BOTH, DAC_ONLY, or MAC_ONLY") + p_set_mode.set_defaults(func=cmd_set_mode) + + p_show_mode = sub.add_parser("show-mode", help="Show current access mode - root only") + p_show_mode.set_defaults(func=cmd_show_mode) + + p_set_label = sub.add_parser("set-label", help="Set object security label - root only") + p_set_label.add_argument("path", help="Path relative to confdata") + p_set_label.add_argument("label", help="0, 1, or 2") + p_set_label.set_defaults(func=cmd_set_label) + + args = parser.parse_args() + args.func(args) + + +if __name__ == "__main__": + main() diff --git a/report/img/lab3-acl.png b/report/img/lab3-acl.png new file mode 100644 index 0000000000000000000000000000000000000000..23025f2b78570b1a3b20ef55e32fd3ed89036c3a GIT binary patch literal 8187 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 literal 0 HcmV?d00001 diff --git a/report/img/lab3-confaccess.png b/report/img/lab3-confaccess.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a1ebde123067ac3cf2a637d92b3e696ece7605 GIT binary patch literal 48410 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 literal 0 HcmV?d00001 diff --git a/report/img/lab3-setup.png b/report/img/lab3-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..4356acb54acca7bc1733ffce3c7e9327a588aacc GIT binary patch literal 69464 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 BcU=Gg literal 0 HcmV?d00001 diff --git a/report/img/lab3-usermgr-mode.png b/report/img/lab3-usermgr-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe248c6ea9e2a505ea3744fc7052c8e34e33d62 GIT binary patch literal 39754 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 YAL7?auXJ}@{r~^~07*qoM6N<$f`QnsLjV8( literal 0 HcmV?d00001 diff --git a/report/report.tex b/report/report.tex index 275b386..673063e 100755 --- a/report/report.tex +++ b/report/report.tex @@ -176,6 +176,7 @@ \begin{enumerate} \item Практическая работа №1. Анализ уязвимостей программного обеспечения. Данная практическая работа посвящена анализу уязвимостей программного обеспечения с использованием Банка данных угроз безопасности информации ФСТЭК России~\cite{fstec-bdu}. В ходе выполнения работы предусмотрено изучение структуры разделов «Угрозы» и «Уязвимости», а также поиск уязвимостей по заданным критериям. Особое внимание уделяется выявлению уязвимостей, соответствующих используемым версиям операционных систем личных устройств, и рассмотрению возможных мер по их устранению. \item Практическая работа №2. Разработка и исследование системы аутентификации и авторизации. Данная практическая работа посвящена разработке системы доступа пользователей к конфиденциальным данным и исследованию стойкости паролей к атаке методом грубой силы. В ходе выполнения работы реализованы утилита управления пользователями, утилита доступа к конфиденциальным данным и программа перебора паролей, а также проведено экспериментальное исследование зависимости времени взлома от длины пароля. + \item Практическая работа №3. Реализация моделей дискреционного и мандатного управления доступом. Данная практическая работа посвящена расширению системы из работы №2 путём реализации моделей DAC (дискреционный доступ) и MAC (мандатный доступ) на основе модели Белла–Лападулы. \end{enumerate} \newpage @@ -549,6 +550,138 @@ N(n) = 52 \cdot 72^{n-1} Теоретический анализ показал, что количество итераций, необходимых для полного перебора паролей, экспоненциально возрастает с увеличением их длины. Экспериментальное исследование позволило оценить реальную скорость перебора и подтвердить теоретические оценки. Полученные результаты демонстрируют, что использование паролей длиной 6 символов и более существенно затрудняет атаку методом грубой силы. +\newpage +\section{Реализация моделей дискреционного и мандатного управления доступом} + +\subsection{Актуальность темы} + +Модели управления доступом являются фундаментом систем защиты информации. Дискреционное управление (DAC) позволяет владельцам объектов гибко назначать права, однако не защищает от утечки информации через легитимных пользователей. Мандатное управление (MAC) на основе меток конфиденциальности обеспечивает принудительный контроль потока информации и применяется в системах с повышенными требованиями к защите. Изучение и практическая реализация обеих моделей в контексте дисциплины <<Защита информации>> позволяет закрепить понимание механизмов разграничения доступа и их ограничений. + +\subsection{Цели и задачи работы} + +Практическая работа №3 по дисциплине <<Защита информации>> посвящена реализации моделей дискреционного (DAC) и мандатного (MAC) управления доступом на базе системы, разработанной в практической работе №2. + +Цель работы: изучить особенности моделей DAC и MAC и реализовать их в рамках существующей системы аутентификации и авторизации. + +Задачи работы: +\begin{enumerate} + \item Изучить особенности дискреционного управления доступом и модель Харрисона–Руззо–Ульмана. + \item Разработать систему DAC с владением объектами, произвольным назначением прав и контролем на основе матрицы (списка) доступа. + \item Изучить особенности мандатного управления доступом и модель Белла–Лападулы. + \item Разработать систему MAC с метками безопасности для субъектов и объектов и свойствами модели Белла–Лападулы. +\end{enumerate} + +\subsection{Краткие сведения о DAC и MAC} + +\textbf{Дискреционное управление доступом (DAC)} основано на произвольном назначении прав владельцем объекта. Каждый объект имеет владельца, который может назначать и передавать права доступа другим субъектам. Контроль осуществляется на основе матрицы доступа или списков доступа (ACL), где для каждой пары (субъект, объект) указаны разрешённые операции. Модель Харрисона–Руззо–Ульмана формализует операции над матрицей доступа (создание/удаление субъектов и объектов, выдача и отзыв прав). + +\textbf{Мандатное управление доступом (MAC)} основано на метках конфиденциальности, назначаемых суперпользователем. Субъекты и объекты получают метки (уровни), и доступ определяется правилами, не зависящими от воли пользователей. Модель Белла–Лападулы реализует два основных свойства: <<нет чтения сверху>> (субъект может читать только объекты с уровнем не выше своего) и <<нет записи вниз>> (субъект может записывать только в объекты с уровнем не ниже своего), что предотвращает утечку информации с высокого уровня на низкий. + +\subsection{Требования к разрабатываемым системам} + +Структура каталогов аналогична работе №2, но с базовым путём \texttt{/usr/local/practice3} (переменная \texttt{PRACTICE3\_DIR}): + +\begin{itemize} + \item \texttt{etc/} — файлы настроек: \texttt{passwd}, \texttt{access\_mode}, \texttt{acl}, \texttt{subject\_labels}, \texttt{object\_labels}; + \item \texttt{confdata/} — конфиденциальные файлы; + \item \texttt{bin/} — утилиты; + \item \texttt{log/} — журналы. +\end{itemize} + +\textbf{DAC:} у каждого объекта — владелец; владелец может назначать права через команду \texttt{grant}; контроль по списку доступа (ACL) в формате \\ \texttt{путь:владелец:пользователь:права,...}. + +\textbf{MAC:} метки безопасности (0 — несекретно, 1 — ДСП, 2 — секретно) назначаются суперпользователем через \texttt{usermgr}; субъекты не могут менять метки; проверка по свойствам Белла–Лападулы. + +Режим проверки (BOTH — DAC и MAC, DAC\_ONLY, MAC\_ONLY) задаётся администратором через \texttt{usermgr set-mode} и доступен только root. + +\subsection{Описание реализации} + +Система построена на базе кода из практической работы №2. Утилита \texttt{usermgr} расширена админскими подкомандами (приложение 5): \texttt{set-mode BOTH|DAC\_ONLY|MAC\_ONLY} — установка режима проверки; \texttt{show-mode} — вывод текущего режима; \texttt{edit <логин> --label <0|1|2>} — установка метки субъекта; \texttt{set-label <путь> <0|1|2>} — установка метки объекта. Все админские команды требуют прав root. + +Утилита \texttt{confaccess} (приложение 6) полностью переработана. При \texttt{create} объект получает владельца (текущий пользователь) и запись в ACL; при операциях \texttt{read}, \texttt{append}, \texttt{remove} проверяется наличие соответствующего права в ACL. Команда \texttt{grant <пользователь> <путь> <права>} доступна только владельцу объекта. Для MAC при каждой операции проверяются свойства Белла–Лападулы: чтение разрешено при уровне субъекта $\ge$ уровня объекта; запись (append, create, remove) — при уровне субъекта $\le$ уровня объекта. Конфигурация путей вынесена в \texttt{config.py} (приложение 7). Скрипт \texttt{setup.sh} (приложение 8) создаёт структуру для practice3 и инициализирует файлы \texttt{access\_mode}, \texttt{acl}, \texttt{subject\_labels}, \texttt{object\_labels}. + +\subsection{Развёртывание и примеры работы} + +Установка выполняется аналогично работе №2: + +\begin{verbatim} +chmod +x setup.sh +PRACTICE3_DIR=/tmp/practice3 ./setup.sh +\end{verbatim} + +Результат выполнения скрипта представлен на рисунке~\ref{fig:lab3-setup}. + +\begin{figure}[h!] + \centering + % Заглушка: добавить скриншот img/lab3-setup.png + \includegraphics[width=0.6\linewidth]{img/lab3-setup.png} + \caption{Результат выполнения скрипта setup.sh (practice3)} + \label{fig:lab3-setup} +\end{figure} + +Примеры работы утилит: переключение режима \texttt{usermgr set-mode}, установка меток, работа \texttt{confaccess} с командами \texttt{create}, \texttt{grant}, \texttt{read} — на рисунках~\ref{fig:lab3-usermgr} и~\ref{fig:lab3-confaccess}. + +\begin{figure}[h!] + \centering + % Заглушка: добавить скриншот img/lab3-usermgr-mode.png + \includegraphics[width=0.6\linewidth]{img/lab3-usermgr-mode.png} + \caption{Работа usermgr: set-mode, show-mode, set-label} + \label{fig:lab3-usermgr} +\end{figure} + +\begin{figure}[h!] + \centering + % Заглушка: добавить скриншот img/lab3-confaccess.png + \includegraphics[width=0.6\linewidth]{img/lab3-confaccess.png} + \caption{Работа confaccess: create, grant, read} + \label{fig:lab3-confaccess} +\end{figure} + +\subsection{Примеры содержимого служебных файлов} + +\textbf{Список доступа (ACL) для DAC} — файл \texttt{etc/acl}. Каждая строка: \texttt{путь:владелец:пользователь1:права1,пользователь2:права2,...}. Пример: + +\begin{verbatim} +report.txt:alice:alice:rwd,bob:r +secret.txt:bob:bob:rwd +\end{verbatim} + +Владелец \texttt{report.txt} — alice (полные права rwd); bob имеет только чтение (r). + +\textbf{Метки конфиденциальности для MAC} — файлы \texttt{etc/subject\_labels} (субъекты) и \texttt{etc/object\_labels} (объекты). Формат: \texttt{идентификатор:уровень}, где уровень — 0 (несекретно), 1 (ДСП), 2 (секретно). Пример: + +\begin{verbatim} +# subject_labels +alice:1 +bob:0 + +# object_labels +report.txt:0 +secret.txt:2 +\end{verbatim} + +Примеры содержимого файлов ACL и меток представлены на рисунках~\ref{fig:lab3-acl} и~\ref{fig:lab3-labels}. + +\begin{figure}[h!] + \centering + % Заглушка: добавить скриншот img/lab3-acl.png + \includegraphics[width=0.7\linewidth]{img/lab3-acl.png} + \caption{Содержимое файла etc/acl (список доступа DAC)} + \label{fig:lab3-acl} +\end{figure} + +\begin{figure}[h!] + \centering + % Заглушка: добавить скриншот img/lab3-labels.png + \includegraphics[width=0.7\linewidth]{img/lab3-labels.png} + \caption{Содержимое файлов subject\_labels и object\_labels (метки MAC)} + \label{fig:lab3-labels} +\end{figure} + +\subsection{Выводы} + +В ходе практической работы №3 на базе системы из работы №2 реализованы модели дискреционного и мандатного управления доступом. DAC реализован через список доступа (ACL) с владельцами объектов и командой \texttt{grant} для произвольного назначения прав. MAC реализован на основе модели Белла–Лападулы с тремя уровнями меток и проверкой свойств <<нет чтения сверху>> и <<нет записи вниз>>. Режимы проверки (BOTH, DAC\_ONLY, MAC\_ONLY) позволяют гибко настраивать систему; переключение доступно только администратору (root). Полученный опыт демонстрирует принципиальные различия между дискреционным и мандатным подходами к управлению доступом и их практическую реализацию в информационных системах. + \newpage \section*{Заключение} @@ -558,6 +691,8 @@ N(n) = 52 \cdot 72^{n-1} В ходе выполнения практической работы №2 была разработана система доступа пользователей к конфиденциальным данным. Реализованы утилита управления пользователями с хэшированием паролей по алгоритму SHA-256, утилита доступа с разграничением прав и журналированием операций, а также программа взлома паролей методом грубой силы. Проведено исследование стойкости паролей в зависимости от их длины, результаты которого подтвердили экспоненциальную зависимость числа итераций от длины пароля и продемонстрировали практическую устойчивость достаточно длинных паролей к атаке полного перебора. +В ходе выполнения практической работы №3 на базе системы из работы №2 реализованы модели дискреционного (DAC) и мандатного (MAC) управления доступом. DAC реализован через список доступа с владельцами объектов и командой выдачи прав; MAC — на основе модели Белла–Лападулы с тремя уровнями меток конфиденциальности. Реализация демонстрирует принципиальные различия между подходами и их практическое применение. + \newpage \printbibliography[heading=bibintoc] @@ -583,4 +718,24 @@ N(n) = 52 \cdot 72^{n-1} \addcontentsline{toc}{section}{Приложение 4} \lstinputlisting{../lab2/setup.sh} +\newpage +\section*{Приложение 5} +\addcontentsline{toc}{section}{Приложение 5} +\lstinputlisting{../lab3/usermgr.py} + +\newpage +\section*{Приложение 6} +\addcontentsline{toc}{section}{Приложение 6} +\lstinputlisting{../lab3/confaccess.py} + +\newpage +\section*{Приложение 7} +\addcontentsline{toc}{section}{Приложение 7} +\lstinputlisting{../lab3/config.py} + +\newpage +\section*{Приложение 8} +\addcontentsline{toc}{section}{Приложение 8} +\lstinputlisting{../lab3/setup.sh} + \end{document} \ No newline at end of file