Linux下FTP和sftp的配置和使用

3,695 阅读10分钟

Linux下FTP和sftp的配置和使用

一、SFTP配置

1、创建FTP专用用户组

# 创建ftp专用用户组
groupadd sftp

2、创建目录

​ 使用root用户登陆linux系统、创建sftp服务用户组,创建conlinsftp服务根目录 groupadd sftp #此目录及上级目录的所有者(owner)必须为root,权限不高于755,此目录的组最好设定为sftp

mkdir /home/testftp  
chmod -R  755  /home/01-FTP/testftp/  

3、sshd_config配置修改

备份原sshd配置文件然后编辑

mkdir /etc/ssh/bak  
cp  /etc/ssh/sshd_config /etc/ssh/bak/sshd_config_bak  
vim /etc/ssh/sshd_config 

注释掉sshd_config 配置文件中如下的行,在前面加#

Subsystem sftp /usr/libexec/openssh/sftp-server  

sshd_config 配置文件末尾添加如下内容,添加完成后保存退出。

Subsystem sftp internal-sftp

# 方法一限制组(推荐)
Match Group sftp
# 方法二限制用户
#Match User clftp

# 方法一自动限制到用户目录
#ChrootDirectory /home/01-FTP/%u
# 方法二直接限制到指定目录(推荐)
ChrootDirectory /home/01-FTP/

X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

#如下为推荐配置
vim /etc/ssh/sshd_config
Port 35021
Subsystem sftp internal-sftp
Match Group sftpadmins,sftpusers
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
 
 
#说明1: ChrootDirectory %h ,表示用户通过sftp登录后就把根目录切换到它自己的家目录
#说明2: 以上为经过修改的配置
 
#sftp -oPort=35021 admin@192.168.56.23
#输入密码进行登录

www.cnblogs.com/regit/p/848…

4、创建专用目录

(创建conlinsftp的家目录:01-FTP目录的所有者必须是root,权限不高于755)

# 创建上传下载专用目录
mkdir /home/01-FTP/testftp/  
# 更改拥有者
chown  root:sftp /home/01-FTP/testftp 
# 更改权限
chmod 755 /home/01-FTP/testftp #拥有者可以读写执行,组用户和其他用户只可读,只需要下载配置,目录配置该权限
chmod 775 /home/01-FTP/testftp #拥有者和组用户可以读写执行,他用户只可读,组用户需要上传下载,目录配置该权限
# 创建用户,指定组sftp,指定目录。
useradd -g sftp -d /home/01-FTP/testftp -s /sbin/nologin clftp

5、根据账号配置(根据需要选择)

创建专用目录和账号 #添加用户 使用参数 -s/sbin/nologin禁止用户通过命令行登录 (# 方法一自动限制到用户目录 #ChrootDirectory /home/01-FTP/%u )

mkdir /home/01-FTP/clftp
chown root:sftp /home/01-FTP/clftp
chmod 0755 /home/01-FTP/clftp # 仅目录拥有者可读写,其他只可读
chmod 0775 /home/01-FTP/clftp # 仅目录拥有者和拥有组可读写,其他只可读
# 创建用户
useradd -g sftp -d /home/01-FTP/clftp -s /sbin/nologin clftp01

# 也可以单独创建上传下载目录
mkdir /home/01-FTP/clftp/upload  
chown -R clftp:sftp /home/01-FTP/clftp/upload 
/VSFT

6、 重启服务使配置生效

 # 老版本的系统没有是用systemctl进行管理服务,需要执行如下命令
 service sshd  restart
 # 新版本执行如下命令
 systemctl restart sshd.service

二、vsftpd(FTP配置)

配置之后使用ftp方式登陆可以实现限制,但是sftp登陆方式没有限制到

1、安装Vsftpd

一般都是默认安装,如果是精简版没有则进行安装。

yum 安装 vsftpd,并开启程序

# 安装
yum install vsftpd
# 开启
systemctl start vsftpd

2、配置详解

vsftpd 的配置文件在为 vsftpd.conf,一般在 /etc/vsftpd/ 目录下。

属性属性值含义
anonymous_enableYES/NO是否允许匿名用户(anonymous)登录 FTP,如果该设置被注释,则默认允许
local_enableYES/NO是否允许本地系统用户登录
write_enableYES/NO是否开启任何形式的 FTP 写入命令,上传文件
local_umaskxxx本地用户的 umask 设置,如果注释该设置则默认为 077,但一般都设置成 022
anon_upload_enableYES/NO是否允许匿名用户上传文件,如果要设置为允许,则需要先开启 write_enable,否则无效,此外对应目录还要具有写权限
anon_mkdir_write_enableYES/NO是否允许匿名用户创建新目录
dirmessage_enableYES/NO当进入某个目录时,发送信息提示给远程用户
xferlog_enableYES/NO是否开启 上传/下载 的日志记录
connect_from_port_20YES/NO是否使用 20 端口来连接 FTP
chown_uploadsYES/NO匿名上传的文件是否由某一指定用户 chown_username 所有
chown_username有效用户名匿名上传的文件由该设定用户所有
xferlog_file有效路径设置日志文件的保存位置,默认为 /var/log/xferlog
xferlog_std_formatYES/NO是否使用标准的 ftpd xferlog日志格式,该格式日志默认保存在 /var/log/xferlog
idle_session_timeout数值设置空闲连接的超时时间,单位 秒
data_connection_timeout数值设置等待数据传输的最大时间,单位 秒(data_connection_timeout 与 idle_session_timeout 在同一时间只有一个有效)
nopriv_user有效用户名指定一个非特权用户,用于运行 vsftpd
async_abor_enableYES/NO是否支持异步 ABOR 请求
ascii_upload_enableYES/NO是否开启 ASCII 模式进行文件上传,一般不开启
ascii_download_enableYES/NO是否开启 ASCII 模式进行文件下载,一般不开启
ftpd_banner自定义登录标语
deny_email_enableYES/NO如果匿名登录,则会要求输入 email 地址,如果不希望一些 email 地址具有登录权限,则可以开启此项,并在 banned_email_file 指定的文件中写入对应的 email 地址
banned_email_file有效文件当开启 deny_email_enable 时,需要通过此项指定一个保存登录无效 email 的文件
chroot_local_userYES/NO是否将所有用户限制在主目录,当为 NO 时, FTP 用户可以切换到其他目录
chroot_list_enableYES/NO是否启用限制用户的名单列表
chroot_list_file有效文件用户列表,其作用与 chroot_local_user 和 chroot_local_user 的组合有关,详见下表
allow_writeable_chrootYES/NO是否允许用户对 ftp 根目录具有写权限,如果设置成不允许而目录实际上却具备写权限,则会报错
ls_recurse_enableYES/NO是否允许 ls -R 指令来递归查询,递归查询比较耗资源
listenYES/NO如果为 YES,vsftpd 将以独立模式运行并监听 IPv4 的套接字,处理相关连接请求(该指令不能与 listen_ipv6 一起使用)
listen_ipv6YES/NO是否允许监听 IPv6 套接字
pam_service_name设置 PAM 外挂模块提供的认证服务所使用的配置文件名 ,即 /etc/pam.d/vsftpd 文件,此文件中 file=/etc/vsftpd/ftpusers 字段,说明了 PAM 模块能抵挡的帐号内容来自文件 /etc/vsftpd/ftpusers 中
userlist_enableYES/NO是否启用 user_list 文件来控制用户登录
userlist_denyYES/NO是否拒绝 user_list 中的用户登录,此属性设置需在 userlist_enable = YES 时才有效
tcp_wrappersYES/NO是否使用 tcp_wrappers 作为主机访问控制方式
max_clients数值同一时间允许的最大连接数
max_per_ip数值同一个IP客户端连接的最大值
local_root有效目录系统用户登录后的根目录
anon_root有效目录匿名用户登录后的根目录
user_config_dir有效目录用户单独配置文件存放目录,该目录下用户的文件名就是对应用户名

