[samba] samba не сверяет клиента с владельцем файла

Alexander Bokovoy =?iso-8859-1?q?ab_=CE=C1_altlinux=2Eorg?=
Пн Сен 1 16:08:16 MSD 2008


2008/9/1 Pavel I. Kaleda <pik на ntlab.ru>:
> Alexander Bokovoy пишет:
>>
>> 2008/9/1 Pavel I. Kaleda <pik на ntlab.ru>:
>>
>>>
>>> Доброго времени суток!
>>>
>>> Сегодня обнаружил неожиданную вещь: на паре моих серверов Samba не
>>> сверяет
>>> пользователя-клиента и пользователем файла.
>>>
>>> В итоге, например,
>>> 1) пользователь user может удалить файл, принадлежащий root.root
>>> (пользователь root и группа root) и с системной маской прав -rw-r--r--
>>> 2) пользователь user с основной группой group не может удалить файл,
>>> принадлежащий user2.group, хотя тот имеет маску -r--rw-r--
>>>
>>> Подскажите, это проблема сборки samba (у меня стоит 3.0.31-alt1.m40.1)
>>> или
>>> что-то еще?
>>>
>>
>> Скорее всего, что-то с локальными настройками. Чтобы убедиться, что
>> именно происходит, нужно включить отладку на 10 уровне (log level =
>> 10), запротоколировать сессию  и снять сетевой перехват этого
>> соединения с помощью wireshark, чтобы туда вошло все (от момента
>> установления соединения до отключения клиента). Тогда можно будет
>> сказать, что происходит на самом деле.
>>
>
> Александр, настроил лог по IP, лог во вложении.
> В логе смущают строчки типа
>
> [2008/09/01 12:56:59, 5] auth/auth_util.c:debug_unix_user_token(474)
>  UNIX token of user 0
>  Primary group is 0 and contains 0 supplementary groups
> [2008/09/01 12:56:59, 5] smbd/uid.c:change_to_root_user(288)
>  change_to_root_user: now uid=(0,0) gid=(0,0)
>
> Получается, пользователи работают с рутовыми правами?
Нет. Самба переключается между uid-ами когда ей это требуется,
например, чтобы обратиться к своим базам данных, доступ которых
возможен только с административными привилегиями или когда надо
запустить внешние скрипты. Все файловые операции выполняются ровно с
теми правами, которые назначены. Вот, например, для pikki в CIFS
реальности это выглядит так:
[2008/09/01 13:04:04, 10] auth/auth_util.c:debug_nt_user_token(454)
  NT user token of user S-1-5-21-1653764521-3087752772-3696911572-2000
  contains 15 SIDs
  SID[  0]: S-1-5-21-1653764521-3087752772-3696911572-2000
  SID[  1]: S-1-22-2-501
  SID[  2]: S-1-1-0
  SID[  3]: S-1-5-2
  SID[  4]: S-1-5-11
  SID[  5]: S-1-22-2-10
  SID[  6]: S-1-22-2-19
  SID[  7]: S-1-22-2-22
  SID[  8]: S-1-22-2-71
  SID[  9]: S-1-22-2-80
  SID[ 10]: S-1-22-2-81
  SID[ 11]: S-1-22-2-83
  SID[ 12]: S-1-22-2-36
  SID[ 13]: S-1-22-2-37
  SID[ 14]: S-1-22-2-38
  SE_PRIV  0x0 0x0 0x0 0x0

токен пользователя pikki (в "домене" ALTSERVER он имеет rid 2000)
состоит из списка групп, в которые входит юниксовый пользователь pikki
(S-1-22-2-*, все SIDы с префиксом S-1-22-2-* и S-1-22-1-* валидны
только в рамках этой машины).

Вот как оно в юникс реальности выглядит:
[2008/09/01 13:04:04, 5] auth/auth_util.c:debug_unix_user_token(474)
  UNIX token of user 500
  Primary group is 501 and contains 11 supplementary groups
  Group[  0]: 501
  Group[  1]: 10
  Group[  2]: 19
  Group[  3]: 22
  Group[  4]: 71
  Group[  5]: 80
  Group[  6]: 81
  Group[  7]: 83
  Group[  8]: 36
  Group[  9]: 37
  Group[ 10]: 38
[2008/09/01 13:04:04, 5] smbd/uid.c:change_to_user(273)
  change_to_user uid=(500,500) gid=(0,501)
[2008/09/01 13:04:04, 3] smbd/service.c:make_connection_snum(1033)
   (192.168.15.100) connect to service IPC$ initially as user pikki
(uid=500, gid=501) (pid 24733)

Кстати, в логе видно, что установленная кодировка в Самбе не совпадает
с системной:
[2008/09/01 13:04:08, 8] smbd/trans2.c:get_lanman2_dir_entry(1161)
  get_lanman2_dir_entry:readdir on dirptr 0x803d6fa0 now at offset 1443961003
[2008/09/01 13:04:08, 8] smbd/dosmode.c:dos_mode(371)
  dos_mode: ./учет.pdf
[2008/09/01 13:04:08, 8] smbd/dosmode.c:dos_mode_from_sbuf(188)
  dos_mode_from_sbuf returning r
[2008/09/01 13:04:08, 8] smbd/dosmode.c:dos_mode(409)
  dos_mode returning r
[2008/09/01 13:04:08, 5] smbd/trans2.c:get_lanman2_dir_entry(1255)
  get_lanman2_dir_entry found ./учет.pdf fname=учет.pdf
[2008/09/01 13:04:08, 3] lib/charcnv.c:convert_string_internal(265)
  convert_string_internal: Conversion error: Illegal multibyte
sequence(‡РµС‚.pdf)
[2008/09/01 13:04:08, 3] lib/charcnv.c:convert_string_internal(244)
  convert_string_internal: Conversion error: Incomplete multibyte
sequence(..ет.pdf)
[2008/09/01 13:04:08, 3] lib/charcnv.c:convert_string_internal(244)
  convert_string_internal: Conversion error: Incomplete multibyte
sequence(.ет.pdf)
[2008/09/01 13:04:08, 3] lib/charcnv.c:convert_string_internal(265)
  convert_string_internal: Conversion error: Illegal multibyte sequence(‚.pdf)
[2008/09/01 13:04:08, 3] lib/charcnv.c:convert_string_internal(244)
  convert_string_internal: Conversion error: Incomplete multibyte
sequence(...pdf)
[2008/09/01 13:04:08, 3] lib/charcnv.c:convert_string_internal(244)

Нужно с этим тоже разобраться, судя дальше по логу, там есть и
нормальные русскоязычные файлы, так что этот скорее всего "битый".

Итак, с удалением файла:
[2008/09/01 13:05:45, 3] smbd/process.c:switch_message(927)
  switch message SMBunlink (pid 24734) conn 0x8045b5d0
[2008/09/01 13:05:45, 4] smbd/uid.c:change_to_user(183)
  change_to_user: Skipping user change - already user
[2008/09/01 13:05:45, 3] smbd/reply.c:reply_unlink(2124)
  reply_unlink : print.pdf
[2008/09/01 13:05:45, 5] smbd/filename.c:unix_convert(147)
  unix_convert called on file "print.pdf"
[2008/09/01 13:05:45, 10] smbd/statcache.c:stat_cache_lookup(215)
  stat_cache_lookup: lookup failed for name [PRINT.PDF]
[2008/09/01 13:05:45, 5] smbd/statcache.c:stat_cache_add(140)
  stat_cache_add: Added entry (803d6f10:sizea) PRINT.PDF -> print.pdf
[2008/09/01 13:05:45, 5] smbd/filename.c:unix_convert(241)
  conversion finished print.pdf -> print.pdf
[2008/09/01 13:05:45, 10] smbd/reply.c:can_delete(1844)
  can_delete: ./print.pdf, dirtype = 6
[2008/09/01 13:05:45, 8] smbd/dosmode.c:dos_mode(371)
  dos_mode: ./print.pdf
[2008/09/01 13:05:45, 8] smbd/dosmode.c:dos_mode_from_sbuf(188)
  dos_mode_from_sbuf returning
[2008/09/01 13:05:45, 8] smbd/dosmode.c:dos_mode(409)
  dos_mode returning
[2008/09/01 13:05:45, 3] smbd/dosmode.c:unix_mode(142)
  unix_mode(./print.pdf) returning 0644
[2008/09/01 13:05:45, 10] smbd/open.c:open_file_ntcreate(1184)
  open_file_ntcreate: fname=./print.pdf, dos_attrs=0x80
access_mask=0x10000 share_access=0x0 create_disposition = 0x1
create_options=0x0 unix mode=0644 oplock_request=0
[2008/09/01 13:05:45, 8] smbd/dosmode.c:dos_mode(371)
  dos_mode: ./print.pdf
[2008/09/01 13:05:45, 8] smbd/dosmode.c:dos_mode_from_sbuf(188)
  dos_mode_from_sbuf returning
[2008/09/01 13:05:45, 8] smbd/dosmode.c:dos_mode(409)
  dos_mode returning
[2008/09/01 13:05:45, 10] smbd/open.c:open_file_ntcreate(1347)
  open_file_ntcreate: fname=./print.pdf, after mapping access_mask=0x10000
[2008/09/01 13:05:45, 5] smbd/files.c:file_new(123)
  allocated file structure 8279, fnum = 12375 (1 used)

То есть, мы открываем файл с атрибутом "удалить при закрытии". Файл
сам имеет атрибуты rw-r--r--. В этот момент smbd работает с правами
uid=500, gid=0, euid=500, egid=501. То есть, на самом деле, обращения
к файлу идут пользователем 500, группой 501.

-- 
/ Alexander Bokovoy


Подробная информация о списке рассылки Samba