Samba のマスク作成が正しく機能しない

Samba のマスク作成が正しく機能しない

Windows 7 経由でアクセスしている Linux サーバー (RHEL 6) 上に Samba 共有があります。

samba 共有の作成マスクを 0664 に設定しましたが、Windows 7 マシンから samba 経由でファイルを作成すると、アクセス許可レベル 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(その他には Unix 実行ビットを使用)
  • inherit permissionssamba が無視するcreate maskなど
  • inherit aclsデフォルトはnoであるべきである

「MS-DOSとUnixのファイル権限と属性」第8章 高度なディスク共有上記をうまく説明しています。

ただし、Microsoft Office 製品は奇妙な動作を引き起こし、バグや予期しない動作を引き起こします。and create mask/or force create modeset を使用し、上記の map または inherit オプションを回避した場合でも、Microsoft Office アプリケーションを使用してドキュメントを編集するときにグループ実行権限が設定されることがあります。これは他のプログラムでは発生しません。たとえば、メモ帳で .txt ファイルを編集しても、権限は正常のままです。Office はファイルを作成するだけでなく、一時ファイル、名前の変更、権限にも多少影響します。

いろいろ調べてみたところ、Samba POSIX ACL のバグとも関係がある可能性があります。

Linux側で観察された動作

Windows エクスプローラーのコンテキスト メニューから作成された空の Word docx ファイルの拡張 ACL (Word でまだ開かれて保存されていない)

$ 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 Process Monitor を使用して、notepad.exe で .txt ファイルを編集する場合と WINWORD.EXE で .docx ファイルを編集する場合を比較すると、このオフィス スイートは一時ファイルの作成、名前の変更など、多くの複雑な処理を行っています。特に、notepad.exe とは異なり、WINWORD.EXE はアクセス制御リストを操作しているようです。procmon で確認されたように、

SetSecurityFile
Information:    Group, DACL

したがって、UNIX グループの権限が Microsoft Office アプリケーションによって変更されるのは、このためではないかと私は考えています。

より詳細な調査では、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 (セキュリティ記述子定義言語) の権限変更は、DACL (任意アクセス制御リスト部分) であり、追加の ACE (アクセス制御エントリ) が追加されたように見えます。ACE は(A;;0x1200a9;;;WD)先頭に追加されます。私は次のように解釈しました。

  • A;アクセスを許可するという意味は同じまま
  • ;継承なし
  • 0x1200a9;FILE_GENERIC_READ | FILE_EXECUTE読み取りと実行のアクセスを意味します
  • WD「全員」受託者を意味する

その後、プロセス モニターで操作として確認したところ、~WRD0000.tmpは に名前変更されました。そのため、最終的には、何らかの理由で Word が行った ACE の変更の一部が反映されます。test.docxSetRenameInformationFiletest.docx

SysInternal プロセス モニター出力

関連情報