Протокол smb для расширенного устранения неполадок

Использование winbind

Сервис winbind является новым средством, предназначенным для более полной интеграции Samba в домены Windows; он появился, начиная с Samba 2.2.0. Данный сервис считывает свою конфигурацию из /etc/samba/smb.conf и динамически взаимодействует с PDC домена, автоматически синхронизируя списки пользователей и групп домена и машины Samba. Таким образом, winbind является весьма удобным средством для автоматического поддержания актуальности базы пользователей домена на рабочих станциях Samba.

Работа данного сервиса происходит без изменения содержимого каких-либо авторизационных файлов в /etc и при перезагрузке машины доменные пользователи появляются в системе только после запуска winbindd. Если во время работы остановить winbindd, то доменные пользователи и группы не исчезнут из системы до перезагрузки, однако динамического обновления списков имен и паролей происходить не будет.

Для того чтобы при рестарте компьютера (или только сервиса winbindd) не нарушались соответствия внутренних UID и доменных SID, он сохраняет текущее состояние списков в файлах /var/cache/samba/winbindd*.tdb.

Для нормального функционирования winbindd в файле /etc/samba/smb.conf обязательно должны быть обьявлены следующие директивы:

Диапазон номеров локальных пользователей, который будет использован для динамического создания пользователей домена:

winbind uid = 10000-20000

Диапазон номеров локальных групп пользователей, который будет использован для динамического создания групп пользователей домена:

winbind gid = 10000-20000

Символ-разделитель, используемый для составления доменных имен пользователей и располагающийся между именем домена и именем пользователя:

winbind separator = +

Интервал времени (в секундах) между запросами winbind к PDC в целях синхронизации списков пользователей и групп:

winbind cache time = 10

Шаблон имени домашних каталогов доменных пользователей, автоматически присваиваемых каждому пользователю. Сами каталоги, однако, динамически не создаются. Вместо переменой %D подставляется имя домена, а  вместо %U подставляется имя пользователя:

template homedir = /home/%D/%U

Командный интерпретатор, назначаемый по умолчанию для пользователей, авторизованных через winbindd.

template shell = /bin/bash

Также необходимо внести изменения в файле /etc/nsswich.conf в разделы passwd и group, вписав директиву winbind — например, таким образом:

passwd: files winbind
group: files winbind

С этого момента можно использовать имена доменных пользователей в /etc/samba/smb.conf с целью разграничения доступа, в правах на файлы и каталоги, для подключения к сетевым ресурсам данного хоста со стороны других хостов.

Что уже было сделано

В предыдущей статье
мы создали публичный ресурс SUPPER, и непубличный ресурс с доступом для членов
группы CHORES. Перед этим были сделаны глобальные настройки — они относятся ко
всем общим ресурсам сразу. Вот эти глобальные параметры:

workgroup             = FED-CENTRAL
security              = user
client schannel       = yes
server schannel       = yes
map to guest          = Bad User
guest account         = nobody
unix password sync    = yes
valid users           = mick, knute, pepe, skippy, nobody
read list             = knute, pepe, skippy
write list            = mick

Внимательный читатель может обратить внимание, что я опустил параметр admin users, хотя во второй статье серии этот параметр был установлен в mick. Это моя ошибка

По крайней мере в системах типа Ubuntu, при установке этого параметра нарушаются связи взаимодействия Samba и прав доступа на файл в системе Linux. Поэтому параметр admin users лучше очищать.

Напомню, что пользователи из списка admin users получают привилегии пользователя root после аутентификации в Samba. Другими словами, если параметру admin users присвоено значение mick, тогда каждый раз когда он будет входить на Samba-ресурс, он фактически будет входить в систему под пользователем root. Таким образом, пользователь mick по сути обладает привилегиями администратора, и действия его ничем не ограничены. На практике последствия такой настройки могут быть совершенно непредсказуемыми.

Рассмотрим для примера мою систему Ubuntu 8.04. Допустим, параметру admin users установлено значение mick. Давайте создадим каталог, владельцем которого будет пользователь mick, а права доступа — (или 0700), а затем создадим Samba-ресурс, соответствующий этому каталогу, причем на нем не должно быть настройки гостевого входа или доступа только на чтение (такую мы настроим чуть позже).

