网络共享服务FTP

前言

这次主要就谈一些我们生活中常用的ftp服务。
如何搭建ftp服务,并且去管理.

FTP

FTP:文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议。它属于网络传输协议的应用层。基于TCP工作, C/S架构。实现ftp协议的应用有:wu-ftpd、protftpd、vsftpd等。

文件共享

网络文件系统(nfs | cifs)、基于应用层协议(ftp)、基于文件系统同步数据(rstnc|sersync)等都方式都可以实现不同主机间实现文件共享。

FTP协议

FTP协议通信有两个会话:

  1. 命令连接:用于传输客户端发来的命令,连接始终存在,由客户端决定断开。

  2. 数据连接:数据传输连接,传输完毕断开。

FTP协议通信工作的模式:

  1. 主动模式。客户端取一个非特权的端口N去连接服务器ftp服务器21号端口,然后客户端监听N+1号端口,并告知服务器,我的N+1号端口可以连接,然后服务器端用20端口去连接客户端告知的端口,从而建立数据连接。在这种模式下,有一个缺陷,客户端通常会有严格的防火墙规则,有可能会拒绝服务器端的主动请求,从而导致数据传输失败。
  2. 和主动模式一样客户端首选与服务器端建立命令连接,协商使用被动模式,然后服务器端取一个用于数据连接的随机端口返回给客户端,客户端收到服务器端返回的指定端口后,客户端取一个自己的随机端口主动去连接服务器,从而建立数据连接。这种模式下,同时带来一个问题,就是服务器端的随机端口打开同样会对服务器端的安全造成不安全因素,还在,Linux有一种机制:追踪连接机制,可以实现防火墙放行随机端口。
vsftp的安装配置

安装

yum install vsftpd

文件布局

/etc/logrotate.d/vsftpd                 #日志滚动脚本
/etc/pam.d/vsftpd                       #基于pam认证的配置文件
/usr/lib/systemd/system/vsftpd.service  #服务脚本
/etc/vsftpd                             #配置文件目录
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf                 #主配置文件目录
/var/ftp                                #数据文件目录
/var/ftp/pub                            #匿名用户的下载目录

配置

基本配置

#是否启用匿名用户
anonymous_enable=YES
#是否允许本地用户登录
local_enable=YES
#是否对本地用户进行chroot
chroot_local_user=YES
#启用chroot的用户列表或者不chroot的用户列表
chroot_list_enable=YES
#指定定义chroot的用户列表文件
#如果chroot_local_user=NO,则chroot_list中的用户则是chroot的用户列表
chroot_list_file=/etc/vsftpd/chroot_list
#是否允许本地用户上传
write_enable=YES

匿名用户配置

#是否允许匿名用户登录
anonymous_enable=YES
#是否启用匿名用户上传,本地文件系统要开放权限
anon_upload_enable=YES
#是否允许匿名用户删除文件
anon_other_write_enable=YES
#是否允许匿名用户创建目录
anon_mkdir_write_enable=YES

注意:新版本的vsftp,如果限定了chroot的用户,则因为用户对用户家目录不能有写权限,所以无法登录。解决:chmod a-w /home/user_dir_name;上传权限要考虑文件系统权限和服务器配置权限,可以在用户的家目录下创建目录,然后对相应的用户进行授权。

限制登录配置

#此时/vsftpd.user_list文件定义的是拒绝登录的用户名
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
#如果只配置允许特定用户登录,此时/vsftpd.user_list文件定义的是允许登录的特定用户
userlist_deny=YES

xinetd启动方式配置

#复制vsftpd的xinetd配置文件
cp /usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.xinetd /etc/xinetd.d/vsftpd
#修改配置文件为:
# vsftpd is the secure FTP server.
service ftp
{
        disable                 = no
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/vsftpd
        port                    = 21
        protocol                = tcp
        log_on_success          += PID HOST DURATION
        log_on_failure          += HOST
        instances               = 20
}
#修改vdftpd.conf
listen=NO
listen_ipv6=NO

SSL加密传输的ftp配置

#开启SSL加密传输
ssl_enable=YES
#是否允许匿名用户使用ssl
allow_anon_ssl=NO
#是否允许非匿名用户使用ssl传输数据
force_local_data_ssl=YES
#是否允许非匿名用户使用ssl传输密码
force_local_logins_ssl=YES
#ssl版本
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
#证书存放路径
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.pem
#私钥存放路径
rsa_private_key_file=/etc/vsftpd/ssl/private/vsftpd.key
基于MYSQL验证的vsftpd虚拟用户

说明:本实验在两台CentOS主机上实现,一台做为FTP服务 器,一台做数据库服务器
一、安装所需要包和包组:
在数据库服务器上安装包:
Centos7:在数据库服务器上安装

yum –y install mariadb-server 
systemctl start mariadb.service 
systemctl enable mariadb 

Centos6:在数据库服务器上安装

yum –y install mysql-server 

在FTP服务器上安装vsftpd和pam_mysql包
centos6:pam_mysql由epel的源中提供

yum install vsftpd pam_mysql

实现基于MYSQL验证的vsftpd虚拟用户
centos7:无对应rpm包,需手动编译安装

yum -y groupinstall "Development Tools" 
yum -y install mariadb-devel pam-devel vsftpd 

下载pam_mysql-0.7RC1.tar.gz

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 
make 
make install 

二、在数据库服务器上创建虚拟用户账号
1.建立存储虚拟用户数据库和连接的数据库用户

