文件传输协议FTP
FTP(File Transfer Protocol )早期的三个应用级协议之一,基于基于C/S结构
FTP传输协议采用双通道协议
双通道协议:数据和命令连接,会分别建立2个tcp协议来进行
以服务器为角度
分为主动模式和被动模式,用那种模式由客户端定义
tcp20
端口,客户端使用的随机端口,会通过命令端口执行PORT命令
告知FTP服务器,FTP传输数据通道是一次性的,服务器不主动传输数据,就会自动断开
[root@hai7-7 ~]$ftp 172.20.0.1
Connected to 172.20.0.1 (172.20.0.1).
220 (vsFTPd 2.2.2) <==220为状态码,输入一次命令都回返回一个状态码
Name (172.20.0.1:root): ftp <==ftp为匿名账户
331 Please specify the password.
Password: <==匿名账户密码随便敲都可以登入
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files. <==默认以二进制模式连接,
ftp> pwd
257 "/" <==刚连接所处位置,为ftp系统账号的家目录/var/ftp
ftp> ls <==列出文件列表,需要得到数据,就要走数据通道
227 Entering Passive Mode (172,20,0,1,24,126). <==被动模式,随机端口为24.126
ftp> passive <==模式切换命令
Passive mode off. <==显示关闭被动模式
ftp> get winxp_ghost.iso <==下载一个文件
200 PORT command successful. Consider using PASV. <==使用主动模式
FTP软件介绍
ftp -A ftpserverport -A主动模式–p 被动模式
lftp -u username ftpserver
lftp username@ftpserver
lftp get ftp://ftpserver/pub/file
[root@hai7-7 ~]$wget ftp://172.20.0.1/pub/getty
[root@hai7-7 ~]$ curl -o a.html ftp://172.20.0.1/pub/getty
ftp登录状态码
常用状态码 | 常见状态码 |
---|---|
1XX:信息类 | 125:数据连接打开 |
2XX:成功类状态 | 200:命令OK, 230:登录成功 |
3XX:补充类 | 331:用户名OK |
4XX:客户端错误 | 425:不能打开数据连接 |
5XX:服务器错误 | 530:不能登录 |
用户认证
分为三类用户
usermod -d /data/ftp ftp
[root@hai7-7 ~]$yum install -y vsftpd
'命令行连接非标准端口方式,2121为指定的端口'
ftp 192.168.50.97 2121
'图形界面连接'
ftp://192.168.50.97:2121
connect_from_port_20=YES <==主动模式端口为20
ftp_data_port=20 (默认) <==指定主动模式的端口
pasv_min_port=6000 <==0为随机分配
pasv_max_port=6010
use_localtime=YES <==使用当地时间(默认为NO,使用GMT)
anonymous_enable=YES <==支持匿名用户,使用系统自带的ftp账户,修改为no表示不支持匿名账户
no_anon_password=YES <==(默认NO) 匿名用户略过口令检查
anon_world_readable_only <==(默认YES)只能下载登录用户具有读权限的文件
anon_upload_enable=YES <==匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES <==匿名建目录
上传权限问题匿名账户不具有在根的写权限,需要定义文件系统权限
mkdir upload <==建一个专门的上传目录
setfacl -m u:ftp: rwx upload/ <==给予登录账号至少具有写权限才可以上传
上传后的文件不可以下载,因为默认权限为077anon_umask=0333 <==指定匿名上传文件的umask,默认077
修改上传文件,如删除、重命名、修改等权限anon_other_write_enable=YES <==默认为no
指定上传文件的默认的所有者和权限chown_uploads=YES(默认NO)
chown_username=ftp
chown_upload_mode=0644
/home/用户
,并不是/
(所以即使对家目录有写权限登录也不会报错),默认可以上传下载删除文件,还能切换到FTP服务器的任何目录,很不安全。local_enable=YES <==是否允许linux用户登录,默认值为no,如果启用了SElinux,需要配合`SE bool ftp_home_dir`
write_enable=YES <==允许linux用户上传文件
local_umask=0222 <==指定系统用户上传文件的默认权限
guest_enable=YES <==所有系统用户都映射成guest用户
guest_username=ftp <==配合上面选项才生效,指定guest用户
local_root=/ftprootguest <==指定映射用户登录目录```
示例,refusing to run with writable root inside chroot()解决方法1. '将所有系统用户都映射为固定的系统用户v9'
[root@hai7-7 ~]$vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=v9
2. '登录ftp,会出现如下报错,报错原因为,登录账户对根目录有写权限,系统认为是不安全的'
[root@hai7-6 ~]$ftp 192.168.50.97
500 OOPS: vsftpd: refusing to run with writable root inside chroot() <==报错
3. '查看权限'
[root@hai7-7 v9]$ll -d /home/v9
drwx------. 3 v9 v9 78 Apr 11 2018 /home/v9 <==具有写权限
4. '去掉写权限,系统账户可以正常登录'
[root@hai7-7 v9]$chmod -w /home/v9
5. '如果不可以查看根目录下文件,因为文件属主和属组都是v9,映射账户不具备读和执行权限,加上读和执行权限'
[root@hai7-7 v9]$chmod a+rx /home/v9/
chroot_local_user=YES <==(默认NO,不禁锢)禁锢系统用户
示例:禁锢示例1. '增加如下项,使用系统账户登录查看效果'
[root@hai7-7 ~]$vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
2. '使用系统账户登录,出现写权限报错,说明登录后将家目录变成了根目录'
[root@hai7-6 ~]$ftp 192.168.50.97
Name (192.168.50.97:root): moli <==系统账户
500 OOPS: vsftpd: refusing to run with writable root inside chroot() <==出现写权限报错
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
xferlog_enable=YES <==(默认)启用记录上传下载日志
xferlog_std_format=YES <==(默认)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog <==(默认)可自动生成
dual_log_enable=YES <==使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log <==(默认)可自动生成
ftpd_banner=“welcometo mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt <==优先ftpd_banner
示例:高亮带颜色字体提示信息[root@hai7-7 ~]$vim /etc/vsftpd/ftpbanner.txt
welcometo mage ftp server
^[[1;32m遵守制度 ^[[0m <==可以加颜色^[=ctrl+v+[
dirmessage_enable=YES <==(默认)
message_file=.message <==(默认)信息存放在指定目录下.message
示例1. '进入ftp目录下,多创建一个upload目录'
[root@hai7-7 ~]$cd /var/ftp/
[root@hai7-7 ftp]$ls
pub upload
2. '分别在目录下建立访问提示信息文件'
[root@hai7-7 ftp]$cd upload
[root@hai7-7 upload]$echo upload dir > .message
[root@hai7-7 upload]$cd ../pub
[root@hai7-7 pub]$echo download dir > .message
3.'使用匿名账户登录,查看设置'
[root@hai7-6 ~]$ftp 192.168.50.97
ftp> cd /pub
250-download dir <==提示信息
pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd[root@hai7-7 pub]$cat /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
模块pam_listfile :基于文件中的列表控制用户登录权限
验证条件
1. sense=[allow|deny]:文件中检查匹配的内容允许或拒绝
2. item= [tty|user|rhost|ruser|group|shell] :文件中那些内容需要检查
3. file=/etc/vsftpd/ftpusers:默认设置中,管理列表文件
userlist_enable=YES <==默认有此设置
userlist_deny=YES <==(默认值)黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/users_list <==此为默认值,控制用户登录的文件
nopriv_user=nobody (默认值)
示例:nobody用户在哪里出现FTP每连接一个用户都会新开一个以nobody(默认)运行的子进程,指定的身份就是此子进程身份,必须为系统存在的账号
[root@hai7-7 ~]$ps -efH
root 26111 1 0 10:46 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf <==FTP父进程
nobody 27590 26111 0 12:43 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf <==FTP子进程,nopriv_user指定项
v9 27594 27590 0 12:43 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf <==FTP子子进程,登录用户
max_clients=0 <==最大并发连接数,0表示不限制
max_per_ip=0 <==每个IP同时发起的最大连接数
anon_max_rate=0 <==匿名用户的最大传输速率
local_max_rate=0 <==本地用户的最大传输速率
connect_timeout=60 <==主动模式数据连接超时时长
accept_timeout=60 <==被动模式数据连接超时时长
data_connection_timeout=300 <==数据连接无数据输超时时长
idle_session_timeout=60 <==无命令操作超时时长
ascii_upload_enable=YES
ascii_download_enable=YES
示例:传输格式切换客户端可以通过命令,修改
ftp> ascii <==文本格式
200 Switching to ASCII mode.
ftp> binary <==二进制格式
200 Switching to Binary mode.
[root@hai6 ~]$vim /etc/vsftpd/vsftpd.conf/
listen=NO <==默认为独立方式,no为非独立方式
[root@hai6 ~]$vim /etc/xinetd.d/vsftpd
service ftp
{
flags = REUSE
socket_type= stream
wait = no
user = root
server = /usr/sbin/vsftpd <==主进程的路径
log_on_failure+= USERID
disable = no
}
[root@hai7-7 pub]$ldd `which vsftpd`
libssl.so.10 => /lib64/libssl.so.10 (0x00007f7085820000) <==ssl加密模块
[root@hai7-7 ~]$cd /etc/pki/tls/certs/
[root@hai7-7 ~]$make vsftpd.pem
[root@hai7-7 ~]$vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES <==启用SSL
allow_anon_ssl=NO <==匿名不支持SSL
force_local_logins_ssl=YES <==本地用户登录加密
force_local_data_ssl=YES <==本地用户数据传输加密
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem <==证书文件路径
帐号在服务器系统中不存在的,仅供FTP传输服务做验证使用,因此即便骇客破解出了帐号口令密码后也无法登录到服务器主机上面,有效的降低了破坏范围和影响
虚拟用户帐号的存储方式:
db_load -T -t hash -f vusers.txt vusers.db
实现基于文件验证的vsftpd虚拟用户
[root@hai7-7 ~]$vim /etc/vsftpd/vusers.txt
v1 <==奇数行为用户名
v1pass <==偶数行为用户密码
v5
v5pass
[root@hai7-7 ~]$cd /etc/vsftpd/
[root@hai7-7 vsftpd]$db_load -T -t hash -f vusers.txt vusers.db
[root@hai7-7 vsftpd]$chmod 600 vusers*
1. '创建账号'
[root@hai7-7 ~]$useradd -s /sbin/nologin vftpuser
2. '修改家目录权限,不能具有写权限'
[root@hai7-7 vsftpd]$ll /home
drwx------ 3 vftpuser vftpuser 78 Oct 27 16:41 vftpuser <==目录有写权限,会导致映射账户无法登录
'去掉目录写权限'
[root@hai7-7 ~]$chmod 555 /home/vftpuser/
3. '在目录下建立目录,让其具有写权限,方便虚拟用户上传文件'
[root@hai7-7 vftpuser]$mkdir upload
[root@hai7-7 vftpuser]$chown vftpuser upload/
[root@hai7-7 ~]$vim /etc/vsftpd/vsftpd.conf
auth required pam_userdb.so db=/etc/vsftpd/vusers <==虚拟账户文件,不需要后缀,可以识别
account required pam_userdb.so db=/etc/vsftpd/vusers
[root@hai7-7 ~]$vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.db <==调用模块
guest_enable=YES
guest_username=vftpuser <==映射虚拟账号
如果系统启用SELinux设置:增加如下操作setsebool -P ftpd_full_access1
1. '创建配置文件存放的路径vusers.d(自定义)'
[root@hai7-7 ~]$mkdir /etc/vsftpd/vusers.d/
2. '达成各虚拟用户有自己的目录,为其分别建立目录,在目录下放置测试文件'
[root@hai7-7 ~]$mkdir /data/ftp{1,5}
[root@hai7-7 ~]$touch /data/ftp1/ftp1.txt
[root@hai7-7 ~]$touch /data/ftp5/ftp5.txt
3. '进入目录vusers.d,为虚拟账户设置权限',
[root@hai7-7 vusers.d]$cat v1 <==文件名与用户名相同
anon_mkdir_write_enable=YES <==允许匿名账户建立目录
anon_upload_enable=YES <==运行匿名账户上传文件
ocal_root=/data/ftp1 <==禁锢用户只能在主机的家目录中
[root@hai7-7 vusers.d]$cat v5
ocal_root=/data/ftp5 <==禁锢用户只能在主机的家目录中
4. '修改FTP配置文件,告知FTP服务器此目录作用'
[root@hai7-7 ~]$vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/ <==表示在此目录下放置各用户的独立配置,以用户名命名
1. 'FTP服务包及相关开发包'
[root@hai7-7 ~]$yum -y install vsftpd mariadb-devel pam-devel
2. '开发包组,编译pam模块用'
[root@hai7-7 ~]$yum -y groupinstall "Development Tools"
[root@hai7-7 data]$tar xvf pam_mysql-0.7RC1.tar.gz
进入目录,可以参考INSTALL
文件说明,运行脚本configure
1. '运行configure脚本'
[root@hai7-7 ~]$./configure --with-pam-mods-dir=/lib64/security --with-mysql=/usr --with-pam=/usr
2. '构造和安装'
[root@hai7-7 pam_mysql-0.7RC1]$make && make install
3. '安装完成后会在/lib64/security生成新的模块pam_mysql.so'
[root@hai7-7 ~]$cd /lib64/security
pam_mysql.so
[root@hai7-7 pam.d]$vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=centos host=192.168.50.110 db=ftpdb table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=centos host=192.168.50.110 db=ftpdb table=users usercolumn=name passwdcolumn=password crypt=2
'配置字段说明'
•auth:表示认证
•account :验证账号密码正常使用
•required :表示认证要通过
•pam_mysql.so:模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
•user=vsftpd:为登录mysql的用户
•passwd=magedu:登录mysql的的密码
•host=mysqlservermysql:服务器的主机名或ip地址
•db=vsftpd:指定连接msyql的数据库名称
•table=users :指定连接数据库中的表名
•usercolumn=name :当做用户名的字段
•passwdcolumn=password :当做用户名字段的密码
•crypt=2 :密码的加密方式为mysqlpassword()函数加密
[root@hai7-7 pam.d]$vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql <==调用模块
guest_enable=YES
guest_username=vftpuser <==映射虚拟账号使用的系统账户
[root@hai7-7 ~]$yum -y install mariadb-server
[root@hai7-8 ~]$mysql
'建立数据库ftpdb'
MariaDB [(none)]> CREATE DATABASE ftpdb ;
'授权账户,并设置密码'
MariaDB [(none)]> GRANT SELECT ON ftpdb.* TO vsftpd@'192.168.50.97' IDENTIFIED BY 'centos';
'创建表'
MariaDB [(none)]> use ftpdb <==进入数据库
MariaDB [ftpdb]> CREATE TABLE users (
-> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> name CHAR(50) BINARY NOT NULL, <==用于FTP的表必须有name和password两行,BINARY表示大小写敏感
-> password CHAR(48) BINARY NOT NULL
-> );
'在表内添加虚拟用户信息password()是加密函数'
MariaDB [ftpdb]> INSERT INTO users(name,password) VALUES('wang',password('centos'));
MariaDB [ftpdb]> INSERT INTO users(name,password) VALUES('v9',password('centos'));
1. '创建配置文件存放的路径vusers.d(自定义)'
[root@hai7-7 ~]$mkdir /etc/vsftpd/vusers.d/
2. '达成各虚拟用户有自己的目录,为其分别建立目录,在目录下放置测试文件'
[root@hai7-7 ~]$mkdir /data/ftp{1,5}
[root@hai7-7 ~]$touch /data/ftp1/ftp1.txt
[root@hai7-7 ~]$touch /data/ftp5/ftp5.txt
3. '进入目录vusers.d,为虚拟账户设置权限',
[root@hai7-7 vusers.d]$cat v1 <==文件名与用户名相同
anon_mkdir_write_enable=YES <==允许匿名账户建立目录
anon_upload_enable=YES <==运行匿名账户上传文件
ocal_root=/data/ftp1 <==禁锢用户只能在主机的家目录中
[root@hai7-7 vusers.d]$cat v5
ocal_root=/data/ftp5 <==禁锢用户只能在主机的家目录中
4. '修改FTP配置文件,告知FTP服务器此目录作用'
[root@hai7-7 ~]$vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/ <==表示在此目录下放置各用户的独立配置,以用户名命名