<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Компы и автомобили (Posts about Samba)</title><link>https://at-hacker.in/</link><description></description><atom:link href="https://at-hacker.in/categories/samba.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:"&gt;at-hacker&lt;/a&gt; </copyright><lastBuildDate>Sat, 16 May 2026 20:41:18 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Samba и ZFS: расширенные ACL и их правка из винды</title><link>https://at-hacker.in/posts/samba-zfs-acl/</link><dc:creator>at-hacker</dc:creator><description>&lt;h3&gt;Постановка задачи&lt;/h3&gt;
&lt;p&gt;Возникла необходимость запилить файл-сервер на Samba и дать ряду пользователей возможность рулить правами доступа на отдельные каталоги. Система — FreeBSD 10.1 amd64, файло будет лежать на ZFS. Версия Samba — 3.6.24.&lt;/p&gt;
&lt;p&gt;Исследование задачи показало, что стандартными правами Unix (aka «Unix mode») тут не обойтись. Надо использовать расширенный набор ACL. Например, нужно, чтобы к каталогу имели доступ более одной группы, но не все группы (т. е. разрешения для other тут не прокатит). Ну и на некоторые папки нужно давать доступ не отдельным группам, а прямо отдельным пользователям.&lt;/p&gt;
&lt;h3&gt;Общие сведения&lt;/h3&gt;
&lt;p&gt;По дефолту, как известно, в юниксах права на файлы и каталоги расставляются по схеме «ugo» — «user-group-other»). Во фре с помощью утилиты &lt;em&gt;setfacl&lt;/em&gt; можно задавать права по двум схемам — POSIX 1.E и NFSv4, в зависимости от файловой системы. По факту же POSIX 1.E  здесь сильно редуцирован — до этой самой схемы ugo. Тогда как в действительности POSIX 1.E слегка побогаче (подробности можно вкурить можно задавать права по двум схемам — POSIX 1.E и NFSv4, в зависимости от файловой системы. По факту же POSIX 1.E  здесь сильно редуцирован — до этой самой схемы ugo. Тогда как в действительности POSIX 1.E слегка побогаче (подробности можно вкурить &lt;a href="http://wt.tuxomania.net/publications/posix.1e/download/Posix_1003.1e-990310.pdf.gz"&gt;отсюда&lt;/a&gt;). Как гласит ). Как гласит &lt;em&gt;man setfacl&lt;/em&gt;::&lt;/p&gt;
&lt;p&gt;&lt;em&gt;access permissions&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Что в переводе означает: «Поля с разрешениями содержат букавки r, w или x для чтения, записи или выполнения соответственно».&lt;/p&gt;
&lt;p&gt;Но это всё нам не очень интересно, так как у нас ZFS, а на ZFS ACL по умолчанию соответствуют схеме NFSv4.&lt;/p&gt;
&lt;h3&gt;Тюнинг ZFS&lt;/h3&gt;
&lt;p&gt;Поэтому прежде чем заюзать всю эту красоту с крутыми ACL на ZFS, необходимо ZFS слегка потюнить. А именно, проделать такое:&lt;/p&gt;
&lt;p&gt;zfs set aclmode=passthrough storage0  &lt;/p&gt;
&lt;p&gt;zfs set aclinherit=passtrhough storage0
В данном случае &lt;em&gt;storage0&lt;/em&gt; — это имя моего ZFS-пула — это имя моего ZFS-пула&lt;/p&gt;
&lt;p&gt;&lt;em&gt;zfs set aclmode=passthrough&lt;/em&gt; делает так, что если над папкой выполняется chmod, то при наличии у папки расширенных ACEs (access control entries) (расширенные — это те, которые помимо стандартных @owner, @group, @other), то эти ACL при этом НЕ ИЗМЕНЯЮТСЯ. делает так, что если над папкой выполняется chmod, то при наличии у папки расширенных ACEs (access control entries) (расширенные — это те, которые помимо стандартных @owner, @group, @other), то эти ACL при этом НЕ ИЗМЕНЯЮТСЯ.&lt;/p&gt;
&lt;p&gt;Также там есть режимы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;discard&lt;/em&gt; — т. е. никаких ACL сверх стандартного unix mode сохраняться не будет; — т. е. никаких ACL сверх стандартного unix mode сохраняться не будет;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;groupmask&lt;/em&gt; — новые ACL по итогу будут выставляться так, чтобы они не превышали тех, которые принадлежат @group, за исключением случая, если UID пользователя в ACL совпадает с UID владельца каталога или файла. В этом случае выставляются права не выше, чем у владельца файла. Пока даже не могу предположить, для чего такой режим может использоваться. — новые ACL по итогу будут выставляться так, чтобы они не превышали тех, которые принадлежат @group, за исключением случая, если UID пользователя в ACL совпадает с UID владельца каталога или файла. В этом случае выставляются права не выше, чем у владельца файла. Пока даже не могу предположить, для чего такой режим может использоваться.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Если коротко, то &lt;em&gt;zfs set aclinherit=passthrough&lt;/em&gt; необходима, для того, чтобы ACL свежесоздаваемых файлов и каталогов наследовались от каталога, в котором они создаются. Есть ещё режим passthrough-x — то же самое, что passthrough, только бит «executable» выставляется только в случае, если создающее файл приложение явным образом требует у создаваемого файла выставить бит «executable». Подробности можно необходима, для того, чтобы ACL свежесоздаваемых файлов и каталогов наследовались от каталога, в котором они создаются. Есть ещё режим passthrough-x — то же самое, что passthrough, только бит «executable» выставляется только в случае, если создающее файл приложение явным образом требует у создаваемого файла выставить бит «executable». Подробности можно &lt;a href="http://docs.oracle.com/cd/E19120-01/open.solaris/817-2271/gbaaz/index.html"&gt;вкурить тут&lt;/a&gt;..&lt;/p&gt;
&lt;h3&gt;Правка прав доступа из винды&lt;/h3&gt;
&lt;p&gt;В условиях задачи была заявлена необходимость дать некоему пользователю возможность управления доступом на каталоги в расшаренных папках. Причём от тонкостей командной строки пользователь бесконечно далёк, но может пользоваться виндовым диалогом прав доступа (который в свойствах папок или файлов в винде на вкладке «Безопасность» находится).&lt;/p&gt;
&lt;p&gt;Поэтому устанавливаем владельца всех папок в шаре на определённый аккаунт, который будет админским. Допустим, это будет учётка i.ivanov. Тогда делаем так:&lt;/p&gt;
&lt;p&gt;find /mnt/storage0/share -type d -exec setfacl -m u:i.ivanov:full_set:fd:allow {} \;  &lt;/p&gt;
&lt;p&gt;find /mnt/storage0/share -type f -exec setfacl -m u:i.ivanov:full_set:allow {} \;
Первый find выставляет права full_set (это сокращение на «Полный доступ») на каталоги, а второй find — на файлы. Два find необходимы потому, что в синтаксисе команды &lt;em&gt;setfacl&lt;/em&gt; при установке прав на каталог есть ещё модификатор «:fd:». Он означает, что права нижележащих каталогов должны наследоваться от вышестоящих. У файлов такого модификатора нет (т. е. в ACL на файлы он не предусмотрен). Если попытаться задать права на файл в формате при установке прав на каталог есть ещё модификатор «:fd:». Он означает, что права нижележащих каталогов должны наследоваться от вышестоящих. У файлов такого модификатора нет (т. е. в ACL на файлы он не предусмотрен). Если попытаться задать права на файл в формате &lt;em&gt;-m u:i.ivanov:full_set:fd:allow&lt;/em&gt;, то , то &lt;em&gt;setfacl&lt;/em&gt; выдаст ошибку. выдаст ошибку.&lt;/p&gt;
&lt;p&gt;Далее нам надо замапить группы Unix на группы в Samba. Если этого не сделать, то в диалоге «Безопасность» на винде будут видны пользователи файл-сервера (их отдаёт Самба), но не будет видно групп. Если же назначить группу руками через setfacl, то группа будет видна как «Unix Group\unixgroup»:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://at-hacker.in/assets/images/samba1.png"&gt;&lt;/p&gt;
&lt;p&gt;Но из виндового диалога добавить юниксовые группы не удастся — их там просто не видно. Чтобы они стали видны в этом диалоге, необходимы дополнительные телодвижения. Допустим, у нас есть на файл-сервере группы buhgalteria, common, engineers и bosses. Чтобы эти группы стали видны на Windows, делаем так:&lt;/p&gt;
&lt;p&gt;net groupmap add unixgroup=buhgalteria type=local ntgroup="Бухгалтерия"  &lt;/p&gt;
&lt;p&gt;net groupmap add unixgroup=common type=local ntgroup="Все юзеры"  &lt;/p&gt;
&lt;p&gt;net groupmap add unixgroup=engineers type=local ntgroup="Инженеры"  &lt;/p&gt;
&lt;p&gt;net groupmap add unixgroup=bosses type=local ntgroup="Начальство"
И после этого в диалоге добавления прав будут присутствовать соответствующие группы. Обращаю внимание, что если имена групп NT у вас на русском, то добавлять их в маппинг надо в кодировке UTF-8.&lt;/p&gt;
&lt;h3&gt;Настройка собственно Samba&lt;/h3&gt;
&lt;p&gt;Отключаем маппинг атрибутов DOS в файлах на exec-биты и включаем хранение атрибутов DOS в виде дополнительных файлов с атрибутами. Это не обязательно, просто меня бесит, что свеже-создаваемые в SMB-шарах файлы имеют атрибут «исполняемых» при просмотре прямо в консоли сервера. Это криво и несекурно — мало ли, кто там чо зальёт.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;# Disable mapping DOS bits
    map hidden = no
    map system = no
    map archive = no

# Use extended attributes to store file modes
    store dos attributes = yes
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Отключаем unix extensions (они нужны для того, чтобы Самба могла работать с расширениями CIFS от HP — там можно реализовывать симлинки, хардлинки и прочее. Эти расширения могут использовать разные другие SMB-клиенты, но винда их не поддерживает. Клиенты у нас в основном на винде — поэтому unix extensions нам ни к чему. Также выставляем параметры наследования и режима обработки ACL:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;#&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inherited&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ACLs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;directories&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;nt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;support&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;inherit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;acls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;inherit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;inherit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;permissions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;inherit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;unix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;extensions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;no&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;nt acl support&lt;/em&gt; — включает режим маппинга NT-like ACL на ACL файловой системы; — включает режим маппинга NT-like ACL на ACL файловой системы;&lt;/li&gt;
&lt;li&gt;inherit acls — включает режим наследования ACL от каталога, в котором создаются новые файлы и каталоги. Без этого параметра дополнительные ACL не будут наследоваться для новых файлов, будут наследоваться только unix mode разрешения;&lt;/li&gt;
&lt;li&gt;inherit owner — включает режим наследования владельца каталога, в котором создаётся файл. Без этого параметра владельцем будет становиться тот пользователь, который этот файл создаёт. В рамках нашей задачи наследование требуется, поэтому включаем;&lt;/li&gt;
&lt;li&gt;inherit permissions — включает наследование unix mode разрешений;&lt;/li&gt;
&lt;li&gt;map acl inherit — Самба будет мапить флаги «наследовать права от родительского каталога» в NT acls на файловую систему.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И в настройках шары делаем так:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;    vfs objects = zfsacl #включаем модуль zfsacl, чтобы самба мог работать с ACL на ZFS
    nfs4:acedup = merge # сливать в одну запись дублирующиеся ACE
    nfs4:chown = yes # разрешаем менять влалельца файлов
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;На этом, собственно, всё. А теперь — дискотека! :-)&lt;/p&gt;
&lt;h3&gt;Источники&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://daniel.washburn.at/docs/howtos/freebsd-samba4-zfs-recipe"&gt;Samba и ZFS ACL&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.metager.de/source/xref/samba/source3/modules/README.nfs4acls.txt"&gt;параметры ACL NFSv4 в Samba&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://wt.tuxomania.net/publications/posix.1e/download/Posix_1003.1e-990310.pdf.gz"&gt;POSIX 1.E&lt;/a&gt;&lt;/p&gt;</description><category>FreeBSD</category><category>Samba</category><category>ZFS</category><guid>https://at-hacker.in/posts/samba-zfs-acl/</guid><pubDate>Wed, 28 Jan 2015 12:19:00 GMT</pubDate></item></channel></rss>