macos服务应以专用低权限用户运行:需创建隐藏无shell账户,通过launchdaemon plist的username指定,并用launchctl和ps验证进程归属与权限。
macos 系统服务默认以特定系统用户(如 _www、_devicemgr、_postfix 等)运行,而非当前登录用户。要安全、可控地配置某项服务以指定用户身份执行,需结合 launchd 机制、权限模型与账户隔离策略,避免直接使用 root 或滥用管理员权限。
明确服务归属用户并验证其权限范围
系统服务由 plist 配置文件定义,其执行身份由 UserName 或 GroupName 键控制。未显式指定时,多数守护进程以 root 运行;若需降权,必须提前创建专用低权限账户,并确保该账户仅拥有服务所需的最小路径访问和文件操作权。
- 用
launchctl list查看正在运行的服务列表,再通过launchctl print gui/$UID/<service></service>或launchctl print system/<service></service>检查其实际运行用户 - 查看对应 plist 文件(通常位于
/System/Library/LaunchDaemons/或/Library/LaunchDaemons/),确认是否存在<key>UserName</key><string>_myuser</string>设置 - 专用服务用户应为标准类型(非管理员),且主目录可设为
/var/empty或禁用交互登录(shell 设为/usr/bin/false)
创建专用服务账户并限制其能力
不建议复用已有用户或使用 root 执行业务服务。应新建一个无登录能力、无 shell、无 home 目录的专用账户,仅赋予服务所需资源的 ACL 权限。
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
- 终端中执行:
sudo sysadminctl -addUser _myservice -fullName "MyService Account" -password "" -home /var/empty -shell /usr/bin/false -hiddenUser - 禁用密码登录:
sudo dscl . -create /Users/_myservice AuthenticationAuthority ";DisabledUser;" - 设置服务所需目录的 ACL,例如:
sudo chmod -R +a "_myservice allow read,write,execute" /opt/myapp/data
在 LaunchDaemon plist 中指定用户并加固配置
自定义服务的 plist 必须置于 /Library/LaunchDaemons/,且需正确签名或满足 SIP 要求。关键字段包括 UserName、RunAtLoad、KeepAlive 和 StandardOutPath,同时应禁用不必要的权限继承。
- 在 plist 的
<dict></dict>内添加:<key>UserName</key><string>_myservice</string> - 避免设置
AbandonProcessGroup或EnableTransactions等高风险选项 - 日志输出路径需对 _myservice 可写,且不应指向用户主目录或系统敏感路径
- 加载前用
sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.myservice.plist替代旧式load命令,确保符合 macOS 12+ 的 launchd 安全模型
验证服务是否按预期用户运行并持续审计
配置完成后,不能仅依赖 plist 设置生效。需实时验证进程归属,并建立定期检查机制,防止因更新、重装或误操作导致权限回退。
- 启动服务后,运行
ps aux | grep myservice,确认 USER 列显示为_myservice,且 UID 与id -u _myservice一致 - 检查该进程能否访问预期资源(如读取配置、写入日志),同时无法执行
sudo、修改其他用户目录或调用systemsetup等管理命令 - 将
dscl . -list /Users UniqueID | grep "_myservice"加入日常巡检脚本,确保账户未被意外删除或改名










