SSH的全称是Secure Shell,简单说来ssh是一种安全的外壳协议,用于两个计算机间安全的远程登录,说它安全,是由于ssh采用公钥加密的机制。最开始时用做远程管理的工具是telnet,这个协议工做时在网络上传输的数据全是明文,出于安全性的考虑,此协议的使用率愈来愈少。而ssh的安全性使用它成为一种互联网上远程登录主机的解决方案。在windows系统上经常使用到的有Putty、SecureCRT、XManager中的Xshell工具,而XManager工具是我见到的IT工做者中使用频率极高的一个工具,在windows上好像没有ssh协议的服务器端的实现,ssh协议的实现也分为商业的实现和开源的实现,在这里将是对ssh协议的一个开源实现的学习与记录。Openssh便是Linux系统下开源的实现,它开放且免费。linux
从客户端来看,SSH提供两种级别的安全验证。算法
第一种级别(基于用户名和口令的安全验证)只要你知道本身账号和口令,就能够登陆到远程主机。全部传输的数据都会被加密,可是不能保证你正在链接的服务器就是你想链接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。shell
第二种级别(基于密匙的安全验证也叫基于公钥的验证)须要依靠密匙,也就是你必须为本身建立一对密匙,并把公用密匙放在须要访问的服务器上。若是你要链接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求以后,先在你在该服务器的家目录下寻找你的公用密匙,而后把它和你发送过来的公用密匙进行比较。若是两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”以后就能够用你的私人密匙解密再把它发送给服务器。windows
用这种方式,你必须知道本身密匙的口令。可是,与第一种级别相比,第二种级别不须要在网络上传送口令。安全
上述2种方式通常选其一。bash
putty这2种都支持,咱们通常用putty的时候,须要输入用户名和密码,就是基于口令的验证。服务器
其过程:网络
应对中间人攻击,SSH有2种方法应对,一是远程主机把本身的公钥拿到CA处作认证,申请一个数字证书;二是远程主机把本身公钥的指纹信息公布出来,好比公布在网站上,你们均可查看到公钥的指纹信息。这样用户在登录时就能够鉴别主机的真伪了。提取主机的指纹信息的方法以下:dom
[root@Server-A ~]
# ssh-keygen -lf/etc/ssh/ssh_host_dsa_key.pub
102439:61:e5:80:e8:09:b3:83:10:39:c8:b4:5e:ca:45:7e
/etc/ssh/ssh_host_dsa_key
.pub(DSA)
远程主机能够把这个采用dsa算法的指纹信息发布在一个网站上,那我用xshell去远程链接时就可对比一下指纹信息是否是同样,若是是同样的那就能证实我链接的是真实的主机。ssh
在linux下用ssh方式登录另外一linux主机时,若是第一次登录会有以下的提示:
[root@Server-A~]
# ssh 192.168.0.201
Theauthenticity of host
'192.168.0.201 (192.168.0.201)'
can't be established.
RSAkey fingerprint is 4c:a3:2f:29:69:86:f6:0f:38:25:8c:7c:7c:3b:d5:91.
Areyou sure you want to
continue
connecting (
yes
/no
)?
表示的意义与用xshell登录时的提示相同,输入“yes”,再输入远程主机的口令便可登录,登录成功后本地主机会生成“~/.ssh/known_hosts”文件,这文件里保存着远程主机的公钥信息,这样下次再远程登录时就不须要发送公钥信息了,直接输入口令便可。
基于公钥的认证:
基于用户口令的认证方式每次都要求用户提供正确的口令,比较麻烦,且增长了口令泄露的机率。而基于公钥的认证则不须要用户输入口令便可完成远程登录。这种认证方式是这样工做的:用户把本身的公钥存储在远程主机上,在登录时,远程主机向用户发送一段随机字符串,用户用本身的私钥加密这段随机数字,并把加密后的信息发送给远程主机,远程主机用事先存储的公钥来解密这个数据,若是解密成功,则说明请求登录的用户是可信任的,这样就直接容许用户登录,而不要求输入密码了。这种认证方式须要把用户本身的公钥保存到远程主机上。若没有现成的公钥,那就生成:
[root@Server-A~]
# ssh-keygen -t rsa
Generatingpublic
/private
rsa key pair.
Enterfile
in
which
to save the key (
/root/
.
ssh
/id_rsa
):
Enterpassphrase (empty
for
no passphrase):
Entersame passphrase again:
Youridentification has been saved
in
/root/
.
ssh
/id_rsa
.
Yourpublic key has been saved
in
/root/
.
ssh
/id_rsa
.pub.
Thekey fingerprint is:
9b:ef:2c:6a:92:05:c7:f4:4b:b8:4e:b4:ce:05:2f:0croot@Server-A
Thekey's randomart image is:
+--[RSA 2048]----+
| |
| . |
| o o |
| E * o |
| * *S. |
| B +o |
| B oo |
| o = .o |
| o.. o+ |
+-----------------+
[root@Server-A~]
# ls .ssh/
id_rsa id_rsa.pub known_hosts
[root@Server-A ~]
# scp .ssh/id_rsa.pub 192.168.0.201:/root/.ssh/authorized_keys
这里的“authorized_keys”这个文件名不能更改,这是由“/etc/ssh/sshd_config”文件定义的。
测试一下可否不输入密码就能远程登录Server_B主机:
[root@Server-A ~]
# ssh 192.168.0.201
Address 192.168.0.201 maps to bogon, butthis does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[root@Server-B ~]
#
[root@Server-A ~]
# echo"192.168.0.200 Server-A">> /etc/hosts
[root@Server-A ~]
# echo "192.168.0.201 Server-B" >> /etc/hosts
[root@Server-A ~]
# ssh-copy-id root@192.168.0.201
对于openssh,咱们须要关注的配置文件分为两类,一类是公共配置文件,另外一类是私有配置文件。公共配置文件又分为服务端的配件文件和客户端的配置文件。
/etc/ssh/sshd_config #服务端配置文件
/etc/ssh/ssd_config #客户端配置文件
~/.ssh/* #私有配置文件
咱们主要关注的是服务端的配置文件和私有配置文件。
SSH的配置文件主要分为服务器端和客户端:
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
|
服务器端: /etc/ssh/sshd_config
客户端: /etc/ssh/ssh_config
1.限制root用户远程登陆
# vi /etc/ssh/sshd_config
PermitRootLogin no
2.经过控制用户访问限制 SSH 访问
# vi /etc/ssh/sshd_config
AllowUsers fsmythe bnice swilson
DenyUsers jhacker joebadguy jripper
3. # vi /etc/ssh/sshd_config
Protocol 2
4.不要支持闲置会话,并配置 Idle Log Out Timeout 间隔:
#当客户端连上服务器端后,若没有任何操做则,服务器端默认会
#每隔必定时间发送一个alive消息给客户端寻求客户端应答,
#默认一共发三次.若都没有回应,则断开连其中
#ClientAliveInterval设置每隔多少秒发送一次alive消息
#ClientAliveCountMax 设置一共发多少次.
# vi /etc/ssh/sshd_config
ClientAliveInterval 600
# (Set to 600 seconds = 10 minutes)
ClientAliveCountMax 0
5.禁用基于主机的身份验证:(这种认证方式是不安全的)
# vi /etc/ssh/sshd_config
HostbasedAuthentication no
6.使用 Chroot SSHD 将 SFTP 用户局限于其本身的主目录
# vi /etc/ssh/sshd_config
ChrootDirectory /home/ %u
7.禁用空密码:
# vi /etc/ssh/sshd_config
PermitEmptyPasswords no
8.指令压缩
Compression { yes |no|delayed}
#默认是delayed 意思就是等到用户认证结束后再对数据进行压缩
9.设置日志级别
#LogLevel INFO 默认是INFO级别,调试的时候能够选择DEBUG
#级别,这样调试信息更加详细
10.支持图形界面操做
X11Forwarding yes
#对Xwindows的数据进行转发,开启该项并使用xshell程序远程登
#录服务器是能够打开图形界面程序
|
其它选项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
PrintMotd no
# 登入后是否显示出一些信息呢?例如上次登入的时间、地点等,预设是 yes ,可是,若是为了安全,能够考虑改成 no !
PrintLastLog yes
# 显示上次登入的信息!能够啊!预设也是 yes !
KeepAlive yes
# 通常而言,若是设定这项目的话,那么 SSH Server 会传送
# KeepAlive 的讯息给 Client 端,以确保二者的联机正常!
# 在这个状况下,任何一端死掉后, SSH 能够马上知道!而不会
# 有僵尸程序的发生!
Banner /to/somefile
# 指定在用户完成认证前输出到终端的信息
GSSAPIAuthentication no
#指定是否使用基于GSSAPI的用户认证默认为no
MaxAuthTries 默认值为6
#每个连接最多尝试验证的次数为这个值得一半,此外失败的信息还会记录在/var/log/message
UseDNS yes
#是否对主机名进行dns解析(经常使用与没有固定IP只有域名的场合)
|
1.生成密钥(客户端操做)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@wwww ~] # ssh-keygen -t rsa -b 4096
#-t 指定生成密钥的算法 -b指定密钥的位数
Generating public /private rsa key pair.
Enter file in which to save the key ( /root/ . ssh /id_rsa ):
#询问生成的密钥放在的位置,默认放在家目录下的.ssh目录
Enter passphrase (empty for no passphrase):
#询问是否对私钥再进行加密
Enter same passphrase again:
Your identification has been saved in /root/ . ssh /id_rsa .
Your public key has been saved in /root/ . ssh /id_rsa .pub.
The key fingerprint is:
e7:60:45:fe:d8:09:24:c1:1e:ef:35:cc:c1:c3:24:e4 root@wwww.axhu.com
#生成的指纹信息
|
注: 这里使用ssh-keygen -t rsa -b 4096 -f /path/to/KEY_FILE -P '指定加密私钥的密码' 这样既可实现自动化,不要交互了
2.传送密钥至远程服务器
有两种实现方式:
方式一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@wwww ~] # scp ~/.ssh/id_rsa.pub root@192.168.157.132:~/
The authenticity of host '192.168.157.132 (192.168.157.132)' can't be established.
RSA key fingerprint is 6e:0f:f8:f8:c7:c2:11:e6:4d:99:aa:16:6a:81:4a:02.
Are you sure you want to continue connecting ( yes /no )? yes
Warning: Permanently added '192.168.157.132' (RSA) to the list of known hosts.
root@192.168.157.132's password:
id_rsa.pub 100% 740 0.7KB /s 00:00
而后远程链接到远程主机进行设置:
[root@wwww ~] # ssh root@192.168.157.132
root@192.168.157.132's password:
Last login: Sat Jan 18 21:16:49 2014 from 192.168.157.128
[root@bogon ~] # mkdir .ssh
#这个目录默认不存在,可是这太机子若链接过其余服务器就会自动生成.ssh目录用来保存known_hosts文件
[root@bogon ~] # chmod 700 .ssh
#这个权限很重要,设置不对的话是无法经过验证
[root@bogon ~] # cat id_rsa.pub >> ~/.ssh/authorized_keys
#这里最好每次都是以>>追加的形式输出,否则会覆盖其余主机的公钥
[root@bogon ~] # chmod 600 ~/.ssh/authorized_keys
#修改权限放在其余用户修改查看
到此配置完成
|
方式二:
1
2
3
4
5
6
|
[root@wwww ~] # ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.132
root@192.168.157.132's password:
Now try logging into the machine, with "ssh 'root@192.168.157.132'" , and check in :
. ssh /authorized_keys
to make sure we haven 't added extra keys that you weren' t expecting.
#直接经过命令完成.推荐使用,可是并非每台机器上都会装有这个命令.
|