主要学习内容
- FTP服务
- NFS服务
- SAMBA服务
一.文件传输协议(ftp)
- File Transfer Protocol 早期的三个应用级协议之一
- 基于C/S结构
- 双通道协议:数据和命令连接
- 数据传输格式:二进制(默认)
(1) FTP的连接模式
客户端和服务器端之间由双套接字通道进行连接,其中第一条链接通道是命令连接通道用来传输指令,并且服务器端口是固定的,端口号21,客户端端口是随机的
第二条通道是数据连接通道,用来实现数据的传输,数据端口是随机的
数据的端口是通过命令连接通道与客户端进行协商,确定出来的端口号
端口计算如图:
(2)FTP的两种模式
被动模式: 客户端主动连接服务器
客户端向服务器端建立命令连接通道,此时客户端打开一个随机端口,服务器端打开21tcp端口
数据端:客户端向数据端建立数据连接通道,数据端通过命令连接通道和客户端协商,为数据端口生成一个随机端口
主动模式:
命令连接方式不变
数据端主动向客户端发送连接请求,建立一个数据通道,并且端口为固定端口20
主动模式与被动模式的切换方式
二.ftp软件介绍
- FTP服务器: Wu-ftpd,Proftpd,Pureftpd,ServU,IIS vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器 高速,稳定,下载速度是WU-FTP的两倍 ftp,redhat.com数据:单机最多可支持15000个并发
- 客户端软件: ftp,lftp,lftpget,wget,curl
ftp -A ftpserver port -A主动模式 –p 被动模式
lftp –u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file
gftp: GUI centos5 最新版2.0.19 (11/30/2008)
filezilla,CuteFtp,FlashFXP,LeapFtp
IE ftp://username:password@ftpserver - 状态码:
1XX:信息
125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录
用户认证:
匿名用户:ftp,anonymous,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件 nsswitch:network service switch名称解析框架
pam:pluggable authentication module 用户认证
/lib64/security /etc/pam.d/ /etc/pam.conf
vsftpd服务
(1)由vsftpd包提供
不再由xinetd管理
用户认证配置文件:/etc/pam.d/vsftpd
服务脚本: /usr/lib/systemd/system/vsftpd.service /etc/rc.d/init.d/vsftpd
配置文件:/etc/vsftpd/vsftpd.conf man 5 vsftpd.conf
格式:option=value
注意:=前后不要有空格
匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
系统用户共享文件位置:用户家目录
虚拟用户共享文件位置:为其映射的系统用户的家目录
(2)相关服务配置
- 命令端口
listen_port=21——该端口为默认设置,也可以手动添加到配置文件中主动模式端口
connect_from_port_20=YES
ftp_data_port=2020——修改新的主动模式端口
vim /etc/vsftp/vsftp.conf
重启服务systemctl restart vsftpd
- 被动模式端口范围
在linux客户端默认使用被动模式
windows客户端使用主动模式
pasv_min_port=6000
pasv_max_port=6010
手动加入配置文件中- 使用当地时间
use_localtime=YES 使用当地时间(默认时间为NO,使用GMT时间)
如果是本地时间,不要改变,或改为NO
如果是别的时区,要改为YES有关匿名用户的设置
no_anon_password=YES
anon_upload_enable=YES——去掉注释生效
注意:匿名账号不能有写权限,如果有写权限,则无法登录
mkdir /var/ftp/upload——创建一个子目录
setfacl -m u:ftp:rwx /var/ftp/upload
去掉注释后此时可以进行上传
anon_mkdir_write_enable=YES——去掉注释可以创建子目录或是文件
- anon_world_readable_only ——默认是yes,不需要写入,代表只有所有人都有读权限才可以下载
如果在/var/ftp/upload中,并不是所有人都有读权限的话,无法进行下载anon_other_write_enable=YES 可删除和修改上传的文件
将上述内容写入配置文件中,不写默认是无法删除和修改上传的文件
写入配置文件后,重启服务即可生效
- anon_umask=077 指定匿名上传umask
将umask值改为022就可以实现匿名上传和下载功能——文件权限为644指定上传文件的默认的所有者和权限
chown_uploads=YES(默认NO)
chown_username=who ——修改所有者
chown_upload_mode=0644——写入配置文件中
(3)linux系统用户设置
在默认情况下是可以以系统用户的身份进行进行登录
即使将系统用户的shell类型改变依然可以进行登录
guest_enable=YES——所有系统用户都映射到guest中,并且和guest_username=who配合使用,一起生效
这样所有系统用户都被映射成who的身份
注意权限问题,要去掉who的家目录的写权限 chmod 555 /home/who,这样做可以使其他用户的权限受到限制,使系统更安全
设置映射后效果
- local_enable=YES——改为no后linux系统用户无法登录
- wirte_enable=YES——改为no后也无法上传文件
local_root=/app—指定非匿名用户登录时所在的家目录
chroot_local_user=YES——禁锢所有系统用户在家目录中
chmod u-w /home/zhangnan
- chroot_list_enable=YES
- chroot_list_file=/etc/vsftpd/chroot_list
以上两个命令实现对特定用户的禁锢
mkdir /etc/vsftpd/chroot_list——在该文件中加入要禁锢的系统用户
chroot_list_enable=YES——如果yes改为no,则加入列表的用户会被禁锢,如果是yes,则加入的用户为白名单不会被禁锢
(4)有关ftp的日志设置
- wu-ftp日志:默认启用
xferlog_enable=YES (默认)启用记录上传下载日志
xferlog_std_format=YES (默认)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默认)可自动生成
vsftpd日志:默认不启用
dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log(默认)可自动生成
(5)登录提示信息
ftpd_banner=“welcome to upload server"
banner_file=/etc/vsftpd/ftpbanner.txt 优先上面项生效 ——将登录信息写入该文件中
cp /etc/issue /etc/vsftpd/ftp.txt
目录访问提示信息 dirmessage_enable=YES (默认)
cd /var/ftp/pub
mkdir .message
echo 'profile ok ' > .message——为了效果明显可以加入颜色来显示
vim .message
ctrl+v[[35m 'profile ok'ctrl+v[[0m——进入vim编辑模式后,执行ctrl+v[的命令
message_file=.message(默认)
信息存放在指定目录下.messag
(6)使用pam完成用户认证
使用pam(Pluggable Authentication Modules)完成用户认证
pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers 默认文件中用户拒绝登录
如果在/etc/pam.d/vsftpd将deny改为allow,那么在名单中的用户为可登陆的,不在名单中的为不可登陆的
是否启用控制用户登录的列表文件
userlist_enable=YES 默认有此设置
userlist_deny=YES(默认值)黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/users_list 此为默认值
(7) 配置FTP服务以非独立服务方运行
listen=NO,默认为独立方式
cat /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
重启vsftpd服务后 service xinetd start 实现非独立控制
三.实现基于文件验证的vsftpd虚拟用户
虚拟用户: 所有虚拟用户会统一映射为一个指定的系统帐号:
访问共享位 置,即为此系统帐号的家目录
各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控 制参数进行指定
虚拟用户帐号的存储方式:
文件:编辑文本文件,此文件需要被编码为hash格式
奇数行为用户名,偶数行为密码
db_load -T -t hash -f vusers.txt vusers.db
关系型数据库中的表中:
实时查询数据库完成用户认证
mysql库:pam要依赖于pam-mysql /lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
实验步骤
1 还原配置文件 cp /etc/vsftpd/vsftp.conf.bak vsftpd.conf
2 创建用户数据库文件
vim /etc/vsftpd/ftpvusers
ftp1
centos
ftp2
magedu
3 cd /etc/vsftpd
db_load -T -t hash -f ftpvusers ftpvusers.db
chmod 600 ftpvusers.db
4创建用户和访问FTP目录
useradd -d /var/ftpsite -s /sbin/nologin ftpvuser
chmod 555 /var/ftpsite
mkdir /var/ftpsite/upload
chown ftpvuser /var/ftpsite/upload
5创建pam配置文件
vim /etc/pam.d/vsftpd.vuser
auth required pam_userdb.so db=/etc/vsftpd/ftpvusers
account required pam_userdb.so db=/etc/vsftpd/ftpvusers
6指定pam配置文件
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.vuser
guest_enable=YES
guest_username=ftpvuser
user_config_dir=/etc/vsftpd/ftpvusers.conf.d/
7
建立虚拟用户各自的配置文件
mkdir /etc/vsftpd/ftpvusers.conf.d/
cd /etc/vsftpd/ftpvusers.conf.d/
vim /etc/vsftpd/ftpvusers.conf.d/ftp1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
vim /etc/vsftpd/ftpvusers.conf.d/ftp2
local_root=/app/ftp2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
8
准备ftp2的目录
mkdir -p /app/ftp2/upload
chown ftpvuser /app/ftp2/upload
9
测试
四.实现基于MYSQL验证的VSFTP虚拟用户
1 首先准备配置环境,两台centos主机,一个作为ftp服务器,一个作为mysql服务器
2 在ftp服务器上。yum install mariadb-server vsftpd mariadb-devel pam-devel openssl-devel mariadb
3 (主机是centos7)编译安装pam_mysql 在ftp服务器上
tar xvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
ls /lib64/security/pam_mysql.so
make && make install
4 在mysql 服务器,准备用户和数据表
yum install mariadb-server
systemctl start mariadb
mysql
create database ftpdb;
create table ftpvusers (id int unsigned auto_increment primary key,username char(30),password char(48));
insert ftpvusers (username,password) values ('ftpuser1',password('centos')),('ftpuser2',password('centos'));
insert ftpvusers (username,password) values ('ftpuser2',password('centos')),('ftpuser2',password('centos'));
grant all on ftpdb.* to ftpuser@'192.168.25.107' identified by 'centos';
flush privileges;
5 在ftp服务器,创建PAM配置文件
vim /etc/pam.d/ftp.mysql
auth required pam_mysql.so user=ftpuser passwd=centos host=192.168.25.108 db=ftpdb table=ftpvusers usercolumn=username passwdcolumn=password crypt=2
account required pam_mysql.so user=ftpuser passwd=centos host=192.168.25.108 db=ftpdb table=ftpvusers usercolumn=username passwdcolumn=password crypt=2
6 修改vsftpd配置文件
vim /etc/vsftpd/vsftpd.conf
pam_service_name=ftp.mysql
guest_enable=YES
guest_username=ftpvuser
user_config_dir=/etc/vsftpd/vusers.conf.d/
7创建dir目录
mkdir /etc/vsftpd/vusers.conf.d/
vim /etc/vsftpd/vusers.conf.d/ftpuser1
anon_upload_enable=YES
vim /etc/vsftpd/vusers.conf.d/ftpuser2
local_root=/app/ftpsite2/
anon_upload_enable=YES
mkdir -pv /app/ftpsite2/upload
chown ftpvuser /app/ftpsite2/upload