Die wichtigsten Erkenntnisse
- Automatisiert die Erstellung von Admin-Benutzern: Vereinfacht und standardisiert den Prozess des Hinzufügens neuer Admin-Benutzer unter Mac OS.
- Erhöhte Effizienz und Sicherheit: Verringert manuelle Fehler und gewährleistet konsistente Sicherheitspraktiken bei der Benutzererstellung.
- Robustes Parsing von Argumenten: Verarbeitet Benutzereingaben effektiv, einschließlich fehlender Argumente und Hilfeanfragen.
- Eindeutige Zuweisung einer Benutzer-ID: Erzeugt auf intelligente Weise eindeutige IDs, die für die Mac OS-Benutzerverwaltung entscheidend sind.
- Umfassende Benutzereinrichtung: Richtet die erforderlichen Benutzerattribute wie Shell, Heimatverzeichnis und Gruppenmitgliedschaften ein.
- Fehlerbehandlung und Root-Rechte: Enthält Fehlerprüfungen und erfordert Root-Zugriff, was die Sicherheit und Zuverlässigkeit erhöht.
- Skalierbar für MSPs und IT-Experten: Es ist ideal für die Verwaltung mehrerer Systeme und spart Zeit und Aufwand bei umfangreichen Implementierungen.
- Im Vergleich zu manuellen Methoden: Bietet eine skalierbare und fehlersichere Alternative zu manuellen Methoden der Benutzererstellung.
- Sicherheitserwägungen: Es ist wichtig, das Skript selbst zu sichern, da es über umfangreiche Verwaltungsfunktionen verfügt.
- Integration mit Verwaltungstools: Kann effektiv in IT-Management-Plattformen wie NinjaOne integriert werden, um die Kontrolle und Überwachung zu verbessern.
Das Anlegen von Benutzerkonten ist eine grundlegende Aufgabe der Systemadministration, die einen sicheren und organisierten Zugang zu Ressourcen und Diensten gewährleistet. Unter Mac OS ist dieser Prozess aufgrund der besonderen Architektur des Betriebssystems und der Sicherheitsprotokolle besonders anspruchsvoll. Die Automatisierung dieses Prozesses vereinfacht nicht nur die Verwaltungsaufgaben, sondern erhöht auch die Sicherheit und Effizienz des IT-Betriebs.
Hintergrund
In der Welt der IT, insbesondere für Managed Service Provider (MSPs ) und IT-Experten, sind Effizienz und Sicherheit von größter Bedeutung. Das Skript, um das es hier geht, ist ein speziell für Mac OS entwickeltes Bash-Skript, das die Erstellung eines neuen Administrator-Benutzers automatisieren soll. Dieses Tool ist von entscheidender Bedeutung, da es die Benutzererstellung standardisiert, menschliche Fehler reduziert und das System absichert, indem es sicherstellt, dass alle erforderlichen Schritte und Berechtigungen korrekt implementiert sind.
Das Skript:
#!/usr/bin/env bash # # Description: Create a new admin user for Mac. # By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use. # Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. # Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. # Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. # Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. # Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. # Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. # EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA). # Usage: [-u|--user <arg>] [-p|--pass <arg>] [-h|--help] # -u, --user: User Name for new user account. (no default) # -p, --pass: Password for new user account. (no default) # -h, --help: Prints help # # When called, the process ends. # Args: # $1: The exit message (print to stderr) # $2: The exit code (default is 1) # if env var _PRINT_HELP is set to 'yes', the usage is print to stderr (prior to $1) # Example: # test -f "$_arg_infile" || _PRINT_HELP=yes die "Can't continue, have to supply file as an argument, got '$_arg_infile'" 4 die() { local _ret="${2:-1}" test "${_PRINT_HELP:-no}" = yes && print_help >&2 echo "$1" >&2 exit "${_ret}" } # Function that evaluates whether a value passed to it begins by a character # that is a short option of an argument the script knows about. # This is required in order to support getopts-like short options grouping. begins_with_short_option() { local first_option all_short_options='uph' first_option="${1:0:1}" test "$all_short_options" = "${all_short_options/$first_option/}" && return 1 || return 0 } getHiddenUserUid() { local __UniqueIDs __UniqueIDs=$(dscl . -list /Users UniqueID | awk '{print $2}' | sort -ugr) local __NewUID for __NewUID in $__UniqueIDs; do if [[ $__NewUID -lt 499 ]]; then break fi done echo $((__NewUID + 1)) } _arg_user= _arg_pass= # Function that prints general usage of the script. # This is useful if users asks for it, or if there is an argument parsing error (unexpected / spurious arguments) # and it makes sense to remind the user how the script is supposed to be called. print_help() { printf '%s\n' "Create a new admin user." printf 'Usage: %s [-u|--user <arg>] [-p|--pass <arg>] [-h|--help]\n' "$0" printf '\t%s\n' "-u, --user: User Name for new user account. (no default)" printf '\t%s\n' "-p, --pass: Password for new user account. (no default)" printf '\t%s\n' "-h, --help: Prints help" } # The parsing of the command-line parse_commandline() { while test $# -gt 0; do _key="$1" case "$_key" in # We support whitespace as a delimiter between option argument and its value. # Therefore, we expect the --user or -u value. # so we watch for --user and -u. # Since we know that we got the long or short option, # we just reach out for the next argument to get the value. -u | --user) test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1 _arg_user="$2" shift ;; # We support the = as a delimiter between option argument and its value. # Therefore, we expect --user=value, so we watch for --user=* # For whatever we get, we strip '--user=' using the ${var##--user=} notation # to get the argument value --user=*) _arg_user="${_key##--user=}" ;; # We support getopts-style short arguments grouping, # so as -u accepts value, we allow it to be appended to it, so we watch for -u* # and we strip the leading -u from the argument string using the ${var##-u} notation. -u*) _arg_user="${_key##-u}" ;; # See the comment of option '--user' to see what's going on here - principle is the same. -p | --pass) test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1 _arg_pass="$2" shift ;; # See the comment of option '--user=' to see what's going on here - principle is the same. --pass=*) _arg_pass="${_key##--pass=}" ;; # See the comment of option '-u' to see what's going on here - principle is the same. -p*) _arg_pass="${_key##-p}" ;; # The help argument doesn't accept a value, # we expect the --help or -h, so we watch for them. -h | --help) print_help exit 0 ;; # We support getopts-style short arguments clustering, # so as -h doesn't accept value, other short options may be appended to it, so we watch for -h*. # After stripping the leading -h from the argument, we have to make sure # that the first character that follows corresponds to a short option. -h*) print_help exit 0 ;; *) _PRINT_HELP=yes die "FATAL ERROR: Got an unexpected argument '$1'" 1 ;; esac shift done } parse_commandline "$@" if [[ -n "${username}" ]]; then _arg_user=$username fi if [[ -n "${password}" ]]; then _arg_pass=$password fi if [[ -z "${_arg_user}" ]]; then die "FATAL ERROR: User Name is required. '$_arg_user'" 1 fi if [[ -z "${_arg_pass}" ]]; then die "FATAL ERROR: Password is required. '$_arg_pass'" 1 fi UniqueID=$(getHiddenUserUid) if [ "$(id -u)" -eq 0 ]; then if dscl . -create /Users/"$_arg_user"; then dscl . -create /Users/"$_arg_user" UserShell /bin/bash dscl . -create /Users/"$_arg_user" RealName "$_arg_user" dscl . -create /Users/"$_arg_user" UniqueID "$UniqueID" dscl . -create /Users/"$_arg_user" PrimaryGroupID 20 dscl . -create /Users/"$_arg_user" NFSHomeDirectory /Users/"$_arg_user" dscl . -passwd /Users/"$_arg_user" "$_arg_pass" dscl . -append /Groups/admin GroupMembership "$_arg_user" dscl . -append /Groups/_lpadmin GroupMembership "$_arg_user" dscl . -append /Groups/_appserveradm GroupMembership "$_arg_user" dscl . -append /Groups/_appserverusr GroupMembership "$_arg_user" createhomedir -c 2>&1 | grep -v "shell-init" else echo "ERROR: Failed to create user. Already exists?" exit 1 fi else echo "Only root may add a user to the system." exit 2 fi
Zugriff auf über 300 Skripte im NinjaOne Dojo
Detaillierte Aufschlüsselung
Das Skript arbeitet in mehreren unterschiedlichen Phasen:
- Parsing von Argumenten: Es beginnt mit dem Parsen der während des Aufrufs übergebenen Argumente. Diese Argumente umfassen den Benutzernamen und das Passwort für das neue Konto, die für die Kontoerstellung entscheidend sind. Das Skript geht elegant mit fehlenden Argumenten, Fehlern oder Hilfeanfragen um und leitet den Benutzer entsprechend an.
- Erstellen einer Benutzer-ID: Für den neuen Benutzer wird eine eindeutige Benutzer-ID erstellt. Mac OS verlangt, dass jeder Benutzer eine eindeutige Kennung hat, und dieses Skript identifiziert eine unbenutzte Kennung, indem es die vorhandenen Kennungen analysiert.
- Erstellung eines Kontos: Sobald der Benutzername, das Passwort und die eindeutige ID festgelegt sind, fährt das Skript mit der Erstellung des Benutzers fort. Es weist eine Shell (/bin/bash) zu, setzt einen echten Namen, eine Benutzer-ID und eine primäre Gruppen-ID und legt ein Home-Verzeichnis fest. Wichtig ist, dass er den Benutzer zu mehreren Verwaltungsgruppen hinzufügt und ihm die erforderlichen Berechtigungen erteilt.
- Initialisierung des Heimatverzeichnisses: Das Skript initialisiert dann das Home-Verzeichnis für den neuen Benutzer, ein wichtiger Schritt für die Funktionalität des Benutzerkontos.
- Fehlerbehandlung und Berechtigungen: Es enthält eine robuste Fehlerbehandlung, die sicherstellt, dass das Skript bei Problemen mit entsprechenden Meldungen und Statusangaben beendet wird. Das Skript erfordert Root-Rechte, was seinen administrativen Charakter widerspiegelt.
Mögliche Anwendungsfälle
Stellen Sie sich einen MSP vor, der mehrere Mac OS-Systeme für einen neuen Firmenkunden einrichten soll. Bisher mussten dazu auf jedem Rechner manuell Benutzerkonten angelegt werden – ein zeitaufwändiger und fehleranfälliger Prozess. Mit diesem Skript kann der MSP schnell, einheitlich und sicher Administratorkonten für alle Rechner einrichten, was Konsistenz gewährleistet und viel Zeit spart.
Vergleiche
Herkömmliche Methoden zum Hinzufügen von Benutzer:innen unter Mac OS verwenden die Oberfläche der Systemeinstellungen oder einfache Terminalbefehle. Diese Methoden sind zwar für Einzelfälle geeignet, aber nicht skalierbar und anfällig für Inkonsistenzen. Dieses Skript automatisiert den Prozess und stellt sicher, dass jedes Konto nach bewährten Verfahren und mit genau den erforderlichen Berechtigungen erstellt wird.
FAQs
- Wie sicher ist dieses Skript für die Erstellung von Admin-Benutzer:innen?
- Das Skript ist auf Sicherheit ausgelegt, erfordert Root-Zugriff und geht mit sensiblen Informationen wie Passwörtern sorgfältig um.
- Kann das Skript mehrere Benutzer:innen auf einmal anlegen?
- Wie geschrieben, wird pro Aufruf ein Benutzer angelegt. Es kann jedoch in einem größeren Skript geändert oder in eine Schleife eingefügt werden, um mehrere Benutzer:innen zu erstellen.
Auswirkungen
Automatisierte Skripte sind zwar effizient, haben aber auch Auswirkungen auf die IT-Sicherheit. Wenn sie missbraucht werden oder Unbefugte auf sie zugreifen, können sie ein Vektor für die Schaffung nicht autorisierter Zugangspunkte sein. Daher ist die Sicherung des Skripts selbst ebenso wichtig wie die Sicherung des Systems, auf dem es läuft.
Empfehlungen
- Führen Sie solche Skripte immer unter Berücksichtigung der höchsten Sicherheitsstandards aus.
- Prüfen und aktualisieren Sie das Skript regelmäßig, um die Kompatibilität mit den neuesten Mac OS-Versionen sicherzustellen.
- Beschränken Sie den Zugriff auf das Skript auf autorisiertes Personal.
Abschließende Überlegungen
Die Einbindung von Tools wie NinjaOne kann den Nutzen solcher Skripte noch erhöhen. NinjaOne bietet eine Plattform zur Verwaltung des IT-Betriebs, auf der Skripte effizient eingesetzt, überwacht und verwaltet werden können. Die Integration von automatisierten Skripten in ein breiteres Management-Framework wie NinjaOne kann die IT-Effizienz und die Sicherheitslage eines Unternehmens erheblich verbessern, vor allem, wenn es um unterschiedliche und komplexe Umgebungen wie mehrere Mac OS-Systeme geht.