Description and guidelines on creating system service agent accounts on Mac OS X (Tiger)

For any system service agent that you want to create in Mac OS X, you would do the following:

sudo dscl localhost -create /NetInfo/root/Groups/system_groupname
sudo dscl localhost -create /NetInfo/root/Groups/system_groupname gid group_id
sudo dscl localhost -create /NetInfo/root/Users/system_username
sudo dscl localhost -create /NetInfo/root/Users/system_username uid user_id
sudo dscl localhost -create /NetInfo/root/Users/system_username gid primary_group_id
sudo dscl localhost -create /NetInfo/root/Users/system_username shell user_shell
sudo dscl localhost -create /NetInfo/root/Users/system_username home user_home
sudo dscl localhost -create /NetInfo/root/Users/system_username passwd “∗”

Where,

system_groupname is a unique group name. By convention on Mac OS X, it is the same name as the username. Examples: tomcat, postfix, amavis, sendmail, etc.

group_id is the unique numeric id for the primary group used by the system service agent. Typically on Mac OS X (probably on other UNIX as well) this is going to be a number below 500. Best practice requires that it be unique, so you have to see what’s already been assigned and consult with documentation of the service you’re installing. Below is a dump of the groups that come on Mac OS X (Tiger)1. You can see that there are already pre-existing groups which could be used for many services which aren’t included on Mac OS X client.

system_username is a unique name of the system service agent. Examples: tomcat, postfix, amavis, sendmail, etc. Note: some of these names are traditional, like www, tomcat, postfix, etc. Others are up to you to come up with a naming convention. I recommend using the traditional name whenever possible.

user_id is the unique numeric primary number of the user agent under which the service will run. As Tim Parker points out this is a number below 500, but not a number already assigned to another agent account. Below is a dump of the accounts that come on Mac OS X (Tiger)2.

primary_group_id is the primary group which the system agent will belong to. This is the same number which was created in group_id.

user_shell is the shell under which the service agent will operate. In most cases this can be set to /usr/bin/false.

user_home by convention is set to a benign directory. In case the system agent account or its service has a vulnerability you don’t want the agent having access to sensitive directories. Typically these are /var/empty, or /var/service_directory. Service directory is a directory which you would create for exclusive use by the service.

passwd for system agents this is set to “∗”, or no password.

1 System groups in Mac OS X (Tiger)

nidump group .

nobody:∗:-2:
nogroup:∗:-1:
wheel:∗:0:root
daemon:∗:1:root
kmem:∗:2:root
sys:∗:3:root
tty:∗:4:root
operator:∗:5:root
mail:∗:6:
bin:∗:7:
procview:∗:8:root
procmod:∗:9:root
staff:∗:20:root
lp:∗:26:
postfix:∗:27:
postdrop:∗:28:
certusers:∗:29:root,jabber,postfix,cyrusimap
utmp:∗:45:
uucp:∗:66:
dialer:∗:68:
network:∗:69:
www:∗:70:
mysql:∗:74:
sshd:∗:75:
qtss:∗:76:
mailman:∗:78:
appserverusr:∗:79:
admin:∗:80:root,
appserveradm:∗:81:
clamav:∗:82:
amavisd:∗:83:
jabber:∗:84:
xgridcontroller:∗:85:
xgridagent:∗:86:
appowner:∗:87:
windowserver:∗:88:
accessibility:∗:90:
tokend:∗:91:
securityagent:∗:92:
unknown:∗:99:
everyone::12:
authedusers::50:
interactusers::51:
netusers::52:
consoleusers::53:
owner::10:
group::16:
smmsp::25:

2 System users on Mac OS X (Tiger)

nidump passwd .

nobody:∗:-2:-2::0:0:Unprivileged User:/var/empty:/usr/bin/false
root:∗∗∗∗∗∗∗∗:0:0::0:0:System Administrator:/var/root:/bin/tcsh
daemon:∗:1:1::0:0:System Services:/var/root:/usr/bin/false
unknown:∗:99:99::0:0:Unknown User:/var/empty:/usr/bin/false
lp:∗:26:26::0:0:Printing Services:/var/spool/cups:/usr/bin/false
uucp:∗:4:4::0:0:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
postfix:∗:27:27::0:0:Postfix User:/var/spool/postfix:/usr/bin/false
www:∗:70:70::0:0:World Wide Web Server:/Library/WebServer:/usr/bin/false
eppc:∗:71:71::0:0:Apple Events User:/var/empty:/usr/bin/false
mysql:∗:74:74::0:0:MySQL Server:/var/empty:/usr/bin/false
sshd:∗:75:75::0:0:sshd Privilege separation:/var/empty:/usr/bin/false
qtss:∗:76:76::0:0:QuickTime Streaming Server:/var/empty:/usr/bin/false
cyrusimap:∗:77:6::0:0:Cyrus IMAP User:/var/imap:/usr/bin/false
mailman:∗:78:78::0:0:Mailman user:/var/empty:/usr/bin/false
appserver:∗:79:79::0:0:Application Server:/var/empty:/usr/bin/false
clamav:∗:82:82::0:0:Clamav User:/var/virusmails:/bin/tcsh
amavisd:∗:83:83::0:0:Amavisd User:/var/virusmails:/bin/tcsh
jabber:∗:84:84::0:0:Jabber User:/var/empty:/usr/bin/false
xgridcontroller:∗:85:85::0:0:Xgrid Controller:/var/xgrid/controller:/usr/bin/false
xgridagent:∗:86:86::0:0:Xgrid Agent:/var/xgrid/agent:/usr/bin/false
appowner:∗:87:87::0:0:Application Owner:/var/empty:/usr/bin/false
windowserver:∗:88:88::0:0:WindowServer:/var/empty:/usr/bin/false
tokend:∗:91:91::0:0:Token Daemon:/var/empty:/usr/bin/false
securityagent:∗:92:92::0:0:SecurityAgent:/var/empty:/usr/bin/false