Warum kann ich nicht auf die Dateifreigabe zugreifen, wenn Open Directory in macOS Mojave aktiviert ist?

Hier ist das Verfahren, das ich befolgt habe:

  1. Installieren Sie eine neue Kopie von macOS Mojave auf einem APFS-Volume

  2. Führen Sie die Erstkonfiguration des Betriebssystems durch und erstellen Sie beim ersten Start den Benutzer „admin“. Weisen Sie eine statische IP aus dem privaten Netzwerk 192.168.168.0/24 zu. Verwenden Sie einen DNS-Server, der sich in einem privaten Netzwerk befindet. Stellen Sie sicher, dass die IP in einen FQDN („test.mydomain.com“) aufgelöst wird und umgekehrt.

  3. Laden Sie die macOS Server-Anwendung (5.7) aus dem App Store herunter
  4. Öffnen Sie die macOS Server-Anwendung
  5. Erstellen Sie eine neue Open Directory-Domain mit Standardoptionen
  6. Erstellen Sie einen neuen Benutzer „testuser“ im lokalen Netzwerkverzeichnis
  7. Erstellen Sie eine neue Gruppe „testgroup“ im lokalen Netzwerkverzeichnis
  8. Weisen Sie den neu erstellten 'testuser' der 'testgroup' zu
  9. Öffnen Sie die Anwendung Systemeinstellungen
  10. Öffnen Sie die Freigabeeinstellungen
  11. Dateifreigabe aktivieren
  12. Erstellen Sie einen freigegebenen Ordner „myshare“ und weisen Sie „testgroup“ und „admin“ Lese- und Schreibzugriff darauf zu
  13. Wählen Sie „myshare“ und klicken Sie auf die Schaltfläche „Optionen“, um sicherzustellen, dass die SMB-Freigabe dafür aktiviert ist

  14. Versuchen Sie, sich von einem Client-Computer innerhalb desselben Subnetzes über smb://test.mydomain.com/myshare oder alternativ smb://192.168.168.X/myshare mit den Anmeldeinformationen „admin“ oder „testuser“ mit dem Dateiserver zu verbinden

Im letzten Schritt schlägt die Verbindung sowohl für die Konten „admin“ als auch „testuser“ fehl. Wenn ich Open Directory ausschalte, kann ich mich mit dem Benutzer „admin“ verbinden. Neustarts in irgendeiner Phase des Verfahrens machen keinen Unterschied.

Warum kann ich nicht auf SMB zugreifen, wenn Open Directory aktiviert ist?

Hier sind die opendirectoryd-Protokolleinträge von der Erstellung des OD-Masters (Schritt 5): https://pastebin.com/uQm8b8NM

Hier sind die opendirectoryd- und smbd-Protokolleinträge vom Anmeldeversuch (Schritt 14): https://pastebin.com/U2RS3LYC & https://pastebin.com/7bFNfd8V

Schlimmer noch, SMB ist jetzt für Time Machine-Serverfreigaben erforderlich. Der TM-Server auf Mojave ist also effektiv kaputt.

Antworten (3)

Das Problem ist, dass die ACLs nicht im lokalen Verzeichnis für SMB und AFP eingerichtet sind. Diese wurden früher in den älteren Server-Apps erstellt, die die Dateifreigabe enthielten. Ich habe ein AppleScript geschrieben, das sich um all das kümmert. Es erstellt die entsprechenden ACL-Gruppen im Verzeichnis (/Local/Default/Groups/com.apple.access_smb und com.apple.access_afp) und fügt dann alle Benutzer hinzu. Das Skript ist unten. Ich habe es heute zusammengeworfen, um genau dieses Problem zu lösen. Hoffentlich hilft es anderen.

-- Script to sort out ACLs for file sharing
set savedDelimiters to AppleScript's text item delimiters

display alert "Setup File Sharing ACLs" message "This script will set up the appropriate ACLs in the local directory to allow users to connect to file sharing on a macOS 10.14 server with OpenDirectory.

WARNING: Changes will be made to your local directory. Administrator privileges are required (you will be prompted for a password).

USE AT YOUR OWN RISK!

Set for all users, or only a single user?" buttons {"Cancel", "All Users", "Single User"} default button "Single User" cancel button "Cancel"

if button returned of result = "All Users" then
    set progress description to "Loading User List..."
    -- Load all directory users from the server
    -- (identified by UserShell value of '/bin/bash'; most likely to be normal users)
    -- The delimiter is horrible, but it's the only way to do it
    set delimiter to tab & tab & "UserShell = (" & return & "    \"/bin/bash\"" & return & ")"
    set AppleScript's text item delimiters to {delimiter & return, delimiter}
    set users to every text item of (do shell script "dscl /LDAPv3/127.0.0.1 search /Users UserShell \"/bin/bash\"")
else if button returned of result = "Single User" then
    repeat
        set username to the text returned of (display dialog "Enter Username:" default answer "" with icon note)
        if username is "" then
            display alert "Please enter username, or click cancel to end"
        else
            exit repeat
        end if
    end repeat
    -- Add blank element to end, as this happens with output from dscl above
    set users to {username, ""}
end if

