La maschera di Samba crea la maschera non funzionante correttamente

Ho una condivisione samba su un server linux (RHEL 6) che sto accedendo via Windows 7.

Ho impostato la condivisione samba con una maschera di creazione di 0664, ma quando creo i file tramite samba dalla mia macchina Windows 7, creo i file con un livello di authorization di 0674. Se modifico un file, le modifiche le modificano anche a 0674 . Se si rimuove la maschera di creazione per la condivisione e si basa sulla maschera di creazione predefinita di 0644, crea file con permessi di 0774. Il mio umask è 0022. Ho provato una serie di impostazioni dal manuale, ma nessuno sembra fare il trucco. Qualche idea su cosa sta succedendo e come posso risolvere questo problema?

Idealmente, i nuovi file avrebbero il livello di authorization di 0664 e i file esistenti mantennero il loro livello di authorization.

Per riferimento, ecco l'output di testparm -v :

 [global] dos charset = CP850 unix charset = UTF-8 display charset = LOCALE workgroup = WORKGROUP realm = netbios name = SERVER netbios aliases = netbios scope = server string = Bart interfaces = bind interfaces only = No security = DOMAIN auth methods = encrypt passwords = Yes update encrypted = No client schannel = Auto server schannel = Auto allow trusted domains = Yes map to guest = Never null passwords = No obey pam restrictions = No password server = passwordserver.domain.com smb passwd file = /var/lib/samba/private/smbpasswd private dir = /var/lib/samba/private passdb backend = tdbsam algorithmic rid base = 1000 root directory = guest account = nobody enable privileges = Yes pam password change = No passwd program = passwd chat = *new*password* %n\n *new*password* %n\n *changed* passwd chat debug = No passwd chat timeout = 2 check password script = username map = password level = 0 username level = 0 unix password sync = No restrict anonymous = 0 lanman auth = No ntlm auth = Yes client NTLMv2 auth = No client lanman auth = No client plaintext auth = No preload modules = dedicated keytab file = kerberos method = default map untrusted to domain = No log level = 0 syslog = 1 syslog only = No log file = /var/log/samba/log.%m max log size = 10240 debug timestamp = Yes debug prefix timestamp = No debug hires timestamp = Yes debug pid = No debug uid = No debug class = No enable core files = Yes smb ports = 445 139 large readwrite = Yes max protocol = NT1 min protocol = CORE min receivefile size = 0 read raw = Yes write raw = Yes disable netbios = No reset on zero vc = No acl compatibility = auto defer sharing violations = Yes nt pipe support = Yes nt status support = Yes announce version = 4.9 announce as = NT max mux = 50 max xmit = 16644 name resolve order = lmhosts wins host bcast max ttl = 259200 max wins ttl = 518400 min wins ttl = 21600 time server = No unix extensions = No use spnego = Yes client signing = auto server signing = No client use spnego = Yes client ldap sasl wrapping = plain enable asu support = No svcctl list = deadtime = 0 getwd cache = Yes keepalive = 300 lpq cache time = 30 max smbd processes = 0 paranoid server security = Yes max disk size = 0 max open files = 16384 socket options = TCP_NODELAY use mmap = Yes hostname lookups = No name cache timeout = 660 ctdbd socket = cluster addresses = clustering = No ctdb timeout = 0 load printers = No printcap cache time = 750 printcap name = cups server = cups encrypt = No cups connection timeout = 30 iprint server = disable spoolss = No addport command = enumports command = addprinter command = deleteprinter command = show add printer wizard = Yes os2 driver map = mangling method = hash2 mangle prefix = 1 max stat cache size = 256 stat cache = Yes machine password timeout = 604800 add user script = rename user script = delete user script = add group script = delete group script = add user to group script = delete user from group script = set primary group script = add machine script = shutdown script = abort shutdown script = username map script = logon script = logon path = \\%N\%U\profile logon drive = logon home = \\%N\%U domain logons = No init logon delayed hosts = init logon delay = 100 os level = 20 lm announce = Auto lm interval = 60 preferred master = No local master = No domain master = Auto browse list = Yes enhanced browsing = Yes dns proxy = Yes wins proxy = No wins server = wins support = No wins hook = kernel oplocks = Yes lock spin time = 200 oplock break wait time = 0 ldap admin dn = ldap delete dn = No ldap group suffix = ldap idmap suffix = ldap machine suffix = ldap passwd sync = no ldap replication sleep = 1000 ldap suffix = ldap ssl = start tls ldap ssl ads = No ldap deref = auto ldap follow referral = Auto ldap timeout = 15 ldap connection timeout = 2 ldap page size = 1024 ldap user suffix = ldap debug level = 0 ldap debug threshold = 10 eventlog list = add share command = change share command = delete share command = preload = lock directory = /var/lib/samba state directory = /var/lib/samba cache directory = /var/lib/samba pid directory = /var/run utmp directory = wtmp directory = utmp = No default service = message command = get quota command = set quota command = remote announce = remote browse sync = socket address = 0.0.0.0 nmbd bind explicit broadcast = Yes homedir map = auto.home afs username map = afs token lifetime = 604800 log nt token command = time offset = 0 NIS homedir = No registry shares = No usershare allow guests = No usershare max shares = 0 usershare owner only = Yes usershare path = /var/lib/samba/usershares usershare prefix allow list = usershare prefix deny list = usershare template share = panic action = perfcount module = host msdfs = Yes passdb expand explicit = No idmap backend = tdb idmap alloc backend = idmap cache time = 604800 idmap negative cache time = 120 idmap uid = idmap gid = template homedir = /home/%D/%U template shell = /bin/false winbind separator = \ winbind cache time = 300 winbind reconnect delay = 30 winbind max clients = 200 winbind enum users = No winbind enum groups = No winbind use default domain = No winbind trusted domains only = No winbind nested groups = Yes winbind expand groups = 1 winbind nss info = template winbind refresh tickets = No winbind offline logon = No winbind normalize names = No winbind rpc only = No create krb5 conf = Yes comment = path = username = invalid users = valid users = admin users = read list = write list = printer admin = force user = force group = read only = Yes acl check permissions = Yes acl group control = No acl map full control = Yes create mask = 0744 force create mode = 00 security mask = 0777 force security mode = 00 directory mask = 0755 force directory mode = 00 directory security mask = 0777 force directory security mode = 00 force unknown acl user = No inherit permissions = No inherit acls = No inherit owner = No guest only = No administrative share = No guest ok = No only user = No hosts allow = hosts deny = allocation roundup size = 1048576 aio read size = 0 aio write size = 0 aio write behind = ea support = No nt acl support = Yes profile acls = No map acl inherit = No afs share = No smb encrypt = auto block size = 1024 change notify = Yes directory name cache size = 100 kernel change notify = Yes max connections = 0 min print space = 0 strict allocate = No strict sync = No sync always = No use sendfile = No write cache size = 0 max reported print jobs = 0 max print jobs = 1000 printable = No printing = cups cups options = raw print command = lpq command = %p lprm command = lppause command = lpresume command = queuepause command = queueresume command = printer name = use client driver = No default devmode = Yes force printername = No printjob username = %U default case = lower case sensitive = Auto preserve case = Yes short preserve case = Yes mangling char = ~ hide dot files = Yes hide special files = No hide unreadable = No hide unwriteable files = No delete veto files = No veto files = hide files = veto oplock files = map archive = Yes map hidden = No map system = No map readonly = yes mangled names = Yes store dos attributes = No dmapi support = No browseable = Yes access based share enum = No blocking locks = Yes csc policy = manual fake oplocks = No locking = Yes oplocks = Yes level2 oplocks = Yes oplock contention limit = 2 posix locking = Yes strict locking = Auto share modes = Yes dfree cache time = 0 dfree command = copy = preexec = preexec close = No postexec = root preexec = root preexec close = No root postexec = available = Yes volume = fstype = NTFS set directory = No wide links = No follow symlinks = Yes dont descend = magic script = magic output = delete readonly = No dos filemode = No dos filetimes = Yes dos filetime resolution = No fake directory create times = No vfs objects = msdfs root = No msdfs proxy = [path] comment = path path = /path/ valid users = usera, userb, userc read only = No create mask = 0664 directory mask = 0775 wide links = Yes 

Spesso il problema è causato dall'abilitazione di uno dei seguenti:

  • map archive (usa un bit di esecuzione unix per il proprietario)
  • map system (usa un bit di esecuzione unix per il gruppo)
  • map hidden (usa un bit di esecuzione unix per altri)
  • inherit permissions causa Samba a ignorare la create mask , ecc
  • c'è anche inherit acls che dovrebbe default a no

"Autorizzazioni e attributi di file su MS-DOS e Unix" nel Capitolo 8. Azioni di disco avanzate spiega bene quanto sopra.

Tuttavia, i prodotti per ufficio microsoft causano un comportmento strano e triggersno un bug / comportmento imprevisto. Anche con la create mask e / o force create mode creazione e di evitare la mappa sopra o l'opzione di ereditarietà, ho visto le autorizzazioni di esecuzione di gruppo che vengono impostate durante la modifica dei documenti utilizzando le applicazioni di ufficio microsoft. Ciò non avviene con altri programmi, ad esempio modificare un file .txt con block note e permessi rimanere sani. Office non crea solo file, ma anche un po 'di file temporanei, ridenominazione e autorizzazioni.

Dopo un sacco di scavi in ​​giro, potrebbe anche essere confuso con un tipo di bug Samba POSIX ACL:

  • Vecchio bug 2007 debian bug report "samba: misinterprets creare la modalità con POSIX acls"
  • " Comportmento errato per ACL predefiniti " sembra essere il rapporto bug più recente per samba, ma è purtroppo chiuso "RESOLVED INVALID" (prematuramente?).

