对于Linux运维人员来说,使用ssh远程服务器是再熟悉不过了! ssh的一些严格设置也与服务器的安全维护有关。今天根据自己在工作中使用ssh的经历做一些总结记录。

-bash:ssh:找不到命令
解决方案:“yum install -y openssh-server openssh-clinets”

?卸载 sshd 并重新安装
# yum remove openssh*
# rm -rf /etc/ssh*
# yum install -y openssh*
# systemctl start sshd.service

2。 ssh远程登录后的提示信息
我们经常使用中控机信任ssh跳转到其他机器,但不知道有运维朋友有没有注意到ssh跳转成功后的终端显示。提示消息?
这些提示信息是为了方便我们第一时间知道ssh跳转到哪台目标机器,避免长时间频繁跳转后因不小心而误入机器操作的风险。我们通常跳转到 ssh 到目标机器后,会显示一些提示信息。 在某些国家/地区,未经授权或用户监视警告消息会在登录给定系统之前发出,这将受到法律保护。如下:
[ root@bastion-IDC ~]# ssh -p22 192.168.1.15
最后登录:2016年7月15日星期五13:26:53从124.65.197.154
======= =============================
||||||||||||||||||| |||||| |||||||||
========================================
主机名:监控服务器
IP地址:192.168.1.15
================================= === =
IDC监控机
======================================= =

那么上面的提醒信息是在哪里设置的呢?
方法一:其实很简单。此信息在目标机器的 /etc/motd 文件中自定义
[root@monit-server ~]# cat /etc/motd
==== =========== ====================
|||||||||||||| |||||||||||||||||
============================== = ======
主机名:监控服务器
IPADDRES:192.168.1.15
========================== = =========
IDC监控机
================================= = =====

方法二:在目标机的/etc/ssh/sshd_config文件中定义,然后重启sshd服务。这两种方法的效果是一样的!
横幅 /etc/sshfile

[root@host-192-168-1-117 ~]# cat /etc/sshfile
这是 192.168.1.117

远程登录:
[root@linux-node2 ~]# ssh 192.168.1.117
这是192.168.1.117
[root@host-192-168-1-117 ~ ]#

3。实现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_www.sxzhongrui.com、id_rsa。您可以将id_www.sxzhongrui.com公钥文件复制到authorized_keys中
2) 步骤2:您可以手动将本地机器的id_www.sxzhongrui.com公钥文件内容复制到远程目标机器的.ssh/authorized_keys文件中。这是可以实现的。 SSH 登录无需密码。
当然也可以在本地机器直接使用ssh-copy-id将公钥复制到远程机器
#ssh-copy-id -i /root/.ssh/id_www.sxzhongrui.com user @ip 【把本地机器的公钥复制到远程机器,比如机器B】
也可以不添加公钥路径,还有
#ssh-copy-id user@ip
注意:
ssh-copy-id 将密钥写入 ~/.ssh/authorized_key。文件(该文件将自动创建)在远程计算机上

对于非22端口(比如22222)下ssh-copy-id的使用,需要这样使用:
# ssh-copy-id -i /root/.ssh/id_www.sxzhongrui.com '-p 22222 root@192.168.18.18'

3)这样登录远程机器(B机器)时就不需要输入密码了
#ssh user@ip

?先登录B机器,然后从B机器跳转到A机器。
脚本如下:
localhost:~ root# cat www.sxzhongrui.com
#!/bin/bash
ssh root@101.201.114.106“ssh -p25791 root@103.10.86.7”

但是执行脚本时,报如下错误:
伪终端不会被分配,因为stdin

原因:
由于标准输入不是终端,因此不会分配伪终端。
解决方案:
需要添加-t -t参数来强制伪终端分配,即使标准输入不是终端。 “ ssh -t -t -p25791 root@103.10.86.7”


localhost:~ root# cat www.sxzhongrui.com
#!/bin/bash
ssh -t root@101.201.114.106 "ssh -t -t -p25791 root@ 103 .10. 86.7英寸

? 然后重启sshd服务!

?对于yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys,在其前面添加#以阻止
PasswordAuthentication no,并将其更改为yes
最后重新启动sshd服务!

