Это база для всего парка Mac. Создашь админа неправильно - и при включённом FileVault он не сможет разблокировать диск после перезагрузки. Раздашь sudo всем подряд - и любой troyan от имени пользователя получит root. Поэтому идём вглубь.
Типы учётных записей: кто есть кто
macOS различает несколько типов аккаунтов, и разница не косметическая - это разные наборы прав и членство в группах.
- Администратор - состоит в группе admin. Может ставить софт в /Applications, менять системные настройки, и (главное) использовать sudo для получения root. Это не root - это пользователь, которому разрешено повышать привилегии. Первый созданный при установке аккаунт - всегда администратор macOS.
- Стандартный - обычный пользователь mac без членства в admin. Работает в своём ~/, ставит софт в ~/Applications, но не лезет в систему. Это правильный режим для повседневной работы: даже сисадмину стоит сидеть под стандартным и повышаться по необходимости.
- Только общий доступ (Sharing Only) - аккаунт без домашней папки и без права локального входа. Существует только для доступа к общим файлам по сети (SMB/AFP). Логиниться в систему им нельзя.
- Гость - временный сеанс, при выходе всё стирается. По умолчанию выключен, при FileVault недоступен для полноценного входа.
- Управляемый родительским контролем (Screen Time) - это стандартный аккаунт, на который наложены ограничения через Экранное время: лимиты приложений, веб-контента, времени. Технически это не отдельный класс, а стандартный пользователь плюс профиль ограничений.

