FTP、SFTP搭建
FTP服务
软件安装包: vsftpd
协议接口: 5021/tcp(默认21)
被动模式数据传输端口5021-5022(默认高位随机端口)
服务配置文件: /etc/vsftpd/vsftpd.conf
报错id的解析:
500 ##文件系统权限过大
530 ##用户认证失败
550 ##服务本身功能未开放
553 ##文件权过小
FTP(File Transfer Protocol),是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,
它也是一个应用程序(Application),用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,
访问服务器上的大量程序和信息。
FTP的主要功能是实现各种操作系统之间的文件交流,建立一个统一的文件传输协议。
ftp:// ##文件传输协议
vsftpd ##FTP服务器包
安装包
服务端: vsftd
客户端: lftp
服务端部署ftp服务
yum install -y vsftpd
systemctl enable vsftpd
添加防火墙策略
##添加防火墙策略,让火墙允许ftp服务; --permanent表示永久添加
firewall-cmd --zone=public --add-port=5021-5023/tcp --permanent
Success
##重新加载;必须执行,否则不生效
firewall-cmd --reload
success
firewall-cmd --list-all
关闭selinux
##查看selinux的状态
getenforce Enforcing
vim /etc/sysconfig/selinux
SELINUX=disabled
reboot
修改vsftpd.conf
vi /etc/vsftpd/vsftpd.conf
#不允许匿名
anonymous_enable=NO
#禁止匿名用户上传
anon_upload_enable=NO
#禁止匿名用户建立目录
anon_mkdir_write_enable=NO
local_enable=YES
anon_umask=022
#可以进行写的操作
write_enable=YES
#设定上传文件的权限掩码
local_umask=022
# 设定开启目录标语功能
dirmessage_enable=YES
# 设定开启日志记录功能
xferlog_enable=YES
#设定日志使用标准的记录格式
xferlog_std_format=YES
#设定vsftpd服务工作在standalone模式下
listen=YES
#设定pam服务下的vsftpd验证配置文件名。因此,PAM验证将参考/etc/pam.d/下的vsftpd文件配置。
pam_service_name=vsftpd
#仅允许user_list中的用户登录
userlist_enable=YES
userlist_deny=NO
#设定支持TCPwrappers
tcp_wrappers=YES
#启用虚拟用户功能
guest_enable=YES
#指定虚拟的宿主用户
guest_username=virtusers
#所有用户限制在其主目录下
chroot_local_user=YES
allow_writeable_chroot=YES
#虚拟用户配置文件路径
user_config_dir=/etc/vsftpd/vconf
use_localtime=NO
dual_log_enable=YES
#设定空闲链接超时时间,这里使用默认/秒
idle_session_timeout=600
#设定最大连接传输时间,这里使用默认,将具体数值留给每个用户具体制定,默认120/秒
data_connection_timeout=3600
#设定禁止上传文件更改宿主
chown_uploads=NO
#服务日志保存路径
xferlog_file=/var/log/vsftpd.log
#vsftpd服务的宿主用户
nopriv_user=vsftpd
#设置vsftpd的登陆标语
ftpd_banner=hello
#禁止用户登出自己的ftp主目录
chroot_list_enable=NO
#禁止用户登陆ftp后使用ls -R 命令。该命令会对服务器性能造成巨大开销,如果该项运行当多个用户使用该命令会对服务器造成威胁。
ls_recurse_enable=NO
#监听端口
port_enable=YES
listen_port=5021
#被动模式开启
pasv_enable=YES
#数据传输使用端口范围的最大值
pasv_max_port=5023
#数据传输使用端口范围的最小值
pasv_min_port=5022
#允许ip地址修改
pasv_addr_resolve=YES
#pasv模式,服务器会返回一个6位的地址和端口(公网访问需要填写公网ip,否则默认返回内网地址)
pasv_address=XX.XX.XX.XX
#启用TLS加密
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/.ssl/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.ssl/vsftpd.key
证书生成(企业部署使用企业证书)
mkdir -p /etc/vsftpd/.ssl
chmod -R 400 /etc/vsftpd/.ssl
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/vsftpd/.ssl/vsftpd.key -out /etc/vsftpd/.ssl/vsftpd.pem
创建宿主用户和虚拟宿主用户
useradd vsftpd -d /home/vsftpd -s /sbin/nologin
useradd virtusers -d /home/virtusers -s /sbin/nologin
建立虚拟用户配置文件的存放路径
mkdir -p /etc/vsftpd/vconf
建立一个虚拟用户名单文件,用来记录虚拟用户的账号和密码,格式为:一行用户名,一行密码。搭建好后用来登录的账号
vim /etc/vsftpd/user
vsftpuser01
passwd01
vsftpuser02
passwd02
vsftpuser03
passwd03
vsftpuser04
passwd04
生成虚拟用户数据文件
db_load -T -t hash -f /etc/vsftpd/user /etc/vsftpd/user.db
设置PAM验证文件,并制定虚拟用户数据库文件进行读取
[root@vm01 root]#cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.backup
[root@vm01 root]#vim /etc/pam.d/vsftpd
#%PAM-1.0
auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/user
account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/user
虚拟用户的配置
[root@vm01 vconf]# vim /etc/vsftpd/vconf/vsftpuser01
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
chroot_local_user=YES
##手动将所有虚拟用户根目录锁定在此目录,如果不指定,默认也是本地映射用户宿主目录##
local_root=/home/virtusers/vsftpuser01
idle_session_timeout=600
data_connection_timeout=3600
建立虚拟用户的仓库目录并更改相应属主/组且赋予相应权限
mkdir -p /home/virtusers/vsftpuser01
chown virtusers:virtusers /home/virtusers/vsftpuser01
chmod 755 /home/virtusers/vsftpuser01
启动服务
systemctl start vsftpd
若是提示权限问题,检测配置文件无误后执行:setsebool -P ftp_home_dir=1
客户端部署
yum -y install lftp
连接命令:
lftp 172.25.254.234:4521 -u vsftpuser01
基本命令使用
##本地用户登陆
[kiosk@foundation34 ~]$ lftp 172.25.254.234 -u westos
Password:
lftp westos@172.25.254.234:~> ls
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile1
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile2
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile3
##上传文件
lftp westos@172.25.254.234:~> put /etc/passwd
3190 bytes transferred
lftp westos@172.25.254.234:~> ls
-rw-r--r-- 1 1001 1001 3190 Oct 31 15:19 passwd
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile1
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile2
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile3
##删除文件
lftp westos@172.25.254.234:~> rm passwd
rm ok, `passwd' removed
lftp westos@172.25.254.234:~> ls
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile1
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile2
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile3
##新建目录
lftp westos@172.25.254.234:~> mkdir hello
mkdir ok, `hello' created
lftp westos@172.25.254.234:~> ls
drwxr-xr-x 2 1001 1001 6 Oct 31 15:20 hello
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile1
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile2
-rw-r--r-- 1 0 0 0 Oct 31 15:18 westosfile3
##但不能用使用touch命令 因为ftp服务界面并非支持所有shell中的所有命令
lftp westos@172.25.254.234:~> touch file
Unknown command `touch'.
lftp westos@172.25.254.234:~> exit
连接后使用命令错误提示
Fatal error: Certificate verification: Not trusted
解决办法:
临时解决
直接在lftp命令提示符下输入:set ssl:verify-certificate no 回车
永久生效:
编辑/etc/lftp.conf,加入下面内容:
set ssl:verify-certificate no
SFTP服务
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多
本次使用系统自带的internal-sftp搭建sftp,因为需要用到chroot,所以openssh 版本不能低于4.8p1
ssh -V检查版本
要创建的sftp用户和组
user: BigData1 BigData2
groups:sftpusers
创建组
groupadd sftpusers
创建用户
useradd -g sftpusers -s /sbin/nologin BigData1
useradd -g sftpusers -s /sbin/nologin BigData2
修改密码
passwd BigData1
passwd BigData2
创建目录
mkdir -p home/Sftp/BigData2FTP
mkdir -p home/Sftp/BigData1FTP
修改属主和属主(该目录为sftp用户的home目录,属主必须为root,权限最高为755)
chown root:root BigData2FTP
chown root:root BigData1FTP
修改权限
chmod 755 /home/Sftp/BigData2FTP
chmod 755 /home/Sftp/BigData1FTP
创建文件传输目录
mkdir /home/Sftp/BigData2FTP/BigData2
mkdir /home/Sftp/BigData1FTP/BigData1
更改权限(此目录权限随意)
chmod 777 /home/Sftp/BigData2FTP/BigData2
chmod 777 /home/Sftp/BigData2FTP/BigData1
修改home目录
usermod -d /home/Sftp/BigData2FTP BigData2
usermod -d /home/Sftp/BigData1FTP/ BigData1
修改配置文件
vim /etc/ssh/sshd_config
注释
#Subsystem sftp /usr/libexec/openssh/sftp-server
添加
Subsystem sftp internal-sftp
Match Group sftpusers
ChrootDirectory %p
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
重启sshd服务
systemctl restart sshd.service
登陆测试
sftp BigData2@ip
sftp -oPort=22 BigData1@172.31.50.111
参数说明:
Subsystem sftp internal-sftp:指定使用sftp服务使用系统自带的internal-sftp
Match Group sftp:用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割。
注:当然也可以匹配用户,如:【Match User mysftp】,多个用户名
之间也是用逗号分割。
ChrootDirectory /sftp/%u:用chroot将用户的根目录指定到/sftp/%u,%u代表用户名,这
样用户就只能在/sftp/%u下活动。
ForceCommand internal-sftp:指定sftp命令
更改工作目录权限
chown root:sftp /sftp
chown root:sftp /sftp/tom
chmod 755 /sftp
chmod 755 /sftp/tom
权限说明:
目录的权限设定有两个要点:
1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者,都只能是 root,群组可以是第一步创建的组,这里是sftp
2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止,目录所属的群组都不可以 具有写的权限。
注:读(r,权限值为4)、写(w,权限值为2)、执行(x,权限值为1)。
连接命令
sftp -oPort=22 upload_pat@ip
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/bin:/usr/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
#PermitEmptyPasswords no
# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# and ChallengeResponseAuthentication to 'no'.
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
# problems.
UsePAM yes
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation sandbox
#PermitUserEnvironment no
#Compression delayed
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
# override default of no subsystems
#Subsystem sftp /usr/libexec/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
UseDNS no
AddressFamily inet
SyslogFacility AUTHPRIV
PermitRootLogin yes
PasswordAuthentication yes
##sftp
Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO -f local5
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
ClientAliveInterval 900
ClientAliveCountMax 3
连接后ls提示错误
Fatal error: Certificate verification: Not trusted (94:0C:C5:11:EE:74:05:7E:6C:CD:63:97:4D:A7:DB:F4:58:FE:4A:61)
解决方法
编辑/etc/lftp.conf,加入下面内容:
set ssl:verify-certificate no
或直接在lftp命令提示符下输入:set ssl:verify-certificate no 回车。