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