Служба каталогов, UID и чтение через dscl
Локальные пользователи mac живут не в /etc/passwd (он есть, но почти пустой и системный). Реальная база - это OpenDirectory, локальный узел которой обозначается точкой. Универсальный инструмент чтения и записи - dscl (Directory Service Command Line).
Посмотрим список реальных пользователей и их UID:
Код: Выделить всё
dscl . list /Users UniqueID
Код: Выделить всё
_spotlight 89
_windowserver 88
daemon 1
nobody -2
root 0
admin 501
maria 502
Код: Выделить всё
dscl . list /Users UniqueID | awk '$2 >= 500 {print $1, $2}'
Код: Выделить всё
dscl . read /Users/maria
Код: Выделить всё
dscl . read /Users/maria NFSHomeDirectory
NFSHomeDirectory: /Users/maria
Код: Выделить всё
dscacheutil -q user -a name maria
name: maria
password: ********
uid: 502
gid: 20
dir: /Users/maria
shell: /bin/zsh
gecos: Maria Petrova
Кто я и в каких группах прямо сейчас - классический id:
Код: Выделить всё
id maria
uid=502(maria) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),701(...),100(_lpoperator)
Создание и удаление: sysadminctl как правильный путь
Можно слепить пользователя руками через dscl (create записи, задать UID, NFSHomeDirectory, PrimaryGroupID, прописать пароль, создать папку). Это работает, но это ручная сборка двигателя - легко забыть атрибут и получить кривой аккаунт. С 10.13 Apple дала инструмент, который делает всё правильно: sysadminctl. Он создаёт запись, заводит домашнюю папку и - ключевое - умеет обращаться с Secure Token.
Создать стандартного пользователя:
Код: Выделить всё
sudo sysadminctl -addUser maria -fullName "Maria Petrova" -password - -home /Users/maria -shell /bin/zsh
Создать сразу администратора - добавь флаг -admin:
Код: Выделить всё
sudo sysadminctl -addUser bob -fullName "Bob Admin" -password - -admin
Код: Выделить всё
dscl . read /Groups/admin GroupMembership
GroupMembership: root admin bob
Код: Выделить всё
sudo sysadminctl -deleteUser maria
Сменить пароль другому пользователю (от имени админа):
Код: Выделить всё
sudo sysadminctl -resetPasswordFor maria -newPassword -
Вот место, где гибнет половина скриптов автоматизации. Secure Token - это криптографический ключ, привязанный к паролю пользователя, без которого аккаунт не может разблокировать том FileVault и не может включить сам FileVault. На Apple Silicon и современных Mac первый пользователь, заданный при первой настройке, получает Secure Token автоматически. А вот пользователь, созданный позже из терминала, по умолчанию его НЕ получает.
Сценарий грабли: ты по SSH создал админа bob через sysadminctl, выдал -admin, проверил - всё на месте. Но FileVault включён. После перезагрузки на экране FileVault bob отсутствует или его пароль не принимается. Потому что у bob нет Secure Token, а значит и нет права на разблокировку диска.
Проверить статус:
Код: Выделить всё
sysadminctl -secureTokenStatus maria
maria Secure token is DISABLED for user maria
Код: Выделить всё
sudo sysadminctl -secureTokenOn maria -password - -adminUser admin -adminPassword -
В управляемом парке за раздачу токенов отвечает Bootstrap Token: MDM передаёт его при настройке, и тогда новые пользователи получают Secure Token автоматически без ручного admin/password. Но на одиночной машине помни правило: создал пользователя на FileVault-диске - проверь -secureTokenStatus, иначе ты сделал аккаунт, который не сможет войти после перезагрузки.
Группы, sudo и /etc/sudoers
Три группы, которые надо знать:
- admin (GID 80) - администраторы. Членство здесь даёт право на sudo и на запись в системные области.
- staff (GID 20) - первичная группа обычных локальных пользователей.
- wheel (GID 0) - историческая Unix-группа суперпользователей. В macOS реально членом wheel является root; правом sudo по умолчанию управляет НЕ wheel, а admin - это важное отличие от классического Linux.
Код: Выделить всё
sudo visudo
Код: Выделить всё
%admin ALL = (ALL) ALL
Код: Выделить всё
sudo visudo -f /etc/sudoers.d/maria-backup
maria ALL = (root) NOPASSWD: /usr/bin/tmutil
Код: Выделить всё
sudo -l
sudo на mac можно научить принимать отпечаток. До Sonoma приходилось править /etc/pam.d/sudo, и обновление системы затирало правку. Начиная с Sonoma (и в Tahoe это штатный путь) есть отдельный файл /etc/pam.d/sudo_local, который НЕ перезаписывается при апдейтах. Apple даже кладёт готовый шаблон.
Создай конфиг из шаблона:
Код: Выделить всё
sudo cp /etc/pam.d/sudo_local.template /etc/pam.d/sudo_local
sudo nano /etc/pam.d/sudo_local
Код: Выделить всё
# sudo_local: local config file which survives system update
# and is included for sudo
auth sufficient pam_tid.so
Типичные грабли
- Создал админа из терминала на FileVault-машине и забыл про Secure Token - после перезагрузки он не разблокирует диск. Всегда проверяй sysadminctl -secureTokenStatus.
- Пишешь пароль прямым аргументом sysadminctl - он попадает в ps и shell history. Используй -password - для интерактива.
- Редактируешь /etc/sudoers без visudo, делаешь опечатку - sudo отказывается работать целиком. Только visudo, только /etc/sudoers.d/ для своих правил.
- Удалил пользователя без проверки /Users/Deleted Users/ - архивы профилей молча съедают диск.
- Путаешь wheel и admin: в macOS право sudo даёт членство в admin, не в wheel.
- dscacheutil показывает старые данные после изменения - забыл dscacheutil -flushcache.
- Выведи всех реальных пользователей: dscl . list /Users UniqueID | awk '$2 >= 500'.
- Создай стандартного пользователя test: sudo sysadminctl -addUser test -fullName "Test User" -password -.
- Проверь его группы (id test) и убедись, что admin там нет.
- Глянь статус токена: sysadminctl -secureTokenStatus test.
- Сделай его админом, добавив в группу: sudo dseditgroup -o edit -a test -t user admin. Перепроверь dscl . read /Groups/admin GroupMembership.
- Удали аккаунт: sudo sysadminctl -deleteUser test и проверь, что в /Users/Deleted Users/ появился (или не появился) архив.
- Включи sudo по Touch ID через /etc/pam.d/sudo_local и проверь.
- Чем определяется, что пользователь - администратор macOS: отдельным флагом или членством в группе? В какой именно?
- Почему созданный из терминала админ может не открыть FileVault после перезагрузки и как это исправить одной командой?
- Чем dscl отличается от dscacheutil и почему в скриптах для актуальных данных надёжнее dscl?
- Где правильно держать собственные правила sudo, чтобы они пережили обновление системы, и каким инструментом их редактировать?
Учётные записи mac - это не флажки в окне настроек, а записи OpenDirectory с UID, членством в группах и криптографией FileVault поверх. Тип аккаунта = членство в группе admin. Создавай и удаляй через sysadminctl, читай через dscl и dscacheutil, проверяй членство через id. На FileVault-машинах всегда держи в голове Secure Token - без него аккаунт не разблокирует диск. Право sudo на mac даёт группа admin, настраивается через visudo и /etc/sudoers.d/, а палец вместо пароля включается одной строкой в /etc/pam.d/sudo_local. Это фундамент, на котором стоит безопасность всей машины.