SFTP,全称为SSH File Transfer Protocol,是一种网络文件传输协议。它为文件的传输提供了一种安全的方法,通过SSH协议提供数据加密和安全的网络服务。SFTP不同于简单的文件传输协议(FTP),它为传输的数据提供了加密,确保数据在传输过程中不会被截获或篡改,从而提高了传输过程的安全性。
SFTP与FTP的主要区别:
- 安全性:
- FTP在传输数据时不提供加密,数据(包括用户名和密码)可能会以明文形式在网络中传输,容易遭受嗅探和中间人攻击。
- SFTP在SSH的安全层上运行,为所有传输的数据提供了加密,包括认证信息和传输的文件内容。
- 端口:
- FTP通常使用两个端口:21用于命令传输,20用于数据传输。
- SFTP只使用一个端口(默认为22),即SSH端口,因此更容易管理和配置防火墙。
- 功能:
- SFTP提供了比FTP更丰富的功能,包括文件管理、权限和属性控制、文件锁定等。
- FTP主要用于文件上传和下载,功能相对简单。
SFTP的历史:
SFTP最初是作为SSH的一部分被设计出来的,其早期版本随SSH-2协议一起发布。SSH(Secure Shell)协议是由芬兰研究员Tatu Ylönen在1995年开发的,目的是替代不安全的telnet和rlogin等协议。随着SSH的普及,SFTP也随之成为了文件传输的标准方法之一。
为什么现在使用SFTP比较多:
- 安全需求:随着网络安全意识的提高,人们越来越重视数据传输的安全性。SFTP提供了加密和安全认证,确保了数据传输的安全。
- 合规性:许多行业标准和政府法规要求使用安全的数据传输方法,SFTP因其安全性而符合这些要求。
- 单一端口:SFTP通过单一端口工作,便于防火墙配置和网络管理。
- 功能丰富:SFTP支持文件传输之外的操作,如删除、重命名、更改文件权限等,这使得它更为强大和灵活。
- 跨平台:SFTP客户端和服务器软件可用于多种操作系统,包括Windows、Linux和macOS,这提供了很好的跨平台支持。
由于这些优点,SFTP已经成为许多企业和组织传输文件的首选协议,尤其是在需要确保数据安全的场合。
服务的搭建
在CentOS 7上搭建SFTP服务,通常使用OpenSSH内置的SFTP功能。下面是搭建SFTP服务的基本步骤:
- 确保OpenSSH服务器已安装:
sudo yum install openssh-server
- 启动并使SSH服务开机自启:
sudo systemctl start sshd sudo systemctl enable sshd
- 创建SFTP用户和用户组:
sudo groupadd sftpusers sudo useradd -m -g sftpusers -s /sbin/nologin sftpuser sudo passwd sftpuser
这里创建了名为sftpusers的组,并添加了名为sftpuser的用户。/sbin/nologin确保用户不能通过SSH登录。
- 配置sshd_config文件以限制SFTP用户的访问权限:
sudo vi /etc/ssh/sshd_config
在文件的末尾添加以下配置:
Match Group sftpusers ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
这里%h代表用户的主目录,ChrootDirectory用于限制用户只能访问其主目录。
- 为SFTP用户分配权限并设置目录结构:
sudo mkdir /home/sftpuser/files sudo chown sftpuser:sftpusers /home/sftpuser/files
这里创建了一个名为files的目录,用于sftpuser存放文件。
- 重启SSH服务以应用更改:
sudo systemctl restart sshd
- 测试SFTP连接:
sftp sftpuser@your_server_ip
替换your_server_ip为你的服务器IP地址,然后使用sftpuser的密码进行登录。
用户权限的处理
在CentOS 7上对SFTP用户进行权限控制,主要是通过设置文件系统权限和使用SSH配置文件来实现。以下是一些基本的权限设置:
只读权限:
如果您想要一个用户只有读取文件的权限,不允许上传、修改或删除,可以这样设置:
- 设置用户的主目录权限,使得用户只能读取文件:
sudo chown root:sftpusers /home/sftpuser sudo chmod 755 /home/sftpuser
这里,我们将主目录的所有者设为root,并给予sftpusers组的成员读取和执行权限。
- 创建一个文件夹供用户读取文件:
sudo mkdir /home/sftpuser/files sudo chown sftpuser:sftpusers /home/sftpuser/files sudo chmod 755 /home/sftpuser/files
- 确保用户只能访问
files目录,并且只有读取权限:
sudo chown -R sftpuser:sftpusers /home/sftpuser/files sudo chmod -R 755 /home/sftpuser/files
这样用户sftpuser能读取files目录下的所有文件,但不能在里面写入或修改文件。
读取和上传权限:
如果您希望用户既能读取文件也能上传文件,但不允许修改或删除,可以这样设置:
- 设置用户的主目录权限,使得用户只能读取和写入文件:
sudo chown root:sftpusers /home/sftpuser sudo chmod 755 /home/sftpuser
- 创建一个文件夹供用户读取和上传文件:
sudo mkdir /home/sftpuser/files sudo chown sftpuser:sftpusers /home/sftpuser/files sudo chmod 755 /home/sftpuser/files
- 为了让用户能上传文件,需要给予写权限:
sudo chmod 775 /home/sftpuser/files
这样用户sftpuser能读取和上传文件到files目录,但是不能修改或删除已经存在的文件。如果您希望用户也能修改文件,那么可以将权限改为777(不推荐,因为这会使得任何人都能修改文件)。
Linux的文件权限是非常灵活的,我们可以根据需要进行精细调整。例如,使用setfacl命令可以设置更精细的访问控制列表(ACL)权限。chmod命令中权限数字的含义,例如,7代表读写执行,5代表读取和执行,4代表只读。
具体案例
把sftp的根目录放到 /home/sftp_files这个目录下,分别建立两个用户,user_external用户能读能写,密码是CNNASy6#qCs$hmPWngAERu,一个只能读, 用户名是user_internal,密码是DAY2YaUYM#jGwM4q4@Qkx# ,
好的,按照您的要求,我们将创建两个用户:user_external和user_internal,并设置相应的权限。user_external将拥有读写权限,而user_internal将只有读权限。我们将使用/home/sftp_files作为SFTP的根目录。请按照以下步骤操作:
- 创建SFTP根目录和用户组:
sudo mkdir -p /home/sftp_files sudo groupadd sftpusers
- 创建用户并设置密码:
sudo useradd -m -g sftpusers -s /sbin/nologin user_external echo "CNNASy6#qCs$hmPWngAERu" | sudo passwd --stdin user_external sudo useradd -m -g sftpusers -s /sbin/nologin user_internal echo "DAY2YaUYM#jGwM4q4@Qkx#" | sudo passwd --stdin user_internal
- 分配目录给用户,并设置相应权限:
sudo mkdir /home/sftp_files/user_external sudo mkdir /home/sftp_files/user_internal sudo chown root:sftpusers /home/sftp_files/user_external sudo chown root:sftpusers /home/sftp_files/user_internal sudo chmod 755 /home/sftp_files/user_external sudo chmod 755 /home/sftp_files/user_internal sudo mkdir /home/sftp_files/user_external/files sudo mkdir /home/sftp_files/user_internal/files sudo chown user_external:sftpusers /home/sftp_files/user_external/files sudo chown user_internal:sftpusers /home/sftp_files/user_internal/files sudo chmod 770 /home/sftp_files/user_external/files sudo chmod 750 /home/sftp_files/user_internal/files
- 配置
sshd_config文件以限制SFTP用户的访问权限,并设置根目录:
sudo vi /etc/ssh/sshd_config
在文件的末尾添加以下配置:
Match Group sftpusers ChrootDirectory /home/sftp_files/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
- 重启SSH服务以应用更改:
sudo systemctl restart sshd
现在,您应该能够使用user_external和user_internal用户通过SFTP连接到服务器。user_external将能够在其files目录中读取和上传文件,而user_internal将只能读取其files目录中的文件。
出于安全考虑,直接在命令行中以明文形式设置密码并不是最佳实践。建议手动设置密码或使用密钥认证。