一.SSH服务
1.什么是SSH服务器?
-
SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。
-
SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。
-
对数据进行压缩,加快传输速度。
-
SSH使用传输层TCP协议的22号端口
2. SSH的优点
-
数据传输是加密的,可以防止信息泄漏
-
数据传输是压缩的,可以提高传输速度
3.常见的ssh协议
客户端软件:
- Linux 客户端: ssh, scp, sftp,slogin
- Windows 客户端:xshell, MobaXterm,putty, securecrt, ssh secure shell client
服务端软件:
- 软件名sshd,闭源。
- 软件名openssh,服务名sshd。CENTOS 7默认安装的是这个软件包。
OpenSSH软件包
-
服务名称:sshd
-
服务端主程序:/usr/sbin/sshd
-
服务端配置文件:/etc/ssh/sshd_config
-
客户端配置文件:/etc/ssh/ssh.config
4.ssh原理
- 客户端发起链接请求
- 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
- 客户端生成密钥对
- 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
- 客户端发送加密值到服务端,服务端用私钥解密,得到Res
- 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)。
- 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密。
二.登录
登录方式一:
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port
-p:指定端口号(默认多端口号为22一般情况下不需要加此选项)
举例:
ssh连接时直接跟命令,连接后命令立即生效。例如跟 ls 命令:
2.1known_hosts 文件
ssh会把每个你访问过的服务端的公钥(public key)都记录在known_hosts 文件中。 同时服务端也会记录客户端的公钥。
文件位置:~/.ssh/known_hosts
known_hosts 文件的作用:
A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。。
举例:
客户端:192.168.37.100
服务端:192.168.37.101
- 客户端首次连接服务端时,系统会询问是否交换公钥,进行安全确认。确认连接后,双方的known_hosts文件都会记录对方的公钥。
- 客户端的 known_hosts 文件会记录服务端的公钥。
三.sshd服务端配置
sshd服务端配置文件:/etc/ssh/sshd_config
服务监听选项:
- 端口号、协议版本、监听IP地址
- 禁用反向解析
常用参数:
举例:
修改端口号,将默认端口22修改为其他端口号
四.sshd客户端配置
4.1sshd服务支持登录验证方式
密码验证: 以服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便,但从客户机角度来看,正在连接的服务器有可能被假冒,从服务器角度来看,当遭遇密码暴力破解攻击时防御能力比较弱。
密钥对验证: 要求提供相匹配的密钥信息才能通过验证,通常先在客户机中创建一对密钥文件(公钥和私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证,增强了远程管理的安全性。
- 公钥和私钥是成对生成的,这两个密钥互不相同,可以互相加密和解密;
- 不能根据一个密码来推算出另一个密钥;
- 公钥对外公开,私钥只有私钥的持有人才知道。
服务端配置文件的常用选项设置
4.2客户端配置文件:/etc/ssh/ssh_config
客户端首次连接服务端时,系统询问是否交换公钥,进行安全确认。这是由客户端配置文件默认的,可以修改配置文件ssh_config取消询问。
注:这种做法适合在安全环境,如果在外网情况下,不建议这么做,比较危险。
4.3限制登录用户(黑白名单)
4.4 sftp命令
SFTP是SSH File Transfer Protocol的缩写,安全文件传送协议。SFTP与FTP有着几乎一样的语法和功能。SFTP为SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。
远程下载或上传
命令格式:sftp 登录用户@远程主机IP地址
不加用户的话默认为root
get:下载
put:上传
put -r:上传文件夹
举例:
sftp和ftp的区别:
-
连接方式:FTP使用TCP端口21上的控制连接建立连接。而,SFTP是在客户端和服务器之间通过SSH协议(TCP端口22)建立的安全连接来传输文件。
-
安全性:SFTP使用加密传输认证信息和传输的数据,所以使用SFTP相对于FTP是非常安全。
-
效率:SFTP这种传输方式使用了加密解密技术,所以传输效率比普通的FTP要低得多。
五.免密码登录
5.1 sshd服务支持登录验证方式
-
密码验证: 以服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便,但从客户机角度来看,正在连接的服务器有可能被假冒,从服务器角度来看,当遭遇密码暴力破解攻击时防御能力比较弱。
-
密钥对验证: 要求提供相匹配的密钥信息才能通过验证,通常先在客户机中创建一对密钥文件(公钥和私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证,增强了远程管理的安全性。
- 公钥和私钥是成对生成的,这两个密钥互不相同,可以互相加密和解密;
- 不能根据一个密码来推算出另一个密钥;
- 公钥对外公开,私钥只有私钥的持有人才知道。
5.2 设置免密码登录
免密码原理流程:
- 首先在客户端生成一对密钥(ssh-keygen)。
- 并将客户端的公钥ssh-copy-id 拷贝到服务端。
- 当客户端再次发送一个连接请求时,包括ip、用户名。
- 服务端得到客户端的请求后,会到 authorized_keys 文件中查找,如果有相应的IP和用户,就会随机生成一个字符串,例如:kfc。
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端。
- 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端。
- 服务端接收到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就进行免密码登录。
举例:
六.轻量级自动运维工具pssh
- pssh:基于python编写,可在多台服务器上执行命令的工具,也可实现文件复制,提供了基于ssh和scp的多个并行工具。
- pdsh:Parallel remote shell program,是一个多线程远程shell客户端,可以并行执行多个远程主机上的命令。 可使用几种不同的远程shell服务,包括rsh,Kerberos IV和ssh。
- mussh:Multihost SSH wrapper,是一个shell脚本,允许使用命令在多个主机上通过ssh执行命令。 可使用ssh-agent和RSA/DSA密钥,以减少输入密码。
pssh 命令选项如下:
-H:主机字符串,内容格式”[user@]host[:port]”
-h file:主机列表文件,内容格式”[user@]host[:port]”
-A:手动输入密码模式
-i:每个服务器内部处理信息输出
-l:登录使用的用户名 -p:并发的线程数【可选】
-o:输出的文件目录【可选】
-e:错误输出文件【可选】
-t:TIMEOUT 超时时间设置,0无限制【可选】
-O:SSH的选项
-P:打印出服务器返回信息
-v:详细模式
–version:查看版本
配置举例: