ssh服务学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ssh服务学习笔记相关的知识,希望对你有一定的参考价值。

  1. ssh服务介绍

  2. ssh加密技术

  3. ssh服务认证两种类型

  4. ssh连接慢的问题


1. ssh介绍

    ssh服务监听本地22端口,服务端是sshd守护进程.

    客户端一般是 CRT,Xshell,putty或者ssh客户机

   

    默认情况下,ssh服务主要提供2个服务功能:

    一个是类似于Telnet远程连接服务,

    一个类似于FTP服务的sftp-server,借助ssh协议来传输数据.

        特别提醒: ssh客户端(ssh命令)还包含一个很有用的远程安全copy命令scp,也是通过ssh协议工作的.


 2.ssh加密技术

      ssh服务分为ssh1.x 和 ssh2.x

      ssh2支持RSA和DSA密钥,ssh1只支持RSA算法


3. ssh服务认证两种方式

  一  基于口令的认证

      通过IP+ssh端口,连接到服务端,此联机过程是加密的.

 命令如下:

用法一: 连接远端服务器
ssh -p22 [email protected]
  参数 -p 指定端口,默认22


用法二: ssh连接过去不登录shell,只执行命令:
ssh -p 22 [email protected] /usr/bin/free -m
      ###如果指定了命令,则在远程主机上执行而不是登录shell。

 第一次建立连接: 

       会出现下面警告信息,但是连接建立后,会把对端服务器key相关信息保存在本地当前用户家目录下的~/.ssh/known_hosts ,下次连接就不会再有警告信息.

[root @ promotion]#ssh [email protected]
主机‘192.168.255.135(192.168.255.135)‘的真实性无法建立。
ECDSA键指纹是aa:91:fb:b7:ea:7b:9c:7b:b0:61:77:e3:c7:09:c5:3f。
您确定要继续连接(是/否)? 是
警告:将“192.168.255.135”(ECDSA)永久添加到已知主机列表中。
[email protected]的密码:

[[email protected] .ssh]# cat known_hosts 
192.168.255.134 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFI97sX7x2jd4SijuJquXhfXcExsh9d71Nxt1F9tyeyXcQL1CkTNsyIV4reJkYdQsnHRSzsFRB7oUZHbMyqFN8g=
192.168.255.135 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFI97sX7x2jd4SijuJquXhfXcExsh9d71Nxt1F9tyeyXcQL1CkTNsyIV4reJkYdQsnHRSzsFRB7oUZHbMyqFN8g=

二  基于密钥对的安全认证


原理:

  1.本地生成一对密钥对,公私钥,然后把公钥放到要访问的目标服务器上,另外还需要把私钥放到ssh客户端或对应的客户端机器上.

 2. 此时,如果想要连接到这个带有公钥的ssh服务器,客户端ssh软件或客户端服务器就会向ssh服务器发送请求,请求用联机的用户密钥进行安全验证,ssh服务器收到请求后,会先在该ssh服务器上连接的用户的家目录下寻找放上去的对应用户的公钥,然后就把它和连接的ssh客户端发送过来的公钥进行比较,如果一致,ssh服务器就用公钥加密"质询"并发给ssh客户端.

3.ssh客户端收到 质询后,就可以用自己的私钥解密,然后再把它发送给ssh服务器,使用这种方式,需要知道联机用户的密钥文件,与第一种基于口令验证的方式相比,第二种方式不需要在网络上传动口令密码,所以安全性就更高了.


命令如下:

第一步:生成公私钥

ssh-keygen -t rsa
    参数:-t 指定加密算法  有 rsa ,dsa
 此命令会生成一对公私钥在~/.ssh/目录下,即id_rsa(私钥,保留在客户端)  id_rsa.pub(发送给服务端)
   
 
[[email protected] ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
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:
65:92:5b:89:71:bc:2e:3b:c2:9c:a1:7c:9e:42:eb:8d [email protected]
The key‘s randomart image is:
+--[ RSA 2048]----+
|        ...      |
|         =..     |
|        + =.     |
|         *.      |
|        S.       |
|    . . . .      |
|   o = o o       |
|    =o*.o        |
|   .E++. .       |
+-----------------+
[[email protected] .ssh]# ls
id_rsa  id_rsa.pub  known_hosts

第二步:将公钥发给服务端,然后ssh对端主机就不需要输入密码了.
ssh-copy-id 192.168.255.134

[[email protected] .ssh]# ssh-copy-id 192.168.255.134
The authenticity of host ‘192.168.255.134 (192.168.255.134)‘ can‘t be established.
ECDSA key fingerprint is aa:91:fb:b7:ea:7b:9c:7b:b0:61:77:e3:c7:09:c5:3f.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]‘s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ‘192.168.255.134‘"
and check to make sure that only the key(s) you wanted were added.

[[email protected] .ssh]# ssh 192.168.255.134
Last login: Sun Oct  1 05:04:44 2017 from 192.168.255.1
[[email protected] ~]# 


第三步:设置服务器只允许密钥验证,拒绝口令验证方式
[[email protected] ~]# vim /etc/ssh/sshd_config 
 ………………省略部分输出信息………………
 74 
 75 # To disable tunneled clear text passwords, change to no here!
 76 #PasswordAuthentication yes
 77 #PermitEmptyPasswords no 
 78 PasswordAuthentication no   #改为no即可
 79 
 ………………省略部分输出信息………………
[[email protected] ~]# systemctl restart sshd

注意:  ssh-copy-id的特殊用法

 1. 如果ssh端口修改了,如23456端口,那么用上面的命令就无法进行分发密钥了,

解决办法:  ssh-copy-id -i ./id_dsa.pub "-p 23456 [email protected]

注意要用双引号" " 把端口和用户和ip引起来.


ssh-copy-id的原理:

ssh-copy-id -i ./id_dsa.pub [email protected]
就是把 ~/.ssh/id_dsa.pub复制到 对端用户下的.ssh目录(提前创建)下 ,并做了更改名字的操作,
名字改为authorized_keys ,并且权限变为600.

[[email protected] .ssh]# ll
total 8
-rw-------  1 root root 391 Oct  1 05:23 authorized_keys
-rw-r--r--. 1 root root 527 Oct  1 05:03 known_hosts
[[email protected] .ssh]# 

也就是说,你直接用其他方法,把客户端的公钥传到服务端对应的.ssh/目录下,并改名为authorized_keys,
并且修改权限为600,也就可以实现无密码登录了.

为什么要改为这个名字呢?这个需要看ssh配置文件了cat /etc/ssh/sshd_config | grep authoried_keys
AuthorizedKeysFile      .ssh/authorized_keys


4. ssh连接慢的问题:

使用 ssh -v 192.168.255.134 显示连接过程
查看连接过程.
有效解决办法:
1. 修改本地hosts文件,把目标机器的ip和域名加上去
2. 修改本地客户端配置文件 ssh_conf
找到
GSSAPIAuthentication yes
改为
GSSAPIAuthentication no
保存。
GSSAPI ( Generic Security Services Application Programming Interface) 是一套类似Kerberos 5 
的通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,
降低编程难度。但该接口在目标机器无域名解析时会有问题。我看到有人给ubuntu提交了相关bug, 
说要将GSSAPIAuthentication的缺省值设为no,不知为何,ubuntu9.10的缺省值还是yes


5. 更改ssh默认登录配置

Port 54324                  修改默认端口22 为 54324
PermitRootLogin no          禁止root用户登录
PermitEmptyPasswords no     禁止空密码登录
UseDNS no                   不使用DNS  
GSSAPIAuthentication no      关闭这个可以解决ssh连接慢的问题

6. scp 和sftp的用法

scp的基本语法使用: scp  每次都是全量copy,效率不高.
scp -P 52113 [源文件] [email protected]:/[对方的路径]
推送文件到远端
scp -P 52113 [email protected]:/data/txt ./
从远端拉取文件到本地
scp --help
-r  copy目录
-p  保持原有属性


sftp的基本用法:

Windows客户端和Linux服务器之间传输工具:
1. rz sz
2. winscp  基于ssh
3. SFX
4) sftp  基于ssh,加密传输
5) Samba http  ftp  nfs

sftp -oPort=52113 [email protected]
默认链接过去的目录是家目录
put /data/oldboy.txt  /tmp  上传文件上来,也可以指定目录
get /data/ddd    下载文件  下载到当前目录



7. 使用脚本进行批量分发,企业实战

#!/bin/sh
if [ $# -ne 1 ]
   then
     echo " USAGE:/bin/sh $0 arg1"
     exit 1
fi
for n in 8 9
do
    scp $1 [email protected]$n:~   #分发目录的话 -rp  -r目录  -p保存属性
done
#!/bin/sh
file="$1"
remotedir="$2"
. /etc/init.d/functions
if [ $# -ne 1 ]
   then
     echo " USAGE:/bin/sh $0 arg1"
     exit 1
fi
for n in 8 9
do
scp -P52113 -rp $file [email protected]$n:$remotedir >/dev/null 2>&1
 if [ $? -eq 0 ]
  then
     action "scp $file to $remotedir is ok" /bin/true 
  else
     action "scp $file to $remotedir is fail" /bin/false
   fi  
done


以上是关于ssh服务学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

ubunbu学习笔记-SSH远程数据传输

Ganymed SSH-2 for Java学习笔记

Web安全篇学习笔记3

JSP 学习笔记

Linux的学习笔记-ssh远程连接排错