`

chroot_local_userchroot_local_user 组合功能如下:

chroot_local_user=YESchroot_local_user=NO
chroot_list_enable=YES1.所有用户都被限制在其主目录下 2.使用 chroot_list_file 指定的用户列表 /etc/vsftpd/chroot_list,这些用户作为“例外”,不受限制1.所有用户都不被限制其主目录下 2.使用 chroot_list_file 指定的用户列表 /etc/vsftpd/chroot_list,这些用户作为“例外”,受到限制
chroot_list_enable=NO1.所有用户都被限制在其主目录下 2.不使用 chroot_list_file 指定的用户列表 /etc/vsftpd/chroot_list,没有任何“例外”用户1.所有用户都不被限制其主目录下 2.不使用 chroot_list_file 指定的用户列表 /etc/vsftpd/chroot_list,没有任何“例外”用户

3、为每个系统用户配置各自的 ftp 根目录

/etc/vsftpd/vsftpd.conf 文件末尾添加如下指令:

# 系统用户登录后的根目录
local_root=/home/01-FTP/conlinftp/
# 匿名用户登录后的根目录
anon_root=/home/01-FTP/conlinftp/
# 设置用户独立配置文件保存目录
user_config_dir=/etc/vsftpd/userconfig/

此外,还要将 chroot_local_user 设置为 YES,使 FTP 用户登录后直接被锁定在自己的根目录上。 通过以上设定,系统用户和匿名用户都会将 /var/test/ 当做根目录,并且登录后直接被锁定在该目录。 但是以上的设置是针对所有系统用户和匿名用户的,如果想要给每个 FTP 用户指定根目录,我们可以给每个用户创建一个对应的配置文件。具体操作如下:

  • 根据 user_config_dir 的设置,我们先在 /etc/vsftpd/ 目录下创建一个名为 userconfig 的目录
  • 假设想要给用户 clftp 单独指定一个 FTP 根目录 /home/01-FTP/conlinftp/,我们需要进入 userconfig 目录,在该目录下创建一个名为clftp的配置文件,编辑文件 clftp,配置内容如下:
local_root=/home/01-FTP/conlinftp/

4、centos下vsftpd登录后无法看见文件,无法创建文件及文件夹

centos下vsftpd不能显示文件,不能创建文件及文件夹 这是由于selinux的机制

#运行如下命令查看:
getsebool -a|grep ftp 

#显示如下
allow_ftpd_anon_write --> on  
allow_ftpd_full_access --> on //创建文件及文件夹 
allow_ftpd_use_cifs --> off 
allow_ftpd_use_nfs --> off 
ftp_home_dir --> on //显示文件夹及文件 
ftpd_connect_db --> off 
ftpd_use_passive_mode --> off 
httpd_enable_ftp_server --> off 
tftp_anon_write --> on 


#用如下命令把以上信息设为ON
setsebool allow_ftpd_full_access=1 
# 永久生效
setsebool -P allow_ftpd_full_access on 

5、出现登陆失败

1、首先检查账号密码等设置,如果都正确那么

# 1.如果一直出现ftp登陆时报错,530 Login incorrect.Login failed.
# 2.请先看看百度前三种问题是否能解决,我这是第四种,因为我没有在百度上找到我着一种。
# 3.cat /etc/passwd,查看你登陆的账户主目录和登陆shell对应的是什么,我的是/sbin/nologin
# 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
# 4.查看cat /etc/shells是否有你用户的主目录和登陆shell,没有进行添加,保存,退出。
vim /etc/shells
# 5、添加/sbin/nologin,保存退出
cat /etc/shells
# 结果如下
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
/bin/ksh
/bin/rksh
/sbin/nologin

#6、最简单的方式直接执行下面的命令即可
echo -e "\n/sbin/nologin" >> /etc/shells

6、用户/用户组操作

移除组: 例如:用户abc属于bcd和check两个组,需要将abc用户从bcd组中移除:

usermod -G check abc

将一个用户添加到用户组中,千万不能直接用:

usermod -G groupA

这样做会使你离开其他用户组,仅仅做为 这个用户组 groupA 的成员。 应该用 加上 -a 选项:

usermod -a -G groupA user

用户删除

userdel -r clftp02

三、虚拟用户配置

该配置为了使多个用户操作同一个目录,例如admiftp用户目录 01-FTP所有的权限,clftp只可以下载读取

四、连接和使用

1、命令行

使用cmd/bash命令行方式

  1. sftp常用命令
ls  #查看当前目录下文件

help  #查看sftp支持哪些命令

cd  #指定目录

pwd  #查看当前目录

get xxx.txt  #下载xxx文件

put xxx.txt  #上传xxx文件

quit / bye / exit  #退出sftp

sftp  xxx.xxx.xxx.xxx   #登录root用户

sftp zygf@xxx.xxx.xxx.xxx   #进行登录zygf用户
  1. sftp命令行登录s使用过程

    ① sftp xxx.xxx.xxx.xxx 登录(默认root用户),若指定用户 sftp zygf@xxx.xxx.xxx.xxx 进行登录(zygf为用户名)

    ② 登录成功后,会提示输入 密码

    ③ 然后,可进入目录, ls 查看目录下内容

    ④ cd 切换目录,get 获取文件, put 上传文件

    ⑤ quit / bye / exit 退出sftp

2、工具连接

新建连接,连接时选择sftp连接,输入账号密码即可连接

五、精简配置方式

groupadd test360
mkdir -p /home/01-FTP/conlinftp/files
useradd -g testftp -d /home/01-FTP/testftp -s /sbin/nologin test360
chown test360:testftp /home/01-FTP/testftp/files
chmod 766 /home/01-FTP/ctestftp/files
passwd test360 #设置密码为test@2020 也可以自己设置密码,用于配置登陆
setsebool allow_ftpd_full_access=1 
echo -e "\n/sbin/nologin" >> /etc/shells
systemctl restart vsftpd
# 即可登陆验证