Linux系统下的ssh使用(依据个人经验总结)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux系统下的ssh使⽤(依据个⼈经验总结)
对于linux运维⼯作者⽽⾔,使⽤ssh远程远程服务器是再熟悉不过的了!对于ssh的⼀些严格设置也关系到服务器的安全维护,今天在此,就本⼈⼯作中使⽤ssh的经验⽽⾔,做⼀些总结记录来下。

-bash: ssh: command not found
解决办法;
yum install -y openssh-server openssh-clinets
(0)ssh登录时提⽰:Read from socket failed: Connection reset by peer.
尝试了很多解决⽅案均⽆效,⽆奈!卸载sshd,然后重新安装
# yum remove openssh*
# rm -rf /etc/ssh*
# yum install -y openssh*
# systemctl start sshd.service
(1)ssh远程登陆后的提⽰信息,标题信息
我们经常会使⽤中控机ssh信任跳转到其他机器上,但是不知道有没有运维朋友注意到ssh跳转成功后的终端显⽰的提⽰信息?
这些提⽰信息,是为了⽅便我们在第⼀时间知道ssh跳转到哪台⽬标机上,也是为了避免长期频繁跳转后由于⼤意造成的误⼊机器操作的风险,我们通常会在ssh跳转到⽬标机器后显⽰⼀些提⽰信息,在⼀些国家, 登⼊给定系统前, 给出未经授权或者⽤户监视警告信息, 将会受到法律的保护.如下:
[root@bastion-IDC ~]# ssh -p22 192.168.1.15
Last login: Fri Jul 15 13:26:53 2016 from 124.65.197.154
===================================
|||||||||||||||||||||||||||||||||||
===================================
HOSTNAME: monit-server
IPADDRES: 192.168.1.15
===================================
IDC监控机
===================================
那么上⾯红⾊区域的提醒信息是在哪设置的呢?
做法⼀:其实很简单,这些信息是在⽬标机器的/etc/motd⽂件⾥⾃定义的
[root@monit-server ~]# cat /etc/motd
===================================
|||||||||||||||||||||||||||||||||||
===================================
HOSTNAME: monit-server
IPADDRES: 192.168.1.15
===================================
IDC监控机
===================================
做法⼆:在⽬标机器的/etc/ssh/sshd_config⽂件⾥定义,然后重启sshd服务即可。

这两种做法是⼀致的效果!
Banner /etc/sshfile
[root@host-192-168-1-117 ~]# cat /etc/sshfile
this is 192.168.1.117
远程登陆:
[root@linux-node2 ~]# ssh 192.168.1.117
this is 192.168.1.117
[root@host-192-168-1-117 ~]#
(2)实现SSH⽆密码登录:使⽤ssh-keygen和ssh-copy-id
ssh-keygen 产⽣公钥与私钥对.
ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys⽂件中,ssh-copy-id也能让你有到远程机器的/home/username/.ssh和~/.ssh/authorized_keys的权利.
操作记录:
1)第⼀步:在本地机器上使⽤ssh-keygen产⽣公钥私钥对
#ssh-keygen -t rsa //⼀路默认回车
这样就会在当前⽤户家⽬录下的.ssh⽬录⾥产⽣公钥和私钥⽂件:id_rsa.pub、id_rsa。

可以将id_rsa.pub 公钥⽂件复制成authorized_keys
2)第⼆步:可以⼿动将本机的id_rsa.pub公钥⽂件内容复制到远程⽬标机的.ssh/authorized_keys⽂件中,可以就可以实现ssh⽆密码登陆。

当然,也可以在本机直接使⽤ssh-copy-id将公钥复制到远程机器中
#ssh-copy-id -i /root/.ssh/id_rsa.pub user@ip [把本机的公钥拷贝到远程机器上,⽐如B机器]
也可以不加公钥路径,会默认加上
#ssh-copy-id user@ip
注意:
ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_key.⽂件(⽂件会⾃动创建)中
?
1 2对于⾮22端⼝(⽐如22222)情况下的ssh-copy-id的使⽤,需要这样⽤:ssh-copy-id-i /root/.ssh/id_rsa.pub '-p 2222
2 root@192.168.18.18'
3)这样,本机登录到上⾯远程机器(B机器)就不⽤输⼊密码
#ssh user@ip
(3)ssh登录失败,报错:Pseudo-terminal will not be allocated because stdin
现象:
需要登录线上的⼀台⽬标机器A,但是不能直接登录(没有登录权限),需要先登录B机器,然后从B机器跳转到A机器。

脚本如下:
localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh root@101.201.114.106 "ssh -p25791 root@103.10.86.7"
但是在执⾏脚本的时候报错如下:
Pseudo-terminal will not be allocated because stdin
原因:
伪终端将⽆法分配,因为标准输⼊不是终端。

解决办法:
需要增加-t -t参数来强制伪终端分配,即使标准输⼊不是终端。

在脚本⾥添加-t -t参数即可,如下:
localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh root@101.201.114.106 "ssh -t -t -p25791 root@103.10.86.7"
或者
localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh -t root@101.201.114.106 "ssh -t -t -p25791 root@103.10.86.7"
(4)ssh远程登陆缓慢问题
解决办法:
编译/etc/ssh/sshd_config配置⽂件:
UseDNS no
GSSAPIAuthentication no
然后重启sshd服务即可!
(5)ssh登录出现:permission denied(publickey.gssapi-with-mic)
解决⽅法:
修改/etc/ssh/sshd-config⽂件,将其中的:
PermitRootLogin no修改为yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys前⾯加上#屏蔽掉
PasswordAuthentication no修改为yes
最后重启sshd服务即可!
(6)ssh连接错误问题
1)在使⽤ssh或scp或rsync远程连接的时候,出现如下报错:
Address **** maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
解决⽅法:
修改本机ssh_config⽂件
[root@kvmserver ~]# vim /etc/ssh/ssh_config
GSSAPIAuthentication no
[root@kvmserver ~]#/etc/init.d/sshd restart
问题迎刃⽽解~~
2)本机scp、rsync命令都已具备,但是在使⽤scp或rsync远程同步的时候报错:
bash: scp: command not found
bash: rsync: command not found
原因:是由于远程机器上没有安装scp或rsync造成的!安装这两个命令即可~
yum install openssh-clients
yum install rsync
3)远程ssh连接时错误“ The X11 forwarding request was rejected!”
解决⽅法:
将sshd_config中设置 X11Forwarding yes
重启sshd服务。

(7)ssh连接超时被踢出问题解决
当使⽤xshell,SecureCRT等客户端访问linux服务器,有时候会出现终端定期超时被踢出的情况。

下⾯介绍三种⽅法来防⽌超时被踢出的⽅法,后两种情况的设置⽅法以及通过设置shell变量来达到此⽬的的⽅法:
1、配置服务器
#vi /etc/ssh/sshd_config
1)找到 ClientAliveInterval参数,如果没有就⾃⼰加⼀⾏
数值是秒,⽐如你设置为120 ,则是2分钟
ClientAliveInterval 120
2)ClientAliveCountMax
指如果发现客户端没有响应,则判断⼀次超时,这个参数设置允许超时的次数。

如3 、5等⾃定义
修改两项参数后如下:
----------------------------
ClientAliveInterval 120
ClientAliveCountMax 3 //0 不允许超时次数
修改/etc/ssh/sshd_config⽂件,将 ClientAliveInterval 0和ClientAliveCountMax 3的注释符号去掉,将ClientAliveInterval对应的0改成60,没有就⾃⼰输⼊。

ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0, 不发送.⽽ClientAliveInterval 60表⽰每分钟发送⼀次, 然后客户端响应, 这样就保持长连接了.ClientAliveCountMax, 使⽤默认值3即可.ClientAliveCountMax表⽰服务器发出请求后客户端没有响应的次数达到⼀定值, 就⾃动断开. 正常情况下, 客户端不会不响应.
重新加载sshd服务。

退出客户端,再次登陆即可验证。

3)重启sshd service
sudo /etc/init.d/ssh restart
2、配置客户端
#vim /etc/ssh/ssh_config
然后找到⾥⾯的
ServerAliveInterval
参数,如果没有你同样⾃⼰加⼀个就好了
参数意义相同,都是秒数,⽐如5分钟等
ServerAliveInterval 300
3、echo export TMOUT=1000000 >> /root/.bash_profile; source .bash_profile
在Linux 终端的shell环境中通过设置环境变量TMOUT来阻⽌超时。

如果显⽰空⽩,表⽰没有设置, 等于使⽤默认值0, ⼀般情况下应该是不超时. 如果⼤于0, 可以在如/etc/profile之类⽂件中设置它为0.
(8)ssh远程登陆,公钥授权不通过:Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
公司IDC机房服务器,之前做了跳板机环境,其他机器只允许从跳板机ssh⽆密码信任过去,并且在信任
关系做好后,禁⽤了其他机器的密码登陆功能(sshd_config⽂件⾥设置“PermitEmptyPasswords no”)
后来跳板机出现了问题,打算重装这台机器,重装前取消了其他机器⾥只允许跳板机ssh信任关系,并且恢复了密码登陆功能:
[root@bastion-IDC ssh]# vim /etc/ssh/sshd_config
PermitEmptyPasswords yes
[root@bastion-IDC ssh]# service sshd restart
修改后,当时在其他机器间是可以ssh相互登陆,当时没在意,以为⼀切ok了。

可是,到了第⼆天,再次ssh登陆时,尼玛,居然报错了~~
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
最后发现是selinux惹的祸!关闭它即可。

1)临时关闭selinux
[root@bastion-IDC ssh]# setenforce 0
[root@bastion-IDC ssh]# getenforce
Permissive
2)永久关闭
[root@bastion-IDC ssh]# vim /etc/sysconfig/selinux
SELINUX=disabled
[root@bastion-IDC ssh]# reboot #重启系统才能⽣效
说明:
1)ssh可同时⽀持publickey和password两种授权⽅式,publickey默认不开启,需要配置为yes。

如果客户端不存在.ssh/id_rsa,则使⽤password授权;存在则使⽤publickey授权;如果publickey授权失败,依然会继续使⽤password授权。

2)GSSAPI⾝份验证.
GSSAPIAuthentication 是否允许使⽤基于 GSSAPI 的⽤户认证.默认值为"no".仅⽤于SSH-2. GSSAPICleanupCredentials 是否在⽤户退出登录后⾃动销毁⽤户凭证缓存。

默认值是"yes".仅⽤于SSH-2.
需要特别注意的是:
GSSAPI是公共安全事务应⽤程序接⼝(GSS-API)
公共安全事务应⽤程序接⼝以⼀种统⼀的模式为使⽤者提供安全事务,由于它⽀持最基本的机制和技术,所以保证不同的应⽤环境下的可移植性.
该规范定义了GSS-API事务和基本元素,并独⽴于基本的机制和程序设计语⾔环境,并借助于其它相关的⽂档规范实现.
如果我们在服务端打开GSSAPIAuthentication配置项,如下:
[root@server ~]#vim /etc/ssh/sshd_config
........
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
那么在客户端登录服务端会⽤gssapi-keyex,gssapi-with-mic进⾏⾝份校验,同样客户端也要⽀持这种⾝份验证,如下:
[root@client ~]#vim /etc/ssh/ssh_config
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
我们在客户端连接SSH服务端,如下:
ssh -v 192.168.1.11
.................
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
我们看到如下的信息:
debug1: Unspecified GSS failure. Minor code may provide more information
No credentials cache found
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
说明SSH登录时采⽤GSSAPI的⽅式进⾏⾝份验证,但我们的系统不⽀持.
最后如果我们不⽤这种⽅式进⾏⾝份验证的话,建议关闭这个选项,这样可以提⾼验证时的速度.
(9)ssh⾃定义安全设置
1)为了ssh登陆的时候加⼀层保护,可以修改默认端⼝。

修改ssh服务配置⽂件/etc/ssh/sshd_config
port 2222
这样远程连接时加短裤
#ssh 192.168.1.83 -p 2222
2)ssh使⽤时加-l后⾯跟⽤户名,表⽰登陆到对⽅的这个⽤户下⾯。