7。 SSH 连接错误问题
1) 使用 ssh 或 scp 或 rsync 远程连接时,出现以下错误消息:
Address **** 映射到 localhost,但这不会映射回该地址 - POSSIBLE BREAK -IN ATTEMPT!
解决方案:
修改本地 ssh_config 文件
[root@kvmserver ~]# vim /etc/ssh/ssh_config
GSSAPIAuthentication no
[root@kvmserver ~]#/ etc/init.d/sshd restart

问题解决了~~

?原因:远程机器上没有安装scp或rsync造成的!只需安装这两个命令即可~
yum install openssh-clients
yum install rsync


下面介绍三种防止超时被踢出的方法,后两种情况如何设置,以及如何通过设置shell变量来达到这个目的:


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服务
# /etc/init.d/ssh restart

2、配置客户端
#vim /etc/ssh/ssh_config
,找到
ServeraliveInterval(不用你,自己加一个就可以了,参数含义是一样的,都是秒,比如5分钟等
ServerAliveInterval 300

3。 # echo 导出 TMOUT=1000000 >> /root/.bash_profile; source .bash_profile
在Linux终端的shell环境中,设置环境变量TMOUT以防止超时。如果为空,则表示没有设置,相当于使用默认值0,一般应该不会超时。如果大于0,可以在/etc/profile等文件中设置为0。

9。 SSH远程登录,公钥授权失败:Permission returned (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]#服务sshd重启

修改后,其他机器可以通过SSH互相登录。当时我并没有在意,以为一切都好。
但是,第二天,当我再次通过ssh登录时,却收到错误消息~~
权限被拒绝(publickey,gssapi-keyex,gssapi-with-mic)。

最后我发现都是selinux惹的祸!只需将其关闭即可。 ?
[ root@bastion-IDC ssh]# vim /etc/sysconfig/selinux
SELINUX=disabled
[root@bastion-IDC ssh]#reboot #重启系统生效

注:
1)SSH 可以支持公钥和密码两种授权方式。 Publickey默认不启用,需要配置为yes。
如果客户端不存在.ssh/id_rsa,则使用密码授权;如果存在,则使用公钥授权;如果公钥授权失败,则继续使用密码授权。

2) GSSAPI 身份验证。
GSSAPIAuthentication 是否允许基于GSSAPI的用户认证。默认值为“否”。仅用于 SSH-2。
GSSAPICleanupCredentials 是否在用户注销缓存后自动销毁用户凭据。默认值为“是”。仅用于 SSH-2。
需要注意的是:
GSSAPI 是公安事务应用编程接口(GSS-API)
公安事务应用编程接口是一个统一的模型为用户提供安全交易。因为它支持最基本的机制和技术,所以保证了在不同应用环境下的可移植性。
该规范定义了GSS-API事务和基本元素,并且独立于基本机制和编程语言环境,并借助其他相关文档规范来实现。

如果我们在服务器上打开GSSAPIAuthentication配置项,如下:
[root@server ~]#vim /etc/ssh/sshd_config
...
GSSAPIAuthentication yes GSSAPICleanupCredentials是的

那么客户端登录服务器时,会使用gssapi-keyex和gssapi-with-mic进行身份验证。客户端也必须支持这种身份验证,如下:

[root@client ~]#vim /etc/ssh/ssh_config
GSSAPIAuthentication 是
GSSAPIDelegateCredentials 是

我们按如下方式连接到客户端上的 SSH 服务器:
ssh -v 192.168.1.11
........................
debug1:可以继续的身份验证: publickey,gssapi-keyex,gssapi-with-mic,password
debug1:可以继续的身份验证:publickey,gssapi-keyex,gssapi-with-mic,password
debug1:可以继续的身份验证:publickey,gssapi- keyex,gssapi-with-mic,password
debug1:可以继续的身份验证:publickey,gssapi-keyex,gssapi-with-mic,password

我们看到以下信息:
debug1:未指定的 GSS 故障。小代码可能会提供更多信息
未找到凭据缓存
debug1:可以继续的身份验证:publickey,gssapi-keyex,gssapi-with-mic,password
debug1:下一个身份验证方法:gssapi-keyex
debug1: No valid Key Exchange context
说明 SSH 登录时使用 GSSAPI 进行身份验证,但我们的系统不支持。

最后,如果我们不使用该方式进行验证,建议关闭该选项,这样可以提高验证的速度。

10。 ssh自定义安全设置
1)为了在ssh登录时增加一层保护,可以修改默认端口。修改ssh服务配置文件/etc/ssh/sshd_config
端口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:全部:拒绝

4)仅允许特定用户通过SSH登录
例如不允许root用户登录;
只允许少数指定用户登录(如王世博、郭慧慧、流星用户)
禁止某些指定用户登录(如zhangda、liqin用户)
但请注意:设置users 必须在本机和对方机器上都存在
修改 ssh 服务配置文件 /etc/ssh/sshd_config
PermitRootLogin no //修改 yes 为 no
AllowUsers wangshibo guohuihui liuxing //如果该参数AllowUsers不存在,需要手动创建,用户之间用空格分隔
DenyUsers zagnda liqin //如果该参数DenyUsers不存在,需要手动创建,用空格分隔

您还可以设置只允许某个组的成员通过ssh访问主机。
允许群组轮式操作

描述示例:

1)仅允许指定用户登录(白名单):
在 /etc/ssh/sshd_config 配置文件中设置AllowUsers 选项。格式如下:
允许用户 root Grace kevin 应用程序
表示仅允许grace和kevin用户通过ssh登录机器。
允许用户 root@192.168.10.10 app@192.168.10.11 kevin@192.168.10.13
表示仅允许192.168.10.10登录的root用户、192.168.10.11登录的app用户、192.168.10.13登录的kevin用户通过ssh登录机器。
2) 只拒绝指定用户登录(黑名单):)
在 /etc/ssh/sshd_config 配置文件中设置 DenyUsers 选项。格式如下:
DenyUsers wangbo linan zhangyang
表示拒绝用户wangbo、linan、zhangyang通过ssh登录机器。
必须要注意的是:- 使用TAB键分隔AllowUsers、DenyUsers和后续配置。
- 用空格分隔数百个列表或黑名单
例子:
[root@Centos6 ~]# cat /etc/ssh/sshd_config
…………
允许用户 root@192.168.10.202 app@192.168.10.200 kevin@192.168.10.202
[root@Centos6 ~]# /etc/init.d/sshd restart
[root@Centos6 ~]# cat /etc/ssh/sshd_config
…………
允许用户 root 应用程序 kevin
[root@Centos6 ~]# /etc/init.d/sshd restart
[root@Centos6 ~]# cat /etc/ssh/sshd_config
…………
DenyUsers wangbo linan zhangyang
[root@Centos6 ~]# /etc/init.d/sshd restart
如下图,由于已经允许app和root登录,所以后续对root@192.168.10.202和app@192.168.10.200的限制无效(不要配置在一起)
[root@Centos6 ~]# cat /etc/ssh/sshd_config
…………
允许用户 app root root@192.168.10.202 app@192.168.10.200
[root@Centos6 ~]# /etc/init.d/sshd restart

########也可以使用pam规则来限制ssh登录########

1)允许指定用户(如kevin和grace账户)登录
将其添加到 /etc/pam.d/sshd 文件的第一行。它必须在第一行,因为规则是从上到下匹配的。
需要身份验证 pam_www.sxzhongrui.com item=user sense=allow file=/etc/sshusers onerr=fail然后在/etc下创建sshusers文件,编辑该文件,添加你允许使用ssh服务而无需重新启动sshd服务的用户名。
最后,重新启动sshd服务!
操作方法如下:
[root@docker-test1 ~]# vim /etc/pam.d/sshd
#%PAM-1.0
需要身份验证 pam_www.sxzhongrui.com item=user sense=allow file=/etc/sshusers onerr=fail
…………
[root@docker-test1 ~]# touch /etc/sshusers
[root@docker-test1 ~]# vim /etc/sshusers
凯文
优雅
[root@docker-test1 ~]# /etc/init.d/sshd restart
2)pam规则也可以写成deny。例如,拒绝 kevin 和 Grace 帐户登录。
操作方法如下:
[root@docker-test1 ~]# vim /etc/pam.d/sshd
#%PAM-1.0
需要身份验证 pam_www.sxzhongrui.com item=user sense=deny file=/etc/sshusers onerr=succeed
…………
[root@docker-test1 ~]# touch /etc/sshusers
[root@docker-test1 ~]# vim /etc/sshusers
凯文
优雅
[root@docker-test1 ~]# /etc/init.d/sshd restart
3)pam规则可以使用组限制。
允许规则:
需要身份验证 pam_www.sxzhongrui.com item=group sense=allow file=/etc/security/allow_groups onerr=fail
禁止规则:
需要身份验证 pam_www.sxzhongrui.com item=group sense=deny file=/etc/security/deny_groups onerr=succeed
操作方法如下:[root@docker-test1 ~]# vim /etc/pam.d/sshd
#%PAM-1.0
需要身份验证 pam_www.sxzhongrui.com item=group sense=allow file=/etc/security/allow_groups onerr=fail
创建一个名为bobo的新组,然后将kevin和grace添加到这个bobo组中
[root@docker-test1 ~]# groupadd bobo
[root@docker-test1 ~]# gpasswd -a kevin bobo
将用户 kevin 添加到组 bobo
[root@docker-test1 ~]# usermod -G bobo Grace
[root@docker-test1 ~]# id 凯文
uid=1000(kevin) gid=1000(kevin) groups=1000(kevin),1002(bobo)
[root@docker-test1 ~]# id Grace
uid=1001(grace) gid=1001(grace) groups=1001(grace),1002(bobo)
在/etc/security/allow_groups文件中添加组名(注意如果不添加root,将不允许root登录)
[root@docker-test1 ~]# vim /etc/security/allow_groups
波波
[root@docker-test1 ~]# /etc/init.d/sshd restart
经过以上设置后,就只能允许kevin用户登录了!
如果是禁止规则,请将第一行更改为以下内容:
需要身份验证 pam_www.sxzhongrui.com item=group sense=deny file=/etc/security/deny_groups onerr=succeed

另外,部分用户被禁止ssh登录。您可以使用passwd或usermod命令锁定帐户

6) 为帐户设置强密码:只需将密码保存到文本中并复制粘贴即可
# yum -y install Expect
# mkpasswd -l 128 -d 8 -C 15 -s 10
lVj.jg&sKrf0cvtgmydqo7qPotxzxen9mefy?ej!kcaX2gQrcu2ndftkeamllznx>iHikTagi Vz0$cMtqOcIypkpd,v vD*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针对客户端的配置文件:

[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端口了。

########  去掉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

########  ssh 登陆忽略known_hosts文件  ########
使用ssh登录远程机器,同时会把ssh信息记录在本地的~/.ssh/known_hsots文件中。如果出现ssh冲突了,需要手动删除或修改known_hsots里面对应远程机器的ssh信息。那么如果忽略掉这个known_hosts的访问? 操作如下:
1)修改/etc/ssh/sshd_config 配置文件中的选项 IgnoreUserKnownHosts 改成 yes,重启sshd服务即可。
2)如果还是不行,就在/etc/ssh/sshd_config 配置文件中再加入一下几行,然后再重启sshd服务。
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

########  ansible中取消ssh交换式yes/no  ########
配置文件/etc/ansible/ansible.cfg的 [defaults] 中(打开注释)
# uncomment this to disable SSH key host checking
host_key_checking = False

########  ssh只允许使用key登录, 禁止使用密码登录  ########
1)  生产公私钥文件
# ssh-keygen -t rsa
上面命令一路回车, 此时在/root/.ssh/目录下生成了2个文件,id_rsa为私钥,id_www.sxzhongrui.com为公钥。
私钥自己下载到本地电脑妥善保存(丢了服务器可就没法再登陆了),为安全,建议删除服务器端的私钥。公钥则可以任意公开。

使用以下命令将公钥导入到系统中:
# cat /root/.ssh/id_www.sxzhongrui.com >> /root/.ssh/authorized_keys

2)  修改SSH的配置文件/etc/ssh/sshd_config 
# vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

#默认PasswordAuthentication 为yes,即允许密码登录,改为no后,禁止密码登录
PasswordAuthentication no

3)  重启SSH服务
# /etc/init.d/sshd restart

4)  使用私钥登录xshell或securecrt客户端了

########  SSH服务启动报错案例  ########
在某台服务器上部署了sftp服务,最后发现sftp远程登录正常,但是ssh远程登录失败(尽管已经输入了正确的用户名和密码)。

[root@kevin ssh]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd:/etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication
/etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials
Starting sshd: [ OK ]
如上启动后,远程ssh登录这台机器,输入正确的用户名和密码,则会登录失败!!
[root@kevin ssh]# ssh -V
OpenSSH_7.6p1, OpenSSL 1.0.1e-fips 11 Feb 2013
原因是新版本的openssh不支持以上参数,需要修改sshd的配置文件。
修改内容如下,否则还是无法通过ssh登录这台服务器:
[root@kevin ssh]# vim /etc/ssh/sshd_config
.......
##去掉前面的注释,允许root通过ssh登录
PermitRootLogin yes
##注释掉下面三个参数
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
#UsePAM yes
再次重启ssh,上面的报错信息就没有了。此时远程ssh登录就OK了!
[root@kevin ssh]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]

########  SSH连接超时时间(timed out)设置  ########

1)使用下面命令连接,可以减少ssh连接超时等待的时间
# ssh -o ConnectTimeout=5 -p22 root@172.16.60.20
或者修改sshd_config文件里面的UseDNS 选项,改为UseDNS no
2)设置SSH超时时间的方法
# vim /root/.bash_profile
export TMOUT=1000000     #以秒为单位。或者修改/etc/profile文件也可以。
# source /root/.bash_profile
# vim /etc/ssh/sshd_config
ClientAliveInterval=60
# service sshd restart
意思是每过一分钟,sshd都会和ssh client打个招呼 (即服务器端给客户端发送一个"空包"),检测它是否存在,如果不存时则断开连接!
这里需要注意: 设置完成后,要退出ssh远程连接,再次登录后才可以生效。因为要再读取一次~/bash_profile文件。
总结:
在ClientAliveInterval(/etc/ssh/sshd_config)、环境变量TMOUT(在/etc/profile或.bash_profile中设置)以及putty的"Seconds between keepalives"(默认为0)这些设置方法中,
经检测验证,只有TMOUT可以控制ssh连接在空闲时间超时,自动断开连接的时间,数字单位为"秒"。在设置了TMOUT后(非0),另外两个变量则不起作用的。
另外,特别提醒的是,设置好ssh的登录超时时间以后,记得退出重新登录或重启系统,以使配置生效。
3)SSH禁止超时设置
SSH默认过一段时间会超时,有时候正在执行着脚本,出去一会回来就断开了,输出信息都看不到了,很是无奈!
其实禁止SSH自动超时最简单的办法就是:每隔一段时间在客户端和服务器之间发送一个"空包"!!!!!
至于到底是从客户端发给服务器,还是服务器发给客户端其实都不重要,重要的是需要它们之间要有通信。
下面介绍两种阻止SSH连接超时的方法(推荐方法二):
方法一:客户端阻止SSH超时
编辑本地的SSH配置文件:~/.ssh/config
# vim ~/.ssh/config
ServerAliveInterval 120
这个设置会让客服端机器在使用SSH连接服务器时,每隔120秒给服务器发送一个"空包",保持它们之间的连接。
方法二:服务器端阻止SSH超时
如果有服务器端的root权限,可以在服务端进行配置,这样就不需要每个客户端都单独配置。
# vim /etc/ssh/sshd_config
ClientAliveInterval 120
ClientAliveCountMax 720
第一行,表示每隔120秒向客户端发送一个"空包",以保持于客户端的连接。
第二行,表示总共发送720次"空包",之后断开它们之间的连接,也就是:120秒 × 720 = 86400 秒 = 24小时 后。
最后重启sshd服务,再打开新终端进行ssh连接就可以了,在24小时内不会出现连接超时。
# /etc/init.d/ssh restart

######## SSH公钥下发无效 ########
ssh的.pub公钥已经拷贝到远程主机的.ssh/authorized_keys文件里,但是ssh跳转时,仍然要输入密码!!即公钥下发后,ssh信任关系没有生效!

解决办法:
1)远程主机对应用户家目录下的.ssh目录必须是700或755权限,绝不能是775或777权限!即只对该用户有写权限!(一般设置700权限)
2)远程主机对应用户家目录下的.ssh/authorized_keys文件权限必须是600权限!即只对该用户有写权限!(一般设置600权限)
3)远程主机对应用户家目录的权限必须是700或755权限,绝不能是775或777权限!即只对该用户有写权限!(一般设置700权限),大多数情况下都是由于这个原因导致的!!!
如果.ssh目录和.ssh/authorized_keys文件权限对别的用户有写权限,则就会导致ssh认证失败!
=====================================================================================================
例如在一次ansible自动化部署中,之前配置好的ssh信任关系失效,报错如下:
{"changed": false, "msg": "SSH Error: data could not be sent to remote host \"172.16.60.240\". Make sure this host can be reached over ssh", "unreachable": true}
查看现象,发现之前配置好的ssh信任关系失效了!!
[root@bz3devjenci1002 lx0319]# ssh -p22 kevin@172.16.60.240
Authorized only. All activity will be monitored and reported
kevin@172.16.60.240's password:
分析原因及解决办法:
登录172.16.60.240这台机器的kevin用户下,发现authorized_keys文件里确实已经传入了ansible主节点的id_www.sxzhongrui.com公钥内容,并且下面两个权限都正确:
[kevin@bz4autestap1002 ~]$ ll -d .ssh
drwx------ 2 kevin kevin 4096 Jul 24 10:48 .ssh         #700权限是正确的
[kevin@bz4autestap1002 ~]$ ll .ssh/authorized_keys
-rw------- 1 kevin kevin 2412 Jul 24 10:45 .ssh/authorized_keys     #600权限也是正确的
然后查看kevin用户目录权限,发现是777!这才是问题根源!该用户目录权限不能对别的用户有写权限,否则会造成ssh认证失败!
[kevin@bz4autestap1002 ~]$ ll -d /home/kevin
drwxrwxrwx 14 kevin kevin 4096 Jul 24 10:48 /home/kevin
修改为600权限即可
[kevin@bz4autestap1002 ~]$ chmod 600 /home/kevin
[kevin@bz4autestap1002 ~]$ ll -d /home/kevin
drwx------ 14 kevin kevin 4096 Jul 24 10:48 /home/kevin
再次在远程尝试ssh认证跳转
[root@bz3devjenci1002 lx0319]# ssh -p22 kevin@172.16.60.240
[kevin@bz4autestap1002 ~]$

########  Centos7修改ssh默认端口的方法  ########

CentOS 7 对于防火墙这一块的设置有一定的修改,修改ssh端口后,必须关闭防火墙和selinux之后才能正常重启sshd服务,否则启动失败。操作记录如下:
1)修改/etc/ssh/sshd_config                         #这个是修改ssh服务端配置文件。
[root@k8s-master01 ~]# vim /etc/ssh/sshd_config
.........
#Port 22         #这行最好去掉#号,防止配置失效以后不能远程登录,还得去机房修改,等修改以后的端口能使用以后在注释掉
Port 6666       #下面添加这一行
[root@k8s-master01 ~]# vim /etc/ssh/ssh_config    #这个是修改ssh客户端配置文件,一般可以不用修改。
........
#   Port 22
Port 6666
======================================================================================================
ssh客户端配置文件使用场景:
比如A机器的/etc/ssh/ssh_config客户端配置文件的ssh端口是22,B机器的/etc/ssh/sshd_config服务端配置文件是6666
那么A机器ssh连接B机器时就要带上"-p6666", 如果A机器的ssh客户端配置文件的端口也是6666的话,就可以直接ssh连接B机器了。
======================================================================================================
2)要关闭防火墙和selinux。否则,centos7修改ssh端口后会启动sshd服务失败!一定要注意这个!
[root@k8s-master01 ~]# systemctl disable firewalld
[root@k8s-master01 ~]# systemctl stop firewalld
[root@k8s-master01 ~]# firewall-cmd --state
not running
[root@k8s-master01 ~]# cat /etc/sysconfig/selinux
.......
SELINUX=disabled
[root@k8s-master01 ~]# setenforce 0
[root@k8s-master01 ~]# getenforce
Disabled
这样,在修改ssh端口后,就能顺利启动sshd服务了!
======================================================================================================
这里还需要注意下:如果是打开了防火墙或selinux,则需要将修改的sshd端口添加到对应的防火墙规则中(默认只加了ssh的22端口)
a)firewalld配置
添加到防火墙:
# firewall-cmd --zone=public --add-port=6666/tcp --permanent (permanent是保存配置,不然下次重启以后这次修改无效)
重启:
#firewall-cmd --reload
查看添加端口是否成功,如果添加成功则会显示yes,否则no
# firewall-cmd --zone=public --query-port=6666/tcp
b)selinux配置
使用以下命令查看当前SElinux 允许的ssh端口:
# semanage port -l | grep ssh
添加6666端口到 SELinux
# semanage port -a -t ssh_port_t -p tcp 6666
然后确认一下是否添加进去
# semanage port -l | grep ssh
如果成功会输出
ssh_port_t                    tcp    6666, 22
c)然后就可以顺利启动sshd服务了。