FTP/SFTP/SSH命令登陆
背景: 有一台Windows OS,两台CentOS,由于业务需求Windows上不能安装File Zilla等软件,但又必须要传输文件,查找发现可以采用SFTP的方式连接CentOS来传输文件。CenOS之间SSH登陆经常需要输入密码,偷懒点可以考虑免密码方式登陆。
首先复习下常用协议端口:
FTP 默认端口21/TCP TFTP 默认端口 69/UDP SSH/SFTP 默认端口22/TCP SMTP Simple Mail Transfer Protocol (E-mail) 默认端口25/TCP POP3 Post Office Protocol (E-mail) 默认端口110/TCP Windows 远程登陆默认端口 3389
本文研究方向: ftp -> sftp -> ssh -> 密钥分析
FTP登陆
FTP和SFPT两者登陆方式类似,因为当前没有ftp server只有sftp server,所以暂时不做ftp测试,但使用方式和sftp基本相同,这里主要简单介绍下。
先简单介绍下FTP的使用情况。
命令格式:ftp [-v][-d][-i][-n][-g][-s:filename][-a][-w:windowsize][computer]
-v 不显示远程服务器响应 -n 禁止第一次连接的时候自动登陆 -i 在多个文件传输期间关闭交互提示 -d 允许调试、显示客户机和服务器之间传递的全部ftp命令 -g 不允许使用文件名通配符,文件名通配符的意思是说允许在本地文件以及路径名中使用通配字符 -s:filename 指定包含ftp命令的文本文件。在ftp命令启动后将自动运行这些命令。在加的参数里不能有空格。 -a 绑定数据连接时,使用任何的本地端口 -w:windowsize 忽略默认的4096传输缓冲区 computer 指定要连接的远程计算机的ip地址
常用方式:
# C:\Users\Administrator>ftp // 开启ftp # ftp> open 169.254.210.111 // 使用用户名和密码登陆,然后就可以正常使用了 # ftp> ls # ftp> quit
主要命令:
ftp> bye //结束与远程计算机的 FTP 会话并退出 ftp bye ftp> cd RemoteDirectory //更改远程计算机上的工作目录 ftp> dir [RemoteDirectory] //显示远程计算机上的目录文件和子目录列表 ftp> get RemoteFile [LocalFile] //使用当前文件传输类型将远程文件复制到本地计算机。如果没有指定 LocalFile,文件就会赋以 RemoteFile 名 ftp> ls [RemoteDirectory] //显示远程目录上的文件和子目录的简短列表 ftp> open Computer [Port] //与指定的 FTP 服务器连接。 ftp> put LocalFile [RemoteFile] // 使用当前文件传输类型将本地文件复制到远程计算机上, 和send一样
ftp也可以操作本地目录,在命令前加上!或l, 例如lcd等。
SFTP登陆
登陆方式: > sftp userid@ip [-P port] // 后续需要输入密码
C:\Users\huanxy>sftp root@100.240.211.103 The authenticity of host '100.240.211.103 )' can't be established. RSA key fingerprint is SHA256:BOvQeMRTjTPdae73JciktVc8odpXouwck3P/YJNjYuI. Are you sure you want to continue connecting (yes/no)? Warning: Permanently added '100.240.211.103' (RSA) to the list of known hosts. ****************************************************** This interface is not for user or customer usage. i1n Login to this interface is not permitted. ****************************************************** root@100.240.211.103's password: Connected to root@100.240.211.103. sftp> ls bootprompt edgeServiceSSHKey.sh l ov z.
命令:
ascii Set transfer mode to ASCII binary Set transfer mode to binary cd path Change remote directory to 'path' lcd path Change local directory to 'path' detail remote-path Display system information about remote file or folder ldetail local-path Display system information about local file or folder chgrp group path Change group of file 'path' to 'group' chmod mode path Change permissions of file 'path' to 'mode' chown owner path Change owner of file 'path' to 'owner' exit Quit sftp help Display this help text include filename Include commands from 'filename' Alternate: < filename get [-r][-a | -b] remote-path Download file -r downloads directory recursively force ascii (-a) or binary (-b) mode ln [-s] existingpath linkpath Hardlink / symlink remote file ls [options] [path] Display remote directory listing lls [options] [path] Display local directory listing mkdir path Create remote directory lmkdir path Create local directory mv oldpath newpath Move remote file lmv oldpath newpath Move local file open [user@]host[:port] Connect to remote host put [-r][-a | -b] local-path Upload file -r uploads directory recursively force ascii (-a) or binary (-b) mode pwd Display remote working directory lpwd Print local working directory quit Quit sftp rename oldname newname Rename remote file lrename oldname newname Rename local file rmdir path Remove remote directory lrmdir path Remove local directory rm path Delete remote file lrm path Delete local file su username Substitutes the current user This is only supported with VShell for Windows 3.5 or later. type [transfer-mode] Display or set file transfer mode view remote-path Download and open file version Display protocol version
常用命令:
cd 路径 更改远程目录到“路径” lcd 路径 更改本地目录到“路径” ls [选项] [路径] 显示远程目录列表 lls [选项] [路径] 显示本地目录列表 put 本地路径 上传文件 get 远程路径 下载文件
例如:
sftp> lcd C:\\ sftp> lcd InstallTools sftp> lcd baidu sftp> lls 驱动器 C 中的卷没有标签。 卷的序列号是 C6BD-5CF5 C:\InstallTools\baidu 的目录 2021/03/04 14:33 <DIR> . 2021/03/04 14:33 <DIR> .. 2021/01/29 21:36 <DIR> BaiduNetdisk 2021/03/04 14:33 6 1 个文件 6 字节 3 个目录 16,666,349,568 可用字节 sftp> put Uploading to /home/root/ 100% 6 0.6KB/s 00:00 sftp> ls bootprompt edgeServiceSSHKey.sh l ov z. sftp> get ov Fetching /home/root/ov to ov
SFTP协议:
SFTP协议能够进行“远程文件获取,文件内容传输,文件管理”等操作,它的控制信号和数据信号的传输通过安全数据通道进行。一般情况下,这个安全数据通道由SSH连接提供,即SSH连接隧道作为安全数据通道。跟只能进行简单文件内容传输的SCP协议相比,SFTP协议更像是一个远程文件系统协议。SFTP协议工作于OSI七层体系的应用层。
SFTP协议分为两个端,分别是SFTP Client和SFTP Server。SFTP Client和SFTP Server之间的控制信号和文件内容的传输得通过安全数据通道进行,安全数据通道可由“Transport Layer Security(TLS)”,“SSH”等协议提供,一般情况下是由SSH协议提供。 一旦SFTP Client和SFTP Server之间的连接得以建立,就可以通过二者之间的控制信号和文件内容的传输实现远程文件系统的功能。
sftp工作模式
它是作为SSH2的一个子服务工作。
sftp工作原理
sftp-server 跟常见的server不太一样,不是持续运行,监听端口的,而是被动触发,只有当ssd接受sftp请求的时候,才会加载sftp-server。
SSH登陆
SSH: Secure Shell缩写
SSH协议框架
* 传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性 等的支持;
* 用户认证协议(The User Authentication Protocol) 则为服务器提供客户端的身份鉴别
* 连接协议(The Connection Protocol) 将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用; 各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。
SSH的工作过程?
在整个通讯过程中,为实现 SSH的安全连接,服务器端与客户端要经历如下五个阶段:
* 版本号协商阶段,SSH目前包括 SSH1和SSH2两个版本, 双方通过版本协商确定使用的版本
* 密钥和算法协商阶段,SSH支持多种加密算法, 双方根据本端和对端支持的算法,协商出最终使用的算法
* 认证阶段,SSH客户端向服务器端发起认证请求, 服务器端对客户端进行认证
* 会话请求阶段, 认证通过后,客户端向服务器端发送会话请求
* 交互会话阶段 ,会话请求通过后,服务器端和客户端进行信息的交互
1 . 版本号协商阶段
1. 服务器打开端口 22,等待客户端连接。
2.客户端向服务器端发起TCP初始连接请求,TCP连接建立后,服务器向客户端发送第一个报文,包括版本标志字符串,格式为“SSH-<主协议版本号>.<次协议版本号>-<软件版本号>”,协议版本号由主版本号和次版本号组成,软件版本号主要是为调试使用。
3.客户端收到报文后,解析该数据包,如果服务器端的协议版本号比自己的低,且客户端能支持服务器端的低版本,就使用服务器端的低版本协议号,否则使用自己的协议版本号。
4. 客户端回应服务器一个报文,包含了客户端决定使用的协议版本号。服务器比较客户端发来的版本号,决定是否能同客户端一起工作。
5. 如果协商成功,则进入密钥和算法协商阶段,否则服务器端断开 TCP连接。
Note: 版本号协商阶段报文都是采用明文方式传输的。
2. 密钥和算法协商阶段
1. 服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication code,消息验证码)算法列表、压缩算法列表等;
2. 服务器端和客户端根据对端和本端支持的算法列表得出最终使用的算法。
3. 服务器端和客户端利用 DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话 ID。
通过以上步骤,服务器端和客户端就取得了相同的会话密钥和会话ID。
* 对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全
* 在认证阶段,两端会使用会话 ID用于认证过程。
Note:在协商阶段之前,服务器端已经生成 RSA或 DSA密钥对,他们主要用于参与会话密钥的生成。
3. 认证阶段
1. 客户端向服务器端发送认证请求,认证请求中包含用户名、认证方法、与该认证方法相关的内容(如:password认证时,内容为密码)
2. 服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。
3. 客户端从认证方法列表中选取一种认证方法再次进行认证。
4. 该过程反复进行, 直到认证成功或者认证次数达到上限, 服务器关闭连接为止。
SSH提供两种认证方式:
1. password认证:客户端向服务器发出 password认证请求,将用户名和密码加密后发送给服务器;服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败的消息。
2. publickey 认证:采用数字签名的方法来认证客户端。目前,设备上可以利用RSA和 DSA两种公共密钥算法实现数字签名。客户端发送包含用户名、公共密钥和公共密钥算法的 publickey 认证请求给服务器端。服务器对公钥进行合法性检查,如果不合法,则直接发送失败消息;否则,服务器利用数字签名对客户端进行认证,并返回认证成功或失败的消息
SSH2.0还提供了 password-publickey 认证和 any 认证:
1. password-publickey 认证:指定该用户的认证方式为 password 和 publickey认证同时满足。客户端版本为 SSH1的用户只要通过其中一种认证即可登录;客户端版本为 SSH2的用户必须两种认证都通过才能登录。
2. any认证:指定该用户的认证方式可以是 password,也可以是 publickey。
4.会话请求阶段
1. 服务器等待客户端的请求;
2. 认证通过后,客户端向服务器发送会话请求;
3. 服务器处理客户端的请求。请求被成功处理后, 服务器会向客户端回应 SSH_SMSG_SUCCESS包,SSH进入交互会话阶段;否则回应 SSH_SMSG_FAILURE包,表示服务器处理请求失败或者不能识别请求。
5.交互会话阶段
在这个模式下,数据被双向传送:
1. 客户端将要执行的命令加密后传给服务器;
2. 服务器接收到报文,解密后执行该命令,将执行的结果加密发还给客户端;
3. 客户端将接收到的结果解密后显示到终端上;
SSH的两种登陆方式介绍
(1) 口令验证登录,这个比较常用。
(2) 密钥验证登录,密钥验证的前提需要登陆主机生成一对密钥(公钥和私钥),并将公钥放置在目标机上。
其基本流程: 当客户机输入ssh root@hostip时,首先客户机查看本地公钥,如果有会将客户机本地的公钥一起发送到目标机上。 目标机收到客户端公钥后会去check authorized_keys文件中是否有这个公钥,如果没有就把目标机上的公钥传输给客户机,这种就是口令验证方式。如果查找到这个公钥,就生成一段challenge并用这个公钥加密回送到客户端,客户端收到后用私钥解密,然后将解密的内容返回给目标机,目标机再验证两端challenge是否相同,如果相同就建立连接,这个就是免密码登陆。
公私钥简介与原理
公钥和私钥都属于非对称加密算法的一个实现,这个加密算法的信息交换过程是:
1) 持有公钥的一方(甲)在收到持有私钥的一方(乙)的请求时,甲会在自己的公钥列表中查找是否有乙的公钥,如果有则使用一个随机字串使用公钥加密并发送给乙。
2) 乙收到加密的字串使用自己的私钥进行解密,并将解密后的字串发送给甲。
3) 甲接收到乙发送来的字串与自己的字串进行对比,如过通过则验证通过,否则验证失败
公钥私钥
密钥:一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。
对称加密算法:加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。
非对称加密算法:加密使用的密钥和解密使用的密钥是不同的。 公钥密码体制就是一种非对称加密算法。 公钥:用于加密(写信时,信件的内容),以达到保密的效果
私钥:用于解密(收到的信件的内容)
使用环境两台CentOS :
客户机 CentOS A: 100.240.211.242
目标机 CentOS B: 100.240.211.103
密钥登陆的大概步骤
ssh使用私钥登录大致步骤就是:主机A(客户端)创建公钥私钥,并将公钥复制到主机B(目标机)的指定用户下,然后主机A使用保存私钥的用户登录到主机B对应保存公钥的用户。
1) 客户端(登录主机)生成一对密钥:# ssh-keygen -t rsa
2) 将客户机的公钥复制到服务端(目标机)要登录的用户的 ~/.ssh/authorized_keys 文件中:# ssh-copy-id -i ~/. root@100.240.211.103
注意:如果使用自己复制的方法,一定要注意.ssh目录和authorized_keys文件的权限,前者是700,后者是600
将公钥复制到被登陆机上的~/.ssh/authorized_keys文件中
# cat id_r >> authorized_keys
# chmod 600 authorized_keys ##修改文件权限为600
# scp authorized_keys root@100.240.211.242:/home/root/.ssh/
如果目标机上没有.ssh文件,需要先创建。
# mkdir .ssh
# chmod 700 .ssh ##将目录权限改为700该目录的权限必须是700才有效
3)然后ssh登陆即可。
root@localhost:~/.ssh# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_rsa Your public key has been saved in /home/root/. The key fingerprint is: SHA256:W78Qh/dn0nUCESCK8eZZurLPr3H+9lRadDlECJ4uJh0 root@localhost The key's randomart image is: +---[RSA 3072]----+ | . . .o+.oo | | + . .. .o. .| | . + .E o. .o.| | o +. o. o ..| | +.S++.o + o| | .oo.= = oo| | . o o . + o +| | + + .o . + | | ..+ooo..o | +----[SHA256]-----+ root@localhost:~/.ssh# ls id_rsa id_r root@localhost:~/.ssh# cat id_r >> authorized_keys root@localhost:~/.ssh# chmod 600 authorized_keys root@localhost:~/.ssh# scp authorized_keys root@100.240.211.103:/home/root/.ssh/ The authenticity of host '100.240.211.103 )' can't be established. RSA key fingerprint is SHA256:BOvQeMRTjTPdae73JciktVc8odpXouwck3P/YJNjYuI. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '100.240.211.103' (RSA) to the list of known hosts. ****************************************************** This interface is not for user or customer usage. i1n Login to this interface is not permitted. ****************************************************** root@100.240.211.103's password: authorized_keys 100% 568 1.0MB/s 00:00 root@localhost:~/.ssh# root@localhost:~/.ssh# ssh root@100.240.211.103 ****************************************************** This interface is not for user or customer usage. i1n Login to this interface is not permitted. ****************************************************** Last login: Wed Mar 3 21:45:03 2021 from 100.106.238.141 DEVELOPMENT USE ONLY - Command line access is not intended for the user or consu mer. root@localhost:~#
后续再继续深入研究密钥原理。
参考: