不能在/etc/fstab中明文写密码,因其权限通常为644,所有用户均可读取,极易泄露凭证;应使用credentials文件(如/etc/samba/cred)存储认证信息,并设为600权限,再于fstab中通过credentials=路径引用。

为什么不能在/etc/fstab里直接写密码
因为/etc/fstab是全局可读文件(权限通常是 644),任何普通用户执行 cat /etc/fstab 都能直接看到明文密码。SMB共享一旦暴露凭证,等于把家门钥匙贴在防盗门上。
用credentials=文件隔离敏感信息
这是 Linux 挂载 SMB 的标准安全实践:把用户名、密码单独存进一个仅属主可读的文件,再让 fstab 引用它。
- 创建凭证文件,比如
/etc/samba/cred:username=alice password=MyS3cur3P@ss domain=WORKGROUP
- 立刻收紧权限:
sudo chmod 600 /etc/samba/cred(必须,否则mount会拒绝加载) - 在
/etc/fstab中这样写://192.168.1.100/share /mnt/smb cifs credentials=/etc/samba/cred,uid=1000,gid=1000,file_mode=0644,dir_mode=0755,vers=3.0,_netdev 0 0
-
domain行可省略,如果服务端没配域;但若 NAS 或 Windows 用了域账户,漏掉会导致认证失败
常见挂载失败原因和对应检查点
即使 credential 文件路径对、权限对,仍可能卡在“Permission denied”或“No such file or directory”:
-
mount报mount error(13): Permission denied:多半是credentials文件权限不是600,或文件里多了一个空格/不可见字符(建议用vi -b查看) -
mount报mount error(2): No such file or directory:确认credentials=后面的路径是绝对路径,且文件真实存在(ls -l /etc/samba/cred) - 挂载后文件属主显示为
nobody:nogroup:说明uid/gid没传进去,检查 fstab 行末是否误加了多余逗号或空格 - 重启后挂载失败:确保加了
_netdev参数,否则系统可能在网卡启动前就尝试挂载
更进一步:避免硬编码用户名
如果多台机器共用同一份 fstab(比如通过配置管理工具分发),可以把用户名也抽出来,但注意——credentials 文件本身不支持变量展开。可行做法是:
- 用
uid和gid对应系统用户 ID,而非依赖用户名字符串 - 在脚本中动态生成
/etc/samba/cred(例如 Ansible 的copy模块带mode: '0600') - 绝不把
credentials文件放进 Git 或备份镜像——它应该只存在于目标主机上
真正容易被忽略的是:credential 文件一旦写入,后续改密码必须同步更新该文件,并重新触发 mount -a 或重启,否则旧密码失效后挂载会静默失败,直到某次重启才发现服务异常。


















