我在同一个网络上有两台服务器。一台运行 Windows Server 2016,另一台运行 CentOS 8。Windows 服务器是我的主要文件存储,所有数据都存放在这里。CentOS 服务器已安装 Windows 共享,可以访问其文件。
在 CentOS 上,我设置了一个 samba 共享。为什么?因为我在同一台服务器上运行了一个 Web 应用程序,我希望该 Web 应用程序控制谁可以访问哪个文件。因此,我们的(内部)用户不会直接安装 Windows 共享,而是安装 CentOS 共享,该共享将“把关”对文件的访问。
在 samba 文件夹中,每个用户都有文件夹,并且有一个配置允许用户只访问自己的文件夹。Web 应用程序配置为在这些文件夹中添加符号链接,以链接到“真实”文件。
问题就在这里。如果我将“普通”文件添加到用户的文件夹中,他们可以正常访问它。但如果我添加符号链接(到已安装的 Windows 共享中的文件),它不会出现在他们面前。我很确定这是 SELinux 的问题。
设置方式如下。
Windows 共享已挂载
sudo mount -t cifs //WindowsShare/data /media/WinShare \ -o ip=192.168.1.5,username=user,gid=sambashare ls -alhZ /media/WinShare drwxr-xr-x. 2 root sambashare system_u:object_r:cifs_t:s0 0 Jan 10 16:57 files
创建并使用 Samba 共享
/srv/smb
(所有 Samba 用户都在该sambashare
组中)ls -alhZ /srv drwxrwx---. 2 root sambashare unconfined_u:object_r:samba_share_t:s0 6 Jan 13 11:20 smb
具有
/etc/samba/smb.conf
以下内容:[global] allow insecure wide links = yes unix extensions = no [adminShare] path = /srv/smb wide links = yes follow symlinks = yes
为了测试,我添加了一个符号链接和一个文件
ln -s /media/WinShare/files/test.pdf /srv/smb/test.pdf touch /srv/smb/file.bin
然后我尝试在 Windows VM 中安装\\CentOS\adminShare
,但我看不到该test.pdf
文件,但是我看到了file.bin
。
如何让 CentOS samba 共享访问已挂载的 Windows Server 数据?在设置 CentOS 服务器时,我运行了:
sudo semanage fcontext -a -t samba_share_t "/srv/smb(/.*)?"
这就是让我看到的原因file.bin
,但我仍然看不到file.pdf
。我发现了这一点,但我不知道是否要更改一切:
sudo setsebool -P samba_export_all_rw=1
我如何允许 Samba 访问该/media/WinShare
文件夹?这可行吗?
sudo semanage fcontext -a -t samba_share_t "/media/WinShare(/.*)?"
答案1
我修好了!我必须挂载 Windows 共享并强制上下文samba_share_t
。
挂载时添加context=unconfined_u:object_r:samba_share_t:s0
。
sudo mount -t cifs //WindowsShare/data /media/WinShare \
-o ip=192.168.1.5,username=user,gid=sambashare,context=unconfined_u:object_r:samba_share_t:s0