223 lines
12 KiB
Go
223 lines
12 KiB
Go
package linuxmodules
|
||
|
||
import (
|
||
"fmt"
|
||
"rubric/utils"
|
||
)
|
||
|
||
var UsersModule = Module{
|
||
Key: "users",
|
||
Aliases: []string{"u", "perms", "sudo", "права"},
|
||
Title: "Пользователи, права и sudo",
|
||
Description: "Темы 17–20: 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`)
|
||
|
||
// ─── 17–18. su и sudo ─────────────────────────────────────────
|
||
utils.Section("17–18. 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()
|
||
}
|