-- Create the SMB & AFP ACL groups if necessary (this may be the first user)
createACLGroup("afp", 250)
createACLGroup("smb", 110)
-- Go through all the users now
set total to (length of users) - 1
set progress total steps to total
set progress description to "Adding Users to ACLs..."
set current to 0
repeat with idx from 1 to total
    -- Need to use indexed repeat because of issue with missing username in list from dscl
    set username to item idx of users
    try
        set progress completed steps to current
        set progress additional description to "User " & (current + 1) & " of " & total & " (" & username & ")"
        -- Now, check to see if the user is already in the file sharing lists
        set AppleScript's text item delimiters to {" "} -- Split words, not letters!
        set currList to every text item of (do shell script "dscl /Local/Default read Groups/com.apple.access_smb GroupMembership")
        if username is in currList and length of users is 1 then
            -- Only alert if in single user mode
            display alert "Username already set up"
        else
            -- Go ahead and set it up
            -- Firstly, get the user's GeneratedUID from the LDAP directory
            set isError to false
            try
                set guid to second item of (every text item of (do shell script "dscl /LDAPv3/127.0.0.1 read Users/" & username & " GeneratedUID"))
            on error
                display alert "Error" message "User " & username & " is not a directory user"
                set isError to true
            end try
            if not isError then
                -- Add the user to the group
                addUserToACL("afp", username, guid)
                addUserToACL("smb", username, guid)
            end if
        end if
        set current to current + 1
    on error
        -- Likely an empty username from the delimiters tokenising the list from dscl
    end try
end repeat
set current to total
display alert "Process completed!"

set AppleScript's text item delimiters to savedDelimiters

on createACLGroup(acltype, groupid)
    try
        do shell script "dscl /Local/Default read Groups/com.apple.access_smb"
    on error
        -- Doesn't exist, so we need to create it!
        do shell script "dscl /Local/Default create Groups/com.apple.access_" & acltype with administrator privileges
        do shell script "dscl /Local/Default create Groups/com.apple.access_" & acltype & " RealName \"" & changeCaseOfText(acltype, "upper") & " ACL\"" with administrator privileges
        do shell script "dscl /Local/Default create Groups/com.apple.access_" & acltype & " PrimaryGroupID " & groupid with administrator privileges
    end try
end createACLGroup

on addUserToACL(acltype, username, guid)
    do shell script "dscl /Local/Default append Groups/com.apple.access_" & acltype & "  GroupMembership " & username with administrator privileges
    do shell script "dscl /Local/Default append Groups/com.apple.access_" & acltype & " GroupMembers " & guid with administrator privileges
end addUserToACL

on changeCaseOfText(theText, theCaseToSwitchTo)
    if theCaseToSwitchTo contains "lower" then
        set theComparisonCharacters to "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        set theSourceCharacters to "abcdefghijklmnopqrstuvwxyz"
    else if theCaseToSwitchTo contains "upper" then
        set theComparisonCharacters to "abcdefghijklmnopqrstuvwxyz"
        set theSourceCharacters to "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    else
        return theText
    end if
    set theAlteredText to ""
    repeat with aCharacter in theText
        set theOffset to offset of aCharacter in theComparisonCharacters
        if theOffset is not 0 then
            set theAlteredText to (theAlteredText & character theOffset of theSourceCharacters) as string
        else
            set theAlteredText to (theAlteredText & aCharacter) as string
        end if
    end repeat
    return theAlteredText
end changeCaseOfText

Schau dir diesen Artikel an:

https://support.apple.com/en-ca/HT210659

Der Artikel erläutert, wie Sie SMB-NTLMv2 als Authentifizierungsmechanismus aktivieren, damit sich jeder Client beim Server authentifizieren kann.

Andernfalls muss der Client an Open Directory gebunden sein und Kerberos verwenden, um auf die Freigabe zuzugreifen.

Hallo Robert. Dies wird als "Nur-Link"-Antwort betrachtet. Für zukünftige Besucher dieser Frage wäre es hilfreich, wenn Sie eine Zusammenfassung dieser Seite bearbeiten würden. Links können beschädigt oder veraltet sein, sodass eine Zusammenfassung immer noch die erforderlichen Informationen liefern würde.
Um den Kommentar von Agarza zu verstärken, zögere ich nicht, die meisten oder alle Informationen, die ich auf den Support-Seiten finde, großzügig zu kopieren und in den Hauptteil einer Antwort einzufügen und den Link bereitzustellen. Apple-Seiten sind relativ sauber und nach dem Einfügen einfach zu bearbeiten.

Installieren Sie High Sierra mit Server App 5.6 neu und es funktioniert.

Maurizio, ich nehme an, Sie meinen, sowohl das Betriebssystem als auch Server.app auf frühere Versionen herunterzustufen? Ja, ich habe das selbst getestet und kann zustimmen, dass es funktioniert, obwohl ich nicht sicher bin, ob ich es als optimale Lösung bezeichnen würde. :)
Ich kann auch bestätigen, dass das Update 10.14.1 diese Woche das Problem nicht behoben hat
Das OP fragte nach Mojave. Eine Antwort mit "funktioniert in High Sierra" ist nicht sinnvoll.