Теперь если я попробую соединиться с этим ресурсом с помощью команды:

bash-$ smbclient //CASA_DE_MICK/BUZZ-OFF -U mick

и введу правильный пароль пользователя mick, тогда на самом деле я должен буду прозрачно войти в систему как root. Однако на самом деле произойдет следующее:

Domain= OS= Server=
tree connect failed: NT_STATUS_ACCESS_DENIED

Как же это возможно? Доступ не должен быть ограничен ничем, ведь мы работаем от root, не так ли? Однако доступ все-таки будет запрещен, потому что по логике Samba ресурс не принадлежит пользователю root. Такое поведение может встречаться на системах, отличных от Ubuntu, а может и не встречаться. Как мне кажется, влияние параметра admin users непредсказуемо влияет на поведение системы.

Как я уже говорил в прошлый раз, возможность использования пользователями Samba-ресурса от имени пользователя root в любом случае небезопасна.
Samba-клиент — не самое лучшее средство администрирования. Вот, как минимум две причины, чтобы оставить параметр admin users пустым.

Продолжим рассмотрение параметров, отвечающих за конкретные ресурсы. Переменные файла smb.conf, задающие настройки для ресурса SUPPER и установленные с помощью средства Swat, выглядят следующим образом:

path          = /home/mick/supper
read only     = yes
guest ok      = yes
invalid user  = root
valid users   = 
read list     = 
write list    = mick
admin users   = 
hosts allow   = 192.168.44
hosts deny    = ALL
create mask   = 0644
browseable    = yes
available     = yes

Для ресурса CHORES все параметры такие же, за исключением следующих:

path          = /home/mick/chores
guest ok      = no
valid users   = +users

Что означают все эти переменные? Их предназначение тщательно объяснено в
предыдущих статьях, официальные сведения можно найти в man-странице
smb.conf(5). Некоторые параметры из приведенных здесь нам еще понадобятся,
когда мы будем создавать разделяемый ресурс с ограниченным доступом.

Настройка общих ресурсов Samba

У каждого ресурса есть свой раздел в файле конфигурации /etc/samba/smb.conf. Разделы ресурсов расположены после глобальных параметров и имеют следующий вид

share_name — имя ресурса, используемое при доступе.path — полный путь к ресурсу в файловой системе.browsable — опоеделяет видимость ресурса для других пользователей, но не дает им прав доступа.read only — определяет возможность доступа на запись для пользователей, указанных в параметре valid users.force create mode — задает указанные права доступа к любому файлу, создаваемому в ресурсе.force directory mode — задает указанные права доступа к любой директории, создаваемой в ресурсеvalid users — список пользователей, имеющих доступ к ресурсу. Здесь можно указывать имена или группы, перед группами нужно указывать символ @, например, @admins.

Для настройки конфигурации ресурса нужно в любом текстовом редакторе добавить в файл конфигурации блоки следующего вида для каждого пользователя:

Для ресурса everyone блок будет выглядеть следующим образом:

Все пользователи будут иметь доступ на чтение и запись, так как были добавлены в группу sambashare при создании. Теперь нужно протестировать параметры

$testparm

Если все настроено корректно, результат будет следующим:

После проверки конфигурации запустим сервер и добавим его в автозагрузку командой systemctl:

$sudo systemctl start smbd.service $sudo systemctl enable smbd.service

Сервер работает и готов принимать пользователей.

Проверка брандмауэра

Если имеется только локальный IP-адрес, а адрес для общедоступной маршрутизации отсутствует, то скорее всего, сетевой профиль имеет значение общедоступный. Это означает, что по умолчанию SMB блокируется в брандмауэре.

Следующая команда показывает, какой профиль подключения используется. Для получения этих сведений можно также использовать центр управления сетями и общим доступом.

Get-Нетконнектионпрофиле

В группе » общий доступ к файлам и принтерам » проверьте правила входящего трафика брандмауэра, чтобы убедиться в том, что для правильного профиля включен протокол SMB-in.

