Linux基础服务 ·

Samba服务的基础设定

SAMBA 所需软件及其软件结构

目前常见的 samba 版本为 3.x 版,我们这里主要介绍的是预设的 3.x 版本,其基本上有这些:

  • samba: 这个软件主要提供了 SMB 服务器所需的各项服务程序 (smbd 及 nmbd)、以及其他与 Samba 相关的 logrotate 配置文件及开机默认选项文件等;
  • samba-client: 这个软件则提供了当 Linux 做为 Samba Client 端时,所需要的工具指令,例如挂载 Samba文件格式的 mount.cifs、 取得类似 网络邻居 相关树形图的 smbtree 等等;
  • samba-common: 这个软件提供的则是服务器与客户端都会使用到的数据,包括 Samba 的主要配置文件 (smb.conf)、语法检验指令 (testparm) 等等;

这三个软件你都得要安装才行!安装完毕之后,你可以依序查看一下 Samba 的软件结构!与它相关的配置文件基本上有这些:

  • /etc/samba/smb.conf: 这是 Samba 的主要配置文件,基本上,咱们的 Samba 就仅有这个配置文件而已,且这个配置文件本身就是很详细的说明文件了!主要的设定项目分为服务器的相关设定 (global),如工作组、NetBIOS 名称与密码等级等, 以及分享的目录等相关设定,如实际目录、分享资源名称与权限等等两大部分。
  • /etc/samba/lmhosts: 早期的 NetBIOS name 需额外设定,因此需要这个 lmhosts 的 NetBIOS name 对应的 IP 文件。 事实上它有点像是 /etc/hosts 的功能!只不过这个 lmhosts 对应的主机名是 NetBIOS name !不要跟 /etc/hosts 搞混了!目前 Samba 预设会去使用你的本机名称 (hostname) 作为你的 NetBIOS name,因此这个文件不设定也无所谓。
  • /etc/sysconfig/samba: 提供启动 smbd, nmbd 时,自定义加入的相关服务参数。
  • /etc/samba/smbusers: 由于 Windows 与 Linux 在管理员与访客的账号名称不一致,例如: administrator (windows) 及 root(linux), 为了对应这两者之间的账号关系,可使用这个文件来设定。
  • /var/lib/samba/private/{passdb.tdb,secrets.tdb}: 管理 Samba 的用户账号/密码时,会用到的数据库 文件;
  • /usr/share/doc/samba-<版本>: 这个目录包含了 SAMBA 的所有相关的技术手册!也就是说,当你安装好了 SAMBA 之后,你的系统里面就已经含有相当丰富而完整的 Samba 使用手册了!

至于常用的脚本文件方面,若分为服务器与客户端功能,则主要有底下这几个数据:

  • /usr/sbin/{smbd,nmbd}:服务器功能,就是最重要的权限管理 (smbd) 以及 NetBIOS name 查询 (nmbd) 两个重要的服务程序;
  • /usr/bin/{tdbdump,tdbtool}:服务器功能,在 Samba 3.0 以后的版本中,用户的账号与密码参数已经转为使用数据库了!Samba 使用的数据库名称为 TDB (Trivial DataBase)。 既然是使用数据库,当然要使用数据库的控制指令来处理。tdbdump 可以察看数据库的内容,tdbtool 则可以进入数据库操作接口直接手动修改帐密参数。不过,你得要安装 tdb-tools 这个软件才行;
  • /usr/bin/smbstatus:服务器功能,可以列出目前 Samba 的联机状况, 包括每一条 Samba 联机的 PID, 分享的资源,使用的用户来源等等,让你能够轻松管理 Samba ;
  • /usr/bin/{smbpasswd,pdbedit}:服务器功能,在管理 Samba 的用户账号密码时, 早期是使用 smbpasswd 这个指令,不过因为后来使用 TDB 数据库了,因此建议使用新的 pdbedit 指令来管理用户数据;
  • /usr/bin/testparm:服务器功能,这个指令主要在检验配置文件 smb.conf 的语法正确与否,当你编辑过 smb.conf 时,请务必使用这个指令来检查一次,避免因为打字错误引起困扰!
  • /sbin/mount.cifs:客户端功能,在 Windows 上面我们可以设定『网络驱动器机』来连接到自己的主机上面。在 Linux 上面,我们则是通过 mount (mount.cifs) 来将远程主机分享的文件与目录挂载到自己的 Linux 主机上面!
  • /usr/bin/smbclient:客户端功能,当你的 Linux 主机想要藉由『网络邻居』的功能来查看别台计算机所分享出来的目录与设备时,就可以使用 smbclient 来查看!这个指令也可以使用在自己的 Samba 主机上面,用来查看是否设定成功!
  • /usr/bin/nmblookup:客户端功能,有点类似 nslookup !主要用于查出 NetBIOS name 。
  • /usr/bin/smbtree:客户端功能,这玩意就有点像 Windows 系统的 网络邻居 显示的结果,可以显示类似『附近的计算机』之类的数据, 能够查到工作组与计算机名称的树状目录分布图!

大致的软件结构就是这样,底下就准备来讲一个简单的案例吧!这样比较好介绍配置文件项目!

基础分享流程

既然 Samba 是要加入 Windows 的网络邻居服务当中,所以它的设定方式应该是要与网络邻居差不多才是。所以我们先来聊一聊 Windows 的一些网络邻居设定方法。

在早期 Windows 的网络邻居设定比较简单,不过也因为太简单, 所以产生的安全问题可是相当的麻烦的。后来在 Windows XP 的 SP2 (服务包第二版) 之后加入了很多的预设防火墙机制, 因此使用网络邻居的预设限制常常会是这样的:

  • 服务器与客户端之间必须要在同一个网段当中 (否则需要修改 Windows 预设防火墙);
  • 最好设定为同一工作组;
  • 主机的名称不可相同 (NetBIOS name);
  • 专业版 Windows XP 最多仅能提供同时 10 个用户联机到同一台网络邻居服务器上。

工作组与主机名的设定,你可以在『我的计算机』右键单击,选择内容后去修订相关的设定值。当你的 Windows 主机群符合上述的条件后,就很容易处理网络邻居分享的工作了!分享的步骤一般是这样的:

  1. 打开文件资源管理器,然后在要分享的目录、磁盘或设备 (如打印机) 上面按下右键,选择『共享』,然后就能够设定好分享的数据了;
  2. 最好建立一组给用户使用的账号与密码,让其他主机的用户可以通过该账号密码联机进入使用网络邻居分享的资源;

而 Samba 的设置也是很简单,依据上述的限制以及流程你可以这样想象:

  1. 服务器整体设定方面:在 smb.conf 当中设定好工作组、NetBIOS 主机名、密码使用状态 (无密码分享或本机密码) 等等;
  2. 规划准备分享的目录参数:在 smb.conf 内设定好预计要分享的目录或设备以及可供使用的账号数据;
  3. 建立所需要的文件系统:根据步骤 2 的设定,在 Linux 文件系统当中建立好分享出去的文件或设备,以及相关的权限参数;
  4. 建立可用 Samba 的账号:根据步骤 2 的设定,建立所需的 Linux 实体账号,再以 pdbedit 建立使用 Samba 的密码;
  5. 启动服务:启动 Samba 的 smbd, nmbd 服务,开始运行!

根据上面的流程,其实我们最需要知道的就是 smb.conf 这个配置文件的信息。 所以首先我们就要来介绍一下这个文件的设定方式!

