Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/emn4tor/seal
Инструменты шифрования/дешифрованияКриптографияКонфиденциальность
GitHubemn4tor/seal

Seal

Одноранговый чат со сквозным шифрованием. Без входящих. Нет аккаунта для восстановления. Никто не подслушивает — даже мы.

Репозиторий
9442 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
<div align="center">
  <a href="https://github.com/Emn4tor/Seal">
    <img src="https://assets.kitploit.com/production/public/readmes/49626/0d175b4ba9dd08a1b35a94415f701b49b89aac52b6f5c25731822653ea386e6f.png" width="112" height="112" alt="Логотип Seal" />
  </a>

  <h1>Seal</h1>

  <p><em>Одноранговый чат со сквозным шифрованием.<br />Никакого инбокса. Никакого аккаунта для восстановления. Никто не подслушивает — даже мы.</em></p>

  <p><a href="https://github.com/Emn4tor/Seal">github.com/Emn4tor/Seal</a></p>

  <p>
    <img src="https://img.shields.io/badge/rust-1.97+-c9a15c?style=flat-square&amp;labelColor=0e1116&amp;logo=rust&amp;logoColor=e8e3d8" alt="Rust: 1.97+" />
    <img src="https://img.shields.io/badge/tauri-2.11.5-4f8f86?style=flat-square&amp;labelColor=0e1116&amp;logo=tauri&amp;logoColor=e8e3d8" alt="Tauri: 2.11.5" />
    <img src="https://img.shields.io/badge/react-19.2-c9a15c?style=flat-square&amp;labelColor=0e1116&amp;logo=react&amp;logoColor=e8e3d8" alt="React: 19.2" />
    <img src="https://img.shields.io/badge/platforms-macOS%20%7C%20Linux%20%7C%20Windows-4f8f86?style=flat-square&amp;labelColor=0e1116" alt="Платформы: macOS, Linux, Windows" />
    <img src="https://img.shields.io/badge/encryption-Olm%20/%20Megolm-c9a15c?style=flat-square&amp;labelColor=0e1116" alt="Шифрование: Olm / Megolm" />
    <img src="https://img.shields.io/badge/server%20storage-none-4f8f86?style=flat-square&amp;labelColor=0e1116" alt="Хранение на сервере: нет" />
  </p>
  <p>
    <a href="https://github.com/Emn4tor/Seal/stargazers"><img src="https://img.shields.io/github/stars/Emn4tor/Seal?style=flat-square&amp;color=c9a15c&amp;labelColor=0e1116" alt="Звёзды GitHub" /></a>
    <a href="https://github.com/Emn4tor/Seal/network/members"><img src="https://img.shields.io/github/forks/Emn4tor/Seal?style=flat-square&amp;color=4f8f86&amp;labelColor=0e1116" alt="Форки GitHub" /></a>
    <a href="https://github.com/Emn4tor/Seal/issues"><img src="https://img.shields.io/github/issues/Emn4tor/Seal?style=flat-square&amp;color=c9a15c&amp;labelColor=0e1116" alt="Проблемы GitHub" /></a>
    <a href="https://github.com/Emn4tor/Seal/commits"><img src="https://img.shields.io/github/last-commit/Emn4tor/Seal?style=flat-square&amp;color=4f8f86&amp;labelColor=0e1116" alt="Последний коммит GitHub" /></a>
    <a href="https://github.com/Emn4tor/Seal"><img src="https://img.shields.io/github/repo-size/Emn4tor/Seal?style=flat-square&amp;color=c9a15c&amp;labelColor=0e1116" alt="Размер репозитория GitHub" /></a>
  </p>
  <p>
    <a href="https://github.com/Emn4tor/Seal/graphs/contributors"><img src="https://img.shields.io/github/contributors/Emn4tor/Seal?style=for-the-badge&amp;color=c9a15c&amp;labelColor=0e1116" alt="Контрибьюторы" /></a>
    <a href="https://github.com/Emn4tor/Seal/commits"><img src="https://img.shields.io/github/commit-activity/t/Emn4tor/Seal?style=for-the-badge&amp;color=4f8f86&amp;labelColor=0e1116" alt="Всего коммитов" /></a>
  </p>
