FTP

2016/12/28 17:49
阅读数 92

FTP

1、 FTP的基本操作

1.1 FTP的安装及启动

FTP主要作用是进行文件共享服务,那么如何进行安装呢,如下所示:

[root@django ~]#yum -y install vsftpd 安装vsftpd服务端

[root@django ~]#rpm -ql vsftpd查看vsftpd的安装列表

/etc/logrotate.d/vsftpd

/etc/pam.d/vsftpd使用pam认证方式

/etc/rc.d/init.d/vsftpd启动脚本

/etc/vsftpd 配置文件主目录

/etc/vsftpd/ftpusers

/etc/vsftpd/user_list

/etc/vsftpd/vsftpd.confvsftpd主配置文件

/etc/vsftpd/vsftpd_conf_migrate.sh

/usr/sbin/vsftpdvsftpd的主程序

/var/ftp ftp用户的家目录

/var/ftp/pub

[root@django ~]#service vsftpd start 启动vsftpd服务

Starting vsftpdfor vsftpd:                               [  OK  ]

[root@django ~]#netstat -tnlp|grep ftp 查看vsftpd监听端口

tcp        0     0 0.0.0.0:21       0.0.0.0:*        LISTEN      1658/vsftpd

[root@django ~]#yum -y install ftp  安装ftp客户端

1.2 FTP的测试

在使用FTP的时候,可以使用匿名用户,匿名用户映射到系统用户为ftp用户,如下所示:

[root@django ~]#grep ftp /etc/passwd 匿名用户映射为系统用户ftp,家目录为/var/ftp,从而匿名用户使用ftp的时候,都会到家目录/var/ftp

ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin

使用ftp客户端匿名用户连接服务端进行测试:

[root@django ~]#ftp 192.168.1.63 测试匿名用户的权限,匿名用户名为ftp或者anonymous

Connected to192.168.1.63 (192.168.1.63).

220 (vsFTPd2.2.2)

Name(192.168.1.63:root): ftp

331 Pleasespecify the password.

Password:直接回车

230 Loginsuccessful.

Remote systemtype is UNIX.

Using binarymode to transfer files.

ftp> pwd匿名用户家目录在/var/ftp

257"/"

ftp> ls -l

227 EnteringPassive Mode (192,168,1,63,154,182).

150 Here comesthe directory listing.

-rw-r--r--    1 0       0             884 Dec 21 01:58inittab

drwxr-xr-x    2 0       0            4096 Dec 21 01:58 pub

226 Directorysend OK.

ftp> getinittab 匿名用户可以下载

local: inittabremote: inittab

227 EnteringPassive Mode (192,168,1,63,127,39).

150 OpeningBINARY mode data connection for inittab (884 bytes).

226 Transfercomplete.

884 bytesreceived in 3.9e-05 secs (22666.67 Kbytes/sec)

ftp> putkel.py 匿名用户不能上传

local: kel.pyremote: kel.py

227 EnteringPassive Mode (192,168,1,63,193,23).

550 Permissiondenied.

ftp> deleteinittab 匿名用户不能删除

550 Permissiondenied.

ftp> cd pub 匿名用户能进入家目录下的子目录,并且可以下载,但是不能上传和删除

250 Directorysuccessfully changed.

ftp> cd /etc 除了家目录,匿名用户不能进入任何目录

550 Failed tochange directory.

ftp> bye退出

221 Goodbye.

 

使用ftp客户端,使用系统用户kel来进行登录,用户kel在系统中必须存在,并且能登录系统,如下:

[root@django ~]#grep kel /etc/passwd使用系统用户的时候,那么ftp登录之后,直接进入用户的家目录

kel:x:500:500::/home/kel:/bin/bash

使用系统用户测试如下:

[root@django ~]#ftp 192.168.1.63 使用系统用户测试

Connected to192.168.1.63 (192.168.1.63).

220 (vsFTPd2.2.2)

Name(192.168.1.63:root): kel

331 Pleasespecify the password.

Password:输入系统用户对应的密码

230 Loginsuccessful.

Remote systemtype is UNIX.

Using binarymode to transfer files.

ftp> pwd 登录的目录为家目录,当不是显示根时,那么可以cd到其他目录,显示根,表示使用了chroot

257"/home/kel"

ftp> putkel.py 上传文件

local: kel.pyremote: kel.py

227 EnteringPassive Mode (192,168,1,63,197,79).

150 Ok to senddata.

226 Transfercomplete.

409 bytes sentin 3.4e-05 secs (12029.41 Kbytes/sec)

ftp> deletekel.py 删除文件

250 Deleteoperation successful.

ftp> getinittab 下载文件

local: inittabremote: inittab

227 EnteringPassive Mode (192,168,1,63,63,76).

150 OpeningBINARY mode data connection for inittab (884 bytes).

226 Transfercomplete.

884 bytesreceived in 0.000122 secs (7245.90 Kbytes/sec)

ftp> cd /etc 可以切换到其他目录

250 Directorysuccessfully changed.

ftp> putkel.py 在其他目录不能上传

local: kel.pyremote: kel.py

227 EnteringPassive Mode (192,168,1,63,152,241).

553 Could notcreate file.

ftp> deleteinittab在其他目录不能删除

550 Deleteoperation failed.

ftp> getyum.conf在其他目录可以下载

local: yum.confremote: yum.conf

227 EnteringPassive Mode (192,168,1,63,191,38).

150 OpeningBINARY mode data connection for yum.conf (813 bytes).

226 Transfercomplete.

813 bytesreceived in 3.7e-05 secs (21972.97 Kbytes/sec)

ftp> bye

221 Goodbye.

在使用FTP的时候,权限控制主要是两方面的控制,一个控制ftp配置文件中进行设置,另外一个就是文件系统本身权限的控制。

1.3 使用抓包验证FTP传输使用明文

FTP传输的时候,使用的是明文传输,明文验证,如下所示:

[root@django~]# tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 192.168.1.11

tcpdump:listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

11:02:06.792805IP (tos 0x0, ttl 64, id 10174, offset 0, flags [DF], proto TCP (6), length 50)

    192.168.1.11.55543 > 192.168.1.63.21:Flags [P.], cksum 0xf9c5 (correct), seq 1:11, ack 21, win 8172, length 10

       0x0000: 4500 0032 27be 4000 4006 8f6d c0a8 010b E..2'.@.@..m....

       0x0010: c0a8 013f d8f7 0015 26c8 1544 29cf a606 ...?....&..D)...

       0x0020: 5018 1fec f9c5 0000 5553 4552 206b 656c P.......USER.kel  用户名为kel,明文传输.

       0x0030: 0d0a                                    ..

11:02:12.482521IP (tos 0x0, ttl 64, id 10179, offset 0, flags [DF], proto TCP (6), length 50)

    192.168.1.11.55543 > 192.168.1.63.21:Flags [P.], cksum 0xf0cc (correct), seq 11:21, ack 55, win 8138, length 10

       0x0000: 4500 0032 27c3 4000 4006 8f68 c0a8 010b E..2'.@.@..h....

       0x0010: c0a8 013f d8f7 0015 26c8 154e 29cf a628 ...?....&..N)..(

       0x0020: 5018 1fca f0cc 0000 5041 5353 206b 656c P.......PASS.kel  密码为kel,明文传输

       0x0030: 0d0a                                     ..

2、 配置文件解析

vsftpd的主要配置文件路径如下:

[root@django ~]#ls -l /etc/vsftpd/vsftpd.conf

-rw------- 1root root 4520 Dec 21 11:21 /etc/vsftpd/vsftpd.conf

2.1 匿名用户

控制匿名用户权限的选项如下所示(考虑到安全性,从而仅仅启用匿名用户,也就是只给匿名用户下载的权限,不能上传和删除权限):

anonymous_enable=YES启用匿名用户登录

anon_upload_enable=YES匿名用户可以上传文件,也必须具有创建目录权限才能上传

anon_mkdir_write_enable=YES匿名用户可以创建目录

anon_other_write_enable=YES匿名用户可以删除文件

在使用权限的时候,必须考虑到配置文件的权限和文件系统的权限,如下测试:

[root@django ~]#mkdir /var/ftp/upload 创建匿名用户上传目录

[root@django ~]#setfacl -m u:ftp:rwx /var/ftp/upload/ 设置匿名用户上传文件夹权限

[root@django ~]#getfacl /var/ftp/upload/

getfacl:Removing leading '/' from absolute path names

# file:var/ftp/upload/

# owner: root

# group: root

user::rwx

user:ftp:rwx

group::r-x

mask::rwx

other::r-x

 

[root@django ~]#ls -dl /var/ftp/upload/

drwxrwxr-x+ 2root root 4096 Dec 21 11:28 /var/ftp/upload/

上传之后,文件如下:

[root@django ~]#ls -l /var/ftp/upload/ 属主和属组为ftp用户,匿名用户映射为系统用户ftp

total 4

-rw------- 1 ftpftp 409 Dec 21 11:31 kel.py

2.2 其他设置

主动模式传输端口设置(TCP/20),如下:

connect_from_port_20=YES主动连接端口为20号端口

日志路径配置(只记录传输文件的记录):

xferlog_file=/var/log/vsftpd.log

xferlog_std_format=YES

是否对用户使用chroot,也就是只能在映射的用户家目录中:

chroot_local_user=YES对本地系统用户使用chroot

chroot_list_enable=YES开启chroot列表

chroot_list_file=/etc/vsftpd/chroot_list在这个文件中的用户不会使用chroot

是否使用独立的进程,或者使用瞬时守护进程(xinetd):

listen=YES 使用独立进程,访问量大或者长时间在线

不允许通过ftp登录的用户(控制root等一些特殊系统用户登录FTP),配置文件如下所示:

-rw------- 1root root  125 Mar  4  2011ftpusers

是否允许用户登录,如果是NO,表示为在这个文件中的用户可以登录,如果是YES,表示在这个文件中的用户不能登录:

[root@djangovsftpd]# ls -l user_list

-rw------- 1root root 361 Mar  4  2011 user_list

userlist_deny=YES(default)

在进行确定系统用户是否能登录的时候,先根据选项检查user_list中的用户是否能登录,然后检查是否在ftpusers中,如果存在,禁止登陆。

设置客户端连接数:

max_clients=1 最大连接客户端数

max_per_ip=1 每个IP最多可以打开多少ftp连接

[root@django ~]#ftp 192.168.1.63 连接太多出现如下错误

Connected to192.168.1.63 (192.168.1.63).

421 There are too many connected users,please try later.

3、 使用openssl加密FTP

3.1 生成证书

生成证书步骤如下:

[root@djangoCA]# (umask 077;openssl genrsa -out private/cakey.pem 1024) 生成自己的私钥

Generating RSAprivate key, 1024 bit long modulus

..............++++++

.....++++++

e is 65537(0x10001)

[root@djangoCA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655 自签证书

You are about tobe asked to enter information that will be incorporated

into yourcertificate request.

What you areabout to enter is what is called a Distinguished Name or a DN.

There are quitea few fields but you can leave some blank

For some fieldsthere will be a default value,

If you enter'.', the field will be left blank.

-----

Country Name (2letter code) [CN]:

State orProvince Name (full name) [Jiang Su]:

Locality Name(eg, city) [Nan Jing]:

OrganizationName (eg, company) [KEL]:

Oprations (eg,section) [Operations]:DEV 

Common Name (eg,your name or your server's hostname) []:ca.admin.com

Email Address[]:

[root@djangoCA]# cd /etc/vsftpd/ssl

[root@djangossl]# (umask 077;openssl genrsa 1024 > vsftpd.key) 生成vsftpd的私钥

Generating RSAprivate key, 1024 bit long modulus

........++++++

....++++++

e is 65537(0x10001)

[root@djangossl]# openssl req -new -key vsftpd.key -out vsftpd.csr证书申请

You are about tobe asked to enter information that will be incorporated

into yourcertificate request.

What you areabout to enter is what is called a Distinguished Name or a DN.

There are quitea few fields but you can leave some blank

For some fieldsthere will be a default value,

If you enter'.', the field will be left blank.

-----

Country Name (2letter code) [CN]:

State orProvince Name (full name) [Jiang Su]:

Locality Name(eg, city) [Nan Jing]:

OrganizationName (eg, company) [KEL]:

Oprations (eg,section) [Operations]:DEV

Common Name (eg,your name or your server's hostname) []:ftp.kel.com

Email Address[]:

 

Please enter thefollowing 'extra' attributes

to be sent withyour certificate request

A challengepassword []:

An optionalcompany name []:          

 

[root@djangossl]# openssl ca -in vsftpd.csr -out vsftpd.crt -days 3655 签署证书

Usingconfiguration from /etc/pki/tls/openssl.cnf

Check that therequest matches the signature

Signature ok

CertificateDetails:

        Serial Number: 0 (0x0)

        Validity

            Not Before: Dec 21 05:42:42 2016GMT

            Not After : Dec 24 05:42:42 2026GMT

        Subject:

            countryName               = CN

            stateOrProvinceName       = Jiang Su

            organizationName          = KEL

            organizationalUnitName    = DEV

            commonName                = ftp.kel.com

        X509v3 extensions:

            X509v3 Basic Constraints:

                CA:FALSE

            Netscape Comment:

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier:

                4F:D5:E6:A4:4E:08:E9:B8:09:E4:8B:13:1F:72:16:2E:E4:3D:86:70

            X509v3 Authority Key Identifier:

               keyid:95:17:35:BF:56:C0:69:2B:D2:74:EA:D6:4A:A0:14:80:CF:A1:63:2E

 

Certificate isto be certified until Dec 24 05:42:42 2026 GMT (3655 days)

Sign the certificate?[y/n]:y

 

 

1 out of 1certificate requests certified, commit? [y/n]y

Write outdatabase with 1 new entries

Data BaseUpdated

 

 

 

3.2 配置FTP

在配置文件中,添加如下内容:

[root@djangovsftpd]# tail -10 vsftpd.conf

ssl_enable=YES

ssl_sslv3=YES

ssl_tlsv1=YES

allow_anon_ssl=NO

force_local_data_ssl=YES

force_local_logins_ssl=YES

rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt

rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key

重启服务可能出现如下错误:

[root@django vsftpd]# service vsftpdrestart

Starting vsftpd for vsftpd: 500 OOPS: SSL:cannot load RSA private key  [FAILED]

表示在配置文件出错,本次出错是因为配置文件的路径使用了引号,在配置文件中路径无需用引号。

3.3 测试

在测试的时候,使用flashfxp进行测试如下:

 

在连接的时候,会让你保存证书,从而下载保存证书,从而可以连接上,在flashfxp中显示如下:


4、 虚拟用户配置

匿名用户使用的是ftp的家目录,也就是/var/ftp,注意此目录的权限位root,并且为755

虚拟用户使用mysql来存储虚拟用户的数据,从而需要首先安装mysql,具体的步骤如下所示:


[root@RHEL8 ~]#yum -y install mysql mysql-server mysql-devel

4.1 安装pam_mysql模块及vsftpd

由于要使用到mysql,而且是pam验证,从而需要pam能访问mysql,安装如下(得到pam访问mysql的模块):

[root@rsyncserverinstall]# tar -xf pam_mysql-0.7RC1.tar.gz

[root@rsyncserverinstall]# cd pam_mysql-0.7RC1

[root@rsyncserverpam_mysql-0.7RC1]# ./configure --with-mysql=/usr/local/mysql
--with-openssl
手动编译安装的mysql

configure:error: Cannot find pam headers.Please check if your system is ready for pam module development.

[root@rsyncserverpam_mysql-0.7RC1]# yum -y install pam-devel 安装pam的头文件

[root@rsyncserverpam_mysql-0.7RC1]# make

[root@rsyncserverpam_mysql-0.7RC1]# make install

[root@rsyncserverpam_mysql-0.7RC1]# ls -l /lib/security/pam_mysql.so 查看安装的库文件

-rwxr-xr-x 1root root 122921 Dec 21 07:05 /lib/security/pam_mysql.so

安装VSFTPD

[root@RHEL8 ~]#mkdir /usr/share/empty确定此目录存在

mkdir: cannotcreate directory `/usr/share/empty': File exists

[root@rsyncservervsftpd-3.0.0]# make

/usr/bin/ld: cannot find -lcap

collect2: ldreturned 1 exit status

make: ***[vsftpd] Error 1

[root@rsyncservervsftpd-3.0.0]# yum -y install libcap-devel 安装cap的头文件

[root@rsyncservervsftpd-3.0.0]# make && make install 安装

[root@rsyncservervsftpd-3.0.0]# cp vsftpd.conf /etc/ 复制配置文件

 

4.2 数据库配置

创建数据库来存储相关虚拟用户的数据库表,如下:

mysql> createdatabase vsftp; 创建存储虚拟用户的数据库

Query OK, 1 rowaffected (0.09 sec)

mysql> grantselect on vsftp.* to vsftpd@localhost identified by '123456'; 授权

Query OK, 0 rowsaffected (0.09 sec)

mysql> grantselect on vsftp.* to vsftpd@127.0.0.1 identified by '123456';

Query OK, 0 rowsaffected (0.00 sec)

mysql> flushprivileges;

Query OK, 0 rowsaffected (0.02 sec)

mysql> selectuser,host,password from mysql.user where user='vsftpd';查看创建的用户

+--------+-----------+-------------------------------------------+

| user   | host     | password                                  |

+--------+-----------+-------------------------------------------+

| vsftpd |localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

| vsftpd |127.0.0.1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

+--------+-----------+-------------------------------------------+

2 rows in set(0.00 sec)

mysql> createtable users (id int not null auto_increment primary key,name varchar(50) notnull,passwd varchar(50) not null,unique(name)); 创建存储虚拟用户的表

Query OK, 0 rowsaffected (0.17 sec)

mysql> insertinto users (name,passwd) values ('smile','smile');明文存储,对应pamcrypt0,表示明文

Query OK, 1 rowaffected (0.11 sec)

[root@rsyncserver~]# cat  /etc/pam.d/vsftp.mysql

auth required/lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftptable=users usercolumn=name passwdcolumn=passwd crypt=0

account required/lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftptable=users usercolumn=name passwdcolumn=passwd crypt=0

创建虚拟用户对应的系统用户:

[root@rsyncserver~]# useradd -s /sbin/nologin -d /var/ftp vsftp

[root@rsyncserver~]# ls -dl /var/ftp

drwx------ 2vsftp vsftp 4096 Dec 22 01:06 /var/ftp

[root@rsyncserver~]# chmod go+rx /var/ftp

4.3 VSFTP配置

Vsftpd的配置文件如下所示:

[root@RHEL7 ~]#grep -v "#" /etc/vsftpd.conf

anonymous_enable=YES

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_file=/var/log/vsftpd.log

listen=YES

 

guest_enable=YES

guest_username=vsftp

pam_service_name=vsftp.mysql

allow_writeable_chroot=YES

 

4.4 可能出现问题

在使用测试的时候,可能出现错误如下(无法将用户锁定在家目录中):

[root@RHEL7 ~]#ftp localhost

Trying ::1...

ftp: connect toaddress ::1Connection refused

Trying127.0.0.1...

Connected tolocalhost (127.0.0.1).

220 (vsFTPd3.0.0)

Name(localhost:root): tom

331 Pleasespecify the password.

Password:

500 OOPS: vsftpd: refusing to run with writableroot inside chroot()

Login failed.

主要是在配置文件中,需要添加参数如下所示:

allow_writeable_chroot=YES允许进行用户锁定在家目中

4.5 对虚拟用户配置不同的权限

在主配置文件中设置如下:

[root@RHEL8vusers_dir]# tail -1 /etc/vsftpd.conf

user_config_dir=/etc/vsftpd/vusers_dir

[root@RHEL8 ~]#mkdir -p /etc/vsftpd/vusers_dir 创建权限目录

[root@RHEL8 ~]#cd /etc/vsftpd/vusers_dir/

[root@RHEL8vusers_dir]# cat tom 创建同名文件,其中写上权限即可

anon_upload_enable=NO

anon_mkdir_write_enable=NO

 


本文分享自微信公众号 - SRE运维实践(gh_319dd73ec076)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部