Samba 생성 마스크가 올바르게 작동하지 않습니다.

Samba 생성 마스크가 올바르게 작동하지 않습니다.

Windows 7을 통해 액세스하는 Linux 서버(RHEL 6)에 삼바 공유가 있습니다.

생성 마스크 0664로 삼바 공유를 설정했지만 Windows 7 컴퓨터에서 삼바를 통해 파일을 생성하면 권한 수준이 0674인 파일이 생성됩니다. 파일을 편집하면 권한도 0674로 변경됩니다. . 공유에 대한 생성 마스크를 제거하고 기본 생성 마스크 0644를 사용하면 권한이 0774인 파일이 생성됩니다. 내 umask는 0022입니다. 매뉴얼에서 여러 설정을 시도했지만 아무것도 수행하지 못하는 것 같습니다. 장난. 무슨 일이 일어나고 있는지, 이 문제를 어떻게 해결할 수 있는지에 대한 아이디어가 있습니까?

이상적으로 새 파일의 권한 수준은 0664이고 기존 파일은 권한 수준을 유지합니다.

참고로 다음의 출력이 있습니다 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

답변1

다음 중 하나를 활성화하면 문제가 발생하는 경우가 많습니다.

  • map archive(소유자를 위해 unix 실행 비트를 사용함)
  • map system(그룹에 대해 unix 실행 비트 사용)
  • map hidden(다른 경우에는 유닉스 실행 비트를 사용합니다)
  • inherit permissionscreate mask삼바가 등을 무시하게 만듭니다 .
  • inherit acls기본적으로 no로 설정해야 하는 항목 도 있습니다.

"MS-DOS 및 Unix의 파일 권한 및 속성"8장. 고급 디스크 공유위의 내용을 친절하게 설명합니다.

그러나 Microsoft Office 제품은 이상한 동작을 일으키고 버그/예기치 않은 동작을 유발합니다. 위의 맵 또는 상속 옵션을 설정하고 create mask피 하더라도 force create modeMicrosoft Office 응용 프로그램을 사용하여 문서를 편집할 때 그룹 실행 권한이 설정되는 것을 보았습니다. 이는 다른 프로그램에서는 발생하지 않습니다. 예를 들어 메모장으로 .txt 파일을 편집하면 권한이 정상적으로 유지됩니다. Office는 파일을 생성할 뿐만 아니라 임시 파일, 이름 변경 및 권한을 약간 혼란스럽게 만듭니다.

많이 조사한 후에는 일종의 Samba POSIX ACL 버그와 혼동될 수도 있습니다.

Linux 측에서 관찰된 동작

Windows 탐색기 컨텍스트 메뉴를 통해 생성된 빈 단어 docx 파일에 대한 확장 ACL(아직 열리지 않고 단어별로 저장되지 않음)

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

MS Word 2016을 통해 저장한 후

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

Ubuntu 16.04 LTS에서 Samba 구성을 확인할 때 map archive기본적으로 활성화되어 있는 것 같지만 그룹 실행 비트가 아닌 소유자의 실행 비트를 사용해야 하므로 제 경우에는 이것이 원인이 아니었습니다.

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

Windows 측에서 관찰된 동작

SysInternals 프로세스 모니터를 사용하고 notepad.exe를 사용하여 .txt 파일을 편집하는 것과 WINWORD.EXE를 사용하여 .docx 파일을 편집하는 것을 비교하면 Office 제품군은 임시 파일 생성, 이름 바꾸기 등의 멋진 작업을 많이 수행합니다. 특히 notepad.exe와는 달리 , WINWORD.EXE는 액세스 제어 목록을 조작하는 것 같습니다. 프로몬에서 본 것처럼

SetSecurityFile
Information:    Group, DACL

그래서 저는 이것이 Microsoft Office 응용 프로그램이 UNIX 그룹 권한을 조작하는 이유라고 생각합니다.

더 자세히 조사하려면 Windows 파일 개체 보안 감사를 켜서 정확히 무엇이 변경되었는지 확인해야 했습니다. 이벤트 ID 4670은 ~WRD0000.tmp적용된 권한 변경을 보여줍니다. (내 생각에는 Word에서 충돌이 발생할 경우 정기적인 저장 및 복구를 위해 이것을 사용하는 것 같습니다.)

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)

SDDL(Security Descriptor Definition Language)의 권한 변경은 추가 ACE(액세스 제어 항목)가 추가된 것으로 나타나는 DACL(임의 액세스 제어 목록 부분)입니다. ACE가 (A;;0x1200a9;;;WD)바로 앞에 추가됩니다. 제가 해석한 방법은 다음과 같습니다.

  • A;액세스 허용을 의미하며 동일하게 유지됩니다.
  • ;상속 없음
  • 0x1200a9;FILE_GENERIC_READ | FILE_EXECUTE읽기 및 실행 액세스를 의미합니다.
  • WD'모두' 수탁자를 의미합니다.

그런 다음 나중에 프로세스 모니터에서 작업으로 본 ~WRD0000.tmp이름으로 변경되었습니다 . 따라서 결국 어떤 이유로든 단어가 수행한 ACE 변경 사항 중 일부로 끝납니다.test.docxSetRenameInformationFiletest.docx

SysInternal 프로세스 모니터 출력

관련 정보