天天看点

RHCE培训笔记——Samba

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

Added user user2.

二、配置共享

在服务器SELinux开启(Enforcing状态)的情况下,进行以下实验。

1.在samba主配文件/etc/samba/smb.conf末尾添加以下内容:

1

2

3

4

5

6

<code>[share]</code>

<code>comment = sharefile  </code><code>#描述信息</code>

<code>path = </code><code>/share</code>  <code>#指定共享文件夹的路径</code>

<code>hosts allow = 192.168.56.  </code><code>#允许访问该目录的网段</code>

<code>browseable=</code><code>yes</code>  <code>#可浏览</code>

<code>writable = </code><code>yes</code>  <code>#可写</code>

注,hosts allow字段如果不写,则表示所有可访问该服务器的客户端都可访问该共享目录。在本实验和许多实际环境中,都是内网共享,只有同网段的内网用户才可访问,“hosts allow=本网段”其实不需要写。

另外,主配文件第100行附近,

<code>security = user</code>

<code>#smb passwd file = /etc/samba/smbpasswd</code>

<code>passdb backend = tdbsam</code>

表示,当前(默认)使用的是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: \&gt; ls

NT_STATUS_ACCESS_DENIED listing \*

               40317 blocks of size 262144. 31467 blocks available

smb: \&gt; 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

drwxr-xr-x. root root system_u:object_r:samba_share_t:s0 /share

客户端再访问,就正常了

 .                                   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: \&gt;

smb: \&gt; rm a

 .                                   D        0  Fri May 24 06:45:54 2013

smb: \&gt;quit

从以上操作还可以看到,此时user1可以删除其root创建的文件a(因为文件夹share的权限被设成了777)。即user1可以动其他人的文件,这不符合要求。

3.服务器端对共享目录设置特殊权限

[root@luffy ~]# chmod o+t /share

这里的t,指sticky bit,可以理解为防删除位. 一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件,但同时不能删除文件,则可以对文件使用sticky bit位。设置该位后, 就算用户对目录具有写权限, 也不能删除该文件。(这话理解起来有点费劲~)

此时客户端登录便不可以删除其他用户的文件了,但删除自己的文件没问题。

               40317 blocks of size 262144. 31465 blocks available

smb: \&gt; rm b

NT_STATUS_ACCESS_DENIED deleting remote file \b

smb: \&gt; rmdir user1

三、将共享文件加载到客户端本地进行操作

客户端使用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/

-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也写出来了)

b  user1

[root@zoro mnt]# ls user1/

[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

可以看到,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

Added user it1.

[root@luffy ~]# smbpasswd -a it2

Added user it2.

1. 在主配文件/etc/samba/smb.conf末尾添加以下内容:

7

8

9

<code>[it]</code>

<code>comment = it dept.</code>

<code>path = </code><code>/it</code>

<code>browseable=</code><code>yes</code>

<code>writable = </code><code>yes</code>

<code>valid </code><code>users</code> <code>= @it  </code><code>#指定允许访问的用户组为it,注意@符号</code>

<code>create mask = 640  </code><code>#指定新创建的文件的权限为640</code>

<code>directory mask = 750 </code><code>#指定新创建的文件夹的权限为750</code>

<code>group = it  </code><code>#指定新创建的文件(夹)的用户组为it,这里没有@</code>

2.客户端访问

[root@zoro ~]# smbclient //192.168.56.53/it -U user1

tree connect failed: NT_STATUS_ACCESS_DENIED

[root@zoro ~]# smbclient //192.168.56.53/it -U it1

Enter it1's password:

[root@zoro ~]# smbclient //192.168.56.53/it -U it2

Enter it2's password:

 .                                   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

从以上连接可以看出,只有属于it用户组的用户才有访问/it的权限。

1.使用it1登录、挂载,创建文件(夹)

[root@zoro ~]# mount -t cifs 192.168.56.53:/it /mnt/ -o username=it1%redhat

[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/

-rw-r----- 1 504 506 15 May 27 06:35 a

[root@zoro ~]# umount -t cifs 192.168.56.53:/it /mnt/

注:由于在配置文件中,对/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

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

[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属于其他人,是没有读写权限的。

本文转自Sunshyfangtian 51CTO博客,原文链接:http://blog.51cto.com/sunshyfangtian/1212270,如需转载请自行联系原作者

继续阅读