Также можно включить общий доступ к файлам и принтерам в окне центр управления сетями и общим доступом . Для этого выберите изменить дополнительные параметры общего доступа в меню слева, а затем выберите включить общий доступ к файлам и принтерам для профиля. Этот параметр включает правила брандмауэра для общего доступа к файлам и принтерам.

NAME MANGLING

Samba supports so that DOS and Windows clients can use files that don’t
conform to the 8.3 format. It can also be set to adjust the case of 8.3 format filenames.

There are several options that control the way mangling is performed, and they are grouped here rather
than listed separately. For the defaults look at the output of the testparm program.

These options can be set separately for each service.

The options are:

case sensitive = yes/no/auto

controls whether filenames are case sensitive. If they aren’t, Samba must do a filename search and match on
passed names. The default setting of auto allows clients that support case sensitive filenames (Linux CIFSVFS
and smbclient 3.0.5 and above currently) to tell the Samba server on a per-packet basis that they wish to
access the file system in a case-sensitive manner (to support UNIX case sensitive semantics). No Windows or
DOS system supports case-sensitive filename so setting this option to auto is that same as setting it to no
for them. Default auto.

default case = upper/lower

controls what the default case is for new filenames (ie. files that don’t currently exist in the filesystem).
Default lower. IMPORTANT NOTE: As part of the optimizations for directories containing
large numbers of files, the following special case applies. If the options
, , and
are set, then the case of all
incoming client filenames, not just new filenames, will be modified. See additional notes below.

preserve case = yes/no

controls whether new files (ie. files that don’t currently exist in the filesystem) are created with the case
that the client passes, or if they are forced to be the case. Default
yes.

short preserve case = yes/no

controls if new files (ie. files that don’t currently exist in the filesystem) which conform to 8.3 syntax,
that is all in upper case and of suitable length, are created upper case, or if they are forced to be the
case. This option can be used with to permit
long filenames to retain their case, while short names are lowercased. Default yes.

Создание ограниченного ресурса

Напомню, что наш Samba-сервер содержит четыре пользовательских аккаунта: pepe,
skippy, knute, mick — это три моих квартиранта и я сам. Эти учетные записи
являются стандартными учетными записями UNIX, и им соответствуют отдельные
записи в базе данных пользователей Samba-сервера. Как создавать и
синхронизировать учетные записи пользователей Samba, было рассказано
во
второй статье этой серии.

Итак, к нашему ограниченному ресурсу BUZZ-OFF может обращаться лишь один
пользователь — mick. Он будет иметь доступ как на чтение, так и на записть. Все остальные пользователи не будут иметь никаких прав доступа на этот ресурс. Соответственно, при создании каталога данного ресурса, нужно установить владельцем пользователя mick, а права доступа — 0700 (u+rwx,g-rwx,o-rwx), к примеру так:

drwx------ 2 mick users 4096 2008-11-04 00:00 buzz-off

На рисунке 1 показаны первые настройки, которые нужно прописать сразу после создания ресурса в базовом режиме просмотра Swat.


Рисунок 1. Ограниченный ресурс, базовые настройки

После установки пути path, устанавливаем параметр read only в значение no — ведь пользователь mick будет создавать здесь новые файлы, а параметр guest ok, разумеется, в no — мы не хотим давать анонимного доступа к ресурсу. Параметры hosts allow и hosts deny оставим такими же, как и для других ресурсов — а именно дадим доступ для IP-адресов из локальной сети (в вашей локальной сети, скорее всего, другой диапазон IP-адресов).

Присвоим переменной browseable значение no — мы не хотим, чтобы ресурс даже появлялся в Сетевом окружении или smbtree других пользователей. Теперь, чтобы подключиться к этому ресурсу, мы должны будем указать явный путь к нему.

Присвоим пока параметру available значение no. Нажмем кнопку Commit Changes, переключимся в расширенный режим с помощью кнопки Advanced. Нужно произвести еще здесь несколько настроек, см. рисунок 2.


Рисунок 2. Ограниченный ресурс, расширенные настройки

Как вы видите, мы собираемся очистить список valid users, за исключением mick, и полностью очистим список read list. Параметр write list, однако, будет содержать единственного mick.

Одна настройка, которую нужно будет поменять — это параметр create mask, которому нужно присвоить значение 0600. Это отличается от маски 0700, которую мы устанавливали на создание каталогов; каталогам необходимо право на исполнение, иначе нельзя будет в них войти, однако содержимому каталога, т.е. файлам, это совершенно необязательно.

Теперь можем включить ресурс (устанавливаем значение available в yes, нажимаем Commit Changes). Теперь наш ограниченный ресурс готов к использованию!

Чтобы это проверить, удостоверимся, что ресурс не отображается в списке локальных ресурсов. Это можно сделать, к примеру, с помощью утилиты smbtree, так:

bash-$ smbtree -N -b
FED-CENTRAL
   \\CASA_DE_MICK   iwazaru-ubuntu server (Samba, Ubuntu)
      \\CASA_DE_MICK\print$   Printer Drivers
      \\CASA_DE_MICK\SUPPER   Mick's menus
      \\CASA_DE_MICK\CHORES   Chore lists
      \\CASA_DE_MICK\IPC$     IPC Service (iwazaru-ubuntu server (Samba, Ubuntu))

Действительно, новый ресурс BUZZ-OFF не отображается в списке ресурсов. Но ведь он должен быть доступен пользователю mick, владельцу. Давайте проверим с помощью smbclient:

bash-$ smbclient //CASA_DE_MICK/BUZZ-OFF -U mick
Password: ********
Domain= OS= Server=
smb: \> 

Работает. Мы получили приглашение Samba! Нет причин не попробовать вывести список файлов:

smb: \> dir
  .                        D        0  Tue Nov  4 23:17:34 2008
  ..                       D        0  Tue Nov  4 23:17:34 2008
  access-log_10312008.txt         665  Tue Nov  4 23:17:34 2008

        52008 blocks of size 262144. 13229 blocks available
smb: \> exit

Итак, все работает, как мы предполагали. Последняя проверка — хочу войти в ресурс как гость. Запомните, что если клиент ввел несуществующее имя пользователя, тогда Samba-сервер будет рассматривать его как гостя:

bash-$ smbclient //CASA_DE_MICK/BUZZ-OFF -U totallyfakeuser
Password: ********
Domain= OS= Server=
tree connect failed: NT_STATUS_ACCESS_DENIED

Произошла ошибка доступа, как и предполагалось.

Настройка прав доступа на файлы в Samba

Сделаю небольшое пояснение по правам доступа в файловом сервере samba. Вопрос этот сложный и объемный. Ему можно посвятить и отдельную статью. Но для полноты картины по настройке самбы, расскажу самое основное.

Как я уже ранее сказал, изменять права доступа к каталогам на файловом сервере можно с помощью команды setfacl. Давайте сейчас посмотрим на права доступа, которые установлены:

# getfacl /mnt/samba

# file: mnt/shara
# owner: admin51
# group: пользователи\040домена
user::rwx
group::r-x
other::---

С такими правами что-то создавать в папке сможет только пользователь admin51, а пользователи домена смогут только просматривать файлы и каталоги. Сделаем более прикладной вариант. Добавим права доступа на чтение и запись еще одной доменной группе — gr_it.

# setfacl -m g:gr_it:rwx /mnt/shara

Обращаю внимание, что иногда при копировании команд setfacl они не отрабатывают, выдавая не очень понятную ошибку:

setfacl: Option -m: Invalid argument near character 1

Наберите команду с клавиатуры, либо просто удалите и наберите снова ключ -m, он почему-то при копировании часто дает эту ошибку.

Смотрим, что получилось:

# getfacl /mnt/shara

# file: mnt/shara
# owner: admin51
# group: пользователи\040домена
user::rwx
group::r-x
group:gr_it:rwx
mask::rwx
other::---

То, что надо. Теперь пользователи группы gr_it имеют полные права на шару. Создадим одним таким пользователем папку test1 на нашей шаре и посмотрим, какие права она получит.

# getfacl /mnt/shara/test1

# file: mnt/shara/test1
# owner: user1
# group: пользователи\040домена
user::rwx
group::---
other::---

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

# setfacl -m d:g:gr_it:rwx,d:g:'пользователи домена':rx /mnt/shara

Смотрим, что получилось:

# getfacl /mnt/shara

# file: mnt/shara
# owner: admin51
# group: пользователи\040домена
user::rwx
group::r-x
group:gr_it:rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:пользователи\040домена:r-x
default:group:gr_it:rwx
default:mask::rwx
default:other::---

Создадим теперь тем же пользователем еще одну папку test2 и проверим ее права.

# getfacl /mnt/shara/test2

# file: mnt/shara/test2
# owner: user
# group: пользователи\040домена
user::rwx
group::---
group:пользователи\040домена:r-x
group:gr_it:rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:пользователи\040домена:r-x
default:group:gr_it:rwx
default:mask::rwx
default:other::---

Применилось наследование с вышестоящих папок. Не забывайте про дефолтные права и учитывайте их при настройке прав доступа на файловом сервере.

Для удобной и корректной работы с правами доступа я обычно для крупных, корневых директорий выставляю права аккуратно через setfacl в консоли. Какие-то мелкие изменения по пользователям и группам в более низших иерархиях директорий делаю через windows acl с какой-нибудь виндовой машины.

Еще важно знать одну особенность выставления прав доступа в linux. В моей практике часто требуется дать какому-нибудь пользователю доступ в одну директорию, которая располагается там, где у пользователя нет вообще никаких прав

В windows эта проблема решается просто — даются права на конкретную папку, а пользователю кладется ярлык на эту папку. В итоге он имеет доступ к нужной директории и больше никуда.

В linux так сделать не получится. Для того, чтобы дать таким образом доступ на отдельную директорию пользователю, необходимо, чтобы по всем вышестоящим директориям у него были права на исполнение, то есть X. Их придется выставлять вручную по всем вышестоящим папкам. Результат будет такой же, как и в винде — пользователь получит доступ на чтение только в указанную папку, но для этого придется выполнить больше действий. Если не знаешь этот нюанс, можно потратить много времени, прежде чем поймешь, в чем проблема.

Решение проблем

Проблемы подключения к Windows 7 — mount error(12): cannot allocate memory

Известная ошибка Windows 7 «mount error(12): cannot allocate memory» может быть исправлена установкой пары ключей в реестре системы Windows:

  • (установить значение )
  • (установить значение )

В качестве альтернативы можно запустить командную строку от имени Администратора и выполнить следующее:

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v "LargeSystemCache" /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v "Size" /t REG_DWORD /d 3 /f

Выполните одно из следующих действий, чтобы изменения вступили в силу:

  • Перезагрузите Windows
  • Перезапустите службу на сервере через services.msc
  • Выполните в командной строке и ; после остановки служба может перезапуститься автоматически

Примечание: Поиск решения в интернете подскажет другое решение, рекомендующее пользователям добавить ключ, изменяющий размер «IRPStackSize». Это неправильное решение для устранения проблемы в Windows 7. Не применяйте его

Проблемы получения доступа к ресурсам, защищенным паролем, из Windows

Обратите внимание, что это должно быть добавлено в локальный файл smb.conf, а не в файл сервера

# lanman fix
client lanman auth = yes
client ntlmv2 auth = no

Диалоговое окно появляется с большой задержкой

У меня была проблема, связанная с тем, что диалоговое окно для ввода пароля появлялось с задержкой около 30 секунд, когда я пытался установить соединение из Windows XP/Windows 7. Когда я посмотрел файл error.log на сервере, я увидел:

[2009/11/11 06:20:12,  0] printing/print_cups.c:cups_connect(103)
Unable to connect to CUPS server localhost:631 - Interrupted system call

Эта опция предотвращает поиск cups и файла /etc/printcap:

printing = bsd
printcap name = /dev/null

Ошибка: Failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL

Если вы являетесь домашним пользователем, используете samba исключительно для организации общего доступа к файлам с сервера или NAS и не заинтересованы в организации общего доступа к принтерам, вы можете исправить эту ошибку, добавив следующие строки в файл /etc/samba/smb.conf:

