SMB и Samba в Linux: подключение к общей папке Windows, создание сетевых папок в Linux

Книга по SMB и Samba на русском языке. Оглавление

1. SMB: настройка общей сетевой папки в Windows

2. SMB и Samba в Linux: подключение к общей папке Windows, создание сетевых папок в Linux

2.1. Samba — это SMB для Linux

2.2 Как в Linux увидеть все компьютеры Windows с совместными ресурсами

2.3 Как в Linux вывести доступные по сети ресурсы (совместные папки и принтеры Windows)

2.4 Как подключиться к сетевой папке Windows из Linux

2.5 Команды SMB в Linux

2.6 Автоматическое выполнение команд в сетевой папке Windows

2.7 Как смонтировать общую папку Windows/Samba в Linux

2.8 Настройка автоматического монтирования сетевой папки в Linux

2.9 Как создать общую сетевую папку в Samba

3. Аудит безопасности SMB и Samba


Samba — это SMB для Linux

SMB — это протокол, технология, которая позволяет создать файловые сервер. В первой части я говорил, что в Linux функции сервера и клиента SMB выполняет Samba. Это не совсем так, на самом деле, в настоящее время Samba не только реализует возможности SMB, но и дублирует функционал сервера Доменов Active Directory (технология Windows, позволяющая управлять множеством компьютеров — кстати, про Active Directory скоро будет большой материал на HackWare.ru).

Далее мы будем говорить про Samba, но мы затронем только вопросы SMB.

Начните с установки пакета samba.

В Debian, Linux Mint, Ubuntu, Kali Linux и их производных для установки samba выполните команду:

sudo apt install samba

В Arch Linux, BlackArch и их производных выполните команду:

sudo pacman -S samba

Как в Linux увидеть все компьютеры Windows с совместными ресурсами

Для показа всех совместных сетевых ресурсов Windows выполните команду:

smbtree -N

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

Пример вывода:

WORKGROUP
	\\VYACHESLAV     		
		\\VYACHESLAV\Users          	
		\\VYACHESLAV\IPC$           	Удаленный IPC
		\\VYACHESLAV\1 Для Принтера	
	\\RT-N66U        		RT-N66U
		\\RT-N66U\IPC$           	IPC Service (RT-N66U)
	\\HACKWARE-SERVER		
	\\HACKWARE-MIAL

В начале идёт имя рабочей группы WORKGROUP. Затем следует список компьютеров. Для тех из них, для которых удаётся получить список сетевых папок, они выводятся.

Как можно увидеть выше, для компьютера \\VYACHESLAV получен список совместно используемых ресурсов, а для компьютера \\HACKWARE-MIAL — нет. При этом если я включал на компьютере \\HACKWARE-MIAL поддержку протокола SMB 1, а при запуске команды указывал хоть какое-то имя пользователя, например:

smbtree -U qqwee -N

либо просто запускал smbtree с правами администратора:

sudo smbtree -N

то мне удавалось получить список файлов также и для компьютера \\HACKWARE-MIAL.

Как в Linux вывести доступные по сети ресурсы (совместные папки и принтеры Windows)

Предыдущая команда показала нам несколько компьютеров с сетевыми папками. Предположим, меня интересует компьютер \\HACKWARE-MIAL, чтобы вывести его сетевые папки я запускаю команду вида:

sudo smbclient -L \\ИМЯ-КОМПЬЮТЕРА -N

в моём случае это:

sudo smbclient -L \\HACKWARE-MIAL -N

Кстати, вместо имени компьютера можно указать IP адрес.

В полученном выводе половину информации составляют сообщения о различных проблемах. Значимые данные:

	Sharename       Type      Comment
	---------       ----      -------
	ADMIN$          Disk      Удаленный Admin
	C$              Disk      Стандартный общий ресурс
	IPC$            IPC       Удаленный IPC
	Share           Disk      
	Users           Disk      

В полученном выводе Share и Users являются общими сетевыми папками.

Следующие ошибки:

Unable to initialize messaging context
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it

исчезнут, если создать файл /etc/samba/smb.conf.

Следующие ошибки

Reconnecting with SMB1 for workgroup listing.
protocol negotiation failed: NT_STATUS_CONNECTION_RESET
Unable to connect with SMB1 -- no workgroup available

пропадут, если на компьютере с сетевой папкой включить поддержку протокола SMB1.

Как я уже говорил чуть выше, флаг -N означает не использовать пароль. Если же вы используете пароль, то укажите опцию -U с именем пользователя, пароль нужно будет ввести интерактивно.

Как и для smbtree, для smbclient необязательно использовать sudo, но без sudo для некоторых компьютеров программа срабатывает нормально, а для некоторых завершается ошибкой:

session setup failed: NT_STATUS_ACCESS_DENIED

Как подключиться к сетевой папке Windows из Linux

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

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

Для входа в интерактивный режим запустите команду вида:

sudo smbclient //ИМЯ-КОМПЬЮТЕРА/Папка -N

Например, я хочу подключиться к компьютеру //HACKWARE-MIAL/ и выполнить действия с файлами в сетевой папке Share, тогда моя команда следующая:

sudo smbclient //HACKWARE-MIAL/Share -N

Если вы хотите, чтобы при подключении была изменена текущая рабочая директория в сетевой папке, то есть чтобы была открыта другая папка, то используйте опцию -D. К примеру, я хочу подключиться к папке NewFolder, тогда команда следующая:

sudo smbclient //HACKWARE-MIAL/Share -N -D NewFolder

Подключение к SMB папке, требующий авторизации

К примеру, на компьютере //HACKWARE-MIAL/ имеется сетевая папка ShareRestricted, права на просмотр которой есть у пользователя ShareOverlord. Для просмотра шары, защищённой паролем, нужно использовать команду вида:

sudo smbclient //ИМЯ-КОМПЬЮТЕРА/Папка -U ИМЯ-ПОЛЬЗОВАТЕЛЯ

В моём случае это команда:

sudo smbclient //HACKWARE-MIAL/ShareRestricted -U ShareOverlord

Команды SMB в Linux

Доступны следующие интерактивные команды:

Выводит все доступные команды:

help

Для показа справки по определённой команде, выполните

help КОМАНДА

Переход в другой каталог (смена текущей рабочей директории) на удалённой системе:

cd ПАПКА

Переход в другую директорию на локальной системе:

lcd

Удаление файла в шаре:

del ИМЯ_ФАЙЛА

Имеется псевдоним этой команды:

rm ИМЯ_ФАЙЛА

И ещё одна команда со схожей функцией:

deltree ШАБЛОН_ИМЕНИ

Эта команда рекурсивно удалить все совпавшие с шаблоном имени файлы и директории.

Показ файлов и папок в текущей папке:

dir

Имеется псевдоним этой команды:

ls

И ещё один, даже более короткий псевдоним:

l

Скачать файлы с общей папки:

get <ИМЯ_УДАЛЁННОГО_ФАЙЛА> [ЛОКАЛЬНОЕ_ИМЯ]

Для повторного скачивания файла:

reget <ИМЯ_УДАЛЁННОГО_ФАЙЛА> [ЛОКАЛЬНОЕ_ИМЯ]

Для скачивания всех файлов, чьём имя совпадает с шаблоном:

mget ШАБЛОН_ИМЕНИ

Например, чтобы скачать все файлы с файловым расширением .exe нужно запустить такую команду:

mget "*.exe"

Для каждого файла, совпавшего с шаблоном, будет выполнен запрос на скачивание. Если вы действительно хотите его скачать, то нажмите клавишу «y»:

Get file ChromeSetup.exe? y

Также имеется команда newer, которая скачивает файлы (mget), которые новее, чем указанный локальный файл. Используется она так:

newer ФАЙЛ

Выгрузка файла на общую папку:

put <ЛОКАЛЬНОЕ_ИМЯ> [ИМЯ_УДАЛЁННОГО_ФАЙЛА]

Следующая команда скопирует локальный файл в шару:

print ИМЯ_ФАЙЛА

Повторная закачка файла:

reput <ЛОКАЛЬНОЕ_ИМЯ> [ИМЯ_УДАЛЁННОГО_ФАЙЛА]

Для закачки всех файлов, чьём имя совпадает с шаблоном:

mput ШАБЛОН_ИМЕНИ

К примеру, чтобы закачать в шару все файлы (из локальной текущей рабочей директории), которые имеют расширение *.cap, нужно запустить команду:

mput "*.cap"

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

Put file wpa.cap? y
putting file wpa.cap as \wpa.cap (335,2 kb/s) (average 277,8 kb/s)
Put file wep.cap? y
putting file wep.cap as \wep.cap (0,6 kb/s) (average 169,1 kb/s)

Включение и отключение рекурсии

Используя команду:

recurse

Можно включать и отключать рекурсивный режим для mget и mput.

Показ всей возможной информации о файле:

allinfo ФАЙЛ

Пример:

allinfo all-databases.sql
altname: ALL-DA~1.SQL
create_time:    Чт авг 29 12:29:51 2019 MSK
access_time:    Вс янв  5 23:31:47 2020 MSK
write_time:     Ср авг  1 09:51:25 2018 MSK
change_time:    Вс янв  5 19:48:36 2020 MSK
attributes: A (20)
stream: [::$DATA], 381945262 bytes

В выводимой информации можно увидеть альтернативное (DOS) имя, временные метки (дата создания, доступа, записи и изменения файла), атрибуты.

Копирование файла на сервере:

scopy <ИСХОДНЫЙ_ФАЙЛ> <НОВЫЙ_ФАЙЛ>

Создание директории:

md ДИРЕКТОРИЯ

Псевдоним:

mkdir ДИРЕКТОРИЯ

Удаление директории:

rd ДИРЕКТОРИЯ

Псевдоним команды:

rmdir ДИРЕКТОРИЯ

Удаление файлов

Следующая команда удалит все совпавшие с МАСКОЙ файлы:

rm МАСКА

Псевдоним команды для удаления файлов:

del МАСКА

С помощью команды wdel можно удалить все совпавшие файлы по подстановочным символам:

wdel АТРИБУТЫ МАСКА

Переименование файлов:

rename ИСХОДНОЕ_ИМЯ НОВОЕ_ИМЯ

Ссылки

Создание жёсткой ссылки Windows:

hardlink ИСТОЧНИК НАЗНАЧЕНИЕ

Создание жёсткой ссылки UNIX:

link СТАРОЕ_ИМЯ НОВОЕ_ИМЯ

Создание символьной ссылки UNIX:

symlink СТАРОЕ_ИМЯ НОВОЕ_ИМЯ

Выход с сервера:

q

Псевдоним:

quit

Второй псевдоним:

exit

Вывод истории команд текущей сессии:

history

Просмотр содержимого текстового файла:

more УДАЛЁННЫЙ_ФАЙЛ

Показ текущей рабочей директории:

pwd

Пример вывода:

Current directory is \\HACKWARE-MIAL\Share\

Другой вариант показа текущей рабочей директории — это команда cd без аргументов:

cd

Пример вывода:


Current directory is \

Создание и извлечение архивов tar

Программа tar используется для объединения нескольких файлов в один файл. Объединение происходит без сжатия. Для того, чтобы несколько файлов из сетевой папки объединить в архив и скачать на локальную систему запустите команду вида:

tar c АРХИВ.tar ФАЙЛ1 ФАЙЛ2 ФАЙЛ3

К примеру, я хочу скачать файлы all-databases.sql besside.log ChromeSetup.exe из совместной папки и объединить их в архив all.tar, тогда моя команда следующая:

tar c all.tar all-databases.sql besside.log ChromeSetup.exe

Если нужно разархивировать файл на локальной системе и всё его содержимое отправить на удалённую общую папку, то запустите команду вида:

tar x АРХИВ.tar

К примеру, я хочу отправить содержимое архива all.tar в общую папку:

tar x all.tar

Для установления режимов tar используется команда

tarmode <full|inc|reset|noreset>

Установка таймаута операций:

timeout <ЧИСЛО>

Таймаут устанавливается в секундах и по умолчанию равен 20.

Установка нового соединения:

logon <ИМЯ_ПОЛЬЗОВАТЕЛЯ> [<ПАРОЛЬ>]

Закрытие сессии, выход:

logoff

Вывод списка открытых подключений:

listconnect

Отображение текущего активного подкючения:

showconnect

Изменение удалённой директории (переход на одну папку выше):

..

Выполнение команд в локальной системе:

!КОМАНДА

Чтобы команда выполнялась не на удалённой системе, а на локальной, поставьте перед ней ! (восклицательный знак), например^

!ls -l

Автоматическое выполнение команд в сетевой папке Windows

Необязательно каждый раз вводить все команды вручную — вы можете перечислить их через запятую и указать в двойных кавычках с опцией -c, например:

sudo smbclient //HACKWARE-MIAL/Share -N -c "cd NewFolder; tar c captures.tar *.cap"

Как смонтировать общую папку Windows/Samba в Linux

Сетевая папка Windows может быть доступна в файловых менеджерах Linux как любая другая локальная папка. Для этого её нужно смонтировать. После монтирования не придётся использовать консоль для просмотра списка файлов и скачивания или закачивания файлов.

Начните с установки пакета cifs-utils.

В Debian, Linux Mint, Ubuntu, Kali Linux и производных выполните:

sudo apt install cifs-utils

В Arch Linux, BlackArch и производных выполните:

sudo pacman -S cifs-utils

Предыдущие команды smbtree и smbclient понимали имена компьютеров Windows, такие имена как HACKWARE-MIAL. Монтирование выполняется с помощью команды mount, которая такие имена не умеет обрабатывать без помощи преобразования имён DNS. Поэтому при монтировании можно либо:

  1. Использовать вместо имён компьютеров IP адрес. В этом случае у компьютера с сетевой папкой должен быть постоянный (статичный) IP адрес
  2. Либо настроить преобразование имён для компьютеров Windows. Это можно сделать, например, с помощью файла /etc/hosts. Кстати, в этом случае у компьютера с общей папкой также должен быть постоянный IP адрес (смотрите Как настроить локальный DNS используя файл /etc/hosts в Linux)

В общем, в любом случае настройте в роутере или в самой Windows постоянный локальный IP.

Если вы хотите настроить преобразование имён с помощью файла /etc/hosts, то откройте его:

sudo gedit /etc/hosts

И добавьте туда запись вида

IP_АДРЕС	ИМЯ_КОМПЬЮТЕРА

Например, у меня IP_АДРЕС это 192.168.0.101, а именем компьютера является HACKWARE-MIAL, тогда я добавляю следующую запись:

192.168.0.101	HACKWARE-MIAL

Пингуем по имени компьютера Windows, чтобы убедиться, что всё сработало:

ping HACKWARE-MIAL

Теперь нам нужно создать точку монтирования — папку, где появятся файлы из шары. Я создаю папку /mnt/share:

sudo mkdir /mnt/share

Теперь для монтирования сетевой шары Windows нужно запустить команду вида:

sudo mount -t cifs -o username=guest,password=,uid=1000,iocharset=utf8 //ИМЯ-КОМПЬЮТЕРА/Папка /точка/монтирования

В этой команде вы должны вставить свои значения для

  • //ИМЯ-КОМПЬЮТЕРА/Папка
  • /точка/монтирования

Значение других элементов команды:

  • sudo — монтировать шару можно и без прав суперпользователя, но использовать опцию -o, после которой указываются опции для монтирования, можно только с правами root
  • -t cifs выбор файловой системы для монтирования
  • -o означает, что после этой опции будут перечислены опции для монтирования:
  • username=guest,password= - произвольное имя пользователя без пароля — используется для подключение к общей папки, для которой не требуется вход. Вместо этой конструкции можно указать просто guest, но в этом случае на некоторых системах всё равно запрашивается пароль. По моим наблюдениям, пароль запрашивается когда имя текущего пользователя на Linux совпадает с именем пользователя на Windows
  • uid=1000 — в качестве владельцев всех файлов в шаре будет указан текущий пользователь Linux
  • iocharset=utf8 — эта кодировка позволяет работать с именами файлов, в которых используются не только латинские буквы

К примеру, путь до сетевой шары у меня //HACKWARE-MIAL/Share, её я хочу смотрировать в папку /mnt/share, тогда команда будет следующей:

sudo mount -t cifs -o username=guest,password=,uid=1000,iocharset=utf8 //HACKWARE-MIAL/Share /mnt/share

Вид сетевой папки Windows в Double Commander:

Вид сетевой папки в стандартном проводнике Linux:

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

sudo umount /mnt/share

Напомню, что в предыдущей части я не только настроил папку для входа без пароля, но на том же самом компьютере и настроил вторую папку с именем ShareRestricted. У этой папки владелец ShareOverlord, а пароль для входа 1234. Для подключения папки, доступ к которой возможен только по паролю, используется та же самая команда, но нужно указать реальные учётные данные:

 sudo mount -t cifs -o username=ShareOverlord,password=1234,uid=1000,iocharset=utf8 //HACKWARE-MIAL/ShareRestricted /mnt/share

Чуть дальше очень похожий набор опций, в том числе пароль в открытом виде, мы будем использовать в файле /etc/fstab для настройки автоматического монтирования сетевой папки. Файл /etc/fstab доступен для чтения всем а, следовательно, также доступен всем ваш пароль от Windows в нём. Чтобы обойти эту проблему, можно использовать файл с учётными данными. Это файл содержит только имя пользователя и пароль.

Используя текстовый редактор, создайте файл с учётными данными для входа на ваш удалённый сервер:

gedit ~/.smbcredentials

В этот файл введите имя пользователя и пароль от Windows:

username=ИМЯ-ПОЛЬЗОВАТЕЛЯ
password=ПАРОЛЬ

В моём примере это:

username=ShareOverlord
password=1234

Сохраните файл и закройте редактор.

Измените права доступа к этому файлу, чтобы предотвратить нежелательный доступ к вашим учётным данным:

chmod 600 ~/.smbcredentials

Посмотрите абсолютный путь до этого файла:

realpath ~/.smbcredentials

В моём случае абсолютный путь:

/home/mial/.smbcredentials

Теперь вместо двух опций:

username=ПОЛЬЗОВАТЕЛЬ,password=ПАРОЛЬ

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

credentials=/home/ПОЛЬЗОВАТЕЛЬ/.smbcredentials

Моя команда стала выглядеть так:

sudo mount -t cifs -o credentials=/home/mial/.smbcredentials,uid=1000,iocharset=utf8 //HACKWARE-MIAL/ShareRestricted /mnt/share

Настройка автоматического монтирования сетевой папки в Linux

Автоматически монтируемые файловые системы прописываются в файле /etc/fstab. Откроем этот файл:

sudo gedit /etc/fstab

Теперь в него нужно добавить строку вида:

//ИМЯ-КОМПЬЮТЕРА/Папка	/точка/монтирования	cifs	credentials=/home/mial/.smbcredentials,uid=1000,iocharset=utf8,nofail	0	0

Для моего примера это строка:

//HACKWARE-MIAL/ShareRestricted	/mnt/share	cifs	credentials=/home/mial/.smbcredentials,uid=1000,iocharset=utf8,nofail	0	0

Сохраним и закроем этот файл. Для проверки выполним:

sudo mount -a

Если сетевая папка успешно смонтировалась, значит можно выполнить проверку перезагрузкой.

Как создать общую сетевую папку в Samba

Если в этой статье вы пропустили предыдущие части, так как вам нужно только настроить файловый сервер на Linux, то начните с установки пакета samba.

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

sudo touch /etc/samba/smb.conf

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

Для установки пароля Samba, выполните следующую команду:

sudo smbpasswd -a $USER

Если вы хотите, чтобы у пользователя не было пароля, то укажите опцию -n.

Создайте папку, которая станет совместно используемой:

mkdir ~/linuxshare

Узнаем абсолютный путь до папки ~/linuxshare:

realpath ~/linuxshare

У меня это:

/home/mial/linuxshare

Откройте для редактирования файл /etc/samba/smb.conf:

sudo gedit /etc/samba/smb.conf

Добавьте туда строки вида:

[ИМЯ_ПАПКИ]
comment = Samba на Linux
path = /home/ИМЯ_ПОЛЬЗОВАТЕЛЯ/ИМЯ_ПАПКИ
valid users = ИМЯ_ПОЛЬЗОВАТЕЛЯ
read only = no
browsable = yes

Обратите внимание, что все пробелы в строках выше являются обязательными.

Для моих данных это строки:

[linuxshare]
comment = Samba на Linux
path = /home/mial/linuxshare
valid users = mial
read only = no
browsable = yes

Теперь запустим службу SMB:

sudo systemctl start smb.service

Для добавления службы в автозагрузку выполните:

sudo systemctl enable smb.service

На самом деле, мы настроили не полноценную Samba, а только файловый сервер SMB. Одно из следствий этого — показанные выше способы обнаружения сетевых папок, такие как команда smbtree в Linux или переход во вкладку «Сеть» в проводнике Windows, не обнаружат нашу шару.

Для подключения к этой общей сетевой папке на Linux нужно использовать IP адреса компьютера Linux вместо имени компьютера, как это мы делали раньше. Кстати, поэтому нужно настроить статичный IP (смотрите статью «Как настроить Linux на использование статичного IP адреса»).

Создадим файл, чтобы сетевая папка не была пустой:

echo "Документ на Linux" > ~/linuxshare/document.txt

Посмотрите локальный IP адрес компьютера, на котором запущена Linux:

ip a

У меня этим IP является 192.168.0.89, а папку, как мы помним, я создал с именем linuxshare, тогда в Windows я перехожу в проводнике во вкладку «Сеть» и подключаюсь к этой папке следующим образом:

\\192.168.0.89\linuxshare

Вводим учётные данные (которые мы установили командой smbpasswd):

Видим содержимое совместно используемой папки, размещённой на Linux с помощью SMB:

Для подключения к сетевой папке из консоли Linux, запустите команду вида:

sudo smbclient //IP_АДРЕС/Папка -U ПОЛЬЗОВАТЕЛЬ

Для моего примера это:

sudo smbclient //192.168.0.89/linuxshare -U mial

После ввода пароля нам становится доступным содержимое сетевой папки.

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

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован.