ARMlock

PAM-аутентификация для Linux: пароли (shadow / argon2id / bcrypt) и TOTP в любых комбинациях. Управление локально или централизованная синхронизация с удалённого сервера. Один бинарь, несколько ролей.

Быстрая установка

На свежем Linux-сервере (требуются curl или wget и права root):

curl -fsSL https://armlock.geekchain.ru/install.sh | bash

Скрипт определит архитектуру (amd64 / arm64), скачает последний production-релиз, проверит SHA-256 и положит бинарь в /usr/local/bin/armlock. Дальше — sudo armlock install и sudo armlock pam install.

Параметры install.sh
# Конкретная версия (канал определяется по префиксу v / t)
curl -fsSL https://armlock.geekchain.ru/install.sh | bash -s -- v1.2.3
curl -fsSL https://armlock.geekchain.ru/install.sh | bash -s -- t0.0.3

# Принудительный канал
curl -fsSL https://armlock.geekchain.ru/install.sh | bash -s -- test

# Поставить в свою директорию (без sudo)
curl -fsSL https://armlock.geekchain.ru/install.sh | bash -s -- --bin-dir ~/.local/bin

# Использовать собственное зеркало
ARMLOCK_INSTALL_BASE_URL=https://my-mirror.example.com/releases \
    curl -fsSL https://armlock.geekchain.ru/install.sh | bash
Установка вручную (без pipe-to-shell)

Загружаем актуальные ссылки на бинарь…

Последние релизы

Загружаем манифест…

Команды

armlock install — инициализация /etc/armlock/
sudo armlock install              # идемпотентно
sudo armlock install --force      # перезаписать armlock.conf

Создаёт /etc/armlock/ (0755), /etc/armlock/users/ (0700) и шаблон /etc/armlock/armlock.conf (0600). Запускать первой командой после установки бинаря.

armlock cli — управление конфигами пользователей
armlock cli user add <name>
armlock cli user list
armlock cli user show <name> [--redact]
armlock cli user delete <name>

armlock cli factor add <name> password --source shadow
armlock cli factor add <name> password --source hash [--algo argon2id|bcrypt] [--password-stdin]
armlock cli factor add <name> totp [--digits 6|8] [--period 30] [--issuer armlock]
armlock cli factor remove <name> <password|totp>

armlock cli policy require <name> <factor> [<factor>...]
armlock cli policy show <name>

armlock cli password-hash [--password-stdin] [--update-conf]

Все операции пишут JSON-файлы в /etc/armlock/users/ атомарно (через temp + rename). Запись идёт через 0600 root:root — секреты внутри.

armlock pam — установка/обновление модуля pam_armlock.so
sudo armlock pam install [--yes]                   # первая установка
sudo armlock pam update  [--check]                 # обновление на месте
armlock pam version                                # версия из .so (byte-scan)

Замена работающего модуля безопасна: ядро держит старый inode по открытым дескрипторам в sshd/login, новые auth-сессии подхватывают новый файл — перезапуск служб не нужен.

armlock update — самообновление бинаря
armlock update --check                     # 0=актуально, 1=есть обновление, 2=ошибка
sudo armlock update --yes                  # автоприменение без подтверждения
sudo armlock update --version v1.2.3       # откат или фиксация версии
sudo armlock update --channel test         # принудительно test-канал

Канал определяется автоматически по префиксу версии (v* → production, t* → test). Полностью отключить самообновление: ARMLOCK_NO_SELF_UPDATE=1. Заменить URL релиз-сервера: ARMLOCK_UPDATE_BASE_URL или update.base_url в armlock.conf.

armlock client · armlock console — в разработке

client: фоновый демон, синхронизирует /etc/armlock/users/*.json с удалённого сервера через WebSocket (с longpoll-фолбэком). Запускается через systemd.

console: локальный веб-интерфейс администратора (127.0.0.1 по умолчанию). Настройки — секция [console] в armlock.conf: порт, TLS, логин/пароль админа. При включённом TLS без указания путей сертификата автоматически генерируется self-signed в /etc/armlock/console/.

Примеры пользователей

Четыре характерных сценария. Каждый блок — последовательность команд, которая создаёт юзера эквивалентного фикстуре в репозитории (docker/users/<name>.json). Запускать от root.

mike — пароль через /etc/shadow (классическая системная аутентификация)
# Юзер должен существовать в системе и иметь пароль.
# В armlock делаем factor=password/source=shadow и единственный фактор в политике.
sudo armlock cli user add mike
sudo armlock cli factor add mike password --source shadow
sudo armlock cli policy require mike password

На bookworm chpasswd по умолчанию использует yescrypt ($y$), а наша библиотека crypt поддерживает только $1$/$5$/$6$. Для shadow-юзеров задавайте пароль с явной схемой:

sudo useradd -m mike
echo 'mike:password111' | sudo chpasswd -c SHA512
alice — хэш пароля прямо в конфиге (argon2id)
# Системный аккаунт alice не нужен — armlock хранит хэш в JSON.
sudo armlock cli user add alice
sudo armlock cli factor add alice password --source hash --algo argon2id
# (приглашение Password / Confirm — введите пароль alicepass)
sudo armlock cli policy require alice password

Альтернатива — без интерактивного ввода (для автоматизации):

echo 'alicepass' | sudo armlock cli factor add alice password \
    --source hash --algo argon2id --password-stdin

Соль argon2id генерируется случайно при каждом запуске, в репозиторной фикстуре docker/users/alice.json зафиксирован детерминированный PHC-хэш (m=4096, t=3, p=4) для стабильных тестов.

bob — shadow-пароль + TOTP вторым фактором
sudo useradd -m bob
echo 'bob:bobpass' | sudo chpasswd -c SHA512

sudo armlock cli user add bob
sudo armlock cli factor add bob password --source shadow
sudo armlock cli factor add bob totp --secret JBSWY3DPEHPK3PXP
sudo armlock cli policy require bob password totp

Если опустить --secret, armlock сгенерирует случайный base32-секрет, распечатает otpauth:// URI и нарисует ASCII-QR прямо в терминале для добавления в Google Authenticator / Authy.

carol — только TOTP, без пароля (single-factor possession)
sudo armlock cli user add carol
sudo armlock cli factor add carol totp --secret ORSXG5BNORSXG5BNORSXG5BN
sudo armlock cli policy require carol totp

В policy.require только totp — пароль вообще не запрашивается. PAM-модуль сразу зовёт TOTP-промпт. Это single-factor possession (что-то, чем владеешь — устройство с секретом), не 2FA. Уместно для kiosks, временного доступа, hardware-key-only логинов.

Как это устроено

  1. Конфиг каждого юзера лежит в /etc/armlock/users/<name>.json и описывает факторы (password / totp) и политику: какие факторы должны пройти и в каком порядке.
  2. PAM-модуль pam_armlock.so при вызове из sshd / login / sudo читает этот JSON, идёт по policy.require и для каждого фактора запрашивает ввод (Password: / TOTP code:), проверяя через нужный backend.
  3. Один бинарь armlock — все офлайн-роли: cli для управления, pam для модуля, update для самообновления. Будущие client (синк с remote) и console (веб-админка) — там же.
  4. Релизы публикуются по тегам: v* идут в канал production, t* — в test. Карточки выше отображают актуальное состояние обоих каналов из releases.json.