Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。
以下通过两个基础实验来学习samba,实验平台为CentOS 6.2,环境为:
Samba服务器
主机名:luffy IP地址:192.168.56.53
客户端测试机
主机名:zoro IP地址:192.168.56.54
实验一
假设公司有一台samba服务器,提供了一个共享名为/share的共享目录,现在要求只允许192.168.56.0网段的用户可以使用自己的samba帐户登录此目录,并可读写,但不允许动别人的资料。
一、准备工作
1.创建用户user1、user2,并在根目录下创建共享文件夹share及其共享文件,其中share的文件夹属性为777。
创建结果如下:
[root@luffy ~]# cat /etc/passwd
……省略部分内容……
user1:x:502:502::/home/user1:/bin/bash
user2:x:503:503::/home/user2:/bin/bash
[root@ luffy ~]# ls -l /share
total 8
-rw-r–r–. 1 root root 4 May 24 06:41 a
-rw-r–r–. 1 root root 4 May 24 06:41 b
[root@ luffy ~]# ls -ld /share
drwxrwxrwx. 2 root root 4096 May 24 06:41 /share
2.安装samba软件
[root@luffy ~]# yum install samba*
Samba*涉及到的组件是samba,samba-common,samba-client
其中samba必需安装,后面两个在装系统时其实已默认安装(因此其他linux客户端可以直接使用smbclient命令访问samba的共享文件夹)。
3.添加samba用户
Samba中添加的用户,必须是samba服务器所在系统中预先创建的,但该用户登录samba时使用的密码,需由samba创建并保存。
使用到的命令是smbpasswd,参数-a表示添加用户,-x表示删除用户,-d表示禁用用户。
下面将user1和user2加入到samba中,
[root@ luffy ~]# smbpasswd -a user1
New SMB password:
Retype new SMB password:
Added user user1.
[root@ luffy ~]# smbpasswd -a user2
New SMB password:
Retype new SMB password:
Added user user2.
二、配置共享
在服务器SELinux开启(Enforcing状态)的情况下,进行以下实验。
1.在samba主配文件/etc/samba/smb.conf末尾添加以下内容:
1 2 3 4 5 6 |
|
注,hosts allow字段如果不写,则表示所有可访问该服务器的客户端都可访问该共享目录。在本实验和许多实际环境中,都是内网共享,只有同网段的内网用户才可访问,“hosts allow=本网段”其实不需要写。
另外,主配文件第100行附近,
1 2 3 |
|
表示,当前(默认)使用的是user认证方式,即客户端需要有samba中记录的用户及其密码才能登录,如果是security = share,则表示采用匿名登录方式。
配置修改完成后,重启samba服务,
[root@luffy ~]# service smb restart
客户端访问时,报错:
[root@zoro ~]# smbclient //192.168.56.53/share -U user1
Enter user1’s password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
NT_STATUS_ACCESS_DENIED listing \*
40317 blocks of size 262144. 31467 blocks available
smb: \> quit
没有访问权限,是由于请求被selinux拦截了。
(注:如果是出现NT_STATUS_BAD_NETWORK_NAME的报错,大概是因为主配文件中定义共享文件块时,中括号里的名字出错,访问路径//192.168.56.53/share中的share不是指根目录中的share文件夹,而是主配文件中自定义的[share]中括包内的share。)
2.服务器端对samba共享目录修改安全上下文,使用chcon命令
[root@luffy ~]# ls -ldZ /share
drwxr-xr-x. root root system_u:object_r:default_t:s0 /share
[root@luffy ~]# chcon -t samba_share_t /share
[root@luffy ~]# ls -ldZ /share
drwxr-xr-x. root root system_u:object_r:samba_share_t:s0 /share
客户端再访问,就正常了
[root@zoro ~]# smbclient //192.168.56.53/share -U user1
Enter user1’s password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
. D 0 Fri May 24 06:41:33 2013
.. DR 0 Fri May 24 06:18:56 2013
a 4 Fri May 24 06:41:26 2013
b 4 Fri May 24 06:41:33 2013
40317 blocks of size 262144. 31466 blocks available
smb: \>
smb: \> rm a
smb: \> ls
. D 0 Fri May 24 06:45:54 2013
.. DR 0 Fri May 24 06:18:56 2013
b 4 Fri May 24 06:41:33 2013
40317 blocks of size 262144. 31466 blocks available
smb: \>quit
从以上操作还可以看到,此时user1可以删除其root创建的文件a(因为文件夹share的权限被设成了777)。即user1可以动其他人的文件,这不符合要求。
3.服务器端对共享目录设置特殊权限
[root@luffy ~]# chmod o+t /share
这里的t,指sticky bit,可以理解为防删除位. 一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件,但同时不能删除文件,则可以对文件使用sticky bit位。设置该位后, 就算用户对目录具有写权限, 也不能删除该文件。(这话理解起来有点费劲~)
此时客户端登录便不可以删除其他用户的文件了,但删除自己的文件没问题。
[root@zoro ~]# smbclient //192.168.56.53/share -U user1
Enter user1’s password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
. D 0 Fri May 24 06:45:54 2013
.. DR 0 Fri May 24 06:18:56 2013
b 4 Fri May 24 06:41:33 2013
40317 blocks of size 262144. 31465 blocks available
smb: \> rm b
NT_STATUS_ACCESS_DENIED deleting remote file \b
smb: \> rmdir user1
smb: \>quit
三、将共享文件加载到客户端本地进行操作
客户端使用smbclient远程访问共享目录时,操作指令是有限的(能过help命令可以查看),touch命令就不可用。为做进一步验证,要将共享目录加载到本地,再进行相关操作。
通过mount cifs方式进行加载。
1.先使用user1挂载、操作:
[root@zoro ~]# mount -t cifs 192.168.56.53:/share /mnt/ -o username=user1
Password:
[root@zoro ~]# cd /mnt
[root@zoro mnt]# ls
b
[root@zoro mnt]# mkdir user1
[root@zoro mnt]# vim user1/1
user111 (注,这个是输入的内容)
[root@zoro mnt]# ll
total 4
-rw-r–r– 1 root root 4 May 24 06:41 b
drwxr-xr-x 2 502 502 0 May 24 07:02 user1
[root@zoro mnt]# ll user1/
total 4
-rw-r–r– 1 502 502 8 May 24 07:02 1
[root@zoro mnt]# cd
[root@zoro ~]# umount -t cifs 192.168.56.53:/share /mnt/
umount: /mnt: not mounted
2.再用user2挂载、操作:
[root@zoro ~]# mount -t cifs 192.168.56.53:/share /mnt/ -o username=user2%RedHat
(注,这行命令,直接把user2的samba密码redhat也写出来了)
[root@zoro ~]# cd /mnt
[root@zoro mnt]# ls
b user1
[root@zoro mnt]# ls user1/
1
[root@zoro mnt]# cat user1/1
user111
[root@zoro mnt]# rm -rf user1/
rm: cannot remove `user1/1′: Permission denied
[root@zoro mnt]# rm -rf b
rm: cannot remove `b’: Permission denied
[root@zoro mnt]#
[root@zoro mnt]# touch 2
[root@zoro mnt]# cd
[root@zoro ~]# umount -t cifs 192.168.56.53:/share /mnt/
umount: /mnt: not mounted
可以看到,user2是没有权限删除或更改其他用户的文件的,但可以创建属于自己的文件。
实验二
公司的IT部门有it1、it2两个成员,他们可以登录到自己部门的共享目录进行读写操作,上传的文件的权限为640,且只允许他们之间读取文件,但不可以修改对方的文件。
一、准备工作
1.创建用户it1、it2和用户组it,并将it1和it2加入到用户组it。
2.创建共享目录/it,将其权限属性置为777,并使用chcon -t samba_share_t /it命令修改其安全上下文(本实验仍然在SELinux开启的情况下进行测试)。
3.将用户it1、it2加入到samba服务器
[root@luffy ~]# smbpasswd -a it1
New SMB password:
Retype new SMB password:
Added user it1.
[root@luffy ~]# smbpasswd -a it2
New SMB password:
Retype new SMB password:
Added user it2.
二、配置共享
1. 在主配文件/etc/samba/smb.conf末尾添加以下内容:
1 2 3 4 5 6 7 8 9 |
|
配置修改完成后,重启samba服务,
[root@luffy ~]# service smb restart
2.客户端访问
[root@zoro ~]# smbclient //192.168.56.53/it -U user1
Enter user1’s password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
tree connect failed: NT_STATUS_ACCESS_DENIED
[root@zoro ~]# smbclient //192.168.56.53/it -U it1
Enter it1’s password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> quit
[root@zoro ~]# smbclient //192.168.56.53/it -U it2
Enter it2’s password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
. D 0 Mon May 27 05:40:45 2013
.. DR 0 Mon May 27 05:40:45 2013
40317 blocks of size 262144. 31463 blocks available
smb: \> quit
从以上连接可以看出,只有属于it用户组的用户才有访问/it的权限。
三、将共享文件加载到客户端本地进行操作
1.使用it1登录、挂载,创建文件(夹)
[root@zoro ~]# mount -t cifs 192.168.56.53:/it /mnt/ -o username=it1%RedHat
[root@zoro ~]# cd /mnt
[root@zoro mnt]# mkdir it01
[root@zoro mnt]# vim it01/a
this is file a (注,这个是输入的内容)
[root@zoro mnt]# ls -ld it01/
drwxr-x— 2 504 506 0 May 27 06:35 it01/
[root@zoro mnt]# ls -ll it01/
total 4
-rw-r—– 1 504 506 15 May 27 06:35 a
[root@zoro mnt]# cd
[root@zoro ~]# umount -t cifs 192.168.56.53:/it /mnt/
umount: /mnt: not mounted
注:由于在配置文件中,对/it的共享设置,指定了create mask = 640和directory mask = 750,所以创建的文件和文件夹,都是用户组成员有读(执行)权限,其他人没有任何读写权限。
另外,由于/it的共享设置里有group = it这一行,it1无论是创建文件或文件夹,其所属用户组都是it1(504)所在的用户组it(506)。这里因为是远程挂载的,使用ll命令只能看到用户id。
下面使用it2访问时,由于it2也在it组里,所以it2对文件夹it01的r-x权限,对文件a有r–权限。
2.使用it2登录、挂载,进行验证
[root@zoro ~]# mount -t cifs 192.168.56.53:/it /mnt/ -o username=it2%redhat
[root@zoro ~]# cd /mnt
[root@zoro mnt]# ls
it01
[root@zoro mnt]# ls it01/
a
[root@zoro mnt]# cat it01/a
this is file a
[root@zoro mnt]# rm -rf it01
rm: cannot remove `it01/a’: Permission denied
[root@zoro mnt]# rm -rf it01/a
rm: cannot remove `it01/a’: Permission denied
[root@zoro mnt]# touch it01/b
touch: cannot touch `it01/b’: Permission denied
以上可以看出,it2可以读it1的文件(夹),但却没有权限删除和修改(使用vim编辑it01/a时,会被提示不能修改)。
在上述配置文件中,如果对/it的共享设置,指定了create mask = 640和directory mask = 750,却没有添加group = it,那么it1创建的文件和文件夹,其用户组都是it1,此时it2属于其他人,是没有读写权限的。