mysql> CREATE DATABASE vsftpd; 
mysql> SHOW DATABASES; 
ftp服务和mysql不在同一主机: 
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'172.16.%.%' IDENTIFIED BY 'magedu'; 
ftp服务和mysql在同一主机: 
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY 'magedu'; 
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'127.0.0.1' IDENTIFIED BY 'magedu'; 
mysql> FLUSH PRIVILEGES;

2.准备相关表

mysql> USE vsftpd; 
Mysql> SHOW TABLES; 
mysql> CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL ); 
mysql>DESC users; 

测试连接

mysql -uvsftpd -h 172.16.200.200 -pmagedu 
mysql> SHOW DATABASES;

3.添加虚拟用户

根据需要添加所需要的用户,为了安全应该使用PASSWORD 函数加密其密码后存储

mysql>DESC users; 
mysql> INSERT INTO users(name,password) values(‘wang',password('magedu')); 
mysql> INSERT INTO users(name,password) values(‘mage',password('magedu')); 
mysql> SELECT * FROM users;

三、在FTP服务器上配置vsftpd服务
1.在FTP服务器上建立pam认证所需文件

vi /etc/pam.d/vsftpd.mysql 添加如下两行 
auth required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 
account required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 

注意:参考README文档,选择正确的加密方式
crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示 使用mysql password()函数加密,3表示md5加密,4表示 sha1加密

配置字段说明 
    auth 表示认证
    account 验证账号密码正常使用 
    required 表示认证要通过 
    pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路 径而言,也可以写绝对路径;后面为给此模块传递的参数 
    user=vsftpd为登录mysql的用户 
    passwd=magedu 登录mysql的的密码 
    host=mysqlserver mysql服务器的主机名或ip地址
    db=vsftpd 指定连接msyql的数据库名称 
    table=users 指定连接数据库中的表名 
    usercolumn=name 当做用户名的字段
    passwdcolumn=password 当做用户名字段的密码 
crypt=2 密码的加密方式为mysql password()函数加密

2.建立相应用户和修改vsftpd配置文件,使其适应mysql认证
建立虚拟用户映射的系统用户及对应的目录

useradd -s /sbin/nologin -d /var/ftproot vuser 
chmod 555 /var/ftproot centos7 需除去ftp根目录的写权限 
mkdir /var/ftproot/{upload,pub} 
setfacl –m u:vuser:rwx /var/ftproot/upload 

确保/etc/vsftpd.conf中已经启用了以下选项

anonymous_enable=YES 

添加下面两项

guest_enable=YES 
guest_username=vuser 

修改下面一项,原系统用户无法登录

pam_service_name=vsftpd.mysql

四、启动vsftpd服务

service vsftpd start;systemctl start vsftpd 
chkconfig vsftpd on;systemctl enable vsftpd 

查看端口开启情况

netstat -tnlp |grep :21 

五、Selinux相关设置:在FTP服务器上执行

restorecon -R /lib64/security 
setsebool -P ftpd_connect_db 1 
setsebool -P ftp_home_dir 1 
chcon -R -t public_content_rw_t /var/ftproot/  

六、测试:利用FTP客户端工具,以虚拟用户登录验证结果

tail /var/log/secure

七、在FTP服务器上配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以 定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用 户的用户名。配置文件目录可以是任意未使用目录,只需要在 vsftpd.conf指定其路径及名称即可

1、配置vsftpd为虚拟用户使用配置文件目录

vim /etc/vsftpd/vsftpd.conf 
    添加如下选项 
    user_config_dir=/etc/vsftpd/vusers_config 

2、创建所需要目录,并为虚拟用户提供配置文件

    mkdir /etc/vsftpd/vusers_config/ 
    cd /etc/vsftpd/vusers_config/ 
    touch wang mage

3、配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关 指令进行的。如果需要让用户wang具有上传文件的权限,可以 修改/etc/vsftpd/vusers_config/wang文件,在里面添加如下 选项并设置为YES即可,只读则设为NO
注意:需确保对应的映射用户对于文件系统有写权限

    anon_upload_enable={YES|NO} 
    anon_mkdir_write_enable={YES|NO} 
    anon_other_write_enable={YES|NO} 
    local_root=/ftproot 登录目录改变至指定的目录

最后

本来是准备把NFS还有SAMBA服务都一起写的,可惜奈何时间真的不太多,只能等以后有机会了…






ღ ღ ღ 如果觉得文章对您有用,不妨赞一下ღ ღ ღ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.kwantler.YN_EW.service.impl; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class FilePhoto { /** * 从网络Url中下载文件 * * @param urlStr * @param fileName * @param savePath * @throws IOException */ public static void downLoadByUrl(String urlStr, String fileName, String savePath) throws IOException { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置超时间为3秒 conn.setConnectTimeout(5 * 1000); // 防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); // 得到输入流 InputStream inputStream = conn.getInputStream(); // 获取自己数组 byte[] getData = readInputStream(inputStream); // 文件保存位置 File saveDir = new File(savePath); if (!saveDir.exists()) { saveDir.mkdir(); } File file = new File(saveDir + File.separator + fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if (fos != null) { fos.close(); } if (inputStream != null) { inputStream.close(); } System.out.println("info:" + url + " download success"); } /** * 从输入流中获取字节数组 * * @param inputStream * @return * @throws IOException */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); } public static void main(String[] args) { try { downLoadByUrl( "https://www.mybiosource.com/images/tds/protocol_samples/MBS700_Antibody_Set_Sandwich_ELISA_Protocol.pdf", "ELISA.pdf", "E:/upload/protocol"); } catch (Exception e) { // TODO: handle exception } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值