什么是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文件中手动删除公钥。

构建SSH服务的更多相关文章

  1. 添加ssh服务构建新镜像-docker commit 方式01

    添加ssh服务构建新镜像-docker commit 方式 1:docker commit构建自定义镜像---一般不推荐使用这种方式构建新镜像 1:ubuntu基础镜像下载 ubuntu@ubuntu ...

  2. 那些年构建SSH所遇到的坑

    SSH框架有非常多的优点,在这里我不再赘述,我们经常会去构建这种框架的项目,但是在构建SSH时候经常会遇到一些问题,例如常见的网页上的所报的错误404,500等,404错误一般比较好排查,没有找到该页 ...

  3. 使用Dockerfile创建支持SSH服务的镜像

    1.前面我们学习了使用Dockerfile,那接下来我们就用Dockerfile创建一个支持SSH服务的镜像. 2.首先创建一个目录ssh_centos [root@rocketmq-nameserv ...

  4. docker如何创建支持SSH服务的镜像

    一般情况下,Linux系统管理员通过SSH服务来管理操作系统,但Docker的很多镜像是不带SSH服务的,那么我们怎样才能管理操作系统呢?在第一部分中我们介绍了一些进入容器的办法,比如用attach. ...

  5. docker使用Dockerfile构建ssh容器

    一.使用Dockerfile构建centos 1.创建 Dockerfile mkdir centos # 创建一个目录存放之后的Dockerfile,目录名无所谓 cd centos # 进入目录 ...

  6. centos安装启动ssh服务

    centos安装启动ssh服务 #rpm -qa |grep ssh 检查是否装了SSH包 没有的话yum install openssh-server #chkconfig --list sshd ...

  7. 使用Dockerfile创建ssh服务的镜像02

    使用Dockerfile创建ssh服务的镜像02 1:创建工作目录---一个镜像的所有文件都放这个目录下 ubuntu@ubuntu:~$ mkdir sshd_ubuntu ubuntu@ubunt ...

  8. 使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

  9. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

随机推荐

  1. jmeter分布式压测(多台电脑一起压测)

    (1)在Windows下运行 操作步骤: 1)     有多台电脑,每台电脑上都有jmeter,而且这几台电脑都互相能ping通. 2)     在我的电脑的jmeter的配置文件bin目录下的jme ...

  2. PHP的优化建议(仅借鉴)

    转载: https://www.awaimai.com/1050.html 1 字符串 1.1 少用正则表达式 能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式, 因为其效率高于正则 ...

  3. 关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样

    最近要把项目中的图片全部生成webp格式, 过程整理一下,    (直接存在本地,或者图片链接存在数据库都可以看看) 首先,肯定是批量处理, 一个php处理不了这么多, 会爆内存的, 个人建议用aja ...

  4. C#复习笔记(3)--C#2:解决C#1的问题(进入快速通道的委托)

    委托 前言:C#1中就已经有了委托的概念,但是其繁杂的用法并没有引起开发者太多的关注,在C#2中,进行了一些编译器上的优化,可以用匿名方法来创建一个委托.同时,还支持的方法组和委托的转换.顺便的,C# ...

  5. Oracle 表空间不足引起的问题及解决方法

    -- 1 向数据库导入数据时报了ORA-01653: unable to extend table错误,网上查了下原因是由于表空间不足引起的: 查询表空间使用情况语句 select a.tablesp ...

  6. 【学亮IT手记】Java 8新特性实例介绍

    java8,也称为jdk1.8,于2014.03.18日发布,它支持函数式编程,新的js引擎,新的日期API,新的Stream Api等. 我们主要讨论以下几个新特性: ①Lambda表达式. 允许把 ...

  7. HTML5开发之meta标签的viewport使用说明

    随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而每一款手机有不同的分辨率,不同屏幕大 ...

  8. linux apache tomcat 安装和升级

    一,安装tomcat 注意!安装tomcat前需安装配置JDK,安装方式请参照这篇文章: http://www.cnblogs.com/blog4matto/p/5582054.html 1 tomc ...

  9. 隐藏Nginx或Apache以及PHP的版本号的方法

    当黑客入侵一台服务器时,首先会”踩点”, 这里的”踩点”,指的是了解服务器中运行的一些服务的详细情况,比如说:版本号,当黑客知道相应服务的版本号后,就可以寻找该服务相应版本的一些漏洞来入侵,攻击,所以 ...

  10. 将大数组里面的小数组平行展开的实现(Making a flat list out of list of lists in Python)

    今天在生成数据的时候遇到了这个需求,其实写一个for循环可以很容易解决这个问题,但是无论是性能还是酷炫程度上都不行 所以顺手搜索了一下. 例子是将 l = [[1, 2, 3], [4, 5, 6], ...