""" Сводка по журналу действий ИИ-агентов. Рабочий документ службы информационной безопасности: сколько записей в журнале, цела ли цепочка, сколько действий разрешено и остановлено, каким хешем заканчивается цепочка. Сводка НЕ является актом, заключением о соответствии или иным официальным документом: целостность цепочки записей не равна соответствию системы требованиям регулятора. До версии 1.1.0 модуль печатал «акт соответствия» с номерами пунктов приказа, которых в приказе нет, и с местом для печати — это снято. """ from datetime import datetime, timezone from .ledger import IssLedger117 def generate_fstec_report( ledger: IssLedger117, organization: str = "Организация", system_name: str = "Контур ИИ и агентных систем", category_kii: str = "не указана", ) -> str: """ Формирует сводку по журналу в формате Markdown. Имя функции сохранено ради совместимости с версией 1.0.0. """ is_valid, count, status_msg = ledger.verify() stats = ledger.get_stats() now_str = datetime.now(timezone.utc).strftime("%d.%m.%Y %H:%M:%S UTC") valid_badge = "цепочка цела" if is_valid else "ЦЕПОЧКА НАРУШЕНА" agents_list = "\n".join([f" - `{agent}`" for agent in stats["agents"]]) or " - агентов в журнале нет" report = f"""# Сводка по журналу действий ИИ-агентов **Сформирована**: {now_str} **Система**: {system_name} **Организация**: {organization} **Категория значимости объекта (со слов организации)**: {category_kii} **Хеш-функция цепочки**: ГОСТ Р 34.11-2012, 256 бит (RFC 6986) > Рабочий документ службы информационной безопасности. Не является актом, заключением о > соответствии или иным официальным документом: целостность цепочки записей не равна > соответствию системы требованиям приказа ФСТЭК России № 117 (утверждён 11.04.2025, > действует с 01.03.2026). Вывод о применимости норм и о соответствии — за организацией > и органом по аттестации. --- ## 1. Целостность цепочки * **Итог пересчёта**: **{valid_badge}** * **Проверено записей**: **{count}** * **Сообщение проверки**: {status_msg} * **Хеш последней записи (голова цепочки)**: `{stats["latest_hash"]}` ### Что эта проверка доказывает и чего не доказывает Пересчёт цепочки обнаруживает изменение, удаление, вставку и перестановку отдельных записей. Полную перезапись журнала лицом, имеющим доступ к файлу, цепочка сама по себе не обнаруживает: такой журнал будет внутренне согласован. Чтобы исключить и это, значение головы цепочки закрепляют у стороны, не зависящей от владельца журнала, — меткой доверенного времени или записью во внешнем журнале, — и при проверке сличают с закреплённым. --- ## 2. Состав журнала | Показатель | Значение | Пояснение | | :--- | :--- | :--- | | Период записей | c `{stats["first_timestamp"] or "н/д"}` по `{stats["last_timestamp"] or "н/д"}` | время по часам узла, UTC | | Всего записей | **{stats["total_records"]}** | журнал содержит только то, что в него записано | | Разрешено (PERMIT) | **{stats["permits"]}** | записи с вердиктом PERMIT | | Остановлено (BLOCK) | **{stats["blocks"]}** | записи с вердиктом BLOCK | | Наблюдение (AUDIT) | **{stats["audits"]}** | записи с вердиктом AUDIT | ### Агенты в журнале {agents_list} --- ## 3. Как перепроверить без доверия к составителю 1. Скопируйте файл журнала `{ledger.filepath}` на отдельную машину; доступ в сеть не нужен. 2. Запустите однофайловый проверщик (ему нужен только Python 3): ```bash python iss_verifier.py {ledger.filepath} ``` 3. Сличите хеш последней записи с приведённым выше: `{stats["latest_hash"]}` --- Составил: ____________________ / ____________________ / """ return report