转帖:Samba + LDAP + ACL
视窗系统下的权限控制不用说,一个字...头疼(太复杂了),最近用 Samba 做一套文件服务器,LDAP 保存用户信息,Samba的共享目录权限只能针对一级目录,二级目录的权限设定只有借助 视窗系统 来完成,哈哈,Samba真聪明啊,把这个繁琐的包袱丢给 视窗系统 去处理,自己只负责 ACL的转换 (从 NT ACL -> Posix ACL) 就行了。
总结一下, 要使Samba支持 ACL 需要满足的条件:1. 在编译 Samba 之前,安装 attr 和 acl 软件包,这两个软件包能在 ftp://oss.sgi.com/projects/xfs/cmd_tars 下载,下载后先安装 attr,后安装 acl,安装步骤如下:
make
make install
make install-dev
make install-lib
2. 在编译 Samba 时,加入 --with-acl-support
3. 编译完成后,输入 smbd -b|grep -i acl 检查 ACL 是否真的编译进去了
如果看到下面的输出,则表示OK
HAVE_SYS_ACL_H
HAVE_POSIX_ACLS
或查看 smbd 的动态链接库: ldd smbd , 输出信息中应该包含下面2个库
libattr.so.1 => /lib/libattr.so.1 (0xb7d91000)
libacl.so.1 => /lib/libacl.so.1 (0xb7d8a000)
4. 共享的目录所在文件系统(内核)要支持 ACL,并且挂载的时候加入了 acl 支持,比如 reiserfs, 在挂载的时候,选项为 defaults,attrs,acl
5. 默认 Samba 的 ACL 参数是启用的,即 nt acl support = yes,只要不关闭这个选项就行了
好了,一切就绪,设置 secure = user 并启动 Samba, 然后添加 3 个用户 alice, bob, courier。
在 windows 下以 alice 登录,在共享目录下创建文件 testfile.txt,然后修改文件的属性 -> "安全", 点击 "添加",此时弹出一个输入“输入网络密码”的对话框(不明白啊,明明访问共享的时候已输入了,目前还需要,真是多此一举),这里用户名输入 "服务器workgroup名字\登录用户名",密码和登录时的相同,OK后会看到所有用户列表,当然也包括 bob 和 courier,选择并添加这两个用户到权限控制列表中,再设定 bob 有写权限,courier只有只读权限,设定好后,点击“保存”,如果提示什么访问被拒绝(此时 Samba 的日志中有 Too Many Ace Entries for file),表示 ACL 没有起作用,可能是上述哪一个条件不满足造成的,如果没有错误提示,那就恭喜啦!
下面检查刚刚设定的 ACL 是否真的有效,能分别以 bob 和 courier 访问共享,看看是否是 bob 能修改 testfile.txt 而 courier 则不能;或是在 Samba 服务器上使用 getfacl 来查看 tesetfile.txt 的 ACL。
输入 getfacl testfile.txt
# owner: alice
# group: public
user::rwx
user:bob:rwx
user:courier:r--
group::rw-
mask::rwx
other::---k
小结:以前一直以为 Samba 的用户管理和权限管理非常复杂,总是以各种各样的理由不去碰这个“烫手的山芋”。后来,真正开始逐步了解 Samba 和 LDAP 及权限相关的东西后,发觉原来“并非想象中的那么复杂”。
非常多开源软件都有周详的文件和说明,然而大部分都是英文的,不要害怕那其实非常简单的英文,不要指望等待中文手册出来了再去看(如果没有人翻译,那怎么 办?),因为非常多最新的资讯和信息都是英文的,如果我们只是将眼光定位在中文文件上面,我们会欠缺别人非常多的 ! Samba 官方英文文件有厚厚两本(虽然是电子文件,然而其巨大的篇幅告诉我这两本书分量真的非常重,这是多么难得的资源 !),他们是 Samba-3 by Example 和 Samba-3 HOWTO and Reference Guide,建议想深入了解 Samba 的兄弟多多阅读下!
只要动手去做,一切变的皆有可能 ! 希望学习 Linux 的同志们不要被遇见的问题和挫折吓倒,我们不必所有阻挡我们成功的借口,只有勇于面对困难和挑战,才能真正提高我们的能力和水平 ! (太激动了点,嘿嘿!)
参考:
http://optics.ph.unimelb.edu.au/help/samba/NT_Security.html