</div>

Сообщения передаются напрямую между пирами через libp2p и шифруются
протоколами Olm/Megolm в стиле Signal (через
[vodozemac](https://github.com/matrix-org/vodozemac)) ещё до того, как покинут
ваше устройство. Единственный задействованный сервер — это небольшой каталог,
который помогает пирам находить актуальные адреса друг друга. Он никогда не
видит содержимое сообщений, и его можно удалить одной командой.

Смотрите [`docs/THREAT_MODEL.md`](https://github.com/emn4tor/seal/blob/main/docs/THREAT_MODEL.md) и
[`docs/SECURITY.md`](https://github.com/emn4tor/seal/blob/main/docs/SECURITY.md) — что именно защищено и как.

## Содержание

- [Скриншоты](#screenshots)
- [Возможности](#features)
- [Как это работает](#how-it-works)
- [Структура проекта](#project-layout)
- [1. Предварительные требования](#1-prerequisites)
- [2. Сборка](#2-building)
- [3. Запуск в режиме разработки](#3-running-it-in-dev-mode)
- [4. Тестирование](#4-testing)
- [5. Настройка бэкенда (сервера-каталога)](#5-backend-directory-server-setup)
- [6. Использование приложения](#6-using-the-app)

---

## Скриншоты

<div align="center">

**Первый запуск** — выберите имя; больше ничего настраивать не нужно.

<img src="https://assets.kitploit.com/production/public/readmes/49626/c45dd83972e6760574f3a07186a511aa3c9b5d544d22aa7f4dd370d38038eb4d.png" width="820" alt="Экран первого запуска Seal: описание модели шифрования рядом с формой отображаемого имени и переключателем автозапуска при входе в систему" />

<br /><br />

**Переписки** — групповой сайдбар, список контактов и панель чата со сквозным шифрованием.

<img src="https://assets.kitploit.com/production/public/readmes/49626/fd29b87e22a02fc9a44097d9dc62b9ef74b73fd53d4762bc54ebb165b4ef84e8.png" width="820" alt="Разговор в личных сообщениях в Seal: показаны групповой сайдбар, список контактов и панель чата со сквозным шифрованием" />

<br /><br />

**Настройки** — чувствительность микрофона, push-to-talk, автозапуск при входе в систему, доступность сети.

<img src="https://assets.kitploit.com/production/public/readmes/49626/425c46d395741ed088ac2c50c178e1e41eeb457487cfbc2c0fa6ab61515f648f.png" width="820" alt="Панель настроек Seal: чувствительность микрофона, push-to-talk, автозапуск при входе в систему и доступность сети" />

</div>

## Возможности

- **Сквозное шифрование всегда** — каждое сообщение запечатывается с помощью Olm (1:1)
  или Megolm (группы) ещё до того, как покинет ваше устройство, по
  схеме в стиле Double Ratchet от [vodozemac](https://github.com/matrix-org/vodozemac):
  у каждого сообщения свой ключ.
- **Никакого инбокса, никогда** — сообщения передаются по прямому одноранговому
  соединению ([libp2p](https://libp2p.io): QUIC/TCP + Noise, с ретрансляцией и
  hole punching для NAT). Если получатель офлайн, сообщение ждёт
  локально и повторяет попытки — оно никогда не попадает в очередь
  на чужой инфраструктуре.
- **Каталог, а не база данных** — единственный задействованный сервер
  (`crates/directory-server`) сопоставляет идентификатор пользователя с текущим сетевым адресом
  и ничем больше. Он структурно не способен прочитать содержимое сообщений:
  его `Cargo.toml` даже не зависит от крейтов, которые умеют это делать.
- **Несколько аккаунтов на одном устройстве** — полностью раздельные идентичности
  (ключи, контакты, сообщения), между которыми можно переключаться без перезапуска.
- **Группы с настоящим изменением состава участников** — текстовые и голосовые
  каналы в каждой группе; при исключении участника ключ группы ротируется,
  чтобы он не мог прочитать ничего из отправленного после этого.
- **Голосовая связь из коробки** — push-to-talk по глобальной горячей клавише
  (работает из любого приложения, не только из Seal), настраиваемая
  чувствительность микрофона и опциональный модулятор голоса.
- **Вложения без метаданных** — данные EXIF (GPS-координаты, сведения
  о камере/устройстве) удаляются из изображений до отправки; включено
  по умолчанию.
- **Настоящая кнопка экстренного стирания** — «Настройки» → «Данные и конфиденциальность» мгновенно
  и безвозвратно удаляют все ключи, контакты и сообщения на этом устройстве,
  никак не влияя на тех, с кем вы общались.
- **Автозапуск при входе в систему, если хотите** — включён по умолчанию,
  отключается одним переключателем в настройках.
- **Одна кодовая база, три платформы** — нативные окна на macOS, Windows
  и Linux через [Tauri](https://tauri.app).

## Как это работает

В этом приложении два вида идентичности, и они намеренно разделены:

- **Ваша чат-идентичность** — это пара ключей Ed25519/Curve25519, созданная локально
  с помощью [vodozemac](https://github.com/matrix-org/vodozemac) при первом
  открытии приложения (`identity::Identity`). Ваш публичный «user ID» — это просто
  отпечаток этого ключа (`wire_proto::user_id_from_ed25519`). Никакой сервер
  не может выдать или отозвать его, потому что ни один сервер не участвует в его создании.
- **Ваша сетевая идентичность** — это отдельная пара ключей libp2p (`PeerId`),
  используемая только на транспортном уровне. Она может меняться между
  перезапусками, никак не влияя на вашу чат-идентичность; связывает
  их только запись присутствия, подписанная вами самостоятельно.

Найти собеседника и фактически поговорить с ним — это два разных шага:```
                     ┌────────────────────────┐
                     │     directory server    │
                     │  (axum + one SQLite     │
                     │   file: users,          │
                     │   presence, group       │
                     │   rosters. Never        │
                     │   message content.)     │
                     └─────────┬───────────────┘
             1. "where is bob  │  2. "here's my current
                 right now?"   │      address" (signed,
                                │      expires in minutes)
                     ┌─────────┴───────────────┐
                     ▼                         ▼
                 ┌───────┐   3. direct libp2p   ┌───────┐
                 │ alice │◄──── connection ────►│  bob  │
                 └───────┘   (Noise + Olm/      └───────┘
                              Megolm encrypted)
```
1. Алиса ищет Боба в каталоге по его user ID. Это возвращает его
   открытые ключи и последний объявленный сетевой адрес. Это всё,
   что хранит каталог: открытые ключи, отображаемые имена, списки
   членства в группах и кратковременные объявления адресов
   (`crates/directory-server`).
2. Алиса напрямую связывается с Бобом через libp2p (QUIC или TCP+Noise, с relay +
   hole-punching для пиров за NAT; см. `crates/net`). Каталог с этого момента
   полностью исключён из процесса.
3. Сообщение шифруется с помощью **Olm** для личного чата 1:1 или
   **Megolm** для группового (`crates/crypto-session`), по схеме в стиле Double-Ratchet,
   где каждое сообщение получает собственный ключ, прежде чем оно вообще
   попадает в это libp2p-соединение. Серверного почтового ящика нет: если Боб
   офлайн, сообщение ожидает локально и повторяется, а не хранится в чьей-либо
   инфраструктуре.

Всё вышеперечисленное координируется `AppService` из `crates/core` — именно в него
вызывает Rust-бэкенд приложения Tauri (`apps/desktop/src-tauri`);
интерфейс никогда не взаимодействует с сетью напрямую.

## Структура проекта```
crates/
  wire-proto        shared signed-request types for the directory API
  identity          vodozemac identity, OS-keychain key management
  storage           local encrypted store (contacts, messages, groups)
  net               libp2p transport + directory HTTP client
  crypto-session    Olm (1:1) / Megolm (group) session management
  core              orchestrates the above into `AppService` / `ChatNode`
  directory-server  the one server component (axum + SQLite)
apps/desktop         the Tauri + React app
scripts/             build + backend-deployment scripts (§2, §5)
```
---

## 1. Предварительные требования

Вам понадобятся **Rust** и **Node.js** на каждой платформе, а также специфичный для платформы
инструментарий, необходимый Tauri для создания нативного окна. `storage` и `directory-server`
также компилируют SQLite из исходного кода в составе бандла, для чего нужен обычный C-компилятор (нигде
в этом проекте не требуется OpenSSL или другая нативная криптографическая библиотека).

Общее для всех платформ:

- [Rust](https://rustup.rs) (стабильный канал; устанавливайте через `rustup`, а не через пакетный менеджер вашей ОС)
- [Node.js](https://nodejs.org) 20+ и npm

<details>
<summary><strong>macOS</strong></summary>```sh
xcode-select --install
```
Вот и всё. Xcode Command Line Tools предоставляют как C-компилятор, так и
фреймворки, необходимые бэкенду Tauri для macOS (на основе WKWebView).

</details>

<details>
<summary><strong>Linux</strong></summary>

Установите C-компилятор, `pkg-config` и dev-пакеты WebKitGTK/AppIndicator,
с которыми линкуется бэкенд Tauri для Linux.

Debian/Ubuntu:```sh
sudo apt update
sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file \
  libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev pkg-config
```
Fedora:```sh
sudo dnf install webkit2gtk4.1-devel openssl-devel curl wget file \
  libappindicator-gtk3-devel librsvg2-devel pkgconf-pkg-config
sudo dnf group install "C Development Tools and Libraries"
```
Архитектура:```sh
sudo pacman -S --needed webkit2gtk-4.1 base-devel curl wget file openssl \
  appmenu-gtk-module libappindicator-gtk3 librsvg pkgconf
```
(Имена пакетов меняются между релизами Tauri: если сборка завершается ошибкой из-за
отсутствующего файла `.pc`, проверьте
[актуальные требования Tauri для Linux](https://v2.tauri.app/start/prerequisites/)
для вашего дистрибутива.)

</details>

<details>
<summary><strong>Windows</strong></summary>

1. Установите **Microsoft C++ Build Tools** (Visual Studio Installer →
   рабочая нагрузка «Разработка классических приложений на C++»), нужные как для нативной
   оболочки Tauri, так и для компиляции встроенного SQLite.
2. Установите тулчейн Rust **MSVC**: `rustup default stable-msvc`.
3. **WebView2**: уже присутствует в Windows 11 и в большинстве актуальных установок Windows
   10; если его нет, сборка Tauri предложит установить
   Evergreen runtime.

</details>

---

## 2. Сборка

Из корня репозитория:```sh
# Rust workspace (backend crates + the directory server)
cargo build --workspace --release

# Frontend + the actual desktop app bundle (installer/.app/.exe)
cd apps/desktop
npm install
npm run tauri build
```
`npm run tauri build` создаёт нативный установщик для платформы в
`target/release/bundle/` в корне репозитория (это рабочее пространство Cargo, поэтому все
крейты, включая приложение Tauri, используют один общий каталог верхнего уровня `target/`).
Кросс-компиляция (например, сборка установщика Windows на macOS) не
настроена: собирайте на каждой целевой платформе или используйте GitHub Actions workflow от Tauri,
если вам нужны релизы, собираемые в CI.

### Или используйте скрипты

`scripts/` содержит по одному скрипту сборки для каждой платформы/результата, каждый можно запускать независимо,
и каждый проверен на то, что действительно создаёт рабочий артефакт:

| Скрипт | Результат |
|---|---|
| `scripts/build-mac-dmg.sh` | установщик `.dmg` для macOS |
| `scripts/build-mac-app.sh` | Сырой пакет `.app` для macOS, без установщика |
| `scripts/build-linux.sh` | Linux `.AppImage` + `.deb` |
| `scripts/build-windows.ps1` | Windows `.msi` + `.exe` (NSIS) |

Каждый просто оборачивает `npm run tauri build --bundles <...>` с правильными флагами
и проверкой платформы; выполните команду напрямую сами, если нужна другая
комбинация бандлов (`npx tauri build --help` из `apps/desktop`).

`scripts/release.sh vX.Y.Z` поднимает версию везде, где это нужно,
и создаёт тег для коммита — см. [`docs/RELEASING.md`](https://github.com/emn4tor/seal/blob/main/docs/RELEASING.md). Работает на
macOS и Linux; не коммитит и не пушит.

### Встраивание собственной сети "Seal"

Экран выбора сервера (§3) всегда показывает три варианта: **Seal** (ваша
собственная официальная сеть), **Custom server** и небольшая
ссылка **Local test server** внизу. "Seal" отключена (затемнена, с надписью "В этой сборке ещё не
настроено") до тех пор, пока вы не встроите URL на этапе *сборки*:```sh
SEAL_DEFAULT_DIRECTORY_URL=https://directory.example.com npm run tauri build
```
Как только вы поднимете собственный сервер (§5) и направите на
него реальный домен, задайте это значение и пересоберите: каждая распространяемая вами копия с этого момента показывает
«Seal» как реальную выбираемую опцию с использованием этого URL, не затрагивая
никакой другой код. Оставьте это значение незаданным для обычных/dev-сборок: здесь нет официального
сервера, размещаемого этим репозиторием, поэтому «Seal» остаётся отключённой, и пользователи возвращаются к
пользовательскому серверу или локальному, вместо того чтобы приложение молча указывало на
домен-заполнитель, который на самом деле ничего не запускает.

---

## 3. Запуск в dev-режиме```sh
cd apps/desktop
npm install
npm run tauri dev
```
Это запускает dev-сервер Vite, компилирует Rust-бэкенд в debug-режиме и
открывает нативное окно с hot-reload на фронтенде. Первая сборка компилирует
всё дерево зависимостей и занимает несколько минут; последующие запуски быстрые.

### Выбор сервера (первый запуск)

При первом запуске Seal спрашивает, какой сервер каталога использовать, в этом
порядке:

- **Seal**: официальная сеть, если в этой сборке она встроена (см.
  §2). Недоступен, пока её нет; этот репозиторий не поставляется с указанием на
  домен-заглушку.

- **Пользовательский сервер**: любой, включая ваш собственный (§5).

- **Локальный тестовый сервер**: небольшая, намеренно ненавязчивая ссылка внизу.
  Запускает собственный **встроенный сервер** приложения (привязывается к
  `127.0.0.1:47100`/`47101`, данные — в каталоге данных приложения вашей ОС),
  подходит для опробования Seal или тестирования инстансов на одной машине, не для
  реального развёртывания. Если второй инстанс обнаруживает, что эти порты уже заняты, он просто
  использует сервер первого инстанса вместо запуска ещё одного,
  что и позволяет двум инстансам на одной машине найти друг друга. Именно он
  выбирается автоматически, если «Seal» не настроен и вы не
  выбрали ничего другого.

Выбор сохраняется (`server.json` рядом с остальными локальными данными приложения) и
молча используется при каждом последующем запуске; изменить его можно в Settings → Directory
server, и изменение вступит в силу при следующем запуске приложения, а не
будет пытаться переключить активное соединение на лету. Для скриптов/разработки
переменная окружения полностью пропускает запрос:```sh
P2P_CHAT_DIRECTORY_URL=https://directory.example.com npm run tauri dev
```
### Запуск двух экземпляров локально (чтобы реально протестировать обмен сообщениями)

Каждому экземпляру нужна своя идентичность. Seal поддерживает несколько аккаунтов нативно (Настройки → Аккаунты на этом устройстве), но для двух *отдельных процессов* на одной машине `P2P_CHAT_PROFILE` — более быстрый путь: он автоматически создаёт (при первом запуске) или автоматически возобновляет (при каждом последующем) аккаунт с этим именем, без интерактивного взаимодействия, полностью пропуская выбор аккаунта:```sh
# terminal 1
P2P_CHAT_PROFILE=alice npm run tauri dev

# terminal 2
P2P_CHAT_PROFILE=bob npm run tauri dev
```
Выбор сервера (`server.json`) и список учётных записей (`accounts.json`)
общие для всех процессов на одной машине, а не для отдельных профилей.
Первый запущенный экземпляр выбирает сервер, и каждый следующий профиль
(включая `bob`) молча использует его. Оба окна оказываются на одном
встроенном сервере каталогов, поэтому вы можете добавить друг друга в контакты по ID
и переписываться между ними.

Dev-серверу Vite нужен реальный фиксированный порт, на который будет указывать webview Tauri,
поэтому обычно одновременно может работать только один `npm run tauri dev` —
второй обнаружит, что порт 1420 уже занят, и сразу завершится.
`npm run tauri` на самом деле является небольшим враппером (`apps/desktop/scripts/tauri.mjs`),
который для каждого экземпляра после первого выбирает следующий свободный порт (1421, 1422, …)
и автоматически передаёт его, так что выполнение двух указанных выше команд
в двух терминалах просто работает; вам не нужно делать ничего по-другому. Он
меняет поведение только для `dev` — `npm run tauri build` и всё остальное
передаётся напрямую настоящему CLI.

### Тестирование на реальной сборке (не в dev-режиме)```sh
./scripts/run-two-mac-instances.sh          # profiles: alice, bob
./scripts/run-two-mac-instances.sh carol dave
```
Та же идея, что и выше, но запускает реально собранное приложение (результат `build-mac-app.sh` /
`build-mac-dmg.sh` или установленную копию в `/Applications`) дважды
с разными `P2P_CHAT_PROFILE` вместо `npm run tauri dev`, что ближе
к тому, что запускает реальный пользователь. Выводит их PID и способ остановки обоих.

### Отладка

- **Журналы Rust**: задайте `RUST_LOG` перед запуском, например:
  `RUST_LOG=debug npm run tauri dev` (или `RUST_LOG=p2p_core=debug,net=debug`
  для сужения области). Логируемые поля ограничены метаданными (идентификаторы
  пиров/групп/пользователей, типы ошибок); см. [`docs/SECURITY.md`](https://github.com/emn4tor/seal/blob/main/docs/SECURITY.md) о том, почему
  это можно безопасно оставлять подробным.
- **Фронтенд**: окно разработки — это настоящее webview; щелчок правой кнопкой мыши →
  «Проверить элемент» (или открыть инструменты разработчика) работает как в обычном браузере.
- **Бэкенд-крейты изолированно**: каждый крейт имеет собственный набор тестов, который можно
  запускать и итерировать, вообще не трогая UI; см. §4.
- **Автономный сервер каталогов** вместо встроенного: см. §5.

---

## 4. Тестирование```sh
# everything
cargo test --workspace

# one crate, e.g. the full backend-to-backend flow a Tauri command would trigger
cargo test -p p2p-core --test app_service

# lint + format check (what CI runs)
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings

# dependency vulnerability scan
cargo install cargo-audit --locked   # once
cargo audit

# frontend type-check + build
cd apps/desktop && npm run build
```
---

## 5. Настройка бэкенда (сервера каталогов)

Коротко о том, что это на самом деле, ведь легко вообразить что-то более сложное: один процесс axum, один файл SQLite, три вида записей (открытые ключи, кратковременные объявления о присутствии, составы групп), и все записи подписаны собственным ключом идентичности вызывающей стороны. Он никогда не находится на пути сообщения. См. [`docs/THREAT_MODEL.md`](https://github.com/emn4tor/seal/blob/main/docs/THREAT_MODEL.md), почему это верно структурно, а не просто по политике: `Cargo.toml` пакета `directory-server` даже не зависит от крейтов, которые умеют читать содержимое сообщений.

### Самый быстрый путь: скрипт настройки```sh
sudo ./scripts/setup-backend.sh
```
Интерактивный, только Linux + systemd (см. шапку скрипта, почему). Он
спрашивает, к какому семейству дистрибутивов вы относитесь (Debian/Ubuntu, Fedora/RHEL/Rocky/Alma,
Arch/Manjaro или openSUSE, с предварительно заполненным значением, угаданным из `/etc/os-release`,
так что обычно достаточно одного нажатия клавиши) и устанавливает зависимости сборки

---

[Read more](https://github.com/emn4tor/seal)
Скачать инструмент