资源描述
M6-3 加强Linux用户网络访问权限的安全控制能力
1.1场景描述
1.1.1 学习目的
学生通过该能力模块的学习,能够独立完成和熟练掌握安全设置NFS和SAMBA服务,从而实现文件安全访问的能力。。
1.1.2 学习要求
理解:NFS和SAMBA基本概念。
掌握:NFS与SAMBA安全配置。
1.1.3 学习重点和难点
1.学习重点
² 安全设置NFS
² 安全设置SAMBA
2.学习难点
² 安全设置SAMBA:理解SAMBA服务器安全访问级别。
1.2 知识准备
1.2.1 NFS
NFS是分布式计算机系统的一个组成部分,可实现在异构网络上共享和装配远程文件系统。
NFS简介
NFS由SUN公司开发,目前已经成为文件服务的一种标准(RFC1904,RFC1813)。其最大功能是可以通过网络让不同操作系统的计算机可以共享数据,所以也可以将其看做是一台文件服务器,如图1-1所示。NFS提供了除Samba之外,Windows与Linux及UNIX与Linux之间通信的方法。
客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。NFS有属于自己的协议与使用的端口号,但是在传送资料或者其他相关信息时候,NFS服务器使用一个称为"远程过程调用"(Remote Procedure Call,RPC)的协议来协助NFS服务器本身的运行。
为何使用NFS
NFS的目标是使计算机共享资源,在其发展过程中(即20世纪80年代),计算机工业飞速发展,廉价CPU及客户端/服务器技术促进了分布式计算环境的发展。然而当处理器价格下降时,大容量的存储系统相对而言价格仍居高不下。因此必须采用某种机制在充分发挥单个处理器性能的同时使计算机可共享存储资源和数据,于是NFS应运而生。
NFS协议
使用NFS,客户端可以透明地访问服务器中的文件系统,这不同于提供文件传输的FTP协议。FTP会产生文件一个完整的副本;NFS只访问一个进程引用文件部分,并且一个目的就是使得这种访问透明。这就意味着任何能够访问一个本地文件的客户端程序不需要做任何修改,就应该能够访问一个NFS文件。
NFS是一个使用SunRPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件。尽管这一工作可以使用一般的用户进程来实现,即NFS客户端可以是一个用户进程,对服务器进行显式调用,而服务器也可以是一个用户进程。因为两个理由,NFS一般不这样实现。首先访问一个NFS文件必须对客户端透明,因此NFS的客户端调用是由客户端操作系统代表用户进程来完成的;其次,出于效率的考虑,NFS服务器在服务器操作系统中实现。如果NFS服务器是一个用户进程,每个客户端请求和服务器应答(包括读和写的数据)将不得不在内核和用户进程之间进行切换,这个代价太大。第3版的NFS协议在1993年发布。
(1)访问一个本地文件还是一个NFS文件对于客户端来说是透明的,当文件被打开时,由内核决定这一点。文件被打开之后,内核将本地文件的所有引用传递给名为"本地文件访问"的框中,而将一个NFS文件的所有引用传递给名为"NFS客户端"的框中。
(2)NFS客户端通过其TCP/IP模块向NFS服务器发送RPC请求,NFS主要使用UDP,最新的实现也可以使用TCP。
(3)NFS服务器在端口2049接收作为UDP数据包的客户端请求,尽管NFS可以被实现为使用端口映射器,允许服务器使用一个临时端口,但是大多数实现都是直接指定UDP端口2049。
(4)当NFS服务器收到一个客户端请求时,它将这个请求传递给本地文件访问例程,然后访问服务器主机上的一个本地的磁盘文件。
(5)NFS服务器需要花一定的时间来处理一个客户端的请求,访问本地文件系统一般也需要一部分时间。在这段时间间隔内,服务器不应该阻止其他客户端请求。为了实现这一功能,大多数的NFS服务器都是多线程的--服务器的内核中实际上有多个NFS服务器在NFS本身的加锁管理程序中运行,具体实现依赖于不同的操作系统。既然大多数UNIX内核不是多线程的,一个共同的技术就是启动一个用户进程(常被称为"nfsd")的多个实例。这个实例执行一个系统调用,使其作为一个内核进程保留在操作系统的内核中。
(6)在客户端主机上,NFS客户端需要花一定的时间来处理一个用户进程的请求。NFS客户端向服务器主机发出一个RPC调用,然后等待服务器的应答。为了给使用NFS的客户端主机上的用户进程提供更多的并发性,在客户端内核中一般运行着多个NFS客户端,同样具体实现也依赖于操作系统。
NFS服务器面临的安全隐患
因为NFS在网络上明文传输所有信息,按照默认设置,NFS共享把根用户改成用户nfsnobody,它是一个不具备特权的用户账号。这样,所有根用户创建的文件都会被用户nfsnobody所有,从而防止了设置setuid的程序被上传到系统。如果使用了no_root_squash,远程用户就能够改变共享文件系统上的任何文件,把设置了特洛伊木马的程序留给其他用户,在无意中执行。
NFS服务器安全策略
(1)使用TCP_Wrappers
portmap和rpc.nfsd结合起来,使NFS服务器上的文件即使没有任何权限也能容易得到。可以使用访问控制保障网络安全,在使用NFS时最好结合TCP_Wrappers来限制使用范围。
(2)注意配置文件语法错误
NFS服务器通过/etc/exports文件来决定要导出哪些文件系统,以及把这些目录导出到哪些主机上。编辑这个文件的时候要特别小心,不要添加额外的空格。
例如:/etc/exports文件的以下行会使主机 能够共享/tmp/nfs/目录。
/tmp/nfs/ (rw)
但是 /etc/exports 文件中这一行的情况却不同。它共享同一目录,让主机 拥有只读权限,却给全局以读写权限。这全是由主机后面的一个空格造成的。
/tmp/nfs/
(rw)
使用 showmount 命令来校验哪些目录被共享,从而检查NFS共享配置是一个好习惯。showmount格式为:
showmount -e
(3)使用iptables防火墙
因为NFS在网络上明文传输所有信息,所以让NFS服务器在防火墙后、在一个分段的安全网络上运行就很重要。无论何时在不安全的网络上传递NFS信息都有被截取的危险。从这个角度讲,谨慎制定网络计划就有助于防御重要的安全破坏。限制RCP服务访问的办法一般是使用防火墙,除了TCP-Wrapper还有ipchians和iptalbes的防火墙。在全面使用Linux 2.4或更高版本内核的今天,了解iptables这种防火墙方法也就足够了。 缺省的状态下,portmap使用111端口,而NFS使用2049端口,可以通过iptables来限制对该端口的访问:
iptables -t filter -A INPUT -p udp -d 127.0.0.1 --dport 111 -j DROP
iptables -t filter -A INPUT -p udp -d 127.0.0.1 --dport 2049 -j DROP
iptables -t filter -A INPUT -p udp -s trusted_client -d this_server_ip --dport \2049 –j
ACCEPTiptables -t filter -A INPUT -p udp -s not_trusted_client -d this_server_ip –dport \2049 -j DROP
(4)把开放目录限制为只读权限
可以在/etc/exports文件中设定权限选项ro,通常需要把NFS服务器对客户开放的任何目录或文件系统设置为只读访问:
/app (ro) 这样,网络中的客户只能对/app目录进行只读访问。
(5)禁止对某些目录的访问
当开放一个完整的文件系统或者一个目录时,缺省情况下它的子目录会自动开放访问权限。如果希望限制对其子目录的访问可以使用noaccess访问选项,例如希望开放/pub目录权限但是禁止访问/pub/staff-only子目录:
/pub weblab-?? (ro)
/pub/staff-only weblab-?? (noaccess)
注意: “??”代表任意字符。
(6)root squashing访问问题
按照默认设置,root用户的用户ID和组群ID都是0。root权限压缩(Root squashing)把用户ID0和组群ID0映射为匿名的用户和组群ID,因此客户上的根用户就不会在NFS服务器上具备根特权。如果这个选项被选,root用户就不会被映射为匿名用户,客户上的root用户就会对导出的目录拥有根特权。选择这个选项会大大降低系统的安全性。除非绝对必要,请不要选择它。为了明确执行该规则,可以修改文件/etc/exports:
/(rw, root_squash)
这样如果客户端的UID0(root)用户想要访问(读、写、删除)一个NFS文件系统,服务器端会用UID代替服务器的nobody账户。这样客户端的root用户不能修改和访问服务器端root用户才能访问和修改的文件。
(7)使用nosuid和noexec选项
SUID(Set User ID)或SGID(Set Group ID)程序可以让普通用户以超过自己权限的形式执行。很多SUID/SGID可执行程序是必须的,比如上面提到的passwd。SUID/SGID程序会被一些恶意的本地用户利用,获取本不应有的权限。运行以下命令可以找到所有具有这一属性的程序:
#find / \( -perm -4000 -o -perm -2000 \)
使用者必须查看这一列表,尽量减少那些所有者是root或是在root组中却拥有SUID/SGID属性的文件,删除或对其属性进行更改。使用nosuid选项禁止set-UID程序在 NFS服务器上运行,可以修改文件/etc/exports加入一行:
/(rw, root_squash, nosuid)
上面的例子说明:/www目录在上可以登录,的用户可以读取/www中的文件和目录,但是不能运行set- UID程序。
/(rw, root_squash, noexec)
上面的例子说明/www目录在上可以登录,的用户可以读取/www中的文件和目录,但是禁止所登录文件系统中文件的执行。
NFS是非常重要的网络协议,许多企业通过NFS协议共享硬盘和其它设备。把能登录NFS目录设置为只读访问、提高portmap服务的安全性、squashing root访问、使用on set-UID 和non executable文件设置可以提高NFS服务器的安全。
1.2.2 SAMBA
Samba 简介
Samba(SMB是其缩写) 是一个网络服务器,用于Linux和Windows共享文件之用;Samba 即可以用于Windows和Linux之间的共享文件,也一样用于Linux和Linux之间的共享文件;不过对于Linux和Linux之间共享文件有更好的网络文件系统NFS,NFS也是需要架设服务器的;
大家知道在Windows 网络中的每台机器即可以是文件共享的服务器,也可以同是客户机;Samba 也一样能行,比如一台Linux的机器,如果架了Samba Server 后,它能充当共享服务器,同时也能做为客户机来访问其它网络中的Windows共享文件系统,或其它Linux的Sabmba 服务器;
我们在Windows网络中,看到共享文件功能知道,我们直接就可以把共享文件夹当做本地硬盘来使用。在Linux的中,就是通过Samba的向网络中的机器提供共享文件系统,也可以把网络中其它机器的共享挂载在本地机上使用;这在一定意义上说和FTP是不一样的。
Samba 用的netbios协议,如果您用Samba 不成功,
Linux与Windows 、Linux 和 Linux
Samba 功能和应用范围
Samba 应该范围主要是Windows和Linux 系统共存的网络中使用;如果一个网络环境都是Linux或Unix类的系统,没有必要用Samba,应该用NFS更好一点;
那Samba 能为我们提供点什么服务呢?主要是共享文件和共享打印机;
1.3 注意事项
在配置SAMBA时,先备份其配置文件。
1.4 操作步骤
1.4.1安全配置NFS服务
第一步:创建文件夹
首先创建三个文件夹,如下所示:
[root@LAB3 ~]# cd /home/
[root@LAB3 home]# mkdir newfile
[root@LAB3 home]# mkdir newfile1
[root@LAB3 home]# mkdir newfile2
给文件夹分配权限:
[root@LAB3 home]# chmod 777 newfile
[root@LAB3 home]# chmod 777 newfile1
[root@LAB3 home]# chmod 777 newfile2
查看文件夹权限:
[root@LAB3 home]# ll
总用量 48
drwxrwxrwx 2 root root 4096 1月 15 12:55 newfile
drwxrwxrwx 2 root root 4096 1月 15 12:56 newfile1
drwxrwxrwx 2 root root 4096 1月 15 12:56 newfile2
drwx------ 13 user1 user1 4096 1月 14 14:49 user1
drwx------ 13 user2 user2 4096 1月 14 15:35 user2
drwx------ 2 user3 user3 4096 1月 14 19:26 user3
第二步:启用NFS服务
Linux系统系统默认安装了NFS组件,可以使用命令rpm来验证是否安装,如下所示:
[root@LAB3 ~]# rpm -qa |grep nfs
nfs-utils-1.0.6-46
system-config-nfs-1.2.8-1
[root@LAB3 ~]#
系统默认没有启动NFS服务,这时需要使用service命令启动NFS服务,如下所示:
[root@LAB3 ~]# service nfs start
启动 NFS 服务: [ 确定 ]
关掉 NFS 配额:[ 确定 ]
启动 NFS 守护进程:[ 确定 ]
启动 NFS mountd:[ 确定 ]
使用命令来验证服务是否启动,如下所示:
[root@LAB3 ~]# service nfs status
rpc.mountd (pid 3445) 正在运行...
nfsd (pid 3441 3440 3439 3438 3437 3436 3435 3434) 正在运行...
rpc.rquotad (pid 3425) 正在运行...
[root@LAB3 ~]# service portmap status
portmap (pid 1894) 正在运行...
[root@LAB3 ~]#
第三步:配置/etc/exports文件
修改/etc/exports配置文件,在文件中加入如下内容,如下所示:
[root@LAB3 ~]# vi /etc/exports
/home/newfile 10.1.1.2(ro,anonuid=65534,anongid=65534)
/home/newfile1 10.1.1.0/24(ro,anonuid=65534,anongid=65534)
/home/newfile2 10.1.1.3(rw,anonuid=65534,anongid=65534)
配置完成后,需要重新启动nfs服务,如下所示:
[root@LAB3 ~]# service nfs restart
关闭 NFS mountd:[ 确定 ]
关闭 NFS 守护进程:[ 确定 ]
关闭 NFS quotas:[ 确定 ]
关闭 NFS 服务: [ 确定 ]
启动 NFS 服务: [ 确定 ]
关掉 NFS 配额:[ 确定 ]
启动 NFS 守护进程:[ 确定 ]
启动 NFS mountd:[ 确定 ]
[root@LAB3 ~]#
第四步:使用防火墙保证安全
因为NFS有三个守护进程,其中rpc.nfsd 是用来管理client pc 登录主机的权限,Rpc.mountd是用来管理NFS的文件系统,portmap 进行端口映射,所以需要在防火墙中打开基于TCP和UDP协议的111端口和2049两个端口,如下所示:
[root@LAB3 ~]# iptables -A INPUT -p udp -s 10.1.1.0/24 --dport 111 -d 10.1.1.1 -j ACCEPT
[root@LAB3 ~]# iptables -A OUTPUT -p udp -s 10.1.1.1 --sport 2049 -d 10.1.1.0/24 -j ACCEPT
[root@LAB3 ~]# iptables -A INPUT -p udp -s 10.1.1.0/24 --dport 2049 -d 10.1.1.1 -j ACCEPT
[root@LAB3 ~]# iptables -A OUTPUT -p udp -s 10.1.1.1 --sport 111 -d 10.1.1.0/24 -j ACCEPT
[root@LAB3 ~]# iptables -A INPUT -p tcp -s 10.1.1.0/24 --dport 111 -d 10.1.1.1 -j ACCEPT
[root@LAB3 ~]# iptables -A OUTPUT -p tcp -s 10.1.1.1 --sport 2049 -d 10.1.1.0/24 -j ACCEPT
[root@LAB3 ~]# iptables -A INPUT -p tcp -s 10.1.1.0/24 --dport 2049 -d 10.1.1.1 -j ACCEPT
[root@LAB3 ~]# iptables -A OUTPUT -p tcp -s 10.1.1.1 --sport 111 -d 10.1.1.0/24 -j ACCEPT
第五步:修改/etc/hosts.allow和/etc/hosts.deny文件,限制客户端
在/etc/hosts.allow中加入portmap: 10.1.1.0/255.255.255.0 : allow如下所示:
[root@LAB3 ~]# vi /etc/hosts.allow
#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
portmap: 10.1.1.0/255.255.255.0 : allow
[root@LAB3 ~]#
在/etc/hosts.deny中加入portmap: ALL : deny如下所示:
[root@LAB3 ~]# vi/etc/hosts.deny
#
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
# The portmap line is redundant, but it is left to remind you that
# the new secure portmap uses hosts.deny and hosts.allow. In particular
# you should know that NFS uses portmap!
portmap: ALL : deny
[root@LAB3 ~]#
第六步:验证测试
在client A上挂载文件系统,如下所示:
[root@LAB2 ~]# mount -t nfs 10.1.1.1:/home/newfile /root/a
[root@LAB2 ~]# mount -t nfs 10.1.1.1:/home/newfile1 /root/b
[root@LAB2 ~]# mount -t nfs 10.1.1.1:/home/newfile2 /root/c
mount: 10.1.1.1:/home/newfile2 failed, reason given by server: 权限不够
[root@LAB2 ~]# df
Filesystem 1K-块 已用 可用 已用% 挂载点
/dev/sda1 5803236 2530228 2978220 46% /
none 128020 0 128020 0% /dev/shm
10.1.1.1:/home/newfile
5803264 2531264 2977184 46% /root/a
10.1.1.1:/home/newfile1
5803264 2531264 2977184 46% /root/b
[root@LAB2 ~]#
在client B上挂载文件系统,如下所示:
[root@LAB1 ~]# mount -t nfs 10.1.1.1:/home/newfile /root/a
mount: 10.1.1.1:/home/newfile failed, reason given by server: 权限不够
[root@LAB1 ~]# mount -t nfs 10.1.1.1:/home/newfile1 /root/b
[root@LAB1 ~]# mount -t nfs 10.1.1.1:/home/newfile2 /root/c
[root@LAB1 ~]# df
Filesystem 1K-块 已用 可用 已用% 挂载点
/dev/sda1 5803236 2528556 2979892 46% /
none 128020 0 128020 0% /dev/shm
10.1.1.1:/home/newfile1
5803264 2531296 2977184 46% /root/b
10.1.1.1:/home/newfile2
5803264 2531296 2977184 46% /root/c
[root@LAB1 ~]#
在client A上测试读写权限,如下所示:
[root@LAB2 a]# touch test1
touch: cannot touch ‘test1’: 权限不够
[root@LAB2 a]# cd /root/b
[root@LAB2 b]# touch test2
touch: cannot touch ‘test2’: 权限不够
[root@LAB2 b]#
在client B上测试读写权限,如下所示:
[root@LAB1 ~]# cd /root/b/
[root@LAB1 b]# touch test1
touch: cannot touch ‘test1’: 权限不够
[root@LAB1 a]# cd /root/c
[root@LAB1 c]# touch test2
[root@LAB1 c]# ll
总用量 28
-rw-r--r-- 1 nfsnobody nfsnobody 0 1月 15 15:54 123
-rw-r--r-- 1 root root 20373 1月 15 13:05 filetest
[root@LAB1 c]#
禁止使用no_root_squash,如果使用了 no_root_squash,远程根用户就能够改变共享文件系统上的任何文件,从而可以使设置了特洛伊木马的程序被执行。
注意在编辑/etc/exports 文件时,在10.1.1.2和(ro,all_squash)之间是没有空格的,如有空格,则给全局以读权限。
防火的配置如下所示:
[root@LAB3 ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- 10.1.1.0/24 10.1.1.1 tcp dpt:sunrpc
ACCEPT tcp -- 10.1.1.0/24 10.1.1.1 tcp dpt:nfs
ACCEPT udp -- 10.1.1.0/24 10.1.1.1 udp dpt:sunrpc
ACCEPT udp -- 10.1.1.0/24 10.1.1.1 udp dpt:nfs
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp spt:ssh
ACCEPT tcp -- 10.1.1.1 10.1.1.0/24 tcp spt:sunrpc
ACCEPT tcp -- 10.1.1.1 10.1.1.0/24 tcp spt:nfs
ACCEPT udp -- 10.1.1.1 10.1.1.0/24 udp spt:nfs
ACCEPT udp -- 10.1.1.1 10.1.1.0/24 udp spt:sunrpc
[root@LAB3 ~]#
1.4.2安全配置SAMBA服务
第一步:创建用户和组
[root@LAB3 ~]# groupadd tech
[root@LAB3 ~]# groupadd market
[root@LAB3 ~]# useradd -g tech seek -s /bin/false
[root@LAB3 ~]# useradd -g tech len -s /bin/false
[root@LAB3 ~]# useradd -g tech gao -s /bin/false
[root@LAB3 ~]# useradd -g market jake -s /bin/false
[root@LAB3 ~]# useradd -g market joe -s /bin/false
[root@LAB3 ~]# smbpasswd -a seek
New SMB password:
Retype new SMB password:
startsmbfilepwent_internal: file /etc/samba/smbpasswd did not exist. File successfully created.
Added user seek.
[root@LAB3 ~]# smbpasswd -a len
New SMB password:
Retype new SMB password:
Added user len.
[root@LAB3 ~]# smbpasswd -a gao
New SMB password:
Retype new SMB password:
Added user gao.
[root@LAB3 ~]# smbpasswd -a jake
New SMB password:
Retype new SMB password:
Added user jake.
[root@LAB3 ~]# smbpasswd -a joe
New SMB password:
Retype new SMB password:
Added user joe.
[root@LAB3 ~]# useradd ceo
[root@LAB3 ~]# useradd finance
[root@LAB3 ~]# smbpasswd -a ceo
New SMB password:
Retype new SMB password:
Added user ceo.
[root@LAB3 ~]# smbpasswd -a finance
New SMB password:
Retype new SMB password:
Added user finance.
[root@LAB3 ~]#
第二步:建立共享目录
[root@LAB3 ~]# mkdir /home/tech /home/market
[root@LAB3 ~]# ls -ld /home/tech /home/market
drwxr-xr-x 2 root root 4096 5月 11 22:59 /home/market
drwxr-xr-x 2 root root 4096 5月 11 22:59 /home/tech
[root@LAB3 ~]# chgrp tech /home/tech
[root@LAB3 ~]# chgrp market /home/market/
[root@LAB3 ~]# chmod 3770 /home/tech/
[root@LAB3 ~]# chmod 3770 /home/market/
[root@LAB3 ~]# ls -ld /home/tech /home/market
drwxrws--T 2 root market 4096 5月 11 22:59 /home/market
drwxrws--T 2 root tech 4096 5月 11 22:59 /home/tech
[root@LAB3 ~]# mkdir /software
[root@LAB3 ~]# mkdir /tmpupload
[root@LAB3 ~]# chmod 777 /tmpupload/
[root@LAB3 ~]# chmod a+t /tmpupload/
[root@LAB3 ~]# ls -ld /tmpupload/
drwxrwxrwt 2 root root 4096 5月 11 23:02 /tmpupload/
[root@LAB3 ~]#
第三步:添加共享目录
在/etc/samba/smb.conf文件,在文件最后面加入共享文件夹目录,如下所示:
[tech]
comment = tech's files
path = /home/tech
public = no
valid users = @tech
write list = @tech
create mask = 0770
[market]
comment = market's files
path = /home/market
public = no
valid users = @market
wirte list = @market
create mask = 0770
[software]
comment = share software
path = /software
public = yes
read only = yes
[temp]
comment = temp files
path = /tmpupload
public = yes
writable = yes
第四步:安全设置
修改/etc/samba/smb.conf文件,将修改如下几个项目,如下所示:
将;hosts allow = 192.168.1. 192.168.2. 127
改为
hosts allow = 10.1.1. 127.
将安全级别为默认选项,如下所示:
security = user
将; encrypt passwords = yes
改为
encrypt passwords = yes
注意:在有防火墙的情况下,如需要打开如下几个端口:
netbi
展开阅读全文