Хочете, щоб дитячий обліковий запис у Linux працював лише у визначені години, а після "комендантської" — автоматично виходив із системи? Я зібрала для вас простий і безпечний сценарій: обмеження часу входу через PAM, жорстке завершення сесії по cron або systemd timer, базове обмеження застосунків через AppArmor і перевірка всього цього через журнали. Працюємо в термінал Linux, але людською мовою і без магії ✨

Покроково: готуємо обліковий запис і базові ліміти

1) Створіть окремого користувача і (за бажання) групу

Окремий користувач полегшує керування політиками. Тема напряму про користувачі та групи Linux — швидко зробимо все в одну хвилину:

# створити групу для дітей (необов'язково)
sudo groupadd kids || true

# створити користувача "kid" і додати до групи
sudo adduser kid
sudo usermod -aG kids kid

Порада: залиште собі окремий адмін-акаунт без жодних обмежень, щоб випадково не заблокувати доступ.

2) Обмежте години входу через PAM (pam_time)

Модуль PAM pam_time.so дозволяє задавати, коли користувач може ввійти (консоль/SSH/GUI). Додамо його до цільових сервісів і задамо графік у /etc/security/time.conf.

# Додайте рядок у відповідні файли PAM (приклади для Debian/Ubuntu)
# УВАГА: редагуйте з правами root і дуже обережно

# для локального входу в консолі
sudo sed -n 'p' /etc/pam.d/login | head -n 1 # просто подивитись, чи файл існує
sudo sh -c 'echo "account required pam_time.so" >> /etc/pam.d/login'

# для GDM (GNOME). Для інших менеджерів входу використайте свій файл (sddm, lightdm)
sudo sh -c 'echo "account required pam_time.so" >> /etc/pam.d/gdm-password'

# для SSH (якщо дозволяєте дитині SSH)
sudo sh -c 'echo "account required pam_time.so" >> /etc/pam.d/sshd'

# тепер задаємо графік у time.conf
sudo cp /etc/security/time.conf /etc/security/time.conf.bak
sudo sh -c 'cat >> /etc/security/time.conf' << 'EOF'
# Формат: services;ttys;users;times
# times: Mo Tu We Th Fr Sa Su, Wk (будні), Wd (вихідні), Al (усі дні)
# Приклад: дозволити користувачу "kid" в будні 08:00-20:00, у вихідні 10:00-18:00
login;*;kid;Wk0800-2000|Wd1000-1800
gdm-password;*;kid;Wk0800-2000|Wd1000-1800
sshd;*;kid;Wk0800-2000|Wd1000-1800
EOF

Жодні служби перезапускати не потрібно: PAM читається під час аутентифікації. Перевірити відмови/допуски можна в auth.log або через journalctl (нижче про log-файли Linux).

3) Перевірте на окремій консолі й не блокуйте себе

Відкрийте нову TTY (Ctrl+Alt+F3) і спробуйте ввійти під користувачем kid у дозволений та заборонений час. Тримайте відкриту сесію від адмін-акаунта на випадок, якщо щось піде не так 🙂

Автоматичне завершення сесії після "комендантської" (cron та systemd timers)

PAM контролює момент входу. Але якщо сесія була почата до завершення дозволеного інтервалу, її варто м’яко закривати після дедлайну. Тут допоможуть cron та systemd timers.

Варіант 1: простий cron-скрипт кожні 5 хвилин

# Створимо скрипт /usr/local/sbin/kid-curfew.sh
sudo tee /usr/local/sbin/kid-curfew.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
USER="kid"
HARD_CURFEW="20:30"   # час, коли сесія має бути завершена

now=$(date +%H:%M)
if [[ "$now" > "$HARD_CURFEW" ]]; then
  wall "Час завершувати роботу для $USER (30 сек)!"
  sleep 30
  # акуратно завершуємо всі сесії користувача kid
  if command -v loginctl >/dev/null; then
    loginctl terminate-user "$USER" || true
  fi
  # гарантійне завершення, якщо щось зависло
  pkill -KILL -u "$USER" || true
fi
EOF
sudo chmod +x /usr/local/sbin/kid-curfew.sh

# Додаємо в root-crontab періодичний запуск
sudo crontab -e
# ...і впишіть рядок:
# */5 * * * * /usr/local/sbin/kid-curfew.sh

Такий підхід дуже простий і надійний. Він корисний навіть на мінімальних системах без systemd.

Варіант 2: systemd timer на точний час

# Сервіс, що виконує скрипт
sudo tee /etc/systemd/system/kid-curfew.service >/dev/null <<'EOF'
[Unit]
Description=Terminate kid sessions at curfew

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/kid-curfew.sh
EOF

# Таймер, який тригерить сервіс щодня о 20:30
sudo tee /etc/systemd/system/kid-curfew.timer >/dev/null <<'EOF'
[Unit]
Description=Daily curfew for kid at 20:30

[Timer]
OnCalendar=*-*-* 20:30:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now kid-curfew.timer

# Перевірка
systemctl list-timers --all | grep kid-curfew

Systemd-таймери надійніші, переживають перезавантаження і краще логуються.

Додатково: обмеження застосунків через AppArmor (точково)

AppArmor ізолює застосунки за профілями. Він не знає про користувачів напряму, але ви можете запускати потрібні програми дитини під спеціальним профілем через aa-exec. Наприклад, обмежити браузеру запис у папку Завантаження.

# Встановити інструменти AppArmor (Debian/Ubuntu)
sudo apt update && sudo apt install apparmor apparmor-utils -y

# Створити профіль kid.firefox
sudo tee /etc/apparmor.d/kid.firefox >/dev/null <<'EOF'
#include <tunables/global>
profile kid.firefox flags=(attach_disconnected) {
  # базові дозволи
  #include <abstractions/base>
  #include <abstractions/user-tmp>

  # дозволити стандартні шляхи Firefox (підкоригуйте для вашого дистрибутива)
  /usr/lib/firefox/firefox ixr,
  owner @{HOME}/.mozilla/** rwk,

  # заборонити запис у Завантаження (тільки читання)
  deny owner @{HOME}/Downloads/** w,
}
EOF

# Ввімкнути профіль
sudo apparmor_parser -r -W /etc/apparmor.d/kid.firefox
sudo aa-status | grep kid.firefox || true

# Створити обгортку, щоб дитина запускала саме її
sudo tee /usr/local/bin/kid-firefox >/dev/null <<'EOF'
#!/usr/bin/env bash
exec aa-exec -p kid.firefox -- /usr/lib/firefox/firefox "$@"
EOF
sudo chmod +x /usr/local/bin/kid-firefox

Потім відредагуйте ярлик браузера для користувача kid, щоб він запускав /usr/local/bin/kid-firefox. Пам’ятайте: AppArmor-профілі входять у категорію права доступу Linux на рівні застосунків і потребують акуратного тестування.

GUI-спосіб: Timekpr-next

Якщо ви на Ubuntu/Debian і хочете все в один клік — спробуйте Timekpr-next. Це зручний графічний інструмент із календарем і лімітами по годинах дня.

# Ubuntu/Debian
sudo apt update
sudo apt install timekpr-next -y

# Fedora
sudo dnf install timekpr-next -y

Після встановлення відкрийте Timekpr-next, виберіть користувача kid, задайте ліміти на дні тижня і максимальний час за день. Це чудовий компаньйон до PAM та ваших таймерів.

Логування і моніторинг (де шукати підтвердження)

Щоб переконатися, що правила працюють, подивіться log-файли Linux через journalctl або /var/log/auth.log (Debian/Ubuntu).

# входи/відмови PAM (Debian/Ubuntu)
sudo grep pam_time /var/log/auth.log | tail -n 50

# через journalctl (усі дистрибутиви з systemd)
sudo journalctl -t sshd -t login -t gdm-password -g kid -n 100

# події користувача kid за UID
id -u kid
sudo journalctl _UID=$(id -u kid) -n 100 --no-pager

# історія спрацювань сервісу/таймера
sudo journalctl -u kid-curfew.service -n 50 --no-pager
sudo journalctl -u kid-curfew.timer -n 50 --no-pager

За потреби додайте окремі правила в rsyslog або logrotate, якщо логи ростуть швидко.

FAQ

  • Я боюся заблокувати себе. Як тестувати безпечно? Тримайте відкриту сесію під адмін-акаунтом, зміни в PAM вносьте поступово, тестуйте на іншій TTY, і завжди майте резервну копію файлів /etc/pam.d/* і /etc/security/time.conf.
  • Як застосувати обмеження до графічного входу? Для GNOME — файл /etc/pam.d/gdm-password, для KDE/SDDM — /etc/pam.d/sddm, для LightDM — /etc/pam.d/lightdm. Додайте там account required pam_time.so і задайте правила в time.conf.
  • Чи треба перезапускати служби після змін PAM? Ні, PAM читає конфіг під час нової аутентифікації. Для існуючих сесій діє cron/timer, який їх завершує після дедлайну.
  • Як зробити винятки на канікули? Найпростіше — тимчасово змінити рядок у time.conf (наприклад, замінити на Al0800-2100) або вимкнути таймер на час канікул: sudo systemctl stop kid-curfew.timer.
  • AppArmor впливає на всіх користувачів? Профілі за шляхами — так. Щоб застосовувати точково для дитини, запускайте програми через aa-exec -p профіль у її ярликах. Так ви не торкатиметеся інших користувачів.
  • Як заборонити перемикання на TTY? Це окрема тема: можна відключити getty для зайвих TTY або закрити їх PAM-правилами. Але зазвичай достатньо обмежити login у time.conf.

Порада від Kernelka

Завжди поєднуйте технічні обмеження з довірою і поясненнями. А ще — тримайте один "безпечний вихід": окремий адмін-акаунт без правил і LiveUSB на випадок помилок. Ви все зможете, я вірю у вас! 💪

Підсумок

  • Використайте PAM (pam_time.so) для дозволених вікон входу.
  • Додавайте жорсткий дедлайн через cron або cron та systemd timers.
  • За потреби запускайте окремі застосунки під профілями AppArmor.
  • Перевіряйте все через log-файли Linux і journalctl.
  • Працюйте через окремий адмін-акаунт і майте резервні копії конфігів.