#ssh -l wangshibo 192.168.1.83 -p 2222
等同于
#ssh wangshibo@192.168.1.83 -p 2222
3)限制ssh登陆的来源ip,⽩名单设置(hosts.allow优先级最⾼,具体参考:Linux服务器安全登录设置记录)
⼀是通过iptables设置ssh端⼝的⽩名单,如下设置只允许192.168.1.0/24⽹段的客户机可以远程连接本机#vim /etc/sysconfig/iptables
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT
⼆是通过/etc/hosts.allow⾥⾯进⾏限制(如下),/etc/hosts.deny⽂件不要任何内容编辑,保持默认!
#vim /etc/hosts.allow
sshd:192.168.1.*,192.168.9.*,124.65.197.154,61.148.60.42,103.10.86.7:allow
sshd:all:deny
4)仅允许特定的⽤户通过SSH登陆
如不允许root⽤户登录;
只允许⼏个指定的⽤户登录(⽐如wangshibo、guohuihui、liuxing⽤户)
禁⽌某些指定的⽤户登录(⽐如zhangda,liqin⽤户)
但是要注意:设置的这⼏个⽤户必须同时存在于本机和对⽅机器上
修改ssh服务配置⽂件/etc/ssh/sshd_config
PermitRootLogin no //将yes修改为no
AllowUsers wangshibo guohuihui liuxing //这个参数AllowUsers如果不存在,需要⼿动创建,⽤户之间空格隔开
DenyUsers zhagnda liqin //这个参数DenyUsers如果不存在,需要⼿动创建,⽤户之间空格隔开
也可以设置仅允许某个组的成员通过ssh访问主机。

AllowGroups wheel ops
5)取消密码验证,只⽤密钥对验证
修改ssh服务配置⽂件/etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
6)给账号设置强壮的密码:将密码保存到⽂本进⾏复制和粘帖就可以了
# rpm -ivh expect-5.43.0-5.1.i386.rpm| yum -y install expect
# mkpasswd -l 128 -d 8 -C 15 -s 10 //将下⾯密码保存到⽂本进⾏复制、粘贴即可
lVj.jg&sKrf0cvtgmydqo7qPotxzxen9mefy?
ej!kcaX2gQrcu2ndftkeamllznx>iHikTagiVz0$cMtqOcIypkpd,vvD*kJhs3q@sb:CiCqgtqdqvse5lssfmranbtx 参数说明:
-l 密码长度
-d 多少个数字
-C ⼤写字母个数
-s 特殊符号的个数
7)只允许通过指定的⽹络接⼝来访问SSH服务,(如果本服务器有多个IP的时候)
仍然是修改/etc/ssh/sshd_config,如下:
ListenAddress 192.168.1.15 //默认监听的是0.0.0.0
这样,就只允许远程机器通过ssh连接本机的192.168.1.15内⽹ip来进⾏登陆了。

8)禁⽌空密码登录
如果本机系统有些账号没有设置密码,⽽ssh配置⽂件⾥⼜没做限制,那么远程通过这个空密码账号就可
以登陆了,这是及其不安全的!
所以⼀定要禁⽌空密码登陆。

修改/etc/ssh/sshd_config,如下:
PermitEmptyPasswords no //这⼀项,默认就是禁⽤空密码登陆
9) ssh_config和sshd_config
ssh_config和sshd_config都是ssh服务器的配置⽂件,⼆者区别在于,前者是针对客户端的配置⽂件,后者则是针对服务端的配置⽂件。

两个配置⽂件都允许你通过设置不同的选项来改变客户端程序的运⾏⽅式。

sshd_config的配置⼀般都⽐较熟悉,下⾯单独说下ssh_config针对客户端的配置⽂件:
?
1
2
3
4
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52[root@dns01 dns_rsync]# cat /etc/ssh/ssh_config
# Site-wide defaults for various options
Host *
ForwardAgent no
ForwardX11 no
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication yes
FallBackToRsh no
UseRsh no
BatchMode no
CheckHostIP yes
StrictHostKeyChecking no
IdentityFile ~/.ssh/identity
Port 22
Cipher blowfish
EscapeChar ~
下⾯对上述选项参数逐进⾏解释:
# Site-wide defaults for various options
带“#”表⽰该句为注释不起作,该句不属于配置⽂件原⽂,意在说明下⾯选项均为系统初始默认的选项。

说明⼀下,实际配置⽂件中也有很多选项前⾯加有“#”注释,虽然表⽰不起作⽤,其实是说明此为系统默认的初始化设置。

Host *
"Host"只对匹配后⾯字串的计算机有效,“*”表⽰所有的计算机。

从该项格式前置⼀些可以看出,这是⼀个类似于全局的选项,表⽰下⾯缩进的选项都适⽤于该设置,可以指定某计算机替换*号使下⾯选项只针对该算机器⽣效。

ForwardAgent no
"ForwardAgent"设置连接是否经过验证代理(如果存在)转发给远程计算机。

ForwardX11 no
"ForwardX11"设置X11连接是否被⾃动重定向到安全的通道和显⽰集(DISPLAY set)。

RhostsAuthentication no
"RhostsAuthentication"设置是否使⽤基于rhosts的安全验证。

RhostsRSAAuthentication no
"RhostsRSAAuthentication"设置是否使⽤⽤RSA算法的基于rhosts的安全验证。

RSAAuthentication yes
"RSAAuthentication"设置是否使⽤RSA算法进⾏安全验证。

PasswordAuthentication yes
"PasswordAuthentication"设置是否使⽤⼝令验证。

FallBackToRsh no
"FallBackToRsh"设置如果⽤ssh连接出现错误是否⾃动使⽤rsh,由于rsh并不安全,所以此选项应当设置为"no"。

UseRsh no
"UseRsh"设置是否在这台计算机上使⽤"rlogin/rsh",原因同上,设为"no"。

BatchMode no
"BatchMode":批处理模式,⼀般设为"no";如果设为"yes",交互式输⼊⼝令的提⽰将被禁⽌,这个选项对脚本⽂件和批处理任务⼗分有⽤。

CheckHostIP yes
"CheckHostIP"设置ssh是否查看连接到服务器的主机的IP地址以防⽌DNS欺骗。

建议设置为"yes"。

StrictHostKeyChecking no
"StrictHostKeyChecking"如果设为"yes",ssh将不会⾃动把计算机的密匙加⼊"$HOME/.ssh/known_hosts"⽂件,且⼀旦计算机的密匙发⽣了变化,就拒绝连接。

IdentityFile ~/.ssh/identity
"IdentityFile"设置读取⽤户的RSA安全验证标识。

Port 22
"Port"设置连接到远程主机的端⼝,ssh默认端⼝为22。

Cipher blowfish
“Cipher”设置加密⽤的密钥,blowfish可以⾃⼰随意设置。

EscapeChar ~
“EscapeChar”设置escape字符。

======================================================
⽐如说,A机器的ssh端⼝是22,B机器的端⼝是22222,⼀般来说A机器ssh连接B机器的时候是使⽤-p22222指定端⼝。

但是可以修改A机器的/etc/ssh/ssh_config⽂件中的
Port为22222,这样A机器ssh连接的时候就默认使⽤22222端⼝了。

53
54
55
56
57
-------------------------------------------去掉SSH公钥检查的⽅法(交互式yes/no)------------------------------------------------
SSH公钥检查是⼀个重要的安全机制,可以防范中间⼈劫持等⿊客攻击。

但是在特定情况下,严格的SSH 公钥检查会破坏⼀些依赖SSH协议的⾃动化任务,就需要⼀种⼿段能够绕过SSH的公钥检查。

SSH连接远程主机时,会检查主机的公钥。

如果是第⼀次连接该主机,会显⽰该主机的公钥摘要,弹出公钥确认的提⽰,提⽰⽤户是否信任该主机(Yes/no)。

当选择Yes接受,就会将该主机的公钥追加到⽂件 ~/.ssh/known_hosts 中。

当再次连接该主机时,就不会再提⽰该问题了。

SSH公钥检查有好处,但⾸次连接时会导致某些⾃动化任务中断,或者由于 ~/.ssh/known_hosts ⽂件内容清空,导致⾃动化任务中断。

去掉SSH公钥检查的⽅法:
1)SSH客户端的StrictHostKeyChecking 配置指令,可以实现当第⼀次连接服务器时,⾃动接受新的公钥。

只需要修改 /etc/ssh/ssh_config ⽂件,包含下列语句:
StrictHostKeyChecking no
2)或者在ssh连接命令中使⽤-oStrictHostKeyChecking=no参数
[root@puppet ~]# ssh -p22222 172.168.1.33 -oStrictHostKeyChecking=no
或者
[root@puppet ~]# ssh -p22222 172.168.1.33 -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no
--------------------------------------------ansible中取消ssh交换式yes/no-----------------------------------------------
配置⽂件/etc/ansible/ansible.cfg的[defaults]中(打开注释)
# uncomment this to disable SSH key host checking
host_key_checking = False。

相关文档
最新文档