构建SSH服务

时间:2024-01-09 15:53:26

什么是SSH?
简单说,SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。
SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是*软件,应用非常广泛。这里只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。

中间人攻击
SSH之所以能够保证安全,原因在于它采用了公钥加密。
整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。
可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击

构建SSH远程管理
---------SSH服务器-------------Client---------
192.168.1.1 192.168.1.100
一、密码验证
root@localhost ~]# vi /etc/ssh/sshd_config 修改:
Port 22
Protocol 2
ListenAddress 192.168.1.1
UseDNS no
PermitRootLogin no
PermitEmptyPasswords no
LoginGraceTime 2m
MaxAuthTries 6
AllowUsers hehe xixi@192.168.1.100 客户端验证:
[root@localhost ~]# ssh 192.168.1.1
[root@localhost ~]# ssh hehe@192.168.1.1
[root@localhost ~]# ssh haha@192.168.1.1
[root@localhost ~]# ssh xixi@192.168.1.1
二、秘钥对验证
例如:
ssh-keygen -b 4096 -t dsa
客户端:
[root@localhost ~]#ssh-keygen
[root@localhost ~]#ssh-copy-id -i /home/hehe/.ssh/id_rsa.pub root@192.168.1.1
注意:ssh-copy-id:把密钥追加到远程主机的 .ssh/authorized_key 上
[root@localhost ~]#ssh root@192.168.1.1
或者
[hehe@localhost .ssh]$ ssh-keygen
[hehe@localhost .ssh]$ scp id_rsa.pub root@192.168.1.1:/root/
注意:在上传公钥时,不要关闭密码验证,否则将无法上传。
服务器端:
[root@localhost ~]# vim /etc/ssh/sshd_config
修改:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
[root@localhost ~]#cp /root/id_rsa.pub /root/.ssh/authorized_keys
增加其他用户
[root@localhost ~]#cat id_rsa.pub >> .ssh/authorized_keys
[root@localhost ~]# service sshd restart
客户端验证:
[hehe@localhost .ssh]$ ssh root@192.168.1.1 结论:不使用密码。而是使用秘钥对验证登录。
思考:如果客户端lisi用户,把公钥拷贝到了服务端han用户下。将会怎么样?
(lisi用户ssh han@192.168.56.200时无需密码)
结论希望哪个用户免密码就拷贝到哪个用户。
-----------------------------------
远程执行命令:ssh root@192.168.56.200 date
-----------------------------------
讲解scp命令
1、本地--->>>---服务器(类似上传)
文件:
[root@localhost ~]# scp 222.txt root@192.168.1.1:/root
目录:
[root@localhost ~]# scp -r /root/hehe root@192.168.1.1:/root
2、服务器--->>>---本地(类似下载)
文件:
[root@localhost ~]# scp root@192.168.1.1:/root/222.txt ./
目录:
[root@localhost ~]# scp -r root@192.168.1.1:/root/hehe ./

---------------------------------------------------------------------------------------
1. ssh命令用法
连接到远程主机
# ssh root@192.168.1.120 // 默认连接到目标主机的tcp 22端口

连接到其他ssh端口
# ssh -p 10022 root@192.168.1.120

连接到远程主机,并执行一条命令
# ssh root@192.168.1.120 ls -l

在ssh命令后面,直接加上在远程主机上要执行的命令。

打开调试模式
# ssh -v root@192.168.1.120

-v参数追踪调试建立的SSH连接,可以看到在哪个环节出了问题。

对所有数据请求压缩
# ssh -C root@192.168.1.120

所有通过ssh发送或接收的数据将会被压缩,并且仍然是加密的。

指定ssh源地址
如果你的ssh客户端有多于两个以上的IP地址,可以使用-b选项来指定一个IP地址。这个IP将会被用做建立连接的源地址。

# ssh -b 192.168.0.200 root@192.168.1.120

查看是否已经添加了对应主机的ssh密钥
# ssh-keygen -F 192.168.1.120

删除对应主机的ssh访问密钥
# ssh-keygen -R 192.168.1.120

也可以在主机的~/.ssh/known_hosts文件中手动删除公钥。