Chinaunix首页 | 论坛 | 博客
  • 博客访问: 162224
  • 博文数量: 126
  • 博客积分: 1073
  • 博客等级: 上尉
  • 技术积分: 1175
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 00:32
文章分类

全部博文(126)

文章存档

2018年(56)

2013年(1)

2012年(8)

2011年(61)

分类: 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>

OKFTP服务可以正常的访问,我们并没有做任何的配置。

现在我们来查看一下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/pubcontext值是不正确的,

现在我们必须调整这个/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:/>

OKuser1现在是可以登陆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服务的讨论就到这里,

阅读(1048) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~