我在 Centos 7 上运行 Samba 时遇到了一个非常奇怪的问题。我有一些每个人都可以写入的匿名共享。通常我从 a) 正在维修的 Windows PC 和 b) 通过 GVFS 安装它们的 Linux PC 访问这些共享。
就在最近(我不确定是什么时候开始的,可能是在上周对服务器进行系统范围的更新之后),我注意到当共享通过 GVFS 安装时,我无法写入共享的子目录。我在 Linux Mint Qiana 和 Sylvia 上都试过了。我可以编辑、创建和删除共享根目录中的文件,但我无法在该服务器上任何共享的任何子目录中执行任何这些操作。我收到的错误是“权限被拒绝”。
奇怪的是,这些操作均可通过以下方式在各个级别按预期工作:windows、smbclient 或 mount.cifs。
此外,在该服务器上无法正常工作的同一台 Linux PC 上,我对通过 GVFS 安装共享的类似配置的 Debian 服务器拥有完全的写权限,因此这让我相信它与 Centos 7 服务器有关,而不是 PC 上的 GVFS 实现。
请注意,无论使用何种连接方式,我们都只能匿名访问这些共享。
这是我的 Samba 配置:
[全球的] 工作组 = 工作组 服务器字符串 = Samba 服务器 %v netbios 名称 = server1 安全 = 用户 映射到访客 = 坏用户 dns 代理 = 无 unix 扩展 = 无 #============================ 共享定义 ================================ [共享] 路径 = /shares/shared 可浏览 = 是 可写 = 是 客人同意 = 可以 只读 = 否 跟随符号链接 = 是 [安装程序] 路径 = /shares/installers 可浏览 = 是 可写 = 是 客人同意 = 可以 只读 = 否 跟随符号链接 = 是 [工具] 路径 = /shares/tools 可浏览 = 是 可写 = 是 客人同意 = 可以 只读 = 否 跟随符号链接 = 是 宽链接 = 是 [驱动程序] 路径 = /shares/drivers 可浏览 = 是 可写 = 是 客人同意 = 可以 只读 = 否 [光盘镜像] 路径 = /shares/cdimages 可浏览 = 是 可写 = 是 客人同意 = 可以 只读 = 否 [windows_sps_更新] 路径 = /shares/windows_sps_updates 可浏览 = 是 可写 = 是 客人同意 = 可以 只读 = 否
以下是我对服务器上这些目录的所有权、权限和 selinux 上下文信息:
drwxrwxrwx。无人无人unconfined_u:object_r:samba_share_t:s0 cdimages drwxrwxrwx。无人无人unconfined_u:object_r:samba_share_t:s0 驱动程序 drwxrwxrwx。nobody nobody unconfined_u:object_r:samba_share_t:s0 安装程序 drwx--x--x。无人无人system_u:object_r:samba_share_t:s0丢失+找到 drwxrwxrwx。无人无人unconfined_u:object_r:samba_share_t:s0共享 drwxrwxrwx。无人无人unconfined_u:object_r:samba_share_t:s0 工具 drwxrwxrwx。无人无人unconfined_u:object_r:samba_share_t:s0 实用程序 drwxrwxrwx。无人无人unconfined_u:object_r:samba_share_t:s0 windows_sps_updates
对于子目录:
-rwxr-xr-x. 没人没人 unconfined_u:object_r:samba_share_t:s0 AfterTheRain.jpg -rwxr-xr-x. 没人 没人 unconfined_u:object_r:samba_share_t:s0 analyze_minidump.bat drwxr-xr-x。nobody nobody unconfined_u:object_r:samba_share_t:s0 autoit 脚本 -rwxr-xr-x. 没人没人 unconfined_u:object_r:samba_share_t:s0 AutoItX3.dll drwxr-xr-x. 没人 没人 unconfined_u:object_r:samba_share_t:s0 备份 -rwxr--r--. 没人没人 system_u:object_r:samba_share_t:s0 cant_hug_every_cat.mp3 -rwxr-xr-x. 无人 无人 unconfined_u:object_r:samba_share_t:s0 devcpp-4.9.9.2_setup.exe -rwxr-xr-x. 没人没人 unconfined_u:object_r:samba_share_t:s0 dilbert_kung_fu_coffee_cup.jpg -rwxr-xr-x. 没人没人 unconfined_u:object_r:samba_share_t:s0 dilbert_kung_fu_coffee_cup.png -rwxr-xr-x. 没人没人 unconfined_u:object_r:samba_share_t:s0 dism.txt
当在 Linux PC 上通过 GVFS 安装时,该子目录中的权限显示如下:
-rwx------ 1 lytithwyn lytithwyn 363665 2011 年 8 月 19 日 AfterTheRain.jpg -rwx------ 1 lytithwyn lytithwyn 129 2015 年 2 月 4 日 analyze_minidump.bat drwx------ 1 lytithwyn lytithwyn 0 2018 年 3 月 8 日 autoit 脚本 -rwx------ 1 lytithwyn lytithwyn 460104 2014 年 6 月 1 日 AutoItX3.dll drwx------ 1 lytithwyn lytithwyn 0 2014年5月28日 备份 -rwx------ 1 lytithwyn lytithwyn 2371114 8月 20 15:54 cant_hug_every_cat.mp3 -rwx------ 1 lytithwyn lytithwyn 9326468 2017 年 3 月 30 日 devcpp-4.9.9.2_setup.exe -rwx------ 1 lytithwyn lytithwyn 489217 2015年7月1日 dilbert_kung_fu_coffee_cup.jpg -rwx------ 1 lytithwyn lytithwyn 2663796 2013年8月29日 dilbert_kung_fu_coffee_cup.png -rwx------ 1 lytithwyn lytithwyn 95 2018年2月12日 dism.txt
我不认为问题出在 SELinux 上,因为在我尝试更改文件后,我没有从 sealert -a /var/log/audit/audit.log 得到任何有关 Samba 的输出。我还重新启动了服务器,以防万一出现短暂而不稳定的情况。
** 编辑(附加信息):后来我将自己的工作站升级到 Linux Mint 19.1(Tessa),并且通过 mount.cifs 作为客户机挂载停止工作;我得到了相同的结果,即我无法写入顶层以下的任何目录。
在尝试了各种选项(如“nounix”)和各种“vers=x”值后,我发现如果我为 mount.cifs 提供一个空密码而不是“guest”选项,它就会起作用。使用 mount.cifs 的 -v 选项,我得到了以下结果:
sudo mount.cifs //server1/shared /home/lytithwyn/shares/shared/ -o guest,uid=lytithwyn -v
mount.cifs kernel mount options: ip=fdf2:754b:f75b::cd7,unc=\\server1\shared,uid=1000,user=,pass=********
sudo mount.cifs //server1/shared /home/lytithwyn/shares/shared/ -o uid=lytithwyn,password= -v
mount.cifs kernel mount options: ip=fdf2:754b:f75b::cd7,unc=\\server1\shared,uid=1000,user=root,pass=********
因此,我发现使用“guest”选项时没有指定用户名,但使用“password=”时,会自动提供 root 作为用户名。之后,试验表明,手动指定任何用户名(即使是服务器或工作站上都不存在的用户名)产生了一个挂载,我可以在任意级别的目录中进行写入。
所以我猜这一切都归结为各种安装工具/助手传入的默认选项在各个版本之间发生了变化,也许我的 CentOS 7 上的 samba 版本错误地处理了没有传入用户名的情况,即这种情况没有触发“映射到客人=坏用户”指定的行为?