# Linux Auth — Приложение аутентификации на Linux

Linux Auth — консольное приложение для аутентификации пользователей на Linux (Debian 12) с использованием локальной SQLite базы данных.  
Поддерживает:  

- Ввод логина и пароля с маской  
- Ограничение числа попыток входа  
- Сброс формы  
- Настраиваемые параметры через TOML  
- CLI утилиты для инициализации и добавления пользователей  

## Настройка окружения

1. Установить Go, gcc и SQLite dev на Debian 12:

```bash
bash scripts/config.sh
```

- Обновляет репозитории

- Устанавливает Go, GCC, SQLite

- Подготавливает зависимости Go проекта

## Сборка проекта

Скрипт ```build.sh``` собирает все бинарники:

- Основное приложение: authapp

- Инициализация пользователей: init_users

- CLI утилита для добавления пользователей: add_user

```
bash scripts/build.sh
```

- CGO включён для работы с go-sqlite3

- Создаёт release и debug версии (build/release/, build/debug/)

## Инициализация пользователей

Перед первым запуском необходимо создать начальных пользователей:

```
./build/release/init_users
```

- Создаёт пользователей из скрипта (admin, user1)

- Пароли автоматически хешируются через SHA-256

## Добавление новых пользователей

Используйте утилиту ```add_user``` для добавления пользователя без изменения кода:

```
./build/release/add_user -username USER -password PASS
```

Пример:
```
./build/release/add_user -username test -password 1234
```

## Запуск основного приложения
```
bash scripts/run.sh
```

- Запускает authapp с конфигурацией configs/config.toml

- Поддерживает ввод логина и пароля с маской

- Предусмотрена логика ограничения попыток и блокировки пользователя

- Позволяет сбросить форму и повторить попытку

Пример работы:
```
=== AuthApp ===
Логин: admin
Пароль: ******
Доступ разрешён. Добро пожаловать, admin!
```

## Конфигурация (configs/config.toml)

Пример:
```
[app]
name = "AuthApp"
max_login_attempts = 3
lock_timeout_sec = 300

[database]
type = "sqlite"
path = "./data/users.db"

[security]
password_hash = "sha256"

[ui]
show_welcome = true
```

- ```max_login_attempts``` — количество попыток перед блокировкой

- ```lock_timeout_sec``` — время блокировки пользователя (сек)

- ```password_hash``` — алгоритм хеширования пароля

- ```show_welcome``` — вывод приветствия при старте

## Особенности и назначение утилит

```authapp```: Основное приложение для аутентификации пользователей
```init_users```:Создаёт начальных пользователей в базе SQLite (admin, user1)
```add_user```: CLI утилита для добавления новых пользователей без перекомпиляции

## Проверка работы

Собрать проект: 
```
bash scripts/build.sh
```

Инициализировать пользователей: 
```
./build/release/init_users
```

Запустить приложение: 
```
bash scripts/run.sh
```

Протестировать успешный и неуспешный вход

Добавить нового пользователя: 
```
./build/release/add_user -username test -password 1234
```

## Запуск фаззинга

Сначала соберите приложение и инициализируйте тестовую базу (init_users).

Далее (для учебных целей фаззинг ограничен по времени - 5 минут):

1. Запуск нативного фаззера (проверка функции аутентификации, ограничение в 1 поток для нормальной работы БД SQLite)

1.1. cd myfuzz
 
1.2. ./run_fuzz.sh

1.3. ./view_fuzz_coverage.sh

2. Запуск AFL++ в режиме blackbox (фаззинг готового бинарника)

2.1. cd aflfuzz

2.2. ./install.sh

2.3. ./run_fuzz.sh

### Попытка скрестить gccgo и afl провалилась, оставлю для истории

3. Запуск AFL++ при компиляции через gccgo (установите AFL++ как в пункте 2.2. если ещё не сделали этого)

3.1. cd aflfuzz

3.2. ./install_gccgo_for_afl.sh

3.3. ./build_for_afl.sh

3.4. ./run_afl.sh

### Черновики для go-fuzz

На данный момент установка по официальной инструкции https://github.com/dvyukov/go-fuzz/blob/master/README.md не работает по причине golang.org/x/tools@v0.44.0 requires go >= 1.25.0 (running go 1.24.4)

4. Запуск go-fuzz

4.1. cd myfuzz

4.2. ./install_go-fuzz.sh (тут возникают проблемы, поэтому следующие шаги проверить не удалось + оказалось, что первая версия конфликтует с нативным фаззингом из пункта 1)

4.3. ./build_for_go-fuzz.sh

4.4. ./run_go-fuzz.sh

### Последняя попытка (тоже неудачная)

Утилита обещает поддержку 4 фаззеров, оказалось это просто обёртка для генерации тестов в 4 форматах и запуска фаззеров.
Из заявленных фаззеров удалось запустить только нативный (но я это и так сделал в пункте 1), а также сгенерировать тест для go-fuzz (но запустить не удалось, см. пункт 4 выше), для libfuzzer и afl даже тесты не сгенерировались (как я понял, тоже надо самому установить все нужные бинарники).

5. Запуск golang-fuzz

5.1. cd golang-fuzz

5.2. ./install_golang-fuzz.sh

5.3. ./run_golang-fuzz.sh
