61 lines
2.2 KiB
Markdown
61 lines
2.2 KiB
Markdown
# 05 — Пользователи и права (Users & Permissions)
|
|
|
|
## 1. Хранилище пользователей (SEG0)
|
|
|
|
```
|
|
PASSWD|uid|name|gid|home|hash
|
|
```
|
|
|
|
Пример:
|
|
|
|
```
|
|
PASSWD|0|root|0|/|-
|
|
PASSWD|100|captain|10|/home/captain|abc123hash
|
|
PASSWD|101|engineer|20|/home/engineer|def456hash
|
|
```
|
|
|
|
- `uid` / `gid` — положительные целые.
|
|
- `hash` — простой хеш пароля (не криптографический, только для игровых целей).
|
|
- Минимальный набор: `root` (uid=0) и хотя бы один пользователь.
|
|
|
|
## 2. Права доступа (mode bits)
|
|
|
|
```
|
|
rwxrwxrwx (9 бит) + suid/sgid (2 бита) = 12-бит octal
|
|
```
|
|
|
|
| Бит | Название | Проверка |
|
|
|---|---|---|
|
|
| `0400` | `r` owner | uid == file.uid |
|
|
| `0200` | `w` owner | uid == file.uid |
|
|
| `0100` | `x` owner | uid == file.uid |
|
|
| `0040..0010` | `rwx` group | gid == file.gid |
|
|
| `0004..0001` | `rwx` other | всегда |
|
|
| `4000` | suid | (не используется в командах ls/cat) |
|
|
| `2000` | sgid | (не используется) |
|
|
|
|
## 3. Проверка прав (MMC)
|
|
|
|
При каждом `STAT/READ/WRITE/LS/CHDIR` MMC:
|
|
|
|
1. Получает `uid/gid` из сессии CMC.
|
|
2. Загружает inode файла/каталога.
|
|
3. Вычисляет effective mode:
|
|
- если uid == 0 (root) — полный доступ;
|
|
- иначе комбинирует owner/group/other биты.
|
|
4. Возвращает `EACCES` при отказе.
|
|
|
|
## 4. Аутентификация
|
|
|
|
- Простейшая: `login name pass` сравнивает хеш.
|
|
- Сессия CMC хранит текущие `uid/gid`.
|
|
- `su` / `logout` — опциональные команды (см. `07-command-set.md`).
|
|
|
|
## 5. Экономия
|
|
|
|
- Таблица `PASSWD` ≤ 32 записи (чтобы влезала в SEG0).
|
|
- Хеш — короткая строка (8–16 символов).
|
|
- Права проверяются **только** при операциях ФС; CMC не дублирует проверки.
|
|
|
|
См. `06-execution-model.md` — как сессия хранит uid/gid и cwd.
|