rubric/modules/linuxmodules/linux_users.go
2026-07-21 14:52:55 +03:00

223 lines
12 KiB
Go
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package linuxmodules
import (
"fmt"
"rubric/utils"
)
var UsersModule = Module{
Key: "users",
Aliases: []string{"u", "perms", "sudo", "права"},
Title: "Пользователи, права и sudo",
Description: "Темы 1720: su, sudo, пользователи, группы, права на файлы",
Run: showUsers,
}
func showUsers() {
utils.Header("Linux — Пользователи, права и sudo")
// ─── 19. Пользователи и группы ───────────────────────────────
utils.Section("19. Пользователи и группы")
utils.Println("В Linux каждый файл принадлежит пользователю и группе.")
utils.Println("Каждый процесс запускается от имени определённого пользователя.")
fmt.Println()
utils.Println(utils.ColorBold + "Основные файлы пользователей:" + utils.ColorReset)
utils.Code(`/etc/passwd — список пользователей
/etc/shadow — хэши паролей (только root)
/etc/group — группы
# Формат /etc/passwd:
# имя:пароль:UID:GID:комментарий:home:shell
alice:x:1000:1000:Alice Smith:/home/alice:/bin/bash
root:x:0:0:root:/root:/bin/bash
# x — пароль в /etc/shadow
# UID 0 — root (суперпользователь)
# UID 1-999 — системные пользователи
# UID 1000+ — обычные пользователи
# Формат /etc/group:
# имя:пароль:GID:члены
sudo:x:27:alice,bob
docker:x:999:alice`)
utils.Println(utils.ColorBold + "Информация о пользователях:" + utils.ColorReset)
utils.Command("id", "UID, GID и группы текущего пользователя")
utils.Command("id alice", "информация о пользователе alice")
utils.Command("whoami", "имя текущего пользователя")
utils.Command("groups", "группы текущего пользователя")
utils.Command("getent passwd alice", "запись alice из /etc/passwd")
utils.Command("getent group docker", "участники группы docker")
fmt.Println()
utils.Println(utils.ColorBold + "Управление пользователями (root):" + utils.ColorReset)
utils.Command("useradd alice", "создать пользователя")
utils.Command("useradd -m -s /bin/bash -G sudo alice", "с домашней директорией, оболочкой и группой")
utils.Command("passwd alice", "установить пароль")
utils.Command("usermod -aG docker alice", "добавить alice в группу docker")
utils.Command("usermod -s /bin/zsh alice", "изменить оболочку")
utils.Command("usermod -L alice", "заблокировать учётную запись")
utils.Command("usermod -U alice", "разблокировать")
utils.Command("userdel alice", "удалить пользователя")
utils.Command("userdel -r alice", "удалить с домашней директорией")
fmt.Println()
utils.Println(utils.ColorBold + "Управление группами:" + utils.ColorReset)
utils.Command("groupadd developers", "создать группу")
utils.Command("groupdel developers", "удалить группу")
utils.Command("gpasswd -a alice developers", "добавить alice в группу")
utils.Command("gpasswd -d alice developers", "удалить alice из группы")
fmt.Println()
utils.Note("После добавления в группу пользователь должен перелогиниться. Или: newgrp groupname")
// ─── 20. Права на файлы ───────────────────────────────────────
utils.Section("20. Права на файлы")
utils.Println(utils.ColorBold + "Структура прав доступа:" + utils.ColorReset)
utils.Code(`ls -l file.txt
-rw-r--r-- 1 alice users 1024 Jan 15 10:00 file.txt
│└──────────┘
│ 9 бит прав
└ тип файла (- файл, d директория, l ссылка...)
Права разделены на 3 группы по 3 бита:
rwx rwx rwx
│ │ └── other (остальные пользователи)
│ └─────── group (группа владельца)
└─────────── owner (владелец)
r — read (чтение): 4
w — write (запись): 2
x — execute (выполнение): 1
- — нет права: 0
Пример: rw-r--r--
owner: rw- = 6 (4+2) — чтение и запись
group: r-- = 4 — только чтение
other: r-- = 4 — только чтение
Численно: 644`)
utils.Println(utils.ColorBold + "chmod — изменить права:" + utils.ColorReset)
utils.Code(`# Числовой (восьмеричный) способ:
chmod 644 file.txt # rw-r--r--
chmod 755 script.sh # rwxr-xr-x
chmod 600 private.key # rw-------
chmod 777 dir/ # rwxrwxrwx (небезопасно!)
chmod 750 script.sh # rwxr-x---
# Символьный способ:
chmod u+x script.sh # добавить execute владельцу
chmod g-w file.txt # убрать write у группы
chmod o-r secret.txt # убрать чтение у остальных
chmod a+r public.txt # добавить чтение всем (a = all)
chmod u+x,g-w file # несколько изменений
chmod go=r file.txt # установить группе и остальным только r
# Рекурсивно:
chmod -R 755 /var/www/html/`)
utils.Println(utils.ColorBold + "Типичные значения прав:" + utils.ColorReset)
utils.Code(`644 rw-r--r-- обычный файл (конфиги, тексты)
755 rwxr-xr-x исполняемый файл, директория
700 rwx------ личный скрипт/директория
600 rw------- приватный ключ, .env файл
640 rw-r----- конфиг с секретами (owner + group)
664 rw-rw-r-- файл для работы в группе
1777 rwxrwxrwt /tmp (sticky bit)`)
utils.Println(utils.ColorBold + "chown — изменить владельца:" + utils.ColorReset)
utils.Command("chown alice file.txt", "изменить владельца")
utils.Command("chown alice:users file.txt", "изменить владельца и группу")
utils.Command("chown :users file.txt", "изменить только группу")
utils.Command("chown -R alice:alice /home/alice/", "рекурсивно")
utils.Command("chgrp users file.txt", "изменить только группу")
fmt.Println()
utils.Println(utils.ColorBold + "Специальные биты:" + utils.ColorReset)
utils.Code(`SUID (Set User ID) — 4000:
Файл запускается с правами владельца файла, а не запускающего.
chmod u+s /usr/bin/passwd # или chmod 4755
ls -la: -rwsr-xr-x (s вместо x у владельца)
Пример: passwd изменяет /etc/shadow (root-файл)
SGID (Set Group ID) — 2000:
Файл: запускается от имени группы файла.
Директория: новые файлы наследуют группу директории.
chmod g+s /shared/ # или chmod 2755
ls -la: drwxrwsr-x
Sticky Bit — 1000:
Директория: файл может удалить только его владелец.
chmod +t /tmp/ # или chmod 1777
ls -la: drwxrwxrwt
Применение: /tmp, /var/tmp`)
utils.Println(utils.ColorBold + "umask — маска прав по умолчанию:" + utils.ColorReset)
utils.Code(`umask определяет права, которые НЕ назначаются новым файлам.
umask # показать текущую маску (обычно 0022)
umask 0022 # установить маску
# Как работает:
# Файлы создаются с 666, директории с 777.
# Umask 022 вычитается:
# 666 - 022 = 644 (файлы: rw-r--r--)
# 777 - 022 = 755 (директории: rwxr-xr-x)
# Umask 077:
# 666 - 077 = 600 (файлы: rw-------)
# 777 - 077 = 700 (директории: rwx------)
# Установить постоянно в ~/.bashrc:
umask 0027`)
// ─── 1718. su и sudo ─────────────────────────────────────────
utils.Section("1718. su, sudo и visudo")
utils.Println(utils.ColorBold + "su — Switch User:" + utils.ColorReset)
utils.Command("su -", "переключиться в root (login shell, нужен пароль root)")
utils.Command("su", "переключиться в root (без login shell)")
utils.Command("su - alice", "переключиться в alice")
utils.Command("su -c 'команда' alice", "выполнить команду от имени alice")
fmt.Println()
utils.Code(`Разница su vs su -:
su — только смена UID, переменные окружения остаются
su - — полноценный вход, загружается окружение пользователя
(PATH, HOME и т.д.)
Выйти из su: exit или Ctrl+D`)
utils.Println(utils.ColorBold + "sudo — выполнить как другой пользователь:" + utils.ColorReset)
utils.Command("sudo command", "выполнить команду как root")
utils.Command("sudo -u alice command", "выполнить от имени alice")
utils.Command("sudo -i", "интерактивная сессия root (= su -)")
utils.Command("sudo -s", "оболочка root с текущим окружением")
utils.Command("sudo -l", "показать разрешённые команды для текущего пользователя")
utils.Command("sudo -l -U alice", "разрешённые команды для alice")
utils.Command("sudo !!", "повторить последнюю команду с sudo")
fmt.Println()
utils.Code(`sudo кэширует аутентификацию на 15 минут (по умолчанию).
sudo -k — сбросить кэш (следующая команда потребует пароль)`)
utils.Println(utils.ColorBold + "visudo — редактирование /etc/sudoers:" + utils.ColorReset)
utils.Code(`# НИКОГДА не редактируйте /etc/sudoers напрямую!
# visudo проверяет синтаксис перед сохранением.
sudo visudo
# Формат правил:
# WHO WHERE=(AS_WHOM) WHAT
# Примеры /etc/sudoers:
root ALL=(ALL:ALL) ALL # root имеет все права
%sudo ALL=(ALL:ALL) ALL # группа sudo — все права
%wheel ALL=(ALL:ALL) ALL # RHEL: группа wheel
alice ALL=(ALL) ALL # alice — все команды
alice ALL=(ALL) NOPASSWD:ALL # без пароля (небезопасно!)
bob ALL=(root) /usr/bin/apt # только apt от root
netadmin ALL=(root) /usr/bin/nmtui # только nmtui
helpdesk ALL=(root) /usr/bin/passwd, !/usr/bin/passwd root # пароли кроме root
# Файлы из /etc/sudoers.d/ включаются автоматически.
# Лучше создавать файл там, а не редактировать sudoers:
sudo visudo -f /etc/sudoers.d/alice`)
utils.Footer()
}