load printers = No
printing = bsd
printcap name = /dev/null
disable spoolss = Yes

Перезапустите samba:

systemctl restart smbd

…проверьте ваши логи:

cat /var/log/samba/smbd.log

и больше ошибка не должна появляться.

Не удается предоставить общий доступ к папке

Проблема проявляется в том, что, когда вы пытаетесь предоставить общий доступ к папке через Dolphin (файловый менеджер), и вначале, вроде бы, все работает нормально, после перезапуска Dolphin иконка ресурса исчезла из папки, а в терминале (Konsole) вы видите следующий вывод:

‘net usershare’ returned error 255: net usershare: usershares are currently disabled

Для решения проблемы включите пользовательские общие ресурсы, как это описано в разделе .

И вы используете firewall (iptables), поскольку не доверяете вашей локальной (школа, университет, отель) сети. Это может происходить по следующей причине: когда smbclient просматривает локальную сеть, он посылает широковещательный запрос на udp-порт 137. Затем серверы сети отвечают вашему клиенту, но, поскольку исходный адрес ответа отличается от адреса назначения, который видел iptables при отправке запроса, iptables не признает ответ как «установленное соединение» или «относящийся к запросу», и, следовательно, пакет отбрасывается. Возможное решение — добавление:

iptables -t raw -A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns

в вашу конфигурацию iptables.

Подключение к серверу завершилось неудачей: (Error NT_STATUS_UNSUCCESSFUL)

Вероятно, вы указываете неправильное имя сервера. Чтобы узнать его, запустите на сервере команду и найдите строку «Transient hostname».

Применение пакета

SAMBA осуществляет связь между UNIX- и Windows-системами в сети (расширяя сетевые возможности ОС UNIX). Пакет SAMBA представляет собой интерфейс, который обеспечивает связь компьютеров с Microsoft Corporation и компьютеров с UNIX. Благодаря SAMBA пользователь, работая на UNIX–системе, может разрешить доступ к сетевым дискам и принтерам Microsoft Windows. Для клиентов это выглядит таким образом, будто продолжает работать NT-сервер. Клиенты могут использовать сетевое окружение Windows, подсоединять и отсоединять сетевые диски, а также использовать данные на сетевом сервере, не ощущая, работает сервер под UNIX или Microsoft Windows. Клиенты могут обращаться к UNIX–файлам, изменять и удалять их (если позволяют права). Таким образом, SAMBA фактически исполняет функции NT–сервера.

Вывод о различиях между SMB, CIFS и Samba

Так в чем же разница между SMB, CIFS и Samba? Мы можем сказать что SMB был первоначальным протоколом, появившимся в 1980-х годах. Он был создан IBM для обмена файлами и доступа к принтерам. Со временем были разные версии. В основном он использовался в Windows и DOS.

SMB — это расширение CIFS. Он распространился с начала 90-х годов с использованием Windows 95. С этого момента CIFS перестал быть настолько широко распространенным.

В свою очередь, CIFS так позже стала известна первоначальная версия SMB, когда Microsoft начала использовать ее в своих системах. У него были определенные реализации, позволяющие подключать несколько платформ, таких как Windows или Linux. Однако в настоящее время CIFS практически не используется. С другой стороны, мы можем найти последние версии SMB, такие как SMB 2 или SMB 3.

Наконец, самба это реализация вышеизложенного с открытым исходным кодом. Бесплатная реализация, позволяющая использовать его в различных системах, таких как Linux, macOS или Unix. При этом он был выпущен в начале 1990-х годов.

В конечном счете, это основные моменты, о которых следует помнить, когда мы сталкиваемся с терминами SMB, CIFS и Samba. Как мы видим, это протоколы и реализации, которые позволяют обмениваться файлами или получать доступ к принтерам. Они появились в разное время, хотя все трое древние. Первая версия SMB появилась в 1983 году и была создана IBM, а Samba — в 1990-х. Это означает, что, как мы видели, мы должны принимать меры безопасности и не включать устаревшие протоколы, которые могут использоваться хакерами, эксплуатировать уязвимости и красть информацию или брать под контроль ваш компьютер.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: