Linux中的ssh服务是一种远程连接服务,主要用于远程登录Linux,ssh全称为Secure Shell Protocol即安全外壳协议,ssh协议是加密的,其默认端口是22,ssh由客户端和服务端组成,客户端一般有Xshell、SecureCRT、Putty等软件,服务端是openSSH,SSH服务是一个守护进程,在Linux后台实时监听来自客户端的请求,sshd就是SSH服务的后台守护进程名称。

SSH的认证类型

1、基于口令的认证
这种认证方式最常见,即客户端通过账号密码和IP地址来连接Linux服务器主机,虽然所传输的数据都是加密的,但是这种方式存在一定的风险,可能你连接的服务器并非真正所需连接的服务器,而是黑客利用技术手段冒充的。
2、基于密钥的认证
这种方式比较安全,需要依靠密钥,也就是事先需要在客户端创建一对密钥,并将公钥存放在要访问的服务器上,将私钥存放在SSH客户端主机上。
客户端向远程服务器发出连接请求,请求使用密钥进行安全验证,远程服务器收到请求后会先在SSH连接用户的家目录下查找事先存放的公钥,然后进行验证并建立连接。

SSH服务的安装与启动

查看是否安装了ssh服务:rpm -qa |grep openssh,显示有结果则表示已经安装了ssh服务;
如果没有返回值则需要安装ssh服务:yum install openssh-server
查看sshd服务状态:systemctl status sshd
查看端口检查sshd是否启动:netstat -lntup | grpe sshd 或 lsof -i :22
停止sshd服务:systemctl stop sshd 停止了sshd服务,远程连接就会连接不进来
启动sshd服务:systemctl start sshd
为了能让远程连接Linux,应该将sshd设为开机自启动:systemctl enable sshd

使用SSH连接远程主机、ssh远程主机执行命令

使用SSH服务在Linux系统中连接远程主机的命令:ssh -p 端口 用户名@IP地址
以上是链接远程主机,我们也可以链接上远程主机再执行命令,可以直接使用ssh来在远程主机上执行命令,如下:

ssh -p 端口 用户名@IP地址 'command'

scp远程复制命令

scp远程复制命令是ssh服务的附带命令,其格式为:scp [参数] -P[port] 文件 用户@IP地址:目标目录
scp常用的2个参数:

 -r    复制目录
 -p   复制时保留文件或目录的属性

例如:scp -r -p -P22 nginx-1.80-63 root@192.168.1.100:/root/temp/
scp命令对于内网主机之间复制文件效率较高。

SSH免密登录实战

测试环境:两台Linux服务器,一台为分发服务器(CentOS),另一台为目标节点服务器(fujiseiko)
登录分发服务器,生成密钥对:ssh-keygen -t rsa
在这里插入图片描述
从命令结构来看,密钥对已生成。

现在把公钥分发给目标服务器
使用命令:ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.101
在这里插入图片描述
现在登录目标服务器fujiseiko查看是否分发成功,在root的家目录已存在一个叫/root/.ssh/authorized_keys的文件,该文件就是存放公钥的文件,而且是分发服务器分发公钥时在目标服务器自动生成的authorized_keys的文件,该authorized_keys的文件的内容与分发服务器的公钥id_rsa.pub文件内容其实是一样的,如下图所示:

注意:这里说明一点,如果目标服务器不存在authorized_keys的文件,那么分发服务器首次分发公钥时在目标服务器就会创建authorized_keys的文件,然后把公钥写入到authorized_keys文件,下次还有其他分发服务器做免密登录而且也是分发到相同路径下的authorized_keys文件的话,就会直接追加公钥到目标服务器上的authorized_keys文件。

在这里插入图片描述
现在测试免密登录:在客户机上输入:ssh root@192.168.1.101 后发现已经连接上了,不用输入密码。
如果发现仍需要输入密码,则表示密钥免密登录失败,去到目标服务器fujiseiko,修改 vim /etc/ssh/sshd_config文件,启用 PubkeyAuthentication yes StrictModes yes AuthorizedKeysFile .ssh/authorized_keys,同时确保authorized_keys文件具有可执行权限。
重新测试免密登录,同时CentOS中ssh的输出日志为:tail -fn700 /var/log/secure,可查看日志追踪错误。
笔者在首次产生密钥时使用:ssh-keygen -t dsa 即产生DSA密钥,也成功分发给目标节点服务器fujiseiko了,在客户机上测试发现总是提示要输入密码,追踪日志文件tail -fn700 /var/log/secure也没发现任何错误。百度上有人说是目录权限不足,但是我使用ssh-keygen -t rsa和ssh-keygen -t ecdsa都没有问题都能免密登录,就是使用dsa不行,最后再次检查配置文件,发现默认情况下配置文件是不启用这一项的:
在这里插入图片描述
查看该ssh目录下真的没有ssh_host_dsa_key这个文件,后来即使笔者启用这一项,还是没能免密登录,最后查看官网得知,

在这里插入图片描述
即OpenSSH 7.0版本之后已经不再支持DSA了,所以还是使用官网建议的rsa、ecdsa、ed25519吧,查看自己的openssh版本:rpm -qa|grep openssh-* 或 ssh -V 。

配置文件详解

SSH服务最主要的两个配置文件就是:/etc/ssh/ssh_config 和 /etc/ssh/sshd_config
下面先讲ssh_config
ssh_config是客户端文件

 Host *									#只匹配设定的主机,**表示匹配所有的主机
 ForwardAgent no						#指定是否将到身份验证代理的连接(如果有的话)转发到远程机器。
ForwardX11 no							#指定是否在安全通道上自动重定向X11连接并显示参数必须是yes或no(默认值)。
PasswordAuthentication yes				#是否使用密码认证
BatchMode no							#是否禁用密码查询功能
CheckHostIP yes							#验证主机IP,检查known_hosts中主机IP地址,检测主机密钥是否因DNS欺骗而改变,并添加目的地址~ /主机
AddressFamily any						#指定连接时使用的地址族,IPV4和IPV6协议家族用哪个,any表示二者均用
ConnectTimeout 0						#指定连接SSH服务器时使用的超时时间(以秒为单位),而不是使用默认值系统TCP超时
StrictHostKeyChecking ask				#第一次使用ssh root@192.168.1.100链接服务器是会弹回一串英文询问你是否要链接,该项就是控制是否弹出英文询问提示信息的,设置为no表示不询问
IdentityFile ~/.ssh/id_rsa				#指定从其中读取用户的DSA、ECDSA、Ed25519或RSA身份验证标识的文件。
IdentityFile ~/.ssh/id_dsa
IdentityFile ~/.ssh/id_ecdsa
IdentityFile ~/.ssh/id_ed25519
Port 22									#连接远程主机的端口,默认22											
EscapeChar ~							#设置转义字符(默认为' ~ '),转义字符也可以在命令行中设置。
PermitLocalCommand no					#是否允许通过LocalCommand选项或使用!命令转义序列执行本地命令

sshd_config是客户端文件

Port 22									#ssh监听端口,默认22,可以设置多个监听端口号,可重复使用Prot这个设置项。修改后重启sshd,防火墙中添加端口
AddressFamily any						#指定连接时使用的地址族,IPV4和IPV6协议家族用哪个,any表示二者均用
ListenAddress 0.0.0.0					#设置sshd服务器监听的IP地址,0.0.0.0表示本机的所有Ipv4地址  【默认可修改】
ListenAddress ::						#指明监听的IPV6的所有地址格式
HostKey /etc/ssh/ssh_host_rsa_key		#rsa私钥认证 【默认】
HostKey /etc/ssh/ssh_host_ecdsa_key		#ecdsa私钥认证
HostKey /etc/ssh/ssh_host_ed25519_key	#ed25519私钥认证
SyslogFacility AUTHPRIV					#ssh登录系统时,ssh会记录信息,记录类型为AUTHPRIV,sshd服务日志存放在/var/log/secure
LogLevel INFO							#日志级别,Centos的日志存放在/var/log/sercue中
PermitRootLogin yes						#是否允许root远程登录,默认允许,但建议设置为no
StrictModes yes							#是否让sshd去检查用户主目录或相关文件的权限数据
MaxAuthTries 6							#最大认证尝试次数,最多可以尝试6次输入密码。之后需要等待某段时间后才能再次输入密码
MaxSessions 10							#允许的最大会话数
AuthorizedKeysFile	.ssh/authorized_keys	#默认公钥存放的位置
PasswordAuthentication yes				#是否允许支持基于密码口令的认证,可以设置为no不使用密码验证,转而使用密钥登录
PermitEmptyPasswords no					#是否允许用户空密码登录
PrintMotd no							#是否打印登录提示信息,提示信息存储在etc/motd文件中
PrintLastLog yes						#显示上次登录信息。默认为yes
UseDNS no								#一般为了判断客户端来源是否合法,会使用DNS去反查客户端的主机名。但通常在内网互连时,设置为no,使连接快写
PidFile /var/run/sshd.pid				#sshd服务的PID文件

ssh基于用户密码认证的原理

我们知道,当我们使用ssh root@192.168.1.100这样链接服务器时,如果是第一次链接服务器,会弹出一串英文询问你,并要求你输入密码,那么这个过程ssh链接的原理是什么呢?下面就来简单讲解一个ssh基于用户密码认证的原理。

1、ssh客户端第一次向ssh服务端发起一个ssh链接登录请求,如:A服务器请求ssh链接登录B服务器,ssh root@192.168.1.100,这时ssh客户端会提示一串英文,大概意思就是说无法确定你所链接的服务器的真实性,是否需要继续,输入: yes
2、ssh客户端输入yes之后,ssh服务端开始向ssh客户端发送公钥/etc/ssh/ssh_host_rsa_key.pub文件;
3、ssh客户端接受公钥,此时ssh客户端输入密码,并使用公钥对密码进行加密后发送给ssh服务端;
4、ssh服务端接受来之ssh客户端的加密后的密码,使用自己的/etc/ssh/ssh_host_rsa_key 私钥进行解密,解密认证通过后,登录链接建立完成;
5、ssh客户端自己留存一份ssh服务端主机的信息,位于~/.ssh/known_hosts文件中,下次再次链接ssh服务端主机不在弹出英文询问语句。

ssh免密登录的原理

1、A主机生成一对秘钥(私钥和公钥);
2、把A主机的公钥拷贝一份到B主机然后把其内容追加到B主机的/root/.ssh/authorized_keys文件上(B主机的sshd服务配置文件要事先启用秘钥验证登录功能);
3、A主机向B主机发起ssh 登录请求;
4、B主机收到请求后进行公钥对比,判断A主机的公钥是否已经存储在authorized_keys文件中,如果存在并正确,则随机生成一个字符串,然后使用A主机的公钥对字符串进行加密,得到加密后的字符串。
5、B主机把加密后的字符串发送给A主机,这加密后的字符串相当于口令;
6、A主机接受到加密的字符串后使用自己的私钥进行解密,解密后的字符串发送回给B主机;
7、B主机接收解密后的字符串,认证与自己最初生成的字符串一致,返回登录结果给A主机;
8、A主机接收登录结果,结果是成功则登录成功,结果是失败则登录失败。

在这里插入图片描述

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