У меня есть общий ресурс Samba на сервере Linux (RHEL 6), к которому я получаю доступ через Windows 7.
Я установил маску создания для общего ресурса Samba 0664, но когда я создаю файлы через Samba с моего компьютера с 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
(использует бит выполнения unix для других)inherit permissions
заставляет самбу игнорироватьcreate mask
и т. д.- есть также
inherit acls
, который должен быть по умолчанию равен no
«Разрешения и атрибуты файлов в MS-DOS и Unix» вГлава 8. Расширенные дисковые ресурсыхорошо объясняет вышесказанное.
Однако продукты Microsoft Office вызывают странное поведение и вызывают ошибку/неожиданное поведение. Даже с create mask
and/or force create mode
set и избеганием вышеуказанной опции map или inherit я видел, как разрешения на выполнение группы устанавливались при редактировании документов с помощью приложений Microsoft Office. Этого не происходит с другими программами, например, при редактировании файла .txt с помощью блокнота разрешения остаются в порядке. Office не просто создает файлы, он также немного путается с временными файлами, переименованием и разрешениями.
После долгих поисков выяснилось, что это может быть связано с какой-то ошибкой Samba POSIX ACL:
- Старый отчет об ошибке Debian 2007 года"samba: неправильно интерпретирует режим создания с помощью POSIX acls"
- "Неправильное поведение списков контроля доступа по умолчанию" похоже, это последний отчет об ошибке для Samba, но, к сожалению, он закрыт как «РЕШЕНО НЕДЕЙСТВИТЕЛЬНО» (преждевременно?).
Наблюдаемое поведение на стороне Linux
Расширенные списки управления доступом для пустого файла Word docx, созданного через контекстное меню проводника Windows (еще не открытого и не сохраненного в 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
При проверке конфигурации Samba в Ubuntu 16.04 LTS выяснилось, что она, похоже, map archive
включена по умолчанию, но для этого должен использоваться бит выполнения владельца, а не бит выполнения группы, так что в моем случае это не было причиной.
$ testparm -s -v 2>&1 | grep 'map archive'
map archive = Yes
Наблюдаемое поведение на стороне Windows
Используя SysInternals Process Monitor и сравнивая редактирование файла .txt с помощью notepad.exe и файла .docx с помощью WINWORD.EXE, офисный пакет выполняет множество сложных действий, создавая временные файлы, переименовывая и т. д. В частности, в отличие от notepad.exe, WINWORD.EXE, похоже, возится со списками контроля доступа. Как видно из procmon
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) — это DACL (дискреционная часть списка управления доступом), где, похоже, была добавлена дополнительная ACE (Access Control Entry). ACE (A;;0x1200a9;;;WD)
добавляется прямо в начало. Вот как я это интерпретирую:
A;
значение разрешить доступ, осталось прежним;
нет наследства0x1200a9;
означаетFILE_GENERIC_READ | FILE_EXECUTE
доступ на чтение и выполнениеWD
означает «каждый» доверительный управляющий
Затем позже, ~WRD0000.tmp
получает переименованный в test.docx
который я видел в мониторе процессов как SetRenameInformationFile
операцию. Так что в конце концов test.docx
заканчивает с некоторыми изменениями ACE, которые word сделал по какой-то причине.