搜索

第 16 章 文件和打印服务器

download PDF

本章将引导您完成 Samba 的安装和配置,这是 服务器信息块( SMB)和 通用互联网文件系统 (CIFS)协议的开源实施,以及由 Red Hat Enterprise Linux 提供的主 FTP 服务器。此外,还介绍了如何使用 "打印设置" 工具来配置打印机。

16.1. Samba

Samba 在红帽企业 Linux 中实施服务器消息块(SMB)协议。SMB 协议用于访问服务器上的资源,如文件共享和共享打印机。此外,Samba 实施由 Microsoft Windows 使用的分布式计算环境远程过程调用(DCE RPC)协议。

您可以以以下方式运行 Samba:

  • Active Directory(AD)或 NT4 域成员
  • 独立服务器
  • NT4 主域控制器(PDC)或备份域控制器(BDC)

    注意

    红帽仅在支持 NT4 域的现有安装中支持这些模式。红帽建议不要设置新的 Samba NT4 域,因为 Microsoft 操作系统稍后于 Windows 7 和 Windows Server 2008 R2 不支持 NT4 域。

独立于安装模式,您可以选择共享目录和打印机。这可让 Samba 充当文件和打印服务器。

注意

红帽不支持将 Samba 作为 AD 域控制器(DC)运行。

16.1.1. Samba 服务

Samba 提供以下服务:

smbd

此服务使用 SMB 协议提供文件共享和打印服务。另外,该服务负责资源锁定和验证连接用户。smb systemd 服务启动并停止 smbd 守护进程。

要使用 smbd 服务,请安装 samba 软件包。

nmbd

此服务通过 IPv4 协议使用 NetBIOS 提供主机名和 IP 解析。除了名称解析之外,nmbd 服务还支持浏览 SMB 网络来查找域、工作组、主机、文件共享和打印机。为此,服务可将此信息直接报告给广播客户端,或者将其转发到本地或主浏览器。nmb systemd 服务启动并停止 nmbd 守护进程。

请注意,现代 SMB 网络使用 DNS 解析客户端和 IP 地址。

要使用 nmbd 服务,请安装 samba 软件包。

winbindd

winbindd 服务为名称服务交换机(NSS)提供接口,以使用 AD 或 NT4 域用户和组在本地系统上。例如,这使域用户能够向 Samba 服务器托管的服务或其他本地服务进行身份验证。winbind systemd 服务启动并停止 winbindd 守护进程。

如果将 Samba 设置为域成员,必须在 smb d 服务之前启动 winbind d。否则,本地系统无法使用域用户和组。

要使用 winbindd 服务,请安装 samba-winbind 软件包。

重要

红帽仅支持将 Samba 作为带有 winbindd 服务的服务器运行,以便为本地系统提供域用户和组。由于某些限制,如缺少 Windows 访问控制列表(ACL)支持和 NT LAN Manager(NTLM)回退,这些用例目前不支持使用带有 Samba 的系统安全服务守护进程(SSSD)。详情请查看 Red Hat 知识库文章在 IdM 客户端上运行的 Samba 文件服务器的支持状态是什么,或直接注册了 SSSD 用作客户端守护进程的 AD 客户端

16.1.2. 使用 testparm 实用程序验证 smb.conf 文件

testparm 实用程序验证 /etc/samba/smb.conf 文件中的 Samba 配置是否正确。实用程序检测无效的参数和值,但也检测不正确的设置,如 ID 映射。如果 testparm 报告没有问题,Samba 服务将成功加载 /etc/samba/smb.conf 文件。请注意,testparm 无法验证配置的服务是否可用或按预期工作。

重要

红帽建议在每次修改此文件后使用 testparm 来验证 /etc/samba/smb.conf 文件。

要验证 /etc/samba/smb.conf 文件,请以 root 用户身份运行 testparm 实用程序。如果 testparm 报告了配置中不正确的参数、值或其他错误,请修复问题并再次运行 实用程序。

例 16.1. 使用 testparm

以下输出报告了一个不存在的参数和不正确的 ID 映射配置:

~]# testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Unknown parameter encountered: "log levell"
Processing section "[example_share]"
Loaded services file OK.
ERROR: The idmap range for the domain * (tdb) overlaps with the range of DOMAIN (ad)!

Server role: ROLE_DOMAIN_MEMBER

Press enter to see a dump of your service definitions

# Global parameters
[global]
	...

[example_share]
	...

16.1.3. 了解 Samba 安全模式

/etc/samba/smb.conf 文件中的 [global] 部分中的 security 参数管理 Samba 如何验证连接到该服务的用户的身份。根据您在其中安装 Samba 的模式,参数必须设为不同的值:

  • 在 AD 域成员中,设置 security = ads

    在这个模式中,Samba 使用 Kerberos 来验证 AD 用户。

    有关将 Samba 设置为域成员的详情,请参考 第 16.1.5 节 “将 Samba 设置为域成员”

  • 在单机服务器上,设置 security = user

    在这个模式中,Samba 使用本地数据库验证连接用户。

    有关将 Samba 设置为单机服务器的详情,请参考 第 16.1.4 节 “将 Samba 设置为单机服务器”

  • 在 NT4 PDC 或 BDC 上,设置 security = user.

    在此模式中,Samba 将用户身份验证到本地或 LDAP 数据库。

  • 在 NT4 域成员上,设置 security = domain

    在此模式中,Samba 验证将用户连接到 NT4 PDC 或 BDC 的身份。您不能在 AD 域成员中使用这个模式。

    有关将 Samba 设置为域成员的详情,请参考 第 16.1.5 节 “将 Samba 设置为域成员”

详情请查看 smb.conf(5)man page 中的 security 参数描述。

16.1.4. 将 Samba 设置为单机服务器

在某些情况下,管理员希望设置不属于某个域成员的 Samba 服务器。在此安装模式中,Samba 对用户进行本地数据库而非中央 DC 身份验证。另外,您可以启用客户机访问,允许用户在没有身份验证的情况下连接到一个或多个服务。

16.1.4.1. 为单机服务器设置服务器配置

将 Samba 设置为单机服务器:

将 Samba 设置为单机服务器

  1. 安装 samba 软件包:

    ~]# yum install samba
  2. 编辑 /etc/samba/smb.conf 文件并设置以下参数:

    [global]
    	workgroup = Example-WG
    	netbios name = Server
    	security = user
    
    	log file = /var/log/samba/%m.log
    	log level = 1

    此配置在 Example-learning 工作组中定义了一个名为 Server 的单机服务器。此外,此配置启用了最小级别(1)的日志记录,日志文件将存储在 /var/log/samba/ 目录中。Samba 会将 日志文件 参数中的 %m 宏扩展到连接客户端的 NetBIOS 名称。这可为每个客户端启用独立的日志文件。

    详情请查看 smb.conf(5)man page 中的参数描述。

  3. 配置文件或打印机共享.请参阅:

  4. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  5. 如果您设置了需要身份验证的共享,请创建用户帐户。详情请查看 第 16.1.4.2 节 “创建和启用本地用户帐户”
  6. 打开所需的端口并使用 firewall-cmd 工具重新载入防火墙配置:

    ~]# firewall-cmd --permanent --add-port={139/tcp,445/tcp}
    ~]# firewall-cmd --reload
  7. 启动 smb 服务:

    ~]# systemctl start smb
  8. 另外,还可在系统引导时启用 smb 服务自动启动:

    ~]# systemctl enable smb

16.1.4.2. 创建和启用本地用户帐户

要让用户在连接到共享时进行身份验证,您必须在操作系统和 Samba 数据库中在 Samba 主机上创建帐户。Samba 要求操作系统帐户验证文件系统对象上的访问控制列表(ACL)和 Samba 帐户,从而对连接用户进行身份验证。

如果您使用 passdb backend = tdbsam 默认设置,Samba 会将用户帐户存储在 /var/lib/samba/private/passdb.tdb 数据库中。

例如,要创建 Samba 用户示例:

创建 Samba 用户

  1. 创建操作系统帐户:

    ~]# useradd -M -s /sbin/nologin example

    上一命令在不创建主目录的情况下添加 example 帐户。如果帐户仅用于对 Samba 进行身份验证,请将 /sbin/nologin 命令指定为 shell,以防止帐户在本地登录。

  2. 为操作系统帐户设置密码以启用它:

    ~]# passwd example
    Enter new UNIX password: password
    Retype new UNIX password: password
    passwd: password updated successfully

    Samba 不会使用操作系统帐户中的密码集进行身份验证。然而,您需要设置密码才能启用帐户。如果一个帐户被禁用,当这个用户连接时,Samba 会拒绝访问。

  3. 将用户添加到 Samba 数据库,并为帐户设置密码:

    ~]# smbpasswd -a example
    New SMB password: password
    Retype new SMB password: password
    Added user example.

    当使用此帐户连接到 Samba 共享时,使用此密码进行验证。

  4. 启用 Samba 帐户:

    ~]# smbpasswd -e example
    Enabled user example.

16.1.5. 将 Samba 设置为域成员

运行 AD 或 NT4 域的管理员通常希望使用 Samba 将其红帽企业 Linux 服务器作为该域的成员加入。这可让您:

  • 访问其他域成员上的域资源
  • 向本地服务(如 sshd)验证域用户
  • 托管在服务器上的共享目录和打印机,以充当文件和打印服务器

16.1.5.1. 加入域

要将 Red Hat Enterprise Linux 系统加入到域中:

将 Red Hat Enterprise Linux 系统加入一个域

  1. 安装以下软件包:

    ~]# yum install realmd oddjob-mkhomedir oddjob samba-winbind-clients \
        samba-winbind samba-common-tools
  2. 要在域成员中共享目录或打印机,请安装 samba 软件包:

    ~]# yum install samba
  3. 如果您加入 AD,还要安装 samba-winbind-krb5-locator 软件包:

    ~]# yum install samba-winbind-krb5-locator

    此插件可让 Kerberos 根据使用 DNS 服务记录的 AD 站点查找密钥分发中心(KDC)。

  4. 另外,还可重命名现有的 /etc/samba/smb.conf Samba 配置文件:

    ~]# mv /etc/samba/smb.conf /etc/samba/smb.conf.old
  5. 加入域。例如,要加入名为 ad.example.com的域

    ~]# realm join --membership-software=samba --client-software=winbind ad.example.com

    使用上一命令,realm 工具会自动:

    • ad.example .com 域中的成员资格创建 /etc/samba/smb. conf 文件
    • 将用户和组查找的 winbind 模块添加到 /etc/nsswitch.conf 文件中
    • 更新 /etc/pam.d/ 目录中的可插拔验证模块(PAM)配置文件
    • 启动 winbind 服务并使服务在系统引导时启动

      有关 realm 实用程序的详情,请查看 (8)man page 和 Red Hat Windows 集成指南中 的对应章节。

  6. (可选)在 /etc/samba/smb.conf 文件中设置替代 ID 映射后端或自定义 ID 映射设置。详情请查看 第 16.1.5.3 节 “了解 ID 映射”
  7. (可选)验证配置。请参阅 第 16.1.5.2 节 “验证 Samba 正确加入为域成员”
  8. 验证 winbindd 是否正在运行:

    ~]# systemctl status winbind
    重要

    要启用 Samba 查询域用户和组信息,必须在启动 smb d 之前运行 winbind d 服务。

  9. 如果您安装了 samba 软件包来共享目录和打印机,请启动 smbd 服务:

    ~]# systemctl start smb

16.1.5.2. 验证 Samba 正确加入为域成员

加入红帽企业 Linux 作为域成员后,您可以运行不同的测试来验证该连接是否成功。请参阅:

验证操作系统是否可以恢复域用户帐户和组

使用 getent 实用程序验证操作系统是否可以检索域用户和组。例如:

  • 查询 AD 域中 的管理员 帐户:

    ~]# getent passwd AD\\administrator
    AD\administrator:*:10000:10000::/home/administrator@AD:/bin/bash
  • 查询 AD 域中 Domain Users 组的成员:

    ~]# getent group "AD\\Domain Users"
    AD\domain users:x:10000:user

如果 命令正常工作,请验证您可以在设置文件和目录的权限时使用域用户和组。例如,将 /srv/samba/example.txt 文件的所有者设置为 AD\administrator,组设置为 AD\Domain Users

~]# chown "AD\administrator":"AD\Domain Users" /srv/samba/example.txt
验证 AD 域用户是否可以获取 Kerberos 票据

在 AD 环境中,用户可以从 DC 获取 Kerberos 票据。例如,验证 管理员用户 是否可以获取 Kerberos 票据:

注意

若要使用 kinitklist 实用程序,可在 Samba 域成员 上安装 krb5-workstation 软件包。

获取 Kerberos 票据

  1. 获取 administrator@AD.EXAMPLE.COM 主体的票据:

    ~]# kinit administrator@AD.EXAMPLE.COM
  2. 显示缓存的 Kerberos ticket:

    ~]# klist
    Ticket cache: KEYRING:persistent:0:0
    Default principal: administrator@AD.EXAMPLE.COM
    
    Valid starting    Expires       Service principal
    11.09.2017 14:46:21 12.09.2017 00:46:21 krbtgt/AD.EXAMPLE.COM@AD.EXAMPLE.COM
    	renew until 18.09.2017 14:46:19
列出可用的域

要通过 winbindd 服务列出所有可用的域,请输入:

~]# wbinfo --all-domains

如果 Samba 成功作为域成员加入,命令可显示内置和本地主机名,以及包含受信任域的成员。

例 16.2. 显示可用域

~]# wbinfo --all-domains
BUILTIN
SAMBA-SERVER
AD

16.1.5.3. 了解 ID 映射

Windows 域通过唯一的安全标识符(SID)区分用户和组。但是,Linux 需要为每个用户和组群有唯一的 UID 和 GID。如果您以域成员身份运行 Samba,winbindd 服务负责向操作系统提供域用户和组的信息。

要启用 winbindd 服务为用户和组向 Linux 提供唯一 ID,您必须在 /etc/samba/smb.conf 文件中为以下目的配置 ID 映射:

  • 本地数据库(默认域)
  • Samba 服务器所属的 AD 或 NT4 域
  • 每个用户必须能够访问这个 Samba 服务器上的资源的可信域
16.1.5.3.1. 规划 ID 范围

无论您是在 AD 中存储 Linux UID 和 GID,还是将 Samba 配置为生成它们,每个域配置都需要一个唯一的 ID 范围,不得与任何其他域重叠

警告

如果您设置了重叠 ID 范围,Samba 无法正常工作。

例 16.3. 唯一的 ID 范围

以下显示了默认(*)、AD-DOM 和 TRUST-DOM 域的非覆盖 ID 映射范围。

[global]
...
idmap config * : backend = tdb
idmap config * : range = 10000-999999

idmap config AD-DOM:backend = rid
idmap config AD-DOM:range = 2000000-2999999

idmap config TRUST-DOM:backend = rid
idmap config TRUST-DOM:range = 4000000-4999999
重要

每个域只能分配一个范围。因此,在域范围之间有足够的空间。这可让您在域扩展后扩展范围。

如果您稍后将不同的范围分配给某个域,这些用户和组之前创建的文件和目录的所有权将会丢失。

16.1.5.3.2. * 默认域

在域环境中,您可以为以下每个情况添加一个 ID 映射配置:

  • Samba 服务器所属的域
  • 每个可以访问 Samba 服务器的可信域

但是,对于所有其他对象,Samba 会从默认域分配 ID。这包括:

  • 本地 Samba 用户和组
  • Samba 内置帐户和组,如 BUILTIN\Administrators
重要

您必须配置默认域,如本节所述,才能使 Samba 正常运行。

默认域后端必须可写,才能永久存储分配的 ID。

对于默认域,您可以使用以下后端之一:

tdb

当您将默认域配置为使用 tdb 后端时,设置一个足够大的 ID 范围,使其包含将来将要创建并且不属于定义的域 ID 映射配置的对象。

例如,在 /etc/samba/smb.conf 文件中的 [global] 部分中设置以下内容:

idmap config * : backend = tdb
idmap config * : range = 10000-999999

详情请查看 第 16.1.5.4.1 节 “使用 tdb ID 映射后端”

autorid

当您将默认域配置为使用 自动后端 时,可以为域添加额外的 ID 映射配置是可选的。

例如,在 /etc/samba/smb.conf 文件中的 [global] 部分中设置以下内容:

idmap config * : backend = autorid
idmap config * : range = 10000-999999

详情请查看 配置 自动 后端

16.1.5.4. 不同的 ID 映射后端

Samba 为特定配置提供不同的 ID 映射后端。最常用的后端是:

表 16.1. 常用的 ID 映射后端
后端使用案例

tdb

* 默认域

ad

仅限 AD 域

rid

AD 和 NT4 域

autorid

AD、NT4 和 * 默认域

以下小节介绍了后端的优势、使用后端的建议场景以及配置方法。

16.1.5.4.1. 使用 tdb ID 映射后端

winbindd 服务默认使用可写 tdb ID 映射后端来存储安全标识符(SID)、UID 和 GID 映射表。这包括本地用户、组和内置主体。

仅将此后端用于 * 默认域。例如:

idmap config * : backend = tdb
idmap config * : range = 10000-999999

有关 * 默认域的详情,请参考 第 16.1.5.3.2 节 “* 默认域”

16.1.5.4.2. 使用 ad ID 映射后端

ad ID 映射后端实施只读 API,以从 AD 读取帐户和组信息。它具有以下优点:

  • 所有用户和组群设置都集中存储在 AD 中。
  • 使用这个后端的所有 Samba 服务器中的用户和组群 ID 是一致的。
  • ID 不会存储在本地数据库中(本地数据库可能会被损坏),因此文件所有者不会丢失。

ad 后端从 AD 中读取以下属性:

表 16.2. 属性从用户和组对象中读取 ad 后端
AD Attribute Name对象类型映射到

sAMAccountName

用户和组群

用户和组名称,具体取决于对象

uidNumber

用户

用户 ID(UID)

gidNumber

组 ID(GID)

loginShell [a]

用户

用户 shell 的路径

unixHomeDirectory

用户

用户主目录的路径

primaryGroupID [b]

用户

主组群 ID

[a] 如果您设置了 idmap config DOMAIN:unix_nss_info = yes,则 Samba 仅读取此属性。
[b] 如果您设置了 idmap config DOMAIN:unix_primary_group = yes,则 Samba 仅读取此属性。

后端 的先决条件

使用 ad ID 映射后端:

  • 用户和组必须在 AD 中设置唯一 ID,并且 ID 必须在 /etc/samba/smb.conf 文件中配置的范围范围内。ID 范围之外的对象在 Samba 服务器上不可用。
  • 用户和组必须在 AD 中设置所有必需的属性。如果缺少所需的属性,该用户或组将无法在 Samba 服务器中可用。所需的属性取决于您的配置。请参阅 表 16.2 “属性从用户和组对象中读取 ad 后端”

配置 ad Backendd

将 Samba AD 成员配置为使用 ad ID 映射后端:

在域成员中配置 ad Backd

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. 如果默认域(*)不存在,请为它添加 ID 映射配置。例如:

      idmap config * : backend = tdb
      idmap config * : range = 10000-999999

      有关默认域配置的详情,请参考 第 16.1.5.3.2 节 “* 默认域”

    2. 为 AD 域启用 ad ID 映射后端:

      idmap config DOMAIN : backend = ad
    3. 设置分配给 AD 域中用户和组的 ID 范围。例如:

      idmap config DOMAIN : range = 2000000-2999999
      重要

      范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 第 16.1.5.3.1 节 “规划 ID 范围”

    4. 设置 Samba 在读取 AD 属性时使用 RFC 2307 模式:

      idmap config DOMAIN : schema_mode = rfc2307
    5. 要让 Samba 从对应的 AD 属性读取登录 shell 和用户主目录的路径,请设置:

      idmap config DOMAIN : unix_nss_info = yes

      或者,您可以设置应用于所有用户的统一的域范围的主目录路径和登录 shell。例如:

      template shell = /bin/bash
      template homedir = /home/%U

      有关变量替换的详情,请查看 smb.conf(5)man page 中的 VARIABLE SUBSTITUTIONS 部分。

    6. 默认情况下,Samba 使用用户对象的 primaryGroupID 属性作为 Linux 上用户的主组。或者,您可以将 Samba 配置为使用 the gidNumber 属性中设置的值:

      idmap config DOMAIN : unix_primary_group = yes
  2. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  3. 重新载入 Samba 配置:

    ~]# smbcontrol all reload-config
  4. 验证设置是否按预期工作。请参阅 “验证操作系统是否可以恢复域用户帐户和组”一节

详情请查看 smb.conf(5)和 idmap_ad(8)man page。

16.1.5.4.3. 使用丢弃 ID 映射后端

Samba 可以使用 Windows SID 的相对标识符(RID)在 Red Hat Enterprise Linux 上生成 ID。

注意

RID 是 SID 的最后部分。例如,如果用户的 SID 是 S-1-5-21-5421822485-1151247151-421485315-30014,则 30014 是对应的 RID。详情请查看 Samba 如何计算本地 ID,请参阅 idmap_rid(8)man page。

删除的 ID 映射后端实施只读 API,以根据 AD 和 NT4 域的算法映射方案计算帐户和组信息。配置后端时,您必须在 idmap config DOMAIN : range 参数中设置最低和最高的 RID。Samba 不会映射比这个参数中设置低或更高 RID 的用户或组。

重要

作为只读后端,删除 无法 分配新 ID,例如用于 BUILTIN 组。因此,请勿将此后端用于 * 默认域。

优点

  • 所有在配置范围内具有 RID 的域用户和组都会自动在域成员中可用。
  • 您不需要手动分配 ID、主目录和登录 shell。

缺陷

  • 所有域用户可以获得相同的登录 shell 和主目录。但是,您可以使用变量。
  • 如果所有删除 后端 都使用相同的 ID 范围设置,则用户和组 ID 仅在 Samba 域成员之间相同。
  • 您不能阻止单独的用户或组在域成员中可用。只有超出配置范围以外的用户和组才会包括。
  • 根据 winbindd 服务用于计算 ID 的公式,如果不同域中的对象具有相同的 RID,则重复 ID 可能会在多域环境中发生。

配置 删除 的后端

将 Samba 域成员配置为使用丢弃 ID 映射后端:

成员中配置删除的后端

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. 如果默认域(*)不存在,请为它添加 ID 映射配置。例如:

      idmap config * : backend = tdb
      idmap config * : range = 10000-999999

      有关默认域配置的详情,请参考 第 16.1.5.3.2 节 “* 默认域”

    2. 为域启用丢弃的 ID 映射后端:

      idmap config DOMAIN : backend = rid
    3. 设置一个足够大的范围,使其包含将来将分配的所有 RID。例如:

      idmap config DOMAIN : range = 2000000-2999999

      Samba 会忽略此域中 RID 不在 范围内的用户和组。

      重要

      范围不得与这个服务器上的任何其他域配置重叠。详情请查看 第 16.1.5.3.1 节 “规划 ID 范围”

    4. 设置分配给所有映射用户的 shell 和主目录路径。例如:

      template shell = /bin/bash
      template homedir = /home/%U

      有关变量替换的详情,请查看 smb.conf(5)man page 中的 VARIABLE SUBSTITUTIONS 部分。

  2. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  3. 重新载入 Samba 配置:

    ~]# smbcontrol all reload-config
  4. 验证设置是否按预期工作。请参阅 “验证操作系统是否可以恢复域用户帐户和组”一节
16.1.5.4.4. 使用自动 ID 映射后端

自动后端 的工作方式类似于丢弃的 ID 映射后端,但可以自动为不同的域分配 ID。这可让您 在以下情况下使用自动 后端:

  • 仅用于 * 默认域。
  • 对于 * 默认域和其他域,无需为每个额外域创建 ID 映射配置。
  • 仅供特定域使用.

优点

  • 所有在配置范围内计算 UID 和 GID 的域用户和组都会在域成员中自动可用。
  • 您不需要手动分配 ID、主目录和登录 shell。
  • 没有重复的 ID,即使多域环境中的多个对象有相同的 RID。

缺陷

  • 在 Samba 域成员中用户和组群 ID 不相同。
  • 所有域用户可以获得相同的登录 shell 和主目录。但是,您可以使用变量。
  • 您不能阻止单独的用户或组在域成员中可用。只有计算 UID 或 GID 不在配置范围内的用户和组才会包括。

配置 自动 后端

将 Samba 域成员配置为使用 * 默认域的 自动 ID 映射后端:

注意

如果您对默认域使用 autorid,可以为域添加额外的 ID 映射配置是可选的。

在域 成员中配置自动 后端

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. * 默认域启用 自动 ID 映射后端:

      idmap config * : backend = autorid
    2. 设置一个足够大的范围来为所有现有和将来的对象分配 ID。例如:

      idmap config * : range = 10000-999999

      Samba 忽略在此域中计算 ID 不在范围范围内的用户和组。有关后端如何计算 ID 的详情,请查看 idmap_autorid(8)man page 中的 THE MAPPING FORMULAS 部分。

      警告

      设置范围并开始使用 Samba 后,您只能增加范围的上限。对范围的任何其他更改都可能导致新的 ID 分配,从而释放文件所有权。

    3. 另外,还可设置范围大小。例如:

      idmap config * : rangesize = 200000

      Samba 会为每个域的对象分配这个数量的连续 ID,直到获取 idmap config * : range 参数中设置范围中的所有 ID。详情请查看 idmap_autorid(8)man page 中的 rangesize 参数描述。

    4. 设置分配给所有映射用户的 shell 和主目录路径。例如:

      template shell = /bin/bash
      template homedir = /home/%U

      有关变量替换的详情,请查看 smb.conf(5)man page 中的 VARIABLE SUBSTITUTIONS 部分。

    5. 另外,还可为域添加额外的 ID 映射配置。如果没有单个域的配置可用,Samba 使用之前配置的 * 默认域中的 自动后端 设置来计算 ID。

      重要

      如果您为单个域配置额外的后端,则所有 ID 映射配置的范围不得互相重叠。详情请查看 第 16.1.5.3.1 节 “规划 ID 范围”

  2. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  3. 重新载入 Samba 配置:

    ~]# smbcontrol all reload-config
  4. 验证设置是否按预期工作。请参阅 “验证操作系统是否可以恢复域用户帐户和组”一节

16.1.6. 在 Samba 服务器上配置文件共享

要将 Samba 用作文件服务器,请将共享添加到独立或域成员配置的 /etc/samba/smb.conf 文件中。

您可以使用以下任一方法添加共享:

16.1.6.1. 设置使用 POSIX ACL 的共享

作为 Linux 服务,Samba 支持与 POSIX ACL 的共享。它们允许您使用诸如 chmod 等实用程序在 Samba 服务器上本地管理权限。如果共享存储在支持扩展属性的文件系统中,您可以使用多个用户和组定义 ACL。

注意

如果您需要使用细粒度 Windows ACL,请参阅 第 16.1.6.2 节 “设置使用 Windows ACL 的共享”

在添加共享之前,请先设置 Samba。请参阅:

16.1.6.1.1. 添加使用 POSIX ACL 的共享

创建名为 example 的共享,该共享提供 /srv/samba/example/ 目录的内容并使用 POSIX ACL:

添加使用 POSIX ACL 的共享

  1. (可选)创建 文件夹(如果文件夹不存在)。例如:

    ~]# mkdir -p /srv/samba/example/
  2. 如果您以 enforcing 模式运行 SELinux,请在目录中设置 samba_share_t 上下文:

    ~]# semanage fcontext -a -t samba_share_t "/srv/samba/example(/.*)?"
    ~]# restorecon -Rv /srv/samba/example/
  3. 在目录中设置文件系统 ACL。详情请查看 第 16.1.6.1.2 节 “设置 ACL”
  4. 示例 共享添加到 /etc/samba/smb.conf 文件中。例如,添加启用了共享的写操作:

    [example]
    	path = /srv/samba/example/
    	read only = no
    注意

    无论文件系统 ACL 是什么;如果您没有 只设置只读 = no,Samba 都会以只读模式共享该目录。

  5. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  6. 打开所需的端口并使用 firewall-cmd 工具重新载入防火墙配置:

    ~]# firewall-cmd --permanent --add-service=samba
    ~]# firewall-cmd --reload
  7. 重启 smb 服务:

    ~]# systemctl restart smb
  8. 另外,还可启用 smb 服务在引导时自动启动:

    ~]# systemctl enable smb
16.1.6.1.2. 设置 ACL

使用 POSIX ACL 支持的共享:

设置标准 Linux ACL

Linux 中的标准 ACL 支持为一个所有者、一个组和所有其他未定义用户设置权限。您可以使用 chownchgrpchmod 实用程序来更新 ACL。如果您需要精确控制,然后使用更复杂的 POSIX ACL,请参阅 设置扩展 ACL

例如,要将 /srv/samba/example/ 目录的所有者设置为 root 用户,请为 Domain Users 组授予读写权限,并拒绝所有其他用户的访问权限:

~]# chown root:"Domain Users" /srv/samba/example/
~]# chmod 2770 /srv/samba/example/
注意

在目录上启用 set-group-ID(SGID)位会自动设置目录组的所有新文件和子目录的默认组,而不是将其设置为创建新目录条目的用户的主要组。

有关权限的详情,请查看 chown(1) 和chmod(1)man page。

设置扩展 ACL

如果文件系统中保存了共享目录的支持扩展 ACL,您可以使用它们设置复杂的权限。扩展 ACL 可以包含多个用户和组群的权限。

扩展 POSIX ACL 可让您使用多个用户和组配置复杂的 ACL。但是,您只能设置以下权限:

  • 无权限
  • 读权限
  • 写权限
  • 完整控制

如果您需要细粒度 Windows 权限,如 创建文件夹 / 附加数据,请将共享配置为使用 Windows ACL。请参阅 第 16.1.6.2 节 “设置使用 Windows ACL 的共享”

在共享中使用扩展 POSIX ACL:

在共享上启用扩展 POSIX ACL

  1. /etc/samba/smb.conf 文件中的共享部分启用以下参数,以启用扩展 ACL 的 ACL 继承:

    inherit acls = yes

    详情请查看 smb.conf(5)man page 中的参数描述。

  2. 重启 smb 服务:

    ~]# systemctl restart smb
  3. 另外,还可启用 smb 服务在引导时自动启动:

    ~]# systemctl enable smb
  4. 在目录中设置 ACL。有关使用扩展 ACL 的详情,请参考 第 5 章 访问控制列表

    例 16.4. 设置扩展 ACL

    以下步骤为 Domain Admins 组设置读取、写入和执行权限,为 Domain Users 组设置读取和执行权限,并拒绝 /srv/samba/example/ 目录中其他人的访问权限:

    设置扩展 ACL

    1. 为主用户帐户组禁用自动授予权限:

      ~]# setfacl -m group::--- /srv/samba/example/
      ~]# setfacl -m default:group::--- /srv/samba/example/

      目录的主要组还映射到动态 CREATOR GROUP 主体。当您在 Samba 共享中使用扩展 POSIX ACL 时,会自动添加这个主体,您无法将其删除。

    2. 设置目录中的权限:

      1. Domain Admins 组授予读取、写入和执行权限:

        ~]# setfacl -m group:"DOMAIN\Domain Admins":rwx /srv/samba/example/
      2. Domain Users 组授予读取和执行权限:

        ~]# setfacl -m group:"DOMAIN\Domain Users":r-x /srv/samba/example/
      3. 为其他 ACL 条目设置权限,以拒绝不匹配其他 ACL 条目的用户的访问:

        ~]# setfacl -R -m other::--- /srv/samba/example/

        这些设置只适用于这个目录。在 Windows 中,这些 ACL 仅映射到此文件夹 模式。

    3. 启用上一步中设置的权限由此目录中创建的新文件系统对象继承:

      ~]# setfacl -m default:group:"DOMAIN\Domain Admins":rwx /srv/samba/example/
      ~]# setfacl -m default:group:"DOMAIN\Domain Users":r-x /srv/samba/example/
      ~]# setfacl -m default:other::--- /srv/samba/example/

      使用这些设置时,现在将主体的 此文件夹仅 设置为此 文件夹、子文件夹和文件

    Samba 将之前设置的权限映射到以下 Windows ACL:

    主体权限适用于

    DOMAIN\Domain Admins

    完整控制

    这个文件夹、子文件夹和文件

    DOMAIN\Domain 用户

    读和执行

    这个文件夹、子文件夹和文件

    每个人都 [a]

    这个文件夹、子文件夹和文件

    所有者 (Unix Userpass:attributes[]所有者[b]

    完整控制

    只限于这个文件夹

    primary_group (Unix Userpass:attributes[]primary_group) [c]

    只限于这个文件夹

    创建者所有者 [d] [e]

    完整控制

    只适用于子文件夹和文件

    创建组 [f]

    只适用于子文件夹和文件

    [a] Samba 从其他 ACL 条目映射此主体的权限。
    [b] Samba 将目录的所有者映射到此条目。
    [c] Samba 将目录的主组群映射到这个条目。
    [d] 在新文件系统对象中,创建者会自动继承这个主体的权限。
    [e] 在使用 POSIX ACL 的共享中不支持从 ACL 配置或删除这些主体。
    [f] 在新文件系统对象中,创建器的主组群自动继承这个主体的权限。
16.1.6.1.3. 在共享中设置权限

若要选择限制或授予对 Samba 共享的访问权限,您可以在 /etc/samba/smb.conf 文件中的共享部分设置某些参数。

注意

如果用户、组或主机能够访问共享,则管理基于共享的权限。这些设置不会影响文件系统 ACL。

使用基于共享的设置来限制对共享的访问.例如,若要拒绝特定主机的访问:

配置基于用户和组的共享访问

借助基于用户和组的访问控制,您可以授予或拒绝特定用户和组对共享的访问权限。例如,要在 用户帐户 访问时允许 Domain Users 组的所有成员访问共享,请在共享的配置中添加以下参数:

valid users = +DOMAIN\"Domain Users"
invalid users = DOMAIN\user

无效的 users 参数具有高于 有效 users 参数的优先级。例如,如果 用户帐户Domain Users 组的成员,则在使用上例时拒绝访问此帐户。

详情请查看 smb.conf(5)man page 中的参数描述。

配置基于主机的共享访问

通过基于主机的访问控制,您可以根据客户端的主机名、IP 地址或 IP 范围授予或拒绝对共享的访问。

例如,要启用 127.0.0.1 IP 地址、192.0.2.0/24 IP 范围和 client1.example.com 主机来访问共享,并拒绝 client2.example.com 主机的访问:

配置基于主机的共享访问

  1. /etc/samba/smb.conf 中的共享配置中添加以下参数:

    hosts allow = 127.0.0.1 192.0.2.0/24 client1.example.com
    hosts deny = client2.example.com
  2. 重新载入 Samba 配置

    ~]# smbcontrol all reload-config

hosts deny 参数的优先级高于 hosts allow。例如,如果 client1.example.com 解析为 hosts allow 参数中列出的 IP 地址,则此主机的访问将被拒绝。

详情请查看 smb.conf(5)man page 中的参数描述。

16.1.6.2. 设置使用 Windows ACL 的共享

Samba 支持在共享和文件系统对象中设置 Windows ACL。这可让您:

  • 使用精细 Windows ACL
  • 使用 Windows 管理共享权限和文件系统 ACL

或者,您可以将共享配置为使用 POSIX ACL。详情请查看 第 16.1.6.1 节 “设置使用 POSIX ACL 的共享”

16.1.6.2.1. 授予 SeDiskOperatorPrivilege 权限

只有具有授予 SeDiskOperatorPrivilege 特权的用户和组才能对使用 Windows ACL 的共享配置权限。例如,要将权限授予 DOMAIN\Domain Admins 组:

~]# net rpc rights grant "DOMAIN\Domain Admins" SeDiskOperatorPrivilege \
    -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
Successfully granted rights.
注意

在域环境中,为域组授予 SeDiskOperatorPrivilege。这可让您通过更新用户的组成员资格来集中管理权限。

列出所有授予 SeDiskOperatorPrivilege 的 用户和组:

~]# net rpc rights list privileges SeDiskOperatorPrivilege \
    -U "DOMAIN\administrator"
Enter administrator's password:
SeDiskOperatorPrivilege:
 BUILTIN\Administrators
 DOMAIN\Domain Admins
16.1.6.2.2. 启用 Windows ACL 支持

要配置支持 Windows ACL 的共享,您必须在 Samba 中启用此功能。要全局启用所有共享,请在 /etc/samba/smb.conf 文件的 [global] 部分添加以下设置:

vfs objects = acl_xattr
map acl inherit = yes
store dos attributes = yes

或者,您可以通过将相同的参数添加到共享部分来启用对单个共享的 Windows ACL 支持。

16.1.6.2.3. 添加使用 Windows ACL 的共享

要创建一个名为 example 的共享,该共享 /srv/samba/example/ 目录的内容并使用 Windows ACL:

添加使用 Windows ACL 的共享

  1. (可选)创建 文件夹(如果文件夹不存在)。例如:

    ~]# mkdir -p /srv/samba/example/
  2. 如果您以 enforcing 模式运行 SELinux,请在目录中设置 samba_share_t 上下文:

    ~]# semanage fcontext -a -t samba_share_t "/srv/samba/example(/.*)?"
    ~]# restorecon -Rv /srv/samba/example/
  3. 示例 共享添加到 /etc/samba/smb.conf 文件中。例如,添加启用了共享的写操作:

    [example]
    	path = /srv/samba/example/
    	read only = no
    注意

    无论文件系统 ACL 是什么;如果您没有 只设置只读 = no,Samba 都会以只读模式共享该目录。

  4. 如果您还没有在所有共享的 [global] 部分中启用 Windows ACL 支持,请在 [example] 部分中添加以下参数来为这个共享启用此功能:

    vfs objects = acl_xattr
    map acl inherit = yes
    store dos attributes = yes
  5. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  6. 打开所需的端口并使用 firewall-cmd 工具重新载入防火墙配置:

    ~]# firewall-cmd --permanent --add-service=samba
    ~]# firewall-cmd --reload
  7. 重启 smb 服务:

    ~]# systemctl restart smb
  8. 另外,还可启用 smb 服务在引导时自动启动:

    ~]# systemctl enable smb
16.1.6.2.4. 管理使用 Windows ACL 共享的共享权限和文件系统 ACL

要在使用 Windows ACL 的 Samba 共享上管理共享和文件系统 ACL,请使用 Windows 应用程序,如 计算机管理。详情请查看您的 Windows 文档。

或者,也可使用 smbcacls 实用程序来管理 ACL。详情请查看 第 16.1.6.3 节 “使用 smbcacls管理 SMB 共享上的 ACL”

注意

要从 Windows 修改文件系统权限,您必须使用授予 SeDiskOperatorPrivilege 权限的帐户。请参阅 第 16.1.6.2.1 节 “授予 SeDiskOperatorPrivilege 权限”

16.1.6.3. 使用 smbcacls管理 SMB 共享上的 ACL

smbcacls 实用程序可以列出、设置和删除存储在 SMB 共享中的文件和目录的 ACL。您可以使用 smbcacls 来管理文件系统 ACL:

  • 在本地或远程 Samba 服务器上使用高级 Windows ACL 或 POSIX ACL。
  • 在 Red Hat Enterprise Linux 上,远程管理 Windows 上托管的共享上的 ACL。
16.1.6.3.1. 了解访问控制条目

文件系统对象的每个 ACL 条目均包含以下格式的访问控制条目(ACE):

security_principal:access_right/inheritance_information/permissions

例 16.5. 访问控制条目

如果 AD\Domain Users 组修改了适用于 文件夹、子文件夹和 Windows 上的文件的权限,ACL 将包含以下 ACE:

AD\Domain Users:ALLOWED/OI|CI/CHANGE

下面描述了独立的 ACE:

安全主体
安全主体是 ACL 中权限的用户、组群或 SID。
访问权利
定义是否授予或拒绝对对象的访问权限。该值可以是 ALLOWEDDENIED
继承信息

存在以下值:

表 16.3. 继承设置
描述映射到

OI

对象实例

这个文件夹和文件

CI

容器继承

这个文件夹和子文件夹

IO

只继承

ACE 不适用于当前文件或目录。

ID

继承

ACE 从父目录继承。

另外,这些值可以合并如下:

表 16.4. 继承设置组合
值组合映射到 Windows 应用到 设置

OI/CI

这个文件夹、子文件夹和文件

OI/CI/IO

只适用于子文件夹和文件

CI/IO

只使用子文件夹

OI/IO

仅限文件

权限

这个值可以是代表一个或多个 Windows 权限的十六进制值,也可以是 smbcacls 别名:

  • 代表一个或多个 Windows 权限的十六进制值。

    下表以十六进制格式显示高级 Windows 权限及其对应的值:

    表 16.5. Windows Permissions 和 Their Correspo ing smbcacls 值(Hex 格式)
    Windows 权限十六进制值

    完整控制

    0x001F01FF

    遍历文件夹 / 执行文件

    0x00100020

    列出文件夹 / 读数据

    0x00100001

    读取属性

    0x00100080

    读取扩展属性

    0x00100008

    创建文件 / 写数据

    0x00100002

    创建文件夹/附加数据

    0x00100004

    写入属性

    0x00100100

    写扩展属性

    0x00100010

    删除子文件夹和文件

    0x00100040

    删除

    0x00110000

    读取权限

    0x00120000

    更改权限

    0x00140000

    获取所有权

    0x00180000

    可以使用 位范围 OR 操作将多个权限组合为一个十六进制值。详情请查看 第 16.1.6.3.3 节 “计算 ACE 掩码”

  • smbcacls 别名。下表显示了可用的别名:

    表 16.6. 现有 smbcacls Aliases 和 ir Correspoing Windows 权限
    smbcacls Alias映射到 Windows 权限

    R

    读取

    读和执行

    W

    特殊

    • 创建文件 / 写数据
    • 创建文件夹/附加数据
    • 写入属性
    • 写扩展属性
    • 读取权限

    D

    删除

    P

    更改权限

    O

    获取所有权

    X

    遍历 / 执行

    更改

    修改

    FULL

    完整控制

    注意

    设置权限时,您可以组合单例别名。例如,您可以设置 RD 以应用 Windows 权限 读取 和删除。但是,您既不能组合多个非字母别名,也无法组合别名和十六进制值。

16.1.6.3.2. 使用 smbcacls显示 ACL

如果您运行不带任何操作参数的 smbcacls,如 --add,则实用程序会显示文件系统对象的 ACL。

例如,列出 //server/example 共享的根目录的 ACL:

~]# smbcacls //server/example / -U "DOMAINpass:quotes[administrator]"
Enter DOMAINpass:quotes[administrator]'s password:
REVISION:1
CONTROL:SR|PD|DI|DP
OWNER:AD\Administrators
GROUP:AD\Domain Users
ACL:AD\Administrator:ALLOWED/OI|CI/FULL
ACL:AD\Domain Users:ALLOWED/OI|CI/CHANGE
ACL:AD\Domain Guests:ALLOWED/OI|CI/0x00100021

命令的输出会显示:

  • REVISION :安全描述符的内部 Windows NT ACL 版本
  • CONTROL :安全描述符控制
  • OWNER :安全描述符所有者的名称或 SID
  • GROUP :安全描述符组的名称或 SID
  • ACL 条目.详情请查看 第 16.1.6.3.1 节 “了解访问控制条目”
16.1.6.3.3. 计算 ACE 掩码

在大多数情况下,当添加或更新 ACE 时,您可以使用 表 16.6 “现有 smbcacls Aliases 和 ir Correspoing Windows 权限” 中列出的 smbcacls 别名。

但是,如果要设置 表 16.5 “Windows Permissions 和 Their Correspo ing smbcacls 值(Hex 格式)” 中列出的高级 Windows 权限,则必须使用位范围 OR 操作来计算正确的值。您可以使用以下 shell 命令计算值:

~]# echo $(printf '0x%X' $
							
							
							
							
							
							hex_value_1 | hex_value_2 | ...)

例 16.6. 计算 ACE 掩码

您需要设置以下权限:

  • 遍历文件夹/执行文件 (0x00100020)
  • 列出文件夹/读取数据 (0x00100001)
  • 读取属性 (0x00100080)

要计算之前权限的十六进制值,请输入:

~]# echo $(printf '0x%X' $(( 0x00100020 | 0x00100001 | 0x00100080 )))
0x1000A1

设置或更新 ACE 时使用返回的值。

16.1.6.3.4. 使用 smbcacls添加、更新和删除 ACL

根据您传递给 smbcacls 实用程序的参数,您可以从文件或目录中添加、更新和删除 ACL。

添加 ACL

将 ACL 添加到 //server/example 共享的根目录,该共享将授予 此文件夹、子文件夹和文件的 CHANGE 权限到 AD\Domain Users 组:

~]# smbcacls //server/example / -U "DOMAIN\administrator \
    --add ACL:"AD\Domain Users":ALLOWED/OI|CI/CHANGE

更新 ACL

更新 ACL 与添加新的 ACL 类似。您可以使用 --modify 参数和现有的安全主体覆盖 ACL,以此更新 ACL。如果 smbcacls 在 ACL 列表中找到安全主体,则实用程序会更新这些权限。否则,命令会失败并显示错误:

ACL for SID principal_name not found

例如,要更新 AD\Domain Users 组的权限,并为此 文件夹、子文件夹和文件将其设置为 READ

~]# smbcacls //server/example / -U "DOMAIN\administrator \
    --modify ACL:"AD\Domain Users":ALLOWED/OI|CI/READ

删除 ACL

要删除 ACL,请将带有确切 ACL 的 --delete 传递到 smbcacls 实用程序。例如:

~]# smbcacls //server/example / -U "DOMAIN\administrator \
    --delete ACL:"AD\Domain Users":ALLOWED/OI|CI/READ

16.1.6.4. 启用用户在 Samba 服务器上共享目录

在 Samba 服务器上,您可以配置用户可以共享目录,而无需 root 权限。

16.1.6.4.1. 启用用户共享功能

在用户可以共享目录之前,管理员必须在 Samba 中启用用户共享。例如,只启用本地 示例 组的成员来创建用户共享:

启用用户共享

  1. 如果本地 示例 组不存在,请创建它:

    ~]# groupadd example
  2. 为 Samba 准备目录以存储用户共享定义并正确设置其权限。例如:

    1. 创建目录:

      ~]# mkdir -p /var/lib/samba/usershares/
    2. 示例 组设置写入权限:

      ~]# chgrp example /var/lib/samba/usershares/
      ~]# chmod 1770 /var/lib/samba/usershares/

      设置粘性位以防止用户重命名或删除此目录中其他用户存储的文件。

  3. 编辑 /etc/samba/smb.conf 文件,并将以下内容添加到 [global] 部分:

    1. 设置您配置用来存储用户共享定义的目录的路径。例如:

      usershare path = /var/lib/samba/usershares/
    2. 设置允许在这个服务器上创建多少个用户共享 Samba。例如:

      usershare max shares = 100

      如果您对 usershare max shares 参数使用默认值 0,则用户共享将被禁用。

    3. 另外,还可设置绝对目录路径列表。例如,要配置 Samba 仅允许共享 /data 和 / srv 目录的子目录,请设置:

      usershare prefix allow list = /data /srv

      有关您可以设置的其他用户共享相关参数的列表,请参阅 smb.conf(5)man page 中的 USERSHARES 部分。

  4. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  5. 重新载入 Samba 配置:

    ~]# smbcontrol all reload-config

用户现在可以创建用户共享。详情请查看 第 16.1.6.4.2 节 “添加用户共享”

16.1.6.4.2. 添加用户共享

根据 第 16.1.6.4.1 节 “启用用户共享功能” 配置 Samba 后,用户可以通过运行 net usershare add 命令,在没有 root 权限的情况下共享 Samba 服务器上的目录。

net usershare add 命令的概要:net usershare add share_namepathcommentACLsguest_ok=y|n

重要

如果在创建用户共享时设置了 ACL,您必须在 ACL 之前指定注释参数。要设置空注释,请在双引号中使用空字符串。

请注意,如果管理员设置了 usershare,在 /etc/samba/smb.conf 文件的 [global] 部分中,用户只能启用用户共享的 guest 访问。

例 16.7. 添加用户共享

用户想要在 Samba 服务器上共享 /srv/samba/ 目录。该共享应命名为 example,未设置任何注释,并且 guest 用户应可以访问该共享。此外,共享权限应设置为 AD\Domain Users 组的完整访问权限,以及其他用户的读取权限。要添加此共享,请以用户身份运行:

~]$ net usershare add example /srv/samba/ "" \
    "AD\Domain Users":F,Everyone:R guest_ok=yes
16.1.6.4.3. 更新用户共享的设置

如果要更新用户共享的设置,请使用具有相同共享名称和新 设置的 net usershare add 命令覆盖共享。请参阅 第 16.1.6.4.2 节 “添加用户共享”

16.1.6.4.4. 显示关于现有用户共享的信息

用户可以在 Samba 服务器上输入 net usershare info 命令,以显示用户共享及其设置。

显示任意用户创建的所有用户共享:

~]$ net usershare info -l
[share_1]
path=/srv/samba/
comment=
usershare_acl=Everyone:R,host_name\user:F,
guest_ok=y
...

若要仅列出运行 命令的用户创建的共享,请省略 -l 参数。

要仅显示关于特定共享的信息,请将共享名称或通配符传递到 命令。例如,显示名称以 share_ 开头的共享的信息:

~]$ net usershare info -l share*_
16.1.6.4.5. 列出用户共享

如果您只列出可用的用户共享,且在 Samba 服务器上没有设置,请使用 net usershare list 命令。

列出任意用户创建的共享:

~]$ net usershare list -l
share_1
share_2
...

若要仅列出运行 命令的用户创建的共享,请省略 -l 参数。

要仅列出特定的共享,请将共享名称或通配符传递到 命令。例如,仅列出名称以 share_ 开头的共享

~]$ net usershare list -l share_*
16.1.6.4.6. 删除用户共享

要删除用户共享,请以创建共享的用户身份输入,或者以 root 用户身份 输入:

~]$ net usershare delete share_name

16.1.6.5. 启用客户机访问共享

在某些情况下,您想要共享一个用户无需身份验证即可连接到的目录。若要配置此配置,请在共享中启用来宾访问权限。

警告

不需要身份验证的共享可能会造成安全隐患。

如果在共享中启用了 guest 访问权限,Samba 将映射客户机与 guest 帐户 参数中设置的操作系统帐户的连接。如果至少满足以下条件之一,客户机用户可以访问这些文件:

  • 该帐户在文件系统 ACL 中列出
  • 其他 用户的 POSIX 权限允许它

例 16.8. 客户机共享权限

如果您将 Samba 配置为将客户机帐户映射到 nobody (默认值),以下示例中的 ACL:

  • 允许 guest 用户读取 file1.txt
  • 允许 guest 用户读取和修改 file2.txt.
  • 阻止 guest 用户读取或修改 file3.txt
-rw-r--r--. 1 root    root   1024 1. Sep 10:00 file1.txt
-rw-r-----. 1 nobody   root   1024 1. Sep 10:00 file2.txt
-rw-r-----. 1 root    root   1024 1. Sep 10:00 file3.txt

例如,要启用现有 [example] 共享的客户机访问:

设置客户机共享

  1. 编辑 /etc/samba/smb.conf 文件:

    1. 如果这是您在这个服务器上设置的第一个客户机共享:

      1. [global] 部分将 map 设置为 guest = Bad User

        [global]
        	...
        	map to guest = Bad User

        使用这个设置时,Samba 将拒绝使用错误密码的登录尝试,除非用户名不存在。如果指定的用户名不存在,并且共享中启用了 guest 访问,Samba 会将连接视为客户机登录。

      2. 默认情况下,Samba 将 guest 帐户映射到 Red Hat Enterprise Linux 中的 nobody 帐户。另外,您还可以设置不同的帐户。例如:

        [global]
        	...
        	guest account = user_name

        此参数中设置的帐户必须在 Samba 服务器中本地存在。出于安全考虑,红帽建议您使用没有分配有效 shell 的帐户。

    2. [example] 部分添加 客户机 ok = yes 设置:

      [example]
      	...
      	guest ok = yes
  2. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  3. 重新载入 Samba 配置:

    ~]# smbcontrol all reload-config

16.1.7. 设置 Samba 打印服务器

如果您将 Samba 设置为打印服务器,则网络中的客户端可以使用 Samba 进行打印。此外,如果配置了 Windows 客户端,可以从 Samba 服务器下载该驱动程序。

在共享打印机前,请设置 Samba:

16.1.7.1. Samba spoolsd 服务

Samba 假脱机是一种 集成到 smbd 服务中的服务。在 Samba 配置 中启用假脱机,以显著提高具有大量作业或打印机的打印服务器的性能。

如果没有 spoolsd,Samba 就会对 smbd 进程执行分叉,并为每个打印作业初始化 printcap 缓存。如果有大量打印机,smb d 服务可能会在初始化缓存时多秒钟内变得无响应。spoolssd 服务可让您启动处理打印作业的预派 smbd 进程。主 spoolsd smbd 进程使用较少的内存,分叉和终止子进程。

启用 spoolsd 服务:

启用 spoolsd 服务

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. 添加以下参数:

      rpc_server:spoolss = external
      rpc_daemon:spoolssd = fork
    2. 另外,您可以设置以下参数:

      参数Default(默认)描述

      spoolssd:prefork_min_children

      5

      最小子进程数量

      spoolssd:prefork_max_children

      25

      子进程的最大数量

      spoolssd:prefork_spawn_rate

      5

      Samba 在此参数中设置的新子进程数量中分叉,最多为 spoolsd:prefork_max_children 中设置的值(如果建立新连接)

      spoolssd:prefork_max_allowed_clients

      100

      客户端数,子进程服务

      spoolssd:prefork_child_min_life

      60

      子进程的最低生命周期(以秒为单位)。60 秒是最小的。

  2. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  3. 重启 smb 服务:

    ~]# systemctl restart smb

重启该服务后,Samba 会自动启动 smbd 子进程:

~]# ps axf
...
30903 smbd
30912 \_ smbd
30913   \_ smbd
30914   \_ smbd
30915   \_ smbd
...

16.1.7.2. 在 Samba 中启用打印服务器支持

启用打印服务器支持:

在 Samba 中启用打印服务器支持

  1. 在 Samba 服务器上,设置 CUPS 并将打印机添加到 CUPS 后端。详情请查看 第 16.3 节 “打印设置”

    注意

    只有 Samba 打印服务器上本地安装了 CUPS 时,Samba 才能将打印作业转发到 CUPS。

  2. 编辑 /etc/samba/smb.conf 文件:

    1. 如果要启用 spoolsd 服务,请在 [global] 部分添加以下参数:

      rpc_server:spoolss = external
      rpc_daemon:spoolssd = fork

      详情请查看 第 16.1.7.1 节 “Samba spoolsd 服务”

    2. 要配置打印后端,请添加 [printers] 部分:

      [printers]
      	comment = All Printers
      	path = /var/tmp/
      	printable = yes
      	create mask = 0600
      重要

      打印机 共享名称是硬编码的,无法更改。

  3. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  4. 打开所需的端口并使用 firewall-cmd 工具重新载入防火墙配置:

    ~]# firewall-cmd --permanent --add-service=samba
    ~]# firewall-cmd --reload
  5. 重启 smb 服务:

    ~]# systemctl restart smb

重新启动 服务后,Samba 会自动共享在 CUPS 后端中配置的所有打印机。如果您只想手动共享特定打印机,请参阅 第 16.1.7.3 节 “手动共享特定打印机”

16.1.7.3. 手动共享特定打印机

如果您将 Samba 配置为打印服务器,默认情况下,Samba 共享 CUPS 后端配置的所有打印机。仅共享特定的打印机:

手动共享特定打印机

  1. 编辑 /etc/samba/smb.conf 文件:

    1. [global] 部分中,通过设置禁用自动打印机共享:

      load printers = no
    2. 为您要共享的每个打印机添加 部分。例如,要在 Samba 中将 CUPS 后端中名为 example 的打印机共享为 Example-Printer,请添加以下部分:

      [Example-Printer]
      	path = /var/tmp/
      	printable = yes
      	printer name = example

      您不需要为每个打印机单独设置 spool 目录。您可以在打印机 的路径 参数中设置与您在 [printers] 部分中设置相同的 spool 目录。

  2. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  3. 重新载入 Samba 配置:

    ~]# smbcontrol all reload-config

16.1.7.4. 为 Windows 客户端设置自动打印机驱动程序下载

如果您正在运行 Windows 客户端的 Samba 打印服务器,可以上传驱动程序和预配置打印机。如果用户连接到打印机,Windows 会自动在客户端本地下载并安装驱动程序。用户不需要本地管理员权限进行安装。另外,Windows 应用预配置的驱动程序设置,如托盘的数量。

注意

在设置自动打印机驱动程序下载之前,必须将 Samba 配置为打印服务器并共享打印机。详情请查看 第 16.1.7 节 “设置 Samba 打印服务器”

16.1.7.4.1. 有关打印机驱动程序的基本信息

本节提供有关打印机驱动程序的一般信息。

支持的驱动程序模型版本

Samba 仅支持 Windows 2000 及更高版本中支持的打印机驱动程序模型版本 3,以及 Windows Server 2000 及更高版本。Samba 不支持 Windows 8 和 Windows Server 2012 中引入的驱动程序模型版本 4。但是,这些及之后的 Windows 版本也支持版本 3 驱动程序。

可软件包的驱动程序

Samba 不支持可打包的驱动程序。

为进行上传准备打印机驱动程序

在您将驱动程序上传到 Samba 打印服务器之前:

  • 如果驱动程序采用压缩格式提供,请解包它。
  • 有些驱动程序需要启动一个设置应用程序,以便在 Windows 主机上在本地安装驱动程序。在某些情况下,安装程序会在设置运行期间将单个文件提取到操作系统的临时文件夹中。使用驱动程序文件上传:

    1. 启动安装程序。
    2. 将临时文件夹中的文件复制到新位置。
    3. 取消安装。

请您的打印机厂商提供支持上传到打印服务器的驱动程序。

为客户端为打印机提供 32 位和 64 位驱动程序

要为 32 位和 64 位 Windows 客户端提供打印机的驱动程序,您必须上传两个架构具有完全相同名称的驱动程序。例如,如果您上传名为 Example PostScript 的 32 位驱动程序和名为 Example PostScript (v1.0) 的 64 位驱动程序,则名称不匹配。因此,您只能为打印机分配其中一个驱动程序,且该驱动程序无法对这两个架构都适用。

16.1.7.4.2. 启用用户上传和预配置驱动程序

要上传和预配置打印机驱动程序,用户或组需要授予 SePrintOperatorPrivilege 权限。用户必须添加到 printadmin 组中。安装 samba 软件包时,Red Hat Enterprise Linux 会自动创建这个组。printadmin 组被分配了低于 1000 的可用最小动态系统 GID。

printadmin 组授予 SePrintOperatorPrivilege 权限:

~]# net rpc rights grant "printadmin" SePrintOperatorPrivilege \
    -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
Successfully granted rights.
注意

在域环境中,将 SePrintOperatorPrivilege 授予给域组。这可让您通过更新用户的组成员资格来集中管理权限。

列出所有授予 SePrintOperatorPrivilege 的 用户和组:

~]# net rpc rights list privileges SePrintOperatorPrivilege \
    -U "DOMAIN\administrator"
Enter administrator's password:
SePrintOperatorPrivilege:
 BUILTIN\Administrators
 DOMAIN\printadmin
16.1.7.4.3. 设置 打印$ 共享

Windows 操作系统从名为 print$ 的共享中下载打印机驱动程序。这个共享名称在 Windows 中硬编码,无法更改。

以 print$ 用户身份共享 /var/lib/samba/drivers/ 目录,并启用本地 printadmin 组的成员上传打印机驱动程序:

设置 打印$ 共享

  1. /etc/samba/smb.conf 文件中添加 [print$] 部分:

    [print$]
    	path = /var/lib/samba/drivers/
    	read only = no
    	write list = @printadmin
    	force group = @printadmin
    	create mask = 0664
    	directory mask = 2775

    使用这些设置:

    • 只有 printadmin 组的成员才能将打印机驱动程序上传到共享。
    • 新创建文件和目录的组将设为 printadmin
    • 新文件的权限将设置为 664
    • 新目录的权限将设置为 2775
  2. 要只为打印机上传 64 位驱动程序,请在 /etc/samba/smb.conf 文件的 [global] 部分包含此设置:

    spoolss: architecture = Windows x64

    如果没有这个设置,Windows 只会显示您至少上传 32 位版本的驱动程序。

  3. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  4. 重新载入 Samba 配置

    ~]# smbcontrol all reload-config
  5. 如果 printadmin 组不存在,则创建它:

    ~]# groupadd printadmin
  6. printadmin 组授予 SePrintOperatorPrivilege 特权。

    ~]# net rpc rights grant "printadmin" SePrintOperatorPrivilege \
        -U "DOMAIN\administrator"
    Enter DOMAIN\administrator's password:
    Successfully granted rights.

    详情请查看 第 16.1.7.4.2 节 “启用用户上传和预配置驱动程序”

  7. 如果您以 enforcing 模式运行 SELinux,请在目录中设置 samba_share_t 上下文:

    ~]# semanage fcontext -a -t samba_share_t "/var/lib/samba/drivers(/.*)?"
    ~]# restorecon -Rv /var/lib/samba/drivers/
  8. /var/lib/samba/drivers/ 目录中设置权限:

    • 如果使用 POSIX ACL,请设置:

      ~]# chgrp -R "printadmin" /var/lib/samba/drivers/
      ~]# chmod -R 2775 /var/lib/samba/drivers/
    • 如果使用 Windows ACL,请设置:

      主体权限适用于

      创建者所有者

      完整控制

      只适用于子文件夹和文件

      经过身份验证的用户

      读和执行、列出目录内容、读

      此文件夹、子文件夹和文件

      printadmin

      完整控制

      此文件夹、子文件夹和文件

      有关在 Windows 上设置 ACL 的详情,请查看您的 Windows 文档。

16.1.7.4.4. 创建 GPO 以启用客户端信任 Samba 打印服务器

出于安全考虑,最近的 Windows 操作系统会阻止客户端从不受信任的服务器下载非软件包的打印机驱动程序。如果您的打印服务器是 AD 中的成员,您可以在域中创建一个组策略对象(GPO)来信任 Samba 服务器。

要创建 GPO,您使用的 Windows 计算机必须安装有 Windows Remote Server 管理工具(RSAT)。详情请查看您的 Windows 文档。

创建 GPO 以启用客户端信任 Samba 打印服务器

  1. 使用允许编辑组策略的帐户(如 AD 域 管理员用户 )登录到 Windows 计算机。
  2. 打开 组策略管理控制台
  3. 右键单击您的 AD 域并选择 创建此域中的 GPO,然后链接此处

    Samba 创建新的 GPO
  4. 输入 GPO 的名称,如 Legacy 打印机驱动程序策略 并单击" 确定"。新的 GPO 将在域条目下显示。
  5. 右键单击新创建的 GPO,然后选择 Edit 以打开 Group Policy Management Editor
  6. 进入 Computer Configuration Policies Administrative Templates Printers

    Samba 选择打印机 GPO 组
  7. 在窗口的右侧,双击 Point 和 Print Restriction 以编辑策略:

    1. 启用策略并设置以下选项:

      1. 选择 Users 只能指向这些服务器并打印到这些服务器,再将 Samba 打印服务器的完全限定域名(FQDN)添加到此选项旁边的字段。
      2. Security Prompts 下的两个复选框中,选择 Do not show warning 或 elevation 提示

        Samba GPO 点和打印
    2. 确定
  8. 双击 Package Point 和 Print - Approved servers 以编辑策略:

    1. 启用策略并单击 Show 按钮。
    2. 输入 Samba 打印服务器的 FQDN。

      Samba GPO 批准的服务器
    3. 单击 OK,以关闭 Show Contents 和 policy 属性窗口。
  9. 关闭 组策略管理编辑器
  10. 关闭 组策略管理控制台

在 Windows 域成员应用组策略后,用户连接到打印机时会自动从 Samba 服务器下载打印机驱动程序。

有关使用组策略的详情,请查看您的 Windows 文档。

16.1.7.4.5. 上传驱动程序和预配置打印机

在 Windows 客户端上使用 Print Management 应用上传托管在 Samba 打印服务器上的驱动程序和预配置打印机。详情请查看您的 Windows 文档。

16.1.8. 调优 Samba 服务器的性能

本节介绍在某些情况下,哪些设置可以提高 Samba 的性能,以及哪些设置可能会对性能造成负面影响。

16.1.8.1. 设置 SMB 协议版本

每个新的 SMB 版本都会添加功能并提高协议的性能。最新的 Windows 和 Windows 服务器操作系统始终支持最新的协议版本。如果 Samba 还使用最新的协议版本,则连接 Samba 的 Windows 客户端可从性能改进中受益。在 Samba 中,服务器 max 协议 的默认值被设置为最新支持的 stable SMB 协议版本。

要始终启用最新的稳定 SMB 协议版本,请不要设置 server max protocol 参数。如果手动设置 参数,则需要修改 SMB 协议的每个新版本的设置,以启用最新的协议版本。

要取消设置,请从 /etc/samba/smb.conf 文件的 [global] 部分中删除 server max protocol 参数。

16.1.8.2. 使用包含大量文件的目录调优共享

提高包含超过 100.000 文件的目录的共享性能:

使用包含大量文件的目录调优共享

  1. 将共享上的所有文件重命名为小写。

    注意

    使用这个过程中的设置,名称不为小写的文件将不再显示。

  2. 在共享部分中设置以下参数:

    case sensitive = true
    default case = lower
    preserve case = no
    short preserve case = no

    有关参数的详情,请查看 smb.conf(5)man page 中的描述。

  3. 重新载入 Samba 配置:

    ~]# smbcontrol all reload-config

应用这些设置后,此共享上所有新建文件的名称都使用小写。由于这些设置,Samba 不再需要扫描大写和小写的 目录,这样可以提高性能。

16.1.8.3. 可具有潜在性能影响的设置

默认情况下,调整 Red Hat Enterprise Linux 中的内核以获得高网络性能。例如,内核对缓冲区大小使用自动轮询机制。在 /etc/samba/smb.conf 文件中设置 socket options 参数会覆盖这些内核设置。因此,设置此参数会在大多数情况下降低 Samba 网络性能。

要使用内核优化的设置,请从 /etc/samba/smb.conf 中的 [global] 部分删除 socket options 参数。

16.1.9. 常用 Samba 命令行实用程序

这部分论述了在使用 Samba 服务器时常用的命令。

16.1.9.1. 使用 网络 实用程序

net 实用程序允许您在 Samba 服务器中执行多个管理任务。本节介绍 net 实用程序最常用的子命令。

详情请查看 net(8)man page。

16.1.9.1.1. 使用 net ads joinnet rpc join 命令

使用 net 实用程序的 join 子命令,您可以将 Samba 加入到 AD 或 NT4 域。要加入该域,您必须手动创建 /etc/samba/smb.conf 文件,并选择性地更新其他配置,如 PAM。

重要

红帽建议使用 realm 实用程序加入域。realm 实用程序自动更新所有相关配置文件。详情请查看 第 16.1.5.1 节 “加入域”

使用 net 命令加入域:

使用 net 命令加入域

  1. 使用以下设置手动创建 /etc/samba/smb.conf 文件:

    • 对于 AD 域成员:

      [global]
      workgroup = domain_name
      security = ads
      passdb backend = tdbsam
      realm = AD_REALM
    • 对于 NT4 域成员:

      [global]
      workgroup = domain_name
      security = user
      passdb backend = tdbsam
  2. * 默认域和要加入到 /etc/samba/smb.conf 中的 [global] 部分的域添加 ID 映射配置。详情请查看 第 16.1.5.3 节 “了解 ID 映射”
  3. 验证 /etc/samba/smb.conf 文件:

    ~]# testparm

    详情请查看 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

  4. 以域管理员身份加入域:

    • 加入 AD 域:

      ~]# net ads join -U "DOMAINpass:quotes[administrator]"
    • 要加入 NT4 域:

      ~]# net rpc join -U "DOMAINpass:quotes[administrator]"
  5. winbind 源附加到 /etc/nsswitch.conf 文件中的 passwd 数据库条目中:

    passwd:   files winbind
    group:   files winbind
  6. 启用并启动 winbind 服务:

    ~]# systemctl enable winbind
    ~]# systemctl start winbind
  7. (可选)使用 authconf 实用程序配置 PAM。

    详情请查看 红帽系统级 身份验证指南中的使用可插拔验证 模块(PAM) 部分。

  8. 另外,对于 AD 环境,配置 Kerberos 客户端。

    详情请查看 Red Hat System-Level Authentication Guide 中的 配置 Kerberos 客户端 部分。

16.1.9.1.2. 使用 net rpc 权限 命令

在 Windows 中,您可以为帐户和组分配执行特殊操作的特权,如设置共享上的 ACL 或上传打印机驱动程序。在 Samba 服务器上,您可以使用 net rpc permissions 命令来 管理特权。

列出特权

若要列出所有可用的特权及其所有者,可使用 net rpc permissions list 命令。例如:

net rpc rights list -U "DOMAINpass:attributes[{blank}]administrator"
Enter DOMAINpass:attributes[{blank}]administrator's password:
   SeMachineAccountPrivilege Add machines to domain
   SeTakeOwnershipPrivilege Take ownership of files or other objects
       SeBackupPrivilege Back up files and directories
      SeRestorePrivilege Restore files and directories
   SeRemoteShutdownPrivilege Force shutdown from a remote system
   SePrintOperatorPrivilege Manage printers
      SeAddUsersPrivilege Add users and groups to the domain
    SeDiskOperatorPrivilege Manage disk shares
      SeSecurityPrivilege System security

授予特权

若要为帐户或组授予特权,可使用 net rpc 权限 grant 命令。

例如,为 DOMAIN\printadmin 组授予 SePrintOperatorPrivilege 权限:

~]# net rpc rights grant "DOMAIN\printadmin" SePrintOperatorPrivilege \
    -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
Successfully granted rights.

撤销特权

若要从帐户或组撤销特权,可使用 net rpc 权限撤销

例如,要从 DOMAIN\printadmin 组撤销 SePrintOperatorPrivilege 权限:

~]# net rpc rights remoke "DOMAIN\printadmin" SePrintOperatorPrivilege \
    -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
Successfully revoked rights.
16.1.9.1.3. 使用 net rpc 共享 命令

net rpc share 命令提供在本地或远程 Samba 或 Windows 服务器上列出、添加和删除共享的功能。

列出共享

若要列出 SMB 服务器上的共享,请使用 net rpc share list 命令。(可选)将 -S server_name 参数传递到 命令,以列出远程服务器的共享。例如:

~]# net rpc share list -U "DOMAIN\administrator" -S example
Enter DOMAIN\administrator's password:
IPC$
share_1
share_2
...
注意

在 Samba 服务器上托管的共享(在 /etc/samba/smb.conf 文件中的 部分已设置 = no set)不会显示在 /etc/samba/smb.conf 文件中。

添加共享

net rpc 共享 add 命令允许您向 SMB 服务器添加共享。

例如,要在共享 C:\example\ 目录的远程 Windows 服务器中添加一个名为 example 的共享:

~]# net rpc share add example="C:\example" -U "DOMAIN\administrator" -S server
注意

在指定 Windows 目录名称时,您必须省略路径中的结尾反斜杠。

使用命令在 Samba 服务器中添加共享:

  • -U 参数中指定的用户必须授予 SeDiskOperatorPrivilege 权限。
  • 您必须编写一个在 /etc/samba/smb.conf 文件中添加共享部分并重新加载 Samba 的脚本。该脚本必须在 /etc/samba/smb.conf[global] 部分中的 add share 命令 参数中设置。详情请查看 smb.conf(5)man page 中的 add share 命令 描述。

删除共享

net rpc share delete 命令允许您从 SMB 服务器中删除共享。

例如,要从远程 Windows 服务器中删除名为 example 的共享:

~]# net rpc share delete example -U "DOMAIN\administrator" -S server

使用命令从 Samba 服务器中删除共享:

  • -U 参数中指定的用户必须授予 SeDiskOperatorPrivilege 权限。
  • 您必须编写一个从 /etc/samba/smb.conf 文件中删除共享的 部分并重新加载 Samba 的脚本。该脚本必须在 /etc/samba/smb.conf[global] 部分中的 delete share 命令 参数中设置。详情请查看 smb.conf(5)man page 中的 删除共享命令 描述。
16.1.9.1.4. 使用 net 用户 命令

net user 命令可让您在 AD DC 或 NT4 PDC 中执行以下操作:

  • 列出所有用户帐户
  • 添加用户
  • 删除用户
注意

只有在列出域用户帐户时,才需要指定连接方法,如 AD 域或 rpc 的 NT4 域的 ad。其他用户相关的子命令可以自动探测连接方法。

-U user_name 参数传递给 命令,以指定允许执行请求操作的用户。

列出域用户帐户

列出 AD 域中的所有用户:

~]# net ads user -U "DOMAIN\administrator"

列出 NT4 域中的所有用户:

~]# net rpc user -U "DOMAIN\administrator"

将用户帐户添加到域

在 Samba 域成员中,您可以使用 net user add 命令将用户帐户添加到该域。

例如,将 用户帐户 添加到域中:

将用户帐户添加到域

  1. 添加帐户:

    ~]# net user add user password -U "DOMAIN\administrator"
    User user added
  2. (可选)使用远程过程调用(RPC)shell 在 AD DC 或 NT4 PDC 中启用帐户。例如:

    ~]# net rpc shell -U DOMAIN\administrator -S DC_or_PDC_name
    Talking to domain DOMAIN (S-1-5-21-1424831554-512457234-5642315751)
    
    net rpc> user edit disabled user no
    Set user's disabled flag from [yes] to [no]
    
    net rpc> exit

从域中删除用户帐户

在 Samba 域成员中,您可以使用 net user delete 命令从域中删除用户帐户。

例如,要从域中删除 用户帐户

~]# net user delete user -U "DOMAIN\administrator"
User user deleted
16.1.9.1.5. 使用 net usershare 命令

请参阅 第 16.1.6.4 节 “启用用户在 Samba 服务器上共享目录”

16.1.9.2. 使用 rpcclient 实用程序

The rpcclient 实用程序可让您在本地或远程 SMB 服务器上手动执行客户端 Microsoft 远程过程调用(MS-RPC)功能。但是,大部分功能都已集成到 Samba 提供的单独实用程序中。Use rpcclient 仅用于测试 MS-PRC 功能。

例如,您可以使用该工具:

  • 管理打印机池子系统(SPOOLSS)。

    例 16.9. 将驱动程序分配给打印机

    ~]# rpcclient server_name -U "DOMAINpass:quotes[administrator]" \
        -c 'setdriver "printer_name" "driver_name"'
    Enter DOMAINpass:quotes[administrator]s password:
    Successfully set printer_name to driver driver_name.
  • 检索有关 SMB 服务器的信息。

    例 16.10. 列出所有文件共享和共享的打印机

    ~]# rpcclient server_name -U "DOMAINpass:quotes[administrator]" -c 'netshareenum'
    Enter DOMAINpass:quotes[administrator]s password:
    netname: Example_Share
    	remark:
    	path:  C:\srv\samba\example_share\
    	password:
    netname: Example_Printer
    	remark:
    	path:  C:\var\spool\samba\
    	password:
  • 使用安全帐户管理器远程(SAMR)协议执行操作。

    例 16.11. 在 SMB 服务器中列出用户

    ~]# rpcclient server_name -U "DOMAINpass:quotes[administrator]" -c 'enumdomusers'
    Enter DOMAINpass:quotes[administrator]s password:
    user:[user1] rid:[0x3e8]
    user:[user2] rid:[0x3e9]

    如果您针对单机服务器或域成员运行 命令,它会将用户列在本地数据库中。针对 AD DC 或 NT4 PDC 运行命令列出域用户。

有关支持子命令的完整列表,请参见 rpcclient(1)man page 中的 COMMANDS 部分。

16.1.9.3. 使用 samba-regedit 应用

某些设置(如打印机配置)存储在 Samba 服务器上的注册表中。您可以使用基于 ncurses 的 samba-regedit 应用来编辑 Samba 服务器的注册表。

Samba regedit

要启动应用程序,请输入:

~]# samba-regedit

使用以下键:

  • 上键和下键:在注册表树和值中进行导航。
  • Enter:打开关键字或编辑值。
  • 选项卡 :在 KeyValue 窗格间切换。
  • Ctrl+C:关闭应用程序。

16.1.9.4. 使用 smbcacls 实用程序

请参阅 第 16.1.6.3 节 “使用 smbcacls管理 SMB 共享上的 ACL”

16.1.9.5. 使用 smbclient 实用程序

smbclient 实用程序允许您访问 SMB 服务器上的文件共享,这与命令行 FTP 客户端类似。例如,您可以使用它向共享上传和下载文件。

例如,使用 DOMAIN\user 帐户对 服务器上 托管的示例 共享 进行身份验证:

~]# smbclient -U "DOMAIN\user" //server/example
Enter domain\user's password:
Domain=[SERVER] OS=[Windows 6.1] Server=[Samba 4.6.2]
smb: \>

smbclient 连接到共享后,实用程序进入互动模式并显示以下提示:

smb: \>

要在互动 shell 中显示所有可用命令,请输入:

smb: \> help

要显示特定命令的帮助信息,请输入:

smb: \> help command_name

有关交互式 shell 中可用命令的详情和说明,请参阅 smbclient(1)man page。

16.1.9.5.1. 在交互模式中使用 smbclient

如果您使用不带 -c 参数的 smbclient,则实用程序将进入交互模式。

以下流程演示了如何连接到 SMB 共享并从子目录下载文件:

使用 smbclient从 SMB 共享下载文件

  1. 连接到共享:

    ~]# smbclient -U "DOMAINpass:quotes[user_name]" //server_name/share_name
  2. 进入 /example/ 目录:

    smb: \> cd /example/
  3. 列出目录中的文件:

    smb: \example\> ls
     .          D     0 Mon Sep 1 10:00:00 2017
     ..          D     0 Mon Sep 1 10:00:00 2017
     example.txt     N  1048576 Mon Sep 1 10:00:00 2017
    
         9950208 blocks of size 1024. 8247144 blocks available
  4. 下载 example.txt 文件:

    smb: \example\> get example.txt
    getting file \directory\subdirectory\example.txt of size 1048576 as example.txt (511975,0 KiloBytes/sec) (average 170666,7 KiloBytes/sec)
  5. 从共享断开:

    smb: \example\> exit
16.1.9.5.2. 在脚本模式中使用 smbclient

如果将 -c 命令 参数传递给 smbclient,则可以自动对远程 SMB 共享执行命令。这可让您在脚本中使用 smbclient

以下命令显示如何连接到 SMB 共享并从子目录下载文件:

~]# smbclient -U DOMAINpass:quotes[user_name] //server_name/share_name \
    -c "cd /example/ ; get example.txt ; exit"

16.1.9.6. 使用 smbcontrol 实用程序

smbcontrol 实用程序允许您向 smbdnmbdwinbindd 或 所有这些服务发送命令消息。这些控制消息指示服务重新载入其配置。

例 16.12. 重新加载 smbdnmbdwinbindd 服务的配置

例如,要重新载入 smbdnmbdwinbindd 的配置,将 reload-config message- type 发送到 所有 目的地:

~]# smbcontrol all reload-config

详情以及可用命令消息类型的列表,请参阅 smbcontrol(1)man page。

16.1.9.7. 使用 smbpasswd 实用程序

smbpasswd 实用程序在本地 Samba 数据库中管理用户帐户和密码。

如果您以用户身份运行 命令,smb passwd 将更改用户的 Samba 密码。例如:

[user@server ~]$ smbpasswd
New SMB password:
Retype new SMB password:

如果以 root 用户身份运行 smbpasswd,您可以使用该实用程序,例如:

  • 创建一个新用户:

    [root@server ~]# smbpasswd -a user_name
    New SMB password:
    Retype new SMB password:
    Added user user_name.
    注意

    在将用户添加到 Samba 数据库之前,您必须先在本地操作系统中创建帐户。请查看 第 4.3.1 节 “添加新用户”

  • 启用 Samba 用户:

    [root@server ~]# smbpasswd -e user_name
    Enabled user user_name.
  • 禁用 Samba 用户:

    [root@server ~]# smbpasswd -x user_name
    Disabled user user_name.
  • 删除用户:

    [root@server ~]# smbpasswd -x user_name
    Deleted user user_name.

详情请查看 smbpasswd(8)man page。

16.1.9.8. 使用 smbstatus 实用程序

smbstatus 工具报告:

  • 每个 smbd 守护进程的每个 PID 与 Samba 服务器的连接。此报告包括用户名、主组群、SMB 协议版本、加密和签名信息。
  • 每个 Samba 共享的连接。此报告包含 smbd 守护进程的 PID、连接计算机的 IP、连接的时间戳、加密和签名信息。
  • 锁定文件列表。报告条目包括更多详情,如 Opportunistic lock(oplock)类型

例 16.13. smbstatus 实用程序的输出

~]# smbstatus

Samba version 4.6.2
PID Username       Group        Machine              Protocol Version Encryption Signing
-----------------------------------------------------------------------------------------------------------------------------
963 DOMAIN\administrator DOMAIN\domain users client-pc (ipv4:192.0.2.1:57786) SMB3_02      -      AES-128-CMAC

Service pid Machine  Connected at         Encryption Signing:
-------------------------------------------------------------------------------
example 969 192.0.2.1 Mo Sep 1 10:00:00 2017 CEST -      AES-128-CMAC

Locked files:
Pid Uid  DenyMode  Access  R/W   Oplock   SharePath      Name   Time
------------------------------------------------------------------------------------------------------------
969 10000 DENY_WRITE 0x120089 RDONLY LEASE(RWH) /srv/samba/example file.txt Mon Sep 1 10:00:00 2017

详情请查看 smbstatus(1)man page。

16.1.9.9. 使用 smbtar 实用程序

smbtar 实用程序备份 SMB 共享的内容或其子目录,并将内容存储在 tar 存档中。或者,您可以将内容写入磁带设备。

例如,在 //server/example/ 共享 中备份 demo 目录的内容,并将内容存储在 /root/example.tar 归档中:

~]# smbtar -s server -x example -u user_name -p password -t /root/example.tar

详情请查看 smbtar(1)man page。

16.1.9.10. 使用 testparm 实用程序

请参阅 第 16.1.2 节 “使用 testparm 实用程序验证 smb.conf 文件”

16.1.9.11. 使用 wbinfo 实用程序

The wbinfo 实用程序查询并返回 winbindd 服务创建和使用的信息。

注意

winbindd 服务必须配置并运行才能使用 wbinfo

您可以使用 wbinfo,例如:

  • 列出域用户:

    ~]# wbinfo -u
    AD\administrator
    AD\guest
    ...
  • 列出域组:

    ~]# wbinfo -g
    AD\domain computers
    AD\domain admins
    AD\domain users
    ...
  • 显示用户的 SID:

    ~]# wbinfo --name-to-sid="AD\administrator"
    S-1-5-21-1762709870-351891212-3141221786-500 SID_USER (1)
  • 显示域和信任的信息:

    ~]# wbinfo --trusted-domains --verbose
    Domain Name  DNS Domain      Trust Type Transitive In  Out
    BUILTIN               None    Yes     Yes Yes
    server               None    Yes     Yes Yes
    DOMAIN1    domain1.example.com  None    Yes     Yes Yes
    DOMAIN2    domain2.example.com  External  No     Yes Yes

详情请查看wbinfo(1)man page。

16.1.10. 其它资源

  • Red Hat Samba 软件包包含所有 Samba 命令的 man page 以及软件包安装的配置文件。例如,显示 /etc/samba/smb.conf 文件的 man page,说明您可以在此文件中设置的所有配置参数:

    ~]# man 5 smb.conf
  • /usr/share/docs/samba-版本/ :包含 Samba 项目提供的常规文档、示例脚本和 LDAP 架构文件。
  • 红帽集群存储管理指南 :提供有关设置 Samba 和集群 Trivial 数据库(CDTB)以共享 GlusterFS 卷中存储的目录的信息。
  • Red Hat Enterprise Linux High Availability Add-on 管理 指南中的红帽高可用性群集章节中的主动/主动 Samba 服务器 介绍了如何启动 Samba 高可用性安装。
  • 有关在 Red Hat Enterprise Linux 中挂载 SMB 共享的详情,请查看《红帽存储管理指南》中的对应章节
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.