Comportmento osservato sul lato Linux

Gli ACL estesi per un file docx vuoto parola creato tramite menu contestuale di Windows Explorer (non ancora aperto e salvato per parola)

 $ getfacl test.docx # file: test.docx # owner: tester # group: tester user::rw- group::rw- other::--- 

Dopo il salvataggio tramite la parola MS 2016

 $ getfacl test.docx # file: test.docx # owner: tester # group: tester user::rw- user:tester:rw- group::rw- group:tester:rw- mask::rwx 

Quando si controlla la configuration samba su Ubuntu 16.04 LTS, sembra che l' map archive sia abilitato per impostazione predefinita, ma che dovrebbe utilizzare il bit di esecuzione del proprietario, non il gruppo eseguire bit, quindi non era la causa nel mio caso

 $ testparm -s -v 2>&1 | grep 'map archive' map archive = Yes 

Comportmento osservato sul lato di Windows

Utilizzando SysInternals Process Monitor e confrontando la modifica di un file .txt con notepad.exe nei confronti di un file .docx con WINWORD.EXE, la suite di Office fa un sacco di fantasia che crea file di temp, ridenominazione ecc. In particolare, a differenza di notepad.exe , WINWORD.EXE sembra violare con gli elenchi di controllo di accesso. Come visto da procmon

 SetSecurityFile Information: Group, DACL 

Quindi sospetto che questo è il motivo per cui la licenza del gruppo UNIX viene fiddled con da microsoft ufficio applicazioni.

L'indagine approfondita ha richiesto l'triggerszione della verifica della sicurezza degli oggetti file di Windows per vedere cosa è stato esattamente cambiato. ID evento 4670 mostra le modifiche di authorization ~WRD0000.tmp applicate (penso che la parola usa questo per il salvataggio e il ripristino periodici se si blocca).

 Object: Object Server: Security Object Type: File Object Name: C:\Users\<user>\Desktop\TestAudit\~WRD0000.tmp Handle ID: 0xfd0 Process: Process ID: 0x1ae4 Process Name: C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE Permissions Change: Original Security Descriptor: D:AI(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;FA;;;S-1-5-<SID>-1001) New Security Descriptor: D:(A;;0x1200a9;;;WD)(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;FA;;;S-1-5-21-<SID>-1001) 

La modifica delle autorizzazioni in SDDL (Language Descriptor Definition Language) è un DACL (parte di controllo accessi discrezionale) where viene visualizzato un ulteriore ACE (Access Control Entry). ACE (A;;0x1200a9;;;WD) viene aggiunto direttamente nella parte anteriore. È così che ho interpretato:

  • A; il che significa consentire l'accesso, è rimasto lo stesso
  • ; nessuna inheritance;
  • 0x1200a9; significa FILE_GENERIC_READ | FILE_EXECUTE FILE_GENERIC_READ | FILE_EXECUTE legge ed esegue l'accesso
  • WD significa il trustee "tutti"

Poi successivamente, il ~WRD0000.tmp viene rinominato per test.docx che ho visto nel monitor di process come un'operazione SetRenameInformationFile . Quindi alla fine il test.docx finisce con alcune delle parole di cambiamento ACE fatto per qualsiasi motivo.

Uscita monitor di processo SysInternal