diff --git a/dev/snippet/Файловый сервер на Samba.md b/dev/snippet/Файловый сервер на Samba.md index de207c95..9670985e 100644 --- a/dev/snippet/Файловый сервер на Samba.md +++ b/dev/snippet/Файловый сервер на Samba.md @@ -1,5 +1,5 @@ --- -aliases: +aliases: tags: - maturity/🌱 date: 2024-09-06 @@ -9,51 +9,216 @@ parents: - "[[../devops/docker/Полезные Docker образы|Полезные Docker образы]]" linked: --- -Samba — это свободное программное обеспечение, позволяющее построить файловую помойку на базе SMB/CIFS. +Samba — свободное программное обеспечение для организации файлового сервера на базе протокола SMB/CIFS. С 1992 года обеспечивает безопасный и стабильный обмен файлами между всеми клиентами, использующими SMB/CIFS: Windows, macOS, Linux и другими. -Самый простой способ запустить файловый сервер, это использовать Docker-compose: -```docker-compose -samba: +## Особенности образа +- Базовый образ Alpine Linux (минимальный размер) +- Поддержка SMB2/SMB3 (SMB1 отключен по умолчанию) +- Поддержка Time Machine для macOS +- Встроенная корзина для удаленных файлов +- Оптимизированные настройки производительности +- Healthcheck для мониторинга состояния + +## Быстрый старт +### Docker Compose +```yaml +services: + samba: image: docker.struchkov.dev/samba:latest - restart: always + restart: unless-stopped container_name: samba hostname: samba - networks: - samba: ports: - - 139:139 - - 445:445 - - 137:137/udp - - 138:138/udp + - "139:139/tcp" + - "445:445/tcp" volumes: - - ./samba/:/cloud:z - command: '-r -n -p -u "user1;pass1" -u "user2;$pass2" -s "rootfolder1;/cloud/share;yes;no;yes;user1,user2" -s "rootfolder2;/cloud/upagge;yes;no;no;user1" -s "footfolter3;/cloud/hmnitessa;yes;no;no;user2"' + - ./data:/cloud + command: '-p -u "user1;pass1" -s "share;/cloud;yes;no;no;user1"' ``` -**Параметры:** -- `-r` — Отключить корзину для расшаренных ресурсов. -- `-n` — Запустить демон nmbd для объявления расшаренных ресурсов. -- `-p` — Установить права собственности и разрешения на расшаренные ресурсы. -- `-u "[;ID;group;GID]"` — Добавить пользователя. - • `` — имя пользователя. - • `` — пароль пользователя. - • `[ID]` — идентификатор пользователя. - • `[group]` — группа пользователя. - • `[GID]` — идентификатор группы. -- `-s "[;browse;readonly;guest;users;admins;writelist;comment]"` — Настроить расшаренный ресурс. - • `` — имя, как будет отображаться для клиентов. - • `` — путь к расшаренному ресурсу. - • `[browsable]` — по умолчанию: ‘yes’ или ‘no’. - • `[readonly]` — по умолчанию: ‘yes’ или ‘no’. - • `[users]` — разрешенные пользователи по умолчанию: ‘all’ или список разрешенных пользователей. - • `[admins]` — администраторы по умолчанию: ‘none’ или список администраторов. - • `[writelist]` — список пользователей, которые могут записывать в ресурс с только для чтения. - • `[comment]` — описание расшаренного ресурса. +### Docker Compose с NetBIOS +Если требуется обнаружение в сети через NetBIOS, добавьте флаг `-n` и порты 137-138/udp: +```yaml +services: + samba: + image: docker.struchkov.dev/samba:latest + restart: unless-stopped + ports: + - "139:139/tcp" + - "445:445/tcp" + - "137:137/udp" + - "138:138/udp" + volumes: + - ./data:/cloud + command: '-n -p -u "user1;pass1" -s "share;/cloud;yes;no;no;user1"' +``` -**Доступные сборки Samba**: -- 4.20.6-r1 -- 4.19.6-r0 -- 4.18.9-r0 +## Параметры командной строки +| Флаг | Описание | +|------|----------| +| `-h` | Показать справку | +| `-c ""` | Настроить маппинг символов для имен файлов/директорий | +| `-g "<параметр>"` | Добавить глобальную опцию в smb.conf | +| `-G "<секция;параметр>"` | Добавить опцию в конкретную секцию smb.conf | +| `-i "<путь>"` | Импортировать файл smbpasswd | +| `-n` | Запустить демон nmbd для объявления шар в сети | +| `-p` | Установить владельца и права на расшаренные директории | +| `-r` | Отключить корзину для шар | +| `-S` | Отключить минимальную версию SMB2 (разрешить SMB1) | +| `-t` | Включить поддержку Time Machine для macOS | +| `-s` | Настроить шару (см. формат ниже) | +| `-u` | Добавить пользователя (см. формат ниже) | +| `-w ""` | Настроить рабочую группу (домен) | +| `-W` | Разрешить широкие символические ссылки | +| `-I "<путь>"` | Добавить include в конец smb.conf | +| `-E` | Включить усиленную безопасность (подпись + шифрование) | + +### Формат параметра шары (-s) +``` +-s "[;browse;readonly;guest;users;admins;writelist;comment]" +``` + +| Поле | По умолчанию | Описание | +|------|--------------|----------| +| `name` | обязательно | Имя шары для клиентов | +| `/path` | обязательно | Путь к директории | +| `browse` | yes | Видна при обзоре сети (yes/no) | +| `readonly` | yes | Только чтение (yes/no) | +| `guest` | yes | Разрешить гостевой доступ (yes/no) | +| `users` | all | Список разрешенных пользователей (через запятую) | +| `admins` | none | Список администраторов шары (через запятую) | +| `writelist` | — | Пользователи с правом записи на RO-шаре | +| `comment` | — | Описание шары | + +### Формат параметра пользователя (-u) +``` +-u "[;ID;group;GID]" +``` + +| Поле | Описание | +|------|----------| +| `name` | Имя пользователя (обязательно) | +| `password` | Пароль (обязательно) | +| `ID` | UID пользователя (опционально) | +| `group` | Группа пользователя (опционально) | +| `GID` | GID группы (опционально) | + +## Переменные окружения +Альтернатива параметрам командной строки. Для множественных значений используйте нумерацию: SHARE, SHARE2, SHARE3... + +| Переменная | Описание | +|------------|----------| +| `SHARE` | Конфигурация шары (поддерживает SHARE2, SHARE3...) | +| `USER` | Конфигурация пользователя (поддерживает USER2, USER3...) | +| `GLOBAL` | Глобальная опция (поддерживает GLOBAL2, GLOBAL3...) | +| `GENERIC` | Опция для секции (поддерживает GENERIC2, GENERIC3...) | +| `CHARMAP` | Маппинг символов | +| `IMPORT` | Путь к файлу smbpasswd для импорта | +| `NMBD` | Включить демон nmbd | +| `PERMISSIONS` | Установить права на шары | +| `RECYCLE` | Отключить корзину | +| `SMB` | Отключить минимальную версию SMB2 | +| `TIMEMACHINE` | Включить поддержку Time Machine | +| `SECURE` | Включить усиленную безопасность | +| `WORKGROUP` | Рабочая группа | +| `WIDELINKS` | Разрешить широкие символические ссылки | +| `USERID` | UID для пользователя smbuser | +| `GROUPID` | GID для группы smb | +| `INCLUDE` | Путь к дополнительному конфиг-файлу | +| `TZ` | Часовой пояс (например, `Europe/Moscow`) | + +### Пример с переменными окружения +```yaml +services: + samba: + image: docker.struchkov.dev/samba:latest + restart: unless-stopped + environment: + TZ: 'Europe/Moscow' + SHARE: "Documents;/documents;yes;no;no;user1,user2" + SHARE2: "Media;/media;yes;yes;yes" + USER: "user1;${SAMBA_USER1_PASSWORD}" + USER2: "user2;${SAMBA_USER2_PASSWORD}" + PERMISSIONS: "true" + ports: + - "139:139/tcp" + - "445:445/tcp" + volumes: + - /mnt/documents:/documents + - /mnt/media:/media +``` + +## Порты +| Порт | Протокол | Описание | +|------|----------|----------| +| 137 | UDP | NetBIOS Name Service (только с `-n`) | +| 138 | UDP | NetBIOS Datagram Service (только с `-n`) | +| 139 | TCP | SMB over NetBIOS | +| 445 | TCP | SMB direct | + +Порты 137 и 138 нужны только при использовании флага `-n` или переменной `NMBD`. + +## Time Machine для macOS +Для резервного копирования macOS через Time Machine: +```bash +docker run -d -p 139:139 -p 445:445 \ + -v /mnt/backup:/backup \ + docker.struchkov.dev/samba:latest -p -t \ + -u "macuser;password" \ + -s "TimeMachine;/backup;no;no;no;macuser" +``` + +## Усиленная безопасность +Для сред, требующих дополнительной защиты, используйте флаг `-E` или переменную `SECURE=true`: +```bash +docker run -d -p 445:445 docker.struchkov.dev/samba:latest -E -p \ + -u "user;password" \ + -s "secure_share;/data;yes;no;no;user" +``` + +Это включает: +- **Server signing** (mandatory) — предотвращает подмену пакетов +- **Client signing** (mandatory) — гарантирует подлинность клиента +- **SMB encryption** (desired) — шифрует трафик, если клиент поддерживает + +**Примечание**: некоторые старые клиенты могут не поддерживать эти функции. + +## Решение проблем +### Ошибка "Access is denied" +Если в логах `change_to_user_internal: chdir_current_service() failed!`: +```bash +docker run -d -p 139:139 -p 445:445 \ + -v /path/to/directory:/mount \ + docker.struchkov.dev/samba:latest -p +``` +Добавьте флаг `-p` или переменную `PERMISSIONS=true`. + +Если изменение прав невозможно, используйте `USERID` и `GROUPID`: +```bash +docker run -d -p 139:139 -p 445:445 \ + -e USERID=1000 \ + -e GROUPID=1000 \ + -v /path/to/directory:/mount \ + docker.struchkov.dev/samba:latest +``` + +### Подключение через smbclient +По умолчанию smbclient пытается использовать SMB1. Используйте флаг `-m SMB3`: +```bash +smbclient -L \\\\localhost -U % -m SMB3 +smbclient //localhost/share -U user -m SMB3 +``` + +### Параметры -G не переопределяют глобальные настройки +Убедитесь, что используете актуальную версию образа. В старых версиях `GENERIC` обрабатывался до `SHARE`, поэтому секции шар ещё не существовали. + +Корректный пример: +```bash +docker run -d -p 139:139 -p 445:445 docker.struchkov.dev/samba:latest \ + -s "public;/cloud/share;yes;no;yes" \ + -G "public;force user = nobody" \ + -G "public;force group = nogroup" +``` *** ## Мета информация