什么是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. shell脚本--php执行普通shell命令

    这里只演示一些普通的shell命令,一些需要root用户权限执行的命令,请参考:php以root权限执行shell命令 php执行shell命令,可以使用下面几个函数: string system ( ...

  2. 使用css控制文字显示几行并且剩余部分隐藏(移动端和PC端同样适用)

    前言 有些需求需要我们控制一段文本最多显示几行,就像逛淘宝京东的评价楼层一样,有时可能还需要隐藏剩余部分,这样的需求我们怎么来解决呢? 解决办法 我们完全可以使用css来解决这一需求 1. 解决文本显 ...

  3. Flutter之Container详解

    1 基本内容1.1 继续关系Object > Diagnosticable > DiagnosticableTree > Widget > StatelessWidget &g ...

  4. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

    今天服务器遇到了一个很熟悉的问题, 输入 #mysql -u root -p   ERROR 2002 (HY000):Can't connect to local MySQL server     ...

  5. Django--CRM-客户列表展示, 分页

    一 . 客户列表展示 为了插入数据方便,我们可以用django里面的admin插入数据 创建超级用户 把语言改成中文 结果: 列表展示 展示不同字段的方式: # 有需要的可以写 def__str__( ...

  6. Java多线程之单例模式(线程安全)

    package org.study2.javabase.ThreadsDemo.sync; /** * @Auther:GongXingRui * @Date:2018/9/20 * @Descrip ...

  7. nodejs zip 安装配置

    1.下载 下载地址:https://nodejs.org/zh-cn/download/ 选择相应的版本下载 2.解压缩 将文件解压到要安装的位置,并新建两个目录 node-global :npm全局 ...

  8. mesh函数

    [t,W]=meshgrid([2:0.2:7],[0:pi/6:3*pi]); %设置时-频相平面网格点 Gs1=(1/(sqrt(2*pi)*a))*exp(-0.5*abs((t1-t)/a). ...

  9. SQL Server For XML

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  10. Asp.Net Core 输出 Word

    In one of the ASP.NET Core projects we did in the last year, we created an OutputFormatter to provid ...