这个文件其实可以分为两部份来看, 一个是主机信息部分,在 smb.conf 当中以 [global] (全领域) 作为设定的依据;另一个则是分享的信息, 以个别的目录名称为依据。另外,由于 Samba 主要是想加入网络邻居功能,因此在 smb.conf 内的很多设定都与 Windows 类似:

  • 在 smb.conf 当中,井号与分号 (# 跟 😉 都是注释符号;
  • 在这个配置文件中,大小写是没关系的!因为 Windows 不严格区分大小写!

smb.conf 的服务器整体参数: [global] 项目

在 smb.conf 这个配置文件当中的设定项目有点像底下这样:

在 [global] 当中的就是一些服务器的整体参数,包括工作组、主机的 NetBIOS 名称、字符编码的显示、登录文件的设定、 是否使用密码以及使用密码验证的机制等等,都是在这个 [global] 项目中设定的。至于 [分享资源名称] 则是针对你开放的目录来进权限方面的设定,包括谁可以浏览该目录、是否可以读写等等参数。 在 [global] 部分关于主机名信息方面的参数主要有:

  • workgroup = 工作组的名称:注意,主机群要相同;
  • netbios name = 主机的 NetBIOS 名称,每部主机均不同;
  • server string = 主机的简易说明,这个随便写即可。

另外,过去常常让使用者心生不满的语系显示问题方面,你务必要清楚的知道的是,Samba 服务器上面的数据 (例如 mount 磁盘分区槽的参数以及原本的数据编码), Samba 服务器显示的语系, Windows 客户端显示的语系, Windows 客户端连上 Samba 的软件 都需要符合设定值才行!在新版的 3.x 上面有数个提供这些语系转换的设定,如下所示:

  • display charset = 自己服务器上面的显示编码, 例如你在终端机时所查阅的编码信息。一般来说,与底下的 unix charset 会相同。
  • unix charset = 在 Linux 服务器上面所使用的编码,一般来说就是 i18n 的编码! 所以你必须要参考 /etc/sysconfig/i18n 内的『默认』编码。
  • dos charset = 就是 Windows 客户端的编码了! 一般来说我们的简体中文 Windows 使用的是 GB2312 编码,这个编码在 Samba 内的格式被称为『 cp936 』!

除此之外,还有登录文件方面的信息,包括这些参数:

  • log file = 日志文件放置的文件,文件名可能会使用变量处理;
  • max log size = 日志文件最大仅能到多少 Kbytes ,若大于该数字,则会被 rotate 掉。

还有网络邻居开放分享时,安全性程度有关的密码参数,包括这几个:

  • security = share, user, domain:三选一,这三个设定值分别代表:
    • share:分享的数据不需要密码,大家均可使用 (没有安全性);
    • user :使用 SAMBA 服务器本身的密码数据库,密码数据库与底下的 passdb backend 有关;
    • domain:使用外部服务器的密码,亦即 SAMBA 是客户端之意,如果设定这个项目, 你还得要提供『password server = IP』的设定值才行;
  • encrypt passwords = Yes 代表密码要加密,注意那个 passwords 要有 s 才对!
  • passdb backend = 数据库格式,如前所述,为了加快速度, 目前密码文件已经转为使用数据库了!默认的数据库格式为 tdbsam ,而预设的数据库文件则放置到 /var/lib/samba/private/passwd.tdb。

事实上 Samba 的密码方面设定值很多,包括你还可以利用 samba 来修改 /etc/passwd 里用户的密码! 不过这个时候就得需要『 unix password sync 』以及『 passwd program 』这两个参数值来配合。 我们这里先谈比较简单的,其他进阶的部分可以 man smb.conf 去进行搜寻查阅!

分享资源的相关参数设定 [分享的名称]

分享目录或文件的分享名称,中刮号里面放的是『分享名称』! 那在这个分享名称内常见的参数有:

[分享名称] :这个分享名称很重要,它是一个『代号』而已。

comment :只是这个目录的说明而已!

path :这个分享名称实际会进入的 Linux 文件系统 (目录)。 也就是说,在网络邻居当中看到的是 [分享] 的名称,而实际操作的文件系统则是在 path 里头所设定的。

browseable :是否让所有的用户看到这个项目?

writable :是否可以写入?注意,如果 writable 在这里设定为 yes ,即可以写入,而 read only 同时设定为 yes ,那么最后出现的那个设定值生效!

create mode 与 directory mode 都与权限有关!

writelist = 使用者, @群组,这个项目可以指定能够进入到此资源的特定使用者。 如果是 @group 的格式,则加入该群组的使用者均可取得使用的权限,设定上会比较简单!

因为分享的资源主要与 Linux 系统的文件权限有关,因此里头的设定参数多与权限有关。

smb.conf 内的可用变量功能

为了简化设定值,Samba 提供很多不同的变量给我们来使用,主要有底下这几个变量:

%S:取代目前的设定项目值,所谓的『设定项目值』就是在 [分享] 里面的内容!举例来说,例如底下的设定范例:

因为 valid users 是允许的登入者,设定为 %S 表示任何可登入的使用者都能够登入的意思。例如: dmtsai 这个使用者登入之后,那个 [homes] 就会自动的变成了 [dmtsai] 了! %S 的用意就是在替换掉目前 [ ] 里面的内容!

%m:代表 Client 端的 NetBIOS 主机名!

%M:代表 Client 端的 Internet 主机名!就是 HOSTNAME。

%L:代表 SAMBA 主机的 NetBIOS 主机名。

%H:代表用户的家目录。

%U:代表目前登入的使用者的使用者名称

%g:代表登入的使用者的组名。

%h:代表目前这部 SAMBA 主机的 HOSTNAME !注意是 hostname 不是 NetBIOS name !

%I:代表 Client 的 IP 。

%T:代表目前的日期与时间

以上就是在 smb.conf 上头常看到的几种设定项目。

我们底下用几个小范例来实际的介绍 smb.conf 的设定!

不需密码的分享 (security = share, 纯测试)

不需要密码的分享(security = share)

不需要密码就能够使用 Samba 主机所提供的目录资源,因为不需要密码就能够登入, 虽然你可以设定权限成为只读,但是若不小心将重要数据放置到该分享的目录当中,那可非常危险,所以尽量不要这样设定。


假设条件

在底下的案例中,服务器 (172.16.250.56) 预计设定的参数状况为:

在 LAN 内所有的网络邻居主机工作组 (workgroup) 为:house

这部 Samba 服务器的 NetBIOS 名称 (netbios name) 为: sambaserver

使用者认证层级设定 (security) 为: share

取消原本有放行的 [homes] 目录;

仅分享 /tmp 这个目录而已,且取名为: temp

Linux 服务器的编码格式假设为万国码 (Unicode, 亦即 utf8)

客户端为中文 Windows ,在客户端的软件也使用 gb2312 的编码

因为现在我们都用 IP 进行网络邻居联机,不一定会使用主机名, netbios name 几乎可以不用设定了!所以不 演示 lmhosts 的设定!


1. 设定 smb.conf 配置文件

由于我们有设定语系相关的数据,因此得要先查查看,到底我们 Linux 服务器的语系是否为 utf8 ,检查方法如下:

如上所示,确实是 utf8 !而在这个例子当中我们仅分享 /tmp 这个目录而已,而且假设这个分享出来的目录是可擦写的, 另外,我们并没有分享打印机!而在 smb.conf 当中的批注符号可以是『 # 』也可以是『 ; 』!要注意!


请你特别留意,在原本的 smb.conf 上面就已经有很多默认值了,这些默认值如果你不知道他的用途, 尽量保留默认值,也可以使用 man smb.conf 去查询该默认值的意义。上述的设定是完全控制使用者的认证层级的!

2. 用 testparm 查阅 smb.conf 的语法设定正确性

在启动 samba 之前,我们务必要了解到 smb.conf 里面语法是否正确,检验的方式使用 testparm 这个指令即可。 测试方式如下:

上头是语法验证与各个项目的列出,如果你下达 testparm 却出现如下画面那就是有问题:


如果发现上述的错误,这表示你的 smb.conf 有个『 linux charset 』的设定参数,不过 smb.conf 其实是不支持这个参数的。 可能的问题是 samba 2.x 与 samba 3.x 有一些项目的支持已经不存在了,所以你使用旧版的 2.x 配置文件来 3.x 上头执行时,就会出现问题。此外,『打字错误』也是很常见的一个问题吶!赶紧测试一下语法先, 然后根据 smb.conf 存在的项目去进行修改吧。

如果你想要了解 samba 的所有设定 (包括没有在 smb.conf 里头设定的默认值),可以使用 testparm -v 来作详细的输出, 资料相当的丰富,通过这个你也可以知道你的主机环境设定!

3. 服务器端的服务启动与端口观察

启动实在太简单了,利用预设的 CentOS 启动方式来处理即可。

特别注意,在 Samba 当中预设会启动多个端口,这包括数据传输的 TCP 端口 (139, 445),以及进行 NetBIOS 名称解析之类工作的 UDP 端口 (137, 138),所以你才会看到很多数据。那么能否仅支持 139 这个必要的端口,关闭 445 呢?通过 testparm -v 的观察,可以发现『 smb ports = 445 139 』这个设定值指定两个端口的,因此你可以在 smb.conf 增加这个设定值,并改为 smb ports = 139 即可。不过,建议先保留默认值!

4. 假设自我为客户端的检验 (默认用 lo 接口)

关于客户端的观察我们会在后续进行介绍。在这里仅是说明如何确定我们的 Samba 设定与服务有顺利的在运作。 我们可以在本机上通过 smbclient 这支程序来处理,它的基本查询语法是这样的:

由于在这个范例当中我们并没有规范用户的安全等级 (share),所以不必使用 -U 这个选项,因此你可以这样看看:

上表输出的信息当中,分享的目录资源 (Sharename) 就是在 smb.conf 当中设定的 [temp] 名称! 因此在这里的意思是:任何人都可以进入 //127.0.0.1/temp 这个目录当中, 而这个目录在 Linux 系统其实是 /tmp 目录。至于那个 IPC$ 则是为了要应付 Windows 环境所必须要存在的项目。那么该如何使用这个资源呢?接下来我们可以利用 mount 这个指令来测试看看:

确实可以挂载的起来,所以,测试完毕后,就将这个挂载的资料卸除。关于 mount 的用法,我们会在后面继续介绍。


基本上,到此为止咱们就设定好一个简单的不需要密码即可登入的 Samba 服务器了! 接下来,让我们以简易的需要密码才能够登入 Samba 的方式来设计一个范例!

需账号密码才可登入的分享(security = user)

设定一部不需密码即可登入的 Samba server 是非常简单的,不过, 数据的安全性就很难保证了。

这时可以通过 Samba 服务器提供的认证方式来进行用户权力的给予, 也就是说,你在客户端联机到服务器时,必须要输入正确的账号与密码后,才能够登入 Samba 查阅到你自己的数据!而 Samba 本身就提供一个小程序来帮助我们处理密码的建立了,整个流程还不太难。

比较重要的是 Samba 使用者账号必须要存在于 Linux 系统当中 (/etc/passwd), 但是 Samba 的密码与 Unix 的密码文件并不相同 (这是因为 Linux 与网络邻居的密码验证方式及编码格式不同所致)。 这就比较有点小麻烦,没关系,就让我们依样画葫芦来处理一下这个部分的设定吧!

假设条件

由于使用者层级会改变成 user 的阶段,因此 [temp] 已经没有必要存在!请将该设定删除或批注。 而服务器方面的整体数据则请保留,包括工作组等等的数据,并新增底下的资料:

使用者认证层级设定 (security) 为: user

用户密码文件使用 TDB 数据库格式,默认数据库文件在 /var/lib/samba/private/ 内;

密码必须要加密;

每个可使用 samba 的使用者均拥有自己的家目录;

设定三个用户,名称为 smb1, smb2, smb3 ,且均加入 users 为次要群组。此三个用户 Linux 密码为 1234, Samba 密码则为 4321;

分享 /home/project 这个目录,且资源名称取名为: project;

加入 users 这个群组的使用者可以使用 //IP/project 资源,且在该目录下 users 这个群组的使用者具有写入的权限。

好了,开始一步步的处理吧!

1. 设定 smb.conf 配置文件与目录权限相关之设定

在这个范例的配置文件当中,我们需要新增几个参数:

在上表当中比较重要的设定项目主要有:

[global] 修改与新增的部分:security 设定为 user 层级,且使用『passdb backend = tdbsam』这个数据库格式,因此密码文件会放置于 /var/lib/samba/private/ 内。 此外,默认密码就是加密的,因此不需要额外使用其他的设定参数来规范;

[homes] 这个使用者资源共享部分: homes 是最特殊的资源共享名称,因为 Linux 上面的每位用户均有家目录,例如 smb1 的家目录位于 /home/smb1/ ,那当 smb1 用户使用 samba 时,她就会发现多了个 //127.0.0.1/smb1/ 的资源可用,而 smb2 就在 //127.0.0.1/smb2/ 这个资源。由于不可浏览 (browseable),所以除了使用者可以看到自己的家目录资源外,其他人是无法浏览的。此外,为了规范权限,而多了 create mode 与 directory mode 两个设定值 (此值可设定也可不理会);

[project] 这个使用者资源共享部分:当我们新增一个共享资源时, 最重要的就是规范资源名称。在此例中我们使用 project 这个资源名称来指向 /home/project ,也就是说, //127.0.0.1/project 代表的是 /home/project 的意思。此外,能够使用这个资源的账号,为加入 users 这个群组的用户! 不过能否顺利的存取文件还与 Linux 最底层的文件权限有关。

千万不要忘记了,除了配置文件之外,详细的目录权限与账号设定等规范也要设定好!底下我们用范例来进行此项工作!

例题:

我们预计要分享 /home/project 目录,这个目录的权限该如何设定?

答:

因为是要开放给 users 群组,而共享群组的权限通常是『 2770 』这个含有 SGID 的特殊旗标功能。因此这个目录应该如此设定才好:

 


2. 设定可使用 Samba 的用户账号与密码

设定使用者账号是很重要的一环,因为设定错误的话,当然也就任何人都没有办法登入的!在这里我们必须先要说明一下 Linux 的文件系统与 SAMBA 设定的使用者登入权限的相关性!

在 Linux 这个系统下,任何程序都需要取得 UID 与 GID (User ID 与 Group ID) 的身份之后,才能够拥有该身份的权限,也才能够适当的进行存取文件等动作!

关于 Linux 这个系统的 UID 与 GID 与账号的相对关系,一般记录在 /etc/passwd 当中,当然也能通过 NIS, ldap 等方式来取对应;

SAMBA 仅只是 Linux 底下的一套软件,使用 SAMBA 来进行 Linux 文件系统时,还是需要以 Linux 系统下的 UID 与 GID 为准则!

如果上面这几点说明你没有问题了,现在就来看一下当我们在 Windows 计算机上面以网络上的网络邻居来连接 Linux 并且进行数据的存取时,会是怎样的一个情况呢?

我们需要通过 SAMBA 所提供的功能来进行 Linux 的存取,而 Linux 的存取是需要取得 Linux 系统上面的 UID 与 GID 的,因此,我们登入 SAMBA 服务器时,所利用 SAMBA 取得的其实是 Linux 系统里面的相关账号!这也就是说,在 SAMBA 上面的使用者账号,必须要是 Linux 账号中的一个!

所以说,在不考虑 NIS 或 LDAP 等其他账号的验证方式,单纯以 Linux 本机账号 (/etc/passwd) 作为身份验证时, 在 Samba 服务器所提供可登入的账号名称,必须要存在于 /etc/passwd 当中! 这是一个很重要的概念!例如你要先有 dmtsai 在 /etc/passwd 当中后,才能将 dmtsai 加入 Samba 的使用者当中。

现在我们知道需要新增 smb1, smb2, smb3 三个用户,且这三个用户需要加入 users 群组。此外,我们之前还建立过 student 这个用户,假设这四个人都需要能用 Samba 服务,那么除了新增用户之外,我们还需要利用 pdbedit 这个指令来处理 Samba 用户功能!

以后如果有需要新增额外的使用者账号,若该账号原本不存在,则使用 useradd 再以 pdbedit -a 去新增。 若已经存在于 Linux 的实体账号,直接用 pdbedit -a 新增即可。同时要注意,管理 TDB 数据库格式建议使用 pdbedit 这个新的玩意儿来处理,smbpasswd 仅剩下修改密码的功能需记忆即可!

3. 重新启动 Samba 并进行自我测试

在经过重新启动后,我们所进行的修订才会生效。然后使用 smbclient 来检查看看,是否不同身份会有不一样的浏览结果呢? 赶紧看看:


由上表我们可以发现,经由不同的身份登入可以取得不一样的浏览数据, 所以在使用上面需要特别留意!接下来,让我们开始来自我挂载测试看看!

自我测试是非常重要的!因为 Samba 是会对外提供服务的,因此 SELinux 会特别『关照』一下这个服务!包括默认用户家目录不会有开放的权限、预设的 SELinux type 不对就无法使用 (你可以自己尝试挂载 //127.0.0.1/project 就知道啥原因了!),所以,自行测试完毕就能够理解哪个地方的 SELinux 没有设定妥当!

4. 关于权限的再说明与累加其他分享资源的方式:

有的时候你会发现,明明在 smb.conf 当中已经设定了 writable 可写入,使用者登入的身份也没有问题, 为啥就是无法挂载或写入呢?是否是服务器设定哪里还有问题?非也非也!主要的问题常常是来自于 Linux 文件系统的权限啦!

举上面的例子来说,当你无法挂载却发现 Linux 传统权限是对的,那么肯定是 SELinux 出问题~这部份得要用 setsebool 与 chcon 或 restorecon 等指令来解决。另外就是,我们在 smb.conf 当中设定 [project] 为可写入,即 /home/project 是可写入的。假设 smb1 属于 users 这个群组,因此以 smb1 登入 SAMBA 服务器后,对于 /home/project 应该是具有可以读写的能力的!但是,如果你以 root 的身份建立 /home/project 却又忘记修改权限的话, 此时 /home/project 是无法让 users 这个群组写入的,因此 smb1 这个使用者当然不具有写入的能力。

那如果你还要扩充分享的目录与能够登入的使用者时,可以这样做:

利用编辑 smb.conf 来开放其他的目录资源,并且特别注意 Linux 在该目录下的权限!请使用 chown 与 chmod 吧!

利用 pdbedit 来新增其他可用 Samba 的账号,如果该账号并没有出现在 /etc/passwd 里面,请先以 useradd 新增该账号;

不论进行完任何的设定,请先以 testparm 进行确认,之后以 /etc/init.d/{smb,nmb} restart 或  service {smb,nmb} restart 来重新启动!

事实上,SAMBA 的一般用途就是在这个联机的模式中!

安全方面的管理

使用 SAMBA 其实是有一定程度的危险性的,这是因为很多网络攻击的蠕虫、病毒、木马就是透过网芳来攻击的! 为了抵挡不必要的联机,所以 CentOS 5.x 预设的 SELinux 已经关闭了很多 Samba 联机的功能, 因此预设情况下,很多客户端的挂载可能会有问题。此外,仅开放有权限的网域来源,以及透过 smb.conf 来管理特定的权限,也是很重要的!同时,Linux 文件系统的 r, w, x 权限也是需要注意的! 我们底下就简单的介绍一下一些基本的安全性管理吧!

SELinux 方面:

我们通过日志文件的内容就能够知道如何解决 SELinux 对各个服务所造成的问题了。不过,既然我们知道服务是 Samba 了,能不能找出与 Samba 有关的 SELinux 规则呢?当然可以!基本的 Samba 规则主要有:

几乎所有的规则默认都是关闭的!所以我们需要慢慢的打开!目前我们仅会用到用户的家目录以及分享成为可擦写, 不过似乎仅要 samba_enable_home_dirs 那个项目设定妥当即可!因此我们可以这样做:

这样用户挂载他们的家目录时 (例如 smb1 使用 //127.0.0.1/smb1/) 就不会出现无法挂载的怪问题了!此外, 由于分享成为 Samba 的目录还需要有 samba_share_t 的类型。那我们还有分享 /home/project 还记得吗?那个目录也需要修订! 这样做看看:

如果你分享的目录不只是 Samba ,还包括 FTP 或者是其他的服务时,那可能就得要使用 public_content_t 这个大家都能够读取的类型才行!若你还有发现任何 SELinux 的问题,请依照 /var/log/messages 里面的信息去修改!

防火墙方面:利用 iptables 来管理

最简单的管理登入 SAMBA 的方法就是通过 iptables ! 要知道的是,如果你仅要针对底下的范围开放 Samba 时,可以这样想:

仅针对 172.16.0.0/16, 192.168.1.0/24 这两个网域开放 SAMBA 使用权

SAMBA 启用的 port UDP: 137, 138 及 TCP: 139, 445;

所以 iptables.allow 规则当中应该要加入这几项:

这是很简单很简单的防火墙规则,你必须要依据你的环境自行修改。由于 smbd 及 nmbd 并不支持 TCP Wrappers ,所以你也只能通过 iptables 来控制了!

防火墙方面:通过内建的 samba 设定(smb.conf)

事实上 Samba 已经有许多防火墙机制!那就是在 smb.conf 内的 hosts allow 及 hosts deny 这两个参数。 通常我们只要使用 hosts allow 即可,那么没有写入这个设定项目的其他来源就会被拒绝联机的!这是比较严格的设定。 举例来说,如果你只想要让本机、192.168.100.254, 192.168.100.10, 192.168.1.0/24 使用 SAMBA 而已,那么可以这样写:

这个设定值的内容支持部分比对,因此 192.168.1.0/24 只要写出前面三个 IP 段即可 (192.168.1.)。 如此一来不但只有数部主机可以登入我们的 SAMBA 服务器,而且设定值又简单!不像 iptables 写的落落长, 建议在防火墙方面,只要使用 iptables 或 hosts allow 其中一项即可,当中又以 hosts allow 较为建议! 当然啦,如果你是针对区网开放的,那么设定 iptables 防火墙反而是比较好!因为不需要更动到 smb.conf 配置文件嘛!让服务的设定变的比较单纯些。

文件系统方面:利用 Quota 限制用户磁盘使用

既然网络邻居是要分享文件系统给用户的,那么各个 Samba 用户们也就会将数据放置到 Samba 服务器上! 那万一单个用户随便上传个数百 GB 的容量到你的 Samba 服务器,而且常常给你随意存取一番, 肯定会造成文件系统分配不公或者是带宽方面的问题!

此时就可以通过 Quota 磁盘配额来进行管理:

例题:

我们预计分配 smb1, smb2, smb3 在他们自己的家目录下,各拥有 300MB/400MB (soft/hard) 的磁盘配额限量:

/etc/fstab 加入 /home 挂载点的 usrquota,grpquota 等设定值;

重新挂载 /home ,让 Quota 实际被支持;

以 quotacheck -avug 建立 Quota 的数据库文件;

启动 Quota ;

通过 edquota -u smb1 来处理。

主机安装时的规划与中文扇区的挂载

Samba 服务器的功能是用来作为文件服务器,每个使用者都可以拥有家目录,并通过网络邻居的功能来链接到 Samba 服务器中。这就有个问题啦,那就是你的使用者如果太多,并且将他们的重要数据都放到这部 Samba 服务器上头的话,那肯定 /home 未来会有点不足!所以 /home 所在的磁盘或许可以使用大一点的硬盘, 或者使用 磁盘阵列和 LVM 也是个不错的方案。 底下为简单的思考方向:

在安装 Linux 的时候,建议不需要安装 X Window ;

在规划 Linux 时,/home 最好独立出一个 partition ,而且硬盘空间最好能够大一些;

/home 独立出来的 partition 可以单独进行 quota 的作业,以规范用户的最大硬盘用量;

无网卡的打印机 (USB) 可直接链接到 Linux 主机再通过 Samba 分享;

由于 SAMBA 一般来说都仅针对内部 (LAN) 主机进行开放,所以,可能的话 SAMBA 主机直接使用 private IP 来设定即可,当然啦, SAMBA 是否使用 private IP 还得视你的整个网域的 IP 网段的特性来规划。

如果你的 SAMBA 主机使用 Public IP 时,请特别留意规范好防火墙的设定,尽量仅让 LAN 内的计算机可以联机进来即可,不要对 Internet 开放!

另外,如果你的 Samba 服务器需要挂载含有中文的 partition 时,譬如说你将原本 Windows XP 的 FAT32 文件系统挪到 Linux 系统下,此时如果用一般模式来挂载该分区时,一些中文的文件名可能会无法被顺利的显示出来。 这个时候你就得需要这样做了:

其中 iocharset 指的是本机的语系编码方式, codepage 则与远程软件有关。因为我们是在本机进行挂载, 所以实际上使用 iocharset 这个参数即可!

服务器简单维护与管理

通常我们在设定 SAMBA 的时候,如果是以单一主机的工作组 (Workgroup) 的方式来进行 smb.conf 的设定时,几乎很容易就可以设定成功了!并没有什么很困难的步骤。不过,万一还是无法成功的设定起来, 请务必查看 日志文件,也就是在 /var/log/samba/ 里面的数据!我们在 smb.conf 里面设定了:

  • log file = /var/log/samba/log.%m

那个 %m 是指客户端计算机的 NetBIOS Name 的意思,所以,当有个 vbirdwinxp 的主机来登入我们的sambaserver 主机时,那么登入的信息就会被纪录在 /var/log/samba/log.sambawinxp 文件!而如果万一来源 IP 并没有 Netbios name 的时候,那么很可能是一些错误讯息,这些错误讯息就会被纪录到 log.smbd, log.nmbd 里面去了!所以,如果你要察看某部计算机连上你的 SAMBA 主机发生了什么问题时,特别要留意这个日志文件的形式!

另外,如果你的 SAMBA 明明已经启动完成了,却偏偏老是无法成功,又无法查出问题时,建议先关闭 Samba 一阵子,再重新启动:

  • /etc/init.d/smb stop

在一些案例当中,确实有几次是因为 PID 与 NetBIOS 的问题,导致整个 SAMBA 有错误,所以完整的关闭之后, 经过一阵子的短暂时间,再重新启动,应该就可以恢复正常了!

还有,万一你在进行写入的动作时,老是发现『你没有相关写入的权限!』,不要怀疑,几乎可以确定是 Permission 的问题,也就是 Linux 的权限与 SAMBA 开放的权限并不相符合,或者是 SELinux 在搞鬼!无论如何, 你必须要了解能不能写入 Linux 磁盘,看的是 PID 的权限与 Linxu 文件系统是否吻合,而那个 smb.conf 里面设定的相关权限只是在 SAMBA 运作过程当中『预计』要给使用者的权限而已,并不能取代真正的 Linux 权限!所以,万一真的发现该问题存在, 请登入 Linux 系统,查验一下该对应的目录的 permission !

另外,通常造成明明已经查到分享 (smbclient -L 的结果),却老是无法顺利挂载的情况,主要有底下几个可能的原因:

  • 虽然 smb.conf 设定正确,但是设定值『 path 』所指定的目录却忘记建立了 (最常见的呆样!);
  • 虽然 smb.conf 设定为可擦写,但是目录针对该用户的权限却是只读或者是无权限;
  • 虽然权限全部都正确,但是 SELinux 的类型却错误了!
  • 虽然全部的数据都是正确的,但是 SELinux 的规则 (getsebool -a) 却没有顺利启动。

上述都是一些常见的问题,更多问题的解决方案,请参考最正确的登录文件信息!

让使用者修改 samba 密码同时同步更新 /etc/shadow 密码

有个问题是,我们知道使用者可以通过 passwd 修改 /etc/shadow 内的密码,而且用户也能够自行以 smbpasswd 修改 Samba 的密码。如果用户是类似 PDC 的用户,那么这些用户理论上就很少使用 Linux !那就让用户在修改 Windows 密码 (就是 Samba) 时,同步更新 Linux 上面的 /etc/shadow 密码,  smb.conf 里头已经提供了相对应的参数设定值!你可以参考底下的网站数据:

基本上你需要的是 smb.conf 里面 [global] 的几个设定值:

接下来,当你以一般用户 (例如 dmtsai) 修改 samba 的密码时,就会像这样:

利用 ACL 配合单一使用者时的控管

想象一个案例,如果你是学校的网管人员,有个兼任老师向你申请账号,主要是要在很多班级内取得同学的专题资料。 因为该老师是兼任的,你或许担心一不小心该教师就将同学的辛苦资料给销毁,倒不是教师们故意的, 而是很多时候...不熟嘛!这个时候如果你将该老师加入同学的群组,然后偏偏同学们所在的目录是群组可写入的话, 那么该教师就能够拥有可擦写的权限了,也就容易造成一些莫名的灾难~

那该怎么办?其实可以通过 ACL 来管理某个目录的单一用户权力!所以说, 权限的管理不必通过 smb.conf 的设定,只要通过 ACL 来管理就能够达到你所需要的目的了。 关于 ACL 的说明点这里 Linux权限管理

参与评论