分类: LINUX
2011-01-24 21:14:20
下面是关于在linux下配置FTP服务的讨论,
FTP介绍
FTP全名是File Transfer Protocol(文件传输协议)
FTP可以跨越平台,也可以运行在Internet上面,在linux下面FTP可以通过很多软件来实现,我们linux下面最常用的FTP服务器架设使用vsftpd软件。Vsftpd是一个基于GPL发布的FTP服务器软件,其中vs是指very secure的缩写,由此可以看出,本软件的的初衷是为了服务的安全。
FTP也是红帽的默认安装的服务器软件。
下面是关于FTP这个服务的属性
FTP的相关软件包
Vsftpd
FTP的守护进程
/usr/sbin/vsftpd
FTP的脚本
/etc/init.d/vsftpd
FTP的端口
21(ftp) 20(ftp-data)
FTP的配置文件
/etc/vsftpd/vsftpd.conf
下面来具体搭建FTP服务
安装软件包
[root@localhost ~]#
[root@localhost ~]# yum -y install vsftpd
Loaded plugins: rhnplugin, security
This system is not registered with RHN.
RHN support will be disabled.
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package vsftpd.i386 0:2.0.5-16.el5 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
=================================================================================================
Package Arch Version Repository Size
=================================================================================================
Installing:
vsftpd i386 2.0.5-16.el5 Server 140 k
Transaction Summary
=================================================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 140 k
Downloading Packages:
vsftpd-2.0.5-16.el5.i386.rpm | 140 kB 00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : vsftpd 1/1
Installed:
vsftpd.i386 0:2.0.5-16.el5
Complete!
[root@localhost ~]#
FTP的软件包就安装成功了,
安装完FTP服务以后,系统会自动创建/var/ftp/pub这个目录。
[root@localhost ~]#
[root@localhost ~]# ls -ld /var/ftp/pub/
drwxr-xr-x 9 root root 4096 Mar 18 13:00 /var/ftp/pub/
[root@localhost ~]#
的确是有这个目录的,并且权限为755。
现在我们启动FTP服务,
[root@localhost ~]#
[root@localhost ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost ~]#
OK,服务启动成功,
默认情况下,当启动FTP服务后,我们不需要做任何配置,FTP服务是可以工作的,并且可以正常访问。
在linux下面访问FTP服务的客户端工具一般使用这两个工具
#lftp 192.168.0.254
#ftp 192.168.0.254
这两个工具的区别是lftp默认就是使用匿名的身份来访问FTP服务的,支持补齐。ftp工具访问的时候需要输入用户名和密码,而且不支持补齐。
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> ls
drwxr-xr-x 9 0 0 4096 Mar 18 05:00 pub
lftp 192.168.0.254:/> cd pub/
lftp 192.168.0.254:/pub> ls
drwxr-xr-x 3 0 0 4096 Aug 19 2009 Cluster
drwxr-xr-x 3 0 0 4096 Aug 19 2009 ClusterStorage
drwxr-xr-x 3 0 0 143360 Aug 19 2009 Server
drwxr-xr-x 3 0 0 4096 Aug 19 2009 VT
-rw-r--r-- 1 0 0 9244672 Aug 19 2009 boot.iso
-rw------- 1 0 0 843 Mar 18 05:00 grub.conf
drwxr-xr-x 4 0 0 4096 Aug 19 2009 images
drwxr-xr-x 2 0 0 4096 Aug 19 2009 isolinux
-rw-r--r-- 1 0 0 661 Mar 18 05:00 server.repo
drwxrwxrwx 7 0 0 4096 Feb 23 13:14 tools
lftp 192.168.0.254:/pub>
OK,FTP服务可以正常的访问,我们并没有做任何的配置。
现在我们来查看一下FTP服务的配置文件,
[root@localhost ~]#
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
关于/etc/vsftpd/vsftpd.conf这个文件里面的参数解释,
anonymous_enable=YES
这个代表是否允许匿名用户访问,默认是允许的。
local_enable=YES
这个是代表是否允许本地用户访问,默认是允许的。
write_enable=YES
这个是代表所有用户是否有上传的权限,默认是有的。
local_umask=022
这个是代表本地用户上传的umask值是022,默认也是022。
anon_umask=077
这个是代表匿名用户上传的umask值是077,默认也是077。
anon_upload_enable=YES
这个是代表匿名用户是否有上传的权限,默认是没有的。
anon_mkdir_write_enable=YES
这个是代表匿名用户是否可以在共享目录中建立文件夹的权限,默认是没有的。
dirmessage_enable=YES
是否显示该目录的说明文件,默认是开启的。
xferlog_enable=YES
是否激活日志文件,默认是支持的。
connect_from_port_20=YES
是否启用20号端口,默认是开启的。
chown_uploads=YES
chown_username=root
这个是代表匿名用户上传的文件的拥有人是root,默认是关闭的。
ascii_upload_enable=YES
这个是代表是否允许用户可以上传一个二进制文件,默认是不允许的。
ascii_download_enable=YES
这个是代表是否允许用户可以下载一个二进制文件,默认是不允许的。
chroot_list_enable=YES
这个是代表是否开启chroot的环境,默认没有开启。
chroot_list_file=/etc/vsftpd/chroot_list
这个是代表写在/etc/vsftpd/chroot_list文件里面的用户是不可以出chroot环境的。默认是可以的。
Chroot_local_user=YES
这个是代表所有写在/etc/vsftpd/chroot_list文件里面的用户是可以出chroot环境的,和上面的相反。
现在我们开始做试验,
1. 如何实现匿名用户可以有上传的权限
要想实现匿名用户有上传的权限,必须开启匿名用户可以访问的权限。
anonymous_enable=YES
必须开启这个功能。
首先我们必须开启匿名用户上传的权限和创建子目录的权限。
anon_upload_enable=YES
OK,现在我们重启下服务,试试匿名用户能否上传。
[root@localhost ~]#
[root@localhost ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost ~]#
OK,服务启动成功。
我们来尝试下,
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> ls
drwxr-xr-x 9 0 0 4096 Mar 18 05:00 pub
lftp 192.168.0.254:/> cd pub/
lftp 192.168.0.254:/pub> put /etc/inittab
put: Access failed: 553 Could not create file. (inittab)
lftp 192.168.0.254:/pub>
我们的匿名用户并不可以上传啊,
我们看下/var/ftp/pub这个目录的权限,
[root@localhost ~]#
[root@localhost ~]# ls -ld /var/ftp/pub/
drwxr-xr-x 9 root root 4096 Mar 18 13:00 /var/ftp/pub/
[root@localhost ~]#
/var/ftp/pub这个目录的权限是755。而我们的匿名用户使用的ftp的身份来访问的。所以匿名用户对/var/ftp/pub这个目录是没有写的权限的。
现在我们改变/var/ftp/pub这个目录的权限,
[root@localhost ~]#
[root@localhost ~]# chmod 777 /var/ftp/pub/
[root@localhost ~]#
[root@localhost ~]# ls -ld /var/ftp/pub/
drwxrwxrwx 9 root root 4096 Mar 18 13:00 /var/ftp/pub/
[root@localhost ~]#
现在我们将/var/ftp/pub这个目录的权限设置成了777,也就是说现在匿名用户对这个目录是有写的权限的。
现在我们在来尝试下能否上传文件,
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~>
lftp 192.168.0.254:~> ls
drwxrwxrwx 9 0 0 4096 Mar 18 06:59 pub
lftp 192.168.0.254:/> cd pub/
lftp 192.168.0.254:/pub> put /etc/inittab
put: Access failed: 553 Could not create file. (inittab)
lftp 192.168.0.254:/pub>
可以看到,现在匿名用户还是不能够上传文件。
这个为什么呢,不过现在selinux跳出来了,很可能是selinux的原因。
现在我们来测试下是不是selinux阻挡了我。
[root@localhost ~]#
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> ls
drwxrwxrwx 9 0 0 4096 Mar 18 06:59 pub
lftp 192.168.0.254:/> cd pub/
lftp 192.168.0.254:/pub> put /etc/inittab
1666 bytes transferred
lftp 192.168.0.254:/pub>
OK,当我们吧selinux设置为警告模式的时候,我们就可以上传了。
现在就可以得到结论,就是selinux将我们阻挡了。
现在我们就来解决selinux的问题。
这个时候selinux的黄色五角星也已经跳了出来,也给我们提供了解决方法。
[root@localhost ~]#
[root@localhost ~]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
allow_tftp_anon_write --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_disable_trans --> off
ftpd_is_daemon --> on
httpd_enable_ftp_server --> off
tftpd_disable_trans --> off
[root@localhost ~]#
可以看到,允许匿名用户上传的给关闭的了。
现在我们设置布尔值,
[root@localhost ~]#
[root@localhost ~]# setsebool -P allow_ftpd_anon_write=1
[root@localhost ~]#
[root@localhost ~]# getsebool -a | grep allow_ftpd_anon
allow_ftpd_anon_write --> on
[root@localhost ~]#
OK,允许匿名用户的上传就给打开了。
但是还有一点,/var/ftp/pub的context值是不正确的,
现在我们必须调整这个/var/ftp/pub目录的context值。
[root@localhost ~]#
[root@localhost ~]# ls -ldZ /var/ftp/pub/
drwxrwxrwx root root system_u:object_r:public_content_t /var/ftp/pub/
[root@localhost ~]#
[root@localhost ~]# chcon -R -t public_content_rw_t /var/ftp/pub/
[root@localhost ~]#
[root@localhost ~]# ls -ldZ /var/ftp/pub/
drwxrwxrwx root root system_u:object_r:public_content_rw_t /var/ftp/pub/
[root@localhost ~]#
Selinux的问题就解决了,现在我们再来上传文件,
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> ls
drwxrwxrwx 9 0 0 4096 Mar 18 07:22 pub
lftp 192.168.0.254:/> cd pub/
lftp 192.168.0.254:/pub> put /etc/inittab
1666 bytes transferred
lftp 192.168.0.254:/pub> ls inittab
-rw------- 1 14 50 1666 Mar 18 07:23 inittab
lftp 192.168.0.254:/pub>
OK,到目前为止,我们的匿名用户就可以上传文件了。
总结一下,如果想要开放匿名用户的上传文件的权限,
1,开启目录自身的权限
2,开启服务控制的权限
3,解决selinux的问题
2.如何实现匿名用户创建子目录的权限
首先我们必须开启匿名用户创建子目录的权限,
anon_mkdir_write_enable=YES
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> ls
drwxrwxrwx 9 0 0 4096 Mar 18 07:23 pub
lftp 192.168.0.254:/> cd pub/
lftp 192.168.0.254:/pub> mkdir test
mkdir ok, `test' created
lftp 192.168.0.254:/pub> ls | grep test
drwx------ 2 14 50 4096 Mar 18 07:27 test
lftp 192.168.0.254:/pub>
OK,是可以创建目录的。
那么我们匿名用户上传的文件匿名用户可以删除和下载吗?
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> ls
drwxrwxrwx 10 0 0 4096 Mar 18 07:27 pub
lftp 192.168.0.254:/> cd pub/
lftp 192.168.0.254:/pub> rm inittab
rm: Access failed: 550 Permission denied. (inittab)
lftp 192.168.0.254:/pub>
lftp 192.168.0.254:/pub> get inittab
get: Access failed: 550 Failed to open file. (inittab)
lftp 192.168.0.254:/pub>
可以看到,匿名用户上传的文件匿名用户是不可以删除的。也不可以被下载,这个就是vsftpd的安全性的体现。
3.如何将用户锁定在自己home目录里面呢?
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> user user1
Password:
lftp user1@192.168.0.254:~> cd ..
cd ok, cwd=/home/user1/..
lftp user1@192.168.0.254:~/..> ls
lftp user1@192.168.0.254:~/..> cd ..
cd ok, cwd=/
lftp user1@192.168.0.254:/> ls
drwxr-xr-x 2 0 0 4096 Mar 13 05:35 bin
drwxr-xr-x 11 0 0 4040 Mar 18 04:21 dev
drwxr-xr-x 96 0 0 12288 Mar 18 05:10 etc
drwxr-xr-x 4 0 0 1024 Mar 08 06:22 home
drwxr-xr-x 13 0 0 4096 Mar 18 03:56 lib
drwxr-xr-x 2 0 0 0 Mar 18 04:21 misc
drwxr-xr-x 2 0 0 0 Mar 18 04:21 net
drwxr-xr-x 2 0 0 4096 Aug 08 2008 opt
dr-xr-xr-x 169 0 0 0 Mar 18 04:20 proc
drwxr-x--- 21 0 0 4096 Mar 18 07:32 root
drwxr-xr-x 2 0 0 12288 Mar 13 05:35 sbin
drwxr-xr-x 4 0 0 0 Mar 18 04:20 selinux
drwxr-xr-x 2 0 0 4096 Aug 08 2008 srv
drwxr-xr-x 11 0 0 0 Mar 18 04:20 sys
drwxrwxrwt 5 0 0 4096 Mar 18 07:36 tmp
drwxr-xr-x 14 0 0 4096 Mar 05 18:09 usr
drwxr-xr-x 25 0 0 4096 Mar 06 12:16 var
lftp user1@192.168.0.254:/>
我们可以看到,user1通过ftp服务把我们系统中根下面的目录都给列出来了,这样是非常不安全的,所以很有必要将用户锁定在自己的home目录里面。
我们必须在/etc/vsftpd/vsftpd.conf文件里面进行定义,
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
这个/etc/vsftpd/chroot_list文件必须存在,而且写在这个文件里面的用户是不可以跑出自己的home目录的。
现在我们在/etc/vsftpd/chroot_list这个文件里面写入user1这个用户,
OK,现在我们重启下服务,
[root@localhost ~]#
[root@localhost ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost ~]#
OK,服务启动成功,测试下。
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> user user1
Password:
lftp user1@192.168.0.254:~> ls
lftp user1@192.168.0.254:/> cd ..
lftp user1@192.168.0.254:/> ls
lftp user1@192.168.0.254:/> cd ..
lftp user1@192.168.0.254:/> ls
lftp user1@192.168.0.254:/>
可以看到,这个user1的确跑不出自己的home目录了。
我们知道写在/etc/vsftpd/chroot_list这个文件里面的用户是不可以跑出自己的home目录的。那么如果有很多用户呢,我们是不是还需要把所有的用户的都写在/etc/vsftpd/chroot_list这个文件里面呢,显然,这个是非常麻烦的。
我们可以在/etc/vsftpd/vsftpd.conf这个文件里面定义,
Chroot_local_user=YES
那么这个就和刚才的相反,只有写在/etc/vsftpd/chroot_list文件里面的用户可以跑出自己的home目录,其他的用户均不可以跑出自己的home目录。
如果/etc/vsftpd/chroot_list这个文件里面没有定义用户,就代表所有用户均无法跑出自己的home目录。
关于FTP的访问控制,
在/etc/vsftpd/vsftpd.conf文件中写到
pam_service_name=vsftpd
这个就是代表vsftpd服务是支持pam模块的管理的,
userlist_enable=YES
也是可以对vsftpd做访问控制的,
tcp_wrappers=YES
vsftpd支持tcp_wrappers防火墙,
现在我们来查看一下pam是如何来管理vsftpd服务的,
[root@localhost ~]#
[root@localhost ~]# cd /etc/pam.d/
[root@localhost pam.d]#
[root@localhost pam.d]# cat vsftpd | grep vsftpd
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
[root@localhost pam.d]#
这个里面就定义了写在/etc/vsftpd/ftpusers里面的用户是不可以访问ftp服务的。
现在我们就来试一下,
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> user user1
Password:
lftp user1@192.168.0.254:~> ls
lftp user1@192.168.0.254:/>
OK,user1现在是可以登陆ftp的,
现在我们在/etc/vsftpd/ftpusers里面添加user1这个用户。
[root@localhost vsftpd]#
[root@localhost vsftpd]# cat ftpusers | grep user1
user1
[root@localhost vsftpd]#
已经将user1添加到这个文件里面去了,
OK,现在我们重启下服务,
[root@localhost ~]#
[root@localhost ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost ~]#
OK,服务启动成功,测试下。
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> user user1
Password:
lftp user1@192.168.0.254:~> ls
ls: Login failed: 530 Login incorrect.
可以看到,user1现在就登录失败了。
现在我们在来了解下userlist_enable=YES的作用,
同样的在/etc/vsftpd/user_list这个文件中定义,
现在我们来查看一下这个文件,
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
可以看到,如果userlist_deny=NO,就代表vsftpd服务仅允许写在这个文件里面的用户可以访问,
如果userlist_deny=YES,就代表写在这个文件里面的用户不可以访问vsftpd服务,这个也是默认的。
现在我们在/etc/vsftpd/user_list文件中添加user2,
[root@localhost ~]#
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]#
[root@localhost vsftpd]# cat user_list | grep user2
user2
[root@localhost vsftpd]#
OK,现在我们重启下服务,
[root@localhost ~]#
[root@localhost ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost ~]#
OK,服务启动成功,测试下。
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> user user2
Password:
lftp user2@192.168.0.254:~> ls
`ls' at 0 [Delaying before reconnect: 14]
可以看到,user2也是不可以登录FTP服务的。
刚才是默认情况,现在我们来改变一下,
在/etc/vsftpd/vsftpd.conf文件中添加这样的一行,
userlist_deny=NO
在来看下/etc/user_list这个文件中的用户
[root@localhost ~]#
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]#
[root@localhost vsftpd]# cat user_list | grep user1
user2
[root@localhost vsftpd]#
OK,现在我们重启下服务,
[root@localhost ~]#
[root@localhost ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost ~]#
OK,服务启动成功,测试下。
[root@localhost ~]#
[root@localhost ~]# lftp 192.168.0.254
lftp 192.168.0.254:~> user user2
Password:
lftp user2@192.168.0.254:~> ls
lftp user2@192.168.0.254:/>
可以看到,现在的user2又可以登录了,和刚刚的正好相反了。
现在又有个问题了,在/etc/vsftpd/ftpusers文件和/etc/vsftpd/user_list文件中定义的用户的发生冲突的时候,拒绝优先。也就是说当在/etc/vsftpd/ftpusers这个文件里面定义了拒绝user1,而在/etc/vsftpd/user_list这个文件里面定义了允许user1。那么最终user1还是不可以登陆ftp服务的,因为拒绝优先。
在linux下面配置FTP服务的讨论就到这里,